@vertesia/create-plugin 0.80.0-dev.20251121 → 0.81.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 +72 -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 +182 -0
- package/lib/index.js.map +1 -0
- package/lib/package-manager.d.ts +11 -0
- package/lib/package-manager.d.ts.map +1 -0
- package/lib/package-manager.js +83 -0
- package/lib/package-manager.js.map +1 -0
- package/lib/post-install.d.ts +11 -0
- package/lib/post-install.d.ts.map +1 -0
- package/lib/post-install.js +144 -0
- package/lib/post-install.js.map +1 -0
- package/lib/process-template.d.ts +30 -0
- package/lib/process-template.d.ts.map +1 -0
- package/lib/process-template.js +233 -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 +97 -0
- package/lib/prompts.js.map +1 -0
- package/lib/template-config.d.ts +139 -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 +37 -0
- package/lib/transforms.d.ts.map +1 -0
- package/lib/transforms.js +87 -0
- package/lib/transforms.js.map +1 -0
- package/package.json +22 -32
- 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,83 @@
|
|
|
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
|
+
* @param forcedPackageManager - If specified, skip selection and use this package manager
|
|
26
|
+
*/
|
|
27
|
+
export async function selectPackageManager(forcedPackageManager) {
|
|
28
|
+
const hasPnpm = commandExists('pnpm');
|
|
29
|
+
const hasNpm = commandExists('npm');
|
|
30
|
+
// If npm is not installed, something is seriously wrong
|
|
31
|
+
if (!hasNpm) {
|
|
32
|
+
throw new Error('npm is not installed. Please install Node.js and npm first.');
|
|
33
|
+
}
|
|
34
|
+
// If a specific package manager is forced by the template
|
|
35
|
+
if (forcedPackageManager) {
|
|
36
|
+
if (forcedPackageManager === 'pnpm' && !hasPnpm) {
|
|
37
|
+
throw new Error('This template requires pnpm. Please install it first: npm install -g pnpm');
|
|
38
|
+
}
|
|
39
|
+
console.log(chalk.gray(`Using ${forcedPackageManager} (required by template)\n`));
|
|
40
|
+
return forcedPackageManager;
|
|
41
|
+
}
|
|
42
|
+
// If pnpm is not installed, use npm
|
|
43
|
+
if (!hasPnpm) {
|
|
44
|
+
console.log(chalk.gray('Using npm (pnpm not found)\n'));
|
|
45
|
+
return 'npm';
|
|
46
|
+
}
|
|
47
|
+
// Both are installed - let user choose
|
|
48
|
+
console.log(chalk.blue('📦 Package Manager\n'));
|
|
49
|
+
const response = await prompts({
|
|
50
|
+
type: 'select',
|
|
51
|
+
name: 'packageManager',
|
|
52
|
+
message: 'Which package manager would you like to use?',
|
|
53
|
+
choices: [
|
|
54
|
+
{ title: 'pnpm (recommended)', value: 'pnpm' },
|
|
55
|
+
{ title: 'npm', value: 'npm' }
|
|
56
|
+
],
|
|
57
|
+
initial: 0
|
|
58
|
+
}, {
|
|
59
|
+
onCancel: () => {
|
|
60
|
+
throw new Error('Installation cancelled by user');
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
console.log();
|
|
64
|
+
return response.packageManager;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Install dependencies using the specified package manager
|
|
68
|
+
*/
|
|
69
|
+
export async function installDependencies(projectName, packageManager) {
|
|
70
|
+
console.log(chalk.blue('📦 Installing dependencies...\n'));
|
|
71
|
+
console.log(chalk.gray(` Using: ${packageManager}\n`));
|
|
72
|
+
try {
|
|
73
|
+
execSync(`${packageManager} install`, {
|
|
74
|
+
cwd: projectName,
|
|
75
|
+
stdio: 'inherit'
|
|
76
|
+
});
|
|
77
|
+
console.log();
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
throw new Error(`Failed to install dependencies: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=package-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-manager.js","sourceRoot":"","sources":["../src/package-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { PostInstallConfig, PreInstallConfig } from './template-config.js';
|
|
2
|
+
/**
|
|
3
|
+
* Run pre-install hooks (before npm install)
|
|
4
|
+
* Returns true if all required hooks succeeded, false otherwise
|
|
5
|
+
*/
|
|
6
|
+
export declare function runPreInstallHooks(projectName: string, preInstall: PreInstallConfig, packageManager: string): Promise<boolean>;
|
|
7
|
+
/**
|
|
8
|
+
* Run post-install hooks (after npm install)
|
|
9
|
+
*/
|
|
10
|
+
export declare function runPostInstallHooks(projectName: string, postInstall: PostInstallConfig, packageManager: string): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=post-install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post-install.d.ts","sourceRoot":"","sources":["../src/post-install.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAmJ3E;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,gBAAgB,EAC5B,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,OAAO,CAAC,CAElB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,iBAAiB,EAC9B,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,IAAI,CAAC,CAEf"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Install hooks for running commands before/after project creation
|
|
3
|
+
*/
|
|
4
|
+
import { spawn, spawnSync } from 'child_process';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import prompts from 'prompts';
|
|
7
|
+
/**
|
|
8
|
+
* Check if a command exists in PATH
|
|
9
|
+
*/
|
|
10
|
+
function commandExists(command) {
|
|
11
|
+
const result = spawnSync(process.platform === 'win32' ? 'where' : 'which', [command], {
|
|
12
|
+
stdio: 'ignore'
|
|
13
|
+
});
|
|
14
|
+
return result.status === 0;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Install a global npm package
|
|
18
|
+
*/
|
|
19
|
+
async function installGlobalPackage(packageName, packageManager) {
|
|
20
|
+
console.log(chalk.blue(`📦 Installing ${packageName}...\n`));
|
|
21
|
+
return new Promise((resolve) => {
|
|
22
|
+
const args = packageManager === 'npm'
|
|
23
|
+
? ['install', '-g', packageName]
|
|
24
|
+
: ['add', '-g', packageName];
|
|
25
|
+
const child = spawn(packageManager, args, {
|
|
26
|
+
stdio: 'inherit',
|
|
27
|
+
shell: true
|
|
28
|
+
});
|
|
29
|
+
child.on('close', (code) => {
|
|
30
|
+
if (code === 0) {
|
|
31
|
+
console.log(chalk.green(` ✓ ${packageName} installed successfully\n`));
|
|
32
|
+
resolve(true);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
console.log(chalk.yellow(` ⚠️ Failed to install ${packageName}\n`));
|
|
36
|
+
resolve(false);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
child.on('error', () => {
|
|
40
|
+
console.log(chalk.yellow(` ⚠️ Failed to install ${packageName}\n`));
|
|
41
|
+
resolve(false);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Run a command in the project directory
|
|
47
|
+
* Uses npx to ensure globally installed packages are found even if PATH hasn't been refreshed
|
|
48
|
+
*/
|
|
49
|
+
async function runCommand(command, cwd) {
|
|
50
|
+
return new Promise((resolve) => {
|
|
51
|
+
// Use npx to run the command - this ensures we find globally installed packages
|
|
52
|
+
// even if the shell's PATH hasn't been refreshed after installation
|
|
53
|
+
const child = spawn('npx', ['--yes', ...command.split(' ')], {
|
|
54
|
+
stdio: 'inherit',
|
|
55
|
+
shell: true,
|
|
56
|
+
cwd
|
|
57
|
+
});
|
|
58
|
+
child.on('close', (code) => {
|
|
59
|
+
resolve(code === 0);
|
|
60
|
+
});
|
|
61
|
+
child.on('error', () => {
|
|
62
|
+
resolve(false);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Run install hooks (shared implementation for pre and post install)
|
|
68
|
+
*/
|
|
69
|
+
async function runInstallHooks(projectName, config, packageManager, phase) {
|
|
70
|
+
if (!config.commands || config.commands.length === 0) {
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
const phaseLabel = phase === 'pre' ? 'pre-install' : 'post-install';
|
|
74
|
+
console.log(chalk.blue(`🔧 Running ${phaseLabel} hooks...\n`));
|
|
75
|
+
// Check and install CLI package if needed
|
|
76
|
+
if (config.cliPackage) {
|
|
77
|
+
// Extract the CLI binary name from the package (e.g., @vertesia/cli -> vertesia)
|
|
78
|
+
// For scoped packages like @vertesia/cli, the binary is typically the scope name (vertesia)
|
|
79
|
+
const scopeMatch = config.cliPackage.match(/^@([^/]+)\//);
|
|
80
|
+
const cliBinary = scopeMatch ? scopeMatch[1] : config.cliPackage.replace(/-cli$/, '');
|
|
81
|
+
if (!commandExists(cliBinary)) {
|
|
82
|
+
const { installCli } = await prompts({
|
|
83
|
+
type: 'confirm',
|
|
84
|
+
name: 'installCli',
|
|
85
|
+
message: `The ${config.cliPackage} package is required. Do you want to install it globally?`,
|
|
86
|
+
initial: true
|
|
87
|
+
});
|
|
88
|
+
if (installCli) {
|
|
89
|
+
const installed = await installGlobalPackage(config.cliPackage, packageManager);
|
|
90
|
+
if (!installed) {
|
|
91
|
+
console.log(chalk.yellow(` ⚠️ Skipping ${phaseLabel} commands that require the CLI\n`));
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
console.log(chalk.yellow(` ⚠️ Skipping ${phaseLabel} commands that require the CLI\n`));
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Run each command
|
|
102
|
+
for (const cmd of config.commands) {
|
|
103
|
+
if (cmd.optional) {
|
|
104
|
+
const promptMessage = cmd.prompt || `Do you want to run "${cmd.name}"?`;
|
|
105
|
+
const { proceed } = await prompts({
|
|
106
|
+
type: 'confirm',
|
|
107
|
+
name: 'proceed',
|
|
108
|
+
message: promptMessage,
|
|
109
|
+
initial: true
|
|
110
|
+
});
|
|
111
|
+
if (!proceed) {
|
|
112
|
+
console.log(chalk.gray(` ⏭️ Skipped: ${cmd.name}\n`));
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
console.log(chalk.gray(` Running: ${cmd.name}...`));
|
|
117
|
+
const success = await runCommand(cmd.command, projectName);
|
|
118
|
+
if (success) {
|
|
119
|
+
console.log(chalk.green(` ✓ ${cmd.name} completed\n`));
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
console.log(chalk.yellow(` ⚠️ ${cmd.name} failed (you can run it manually later)\n`));
|
|
123
|
+
// For pre-install, a failure is critical - return false to skip dependency installation
|
|
124
|
+
if (phase === 'pre') {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Run pre-install hooks (before npm install)
|
|
133
|
+
* Returns true if all required hooks succeeded, false otherwise
|
|
134
|
+
*/
|
|
135
|
+
export async function runPreInstallHooks(projectName, preInstall, packageManager) {
|
|
136
|
+
return runInstallHooks(projectName, preInstall, packageManager, 'pre');
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Run post-install hooks (after npm install)
|
|
140
|
+
*/
|
|
141
|
+
export async function runPostInstallHooks(projectName, postInstall, packageManager) {
|
|
142
|
+
await runInstallHooks(projectName, postInstall, packageManager, 'post');
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=post-install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post-install.js","sourceRoot":"","sources":["../src/post-install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
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. Resolves workspace:* dependencies to actual latest versions
|
|
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
|
+
* Rename files based on template configuration
|
|
23
|
+
* Useful for files like .env.template -> .env that can't be committed to git
|
|
24
|
+
*/
|
|
25
|
+
export declare function renameFiles(projectName: string, templateConfig: TemplateConfig): void;
|
|
26
|
+
/**
|
|
27
|
+
* Remove meta files that shouldn't be in the user's project
|
|
28
|
+
*/
|
|
29
|
+
export declare function removeMetaFiles(projectName: string, templateConfig: TemplateConfig): void;
|
|
30
|
+
//# 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":"AAOA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAwFtD;;;;;;;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,CAwDzF;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;;;GAGG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,GAAG,IAAI,CAkBrF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,GAAG,IAAI,CAczF"}
|
|
@@ -0,0 +1,233 @@
|
|
|
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
|
+
import { execSync } from 'child_process';
|
|
8
|
+
/**
|
|
9
|
+
* Get the latest version of an npm package
|
|
10
|
+
* Returns the version string (e.g., "1.2.3") or null if not found
|
|
11
|
+
*/
|
|
12
|
+
function getLatestVersion(packageName) {
|
|
13
|
+
try {
|
|
14
|
+
const result = execSync(`npm view ${packageName} version`, {
|
|
15
|
+
encoding: 'utf8',
|
|
16
|
+
stdio: ['pipe', 'pipe', 'ignore']
|
|
17
|
+
});
|
|
18
|
+
return result.trim();
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Escape special regex characters
|
|
26
|
+
*/
|
|
27
|
+
function escapeRegex(str) {
|
|
28
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Check if a file is a code file based on extension
|
|
32
|
+
*/
|
|
33
|
+
function isCodeFile(filePath) {
|
|
34
|
+
const codeExtensions = ['.js', '.jsx', '.mjs', '.ts', '.tsx'];
|
|
35
|
+
return codeExtensions.some(ext => filePath.endsWith(ext));
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Replace variables in text files (HTML, JSON, Markdown, etc.)
|
|
39
|
+
* Uses {{VARIABLE}} placeholder pattern
|
|
40
|
+
*/
|
|
41
|
+
function replaceInTextFile(content, answers) {
|
|
42
|
+
let modified = false;
|
|
43
|
+
for (const [key, value] of Object.entries(answers)) {
|
|
44
|
+
const placeholder = `{{${key}}}`;
|
|
45
|
+
if (content.includes(placeholder)) {
|
|
46
|
+
content = content.replace(new RegExp(escapeRegex(placeholder), 'g'), String(value));
|
|
47
|
+
modified = true;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return { content, modified };
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Replace variables in code files (JavaScript, TypeScript)
|
|
54
|
+
* Supports two patterns:
|
|
55
|
+
* 1. const CONFIG__variableName = value; - Constant value replacement
|
|
56
|
+
* 2. TEMPLATE__IdentifierName - Identifier name replacement (functions, classes, variables)
|
|
57
|
+
*/
|
|
58
|
+
function replaceInCodeFile(content, answers) {
|
|
59
|
+
let modified = false;
|
|
60
|
+
for (const [key, value] of Object.entries(answers)) {
|
|
61
|
+
// Pattern 1: CONFIG__ constant value replacement
|
|
62
|
+
// Matches: const CONFIG__variableName = <value>; or <value>\n
|
|
63
|
+
// Replaces only the value, keeps the constant declaration
|
|
64
|
+
const configPattern = new RegExp(`(const\\s+CONFIG__${key}\\s*=\\s*)([^;\\n]+)(\\s*;?\\s*\\n?)`, 'gm');
|
|
65
|
+
if (content.match(configPattern)) {
|
|
66
|
+
content = content.replace(configPattern, (match, prefix, oldValue, suffix) => {
|
|
67
|
+
return `${prefix}${JSON.stringify(value)}${suffix}`;
|
|
68
|
+
});
|
|
69
|
+
modified = true;
|
|
70
|
+
}
|
|
71
|
+
// Pattern 2: TEMPLATE__ identifier replacement
|
|
72
|
+
// Matches: TEMPLATE__IdentifierName anywhere in code
|
|
73
|
+
// Replaces the entire identifier with the value
|
|
74
|
+
const templatePattern = new RegExp(`TEMPLATE__${key}\\b`, 'g');
|
|
75
|
+
if (content.match(templatePattern)) {
|
|
76
|
+
content = content.replace(templatePattern, String(value));
|
|
77
|
+
modified = true;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return { content, modified };
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Replace variables in files
|
|
84
|
+
* Uses different strategies based on file type:
|
|
85
|
+
* - Code files (.js, .jsx, .mjs, .ts, .tsx):
|
|
86
|
+
* - CONFIG__variableName for constant values
|
|
87
|
+
* - TEMPLATE__IdentifierName for identifier replacement
|
|
88
|
+
* - Text files (all others): {{VARIABLE}} placeholder pattern
|
|
89
|
+
*/
|
|
90
|
+
export function replaceVariables(projectName, templateConfig, answers) {
|
|
91
|
+
if (!templateConfig.files) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
console.log(chalk.blue('✏️ Configuring files...\n'));
|
|
95
|
+
for (const file of templateConfig.files) {
|
|
96
|
+
const filePath = path.join(projectName, file);
|
|
97
|
+
if (!fs.existsSync(filePath)) {
|
|
98
|
+
console.log(chalk.yellow(` ⚠️ File not found: ${file} (skipping)`));
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
let content = fs.readFileSync(filePath, 'utf8');
|
|
102
|
+
let modified = false;
|
|
103
|
+
// Choose replacement strategy based on file type
|
|
104
|
+
if (isCodeFile(file)) {
|
|
105
|
+
const result = replaceInCodeFile(content, answers);
|
|
106
|
+
content = result.content;
|
|
107
|
+
modified = result.modified;
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
const result = replaceInTextFile(content, answers);
|
|
111
|
+
content = result.content;
|
|
112
|
+
modified = result.modified;
|
|
113
|
+
}
|
|
114
|
+
if (modified) {
|
|
115
|
+
fs.writeFileSync(filePath, content);
|
|
116
|
+
console.log(chalk.gray(` ✓ ${file}`));
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
console.log();
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Adjust package.json after variable replacement
|
|
123
|
+
* 1. Sets the package name to PROJECT_NAME
|
|
124
|
+
* 2. Resolves workspace:* dependencies to actual latest versions
|
|
125
|
+
*/
|
|
126
|
+
export function adjustPackageJson(projectName, answers) {
|
|
127
|
+
console.log(chalk.blue('📝 Adjusting package.json...\n'));
|
|
128
|
+
const packageJsonPath = path.join(projectName, 'package.json');
|
|
129
|
+
if (!fs.existsSync(packageJsonPath)) {
|
|
130
|
+
console.log(chalk.yellow(' ⚠️ package.json not found (skipping adjustment)'));
|
|
131
|
+
console.log();
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
try {
|
|
135
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
136
|
+
// 1. Set package name to PROJECT_NAME
|
|
137
|
+
const newName = answers.PROJECT_NAME || projectName;
|
|
138
|
+
if (packageJson.name !== newName) {
|
|
139
|
+
packageJson.name = newName;
|
|
140
|
+
console.log(chalk.gray(` ✓ Set package name to "${newName}"`));
|
|
141
|
+
}
|
|
142
|
+
// 2. Replace workspace:* with actual latest versions
|
|
143
|
+
const internalScopes = ['@vertesia/', '@llumiverse/', '@dglabs/'];
|
|
144
|
+
let workspaceReplacements = 0;
|
|
145
|
+
['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies'].forEach(depType => {
|
|
146
|
+
if (packageJson[depType]) {
|
|
147
|
+
Object.keys(packageJson[depType]).forEach(pkgName => {
|
|
148
|
+
const isInternalPackage = internalScopes.some(scope => pkgName.startsWith(scope));
|
|
149
|
+
if (isInternalPackage && packageJson[depType][pkgName] === 'workspace:*') {
|
|
150
|
+
const latestVersion = getLatestVersion(pkgName);
|
|
151
|
+
if (latestVersion) {
|
|
152
|
+
packageJson[depType][pkgName] = `^${latestVersion}`;
|
|
153
|
+
workspaceReplacements++;
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
// Fallback to 'latest' if we can't fetch the version
|
|
157
|
+
packageJson[depType][pkgName] = 'latest';
|
|
158
|
+
workspaceReplacements++;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
if (workspaceReplacements > 0) {
|
|
165
|
+
console.log(chalk.gray(` ✓ Resolved ${workspaceReplacements} workspace:* dependencies to latest versions`));
|
|
166
|
+
}
|
|
167
|
+
// Write back to file
|
|
168
|
+
fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\n');
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
console.log(chalk.yellow(` ⚠️ Failed to adjust package.json: ${error instanceof Error ? error.message : 'Unknown error'}`));
|
|
172
|
+
}
|
|
173
|
+
console.log();
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Handle conditional file removal based on user answers
|
|
177
|
+
*/
|
|
178
|
+
export function handleConditionalRemoves(projectName, templateConfig, answers) {
|
|
179
|
+
if (!templateConfig.conditionalRemove)
|
|
180
|
+
return;
|
|
181
|
+
console.log(chalk.blue('🔧 Applying conditional configurations...\n'));
|
|
182
|
+
for (const [varName, conditions] of Object.entries(templateConfig.conditionalRemove)) {
|
|
183
|
+
const value = String(answers[varName]);
|
|
184
|
+
const filesToRemove = conditions[value];
|
|
185
|
+
if (filesToRemove) {
|
|
186
|
+
for (const file of filesToRemove) {
|
|
187
|
+
const filePath = path.join(projectName, file);
|
|
188
|
+
if (fs.existsSync(filePath)) {
|
|
189
|
+
fs.rmSync(filePath, { recursive: true, force: true });
|
|
190
|
+
console.log(chalk.gray(` ✓ Removed: ${file}`));
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
console.log();
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Rename files based on template configuration
|
|
199
|
+
* Useful for files like .env.template -> .env that can't be committed to git
|
|
200
|
+
*/
|
|
201
|
+
export function renameFiles(projectName, templateConfig) {
|
|
202
|
+
if (!templateConfig.renameFiles)
|
|
203
|
+
return;
|
|
204
|
+
console.log(chalk.blue('📝 Renaming files...\n'));
|
|
205
|
+
for (const [source, destination] of Object.entries(templateConfig.renameFiles)) {
|
|
206
|
+
const sourcePath = path.join(projectName, source);
|
|
207
|
+
const destPath = path.join(projectName, destination);
|
|
208
|
+
if (fs.existsSync(sourcePath)) {
|
|
209
|
+
fs.renameSync(sourcePath, destPath);
|
|
210
|
+
console.log(chalk.gray(` ✓ ${source} → ${destination}`));
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
console.log(chalk.yellow(` ⚠️ File not found: ${source} (skipping rename)`));
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
console.log();
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Remove meta files that shouldn't be in the user's project
|
|
220
|
+
*/
|
|
221
|
+
export function removeMetaFiles(projectName, templateConfig) {
|
|
222
|
+
console.log(chalk.blue('🧹 Cleaning up...\n'));
|
|
223
|
+
const filesToRemove = templateConfig.removeAfterInstall || [];
|
|
224
|
+
for (const file of filesToRemove) {
|
|
225
|
+
const filePath = path.join(projectName, file);
|
|
226
|
+
if (fs.existsSync(filePath)) {
|
|
227
|
+
fs.rmSync(filePath, { recursive: true, force: true });
|
|
228
|
+
console.log(chalk.gray(` ✓ Removed: ${file}`));
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
console.log();
|
|
232
|
+
}
|
|
233
|
+
//# 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,CA2FlH"}
|
package/lib/prompts.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* User prompts for configuration
|
|
3
|
+
*/
|
|
4
|
+
import prompts from 'prompts';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { applyTransform, concatValues } 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
|
+
// Convert validate string to function
|
|
27
|
+
// Can be either a regex pattern (e.g., "^[a-z]+$") or a function string (e.g., "(v) => v.length > 0")
|
|
28
|
+
if (typeof prompt.validate === 'string') {
|
|
29
|
+
const validateStr = prompt.validate;
|
|
30
|
+
if (validateStr.includes('=>') || validateStr.includes('function')) {
|
|
31
|
+
// It's a function string - evaluate it
|
|
32
|
+
try {
|
|
33
|
+
prompt.validate = eval(validateStr);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// If eval fails, remove the validator
|
|
37
|
+
delete prompt.validate;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
// It's a regex pattern
|
|
42
|
+
try {
|
|
43
|
+
const regex = new RegExp(validateStr);
|
|
44
|
+
prompt.validate = (value) => regex.test(value) || `Must match pattern: ${validateStr}`;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// If regex is invalid, remove the validator
|
|
48
|
+
delete prompt.validate;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return prompt;
|
|
53
|
+
});
|
|
54
|
+
const answers = await prompts(processedPrompts, {
|
|
55
|
+
onCancel: () => {
|
|
56
|
+
throw new Error('Installation cancelled by user');
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
// Check if all prompts were answered
|
|
60
|
+
if (Object.keys(answers).length !== processedPrompts.length) {
|
|
61
|
+
throw new Error('Installation cancelled');
|
|
62
|
+
}
|
|
63
|
+
// Process derived variables
|
|
64
|
+
if (templateConfig.derived) {
|
|
65
|
+
for (const [targetName, derivedConfig] of Object.entries(templateConfig.derived)) {
|
|
66
|
+
try {
|
|
67
|
+
if (derivedConfig.transform === 'concat') {
|
|
68
|
+
// Handle concat transform with multiple source fields
|
|
69
|
+
const sourceFields = Array.isArray(derivedConfig.from) ? derivedConfig.from : [derivedConfig.from];
|
|
70
|
+
const values = sourceFields.map(field => {
|
|
71
|
+
const value = answers[field];
|
|
72
|
+
if (value === undefined) {
|
|
73
|
+
throw new Error(`Source field "${field}" not found in answers`);
|
|
74
|
+
}
|
|
75
|
+
return String(value);
|
|
76
|
+
});
|
|
77
|
+
answers[targetName] = concatValues(values, derivedConfig.separator || '');
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
// Handle single-source transforms
|
|
81
|
+
const sourceField = Array.isArray(derivedConfig.from) ? derivedConfig.from[0] : derivedConfig.from;
|
|
82
|
+
const sourceValue = answers[sourceField];
|
|
83
|
+
if (sourceValue !== undefined) {
|
|
84
|
+
answers[targetName] = applyTransform(String(sourceValue), derivedConfig.transform);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
const fromStr = Array.isArray(derivedConfig.from) ? derivedConfig.from.join(', ') : derivedConfig.from;
|
|
90
|
+
throw new Error(`Failed to derive ${targetName} from ${fromStr}: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
console.log(); // Empty line after prompts
|
|
95
|
+
return answers;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"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"}
|