@vertesia/create-plugin 1.2.0 → 1.3.0-dev.20260620.061059Z
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 +3 -0
- package/lib/configuration.d.ts.map +1 -1
- package/lib/configuration.js +2 -19
- package/lib/configuration.js.map +1 -1
- package/lib/download-template.d.ts +3 -0
- package/lib/download-template.d.ts.map +1 -1
- package/lib/download-template.js +10 -9
- package/lib/download-template.js.map +1 -1
- package/lib/index.js +65 -18
- package/lib/index.js.map +1 -1
- package/lib/package-manager.d.ts +4 -0
- package/lib/package-manager.d.ts.map +1 -1
- package/lib/package-manager.js +16 -10
- package/lib/package-manager.js.map +1 -1
- package/lib/post-install.d.ts +4 -1
- package/lib/post-install.d.ts.map +1 -1
- package/lib/post-install.js +19 -19
- package/lib/post-install.js.map +1 -1
- package/lib/process-template.d.ts +7 -4
- package/lib/process-template.d.ts.map +1 -1
- package/lib/process-template.js +60 -29
- package/lib/process-template.js.map +1 -1
- package/lib/prompts.d.ts +5 -2
- package/lib/prompts.d.ts.map +1 -1
- package/lib/prompts.js +21 -8
- package/lib/prompts.js.map +1 -1
- package/lib/template-config.d.ts +3 -1
- package/lib/template-config.d.ts.map +1 -1
- package/lib/template-config.js +2 -2
- package/lib/template-config.js.map +1 -1
- package/lib/template-selector.d.ts +1 -1
- package/lib/template-selector.d.ts.map +1 -1
- package/lib/template-selector.js +7 -7
- package/lib/template-selector.js.map +1 -1
- package/lib/transforms.d.ts +5 -0
- package/lib/transforms.d.ts.map +1 -1
- package/lib/transforms.js +12 -1
- package/lib/transforms.js.map +1 -1
- package/lib/version.d.ts.map +1 -1
- package/lib/version.js +5 -4
- package/lib/version.js.map +1 -1
- package/package.json +11 -9
package/README.md
CHANGED
|
@@ -10,6 +10,9 @@ CLI tool to create Vertesia plugins:
|
|
|
10
10
|
# Using pnpm create (recommended)
|
|
11
11
|
pnpm create @vertesia/plugin my-project
|
|
12
12
|
|
|
13
|
+
# Opinionated content app scaffold
|
|
14
|
+
pnpm create @vertesia/plugin field-guide-library -- --content-app
|
|
15
|
+
|
|
13
16
|
# Using npm create
|
|
14
17
|
npm create @vertesia/plugin my-project
|
|
15
18
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configuration.d.ts","sourceRoot":"","sources":["../src/configuration.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,kBAAkB;
|
|
1
|
+
{"version":3,"file":"configuration.d.ts","sourceRoot":"","sources":["../src/configuration.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAC/B,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,MAAM;IACf;;;;;;OAMG;wBAME,kBAAkB,EAAE;IAEzB;;;OAGG;;IAGH;;;;OAIG;;IAGH;;OAEG;;CAEG,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,UAAU;IACnB;;;OAGG;;IAGH;;OAEG;;IAGH;;OAEG;4BACyD,MAAM,EAAE;CAC9D,CAAC"}
|
package/lib/configuration.js
CHANGED
|
@@ -15,20 +15,8 @@ export const config = {
|
|
|
15
15
|
templates: [
|
|
16
16
|
{
|
|
17
17
|
name: 'Vertesia Plugin',
|
|
18
|
-
repository: 'vertesia/composableai/templates/plugin-template'
|
|
18
|
+
repository: 'vertesia/composableai/templates/plugin-template',
|
|
19
19
|
},
|
|
20
|
-
{
|
|
21
|
-
name: 'Vertesia Tool Server (deprecated)',
|
|
22
|
-
repository: 'vertesia/composableai/templates/tool-server-template'
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
name: 'Vertesia UI Plugin (deprecated)',
|
|
26
|
-
repository: 'vertesia/composableai/templates/ui-plugin-template'
|
|
27
|
-
},
|
|
28
|
-
{
|
|
29
|
-
name: 'Vertesia Workflow Worker',
|
|
30
|
-
repository: 'vertesia/composableai/templates/worker-template'
|
|
31
|
-
}
|
|
32
20
|
],
|
|
33
21
|
/**
|
|
34
22
|
* Name of the template configuration file in the template repo
|
|
@@ -62,11 +50,6 @@ export const validation = {
|
|
|
62
50
|
/**
|
|
63
51
|
* Reserved project names that cannot be used
|
|
64
52
|
*/
|
|
65
|
-
reservedNames: [
|
|
66
|
-
'test',
|
|
67
|
-
'node_modules',
|
|
68
|
-
'dist',
|
|
69
|
-
'build',
|
|
70
|
-
],
|
|
53
|
+
reservedNames: ['test', 'node_modules', 'dist', 'build'],
|
|
71
54
|
};
|
|
72
55
|
//# sourceMappingURL=configuration.js.map
|
package/lib/configuration.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configuration.js","sourceRoot":"","sources":["../src/configuration.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,MAAM,CAAC,MAAM,MAAM,GAAG;
|
|
1
|
+
{"version":3,"file":"configuration.js","sourceRoot":"","sources":["../src/configuration.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,MAAM,CAAC,MAAM,MAAM,GAAG;IAClB;;;;;;OAMG;IACH,SAAS,EAAE;QACP;YACI,IAAI,EAAE,iBAAiB;YACvB,UAAU,EAAE,iDAAiD;SAChE;KACoB;IAEzB;;;OAGG;IACH,kBAAkB,EAAE,sBAAsB;IAE1C;;;;OAIG;IACH,QAAQ,EAAE,KAAK;IAEf;;OAEG;IACH,OAAO,EAAE,2BAA2B;CAC9B,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACtB;;;OAGG;IACH,kBAAkB,EAAE,cAAc;IAElC;;OAEG;IACH,gBAAgB,EAAE,uEAAuE;IAEzF;;OAEG;IACH,aAAa,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,CAAa;CAC9D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"download-template.d.ts","sourceRoot":"","sources":["../src/download-template.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"download-template.d.ts","sourceRoot":"","sources":["../src/download-template.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoBH;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAClC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,kBAAkB,CAAC,EAAE,MAAM,GAC5B,OAAO,CAAC,IAAI,CAAC,CAgDf"}
|
package/lib/download-template.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Template downloading from GitHub or local copy
|
|
3
3
|
*/
|
|
4
|
-
import
|
|
4
|
+
import fs from 'node:fs';
|
|
5
|
+
import path from 'node:path';
|
|
5
6
|
import chalk from 'chalk';
|
|
6
|
-
import
|
|
7
|
-
import path from 'path';
|
|
7
|
+
import degit from 'degit';
|
|
8
8
|
import { config } from './configuration.js';
|
|
9
9
|
/**
|
|
10
10
|
* Extract the template directory name from a repository string.
|
|
@@ -14,6 +14,7 @@ function extractTemplateDirName(repository) {
|
|
|
14
14
|
// Strip the #ref suffix if present
|
|
15
15
|
const repoPath = repository.split('#')[0];
|
|
16
16
|
// Last segment is the template directory name
|
|
17
|
+
// biome-ignore lint/style/noNonNullAssertion: intentional non-null assertion; TS can't prove narrowing here
|
|
17
18
|
return repoPath.split('/').pop();
|
|
18
19
|
}
|
|
19
20
|
/**
|
|
@@ -27,7 +28,7 @@ export async function downloadTemplate(projectName, repository, localTemplatesPa
|
|
|
27
28
|
if (localTemplatesPath) {
|
|
28
29
|
const templateDir = extractTemplateDirName(repository);
|
|
29
30
|
const sourcePath = path.resolve(localTemplatesPath, templateDir);
|
|
30
|
-
console.log(chalk.blue('
|
|
31
|
+
console.log(chalk.blue('Copying template from local directory...\n'));
|
|
31
32
|
console.log(chalk.gray(` Source: ${sourcePath}`));
|
|
32
33
|
console.log(chalk.gray(` Target: ./${projectName}\n`));
|
|
33
34
|
if (!fs.existsSync(sourcePath)) {
|
|
@@ -38,12 +39,12 @@ export async function downloadTemplate(projectName, repository, localTemplatesPa
|
|
|
38
39
|
filter: (src) => {
|
|
39
40
|
const rel = src.slice(sourcePath.length);
|
|
40
41
|
return !rel.startsWith('/node_modules') && !rel.startsWith('/dist') && !rel.startsWith('/.pnpm');
|
|
41
|
-
}
|
|
42
|
+
},
|
|
42
43
|
});
|
|
43
|
-
console.log(chalk.green('
|
|
44
|
+
console.log(chalk.green(' Template copied\n'));
|
|
44
45
|
return;
|
|
45
46
|
}
|
|
46
|
-
console.log(chalk.blue('
|
|
47
|
+
console.log(chalk.blue('Downloading template from GitHub...\n'));
|
|
47
48
|
console.log(chalk.gray(` Repository: ${repository}`));
|
|
48
49
|
console.log(chalk.gray(` Target: ./${projectName}\n`));
|
|
49
50
|
const emitter = degit(repository, {
|
|
@@ -55,11 +56,11 @@ export async function downloadTemplate(projectName, repository, localTemplatesPa
|
|
|
55
56
|
console.log(chalk.gray(` ${info.message}`));
|
|
56
57
|
});
|
|
57
58
|
emitter.on('warn', (warning) => {
|
|
58
|
-
console.log(chalk.yellow(`
|
|
59
|
+
console.log(chalk.yellow(` ${warning.message}`));
|
|
59
60
|
});
|
|
60
61
|
try {
|
|
61
62
|
await emitter.clone(projectName);
|
|
62
|
-
console.log(chalk.green('
|
|
63
|
+
console.log(chalk.green(' Template downloaded\n'));
|
|
63
64
|
}
|
|
64
65
|
catch (error) {
|
|
65
66
|
throw new Error(`Failed to download template: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"download-template.js","sourceRoot":"","sources":["../src/download-template.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"download-template.js","sourceRoot":"","sources":["../src/download-template.ts"],"names":[],"mappings":"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"}
|
package/lib/index.js
CHANGED
|
@@ -5,14 +5,15 @@
|
|
|
5
5
|
* CLI tool to create Vertesia tool server projects from GitHub templates.
|
|
6
6
|
* Reads template.config.json from the template to determine prompts and file replacements.
|
|
7
7
|
*/
|
|
8
|
+
import { execSync } from 'node:child_process';
|
|
9
|
+
import fs from 'node:fs';
|
|
8
10
|
import chalk from 'chalk';
|
|
9
11
|
import { Command } from 'commander';
|
|
10
|
-
import fs from 'fs';
|
|
11
12
|
import { config, validation } from './configuration.js';
|
|
12
13
|
import { downloadTemplate } from './download-template.js';
|
|
13
14
|
import { installDependencies, selectPackageManager } from './package-manager.js';
|
|
14
15
|
import { runPostInstallHooks, runPreInstallHooks } from './post-install.js';
|
|
15
|
-
import { adjustPackageJson, handleConditionalRemoves, removeMetaFiles, renameFiles, replaceVariables } from './process-template.js';
|
|
16
|
+
import { adjustPackageJson, handleConditionalRemoves, removeMetaFiles, renameFiles, replaceVariables, } from './process-template.js';
|
|
16
17
|
import { promptUser } from './prompts.js';
|
|
17
18
|
import { readTemplateConfig } from './template-config.js';
|
|
18
19
|
import { selectTemplate } from './template-selector.js';
|
|
@@ -29,17 +30,20 @@ async function main() {
|
|
|
29
30
|
.option('-y, --yes', 'Non-interactive mode: use defaults for all prompts', false)
|
|
30
31
|
.option('--dev', 'Use workspace dependencies (development mode)', false)
|
|
31
32
|
.option('--local-templates <path>', 'Use local template directory instead of fetching from GitHub')
|
|
33
|
+
.option('--skip-install', 'Skip dependency installation after copying and configuring the template', false)
|
|
34
|
+
.option('--full', 'Start from the full scaffold (overlay examples/ onto src/) instead of the minimal one', false)
|
|
35
|
+
.option('--content-app', 'Start from the opinionated content app scaffold with types, interactions, process, UI, and exercise scripts', false)
|
|
32
36
|
.option('--package-manager <manager>', 'Package manager to use: pnpm or npm (overrides template default and interactive selection)')
|
|
33
37
|
.addHelpText('after', `
|
|
34
38
|
Available Templates:
|
|
35
|
-
${config.templates.map(t => ` - ${t.name}`).join('\n')}
|
|
39
|
+
${config.templates.map((t) => ` - ${t.name}`).join('\n')}
|
|
36
40
|
|
|
37
41
|
Documentation: ${config.docsUrl}
|
|
38
42
|
`)
|
|
39
43
|
.parse();
|
|
40
44
|
let projectName = program.args[0];
|
|
41
45
|
const opts = program.opts();
|
|
42
|
-
const { branch, template, yes: nonInteractive, dev, localTemplates, packageManager: packageManagerOverride } = opts;
|
|
46
|
+
const { branch, template, yes: nonInteractive, dev, localTemplates, skipInstall, full, contentApp, packageManager: packageManagerOverride, } = opts;
|
|
43
47
|
// Prompt for project name if not provided as CLI argument
|
|
44
48
|
if (!projectName) {
|
|
45
49
|
const { default: prompts } = await import('prompts');
|
|
@@ -49,22 +53,25 @@ Documentation: ${config.docsUrl}
|
|
|
49
53
|
message: 'Project name:',
|
|
50
54
|
validate: (v) => validation.projectNamePattern.test(v) || validation.projectNameError,
|
|
51
55
|
}, {
|
|
52
|
-
onCancel: () => {
|
|
56
|
+
onCancel: () => {
|
|
57
|
+
console.log(chalk.red('\nInstallation cancelled.\n'));
|
|
58
|
+
process.exit(1);
|
|
59
|
+
},
|
|
53
60
|
});
|
|
54
61
|
projectName = answer.projectName;
|
|
55
62
|
}
|
|
56
63
|
// Validate project name
|
|
57
64
|
if (!validation.projectNamePattern.test(projectName)) {
|
|
58
|
-
console.log(chalk.red(
|
|
65
|
+
console.log(chalk.red(`${validation.projectNameError}\n`));
|
|
59
66
|
process.exit(1);
|
|
60
67
|
}
|
|
61
68
|
if (validation.reservedNames.includes(projectName)) {
|
|
62
|
-
console.log(chalk.red(
|
|
69
|
+
console.log(chalk.red(`"${projectName}" is a reserved name. Please choose a different name.\n`));
|
|
63
70
|
process.exit(1);
|
|
64
71
|
}
|
|
65
72
|
// Check if directory already exists
|
|
66
73
|
if (fs.existsSync(projectName)) {
|
|
67
|
-
console.log(chalk.red(
|
|
74
|
+
console.log(chalk.red(`Directory "${projectName}" already exists.\n`));
|
|
68
75
|
process.exit(1);
|
|
69
76
|
}
|
|
70
77
|
try {
|
|
@@ -72,7 +79,7 @@ Documentation: ${config.docsUrl}
|
|
|
72
79
|
const selectedTemplate = await selectTemplate(branch, template);
|
|
73
80
|
// Show the selected template name with branch if specified
|
|
74
81
|
const branchInfo = branch ? chalk.gray(` (branch: ${branch})`) : '';
|
|
75
|
-
console.log(chalk.blue.bold(`\
|
|
82
|
+
console.log(`${chalk.blue.bold(`\nCreate ${selectedTemplate.name}`) + branchInfo}\n`);
|
|
76
83
|
// Step 2: Download template from GitHub (or copy from local path)
|
|
77
84
|
await downloadTemplate(projectName, selectedTemplate.repository, localTemplates);
|
|
78
85
|
// Step 3: Read template configuration
|
|
@@ -81,10 +88,14 @@ Documentation: ${config.docsUrl}
|
|
|
81
88
|
const packageManager = await selectPackageManager(packageManagerOverride ?? templateConfig.packageManager, nonInteractive);
|
|
82
89
|
// Step 5: Prompt user for configuration
|
|
83
90
|
const answers = await promptUser(projectName, templateConfig, nonInteractive);
|
|
91
|
+
// Inject package-manager metadata so templates can reference it via {{PM}}, {{PM_RUN}}, {{PM_VERSION}}
|
|
92
|
+
answers.PM = packageManager;
|
|
93
|
+
answers.PM_RUN = `${packageManager} run`;
|
|
94
|
+
answers.PM_VERSION = execSync(`${packageManager} --version`, { encoding: 'utf8' }).trim();
|
|
84
95
|
// Step 5: Replace variables in files
|
|
85
96
|
replaceVariables(projectName, templateConfig, answers);
|
|
86
97
|
// Step 6: Adjust package.json (name and workspace dependencies)
|
|
87
|
-
adjustPackageJson(projectName, answers, dev);
|
|
98
|
+
adjustPackageJson(projectName, answers, dev, packageManager);
|
|
88
99
|
// Step 7: Handle conditional removes
|
|
89
100
|
if (templateConfig.conditionalRemove) {
|
|
90
101
|
handleConditionalRemoves(projectName, templateConfig, answers);
|
|
@@ -93,12 +104,37 @@ Documentation: ${config.docsUrl}
|
|
|
93
104
|
renameFiles(projectName, templateConfig);
|
|
94
105
|
// Step 9: Remove meta files
|
|
95
106
|
removeMetaFiles(projectName, templateConfig);
|
|
96
|
-
// Step
|
|
107
|
+
// Step 9b: Full scaffold — overlay examples/ onto src/ (opt-in via --full).
|
|
108
|
+
// The default scaffold is intentionally minimal; --full installs the working
|
|
109
|
+
// example features and populated tool-server collections.
|
|
110
|
+
const applyExamplesScript = `${projectName}/scripts/apply-examples.mjs`;
|
|
111
|
+
if (full) {
|
|
112
|
+
if (fs.existsSync(applyExamplesScript)) {
|
|
113
|
+
console.log(chalk.blue('Applying full scaffold (examples)...\n'));
|
|
114
|
+
execSync('node scripts/apply-examples.mjs', { cwd: projectName, stdio: 'inherit' });
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
console.log(chalk.yellow('--full requested but scripts/apply-examples.mjs is missing; skipping.\n'));
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Step 9c: Content app scaffold — overlay an opinionated app-owned content
|
|
121
|
+
// model, interactions, process, UI routes, and setup/exercise scripts.
|
|
122
|
+
const applyContentAppScript = `${projectName}/scripts/apply-content-app.mjs`;
|
|
123
|
+
if (contentApp) {
|
|
124
|
+
if (fs.existsSync(applyContentAppScript)) {
|
|
125
|
+
console.log(chalk.blue('Applying content app scaffold...\n'));
|
|
126
|
+
execSync('node scripts/apply-content-app.mjs', { cwd: projectName, stdio: 'inherit' });
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
console.log(chalk.yellow('--content-app requested but scripts/apply-content-app.mjs is missing; skipping.\n'));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// Step 10: Run pre-install hooks (if any) - e.g., CLI authentication for private registries
|
|
97
133
|
let skipDependencyInstall = false;
|
|
98
134
|
if (templateConfig.preInstall) {
|
|
99
135
|
const preInstallSuccess = await runPreInstallHooks(projectName, templateConfig.preInstall, packageManager, nonInteractive);
|
|
100
136
|
if (!preInstallSuccess) {
|
|
101
|
-
console.log(chalk.yellow('
|
|
137
|
+
console.log(chalk.yellow('Pre-install hooks failed. Skipping dependency installation.\n'));
|
|
102
138
|
console.log(chalk.gray('You can install dependencies manually after resolving the issue:\n'));
|
|
103
139
|
console.log(chalk.gray(` cd ${projectName}`));
|
|
104
140
|
console.log(chalk.gray(` ${packageManager} install\n`));
|
|
@@ -106,6 +142,13 @@ Documentation: ${config.docsUrl}
|
|
|
106
142
|
}
|
|
107
143
|
}
|
|
108
144
|
// Step 10: Install dependencies
|
|
145
|
+
if (skipInstall) {
|
|
146
|
+
console.log(chalk.yellow('Skipping dependency installation (--skip-install).\n'));
|
|
147
|
+
console.log(chalk.gray('You can install dependencies manually when needed:\n'));
|
|
148
|
+
console.log(chalk.gray(` cd ${projectName}`));
|
|
149
|
+
console.log(chalk.gray(` ${packageManager} install\n`));
|
|
150
|
+
skipDependencyInstall = true;
|
|
151
|
+
}
|
|
109
152
|
if (!skipDependencyInstall) {
|
|
110
153
|
await installDependencies(projectName, packageManager);
|
|
111
154
|
}
|
|
@@ -114,21 +157,25 @@ Documentation: ${config.docsUrl}
|
|
|
114
157
|
await runPostInstallHooks(projectName, templateConfig.postInstall, packageManager, nonInteractive);
|
|
115
158
|
}
|
|
116
159
|
// Step 12: Success!
|
|
117
|
-
showSuccess(projectName, packageManager, selectedTemplate.name, selectedTemplate.repository);
|
|
160
|
+
showSuccess(projectName, packageManager, selectedTemplate.name, selectedTemplate.repository, contentApp);
|
|
118
161
|
}
|
|
119
162
|
catch (error) {
|
|
120
|
-
console.log(chalk.red(`\
|
|
163
|
+
console.log(chalk.red(`\nInstallation failed: ${error instanceof Error ? error.message : 'Unknown error'}\n`));
|
|
121
164
|
process.exit(1);
|
|
122
165
|
}
|
|
123
166
|
}
|
|
124
167
|
/**
|
|
125
168
|
* Show success message
|
|
126
169
|
*/
|
|
127
|
-
function showSuccess(projectName, packageManager, templateName, repository) {
|
|
128
|
-
console.log(chalk.green.bold('
|
|
170
|
+
function showSuccess(projectName, packageManager, templateName, repository, contentApp) {
|
|
171
|
+
console.log(chalk.green.bold('Project created successfully!\n'));
|
|
129
172
|
console.log(chalk.gray('Next steps:\n'));
|
|
130
173
|
console.log(chalk.cyan(` cd ${projectName}`));
|
|
131
|
-
console.log(chalk.cyan(` ${packageManager} dev`));
|
|
174
|
+
console.log(chalk.cyan(` ${packageManager} run dev`));
|
|
175
|
+
if (contentApp) {
|
|
176
|
+
console.log(chalk.cyan(` VERTESIA_TOKEN="$(vertesia auth token)" ${packageManager} run seed:content`));
|
|
177
|
+
console.log(chalk.cyan(` VERTESIA_TOKEN="$(vertesia auth token)" ${packageManager} run exercise:content`));
|
|
178
|
+
}
|
|
132
179
|
console.log();
|
|
133
180
|
console.log(chalk.gray(`Documentation: ${config.docsUrl}`));
|
|
134
181
|
console.log(chalk.gray(`Template: ${templateName}`));
|
|
@@ -136,7 +183,7 @@ function showSuccess(projectName, packageManager, templateName, repository) {
|
|
|
136
183
|
}
|
|
137
184
|
// Run the installer
|
|
138
185
|
main().catch((error) => {
|
|
139
|
-
console.error(chalk.red(`\
|
|
186
|
+
console.error(chalk.red(`\nFatal error: ${error.message}\n`));
|
|
140
187
|
process.exit(1);
|
|
141
188
|
});
|
|
142
189
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/lib/package-manager.d.ts
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Package manager detection and selection
|
|
3
|
+
*/
|
|
4
|
+
export declare function buildPackageManagerEnv(packageManager: string): NodeJS.ProcessEnv;
|
|
1
5
|
/**
|
|
2
6
|
* Detect available package managers and let user choose
|
|
3
7
|
* Returns the selected package manager ('pnpm' or 'npm')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../src/package-manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../src/package-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,wBAAgB,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAAC,UAAU,CAQhF;AAeD;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACtC,oBAAoB,CAAC,EAAE,MAAM,GAAG,KAAK,EACrC,cAAc,UAAQ,GACvB,OAAO,CAAC,MAAM,CAAC,CAqDjB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAcpG"}
|
package/lib/package-manager.js
CHANGED
|
@@ -1,17 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Package manager detection and selection
|
|
3
3
|
*/
|
|
4
|
-
import { execSync } from 'child_process';
|
|
5
|
-
import prompts from 'prompts';
|
|
4
|
+
import { execSync } from 'node:child_process';
|
|
6
5
|
import chalk from 'chalk';
|
|
6
|
+
import prompts from 'prompts';
|
|
7
|
+
export function buildPackageManagerEnv(packageManager) {
|
|
8
|
+
const env = { ...process.env };
|
|
9
|
+
if (packageManager === 'pnpm' && !env.pnpm_config_registry && env.npm_config_registry) {
|
|
10
|
+
env.pnpm_config_registry = env.npm_config_registry;
|
|
11
|
+
}
|
|
12
|
+
return env;
|
|
13
|
+
}
|
|
7
14
|
/**
|
|
8
15
|
* Check if a command exists on the system (cross-platform)
|
|
9
16
|
*/
|
|
10
17
|
function commandExists(command) {
|
|
11
18
|
try {
|
|
12
|
-
const checkCommand = process.platform === 'win32'
|
|
13
|
-
? `where ${command}`
|
|
14
|
-
: `which ${command}`;
|
|
19
|
+
const checkCommand = process.platform === 'win32' ? `where ${command}` : `which ${command}`;
|
|
15
20
|
execSync(checkCommand, { stdio: 'ignore' });
|
|
16
21
|
return true;
|
|
17
22
|
}
|
|
@@ -51,20 +56,20 @@ export async function selectPackageManager(forcedPackageManager, nonInteractive
|
|
|
51
56
|
return 'pnpm';
|
|
52
57
|
}
|
|
53
58
|
// Both are installed - let user choose
|
|
54
|
-
console.log(chalk.blue('
|
|
59
|
+
console.log(chalk.blue('Package Manager\n'));
|
|
55
60
|
const response = await prompts({
|
|
56
61
|
type: 'select',
|
|
57
62
|
name: 'packageManager',
|
|
58
63
|
message: 'Which package manager would you like to use?',
|
|
59
64
|
choices: [
|
|
60
65
|
{ title: 'pnpm (recommended)', value: 'pnpm' },
|
|
61
|
-
{ title: 'npm', value: 'npm' }
|
|
66
|
+
{ title: 'npm', value: 'npm' },
|
|
62
67
|
],
|
|
63
|
-
initial: 0
|
|
68
|
+
initial: 0,
|
|
64
69
|
}, {
|
|
65
70
|
onCancel: () => {
|
|
66
71
|
throw new Error('Installation cancelled by user');
|
|
67
|
-
}
|
|
72
|
+
},
|
|
68
73
|
});
|
|
69
74
|
console.log();
|
|
70
75
|
return response.packageManager;
|
|
@@ -73,12 +78,13 @@ export async function selectPackageManager(forcedPackageManager, nonInteractive
|
|
|
73
78
|
* Install dependencies using the specified package manager
|
|
74
79
|
*/
|
|
75
80
|
export async function installDependencies(projectName, packageManager) {
|
|
76
|
-
console.log(chalk.blue('
|
|
81
|
+
console.log(chalk.blue('Installing dependencies...\n'));
|
|
77
82
|
console.log(chalk.gray(` Using: ${packageManager}\n`));
|
|
78
83
|
try {
|
|
79
84
|
execSync(`${packageManager} install`, {
|
|
80
85
|
cwd: projectName,
|
|
81
86
|
stdio: 'inherit',
|
|
87
|
+
env: buildPackageManagerEnv(packageManager),
|
|
82
88
|
});
|
|
83
89
|
console.log();
|
|
84
90
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-manager.js","sourceRoot":"","sources":["../src/package-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"package-manager.js","sourceRoot":"","sources":["../src/package-manager.ts"],"names":[],"mappings":"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"}
|
package/lib/post-install.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Install hooks for running commands before/after project creation
|
|
3
|
+
*/
|
|
4
|
+
import type { PostInstallConfig, PreInstallConfig } from './template-config.js';
|
|
2
5
|
/**
|
|
3
6
|
* Run pre-install hooks (before npm install)
|
|
4
7
|
* Returns true if all required hooks succeeded, false otherwise
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"post-install.d.ts","sourceRoot":"","sources":["../src/post-install.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"post-install.d.ts","sourceRoot":"","sources":["../src/post-install.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAuJhF;;;GAGG;AACH,wBAAsB,kBAAkB,CACpC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,gBAAgB,EAC5B,cAAc,EAAE,MAAM,EACtB,cAAc,UAAQ,GACvB,OAAO,CAAC,OAAO,CAAC,CAElB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACrC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,iBAAiB,EAC9B,cAAc,EAAE,MAAM,EACtB,cAAc,UAAQ,GACvB,OAAO,CAAC,IAAI,CAAC,CAEf"}
|
package/lib/post-install.js
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Install hooks for running commands before/after project creation
|
|
3
3
|
*/
|
|
4
|
+
import { spawn, spawnSync } from 'node:child_process';
|
|
4
5
|
import chalk from 'chalk';
|
|
5
|
-
import { spawn, spawnSync } from 'child_process';
|
|
6
6
|
import prompts from 'prompts';
|
|
7
|
+
import { buildPackageManagerEnv } from './package-manager.js';
|
|
7
8
|
/**
|
|
8
9
|
* Check if a command exists in PATH
|
|
9
10
|
*/
|
|
10
11
|
function commandExists(command) {
|
|
11
12
|
const result = spawnSync(process.platform === 'win32' ? 'where' : 'which', [command], {
|
|
12
|
-
stdio: 'ignore'
|
|
13
|
+
stdio: 'ignore',
|
|
13
14
|
});
|
|
14
15
|
return result.status === 0;
|
|
15
16
|
}
|
|
@@ -17,27 +18,26 @@ function commandExists(command) {
|
|
|
17
18
|
* Install a global npm package
|
|
18
19
|
*/
|
|
19
20
|
async function installGlobalPackage(packageName, packageManager) {
|
|
20
|
-
console.log(chalk.blue(
|
|
21
|
+
console.log(chalk.blue(`Installing ${packageName}...\n`));
|
|
21
22
|
return new Promise((resolve) => {
|
|
22
|
-
const args = packageManager === 'npm'
|
|
23
|
-
? ['install', '-g', packageName]
|
|
24
|
-
: ['add', '-g', packageName];
|
|
23
|
+
const args = packageManager === 'npm' ? ['install', '-g', packageName] : ['add', '-g', packageName];
|
|
25
24
|
const child = spawn(packageManager, args, {
|
|
26
25
|
stdio: 'inherit',
|
|
27
|
-
shell: true
|
|
26
|
+
shell: true,
|
|
27
|
+
env: buildPackageManagerEnv(packageManager),
|
|
28
28
|
});
|
|
29
29
|
child.on('close', (code) => {
|
|
30
30
|
if (code === 0) {
|
|
31
|
-
console.log(chalk.green(`
|
|
31
|
+
console.log(chalk.green(` ${packageName} installed successfully\n`));
|
|
32
32
|
resolve(true);
|
|
33
33
|
}
|
|
34
34
|
else {
|
|
35
|
-
console.log(chalk.yellow(`
|
|
35
|
+
console.log(chalk.yellow(` Failed to install ${packageName}\n`));
|
|
36
36
|
resolve(false);
|
|
37
37
|
}
|
|
38
38
|
});
|
|
39
39
|
child.on('error', () => {
|
|
40
|
-
console.log(chalk.yellow(`
|
|
40
|
+
console.log(chalk.yellow(` Failed to install ${packageName}\n`));
|
|
41
41
|
resolve(false);
|
|
42
42
|
});
|
|
43
43
|
});
|
|
@@ -53,7 +53,7 @@ async function runCommand(command, cwd) {
|
|
|
53
53
|
const child = spawn('npx', ['--yes', ...command.split(' ')], {
|
|
54
54
|
stdio: 'inherit',
|
|
55
55
|
shell: true,
|
|
56
|
-
cwd
|
|
56
|
+
cwd,
|
|
57
57
|
});
|
|
58
58
|
child.on('close', (code) => {
|
|
59
59
|
resolve(code === 0);
|
|
@@ -71,7 +71,7 @@ async function runInstallHooks(projectName, config, packageManager, phase, nonIn
|
|
|
71
71
|
return true;
|
|
72
72
|
}
|
|
73
73
|
const phaseLabel = phase === 'pre' ? 'pre-install' : 'post-install';
|
|
74
|
-
console.log(chalk.blue(
|
|
74
|
+
console.log(chalk.blue(`Running ${phaseLabel} hooks...\n`));
|
|
75
75
|
// Check and install CLI package if needed
|
|
76
76
|
if (config.cliPackage) {
|
|
77
77
|
// Extract the CLI binary name from the package (e.g., @vertesia/cli -> vertesia)
|
|
@@ -85,19 +85,19 @@ async function runInstallHooks(projectName, config, packageManager, phase, nonIn
|
|
|
85
85
|
type: 'confirm',
|
|
86
86
|
name: 'installCli',
|
|
87
87
|
message: `The ${config.cliPackage} package is required. Do you want to install it globally?`,
|
|
88
|
-
initial: true
|
|
88
|
+
initial: true,
|
|
89
89
|
});
|
|
90
90
|
installCli = response.installCli;
|
|
91
91
|
}
|
|
92
92
|
if (installCli) {
|
|
93
93
|
const installed = await installGlobalPackage(config.cliPackage, packageManager);
|
|
94
94
|
if (!installed) {
|
|
95
|
-
console.log(chalk.yellow(`
|
|
95
|
+
console.log(chalk.yellow(` Skipping ${phaseLabel} commands that require the CLI\n`));
|
|
96
96
|
return false;
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
99
|
else {
|
|
100
|
-
console.log(chalk.yellow(`
|
|
100
|
+
console.log(chalk.yellow(` Skipping ${phaseLabel} commands that require the CLI\n`));
|
|
101
101
|
return false;
|
|
102
102
|
}
|
|
103
103
|
}
|
|
@@ -110,20 +110,20 @@ async function runInstallHooks(projectName, config, packageManager, phase, nonIn
|
|
|
110
110
|
type: 'confirm',
|
|
111
111
|
name: 'proceed',
|
|
112
112
|
message: promptMessage,
|
|
113
|
-
initial: true
|
|
113
|
+
initial: true,
|
|
114
114
|
});
|
|
115
115
|
if (!proceed) {
|
|
116
|
-
console.log(chalk.gray(`
|
|
116
|
+
console.log(chalk.gray(` Skipped: ${cmd.name}\n`));
|
|
117
117
|
continue;
|
|
118
118
|
}
|
|
119
119
|
}
|
|
120
120
|
console.log(chalk.gray(` Running: ${cmd.name}...`));
|
|
121
121
|
const success = await runCommand(cmd.command, projectName);
|
|
122
122
|
if (success) {
|
|
123
|
-
console.log(chalk.green(`
|
|
123
|
+
console.log(chalk.green(` ${cmd.name} completed\n`));
|
|
124
124
|
}
|
|
125
125
|
else {
|
|
126
|
-
console.log(chalk.yellow(`
|
|
126
|
+
console.log(chalk.yellow(` ${cmd.name} failed (you can run it manually later)\n`));
|
|
127
127
|
// For pre-install, a failure is critical - return false to skip dependency installation
|
|
128
128
|
if (phase === 'pre') {
|
|
129
129
|
return false;
|