@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.
Files changed (119) hide show
  1. package/README.md +123 -66
  2. package/lib/configuration.d.ts +63 -0
  3. package/lib/configuration.d.ts.map +1 -0
  4. package/lib/configuration.js +68 -0
  5. package/lib/configuration.js.map +1 -0
  6. package/lib/download-template.d.ts +5 -0
  7. package/lib/download-template.d.ts.map +1 -0
  8. package/lib/download-template.js +33 -0
  9. package/lib/download-template.js.map +1 -0
  10. package/lib/index.d.ts +9 -0
  11. package/lib/index.d.ts.map +1 -0
  12. package/lib/index.js +159 -0
  13. package/lib/index.js.map +1 -0
  14. package/lib/package-manager.d.ts +10 -0
  15. package/lib/package-manager.d.ts.map +1 -0
  16. package/lib/package-manager.js +74 -0
  17. package/lib/package-manager.js.map +1 -0
  18. package/lib/process-template.d.ts +25 -0
  19. package/lib/process-template.d.ts.map +1 -0
  20. package/lib/process-template.js +186 -0
  21. package/lib/process-template.js.map +1 -0
  22. package/lib/prompts.d.ts +6 -0
  23. package/lib/prompts.d.ts.map +1 -0
  24. package/lib/prompts.js +54 -0
  25. package/lib/prompts.js.map +1 -0
  26. package/lib/template-config.d.ts +87 -0
  27. package/lib/template-config.d.ts.map +1 -0
  28. package/lib/template-config.js +23 -0
  29. package/lib/template-config.js.map +1 -0
  30. package/lib/template-selector.d.ts +7 -0
  31. package/lib/template-selector.d.ts.map +1 -0
  32. package/lib/template-selector.js +56 -0
  33. package/lib/template-selector.js.map +1 -0
  34. package/lib/transforms.d.ts +33 -0
  35. package/lib/transforms.d.ts.map +1 -0
  36. package/lib/transforms.js +81 -0
  37. package/lib/transforms.js.map +1 -0
  38. package/package.json +38 -48
  39. package/bin/create-plugin.mjs +0 -2
  40. package/lib/Package.d.ts +0 -42
  41. package/lib/Package.d.ts.map +0 -1
  42. package/lib/Package.js +0 -52
  43. package/lib/Package.js.map +0 -1
  44. package/lib/TemplateInit.d.ts +0 -30
  45. package/lib/TemplateInit.d.ts.map +0 -1
  46. package/lib/TemplateInit.js +0 -48
  47. package/lib/TemplateInit.js.map +0 -1
  48. package/lib/ToolTemplateInit.d.ts +0 -10
  49. package/lib/ToolTemplateInit.d.ts.map +0 -1
  50. package/lib/ToolTemplateInit.js +0 -58
  51. package/lib/ToolTemplateInit.js.map +0 -1
  52. package/lib/WebTemplateInit.d.ts +0 -10
  53. package/lib/WebTemplateInit.d.ts.map +0 -1
  54. package/lib/WebTemplateInit.js +0 -68
  55. package/lib/WebTemplateInit.js.map +0 -1
  56. package/lib/copy.d.ts +0 -12
  57. package/lib/copy.d.ts.map +0 -1
  58. package/lib/copy.js +0 -45
  59. package/lib/copy.js.map +0 -1
  60. package/lib/deps.d.ts +0 -3
  61. package/lib/deps.d.ts.map +0 -1
  62. package/lib/deps.js +0 -20
  63. package/lib/deps.js.map +0 -1
  64. package/lib/hasBin.d.ts +0 -2
  65. package/lib/hasBin.d.ts.map +0 -1
  66. package/lib/hasBin.js +0 -14
  67. package/lib/hasBin.js.map +0 -1
  68. package/lib/init.d.ts +0 -2
  69. package/lib/init.d.ts.map +0 -1
  70. package/lib/init.js +0 -124
  71. package/lib/init.js.map +0 -1
  72. package/lib/main.d.ts +0 -2
  73. package/lib/main.d.ts.map +0 -1
  74. package/lib/main.js +0 -8
  75. package/lib/main.js.map +0 -1
  76. package/lib/template.d.ts +0 -4
  77. package/lib/template.d.ts.map +0 -1
  78. package/lib/template.js +0 -16
  79. package/lib/template.js.map +0 -1
  80. package/lib/types.d.ts +0 -12
  81. package/lib/types.d.ts.map +0 -1
  82. package/lib/types.js +0 -20
  83. package/lib/types.js.map +0 -1
  84. package/lib/utils.d.ts +0 -2
  85. package/lib/utils.d.ts.map +0 -1
  86. package/lib/utils.js +0 -7
  87. package/lib/utils.js.map +0 -1
  88. package/templates/tool/.env.example +0 -6
  89. package/templates/tool/.vscode/launch.json +0 -24
  90. package/templates/tool/README.md +0 -190
  91. package/templates/tool/api/index.ts +0 -8
  92. package/templates/tool/gitignore +0 -26
  93. package/templates/tool/rollup.config.js +0 -30
  94. package/templates/tool/src/collections/example/icon.svg.ts +0 -6
  95. package/templates/tool/src/collections/example/index.ts +0 -14
  96. package/templates/tool/src/collections/example/weather/WeatherTool.ts +0 -32
  97. package/templates/tool/src/collections/example/weather/manifest.ts +0 -16
  98. package/templates/tool/src/collections/index.ts +0 -7
  99. package/templates/tool/src/index.ts +0 -5
  100. package/templates/tool/src/server.ts +0 -71
  101. package/templates/tool/tsconfig.json +0 -24
  102. package/templates/tool/vite.config.js +0 -48
  103. package/templates/web/README.md +0 -156
  104. package/templates/web/eslint.config.js +0 -29
  105. package/templates/web/gitignore +0 -25
  106. package/templates/web/index.html.tmpl +0 -26
  107. package/templates/web/src/app.tsx +0 -8
  108. package/templates/web/src/assets.ts +0 -26
  109. package/templates/web/src/env.ts.tmpl +0 -14
  110. package/templates/web/src/index.css +0 -21
  111. package/templates/web/src/main.tsx.tmpl +0 -21
  112. package/templates/web/src/pages.tsx +0 -31
  113. package/templates/web/src/plugin.tsx.tmpl +0 -18
  114. package/templates/web/src/routes.tsx +0 -17
  115. package/templates/web/src/vite-env.d.ts +0 -1
  116. package/templates/web/tsconfig.app.json +0 -51
  117. package/templates/web/tsconfig.json +0 -7
  118. package/templates/web/tsconfig.node.json +0 -27
  119. 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":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B;;GAEG;AACH,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,QAAgB;IAClC,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAC9D,OAAO,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CAAC,OAAe,EAAE,OAA4B;IACtE,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,MAAM,WAAW,GAAG,KAAK,GAAG,IAAI,CAAC;QACjC,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAClC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACpF,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC/B,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB,CAAC,OAAe,EAAE,OAA4B;IACtE,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,iDAAiD;QACjD,8DAA8D;QAC9D,0DAA0D;QAC1D,MAAM,aAAa,GAAG,IAAI,MAAM,CAC9B,qBAAqB,GAAG,sCAAsC,EAC9D,IAAI,CACL,CAAC;QACF,IAAI,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;YACjC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE;gBAC3E,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC;YACtD,CAAC,CAAC,CAAC;YACH,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;QAED,+CAA+C;QAC/C,qDAAqD;QACrD,gDAAgD;QAChD,MAAM,eAAe,GAAG,IAAI,MAAM,CAAC,aAAa,GAAG,KAAK,EAAE,GAAG,CAAC,CAAC;QAC/D,IAAI,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC;YACnC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1D,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC/B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAC9B,WAAmB,EACnB,cAA8B,EAC9B,OAA4B;IAE5B,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC;IAEtD,KAAK,MAAM,IAAI,IAAI,cAAc,CAAC,KAAK,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAE9C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,0BAA0B,IAAI,aAAa,CAAC,CAAC,CAAC;YACvE,SAAS;QACX,CAAC;QAED,IAAI,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAChD,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,iDAAiD;QACjD,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACnD,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;YACzB,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACnD,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;YACzB,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC7B,CAAC;QAED,IAAI,QAAQ,EAAE,CAAC;YACb,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,WAAmB,EAAE,OAA4B;IACjF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAC;IAE1D,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAE/D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,qDAAqD,CAAC,CAAC,CAAC;QACjF,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;QAEzE,sCAAsC;QACtC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,IAAI,WAAW,CAAC;QACpD,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACjC,WAAW,CAAC,IAAI,GAAG,OAAO,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,OAAO,GAAG,CAAC,CAAC,CAAC;QACnE,CAAC;QAED,2EAA2E;QAC3E,IAAI,qBAAqB,GAAG,CAAC,CAAC;QAE9B,CAAC,cAAc,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,sBAAsB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YAChG,IAAI,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;oBAClD,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;wBAC1E,WAAW,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,aAAa,EAAE,CAAC;wBAClD,WAAW,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC;wBACpC,qBAAqB,EAAE,CAAC;oBAC1B,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,qBAAqB,GAAG,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,qBAAqB,kCAAkC,CAAC,CAAC,CAAC;QACpG,CAAC;QAED,qBAAqB;QACrB,EAAE,CAAC,aAAa,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAEjF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,yCAAyC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;IACjI,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,WAAmB,EACnB,cAA8B,EAC9B,OAA4B;IAE5B,IAAI,CAAC,cAAc,CAAC,iBAAiB;QAAE,OAAO;IAE9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC,CAAC;IAEvE,KAAK,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACrF,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QACvC,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QAExC,IAAI,aAAa,EAAE,CAAC;YAClB,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;gBACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;gBAC9C,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC5B,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;oBACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,WAAmB,EAAE,cAA8B;IACjF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAE/C,MAAM,aAAa,GAAG,cAAc,CAAC,kBAAkB,IAAI,EAAE,CAAC;IAE9D,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC9C,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { TemplateConfig } from './template-config.js';
2
+ /**
3
+ * Prompt user for configuration values
4
+ */
5
+ export declare function promptUser(projectName: string, templateConfig: TemplateConfig): Promise<Record<string, any>>;
6
+ //# sourceMappingURL=prompts.d.ts.map
@@ -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"}