@pixpilot/scaffoldfy 0.19.3 → 0.20.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 +1 -1
- package/dist/cli.cjs +1 -1
- package/dist/cli.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +113 -13
- package/dist/index.d.ts +113 -13
- package/dist/index.js +1 -1
- package/dist/src-1xh0Jxuk.js +23 -0
- package/dist/src-CKioPF46.cjs +23 -0
- package/dist/utils-BzYLo3gR.js +1 -0
- package/dist/utils-CGdE7wLi.js +1 -0
- package/dist/utils-DvPgyPUm.cjs +1 -0
- package/dist/utils-wf_LrO7W.cjs +1 -0
- package/package.json +4 -4
- package/schema/tasks.schema.json +18 -18
- package/dist/src-BWFVB-OE.cjs +0 -17
- package/dist/src-DYtpmv9N.js +0 -17
- package/dist/utils-BeLs5aXN.cjs +0 -1
- package/dist/utils-YBR62LwC.js +0 -1
- package/dist/utils-ii_k_uXl.js +0 -1
- package/dist/utils-zjkNe5C1.cjs +0 -1
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@ A flexible and powerful task automation utility for project setup, cleanup, and
|
|
|
4
4
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
7
|
-
- 🔄 **9 Task Types** - update-json,
|
|
7
|
+
- 🔄 **9 Task Types** - update-json, write, regex-replace, replace-in-file, delete, conditional-delete, rename, git-init, exec
|
|
8
8
|
- 🧩 **Template Inheritance** - Extend base templates for code reuse
|
|
9
9
|
- 🔍 **Dry-Run Mode with Diff** - Preview exact changes before applying
|
|
10
10
|
- 🔌 **Plugin System** - Create custom task types and lifecycle hooks
|
package/dist/cli.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
const e=require(`./utils-
|
|
2
|
+
const e=require(`./utils-DvPgyPUm.cjs`),t=require(`./src-CKioPF46.cjs`);let n=require(`node:fs`);n=e.g(n);let r=require(`node:path`);r=e.g(r);let i=require(`node:process`);i=e.g(i);let a=require(`commander`);a=e.g(a);let o=require(`node:url`);o=e.g(o);let s=require(`ajv`);s=e.g(s);const c=1,l=(0,o.fileURLToPath)(require(`url`).pathToFileURL(__filename).href),u=r.default.dirname(l);function d(){return new s.default({allErrors:!0,verbose:!0,strict:!1,discriminator:!0})}function f(){let e=r.default.join(u,`..`,`schema`,`tasks.schema.json`);try{let t=n.default.readFileSync(e,`utf-8`);return JSON.parse(t)}catch(t){throw Error(`Failed to load tasks schema from ${e}: ${t instanceof Error?t.message:String(t)}`)}}function p(e){return e.filter(t=>{if(t.keyword===`oneOf`){let e=t.params;if(e.passingSchemas&&e.passingSchemas.length>0)return!1}if(t.keyword===`required`){let n=e.find(e=>e.keyword===`oneOf`&&e.instancePath===t.instancePath);if(n){let e=n.params;if(e.passingSchemas&&e.passingSchemas.length>0)return!1}}return!0}).map(e=>{let t=e.instancePath||`root`,n=e.message??`Unknown error`;switch(e.keyword){case`required`:return`${t}: Missing required property "${String(e.params.missingProperty??`unknown`)}"`;case`type`:return`${t}: Expected type "${String(e.params.type??`unknown`)}", received "${typeof e.data}"`;case`enum`:{let r=e.params.allowedValues;return`${t}: ${n}. Allowed values: ${Array.isArray(r)?r.join(`, `):String(r)}`}case`pattern`:{let{pattern:r}=e.params;return`${t}: ${n}. Value must match pattern: ${String(r)}`}case`oneOf`:return`${t}: ${n}. Configuration must match exactly one of the allowed schemas`;case`additionalProperties`:return`${t}: ${n}. Unknown property: "${String(e.params.additionalProperty??`unknown`)}"`;default:return`${t}: ${n}`}})}function m(t,n={}){try{let e=d(),r=f(),i=e.compile(r);if(!i(t)&&i.errors){let e=p(i.errors);return e.length===0?{valid:!0,errors:[]}:(n.silent||h(e),{valid:!1,errors:e})}return{valid:!0,errors:[]}}catch(t){let r=t instanceof Error?t.message:`Unknown error occurred during schema validation`;return n.silent||(e.i(`❌ Schema validation error:`,`error`),e.i(` ${r}`,`error`)),{valid:!1,errors:[r]}}}function h(t){e.i(`❌ Schema validation failed:`,`error`),e.i(``,`error`),e.i(`The following validation errors were found:`,`error`),e.i(``,`error`);for(let n of t)e.i(` • ${n}`,`error`);e.i(``,`error`),e.i(`Please fix these errors in your template configuration file.`,`error`),e.i(``,`error`),e.i(`For schema documentation, see: https://github.com/pixpilot/scaffoldfy/tree/main/packages/scaffoldfy/schema`,`info`)}const g=new a.Command,_=r.default.join(__dirname,`..`,`package.json`);let v=`0.0.0`;try{v=JSON.parse(n.default.readFileSync(_,`utf-8`)).version??`0.0.0`}catch{}g.name(`scaffoldfy`).description(`Automate project setup and configuration with customizable tasks`).version(v),g.option(`--dry-run`,`Run in dry mode without making any changes`).option(`--force`,`Force execution even if checks fail`).option(`--tasks-file <path>`,`Path to JSON file containing task definitions`,`./template-tasks.json`).option(`--tasks-ts <path>`,`Path to TypeScript file exporting tasks`,`./template-tasks.ts`).option(`--no-validate`,`Skip schema validation of task configuration (validation is enabled by default)`).action(async a=>{try{let o=[],s,c,l;if(a.tasksTs!=null&&a.tasksTs!==``){let t=r.default.resolve(i.default.cwd(),a.tasksTs);if(n.default.existsSync(t)){e.i(`Loading tasks from TypeScript file: ${a.tasksTs}`,`info`),l=t;try{let n=await import(t);o=n.default??n.tasks??[],(!Array.isArray(o)||o.length===0)&&(e.i(`⚠️ No tasks found in TypeScript file or invalid format`,`warn`),e.i(`Expected default export or named export "tasks" with TaskDefinition[]`,`info`))}catch(t){e.i(`Failed to load TypeScript tasks file: ${a.tasksTs}`,`error`),t instanceof Error&&e.i(` Error: ${t.message}`,`error`),i.default.exit(1)}}}if(o.length===0&&a.tasksFile!=null&&a.tasksFile!==``){let u=r.default.resolve(i.default.cwd(),a.tasksFile);if(n.default.existsSync(u)){l=u;try{if(a.validate!==!1){e.i(`Validating task configuration against schema...`,`info`);let t=n.default.readFileSync(u,`utf-8`);m(JSON.parse(t),{silent:!1}).valid||(e.i(``,`error`),e.i(`💡 You can skip validation with --no-validate flag, but this is not recommended.`,`info`),i.default.exit(1)),e.i(`✓ Schema validation passed`,`success`)}let r=await t.q(u);o=r.tasks,s=r.variables,c=r.prompts,Array.isArray(o)||(e.i(`❌ Invalid tasks file format`,`error`),e.i(`Expected JSON with { "tasks": [...] } structure`,`info`),i.default.exit(1))}catch(t){e.i(`Failed to load JSON tasks file: ${a.tasksFile}`,`error`),t instanceof Error&&e.i(` Error: ${t.message}`,`error`),i.default.exit(1)}}else e.i(`Tasks file not found: ${a.tasksFile}`,`warn`)}let u=c!=null&&c.length>0||s!=null&&s.length>0;o.length===0&&!u&&(e.i(`❌ No tasks defined`,`error`),e.i(`Please provide tasks using one of these methods:`,`info`),e.i(` 1. Create a template-tasks.json file in the current directory`,`info`),e.i(` 2. Create a template-tasks.ts file in the current directory`,`info`),e.i(` 3. Use --tasks-file option to specify a different JSON file`,`info`),e.i(` 4. Use --tasks-ts option to specify a different TypeScript file`,`info`),e.i(`Example JSON structure:`,`info`),console.log(JSON.stringify({tasks:[{id:`update-package`,name:`Update package.json`,description:`Update package.json with repository information`,required:!0,enabled:!0,type:`update-json`,prompts:[{id:`projectName`,type:`input`,message:`What is your project name?`,default:`my-project`,required:!0},{id:`includeTests`,type:`confirm`,message:`Include test files?`,default:!0}],config:{file:`package.json`,updates:{name:`{{projectName}}`,author:`{{author}}`}}}]},null,2)),i.default.exit(1)),o.length===0?e.i(`Loaded template with 0 tasks (template may only provide prompts/variables for extending)`,`info`):e.i(`Loaded ${o.length} task(s)`,`success`),await t.n(o,{dryRun:a.dryRun,force:a.force,tasksFilePath:l,globalVariables:s,globalPrompts:c})}catch(t){if(e.i(`❌ CLI execution failed`,`error`),t instanceof Error){e.i(`Error: ${t.message}`,`error`);let n=i.default.env.DEBUG;n!=null&&n!==``&&console.error(t.stack)}else console.error(t);i.default.exit(1)}}),g.parse(i.default.argv);
|
package/dist/cli.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{n as e,
|
|
2
|
+
import{n as e,q as t}from"./src-1xh0Jxuk.js";import{i as n}from"./utils-CGdE7wLi.js";import r from"node:path";import{fileURLToPath as i}from"node:url";import a from"node:fs";import o from"node:process";import{Command as s}from"commander";import c from"ajv";const l=()=>i(import.meta.url),u=(()=>r.dirname(l()))(),d=i(import.meta.url),f=r.dirname(d);function p(){return new c({allErrors:!0,verbose:!0,strict:!1,discriminator:!0})}function m(){let e=r.join(f,`..`,`schema`,`tasks.schema.json`);try{let t=a.readFileSync(e,`utf-8`);return JSON.parse(t)}catch(t){throw Error(`Failed to load tasks schema from ${e}: ${t instanceof Error?t.message:String(t)}`)}}function h(e){return e.filter(t=>{if(t.keyword===`oneOf`){let e=t.params;if(e.passingSchemas&&e.passingSchemas.length>0)return!1}if(t.keyword===`required`){let n=e.find(e=>e.keyword===`oneOf`&&e.instancePath===t.instancePath);if(n){let e=n.params;if(e.passingSchemas&&e.passingSchemas.length>0)return!1}}return!0}).map(e=>{let t=e.instancePath||`root`,n=e.message??`Unknown error`;switch(e.keyword){case`required`:return`${t}: Missing required property "${String(e.params.missingProperty??`unknown`)}"`;case`type`:return`${t}: Expected type "${String(e.params.type??`unknown`)}", received "${typeof e.data}"`;case`enum`:{let r=e.params.allowedValues;return`${t}: ${n}. Allowed values: ${Array.isArray(r)?r.join(`, `):String(r)}`}case`pattern`:{let{pattern:r}=e.params;return`${t}: ${n}. Value must match pattern: ${String(r)}`}case`oneOf`:return`${t}: ${n}. Configuration must match exactly one of the allowed schemas`;case`additionalProperties`:return`${t}: ${n}. Unknown property: "${String(e.params.additionalProperty??`unknown`)}"`;default:return`${t}: ${n}`}})}function g(e,t={}){try{let n=p(),r=m(),i=n.compile(r);if(!i(e)&&i.errors){let e=h(i.errors);return e.length===0?{valid:!0,errors:[]}:(t.silent||_(e),{valid:!1,errors:e})}return{valid:!0,errors:[]}}catch(e){let r=e instanceof Error?e.message:`Unknown error occurred during schema validation`;return t.silent||(n(`❌ Schema validation error:`,`error`),n(` ${r}`,`error`)),{valid:!1,errors:[r]}}}function _(e){n(`❌ Schema validation failed:`,`error`),n(``,`error`),n(`The following validation errors were found:`,`error`),n(``,`error`);for(let t of e)n(` • ${t}`,`error`);n(``,`error`),n(`Please fix these errors in your template configuration file.`,`error`),n(``,`error`),n(`For schema documentation, see: https://github.com/pixpilot/scaffoldfy/tree/main/packages/scaffoldfy/schema`,`info`)}const v=new s,y=r.join(u,`..`,`package.json`);let b=`0.0.0`;try{b=JSON.parse(a.readFileSync(y,`utf-8`)).version??`0.0.0`}catch{}v.name(`scaffoldfy`).description(`Automate project setup and configuration with customizable tasks`).version(b),v.option(`--dry-run`,`Run in dry mode without making any changes`).option(`--force`,`Force execution even if checks fail`).option(`--tasks-file <path>`,`Path to JSON file containing task definitions`,`./template-tasks.json`).option(`--tasks-ts <path>`,`Path to TypeScript file exporting tasks`,`./template-tasks.ts`).option(`--no-validate`,`Skip schema validation of task configuration (validation is enabled by default)`).action(async i=>{try{let s=[],c,l,u;if(i.tasksTs!=null&&i.tasksTs!==``){let e=r.resolve(o.cwd(),i.tasksTs);if(a.existsSync(e)){n(`Loading tasks from TypeScript file: ${i.tasksTs}`,`info`),u=e;try{let t=await import(e);s=t.default??t.tasks??[],(!Array.isArray(s)||s.length===0)&&(n(`⚠️ No tasks found in TypeScript file or invalid format`,`warn`),n(`Expected default export or named export "tasks" with TaskDefinition[]`,`info`))}catch(e){n(`Failed to load TypeScript tasks file: ${i.tasksTs}`,`error`),e instanceof Error&&n(` Error: ${e.message}`,`error`),o.exit(1)}}}if(s.length===0&&i.tasksFile!=null&&i.tasksFile!==``){let e=r.resolve(o.cwd(),i.tasksFile);if(a.existsSync(e)){u=e;try{if(i.validate!==!1){n(`Validating task configuration against schema...`,`info`);let t=a.readFileSync(e,`utf-8`);g(JSON.parse(t),{silent:!1}).valid||(n(``,`error`),n(`💡 You can skip validation with --no-validate flag, but this is not recommended.`,`info`),o.exit(1)),n(`✓ Schema validation passed`,`success`)}let r=await t(e);s=r.tasks,c=r.variables,l=r.prompts,Array.isArray(s)||(n(`❌ Invalid tasks file format`,`error`),n(`Expected JSON with { "tasks": [...] } structure`,`info`),o.exit(1))}catch(e){n(`Failed to load JSON tasks file: ${i.tasksFile}`,`error`),e instanceof Error&&n(` Error: ${e.message}`,`error`),o.exit(1)}}else n(`Tasks file not found: ${i.tasksFile}`,`warn`)}let d=l!=null&&l.length>0||c!=null&&c.length>0;s.length===0&&!d&&(n(`❌ No tasks defined`,`error`),n(`Please provide tasks using one of these methods:`,`info`),n(` 1. Create a template-tasks.json file in the current directory`,`info`),n(` 2. Create a template-tasks.ts file in the current directory`,`info`),n(` 3. Use --tasks-file option to specify a different JSON file`,`info`),n(` 4. Use --tasks-ts option to specify a different TypeScript file`,`info`),n(`Example JSON structure:`,`info`),console.log(JSON.stringify({tasks:[{id:`update-package`,name:`Update package.json`,description:`Update package.json with repository information`,required:!0,enabled:!0,type:`update-json`,prompts:[{id:`projectName`,type:`input`,message:`What is your project name?`,default:`my-project`,required:!0},{id:`includeTests`,type:`confirm`,message:`Include test files?`,default:!0}],config:{file:`package.json`,updates:{name:`{{projectName}}`,author:`{{author}}`}}}]},null,2)),o.exit(1)),s.length===0?n(`Loaded template with 0 tasks (template may only provide prompts/variables for extending)`,`info`):n(`Loaded ${s.length} task(s)`,`success`),await e(s,{dryRun:i.dryRun,force:i.force,tasksFilePath:u,globalVariables:c,globalPrompts:l})}catch(e){if(n(`❌ CLI execution failed`,`error`),e instanceof Error){n(`Error: ${e.message}`,`error`);let t=o.env.DEBUG;t!=null&&t!==``&&console.error(e.stack)}else console.error(e);o.exit(1)}}),v.parse(o.argv);export{};
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const e=require(`./utils-
|
|
1
|
+
const e=require(`./utils-DvPgyPUm.cjs`),t=require(`./src-CKioPF46.cjs`);exports.callHook=t.h,exports.clearPlugins=t.g,exports.clearTemplateCache=t.G,exports.collectPrompts=t.p,exports.collectVariables=t.o,exports.createPlugin=t._,exports.displayTasksDiff=t.O,exports.evaluateCondition=e.t,exports.executePluginTask=t.v,exports.executeTask=t.c,exports.getCreateDiff=t.k,exports.getDeleteDiff=t.A,exports.getExecDiff=t.j,exports.getGitInitDiff=t.M,exports.getGitRepoInfo=e.n,exports.getPlugin=t.y,exports.getPluginForTaskType=t.b,exports.getPluginTaskDiff=t.x,exports.getRegexReplaceDiff=t.N,exports.getRenameDiff=t.P,exports.getReplaceInFileDiff=t.F,exports.getTaskDiff=t.I,exports.getTemplateSourceDescription=t.z,exports.getUpdateJsonDiff=t.L,exports.getWriteDiff=t.R,exports.hasInlineTemplate=t.B,exports.hasTemplateFile=t.V,exports.interpolateTemplate=e.r,exports.isPluginTaskType=t.S,exports.listPlugins=t.C,exports.loadAndMergeTemplate=t.K,exports.loadTasksWithInheritance=t.q,exports.loadTemplate=t.J,exports.log=e.i,exports.main=t.t,exports.mergeTemplates=t.Y,exports.processTemplate=t.H,exports.prompt=e.a,exports.promptYesNo=e.o,exports.registerBuiltInPlugins=t.l,exports.registerHooks=t.w,exports.registerPlugin=t.T,exports.resolveAllDefaultValues=t.f,exports.resolveAllVariableValues=t.i,exports.resolveDefaultValue=t.m,exports.resolveVariableValue=t.a,exports.runTask=t.u,exports.runWithTasks=t.n,exports.setNestedProperty=e.s,exports.shouldUseHandlebars=t.U,exports.topologicalSort=t.s,exports.unregisterPlugin=t.E,exports.validatePluginTask=t.D,exports.validatePrompts=t.d,exports.validateTemplateConfig=t.W,exports.validateVariables=t.r;
|
package/dist/index.d.cts
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
|
-
//#region src/plugins/
|
|
1
|
+
//#region src/plugins/append/types.d.ts
|
|
2
2
|
|
|
3
|
+
interface AppendConfig {
|
|
4
|
+
file: string;
|
|
5
|
+
content?: string;
|
|
6
|
+
template?: string;
|
|
7
|
+
templateFile?: string;
|
|
8
|
+
newline?: boolean;
|
|
9
|
+
condition?: ConditionExpression;
|
|
10
|
+
}
|
|
11
|
+
//#endregion
|
|
12
|
+
//#region src/plugins/copy/types.d.ts
|
|
13
|
+
interface CopyConfig {
|
|
14
|
+
from: string;
|
|
15
|
+
to: string;
|
|
16
|
+
condition?: ConditionExpression;
|
|
17
|
+
}
|
|
18
|
+
//#endregion
|
|
19
|
+
//#region src/plugins/create/types.d.ts
|
|
3
20
|
interface CreateConfig {
|
|
4
21
|
file: string;
|
|
5
22
|
template?: string;
|
|
@@ -28,6 +45,19 @@ interface GitInitConfig {
|
|
|
28
45
|
condition?: ConditionExpression;
|
|
29
46
|
}
|
|
30
47
|
//#endregion
|
|
48
|
+
//#region src/plugins/mkdir/types.d.ts
|
|
49
|
+
interface MkdirConfig {
|
|
50
|
+
path: string;
|
|
51
|
+
condition?: ConditionExpression;
|
|
52
|
+
}
|
|
53
|
+
//#endregion
|
|
54
|
+
//#region src/plugins/move/types.d.ts
|
|
55
|
+
interface MoveConfig {
|
|
56
|
+
from: string;
|
|
57
|
+
to: string;
|
|
58
|
+
condition?: ConditionExpression;
|
|
59
|
+
}
|
|
60
|
+
//#endregion
|
|
31
61
|
//#region src/plugins/regex-replace/types.d.ts
|
|
32
62
|
interface RegexReplaceConfig {
|
|
33
63
|
file: string;
|
|
@@ -54,18 +84,18 @@ interface ReplaceInFileConfig {
|
|
|
54
84
|
condition?: ConditionExpression;
|
|
55
85
|
}
|
|
56
86
|
//#endregion
|
|
57
|
-
//#region src/plugins/
|
|
58
|
-
interface
|
|
87
|
+
//#region src/plugins/update-json/types.d.ts
|
|
88
|
+
interface UpdateJsonConfig {
|
|
59
89
|
file: string;
|
|
60
|
-
|
|
61
|
-
templateFile?: string;
|
|
90
|
+
updates: Record<string, unknown>;
|
|
62
91
|
condition?: ConditionExpression;
|
|
63
92
|
}
|
|
64
93
|
//#endregion
|
|
65
|
-
//#region src/plugins/
|
|
66
|
-
interface
|
|
94
|
+
//#region src/plugins/write/types.d.ts
|
|
95
|
+
interface WriteConfig {
|
|
67
96
|
file: string;
|
|
68
|
-
|
|
97
|
+
template?: string;
|
|
98
|
+
templateFile?: string;
|
|
69
99
|
condition?: ConditionExpression;
|
|
70
100
|
}
|
|
71
101
|
//#endregion
|
|
@@ -174,7 +204,7 @@ interface VariableDefinition {
|
|
|
174
204
|
* @example "packageManager === 'pnpm'"
|
|
175
205
|
*/
|
|
176
206
|
type ConditionExpression = string;
|
|
177
|
-
type TaskType = 'update-json' | '
|
|
207
|
+
type TaskType = 'update-json' | 'write' | 'create' | 'regex-replace' | 'replace-in-file' | 'delete' | 'rename' | 'git-init' | 'exec' | 'move' | 'copy' | 'append' | 'mkdir';
|
|
178
208
|
interface RollbackConfig {
|
|
179
209
|
type: TaskType;
|
|
180
210
|
config: unknown;
|
|
@@ -192,7 +222,7 @@ interface TaskDefinition {
|
|
|
192
222
|
required?: boolean;
|
|
193
223
|
enabled?: EnabledValue;
|
|
194
224
|
type: TaskType;
|
|
195
|
-
config: UpdateJsonConfig |
|
|
225
|
+
config: UpdateJsonConfig | WriteConfig | CreateConfig | RegexReplaceConfig | ReplaceInFileConfig | DeleteConfig | RenameConfig | GitInitConfig | ExecConfig | MoveConfig | CopyConfig | AppendConfig | MkdirConfig | Record<string, unknown>;
|
|
196
226
|
dependencies?: string[];
|
|
197
227
|
rollback?: RollbackConfig;
|
|
198
228
|
prompts?: PromptDefinition[];
|
|
@@ -242,9 +272,13 @@ interface PluginHooks {
|
|
|
242
272
|
*/
|
|
243
273
|
declare function getUpdateJsonDiff(config: UpdateJsonConfig, initConfig: InitConfig): Promise<string>;
|
|
244
274
|
/**
|
|
245
|
-
* Get diff for
|
|
275
|
+
* Get diff for write task
|
|
276
|
+
*/
|
|
277
|
+
declare function getWriteDiff(config: WriteConfig, initConfig: InitConfig): Promise<string>;
|
|
278
|
+
/**
|
|
279
|
+
* Get diff for create task
|
|
246
280
|
*/
|
|
247
|
-
declare function
|
|
281
|
+
declare function getCreateDiff(config: CreateConfig, initConfig: InitConfig, task?: TaskDefinition): Promise<string>;
|
|
248
282
|
/**
|
|
249
283
|
* Get diff for regex-replace task
|
|
250
284
|
*/
|
|
@@ -476,6 +510,72 @@ declare function loadTasksWithInheritance(tasksFilePath: string): Promise<{
|
|
|
476
510
|
prompts?: PromptDefinition[];
|
|
477
511
|
}>;
|
|
478
512
|
//#endregion
|
|
513
|
+
//#region src/template-utils.d.ts
|
|
514
|
+
/**
|
|
515
|
+
* Configuration for template/templateFile properties
|
|
516
|
+
*/
|
|
517
|
+
interface TemplateSource {
|
|
518
|
+
template?: string;
|
|
519
|
+
templateFile?: string;
|
|
520
|
+
}
|
|
521
|
+
/**
|
|
522
|
+
* Result of template validation
|
|
523
|
+
*/
|
|
524
|
+
interface TemplateValidationResult {
|
|
525
|
+
isValid: boolean;
|
|
526
|
+
hasInlineTemplate: boolean;
|
|
527
|
+
hasTemplateFile: boolean;
|
|
528
|
+
error?: string;
|
|
529
|
+
}
|
|
530
|
+
/**
|
|
531
|
+
* Options for processing templates
|
|
532
|
+
*/
|
|
533
|
+
interface ProcessTemplateOptions {
|
|
534
|
+
/** Enable Handlebars compilation for .hbs files */
|
|
535
|
+
enableHandlebars?: boolean;
|
|
536
|
+
/** Source URL for resolving relative template paths */
|
|
537
|
+
sourceUrl?: string;
|
|
538
|
+
}
|
|
539
|
+
/**
|
|
540
|
+
* Check if a config has an inline template
|
|
541
|
+
* @param config - Configuration object with potential template property
|
|
542
|
+
* @returns True if inline template is present and non-empty
|
|
543
|
+
*/
|
|
544
|
+
declare function hasInlineTemplate(config: TemplateSource): boolean;
|
|
545
|
+
/**
|
|
546
|
+
* Check if a config has a template file reference
|
|
547
|
+
* @param config - Configuration object with potential templateFile property
|
|
548
|
+
* @returns True if templateFile is present and non-empty
|
|
549
|
+
*/
|
|
550
|
+
declare function hasTemplateFile(config: TemplateSource): boolean;
|
|
551
|
+
/**
|
|
552
|
+
* Check if a template file should be processed with Handlebars
|
|
553
|
+
* @param templateFile - Path to the template file
|
|
554
|
+
* @returns True if the file has .hbs extension
|
|
555
|
+
*/
|
|
556
|
+
declare function shouldUseHandlebars(templateFile: string): boolean;
|
|
557
|
+
/**
|
|
558
|
+
* Validate template configuration
|
|
559
|
+
* @param config - Configuration object to validate
|
|
560
|
+
* @returns Validation result with details
|
|
561
|
+
*/
|
|
562
|
+
declare function validateTemplateConfig(config: TemplateSource): TemplateValidationResult;
|
|
563
|
+
/**
|
|
564
|
+
* Process a template and return the rendered content
|
|
565
|
+
* @param config - Template configuration
|
|
566
|
+
* @param initConfig - Initialization config with variable values
|
|
567
|
+
* @param task - Optional task definition for $sourceUrl resolution
|
|
568
|
+
* @param options - Processing options
|
|
569
|
+
* @returns Processed template content
|
|
570
|
+
*/
|
|
571
|
+
declare function processTemplate(config: TemplateSource, initConfig: InitConfig, task?: TaskDefinition, options?: ProcessTemplateOptions): Promise<string>;
|
|
572
|
+
/**
|
|
573
|
+
* Get a description of the template source for display purposes
|
|
574
|
+
* @param config - Template configuration
|
|
575
|
+
* @returns Human-readable description of the template source
|
|
576
|
+
*/
|
|
577
|
+
declare function getTemplateSourceDescription(config: TemplateSource): string;
|
|
578
|
+
//#endregion
|
|
479
579
|
//#region src/utils.d.ts
|
|
480
580
|
/**
|
|
481
581
|
* Get Git repository information from the current directory
|
|
@@ -580,4 +680,4 @@ declare function runWithTasks(customTasks: TaskDefinition[], options?: {
|
|
|
580
680
|
globalPrompts?: PromptDefinition[] | undefined;
|
|
581
681
|
}): Promise<void>;
|
|
582
682
|
//#endregion
|
|
583
|
-
export { BasePrompt, ConditionExpression, ConditionalDefaultConfig, ConditionalEnabled, ConfirmPrompt, type CreateConfig, DefaultValue, DefaultValueConfig, DefaultValueType, type DeleteConfig, EnabledValue, type ExecConfig, type GitInitConfig, InitConfig, InputPrompt, MergeStrategy, NumberPrompt, PluginHooks, PromptDefinition, PromptType, type RegexReplaceConfig, type RenameConfig, type ReplaceInFileConfig, RollbackConfig, SelectPrompt, TaskDefinition, TaskPlugin, TaskType, TasksConfiguration, type
|
|
683
|
+
export { type AppendConfig, BasePrompt, ConditionExpression, ConditionalDefaultConfig, ConditionalEnabled, ConfirmPrompt, type CopyConfig, type CreateConfig, DefaultValue, DefaultValueConfig, DefaultValueType, type DeleteConfig, EnabledValue, type ExecConfig, type GitInitConfig, InitConfig, InputPrompt, MergeStrategy, type MkdirConfig, type MoveConfig, NumberPrompt, PluginHooks, PromptDefinition, PromptType, type RegexReplaceConfig, type RenameConfig, type ReplaceInFileConfig, RollbackConfig, SelectPrompt, TaskDefinition, TaskPlugin, TaskType, TasksConfiguration, type UpdateJsonConfig, VariableDefinition, type WriteConfig, callHook, clearPlugins, clearTemplateCache, collectPrompts, collectVariables, createPlugin, displayTasksDiff, evaluateCondition, executePluginTask, executeTask, getCreateDiff, getDeleteDiff, getExecDiff, getGitInitDiff, getGitRepoInfo, getPlugin, getPluginForTaskType, getPluginTaskDiff, getRegexReplaceDiff, getRenameDiff, getReplaceInFileDiff, getTaskDiff, getTemplateSourceDescription, getUpdateJsonDiff, getWriteDiff, hasInlineTemplate, hasTemplateFile, interpolateTemplate, isPluginTaskType, listPlugins, loadAndMergeTemplate, loadTasksWithInheritance, loadTemplate, log, main, mergeTemplates, processTemplate, prompt, promptYesNo, registerBuiltInPlugins, registerHooks, registerPlugin, resolveAllDefaultValues, resolveAllVariableValues, resolveDefaultValue, resolveVariableValue, runTask, runWithTasks, setNestedProperty, shouldUseHandlebars, topologicalSort, unregisterPlugin, validatePluginTask, validatePrompts, validateTemplateConfig, validateVariables };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
|
-
//#region src/plugins/
|
|
1
|
+
//#region src/plugins/append/types.d.ts
|
|
2
2
|
|
|
3
|
+
interface AppendConfig {
|
|
4
|
+
file: string;
|
|
5
|
+
content?: string;
|
|
6
|
+
template?: string;
|
|
7
|
+
templateFile?: string;
|
|
8
|
+
newline?: boolean;
|
|
9
|
+
condition?: ConditionExpression;
|
|
10
|
+
}
|
|
11
|
+
//#endregion
|
|
12
|
+
//#region src/plugins/copy/types.d.ts
|
|
13
|
+
interface CopyConfig {
|
|
14
|
+
from: string;
|
|
15
|
+
to: string;
|
|
16
|
+
condition?: ConditionExpression;
|
|
17
|
+
}
|
|
18
|
+
//#endregion
|
|
19
|
+
//#region src/plugins/create/types.d.ts
|
|
3
20
|
interface CreateConfig {
|
|
4
21
|
file: string;
|
|
5
22
|
template?: string;
|
|
@@ -28,6 +45,19 @@ interface GitInitConfig {
|
|
|
28
45
|
condition?: ConditionExpression;
|
|
29
46
|
}
|
|
30
47
|
//#endregion
|
|
48
|
+
//#region src/plugins/mkdir/types.d.ts
|
|
49
|
+
interface MkdirConfig {
|
|
50
|
+
path: string;
|
|
51
|
+
condition?: ConditionExpression;
|
|
52
|
+
}
|
|
53
|
+
//#endregion
|
|
54
|
+
//#region src/plugins/move/types.d.ts
|
|
55
|
+
interface MoveConfig {
|
|
56
|
+
from: string;
|
|
57
|
+
to: string;
|
|
58
|
+
condition?: ConditionExpression;
|
|
59
|
+
}
|
|
60
|
+
//#endregion
|
|
31
61
|
//#region src/plugins/regex-replace/types.d.ts
|
|
32
62
|
interface RegexReplaceConfig {
|
|
33
63
|
file: string;
|
|
@@ -54,18 +84,18 @@ interface ReplaceInFileConfig {
|
|
|
54
84
|
condition?: ConditionExpression;
|
|
55
85
|
}
|
|
56
86
|
//#endregion
|
|
57
|
-
//#region src/plugins/
|
|
58
|
-
interface
|
|
87
|
+
//#region src/plugins/update-json/types.d.ts
|
|
88
|
+
interface UpdateJsonConfig {
|
|
59
89
|
file: string;
|
|
60
|
-
|
|
61
|
-
templateFile?: string;
|
|
90
|
+
updates: Record<string, unknown>;
|
|
62
91
|
condition?: ConditionExpression;
|
|
63
92
|
}
|
|
64
93
|
//#endregion
|
|
65
|
-
//#region src/plugins/
|
|
66
|
-
interface
|
|
94
|
+
//#region src/plugins/write/types.d.ts
|
|
95
|
+
interface WriteConfig {
|
|
67
96
|
file: string;
|
|
68
|
-
|
|
97
|
+
template?: string;
|
|
98
|
+
templateFile?: string;
|
|
69
99
|
condition?: ConditionExpression;
|
|
70
100
|
}
|
|
71
101
|
//#endregion
|
|
@@ -174,7 +204,7 @@ interface VariableDefinition {
|
|
|
174
204
|
* @example "packageManager === 'pnpm'"
|
|
175
205
|
*/
|
|
176
206
|
type ConditionExpression = string;
|
|
177
|
-
type TaskType = 'update-json' | '
|
|
207
|
+
type TaskType = 'update-json' | 'write' | 'create' | 'regex-replace' | 'replace-in-file' | 'delete' | 'rename' | 'git-init' | 'exec' | 'move' | 'copy' | 'append' | 'mkdir';
|
|
178
208
|
interface RollbackConfig {
|
|
179
209
|
type: TaskType;
|
|
180
210
|
config: unknown;
|
|
@@ -192,7 +222,7 @@ interface TaskDefinition {
|
|
|
192
222
|
required?: boolean;
|
|
193
223
|
enabled?: EnabledValue;
|
|
194
224
|
type: TaskType;
|
|
195
|
-
config: UpdateJsonConfig |
|
|
225
|
+
config: UpdateJsonConfig | WriteConfig | CreateConfig | RegexReplaceConfig | ReplaceInFileConfig | DeleteConfig | RenameConfig | GitInitConfig | ExecConfig | MoveConfig | CopyConfig | AppendConfig | MkdirConfig | Record<string, unknown>;
|
|
196
226
|
dependencies?: string[];
|
|
197
227
|
rollback?: RollbackConfig;
|
|
198
228
|
prompts?: PromptDefinition[];
|
|
@@ -242,9 +272,13 @@ interface PluginHooks {
|
|
|
242
272
|
*/
|
|
243
273
|
declare function getUpdateJsonDiff(config: UpdateJsonConfig, initConfig: InitConfig): Promise<string>;
|
|
244
274
|
/**
|
|
245
|
-
* Get diff for
|
|
275
|
+
* Get diff for write task
|
|
276
|
+
*/
|
|
277
|
+
declare function getWriteDiff(config: WriteConfig, initConfig: InitConfig): Promise<string>;
|
|
278
|
+
/**
|
|
279
|
+
* Get diff for create task
|
|
246
280
|
*/
|
|
247
|
-
declare function
|
|
281
|
+
declare function getCreateDiff(config: CreateConfig, initConfig: InitConfig, task?: TaskDefinition): Promise<string>;
|
|
248
282
|
/**
|
|
249
283
|
* Get diff for regex-replace task
|
|
250
284
|
*/
|
|
@@ -476,6 +510,72 @@ declare function loadTasksWithInheritance(tasksFilePath: string): Promise<{
|
|
|
476
510
|
prompts?: PromptDefinition[];
|
|
477
511
|
}>;
|
|
478
512
|
//#endregion
|
|
513
|
+
//#region src/template-utils.d.ts
|
|
514
|
+
/**
|
|
515
|
+
* Configuration for template/templateFile properties
|
|
516
|
+
*/
|
|
517
|
+
interface TemplateSource {
|
|
518
|
+
template?: string;
|
|
519
|
+
templateFile?: string;
|
|
520
|
+
}
|
|
521
|
+
/**
|
|
522
|
+
* Result of template validation
|
|
523
|
+
*/
|
|
524
|
+
interface TemplateValidationResult {
|
|
525
|
+
isValid: boolean;
|
|
526
|
+
hasInlineTemplate: boolean;
|
|
527
|
+
hasTemplateFile: boolean;
|
|
528
|
+
error?: string;
|
|
529
|
+
}
|
|
530
|
+
/**
|
|
531
|
+
* Options for processing templates
|
|
532
|
+
*/
|
|
533
|
+
interface ProcessTemplateOptions {
|
|
534
|
+
/** Enable Handlebars compilation for .hbs files */
|
|
535
|
+
enableHandlebars?: boolean;
|
|
536
|
+
/** Source URL for resolving relative template paths */
|
|
537
|
+
sourceUrl?: string;
|
|
538
|
+
}
|
|
539
|
+
/**
|
|
540
|
+
* Check if a config has an inline template
|
|
541
|
+
* @param config - Configuration object with potential template property
|
|
542
|
+
* @returns True if inline template is present and non-empty
|
|
543
|
+
*/
|
|
544
|
+
declare function hasInlineTemplate(config: TemplateSource): boolean;
|
|
545
|
+
/**
|
|
546
|
+
* Check if a config has a template file reference
|
|
547
|
+
* @param config - Configuration object with potential templateFile property
|
|
548
|
+
* @returns True if templateFile is present and non-empty
|
|
549
|
+
*/
|
|
550
|
+
declare function hasTemplateFile(config: TemplateSource): boolean;
|
|
551
|
+
/**
|
|
552
|
+
* Check if a template file should be processed with Handlebars
|
|
553
|
+
* @param templateFile - Path to the template file
|
|
554
|
+
* @returns True if the file has .hbs extension
|
|
555
|
+
*/
|
|
556
|
+
declare function shouldUseHandlebars(templateFile: string): boolean;
|
|
557
|
+
/**
|
|
558
|
+
* Validate template configuration
|
|
559
|
+
* @param config - Configuration object to validate
|
|
560
|
+
* @returns Validation result with details
|
|
561
|
+
*/
|
|
562
|
+
declare function validateTemplateConfig(config: TemplateSource): TemplateValidationResult;
|
|
563
|
+
/**
|
|
564
|
+
* Process a template and return the rendered content
|
|
565
|
+
* @param config - Template configuration
|
|
566
|
+
* @param initConfig - Initialization config with variable values
|
|
567
|
+
* @param task - Optional task definition for $sourceUrl resolution
|
|
568
|
+
* @param options - Processing options
|
|
569
|
+
* @returns Processed template content
|
|
570
|
+
*/
|
|
571
|
+
declare function processTemplate(config: TemplateSource, initConfig: InitConfig, task?: TaskDefinition, options?: ProcessTemplateOptions): Promise<string>;
|
|
572
|
+
/**
|
|
573
|
+
* Get a description of the template source for display purposes
|
|
574
|
+
* @param config - Template configuration
|
|
575
|
+
* @returns Human-readable description of the template source
|
|
576
|
+
*/
|
|
577
|
+
declare function getTemplateSourceDescription(config: TemplateSource): string;
|
|
578
|
+
//#endregion
|
|
479
579
|
//#region src/utils.d.ts
|
|
480
580
|
/**
|
|
481
581
|
* Get Git repository information from the current directory
|
|
@@ -580,4 +680,4 @@ declare function runWithTasks(customTasks: TaskDefinition[], options?: {
|
|
|
580
680
|
globalPrompts?: PromptDefinition[] | undefined;
|
|
581
681
|
}): Promise<void>;
|
|
582
682
|
//#endregion
|
|
583
|
-
export { BasePrompt, ConditionExpression, ConditionalDefaultConfig, ConditionalEnabled, ConfirmPrompt, type CreateConfig, DefaultValue, DefaultValueConfig, DefaultValueType, type DeleteConfig, EnabledValue, type ExecConfig, type GitInitConfig, InitConfig, InputPrompt, MergeStrategy, NumberPrompt, PluginHooks, PromptDefinition, PromptType, type RegexReplaceConfig, type RenameConfig, type ReplaceInFileConfig, RollbackConfig, SelectPrompt, TaskDefinition, TaskPlugin, TaskType, TasksConfiguration, type
|
|
683
|
+
export { type AppendConfig, BasePrompt, ConditionExpression, ConditionalDefaultConfig, ConditionalEnabled, ConfirmPrompt, type CopyConfig, type CreateConfig, DefaultValue, DefaultValueConfig, DefaultValueType, type DeleteConfig, EnabledValue, type ExecConfig, type GitInitConfig, InitConfig, InputPrompt, MergeStrategy, type MkdirConfig, type MoveConfig, NumberPrompt, PluginHooks, PromptDefinition, PromptType, type RegexReplaceConfig, type RenameConfig, type ReplaceInFileConfig, RollbackConfig, SelectPrompt, TaskDefinition, TaskPlugin, TaskType, TasksConfiguration, type UpdateJsonConfig, VariableDefinition, type WriteConfig, callHook, clearPlugins, clearTemplateCache, collectPrompts, collectVariables, createPlugin, displayTasksDiff, evaluateCondition, executePluginTask, executeTask, getCreateDiff, getDeleteDiff, getExecDiff, getGitInitDiff, getGitRepoInfo, getPlugin, getPluginForTaskType, getPluginTaskDiff, getRegexReplaceDiff, getRenameDiff, getReplaceInFileDiff, getTaskDiff, getTemplateSourceDescription, getUpdateJsonDiff, getWriteDiff, hasInlineTemplate, hasTemplateFile, interpolateTemplate, isPluginTaskType, listPlugins, loadAndMergeTemplate, loadTasksWithInheritance, loadTemplate, log, main, mergeTemplates, processTemplate, prompt, promptYesNo, registerBuiltInPlugins, registerHooks, registerPlugin, resolveAllDefaultValues, resolveAllVariableValues, resolveDefaultValue, resolveVariableValue, runTask, runWithTasks, setNestedProperty, shouldUseHandlebars, topologicalSort, unregisterPlugin, validatePluginTask, validatePrompts, validateTemplateConfig, validateVariables };
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{A as e,B as t,C as n,D as r,E as i,F as a,
|
|
1
|
+
import{A as e,B as t,C as n,D as r,E as i,F as a,G as o,H as s,I as c,J as l,K as u,L as d,M as f,N as p,O as m,P as h,R as g,S as _,T as v,U as y,V as b,W as x,Y as S,_ as C,a as w,b as T,c as E,d as D,f as O,g as k,h as A,i as j,j as M,k as N,l as P,m as F,n as I,o as L,p as R,q as z,r as B,s as V,t as H,u as U,v as W,w as G,x as K,y as q,z as J}from"./src-1xh0Jxuk.js";import{a as Y,i as X,n as Z,o as Q,r as $,s as ee,t as te}from"./utils-CGdE7wLi.js";export{A as callHook,k as clearPlugins,o as clearTemplateCache,R as collectPrompts,L as collectVariables,C as createPlugin,m as displayTasksDiff,te as evaluateCondition,W as executePluginTask,E as executeTask,N as getCreateDiff,e as getDeleteDiff,M as getExecDiff,f as getGitInitDiff,Z as getGitRepoInfo,q as getPlugin,T as getPluginForTaskType,K as getPluginTaskDiff,p as getRegexReplaceDiff,h as getRenameDiff,a as getReplaceInFileDiff,c as getTaskDiff,J as getTemplateSourceDescription,d as getUpdateJsonDiff,g as getWriteDiff,t as hasInlineTemplate,b as hasTemplateFile,$ as interpolateTemplate,_ as isPluginTaskType,n as listPlugins,u as loadAndMergeTemplate,z as loadTasksWithInheritance,l as loadTemplate,X as log,H as main,S as mergeTemplates,s as processTemplate,Y as prompt,Q as promptYesNo,P as registerBuiltInPlugins,G as registerHooks,v as registerPlugin,O as resolveAllDefaultValues,j as resolveAllVariableValues,F as resolveDefaultValue,w as resolveVariableValue,U as runTask,I as runWithTasks,ee as setNestedProperty,y as shouldUseHandlebars,V as topologicalSort,i as unregisterPlugin,r as validatePluginTask,D as validatePrompts,x as validateTemplateConfig,B as validateVariables};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import{c as e,d as t,f as n,h as r,i,l as a,m as o,p as s,r as c,s as l,t as u,u as d}from"./utils-CGdE7wLi.js";import f from"node:path";import p from"node:fs";import m from"node:process";import{promisify as h}from"node:util";import{execSync as g}from"node:child_process";import{confirm as _,input as v,number as y,password as ee,select as te}from"@inquirer/prompts";function ne(){return{}}var b=class e extends r{constructor(e,t,n,r){super(e,`DUPLICATE_ID`),this.id=t,this.type=n,this.existingType=r,this.name=`DuplicateIdError`}static forId(t,n,r){return new e(`Duplicate ID "${t}" found in ${n}. This ID is already used in ${r??`unknown`}`,t,n,r)}},x=class e extends r{constructor(e,t,n,r,i){super(e,`ID_CONFLICT`),this.id=t,this.type=n,this.baseSource=r,this.overrideSource=i,this.name=`IdConflictError`}static forTask(t,n,r){return new e(`Task ID conflict: "${t}" is defined in multiple templates.\n Base task from: ${n??`unknown`}\n Override task from: ${r??`unknown`}\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the task.\n Task is being extended/overridden but no override strategy was specified.`,t,`task`,n,r)}static forVariable(t){return new e(`Variable ID conflict: "${t}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the variable.\n Variable is being extended/overridden but no override strategy was specified.`,t,`variable`)}static forPrompt(t){return new e(`Prompt ID conflict: "${t}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the prompt.\n Prompt is being extended/overridden but no override strategy was specified.`,t,`prompt`)}},re=class e extends r{constructor(e,t){super(e,`TASK_NOT_FOUND`),this.taskId=t,this.name=`TaskNotFoundError`}static forId(t){return new e(`Task not found: ${t}`,t)}},S=class e extends r{constructor(e,t,n){super(e,`PROMPT_VALIDATION_ERROR`),this.promptId=t,this.reason=n,this.name=`PromptValidationError`}static required(t){return new e(`Prompt "${t}" is required`,t,`required`)}static unknownType(t){return new e(`Unknown prompt type: ${t}`,t,`unknown_type`)}},C=class e extends r{constructor(e,t,n){super(e,`PLUGIN_CONFIGURATION_ERROR`),this.pluginType=t,this.configIssue=n,this.name=`PluginConfigurationError`}static templateMissingTemplateOrFile(){return new e(`Template task requires either "template" (inline) or "templateFile" (file path) to be specified`,`template`,`missing_template_or_file`)}static templateHasBothTemplateAndFile(){return new e(`Template task cannot have both "template" and "templateFile" specified. Use one or the other.`,`template`,`both_template_and_file`)}static createMissingTemplateOrFile(){return new e(`Create task requires either "template" (inline) or "templateFile" (file path) to be specified`,`create`,`missing_template_or_file`)}static createHasBothTemplateAndFile(){return new e(`Create task cannot have both "template" and "templateFile" specified. Use one or the other.`,`create`,`both_template_and_file`)}};const w=h(p.readFile),T={template:[[`template`,`templateFile`]]};function E(e){if(e==null||e===``)return`current template`;if(D(e))return e;let t=m.cwd();return e.startsWith(t)?f.relative(t,e):e}function D(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function ie(e,t){if(D(e))return e;if(t==null||t===``)return f.isAbsolute(e)?e:f.resolve(m.cwd(),e);if(D(t))try{let n=new URL(`.`,t);return new URL(e,n).href}catch{throw s.forRemoteTemplate(e,t)}let n=f.dirname(t);return f.isAbsolute(e)?e:f.resolve(n,e)}async function ae(e){if(D(e))return O(e);if(!p.existsSync(e))throw t.forPath(e);return w(e,`utf-8`)}async function O(e){try{let t=await fetch(e);if(!t.ok)throw d.forUrl(e,t.status,t.statusText);return await t.text()}catch(t){throw t instanceof Error&&t.message.includes(`Failed to fetch`)?t:d.forUrl(e,t instanceof Error?t:void 0)}}const k=new Map;async function oe(e,r=new Set){let i=D(e),s;if(s=i||f.isAbsolute(e)?e:f.resolve(m.cwd(),e),k.has(s))return k.get(s);if(r.has(s))throw o.forTemplateInheritance(r,s);r.add(s);let c;if(i)c=await O(s);else{if(!p.existsSync(s))throw t.forPath(s);c=await w(s,`utf-8`)}let l;try{l=JSON.parse(c)}catch(e){throw n.forFile(s,e instanceof Error?e:Error(String(e)))}if(l.name==null||l.name.trim()===``)throw a.missingName(s);if(!/^[a-z\d]+(?:-[a-z\d]+)*$/u.test(l.name))throw a.invalidNameFormat(s,l.name);if(l.tasks!==void 0&&!Array.isArray(l.tasks))throw a.tasksNotArray(s);l.tasks===void 0&&(l.tasks=[]);for(let e of l.tasks)e.$sourceUrl=s;return k.set(s,l),l}async function A(e,t,n=new Set){let r=D(e),i;if(i=r||f.isAbsolute(e)?e:t==null?f.resolve(m.cwd(),e):D(t)?new URL(e,t).href:f.resolve(t,e),n.has(i))throw o.forTemplateInheritance(n,i);n.add(i);let a=await oe(i);if(a.extends==null||a.extends===``)return a;let s=D(i)?new URL(`.`,i).href:f.dirname(i),c=Array.isArray(a.extends)?a.extends:[a.extends],l=[];for(let e of c){let t=await A(e,s,n);l.push(t)}return ue([...l,a])}function se(e,t,n){let r=new Map;for(let t of e){if(r.has(t.id))throw b.forId(t.id,`task`,r.get(t.id));r.set(t.id,`task`)}if(t!=null)for(let e of t){if(r.has(e.id))throw b.forId(e.id,`variable`,r.get(e.id));r.set(e.id,`variable`)}if(n!=null)for(let e of n){if(r.has(e.id))throw b.forId(e.id,`prompt`,r.get(e.id));r.set(e.id,`prompt`)}}function ce(e,t){if((t.override??`merge`)===`replace`){i(` → Variable "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}i(` → Variable "${t.id}" merged (value replaced)`,`info`);let n={...e,...t};return delete n.override,n}function le(e,t){if((t.override??`merge`)===`replace`){i(` → Prompt "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}i(` → Prompt "${t.id}" merged`,`info`);let n={...e,...t};return delete n.override,n}function ue(e){if(e.length===0)return{name:`Empty Template`,tasks:[]};if(e.length===1){let t=e[0];return se(t.tasks??[],t.variables,t.prompts),t}let t=new Map,n=new Map,r=new Map;for(let i of e){if(i.prompts!=null)for(let e of i.prompts)if(r.has(e.id)){if(e.override==null)throw x.forPrompt(e.id);let t=r.get(e.id);r.set(e.id,le(t,e))}else r.set(e.id,{...e});if(i.variables!=null)for(let e of i.variables)if(n.has(e.id)){if(e.override==null)throw x.forVariable(e.id);let t=n.get(e.id);n.set(e.id,ce(t,e))}else n.set(e.id,{...e});for(let e of i.tasks??[])if(t.has(e.id)){if(e.override==null){let n=t.get(e.id);throw x.forTask(e.id,E(n.$sourceUrl),E(e.$sourceUrl))}let n=t.get(e.id);t.set(e.id,pe(n,e))}else t.set(e.id,{...e})}let i=Array.from(t.values()),a=r.size>0?Array.from(r.values()):void 0,o=n.size>0?Array.from(n.values()):void 0;se(i,o,a);let s=e[e.length-1],c={name:s.name,tasks:i};return s.description!=null&&(c.description=s.description),s.dependencies!=null&&(c.dependencies=s.dependencies),a!=null&&(c.prompts=a),o!=null&&(c.variables=o),c}function de(e,t){let n=T[e];if(!n)return null;for(let e of n){let n=e.filter(e=>e in t&&t[e]!=null);if(n.length>1)return n}return null}function fe(e,t,n){let r={...e},i=T[n]??[];for(let[e,n]of Object.entries(t)){for(let t of i)if(t.includes(e)){for(let n of t)n!==e&&delete r[n];break}r[e]=n}return r}function pe(e,t){if((t.override??`merge`)===`replace`){i(` → Task "${t.id}" using 'replace' strategy - completely replacing base task`,`info`),i(` Base: ${E(e.$sourceUrl)}`,`info`),i(` Override: ${E(t.$sourceUrl)}`,`info`);let{override:n,...r}=t;return r}i(` → Merging task "${t.id}"`,`info`),i(` Base: ${E(e.$sourceUrl)}`,`info`),i(` Override: ${E(t.$sourceUrl)}`,`info`);let n;if(typeof e.config==`object`&&e.config!==null&&typeof t.config==`object`&&t.config!==null){n=fe(e.config,t.config,t.type);let r=de(t.type,n);r!==null&&r.length>0&&(i(` ⚠️ Warning: Conflicting config fields detected: ${r.join(`, `)}`,`warn`),i(` Please use override: "replace" or specify only one of these fields`,`warn`))}else n=t.config??e.config;let r=e.prompts?[...e.prompts]:void 0;if(t.prompts&&t.prompts.length>0)if(!r)r=[...t.prompts];else{let e=new Map(r.map(e=>[e.id,e]));for(let n of t.prompts)e.set(n.id,n);r=Array.from(e.values())}let a=e.variables?[...e.variables]:void 0;if(t.variables&&t.variables.length>0)if(!a)a=[...t.variables];else{let e=new Map(a.map(e=>[e.id,e]));for(let n of t.variables)e.set(n.id,n);a=Array.from(e.values())}let o=[...e.dependencies??[],...t.dependencies??[]],s=o.length>0?[...new Set(o)]:void 0,c=t.$sourceUrl??e.$sourceUrl,l={...e,...t,config:n,...r!=null&&{prompts:r},...a!=null&&{variables:a},...s!=null&&{dependencies:s},...c!=null&&{$sourceUrl:c}};return delete l.override,l}function me(){k.clear()}async function he(e){i(`Loading tasks from ${e}...`,`info`);let t=await A(e);i(`Loaded ${t.tasks?.length??0} task(s)`,`info`),t.extends!=null&&t.extends!==``&&i(`Extended from: ${(Array.isArray(t.extends)?t.extends:[t.extends]).join(`, `)}`,`info`),t.prompts!=null&&t.prompts.length>0&&i(`Found ${t.prompts.length} top-level prompt(s)`,`info`),t.variables!=null&&t.variables.length>0&&i(`Found ${t.variables.length} top-level variable(s)`,`info`);let n={tasks:t.tasks??[]};return t.prompts!=null&&(n.prompts=t.prompts),t.variables!=null&&(n.variables=t.variables),n}function j(e){return e.template!=null&&e.template!==``}function M(e){return e.templateFile!=null&&e.templateFile!==``}function N(e){return e.endsWith(`.hbs`)}function P(e){let t=j(e),n=M(e);return!t&&!n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration requires either "template" (inline) or "templateFile" (file path) to be specified`}:t&&n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration cannot have both "template" and "templateFile" specified. Use one or the other.`}:{isValid:!0,hasInlineTemplate:t,hasTemplateFile:n}}async function F(e,t,n,r={}){let{enableHandlebars:i=!0,sourceUrl:a=n?.$sourceUrl}=r,o=j(e),s=M(e);if(o)return c(e.template,t);if(s){let n=e.templateFile,r=i&&N(n),o=await ae(ie(n,a));return r?(await import(`handlebars`)).default.compile(o)(t):c(o,t)}throw Error(`No template content available`)}function I(e){return j(e)?`inline template`:M(e)?`template file: ${e.templateFile}`:`no template source`}const L=h(p.readFile),R={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function z(e,t){switch(t){case`add`:return`${R.green}+ ${e}${R.reset}`;case`remove`:return`${R.red}- ${e}${R.reset}`;case`context`:return`${R.gray} ${e}${R.reset}`;default:return e}}function B(e,t){let n=e.split(`
|
|
2
|
+
`),r=t.split(`
|
|
3
|
+
`),i=[],a=Math.max(n.length,r.length);for(let e=0;e<a;e++){let t=n[e],a=r[e];t===a?t!==void 0&&i.push(z(t,`context`)):(t!==void 0&&i.push(z(t,`remove`)),a!==void 0&&i.push(z(a,`add`)))}return i}async function V(e,t){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=f.join(m.cwd(),e.file);if(!p.existsSync(n))return`${R.red}✗ File not found: ${e.file}${R.reset}`;try{let r=await L(n,`utf-8`),i=JSON.parse(r),a={...i};function o(e){if(typeof e==`string`)return c(e,t);if(Array.isArray(e))return e.map(e=>o(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=o(r);return t}return e}for(let[t,n]of Object.entries(e.updates)){let e=o(n);t.includes(`.`)?l(i,t,e):i[t]=e}let s=JSON.stringify(a,null,2),u=JSON.stringify(i,null,2);if(s===u)return`${R.cyan}→ No changes${R.reset}`;let d=B(s,u);return`${R.blue}File: ${e.file}${R.reset}\n${d.join(`
|
|
4
|
+
`)}`}catch(e){return`${R.red}✗ Error: ${e instanceof Error?e.message:String(e)}${R.reset}`}}async function H(e,t){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;if(e.template==null||e.template===``)return`${R.red}✗ No template content provided for file: ${e.file}${R.reset}`;let n=f.join(m.cwd(),e.file),r=c(e.template,t);if(!p.existsSync(n)){let t=r.split(`
|
|
5
|
+
`).slice(0,10).join(`
|
|
6
|
+
`),n=r.split(`
|
|
7
|
+
`).length>10;return`${R.blue}File: ${e.file}${R.reset}\n${R.green}+ New file would be created${R.reset}\n${R.gray}Content preview:${R.reset}\n${t}${n?`
|
|
8
|
+
...`:``}`}try{let t=await L(n,`utf-8`);if(t===r)return`${R.cyan}→ No changes${R.reset}`;let i=B(t,r);return`${R.blue}File: ${e.file}${R.reset}\n${i.join(`
|
|
9
|
+
`)}`}catch(e){return`${R.red}✗ Error: ${e instanceof Error?e.message:String(e)}${R.reset}`}}async function ge(e,t,n){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let r=f.join(m.cwd(),e.file);if(p.existsSync(r))return`${R.cyan}→ File already exists, would be skipped: ${e.file}${R.reset}`;try{if(j(e)){let r=await F(e,t,n),i=r.split(`
|
|
10
|
+
`).slice(0,10).join(`
|
|
11
|
+
`),a=r.split(`
|
|
12
|
+
`).length>10;return`${R.blue}File: ${e.file}${R.reset}\n${R.green}+ New file would be created${R.reset}\n${R.gray}Content preview:${R.reset}\n${i}${a?`
|
|
13
|
+
...`:``}`}let r=I(e);return`${R.blue}File: ${e.file}${R.reset}\n${R.green}+ New file would be created from ${r}${R.reset}`}catch(e){return`${R.red}✗ Error: ${e instanceof Error?e.message:String(e)}${R.reset}`}}async function _e(e,t){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=f.join(m.cwd(),e.file);if(!p.existsSync(n))return`${R.red}✗ File not found: ${e.file}${R.reset}`;try{let r=await L(n,`utf-8`),i=new RegExp(e.pattern,e.flags??`g`),a=c(e.replacement,t),o=r.replace(i,a);if(r===o)return`${R.cyan}→ No matches found${R.reset}`;let s=B(r,o);return`${R.blue}File: ${e.file}${R.reset}\n${s.join(`
|
|
14
|
+
`)}`}catch(e){return`${R.red}✗ Error: ${e instanceof Error?e.message:String(e)}${R.reset}`}}async function ve(e,t){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=f.join(m.cwd(),e.file);if(!p.existsSync(n))return`${R.red}✗ File not found: ${e.file}${R.reset}`;try{let r=await L(n,`utf-8`),i=r;for(let{find:n,replace:i}of e.replacements){let e=c(n,t),a=c(i,t);r=r.replace(e,a)}if(i===r)return`${R.cyan}→ No changes${R.reset}`;let a=B(i,r);return`${R.blue}File: ${e.file}${R.reset}\n${a.join(`
|
|
15
|
+
`)}`}catch(e){return`${R.red}✗ Error: ${e instanceof Error?e.message:String(e)}${R.reset}`}}function ye(e,t){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=e.paths.map(e=>c(e,t)).filter(e=>p.existsSync(f.join(m.cwd(),e)));return n.length===0?`${R.cyan}→ No files/directories to delete${R.reset}`:`${R.red}Would delete:${R.reset}\n${n.map(e=>`${R.red} - ${e}${R.reset}`).join(`
|
|
16
|
+
`)}`}function be(e,t){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=c(e.from,t),r=c(e.to,t),i=f.join(m.cwd(),n),a=f.join(m.cwd(),r);return p.existsSync(i)?p.existsSync(a)?`${R.yellow}⚠ Destination already exists: ${r}${R.reset}\n${R.cyan}Would rename: ${n} → ${r}${R.reset}`:`${R.cyan}Would rename: ${n} → ${r}${R.reset}`:`${R.red}✗ Source not found: ${n}${R.reset}`}function xe(e){if(e.condition!=null&&e.condition!==``)return`${R.yellow}⊘ Condition check skipped in dry-run${R.reset}`;let t=f.join(m.cwd(),`.git`),n=p.existsSync(t),r=[];if(e.removeExisting&&n&&r.push(`${R.red}Would remove existing .git directory${R.reset}`),r.push(`${R.green}Would initialize git repository${R.reset}`),e.initialCommit){let t=e.message??`Initial commit`;r.push(`${R.green}Would create initial commit: "${t}"${R.reset}`)}return r.join(`
|
|
17
|
+
`)}function Se(e,t){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=c(e.command,t),r=e.cwd==null?m.cwd():c(e.cwd,t);return`${R.yellow}Would execute:${R.reset}\n${R.cyan} Command: ${n}${R.reset}\n${R.cyan} Working directory: ${r}${R.reset}`}function Ce(e,t){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=c(e.from,t),r=c(e.to,t),i=f.join(m.cwd(),n),a=f.join(m.cwd(),r);return p.existsSync(i)?p.existsSync(a)?`${R.yellow}⚠ Destination already exists: ${r}${R.reset}\n${R.cyan}Would move: ${n} → ${r}${R.reset}`:`${R.cyan}Would move: ${n} → ${r}${R.reset}`:`${R.red}✗ Source not found: ${n}${R.reset}`}function we(e,t){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=c(e.from,t),r=c(e.to,t),i=f.join(m.cwd(),n),a=f.join(m.cwd(),r);if(!p.existsSync(i))return`${R.red}✗ Source not found: ${n}${R.reset}`;let o=p.statSync(i).isDirectory()?`directory`:`file`;return p.existsSync(a)?`${R.yellow}⚠ Destination already exists: ${r}${R.reset}\n${R.cyan}Would copy ${o}: ${n} → ${r}${R.reset}`:`${R.cyan}Would copy ${o}: ${n} → ${r}${R.reset}`}async function Te(e,t,n){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let r=f.join(m.cwd(),e.file),i={};e.content==null?e.template!=null&&(i.template=e.template):i.template=e.content,e.templateFile!=null&&(i.templateFile=e.templateFile);try{let a=await F(i,t,n),o=a.split(`
|
|
18
|
+
`).slice(0,10).join(`
|
|
19
|
+
`),s=a.split(`
|
|
20
|
+
`).length>10;return p.existsSync(r)?`${R.blue}File: ${e.file}${R.reset}\n${R.green}+ Would append content${R.reset}\n${R.gray}Content preview:${R.reset}\n${o}${s?`
|
|
21
|
+
...`:``}`:`${R.blue}File: ${e.file}${R.reset}\n${R.green}+ New file would be created with content${R.reset}\n${R.gray}Content preview:${R.reset}\n${o}${s?`
|
|
22
|
+
...`:``}`}catch(e){return`${R.red}✗ Error: ${e instanceof Error?e.message:String(e)}${R.reset}`}}function Ee(e,t){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t))return`${R.yellow}⊘ Condition not met - task would be skipped${R.reset}`;let n=c(e.path,t),r=f.join(m.cwd(),n);return p.existsSync(r)?`${R.cyan}→ Directory already exists: ${n}${R.reset}`:`${R.green}+ Would create directory: ${n}${R.reset}`}async function De(e,t){try{switch(e.type){case`update-json`:return await V(e.config,t);case`write`:return await H(e.config,t);case`create`:return await ge(e.config,t,e);case`regex-replace`:return await _e(e.config,t);case`replace-in-file`:return await ve(e.config,t);case`delete`:return ye(e.config,t);case`rename`:return be(e.config,t);case`move`:return Ce(e.config,t);case`copy`:return we(e.config,t);case`append`:return await Te(e.config,t,e);case`mkdir`:return Ee(e.config,t);case`git-init`:return xe(e.config);case`exec`:return Se(e.config,t);default:{let t=e.type;return`${R.yellow}⚠ Diff not available for task type: ${t}${R.reset}`}}}catch(e){return`${R.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${R.reset}`}}async function Oe(e,t){console.log(`${R.blue}═══════════════════════════════════════════════════════${R.reset}`),console.log(`${R.blue} DRY RUN - Preview of changes${R.reset}`),console.log(`${R.blue}═══════════════════════════════════════════════════════${R.reset}`);for(let n of e){console.log(`${R.cyan}▶ Task: ${n.name}${R.reset}`),n.description!=null&&n.description!==``&&console.log(`${R.gray} ${n.description}${R.reset}`);let e=await De(n,t);console.log(e),console.log(`${R.gray}${`─`.repeat(55)}${R.reset}`)}console.log(`${R.blue}═══════════════════════════════════════════════════════${R.reset}`),console.log(`${R.yellow} No changes were applied (dry-run mode)${R.reset}`),console.log(`${R.blue}═══════════════════════════════════════════════════════${R.reset}`)}const U=new Map,W={},G=new Map;function K(e){if(e.name==null||e.name===``)throw TypeError(`Plugin name is required`);if(!Array.isArray(e.taskTypes)||e.taskTypes.length===0)throw TypeError(`Plugin ${e.name} must define at least one task type`);if(typeof e.execute!=`function`)throw TypeError(`Plugin ${e.name} must provide an execute function`);if(U.has(e.name))throw TypeError(`Plugin ${e.name} is already registered`);for(let t of e.taskTypes)if(G.has(t)){let e=G.get(t);throw TypeError(`Task type "${t}" is already registered by plugin "${e}"`)}U.set(e.name,e);for(let t of e.taskTypes)G.set(t,e.name);i(`✓ Registered plugin: ${e.name}${e.version==null?``:` v${e.version}`}`,`info`)}function ke(e){let t=U.get(e);if(t!=null){for(let e of t.taskTypes)G.delete(e);U.delete(e)}}function Ae(e){return U.get(e)}function q(e){let t=G.get(e);if(t!=null)return U.get(t)}function J(e){return G.has(e)}function je(){return Array.from(U.keys())}function Me(){U.clear(),G.clear()}function Ne(e){e.beforeAll!=null&&(W.beforeAll=e.beforeAll),e.afterAll!=null&&(W.afterAll=e.afterAll),e.beforeTask!=null&&(W.beforeTask=e.beforeTask),e.afterTask!=null&&(W.afterTask=e.afterTask),e.onError!=null&&(W.onError=e.onError)}async function Y(e,...t){let n=W[e];if(n!=null)try{e===`beforeAll`||e===`afterAll`?await n(t[0]):(e===`beforeTask`||e===`afterTask`||e===`onError`)&&await n(t[0],t[1])}catch(t){i(`Error in ${e} hook: ${t instanceof Error?t.message:String(t)}`,`error`)}}async function Pe(e,t,n){let r=q(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}async function Fe(e,t){let n=q(e.type);if(!(n==null||n.getDiff==null))return n.getDiff(e,t)}function Ie(e){let t=q(e.type);return t==null?[`No plugin found for task type: ${e.type}`]:t.validate==null?[]:t.validate(e)}function Le(e,t,n,r){return{name:e,...r?.version!=null&&{version:r.version},taskTypes:[t],execute:n,...r?.getDiff!=null&&{getDiff:r.getDiff},...r?.validate!=null&&{validate:r.validate}}}async function X(e,t,n){if(e===void 0)return;if(typeof e!=`object`||!e||Array.isArray(e))return typeof e==`string`&&n&&/\{\{\w+\}\}/u.test(e)?c(e,n):e;let r=e;if(r.type===`conditional`){if(!n)return;if(typeof r.condition!=`string`){i(`Prompt "${t}": conditional default must have a string condition`,`error`);return}try{let{evaluateCondition:e}=await import(`./utils-BzYLo3gR.js`),t=e(r.condition,n)?r.ifTrue:r.ifFalse;return typeof t==`string`&&/\{\{\w+\}\}/u.test(t)&&(t=c(t,n)),t}catch(e){i(`Prompt "${t}": failed to evaluate conditional default: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(r.type===`exec`){let e=r.value;if(typeof e!=`string`){i(`Prompt "${t}": exec default value must have a string command`,`error`);return}try{let t=g(e,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(t.startsWith(`{`)||t.startsWith(`[`))try{return JSON.parse(t)}catch{return t}if(/^-?\d+(?:\.\d+)?$/u.test(t)){let e=Number.parseFloat(t);if(!Number.isNaN(e))return e}return t===`true`||t===`false`?t===`true`:t}catch(e){i(`Prompt "${t}": failed to execute default value command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}else if(r.type===`static`)return r.value;else if(r.type!==void 0){i(`Prompt "${t}": unknown default value type "${r.type}". Expected "static", "exec", or "conditional".`,`error`);return}return e}async function Z(t,n=new Map,r={}){let a={};if(t.length===0)return a;for(let o of t){let t={...r,...a};if(e(o.enabled,t))try{let e,r=n.get(o.id);switch(o.default!==void 0&&(r=await X(o.default,o.id,t)),o.type){case`input`:{let t={message:o.message};if(r!==void 0&&(t.default=String(r)),o.required!==void 0&&(t.required=o.required),e=await v(t),o.required&&(e==null||typeof e==`string`&&e.trim()===``))throw i(`${o.message} is required`,`error`),S.required(o.id);break}case`password`:if(e=await ee({message:o.message,mask:`*`}),o.required&&(e==null||typeof e==`string`&&e.trim()===``))throw i(`${o.message} is required`,`error`),S.required(o.id);break;case`number`:{let t={message:o.message};if(r!==void 0&&(t.default=Number(r)),o.required!==void 0&&(t.required=o.required),o.min!==void 0&&(t.min=o.min),o.max!==void 0&&(t.max=o.max),e=await y(t),o.required&&e==null)throw i(`${o.message} is required`,`error`),S.required(o.id);break}case`select`:{let t={message:o.message,choices:o.choices.map(e=>({name:e.name,value:e.value}))};r!==void 0&&(t.default=r),e=await te(t);break}case`confirm`:{let t=r===void 0?!1:!!r;e=await _({message:o.message,default:t});break}default:throw i(`Unknown prompt type: ${o.type}`,`error`),S.unknownType(o.type)}a[o.id]=e}catch(e){throw e instanceof Error&&i(`Failed to collect prompt "${o.id}": ${e.message}`,`error`),e}}return a}async function Re(e){let t=new Map,n=e.map(async e=>{if(e.default!==void 0){let n=await X(e.default,e.id);n!==void 0&&t.set(e.id,n)}});return await Promise.all(n),t}function ze(e){let t=[],n=new Set;for(let r of e){if(n.has(r.id)&&t.push(`Duplicate prompt ID: ${r.id}`),n.add(r.id),/^[a-zA-Z_$][a-zA-Z0-9_$]*$/u.test(r.id)||t.push(`Invalid prompt ID "${r.id}": must be a valid JavaScript identifier (start with letter, underscore, or $, followed by letters, digits, underscores, or $)`),(!r.message||r.message.trim()===``)&&t.push(`Prompt "${r.id}" must have a non-empty message`),r.type===`select`){r.choices.length===0&&t.push(`Select prompt "${r.id}" must have at least one choice`);for(let e of r.choices)(!e.name||e.name.trim()===``)&&t.push(`Select prompt "${r.id}" has a choice with empty name`),e.value===void 0&&t.push(`Select prompt "${r.id}" has a choice with undefined value`)}r.type===`number`&&r.min!==void 0&&r.max!==void 0&&r.min>r.max&&t.push(`Number prompt "${r.id}" has min greater than max`)}return t}const Be=h(p.appendFile),Ve=h(p.readFile),He=h(p.stat);async function Ue(e,t,n){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t)){i(`Condition not met, skipping append task`,`info`);return}let r=f.join(m.cwd(),e.file),a={};e.content==null?e.template!=null&&(a.template=e.template):a.template=e.content,e.templateFile!=null&&(a.templateFile=e.templateFile);let o=P(a);if(!o.isValid)throw o.error?.includes(`cannot have both`)?C.templateHasBothTemplateAndFile():C.templateMissingTemplateOrFile();let s=await F(a,t,n),c=!1,l=!1;try{await He(r),c=!0;let t=await Ve(r,`utf-8`);t.length>0&&!t.endsWith(`
|
|
23
|
+
`)&&(l=e.newline!==!1)}catch{}c&&l?await Be(r,`\n${s}`):await Be(r,s),i(`Appended content to ${e.file}`,`success`)}const We={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await Ue(e.config,t,e)}},Ge=h(p.copyFile),Ke=h(p.stat),qe=h(p.mkdir),Je=h(p.readdir);async function Ye(e,t){await qe(t,{recursive:!0});let n=await Je(e,{withFileTypes:!0});await Promise.all(n.map(async n=>{let r=f.join(e,n.name),i=f.join(t,n.name);n.isDirectory()?await Ye(r,i):await Ge(r,i)}))}async function Xe(e,t){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t)){i(`Condition not met, skipping copy task`,`info`);return}let n=f.join(m.cwd(),e.from),r=f.join(m.cwd(),e.to),a;try{a=await Ke(n)}catch{i(`Source path does not exist: ${n}`,`warn`);return}await qe(f.dirname(r),{recursive:!0}),a.isDirectory()?(await Ye(n,r),i(`Copied directory ${e.from} to ${e.to}`,`success`)):(await Ge(n,r),i(`Copied file ${e.from} to ${e.to}`,`success`))}const Ze={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await Xe(e.config,t)}},Qe=h(p.writeFile);async function $e(e,t,n){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t)){i(`Condition not met, skipping create task`,`info`);return}let r=f.join(m.cwd(),e.file);if(p.existsSync(r)){i(`File already exists, skipping: ${e.file}`,`info`);return}let a=P(e);if(!a.isValid)throw a.error?.includes(`cannot have both`)?C.createHasBothTemplateAndFile():C.createMissingTemplateOrFile();let o=await F(e,t,n),s=f.dirname(r);p.existsSync(s)||p.mkdirSync(s,{recursive:!0}),await Qe(r,o),i(`Created file: ${e.file}`,`success`)}const et={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await $e(e.config,t,e)}};async function tt(e,t){let{paths:n,condition:r}=e;if(r!=null&&r!==``){if(!t){i(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!u(r,t)){i(`Condition not met, skipping deletion`,`info`);return}}for(let e of n){let t=f.join(m.cwd(),e);p.existsSync(t)&&p.rmSync(t,{recursive:!0,force:!0})}}const nt={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await tt(e.config,t)}};async function rt(e,t){if(e.condition!=null&&e.condition!==``){if(!t){i(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!u(e.condition,t)){i(`Condition not met, skipping exec task`,`info`);return}}let n=e.cwd==null?m.cwd():f.join(m.cwd(),e.cwd);g(e.command,{cwd:n,stdio:`inherit`})}const it={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await rt(e.config,t)}};async function at(e,t){if(e.condition!=null&&e.condition!==``){if(!t){i(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!u(e.condition,t)){i(`Condition not met, skipping git-init task`,`info`);return}}if(e.removeExisting){let e=f.join(m.cwd(),`.git`);p.existsSync(e)&&p.rmSync(e,{recursive:!0,force:!0})}if(g(`git init`,{stdio:`inherit`}),e.initialCommit){let t=e.message??`Initial commit`;g(`git add .`,{stdio:`inherit`}),g(`git commit -m "${t}"`,{stdio:`inherit`})}}const ot={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await at(e.config,t)}},st=h(p.mkdir);async function ct(e,t){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t)){i(`Condition not met, skipping mkdir task`,`info`);return}await st(f.join(m.cwd(),e.path),{recursive:!0}),i(`Created directory: ${e.path}`,`success`)}const lt={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await ct(e.config,t)}},ut=h(p.rename),dt=h(p.stat),ft=h(p.mkdir);async function pt(e,t){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t)){i(`Condition not met, skipping move task`,`info`);return}let n=f.join(m.cwd(),e.from),r=f.join(m.cwd(),e.to);try{await dt(n)}catch{i(`Source path does not exist: ${n}`,`warn`);return}await ft(f.dirname(r),{recursive:!0}),await ut(n,r),i(`Moved ${e.from} to ${e.to}`,`success`)}const mt={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await pt(e.config,t)}},ht=h(p.readFile),gt=h(p.writeFile);async function _t(e,t){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t)){i(`Condition not met, skipping regex-replace task`,`info`);return}let n=f.join(m.cwd(),e.file),{pattern:r}=e,a=e.flags??``,o=e.replacement||``,s=await ht(n,`utf-8`),l=new RegExp(r,a);s=s.replace(l,c(o,t)),await gt(n,s)}const vt={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await _t(e.config,t)}},yt=h(p.rename);async function bt(e,t){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t)){i(`Condition not met, skipping rename task`,`info`);return}let n=f.join(m.cwd(),c(e.from,t)),r=f.join(m.cwd(),c(e.to,t));if(!p.existsSync(n)){i(`Source path does not exist: ${n}`,`warn`);return}await yt(n,r)}const xt={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await bt(e.config,t)}},St=h(p.readFile),Ct=h(p.writeFile);async function wt(e,t){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t)){i(`Condition not met, skipping replace-in-file task`,`info`);return}let n=f.join(m.cwd(),e.file),{replacements:r}=e;if(!p.existsSync(n)){i(`File not found: ${n}, skipping`,`warn`);return}let a=await St(n,`utf-8`);for(let{find:e,replace:n}of r){let r=c(n,t);a=a.replace(new RegExp(e,`gu`),r)}await Ct(n,a)}const Tt={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await wt(e.config,t)}},Et=h(p.readFile),Dt=h(p.writeFile);async function Ot(e,t){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t)){i(`Condition not met, skipping update-json task`,`info`);return}let n=f.join(m.cwd(),e.file),{updates:r}=e,a=await Et(n,`utf-8`),o=JSON.parse(a);function s(e){if(typeof e==`string`)return c(e,t);if(Array.isArray(e))return e.map(e=>s(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=s(r);return t}return e}for(let[e,t]of Object.entries(r)){let n=s(t);e.includes(`.`)?l(o,e,n):o[e]=n}await Dt(n,`${JSON.stringify(o,null,2)}\n`)}const kt={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await Ot(e.config,t)}},At=h(p.writeFile);async function jt(e,t,n){if(e.condition!=null&&e.condition!==``&&!u(e.condition,t)){i(`Condition not met, skipping write task`,`info`);return}let r=f.join(m.cwd(),e.file),a=P(e);if(!a.isValid)throw a.error?.includes(`cannot have both`)?C.templateHasBothTemplateAndFile():C.templateMissingTemplateOrFile();await At(r,await F(e,t,n))}const Mt={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await jt(e.config,t,e)}};function Q(){J(`update-json`)||(K(kt),K(Mt),K(et),K(vt),K(Tt),K(nt),K(xt),K(ot),K(it),K(mt),K(Ze),K(We),K(lt))}async function Nt(e,t,n=!1){if(Q(),n){i(`[DRY RUN] Would execute: ${e.name}`,`info`);return}if(J(e.type)){await Pe(e,t,{dryRun:n});return}throw TypeError(`Unknown task type: ${e.type}`)}async function $(e,t,n,r,a=!1){try{return i(`[${n}/${r}] Running: ${e.name}...`,`info`),await Nt(e,t,a),i(`✓ ${e.name}`,`success`),!0}catch(t){return i(`✗ Failed: ${e.name}`,`error`),t instanceof Error&&(i(` Reason: ${t.message}`,`error`),t.stack!=null&&m.env.DEBUG!=null&&console.error(t.stack)),(e.required??!0)&&i(` This is a required task. Initialization cannot continue.`,`error`),!1}}function Pt(e){let t=[],n=new Set,r=new Set,i=new Map(e.map(e=>[e.id,e]));function a(e){if(n.has(e))return;if(r.has(e))throw o.forTaskDependency(e);r.add(e);let s=i.get(e);if(!s)throw re.forId(e);if(s.dependencies)for(let e of s.dependencies)a(e);r.delete(e),n.add(e),t.push(s)}for(let t of e)n.has(t.id)||a(t.id);return t}function Ft(e){let t=[];for(let n of e)if(!J(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=It(n);t.push(...e)}return t}function It(e){let t=[],n=e.config,r=typeof n.template==`string`?n.template:void 0,i=typeof n.templateFile==`string`?n.templateFile:void 0,a=P({...r!==void 0&&{template:r},...i!==void 0&&{templateFile:i}});return!a.isValid&&a.error!=null&&a.error!==``&&t.push(`Task "${e.id}" (${e.name}): ${a.error}`),(n.file==null||n.file===``)&&t.push(`Task "${e.id}" (${e.name}): Write task requires "file" property to specify the output file path`),t}function Lt(e){i(`❌ Template validation failed:`,`error`),i(``,`error`);for(let t of e)i(` • ${t}`,`error`);i(``,`error`),i(`Please fix these errors before continuing.`,`error`)}function Rt(e,t=new Map){let n={};for(let r of e){let e=t.get(r.id);e!==void 0&&(n[r.id]=e)}return n}async function zt(e,t){if(e==null)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let n=e;if(n.type===`exec`){let e=n.value;if(typeof e!=`string`){i(`Variable "${t}": exec value must have a string command`,`error`);return}try{let t=g(e,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(t.startsWith(`{`)||t.startsWith(`[`))try{return JSON.parse(t)}catch{return t}if(/^-?\d+(?:\.\d+)?$/u.test(t)){let e=Number.parseFloat(t);if(!Number.isNaN(e))return e}return t===`true`||t===`false`?t===`true`:t}catch(e){i(`Variable "${t}": failed to execute command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}else if(n.type===`static`)return n.value;return e}async function Bt(e){let t=new Map,n=e.map(async e=>{let t=await zt(e.value,e.id);return{id:e.id,value:t}}),r=await Promise.all(n);for(let e of r)e.value!==void 0&&t.set(e.id,e.value);return t}function Vt(e){let t=[],n=new Set;for(let r of e)if(n.has(r.id)&&t.push(`Duplicate variable ID: "${r.id}"`),n.add(r.id),/^[a-zA-Z_$][a-zA-Z0-9_$]*$/u.test(r.id)||t.push(`Variable ID "${r.id}" is invalid. Must be a valid JavaScript identifier (start with letter, underscore, or $, followed by letters, digits, underscores, or $).`),r.value===void 0||r.value===null)t.push(`Variable "${r.id}" must have a value`);else if(typeof r.value==`object`&&!Array.isArray(r.value)&&r.value!==null){let e=r.value;e.type==null||e.type===``?t.push(`Variable "${r.id}": value object must have a "type" field ("static" or "exec")`):e.type!==`static`&&e.type!==`exec`&&t.push(`Variable "${r.id}": type must be "static" or "exec", got "${e.type}"`),(e.value===void 0||e.value===null)&&t.push(`Variable "${r.id}": value config must have a "value" field`),e.type===`exec`&&typeof e.value!=`string`&&t.push(`Variable "${r.id}": exec type must have a string command as value`)}return t}async function Ht(t,n){Q(),i(`Validating task configurations...`,`info`);let r=Ft(t);r.length>0&&(Lt(r),m.exit(1)),i(`✓ All tasks validated successfully`,`success`);let a=t.filter(t=>e(t.enabled,ne(),{lazy:!0}));i(`Resolving task dependencies...`,`info`);let o=Pt(a);i(`Welcome! Let's execute your tasks.`,`info`),n.dryRun&&i(`🔍 DRY RUN MODE - No changes will be made`,`warn`),i(`This will execute your project tasks based on the defined configuration.`,`info`);let s=ne(),c=n.globalVariables??[],l=[],u=[...c];for(let e of o)if(e.variables&&e.variables.length>0)for(let t of e.variables)l.push(t),u.push(t);if(u.length>0){let e=Vt(u);e.length>0&&(i(`❌ Variable validation errors:`,`error`),e.forEach(e=>i(` - ${e}`,`error`)),m.exit(1)),i(`Resolving variable values...`,`info`);let t=Rt(u,await Bt(u));Object.assign(s,t),Object.keys(t).length>0&&i(`✓ Resolved ${Object.keys(t).length} variable(s)`,`success`)}let d=n.globalPrompts??[],f=[],p=[...d];for(let e of o)if(e.prompts&&e.prompts.length>0)for(let t of e.prompts)f.push(t),p.push(t);if(p.length>0){let e=ze(p);e.length>0&&(i(`❌ Prompt validation errors:`,`error`),e.forEach(e=>i(` - ${e}`,`error`)),m.exit(1)),i(`Resolving prompt default values...`,`info`);let t=await Re(p),n={};if(d.length>0&&(i(`📋 Top-level prompts (available to all tasks):`,`info`),n=await Z(d,t,s),Object.assign(s,n)),f.length>0){d.length>0&&i(`📋 Task-specific prompts:`,`info`);let e=await Z(f,t,s);Object.assign(s,e)}}let h=o.filter(t=>e(t.enabled,s));if(i(`${h.length} of ${o.length} task(s) enabled for execution`,`info`),n.dryRun){await Oe(h,s),i(`🔍 Dry run completed - no changes were made`,`info`),i(`Run without --dry-run to apply changes`,`info`);return}i(`Starting task execution...`,`info`),await Y(`beforeAll`,s);let g=h.length,_=0,v=0,y=[];for(let e=0;e<h.length;e++){let t=h[e];if(t!=null)if(await Y(`beforeTask`,t,s),await $(t,s,e+1,g,n.dryRun))_++,y.push(t.id),await Y(`afterTask`,t,s);else if(t.required??!0){v++,await Y(`onError`,Error(`Task ${t.name} failed`),t);break}else i(`⚠️ Non-critical task failed, continuing...`,`warn`),await Y(`onError`,Error(`Task ${t.name} failed`),t)}v>0&&(i(`❌ Task execution failed with ${v} critical error(s)`,`error`),i(`✓ Completed: ${_}/${g} tasks`,`info`),m.exit(1)),await Y(`afterAll`,s),i(`✅ All tasks completed successfully!`,`success`),i(`✓ Completed: ${_}/${g} tasks`,`success`)}const Ut=m.argv.includes(`--dry-run`),Wt=m.argv.includes(`--force`);async function Gt(e){try{let t=e||[];t.length===0&&(i(`⚠️ No tasks defined. Use --tasks-file to specify tasks or call runWithTasks() programmatically.`,`warn`),i(`Example: scaffoldfy --tasks-file ./tasks.json`,`info`),m.exit(1)),await Ht(t,{dryRun:Ut,force:Wt,tasksFilePath:void 0})}catch(e){i(`❌ Task execution failed`,`error`),e instanceof Error?(i(`Error: ${e.message}`,`error`),m.env.DEBUG!=null&&console.error(e.stack)):console.error(e),m.exit(1)}}async function Kt(e,t){try{await Ht(e,{dryRun:t?.dryRun??Ut,force:t?.force??Wt,tasksFilePath:t?.tasksFilePath??void 0,...t?.globalVariables!=null&&{globalVariables:t.globalVariables},...t?.globalPrompts!=null&&{globalPrompts:t.globalPrompts}})}catch(e){i(`❌ Task execution failed`,`error`),e instanceof Error?(i(`Error: ${e.message}`,`error`),m.env.DEBUG!=null&&console.error(e.stack)):console.error(e),m.exit(1)}}export{ye as A,j as B,je as C,Ie as D,ke as E,ve as F,me as G,F as H,De as I,oe as J,A as K,V as L,xe as M,_e as N,Oe as O,be as P,H as R,J as S,K as T,N as U,M as V,P as W,ue as Y,Le as _,zt as a,q as b,Nt as c,ze as d,Re as f,Me as g,Y as h,Bt as i,Se as j,ge as k,Q as l,X as m,Kt as n,Rt as o,Z as p,he as q,Vt as r,Pt as s,Gt as t,$ as u,Pe as v,Ne as w,Fe as x,Ae as y,I as z};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
const e=require(`./utils-DvPgyPUm.cjs`);let t=require(`node:fs`);t=e.g(t);let n=require(`node:path`);n=e.g(n);let r=require(`node:process`);r=e.g(r);let i=require(`node:util`);i=e.g(i);let a=require(`node:child_process`);a=e.g(a);let o=require(`@inquirer/prompts`);o=e.g(o);function s(){return{}}var c=class t extends e.h{constructor(e,t,n,r){super(e,`DUPLICATE_ID`),this.id=t,this.type=n,this.existingType=r,this.name=`DuplicateIdError`}static forId(e,n,r){return new t(`Duplicate ID "${e}" found in ${n}. This ID is already used in ${r??`unknown`}`,e,n,r)}},l=class t extends e.h{constructor(e,t,n,r,i){super(e,`ID_CONFLICT`),this.id=t,this.type=n,this.baseSource=r,this.overrideSource=i,this.name=`IdConflictError`}static forTask(e,n,r){return new t(`Task ID conflict: "${e}" is defined in multiple templates.\n Base task from: ${n??`unknown`}\n Override task from: ${r??`unknown`}\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the task.\n Task is being extended/overridden but no override strategy was specified.`,e,`task`,n,r)}static forVariable(e){return new t(`Variable ID conflict: "${e}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the variable.\n Variable is being extended/overridden but no override strategy was specified.`,e,`variable`)}static forPrompt(e){return new t(`Prompt ID conflict: "${e}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the prompt.\n Prompt is being extended/overridden but no override strategy was specified.`,e,`prompt`)}},u=class t extends e.h{constructor(e,t){super(e,`TASK_NOT_FOUND`),this.taskId=t,this.name=`TaskNotFoundError`}static forId(e){return new t(`Task not found: ${e}`,e)}},d=class t extends e.h{constructor(e,t,n){super(e,`PROMPT_VALIDATION_ERROR`),this.promptId=t,this.reason=n,this.name=`PromptValidationError`}static required(e){return new t(`Prompt "${e}" is required`,e,`required`)}static unknownType(e){return new t(`Unknown prompt type: ${e}`,e,`unknown_type`)}},f=class t extends e.h{constructor(e,t,n){super(e,`PLUGIN_CONFIGURATION_ERROR`),this.pluginType=t,this.configIssue=n,this.name=`PluginConfigurationError`}static templateMissingTemplateOrFile(){return new t(`Template task requires either "template" (inline) or "templateFile" (file path) to be specified`,`template`,`missing_template_or_file`)}static templateHasBothTemplateAndFile(){return new t(`Template task cannot have both "template" and "templateFile" specified. Use one or the other.`,`template`,`both_template_and_file`)}static createMissingTemplateOrFile(){return new t(`Create task requires either "template" (inline) or "templateFile" (file path) to be specified`,`create`,`missing_template_or_file`)}static createHasBothTemplateAndFile(){return new t(`Create task cannot have both "template" and "templateFile" specified. Use one or the other.`,`create`,`both_template_and_file`)}};const p=(0,i.promisify)(t.default.readFile),m={template:[[`template`,`templateFile`]]};function h(e){if(e==null||e===``)return`current template`;if(g(e))return e;let t=r.default.cwd();return e.startsWith(t)?n.default.relative(t,e):e}function g(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function _(t,i){if(g(t))return t;if(i==null||i===``)return n.default.isAbsolute(t)?t:n.default.resolve(r.default.cwd(),t);if(g(i))try{let e=new URL(`.`,i);return new URL(t,e).href}catch{throw e.p.forRemoteTemplate(t,i)}let a=n.default.dirname(i);return n.default.isAbsolute(t)?t:n.default.resolve(a,t)}async function v(n){if(g(n))return y(n);if(!t.default.existsSync(n))throw e.d.forPath(n);return p(n,`utf-8`)}async function y(t){try{let n=await fetch(t);if(!n.ok)throw e.u.forUrl(t,n.status,n.statusText);return await n.text()}catch(n){throw n instanceof Error&&n.message.includes(`Failed to fetch`)?n:e.u.forUrl(t,n instanceof Error?n:void 0)}}const b=new Map;async function x(i,a=new Set){let o=g(i),s;if(s=o||n.default.isAbsolute(i)?i:n.default.resolve(r.default.cwd(),i),b.has(s))return b.get(s);if(a.has(s))throw e.m.forTemplateInheritance(a,s);a.add(s);let c;if(o)c=await y(s);else{if(!t.default.existsSync(s))throw e.d.forPath(s);c=await p(s,`utf-8`)}let l;try{l=JSON.parse(c)}catch(t){throw e.f.forFile(s,t instanceof Error?t:Error(String(t)))}if(l.name==null||l.name.trim()===``)throw e.l.missingName(s);if(!/^[a-z\d]+(?:-[a-z\d]+)*$/u.test(l.name))throw e.l.invalidNameFormat(s,l.name);if(l.tasks!==void 0&&!Array.isArray(l.tasks))throw e.l.tasksNotArray(s);l.tasks===void 0&&(l.tasks=[]);for(let e of l.tasks)e.$sourceUrl=s;return b.set(s,l),l}async function S(t,i,a=new Set){let o=g(t),s;if(s=o||n.default.isAbsolute(t)?t:i==null?n.default.resolve(r.default.cwd(),t):g(i)?new URL(t,i).href:n.default.resolve(i,t),a.has(s))throw e.m.forTemplateInheritance(a,s);a.add(s);let c=await x(s);if(c.extends==null||c.extends===``)return c;let l=g(s)?new URL(`.`,s).href:n.default.dirname(s),u=Array.isArray(c.extends)?c.extends:[c.extends],d=[];for(let e of u){let t=await S(e,l,a);d.push(t)}return re([...d,c])}function ee(e,t,n){let r=new Map;for(let t of e){if(r.has(t.id))throw c.forId(t.id,`task`,r.get(t.id));r.set(t.id,`task`)}if(t!=null)for(let e of t){if(r.has(e.id))throw c.forId(e.id,`variable`,r.get(e.id));r.set(e.id,`variable`)}if(n!=null)for(let e of n){if(r.has(e.id))throw c.forId(e.id,`prompt`,r.get(e.id));r.set(e.id,`prompt`)}}function te(t,n){if((n.override??`merge`)===`replace`){e.i(` → Variable "${n.id}" using 'replace' strategy`,`info`);let{override:t,...r}=n;return r}e.i(` → Variable "${n.id}" merged (value replaced)`,`info`);let r={...t,...n};return delete r.override,r}function ne(t,n){if((n.override??`merge`)===`replace`){e.i(` → Prompt "${n.id}" using 'replace' strategy`,`info`);let{override:t,...r}=n;return r}e.i(` → Prompt "${n.id}" merged`,`info`);let r={...t,...n};return delete r.override,r}function re(e){if(e.length===0)return{name:`Empty Template`,tasks:[]};if(e.length===1){let t=e[0];return ee(t.tasks??[],t.variables,t.prompts),t}let t=new Map,n=new Map,r=new Map;for(let i of e){if(i.prompts!=null)for(let e of i.prompts)if(r.has(e.id)){if(e.override==null)throw l.forPrompt(e.id);let t=r.get(e.id);r.set(e.id,ne(t,e))}else r.set(e.id,{...e});if(i.variables!=null)for(let e of i.variables)if(n.has(e.id)){if(e.override==null)throw l.forVariable(e.id);let t=n.get(e.id);n.set(e.id,te(t,e))}else n.set(e.id,{...e});for(let e of i.tasks??[])if(t.has(e.id)){if(e.override==null){let n=t.get(e.id);throw l.forTask(e.id,h(n.$sourceUrl),h(e.$sourceUrl))}let n=t.get(e.id);t.set(e.id,oe(n,e))}else t.set(e.id,{...e})}let i=Array.from(t.values()),a=r.size>0?Array.from(r.values()):void 0,o=n.size>0?Array.from(n.values()):void 0;ee(i,o,a);let s=e[e.length-1],c={name:s.name,tasks:i};return s.description!=null&&(c.description=s.description),s.dependencies!=null&&(c.dependencies=s.dependencies),a!=null&&(c.prompts=a),o!=null&&(c.variables=o),c}function ie(e,t){let n=m[e];if(!n)return null;for(let e of n){let n=e.filter(e=>e in t&&t[e]!=null);if(n.length>1)return n}return null}function ae(e,t,n){let r={...e},i=m[n]??[];for(let[e,n]of Object.entries(t)){for(let t of i)if(t.includes(e)){for(let n of t)n!==e&&delete r[n];break}r[e]=n}return r}function oe(t,n){if((n.override??`merge`)===`replace`){e.i(` → Task "${n.id}" using 'replace' strategy - completely replacing base task`,`info`),e.i(` Base: ${h(t.$sourceUrl)}`,`info`),e.i(` Override: ${h(n.$sourceUrl)}`,`info`);let{override:r,...i}=n;return i}e.i(` → Merging task "${n.id}"`,`info`),e.i(` Base: ${h(t.$sourceUrl)}`,`info`),e.i(` Override: ${h(n.$sourceUrl)}`,`info`);let r;if(typeof t.config==`object`&&t.config!==null&&typeof n.config==`object`&&n.config!==null){r=ae(t.config,n.config,n.type);let i=ie(n.type,r);i!==null&&i.length>0&&(e.i(` ⚠️ Warning: Conflicting config fields detected: ${i.join(`, `)}`,`warn`),e.i(` Please use override: "replace" or specify only one of these fields`,`warn`))}else r=n.config??t.config;let i=t.prompts?[...t.prompts]:void 0;if(n.prompts&&n.prompts.length>0)if(!i)i=[...n.prompts];else{let e=new Map(i.map(e=>[e.id,e]));for(let t of n.prompts)e.set(t.id,t);i=Array.from(e.values())}let a=t.variables?[...t.variables]:void 0;if(n.variables&&n.variables.length>0)if(!a)a=[...n.variables];else{let e=new Map(a.map(e=>[e.id,e]));for(let t of n.variables)e.set(t.id,t);a=Array.from(e.values())}let o=[...t.dependencies??[],...n.dependencies??[]],s=o.length>0?[...new Set(o)]:void 0,c=n.$sourceUrl??t.$sourceUrl,l={...t,...n,config:r,...i!=null&&{prompts:i},...a!=null&&{variables:a},...s!=null&&{dependencies:s},...c!=null&&{$sourceUrl:c}};return delete l.override,l}function se(){b.clear()}async function ce(t){e.i(`Loading tasks from ${t}...`,`info`);let n=await S(t);e.i(`Loaded ${n.tasks?.length??0} task(s)`,`info`),n.extends!=null&&n.extends!==``&&e.i(`Extended from: ${(Array.isArray(n.extends)?n.extends:[n.extends]).join(`, `)}`,`info`),n.prompts!=null&&n.prompts.length>0&&e.i(`Found ${n.prompts.length} top-level prompt(s)`,`info`),n.variables!=null&&n.variables.length>0&&e.i(`Found ${n.variables.length} top-level variable(s)`,`info`);let r={tasks:n.tasks??[]};return n.prompts!=null&&(r.prompts=n.prompts),n.variables!=null&&(r.variables=n.variables),r}function C(e){return e.template!=null&&e.template!==``}function w(e){return e.templateFile!=null&&e.templateFile!==``}function le(e){return e.endsWith(`.hbs`)}function T(e){let t=C(e),n=w(e);return!t&&!n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration requires either "template" (inline) or "templateFile" (file path) to be specified`}:t&&n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration cannot have both "template" and "templateFile" specified. Use one or the other.`}:{isValid:!0,hasInlineTemplate:t,hasTemplateFile:n}}async function E(t,n,r,i={}){let{enableHandlebars:a=!0,sourceUrl:o=r?.$sourceUrl}=i,s=C(t),c=w(t);if(s)return e.r(t.template,n);if(c){let r=t.templateFile,i=a&&le(r),s=await v(_(r,o));return i?(await import(`handlebars`)).default.compile(s)(n):e.r(s,n)}throw Error(`No template content available`)}function ue(e){return C(e)?`inline template`:w(e)?`template file: ${e.templateFile}`:`no template source`}const D=(0,i.promisify)(t.default.readFile),de=2,fe=10,pe=55,O={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function k(e,t){switch(t){case`add`:return`${O.green}+ ${e}${O.reset}`;case`remove`:return`${O.red}- ${e}${O.reset}`;case`context`:return`${O.gray} ${e}${O.reset}`;default:return e}}function A(e,t){let n=e.split(`
|
|
2
|
+
`),r=t.split(`
|
|
3
|
+
`),i=[],a=Math.max(n.length,r.length);for(let e=0;e<a;e++){let t=n[e],a=r[e];t===a?t!==void 0&&i.push(k(t,`context`)):(t!==void 0&&i.push(k(t,`remove`)),a!==void 0&&i.push(k(a,`add`)))}return i}async function j(i,a){if(i.condition!=null&&i.condition!==``&&!e.t(i.condition,a))return`${O.yellow}⊘ Condition not met - task would be skipped${O.reset}`;let o=n.default.join(r.default.cwd(),i.file);if(!t.default.existsSync(o))return`${O.red}✗ File not found: ${i.file}${O.reset}`;try{let t=await D(o,`utf-8`),n=JSON.parse(t),r={...n};function s(t){if(typeof t==`string`)return e.r(t,a);if(Array.isArray(t))return t.map(e=>s(e));if(typeof t==`object`&&t){let e={};for(let[n,r]of Object.entries(t))e[n]=s(r);return e}return t}for(let[t,r]of Object.entries(i.updates)){let i=s(r);t.includes(`.`)?e.s(n,t,i):n[t]=i}let c=JSON.stringify(r,null,2),l=JSON.stringify(n,null,2);if(c===l)return`${O.cyan}→ No changes${O.reset}`;let u=A(c,l);return`${O.blue}File: ${i.file}${O.reset}\n${u.join(`
|
|
4
|
+
`)}`}catch(e){return`${O.red}✗ Error: ${e instanceof Error?e.message:String(e)}${O.reset}`}}async function M(i,a){if(i.condition!=null&&i.condition!==``&&!e.t(i.condition,a))return`${O.yellow}⊘ Condition not met - task would be skipped${O.reset}`;if(i.template==null||i.template===``)return`${O.red}✗ No template content provided for file: ${i.file}${O.reset}`;let o=n.default.join(r.default.cwd(),i.file),s=e.r(i.template,a);if(!t.default.existsSync(o)){let e=s.split(`
|
|
5
|
+
`).slice(0,10).join(`
|
|
6
|
+
`),t=s.split(`
|
|
7
|
+
`).length>10;return`${O.blue}File: ${i.file}${O.reset}\n${O.green}+ New file would be created${O.reset}\n${O.gray}Content preview:${O.reset}\n${e}${t?`
|
|
8
|
+
...`:``}`}try{let e=await D(o,`utf-8`);if(e===s)return`${O.cyan}→ No changes${O.reset}`;let t=A(e,s);return`${O.blue}File: ${i.file}${O.reset}\n${t.join(`
|
|
9
|
+
`)}`}catch(e){return`${O.red}✗ Error: ${e instanceof Error?e.message:String(e)}${O.reset}`}}async function N(i,a,o){if(i.condition!=null&&i.condition!==``&&!e.t(i.condition,a))return`${O.yellow}⊘ Condition not met - task would be skipped${O.reset}`;let s=n.default.join(r.default.cwd(),i.file);if(t.default.existsSync(s))return`${O.cyan}→ File already exists, would be skipped: ${i.file}${O.reset}`;try{if(C(i)){let e=await E(i,a,o),t=e.split(`
|
|
10
|
+
`).slice(0,10).join(`
|
|
11
|
+
`),n=e.split(`
|
|
12
|
+
`).length>10;return`${O.blue}File: ${i.file}${O.reset}\n${O.green}+ New file would be created${O.reset}\n${O.gray}Content preview:${O.reset}\n${t}${n?`
|
|
13
|
+
...`:``}`}let e=ue(i);return`${O.blue}File: ${i.file}${O.reset}\n${O.green}+ New file would be created from ${e}${O.reset}`}catch(e){return`${O.red}✗ Error: ${e instanceof Error?e.message:String(e)}${O.reset}`}}async function P(i,a){if(i.condition!=null&&i.condition!==``&&!e.t(i.condition,a))return`${O.yellow}⊘ Condition not met - task would be skipped${O.reset}`;let o=n.default.join(r.default.cwd(),i.file);if(!t.default.existsSync(o))return`${O.red}✗ File not found: ${i.file}${O.reset}`;try{let t=await D(o,`utf-8`),n=new RegExp(i.pattern,i.flags??`g`),r=e.r(i.replacement,a),s=t.replace(n,r);if(t===s)return`${O.cyan}→ No matches found${O.reset}`;let c=A(t,s);return`${O.blue}File: ${i.file}${O.reset}\n${c.join(`
|
|
14
|
+
`)}`}catch(e){return`${O.red}✗ Error: ${e instanceof Error?e.message:String(e)}${O.reset}`}}async function F(i,a){if(i.condition!=null&&i.condition!==``&&!e.t(i.condition,a))return`${O.yellow}⊘ Condition not met - task would be skipped${O.reset}`;let o=n.default.join(r.default.cwd(),i.file);if(!t.default.existsSync(o))return`${O.red}✗ File not found: ${i.file}${O.reset}`;try{let t=await D(o,`utf-8`),n=t;for(let{find:n,replace:r}of i.replacements){let i=e.r(n,a),o=e.r(r,a);t=t.replace(i,o)}if(n===t)return`${O.cyan}→ No changes${O.reset}`;let r=A(n,t);return`${O.blue}File: ${i.file}${O.reset}\n${r.join(`
|
|
15
|
+
`)}`}catch(e){return`${O.red}✗ Error: ${e instanceof Error?e.message:String(e)}${O.reset}`}}function I(i,a){if(i.condition!=null&&i.condition!==``&&!e.t(i.condition,a))return`${O.yellow}⊘ Condition not met - task would be skipped${O.reset}`;let o=i.paths.map(t=>e.r(t,a)).filter(e=>t.default.existsSync(n.default.join(r.default.cwd(),e)));return o.length===0?`${O.cyan}→ No files/directories to delete${O.reset}`:`${O.red}Would delete:${O.reset}\n${o.map(e=>`${O.red} - ${e}${O.reset}`).join(`
|
|
16
|
+
`)}`}function L(i,a){if(i.condition!=null&&i.condition!==``&&!e.t(i.condition,a))return`${O.yellow}⊘ Condition not met - task would be skipped${O.reset}`;let o=e.r(i.from,a),s=e.r(i.to,a),c=n.default.join(r.default.cwd(),o),l=n.default.join(r.default.cwd(),s);return t.default.existsSync(c)?t.default.existsSync(l)?`${O.yellow}⚠ Destination already exists: ${s}${O.reset}\n${O.cyan}Would rename: ${o} → ${s}${O.reset}`:`${O.cyan}Would rename: ${o} → ${s}${O.reset}`:`${O.red}✗ Source not found: ${o}${O.reset}`}function R(e){if(e.condition!=null&&e.condition!==``)return`${O.yellow}⊘ Condition check skipped in dry-run${O.reset}`;let i=n.default.join(r.default.cwd(),`.git`),a=t.default.existsSync(i),o=[];if(e.removeExisting&&a&&o.push(`${O.red}Would remove existing .git directory${O.reset}`),o.push(`${O.green}Would initialize git repository${O.reset}`),e.initialCommit){let t=e.message??`Initial commit`;o.push(`${O.green}Would create initial commit: "${t}"${O.reset}`)}return o.join(`
|
|
17
|
+
`)}function z(t,n){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,n))return`${O.yellow}⊘ Condition not met - task would be skipped${O.reset}`;let i=e.r(t.command,n),a=t.cwd==null?r.default.cwd():e.r(t.cwd,n);return`${O.yellow}Would execute:${O.reset}\n${O.cyan} Command: ${i}${O.reset}\n${O.cyan} Working directory: ${a}${O.reset}`}function me(i,a){if(i.condition!=null&&i.condition!==``&&!e.t(i.condition,a))return`${O.yellow}⊘ Condition not met - task would be skipped${O.reset}`;let o=e.r(i.from,a),s=e.r(i.to,a),c=n.default.join(r.default.cwd(),o),l=n.default.join(r.default.cwd(),s);return t.default.existsSync(c)?t.default.existsSync(l)?`${O.yellow}⚠ Destination already exists: ${s}${O.reset}\n${O.cyan}Would move: ${o} → ${s}${O.reset}`:`${O.cyan}Would move: ${o} → ${s}${O.reset}`:`${O.red}✗ Source not found: ${o}${O.reset}`}function he(i,a){if(i.condition!=null&&i.condition!==``&&!e.t(i.condition,a))return`${O.yellow}⊘ Condition not met - task would be skipped${O.reset}`;let o=e.r(i.from,a),s=e.r(i.to,a),c=n.default.join(r.default.cwd(),o),l=n.default.join(r.default.cwd(),s);if(!t.default.existsSync(c))return`${O.red}✗ Source not found: ${o}${O.reset}`;let u=t.default.statSync(c).isDirectory()?`directory`:`file`;return t.default.existsSync(l)?`${O.yellow}⚠ Destination already exists: ${s}${O.reset}\n${O.cyan}Would copy ${u}: ${o} → ${s}${O.reset}`:`${O.cyan}Would copy ${u}: ${o} → ${s}${O.reset}`}async function ge(i,a,o){if(i.condition!=null&&i.condition!==``&&!e.t(i.condition,a))return`${O.yellow}⊘ Condition not met - task would be skipped${O.reset}`;let s=n.default.join(r.default.cwd(),i.file),c={};i.content==null?i.template!=null&&(c.template=i.template):c.template=i.content,i.templateFile!=null&&(c.templateFile=i.templateFile);try{let e=await E(c,a,o),n=e.split(`
|
|
18
|
+
`).slice(0,10).join(`
|
|
19
|
+
`),r=e.split(`
|
|
20
|
+
`).length>10;return t.default.existsSync(s)?`${O.blue}File: ${i.file}${O.reset}\n${O.green}+ Would append content${O.reset}\n${O.gray}Content preview:${O.reset}\n${n}${r?`
|
|
21
|
+
...`:``}`:`${O.blue}File: ${i.file}${O.reset}\n${O.green}+ New file would be created with content${O.reset}\n${O.gray}Content preview:${O.reset}\n${n}${r?`
|
|
22
|
+
...`:``}`}catch(e){return`${O.red}✗ Error: ${e instanceof Error?e.message:String(e)}${O.reset}`}}function _e(i,a){if(i.condition!=null&&i.condition!==``&&!e.t(i.condition,a))return`${O.yellow}⊘ Condition not met - task would be skipped${O.reset}`;let o=e.r(i.path,a),s=n.default.join(r.default.cwd(),o);return t.default.existsSync(s)?`${O.cyan}→ Directory already exists: ${o}${O.reset}`:`${O.green}+ Would create directory: ${o}${O.reset}`}async function B(e,t){try{switch(e.type){case`update-json`:return await j(e.config,t);case`write`:return await M(e.config,t);case`create`:return await N(e.config,t,e);case`regex-replace`:return await P(e.config,t);case`replace-in-file`:return await F(e.config,t);case`delete`:return I(e.config,t);case`rename`:return L(e.config,t);case`move`:return me(e.config,t);case`copy`:return he(e.config,t);case`append`:return await ge(e.config,t,e);case`mkdir`:return _e(e.config,t);case`git-init`:return R(e.config);case`exec`:return z(e.config,t);default:{let t=e.type;return`${O.yellow}⚠ Diff not available for task type: ${t}${O.reset}`}}}catch(e){return`${O.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${O.reset}`}}async function V(e,t){console.log(`${O.blue}═══════════════════════════════════════════════════════${O.reset}`),console.log(`${O.blue} DRY RUN - Preview of changes${O.reset}`),console.log(`${O.blue}═══════════════════════════════════════════════════════${O.reset}`);for(let n of e){console.log(`${O.cyan}▶ Task: ${n.name}${O.reset}`),n.description!=null&&n.description!==``&&console.log(`${O.gray} ${n.description}${O.reset}`);let e=await B(n,t);console.log(e),console.log(`${O.gray}${`─`.repeat(55)}${O.reset}`)}console.log(`${O.blue}═══════════════════════════════════════════════════════${O.reset}`),console.log(`${O.yellow} No changes were applied (dry-run mode)${O.reset}`),console.log(`${O.blue}═══════════════════════════════════════════════════════${O.reset}`)}const H=new Map,U={},W=new Map;function G(t){if(t.name==null||t.name===``)throw TypeError(`Plugin name is required`);if(!Array.isArray(t.taskTypes)||t.taskTypes.length===0)throw TypeError(`Plugin ${t.name} must define at least one task type`);if(typeof t.execute!=`function`)throw TypeError(`Plugin ${t.name} must provide an execute function`);if(H.has(t.name))throw TypeError(`Plugin ${t.name} is already registered`);for(let e of t.taskTypes)if(W.has(e)){let t=W.get(e);throw TypeError(`Task type "${e}" is already registered by plugin "${t}"`)}H.set(t.name,t);for(let e of t.taskTypes)W.set(e,t.name);e.i(`✓ Registered plugin: ${t.name}${t.version==null?``:` v${t.version}`}`,`info`)}function ve(e){let t=H.get(e);if(t!=null){for(let e of t.taskTypes)W.delete(e);H.delete(e)}}function ye(e){return H.get(e)}function K(e){let t=W.get(e);if(t!=null)return H.get(t)}function q(e){return W.has(e)}function be(){return Array.from(H.keys())}function xe(){H.clear(),W.clear()}function Se(e){e.beforeAll!=null&&(U.beforeAll=e.beforeAll),e.afterAll!=null&&(U.afterAll=e.afterAll),e.beforeTask!=null&&(U.beforeTask=e.beforeTask),e.afterTask!=null&&(U.afterTask=e.afterTask),e.onError!=null&&(U.onError=e.onError)}async function J(t,...n){let r=U[t];if(r!=null)try{t===`beforeAll`||t===`afterAll`?await r(n[0]):(t===`beforeTask`||t===`afterTask`||t===`onError`)&&await r(n[0],n[1])}catch(n){e.i(`Error in ${t} hook: ${n instanceof Error?n.message:String(n)}`,`error`)}}async function Y(e,t,n){let r=K(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}async function Ce(e,t){let n=K(e.type);if(!(n==null||n.getDiff==null))return n.getDiff(e,t)}function we(e){let t=K(e.type);return t==null?[`No plugin found for task type: ${e.type}`]:t.validate==null?[]:t.validate(e)}function Te(e,t,n,r){return{name:e,...r?.version!=null&&{version:r.version},taskTypes:[t],execute:n,...r?.getDiff!=null&&{getDiff:r.getDiff},...r?.validate!=null&&{validate:r.validate}}}async function X(t,n,r){if(t===void 0)return;if(typeof t!=`object`||!t||Array.isArray(t))return typeof t==`string`&&r&&/\{\{\w+\}\}/u.test(t)?e.r(t,r):t;let i=t;if(i.type===`conditional`){if(!r)return;if(typeof i.condition!=`string`){e.i(`Prompt "${n}": conditional default must have a string condition`,`error`);return}try{let{evaluateCondition:t}=await Promise.resolve().then(()=>require(`./utils-wf_LrO7W.cjs`)),n=t(i.condition,r)?i.ifTrue:i.ifFalse;return typeof n==`string`&&/\{\{\w+\}\}/u.test(n)&&(n=e.r(n,r)),n}catch(t){e.i(`Prompt "${n}": failed to evaluate conditional default: ${t instanceof Error?t.message:`Unknown error`}`,`warn`);return}}if(i.type===`exec`){let t=i.value;if(typeof t!=`string`){e.i(`Prompt "${n}": exec default value must have a string command`,`error`);return}try{let e=(0,a.execSync)(t,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(e.startsWith(`{`)||e.startsWith(`[`))try{return JSON.parse(e)}catch{return e}if(/^-?\d+(?:\.\d+)?$/u.test(e)){let t=Number.parseFloat(e);if(!Number.isNaN(t))return t}return e===`true`||e===`false`?e===`true`:e}catch(t){e.i(`Prompt "${n}": failed to execute default value command: ${t instanceof Error?t.message:`Unknown error`}`,`warn`);return}}else if(i.type===`static`)return i.value;else if(i.type!==void 0){e.i(`Prompt "${n}": unknown default value type "${i.type}". Expected "static", "exec", or "conditional".`,`error`);return}return t}async function Z(t,n=new Map,r={}){let i={};if(t.length===0)return i;for(let a of t){let t={...r,...i};if(e.c(a.enabled,t))try{let r,s=n.get(a.id);switch(a.default!==void 0&&(s=await X(a.default,a.id,t)),a.type){case`input`:{let t={message:a.message};if(s!==void 0&&(t.default=String(s)),a.required!==void 0&&(t.required=a.required),r=await(0,o.input)(t),a.required&&(r==null||typeof r==`string`&&r.trim()===``))throw e.i(`${a.message} is required`,`error`),d.required(a.id);break}case`password`:if(r=await(0,o.password)({message:a.message,mask:`*`}),a.required&&(r==null||typeof r==`string`&&r.trim()===``))throw e.i(`${a.message} is required`,`error`),d.required(a.id);break;case`number`:{let t={message:a.message};if(s!==void 0&&(t.default=Number(s)),a.required!==void 0&&(t.required=a.required),a.min!==void 0&&(t.min=a.min),a.max!==void 0&&(t.max=a.max),r=await(0,o.number)(t),a.required&&r==null)throw e.i(`${a.message} is required`,`error`),d.required(a.id);break}case`select`:{let e={message:a.message,choices:a.choices.map(e=>({name:e.name,value:e.value}))};s!==void 0&&(e.default=s),r=await(0,o.select)(e);break}case`confirm`:{let e=s===void 0?!1:!!s;r=await(0,o.confirm)({message:a.message,default:e});break}default:throw e.i(`Unknown prompt type: ${a.type}`,`error`),d.unknownType(a.type)}i[a.id]=r}catch(t){throw t instanceof Error&&e.i(`Failed to collect prompt "${a.id}": ${t.message}`,`error`),t}}return i}async function Ee(e){let t=new Map,n=e.map(async e=>{if(e.default!==void 0){let n=await X(e.default,e.id);n!==void 0&&t.set(e.id,n)}});return await Promise.all(n),t}function De(e){let t=[],n=new Set;for(let r of e){if(n.has(r.id)&&t.push(`Duplicate prompt ID: ${r.id}`),n.add(r.id),/^[a-zA-Z_$][a-zA-Z0-9_$]*$/u.test(r.id)||t.push(`Invalid prompt ID "${r.id}": must be a valid JavaScript identifier (start with letter, underscore, or $, followed by letters, digits, underscores, or $)`),(!r.message||r.message.trim()===``)&&t.push(`Prompt "${r.id}" must have a non-empty message`),r.type===`select`){r.choices.length===0&&t.push(`Select prompt "${r.id}" must have at least one choice`);for(let e of r.choices)(!e.name||e.name.trim()===``)&&t.push(`Select prompt "${r.id}" has a choice with empty name`),e.value===void 0&&t.push(`Select prompt "${r.id}" has a choice with undefined value`)}r.type===`number`&&r.min!==void 0&&r.max!==void 0&&r.min>r.max&&t.push(`Number prompt "${r.id}" has min greater than max`)}return t}const Oe=(0,i.promisify)(t.default.appendFile),ke=(0,i.promisify)(t.default.readFile),Ae=(0,i.promisify)(t.default.stat);async function je(t,i,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,i)){e.i(`Condition not met, skipping append task`,`info`);return}let o=n.default.join(r.default.cwd(),t.file),s={};t.content==null?t.template!=null&&(s.template=t.template):s.template=t.content,t.templateFile!=null&&(s.templateFile=t.templateFile);let c=T(s);if(!c.isValid)throw c.error?.includes(`cannot have both`)?f.templateHasBothTemplateAndFile():f.templateMissingTemplateOrFile();let l=await E(s,i,a),u=!1,d=!1;try{await Ae(o),u=!0;let e=await ke(o,`utf-8`);e.length>0&&!e.endsWith(`
|
|
23
|
+
`)&&(d=t.newline!==!1)}catch{}u&&d?await Oe(o,`\n${l}`):await Oe(o,l),e.i(`Appended content to ${t.file}`,`success`)}const Me={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await je(e.config,t,e)}},Ne=(0,i.promisify)(t.default.copyFile),Pe=(0,i.promisify)(t.default.stat),Fe=(0,i.promisify)(t.default.mkdir),Ie=(0,i.promisify)(t.default.readdir);async function Le(e,t){await Fe(t,{recursive:!0});let r=await Ie(e,{withFileTypes:!0});await Promise.all(r.map(async r=>{let i=n.default.join(e,r.name),a=n.default.join(t,r.name);r.isDirectory()?await Le(i,a):await Ne(i,a)}))}async function Re(t,i){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,i)){e.i(`Condition not met, skipping copy task`,`info`);return}let a=n.default.join(r.default.cwd(),t.from),o=n.default.join(r.default.cwd(),t.to),s;try{s=await Pe(a)}catch{e.i(`Source path does not exist: ${a}`,`warn`);return}await Fe(n.default.dirname(o),{recursive:!0}),s.isDirectory()?(await Le(a,o),e.i(`Copied directory ${t.from} to ${t.to}`,`success`)):(await Ne(a,o),e.i(`Copied file ${t.from} to ${t.to}`,`success`))}const ze={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await Re(e.config,t)}},Be=(0,i.promisify)(t.default.writeFile);async function Ve(i,a,o){if(i.condition!=null&&i.condition!==``&&!e.t(i.condition,a)){e.i(`Condition not met, skipping create task`,`info`);return}let s=n.default.join(r.default.cwd(),i.file);if(t.default.existsSync(s)){e.i(`File already exists, skipping: ${i.file}`,`info`);return}let c=T(i);if(!c.isValid)throw c.error?.includes(`cannot have both`)?f.createHasBothTemplateAndFile():f.createMissingTemplateOrFile();let l=await E(i,a,o),u=n.default.dirname(s);t.default.existsSync(u)||t.default.mkdirSync(u,{recursive:!0}),await Be(s,l),e.i(`Created file: ${i.file}`,`success`)}const He={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await Ve(e.config,t,e)}};async function Ue(i,a){let{paths:o,condition:s}=i;if(s!=null&&s!==``){if(!a){e.i(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!e.t(s,a)){e.i(`Condition not met, skipping deletion`,`info`);return}}for(let e of o){let i=n.default.join(r.default.cwd(),e);t.default.existsSync(i)&&t.default.rmSync(i,{recursive:!0,force:!0})}}const We={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await Ue(e.config,t)}};async function Ge(t,i){if(t.condition!=null&&t.condition!==``){if(!i){e.i(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!e.t(t.condition,i)){e.i(`Condition not met, skipping exec task`,`info`);return}}let o=t.cwd==null?r.default.cwd():n.default.join(r.default.cwd(),t.cwd);(0,a.execSync)(t.command,{cwd:o,stdio:`inherit`})}const Ke={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await Ge(e.config,t)}};async function qe(i,o){if(i.condition!=null&&i.condition!==``){if(!o){e.i(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!e.t(i.condition,o)){e.i(`Condition not met, skipping git-init task`,`info`);return}}if(i.removeExisting){let e=n.default.join(r.default.cwd(),`.git`);t.default.existsSync(e)&&t.default.rmSync(e,{recursive:!0,force:!0})}if((0,a.execSync)(`git init`,{stdio:`inherit`}),i.initialCommit){let e=i.message??`Initial commit`;(0,a.execSync)(`git add .`,{stdio:`inherit`}),(0,a.execSync)(`git commit -m "${e}"`,{stdio:`inherit`})}}const Je={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await qe(e.config,t)}},Ye=(0,i.promisify)(t.default.mkdir);async function Xe(t,i){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,i)){e.i(`Condition not met, skipping mkdir task`,`info`);return}await Ye(n.default.join(r.default.cwd(),t.path),{recursive:!0}),e.i(`Created directory: ${t.path}`,`success`)}const Ze={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await Xe(e.config,t)}},Qe=(0,i.promisify)(t.default.rename),$e=(0,i.promisify)(t.default.stat),et=(0,i.promisify)(t.default.mkdir);async function tt(t,i){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,i)){e.i(`Condition not met, skipping move task`,`info`);return}let a=n.default.join(r.default.cwd(),t.from),o=n.default.join(r.default.cwd(),t.to);try{await $e(a)}catch{e.i(`Source path does not exist: ${a}`,`warn`);return}await et(n.default.dirname(o),{recursive:!0}),await Qe(a,o),e.i(`Moved ${t.from} to ${t.to}`,`success`)}const nt={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await tt(e.config,t)}},rt=(0,i.promisify)(t.default.readFile),it=(0,i.promisify)(t.default.writeFile);async function at(t,i){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,i)){e.i(`Condition not met, skipping regex-replace task`,`info`);return}let a=n.default.join(r.default.cwd(),t.file),{pattern:o}=t,s=t.flags??``,c=t.replacement||``,l=await rt(a,`utf-8`),u=new RegExp(o,s);l=l.replace(u,e.r(c,i)),await it(a,l)}const ot={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await at(e.config,t)}},st=(0,i.promisify)(t.default.rename);async function ct(i,a){if(i.condition!=null&&i.condition!==``&&!e.t(i.condition,a)){e.i(`Condition not met, skipping rename task`,`info`);return}let o=n.default.join(r.default.cwd(),e.r(i.from,a)),s=n.default.join(r.default.cwd(),e.r(i.to,a));if(!t.default.existsSync(o)){e.i(`Source path does not exist: ${o}`,`warn`);return}await st(o,s)}const lt={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await ct(e.config,t)}},ut=(0,i.promisify)(t.default.readFile),dt=(0,i.promisify)(t.default.writeFile);async function ft(i,a){if(i.condition!=null&&i.condition!==``&&!e.t(i.condition,a)){e.i(`Condition not met, skipping replace-in-file task`,`info`);return}let o=n.default.join(r.default.cwd(),i.file),{replacements:s}=i;if(!t.default.existsSync(o)){e.i(`File not found: ${o}, skipping`,`warn`);return}let c=await ut(o,`utf-8`);for(let{find:t,replace:n}of s){let r=e.r(n,a);c=c.replace(new RegExp(t,`gu`),r)}await dt(o,c)}const pt={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await ft(e.config,t)}},mt=(0,i.promisify)(t.default.readFile),ht=(0,i.promisify)(t.default.writeFile),gt=2;async function _t(t,i){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,i)){e.i(`Condition not met, skipping update-json task`,`info`);return}let a=n.default.join(r.default.cwd(),t.file),{updates:o}=t,s=await mt(a,`utf-8`),c=JSON.parse(s);function l(t){if(typeof t==`string`)return e.r(t,i);if(Array.isArray(t))return t.map(e=>l(e));if(typeof t==`object`&&t){let e={};for(let[n,r]of Object.entries(t))e[n]=l(r);return e}return t}for(let[t,n]of Object.entries(o)){let r=l(n);t.includes(`.`)?e.s(c,t,r):c[t]=r}await ht(a,`${JSON.stringify(c,null,2)}\n`)}const vt={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await _t(e.config,t)}},yt=(0,i.promisify)(t.default.writeFile);async function bt(t,i,a){if(t.condition!=null&&t.condition!==``&&!e.t(t.condition,i)){e.i(`Condition not met, skipping write task`,`info`);return}let o=n.default.join(r.default.cwd(),t.file),s=T(t);if(!s.isValid)throw s.error?.includes(`cannot have both`)?f.templateHasBothTemplateAndFile():f.templateMissingTemplateOrFile();await yt(o,await E(t,i,a))}const xt={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await bt(e.config,t,e)}};function Q(){q(`update-json`)||(G(vt),G(xt),G(He),G(ot),G(pt),G(We),G(lt),G(Je),G(Ke),G(nt),G(ze),G(Me),G(Ze))}async function St(t,n,r=!1){if(Q(),r){e.i(`[DRY RUN] Would execute: ${t.name}`,`info`);return}if(q(t.type)){await Y(t,n,{dryRun:r});return}throw TypeError(`Unknown task type: ${t.type}`)}async function Ct(t,n,i,a,o=!1){try{return e.i(`[${i}/${a}] Running: ${t.name}...`,`info`),await St(t,n,o),e.i(`✓ ${t.name}`,`success`),!0}catch(n){return e.i(`✗ Failed: ${t.name}`,`error`),n instanceof Error&&(e.i(` Reason: ${n.message}`,`error`),n.stack!=null&&r.default.env.DEBUG!=null&&console.error(n.stack)),(t.required??!0)&&e.i(` This is a required task. Initialization cannot continue.`,`error`),!1}}function wt(t){let n=[],r=new Set,i=new Set,a=new Map(t.map(e=>[e.id,e]));function o(t){if(r.has(t))return;if(i.has(t))throw e.m.forTaskDependency(t);i.add(t);let s=a.get(t);if(!s)throw u.forId(t);if(s.dependencies)for(let e of s.dependencies)o(e);i.delete(t),r.add(t),n.push(s)}for(let e of t)r.has(e.id)||o(e.id);return n}function Tt(e){let t=[];for(let n of e)if(!q(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=Et(n);t.push(...e)}return t}function Et(e){let t=[],n=e.config,r=typeof n.template==`string`?n.template:void 0,i=typeof n.templateFile==`string`?n.templateFile:void 0,a=T({...r!==void 0&&{template:r},...i!==void 0&&{templateFile:i}});return!a.isValid&&a.error!=null&&a.error!==``&&t.push(`Task "${e.id}" (${e.name}): ${a.error}`),(n.file==null||n.file===``)&&t.push(`Task "${e.id}" (${e.name}): Write task requires "file" property to specify the output file path`),t}function Dt(t){e.i(`❌ Template validation failed:`,`error`),e.i(``,`error`);for(let n of t)e.i(` • ${n}`,`error`);e.i(``,`error`),e.i(`Please fix these errors before continuing.`,`error`)}function Ot(e,t=new Map){let n={};for(let r of e){let e=t.get(r.id);e!==void 0&&(n[r.id]=e)}return n}async function kt(t,n){if(t==null)return;if(typeof t!=`object`||!t||Array.isArray(t))return t;let r=t;if(r.type===`exec`){let t=r.value;if(typeof t!=`string`){e.i(`Variable "${n}": exec value must have a string command`,`error`);return}try{let e=(0,a.execSync)(t,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(e.startsWith(`{`)||e.startsWith(`[`))try{return JSON.parse(e)}catch{return e}if(/^-?\d+(?:\.\d+)?$/u.test(e)){let t=Number.parseFloat(e);if(!Number.isNaN(t))return t}return e===`true`||e===`false`?e===`true`:e}catch(t){e.i(`Variable "${n}": failed to execute command: ${t instanceof Error?t.message:`Unknown error`}`,`warn`);return}}else if(r.type===`static`)return r.value;return t}async function At(e){let t=new Map,n=e.map(async e=>{let t=await kt(e.value,e.id);return{id:e.id,value:t}}),r=await Promise.all(n);for(let e of r)e.value!==void 0&&t.set(e.id,e.value);return t}function jt(e){let t=[],n=new Set;for(let r of e)if(n.has(r.id)&&t.push(`Duplicate variable ID: "${r.id}"`),n.add(r.id),/^[a-zA-Z_$][a-zA-Z0-9_$]*$/u.test(r.id)||t.push(`Variable ID "${r.id}" is invalid. Must be a valid JavaScript identifier (start with letter, underscore, or $, followed by letters, digits, underscores, or $).`),r.value===void 0||r.value===null)t.push(`Variable "${r.id}" must have a value`);else if(typeof r.value==`object`&&!Array.isArray(r.value)&&r.value!==null){let e=r.value;e.type==null||e.type===``?t.push(`Variable "${r.id}": value object must have a "type" field ("static" or "exec")`):e.type!==`static`&&e.type!==`exec`&&t.push(`Variable "${r.id}": type must be "static" or "exec", got "${e.type}"`),(e.value===void 0||e.value===null)&&t.push(`Variable "${r.id}": value config must have a "value" field`),e.type===`exec`&&typeof e.value!=`string`&&t.push(`Variable "${r.id}": exec type must have a string command as value`)}return t}async function Mt(t,n){Q(),e.i(`Validating task configurations...`,`info`);let i=Tt(t);i.length>0&&(Dt(i),r.default.exit(1)),e.i(`✓ All tasks validated successfully`,`success`);let a=t.filter(t=>e.c(t.enabled,s(),{lazy:!0}));e.i(`Resolving task dependencies...`,`info`);let o=wt(a);e.i(`Welcome! Let's execute your tasks.`,`info`),n.dryRun&&e.i(`🔍 DRY RUN MODE - No changes will be made`,`warn`),e.i(`This will execute your project tasks based on the defined configuration.`,`info`);let c=s(),l=n.globalVariables??[],u=[],d=[...l];for(let e of o)if(e.variables&&e.variables.length>0)for(let t of e.variables)u.push(t),d.push(t);if(d.length>0){let t=jt(d);t.length>0&&(e.i(`❌ Variable validation errors:`,`error`),t.forEach(t=>e.i(` - ${t}`,`error`)),r.default.exit(1)),e.i(`Resolving variable values...`,`info`);let n=Ot(d,await At(d));Object.assign(c,n),Object.keys(n).length>0&&e.i(`✓ Resolved ${Object.keys(n).length} variable(s)`,`success`)}let f=n.globalPrompts??[],p=[],m=[...f];for(let e of o)if(e.prompts&&e.prompts.length>0)for(let t of e.prompts)p.push(t),m.push(t);if(m.length>0){let t=De(m);t.length>0&&(e.i(`❌ Prompt validation errors:`,`error`),t.forEach(t=>e.i(` - ${t}`,`error`)),r.default.exit(1)),e.i(`Resolving prompt default values...`,`info`);let n=await Ee(m),i={};if(f.length>0&&(e.i(`📋 Top-level prompts (available to all tasks):`,`info`),i=await Z(f,n,c),Object.assign(c,i)),p.length>0){f.length>0&&e.i(`📋 Task-specific prompts:`,`info`);let t=await Z(p,n,c);Object.assign(c,t)}}let h=o.filter(t=>e.c(t.enabled,c));if(e.i(`${h.length} of ${o.length} task(s) enabled for execution`,`info`),n.dryRun){await V(h,c),e.i(`🔍 Dry run completed - no changes were made`,`info`),e.i(`Run without --dry-run to apply changes`,`info`);return}e.i(`Starting task execution...`,`info`),await J(`beforeAll`,c);let g=h.length,_=0,v=0,y=[];for(let t=0;t<h.length;t++){let r=h[t];if(r!=null)if(await J(`beforeTask`,r,c),await Ct(r,c,t+1,g,n.dryRun))_++,y.push(r.id),await J(`afterTask`,r,c);else if(r.required??!0){v++,await J(`onError`,Error(`Task ${r.name} failed`),r);break}else e.i(`⚠️ Non-critical task failed, continuing...`,`warn`),await J(`onError`,Error(`Task ${r.name} failed`),r)}v>0&&(e.i(`❌ Task execution failed with ${v} critical error(s)`,`error`),e.i(`✓ Completed: ${_}/${g} tasks`,`info`),r.default.exit(1)),await J(`afterAll`,c),e.i(`✅ All tasks completed successfully!`,`success`),e.i(`✓ Completed: ${_}/${g} tasks`,`success`)}const Nt=r.default.argv.includes(`--dry-run`),$=r.default.argv.includes(`--force`);async function Pt(t){try{let n=t||[];n.length===0&&(e.i(`⚠️ No tasks defined. Use --tasks-file to specify tasks or call runWithTasks() programmatically.`,`warn`),e.i(`Example: scaffoldfy --tasks-file ./tasks.json`,`info`),r.default.exit(1)),await Mt(n,{dryRun:Nt,force:$,tasksFilePath:void 0})}catch(t){e.i(`❌ Task execution failed`,`error`),t instanceof Error?(e.i(`Error: ${t.message}`,`error`),r.default.env.DEBUG!=null&&console.error(t.stack)):console.error(t),r.default.exit(1)}}async function Ft(t,n){try{await Mt(t,{dryRun:n?.dryRun??Nt,force:n?.force??$,tasksFilePath:n?.tasksFilePath??void 0,...n?.globalVariables!=null&&{globalVariables:n.globalVariables},...n?.globalPrompts!=null&&{globalPrompts:n.globalPrompts}})}catch(t){e.i(`❌ Task execution failed`,`error`),t instanceof Error?(e.i(`Error: ${t.message}`,`error`),r.default.env.DEBUG!=null&&console.error(t.stack)):console.error(t),r.default.exit(1)}}Object.defineProperty(exports,`A`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`B`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`C`,{enumerable:!0,get:function(){return be}}),Object.defineProperty(exports,`D`,{enumerable:!0,get:function(){return we}}),Object.defineProperty(exports,`E`,{enumerable:!0,get:function(){return ve}}),Object.defineProperty(exports,`F`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`G`,{enumerable:!0,get:function(){return se}}),Object.defineProperty(exports,`H`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`I`,{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,`J`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`K`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`L`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`M`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`N`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`O`,{enumerable:!0,get:function(){return V}}),Object.defineProperty(exports,`P`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`R`,{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`T`,{enumerable:!0,get:function(){return G}}),Object.defineProperty(exports,`U`,{enumerable:!0,get:function(){return le}}),Object.defineProperty(exports,`V`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`W`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`Y`,{enumerable:!0,get:function(){return re}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return Te}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return kt}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return K}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return St}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return De}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return Ee}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return xe}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return At}}),Object.defineProperty(exports,`j`,{enumerable:!0,get:function(){return z}}),Object.defineProperty(exports,`k`,{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return Q}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return Ft}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return Ot}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return Z}}),Object.defineProperty(exports,`q`,{enumerable:!0,get:function(){return ce}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return jt}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return wt}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return Pt}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return Ct}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return Y}}),Object.defineProperty(exports,`w`,{enumerable:!0,get:function(){return Se}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return Ce}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return ye}}),Object.defineProperty(exports,`z`,{enumerable:!0,get:function(){return ue}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e,c as t,i as n,n as r,o as i,r as a,s as o,t as s}from"./utils-CGdE7wLi.js";export{s as evaluateCondition,t as evaluateEnabled,r as getGitRepoInfo,a as interpolateTemplate,n as log,e as prompt,i as promptYesNo,o as setNestedProperty};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import e from"node:path";import t from"node:fs";import n from"node:process";import{execSync as r}from"node:child_process";import i from"node:readline";import"handlebars";var a=class extends Error{constructor(e,t){super(e),this.code=t,this.name=this.constructor.name}},o=class e extends a{constructor(e,t,n){super(e,`CIRCULAR_DEPENDENCY`),this.dependencyChain=t,this.resolvedPath=n,this.name=`CircularDependencyError`}static forTemplateInheritance(t,n){let r=Array.from(t);return new e(`Circular dependency detected: ${r.join(` -> `)} -> ${n}`,r,n)}static forTaskDependency(t){return new e(`Circular dependency detected involving task: ${t}`,[t])}},s=class e extends a{constructor(e,t){super(e,`TEMPLATE_FILE_NOT_FOUND`),this.filePath=t,this.name=`TemplateFileNotFoundError`}static forPath(t){return new e(`Template file not found: ${t}`,t)}},c=class e extends a{constructor(e,t,n){super(e,`TEMPLATE_RESOLUTION_ERROR`),this.templateFilePath=t,this.sourceUrl=n,this.name=`TemplateResolutionError`}static forRemoteTemplate(t,n){return new e(`Failed to resolve templateFile "${t}" relative to remote template "${n}"`,t,n)}},l=class e extends a{constructor(e,t,n){super(e,`TEMPLATE_FETCH_ERROR`),this.url=t,this.originalError=n,this.name=`TemplateFetchError`}static forUrl(t,n,r){return typeof n==`number`?new e(`Failed to fetch template from ${t}: ${n} ${r??``}`.trim(),t):new e(`Failed to fetch template from ${t}: ${n?.message??String(n??`Unknown error`)}`,t,n)}},u=class e extends a{constructor(e,t,n){super(e,`TEMPLATE_PARSE_ERROR`),this.filePath=t,this.originalError=n,this.name=`TemplateParseError`}static forFile(t,n){return new e(`Failed to parse template file ${t}: ${n.message}`,t,n)}},d=class e extends a{constructor(e,t){super(e,`INVALID_TEMPLATE`),this.filePath=t,this.name=`InvalidTemplateError`}static forFile(t,n){return new e(`Invalid template file ${t}: ${n}`,t)}static tasksNotArray(t){return new e(`Invalid template file ${t}: 'tasks' must be an array if provided`,t)}static missingName(t){return new e(`Invalid template file ${t}: 'name' field is required`,t)}static invalidNameFormat(t,n){return new e(`Invalid template file ${t}: 'name' field "${n}" must contain only lowercase letters, digits, and hyphens. It cannot start or end with a hyphen, and cannot contain consecutive hyphens.`,t)}};function f(e,t,n){return e===void 0?!0:typeof e==`boolean`?e:typeof e==`string`?y(e,t,n?.lazy===!0?{lazy:!0}:void 0):typeof e==`object`&&`condition`in e?y(e.condition,t,n?.lazy===!0?{lazy:!0}:void 0):!1}function p(){try{let e=r(`git remote get-url origin`,{encoding:`utf-8`}).trim(),t=e.match(/github\.com[:/](?<owner>[^/]+)\/(?<name>[^/]+)$/u);if(t?.groups){let{owner:n,name:r}=t.groups,i=r;return i.endsWith(`.git`)&&(i=i.slice(0,-4)),{owner:n,name:i,url:e}}return null}catch{return null}}async function m(e,t){let r=i.createInterface({input:n.stdin,output:n.stdout});return new Promise(n=>{let i;i=t==null?`${e}: `:`${e} (${t}): `,r.question(i,e=>{r.close(),n(e.trim()||(t??``))})})}async function h(e,t=!1){return m(`${e} (${t?`Y/n`:`y/N`})`,t?`y`:`n`).then(e=>e.toLowerCase()===`y`||e.toLowerCase()===`yes`)}function g(e,t=`info`){console.log(`${{info:`\x1B[36m`,success:`\x1B[32m`,error:`\x1B[31m`,warn:`\x1B[33m`}[t]}${{info:`ℹ`,success:`✓`,error:`✗`,warn:`⚠`}[t]} ${e}[0m`)}function _(e,t){return e.replace(/\{\{(?<key>\w+)\}\}/gu,(e,n)=>t[n]?.toString()??``)}function v(e,t,n){let r=t.split(`.`),i=e;for(let e=0;e<r.length-1;e++){let t=r[e];t!=null&&t!==``&&((!(t in i)||typeof i[t]!=`object`||i[t]===null)&&(i[t]={}),i=i[t])}let a=r[r.length-1];a!=null&&a!==``&&(i[a]=n)}function y(e,t,n){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch(t){return n?.lazy===!0&&t instanceof ReferenceError?!0:(n?.silent!==!0&&(g(`Failed to evaluate condition: ${e}`,`warn`),t instanceof Error&&g(` Error: ${t.message}`,`warn`)),!1)}}export{m as a,f as c,s as d,u as f,a as h,g as i,d as l,o as m,p as n,h as o,c as p,_ as r,v as s,y as t,l as u};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`node:fs`);c=s(c);let l=require(`node:path`);l=s(l);let u=require(`node:process`);u=s(u);let d=require(`node:child_process`);d=s(d);let f=require(`node:readline`);f=s(f),require(`handlebars`);var p=class extends Error{constructor(e,t){super(e),this.code=t,this.name=this.constructor.name}},m=class e extends p{constructor(e,t,n){super(e,`CIRCULAR_DEPENDENCY`),this.dependencyChain=t,this.resolvedPath=n,this.name=`CircularDependencyError`}static forTemplateInheritance(t,n){let r=Array.from(t);return new e(`Circular dependency detected: ${r.join(` -> `)} -> ${n}`,r,n)}static forTaskDependency(t){return new e(`Circular dependency detected involving task: ${t}`,[t])}},h=class e extends p{constructor(e,t){super(e,`TEMPLATE_FILE_NOT_FOUND`),this.filePath=t,this.name=`TemplateFileNotFoundError`}static forPath(t){return new e(`Template file not found: ${t}`,t)}},g=class e extends p{constructor(e,t,n){super(e,`TEMPLATE_RESOLUTION_ERROR`),this.templateFilePath=t,this.sourceUrl=n,this.name=`TemplateResolutionError`}static forRemoteTemplate(t,n){return new e(`Failed to resolve templateFile "${t}" relative to remote template "${n}"`,t,n)}},_=class e extends p{constructor(e,t,n){super(e,`TEMPLATE_FETCH_ERROR`),this.url=t,this.originalError=n,this.name=`TemplateFetchError`}static forUrl(t,n,r){return typeof n==`number`?new e(`Failed to fetch template from ${t}: ${n} ${r??``}`.trim(),t):new e(`Failed to fetch template from ${t}: ${n?.message??String(n??`Unknown error`)}`,t,n)}},v=class e extends p{constructor(e,t,n){super(e,`TEMPLATE_PARSE_ERROR`),this.filePath=t,this.originalError=n,this.name=`TemplateParseError`}static forFile(t,n){return new e(`Failed to parse template file ${t}: ${n.message}`,t,n)}},y=class e extends p{constructor(e,t){super(e,`INVALID_TEMPLATE`),this.filePath=t,this.name=`InvalidTemplateError`}static forFile(t,n){return new e(`Invalid template file ${t}: ${n}`,t)}static tasksNotArray(t){return new e(`Invalid template file ${t}: 'tasks' must be an array if provided`,t)}static missingName(t){return new e(`Invalid template file ${t}: 'name' field is required`,t)}static invalidNameFormat(t,n){return new e(`Invalid template file ${t}: 'name' field "${n}" must contain only lowercase letters, digits, and hyphens. It cannot start or end with a hyphen, and cannot contain consecutive hyphens.`,t)}};function b(e,t,n){return e===void 0?!0:typeof e==`boolean`?e:typeof e==`string`?D(e,t,n?.lazy===!0?{lazy:!0}:void 0):typeof e==`object`&&`condition`in e?D(e.condition,t,n?.lazy===!0?{lazy:!0}:void 0):!1}function x(){try{let e=(0,d.execSync)(`git remote get-url origin`,{encoding:`utf-8`}).trim(),t=e.match(/github\.com[:/](?<owner>[^/]+)\/(?<name>[^/]+)$/u);if(t?.groups){let{owner:n,name:r}=t.groups,i=r;return i.endsWith(`.git`)&&(i=i.slice(0,-4)),{owner:n,name:i,url:e}}return null}catch{return null}}async function S(e,t){let n=f.default.createInterface({input:u.default.stdin,output:u.default.stdout});return new Promise(r=>{let i;i=t==null?`${e}: `:`${e} (${t}): `,n.question(i,e=>{n.close(),r(e.trim()||(t??``))})})}async function C(e,t=!1){return S(`${e} (${t?`Y/n`:`y/N`})`,t?`y`:`n`).then(e=>e.toLowerCase()===`y`||e.toLowerCase()===`yes`)}function w(e,t=`info`){console.log(`${{info:`\x1B[36m`,success:`\x1B[32m`,error:`\x1B[31m`,warn:`\x1B[33m`}[t]}${{info:`ℹ`,success:`✓`,error:`✗`,warn:`⚠`}[t]} ${e}[0m`)}function T(e,t){return e.replace(/\{\{(?<key>\w+)\}\}/gu,(e,n)=>t[n]?.toString()??``)}function E(e,t,n){let r=t.split(`.`),i=e;for(let e=0;e<r.length-1;e++){let t=r[e];t!=null&&t!==``&&((!(t in i)||typeof i[t]!=`object`||i[t]===null)&&(i[t]={}),i=i[t])}let a=r[r.length-1];a!=null&&a!==``&&(i[a]=n)}function D(e,t,n){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch(t){return n?.lazy===!0&&t instanceof ReferenceError?!0:(n?.silent!==!0&&(w(`Failed to evaluate condition: ${e}`,`warn`),t instanceof Error&&w(` Error: ${t.message}`,`warn`)),!1)}}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return _}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require(`./utils-DvPgyPUm.cjs`);exports.evaluateCondition=e.t,exports.evaluateEnabled=e.c,exports.getGitRepoInfo=e.n,exports.interpolateTemplate=e.r,exports.log=e.i,exports.prompt=e.a,exports.promptYesNo=e.o,exports.setNestedProperty=e.s;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pixpilot/scaffoldfy",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.20.0",
|
|
5
5
|
"author": "PixPilot <m.doaie@hotmail.com>",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
@@ -48,10 +48,10 @@
|
|
|
48
48
|
"tsdown": "^0.15.8",
|
|
49
49
|
"typescript": "^5.9.3",
|
|
50
50
|
"@internal/eslint-config": "0.3.0",
|
|
51
|
-
"@internal/
|
|
51
|
+
"@internal/prettier-config": "0.0.1",
|
|
52
52
|
"@internal/tsconfig": "0.1.0",
|
|
53
|
-
"@internal/
|
|
54
|
-
"@internal/
|
|
53
|
+
"@internal/tsdown-config": "0.1.0",
|
|
54
|
+
"@internal/vitest-config": "0.1.0"
|
|
55
55
|
},
|
|
56
56
|
"prettier": "@internal/prettier-config",
|
|
57
57
|
"scripts": {
|
package/schema/tasks.schema.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
-
"title": "
|
|
4
|
-
"description": "Configuration for
|
|
3
|
+
"title": "Write Tasks Configuration",
|
|
4
|
+
"description": "Configuration for Write task automation and cleanup",
|
|
5
5
|
"type": "object",
|
|
6
6
|
"required": ["$schema", "name"],
|
|
7
7
|
"additionalProperties": false,
|
|
@@ -17,28 +17,28 @@
|
|
|
17
17
|
},
|
|
18
18
|
"description": {
|
|
19
19
|
"type": "string",
|
|
20
|
-
"description": "Detailed description of what this
|
|
20
|
+
"description": "Detailed description of what this Write does"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
23
|
"type": "array",
|
|
24
24
|
"items": {
|
|
25
25
|
"type": "string"
|
|
26
26
|
},
|
|
27
|
-
"description": "Names or identifiers of other templates that this
|
|
27
|
+
"description": "Names or identifiers of other templates that this Write depends on"
|
|
28
28
|
},
|
|
29
29
|
"extends": {
|
|
30
|
-
"description": "Base
|
|
30
|
+
"description": "Base Write file(s) to extend from. Can be a local path or URL (http/https). Supports single path or array of paths.",
|
|
31
31
|
"oneOf": [
|
|
32
32
|
{
|
|
33
33
|
"type": "string",
|
|
34
|
-
"description": "Single base
|
|
34
|
+
"description": "Single base Write path or URL"
|
|
35
35
|
},
|
|
36
36
|
{
|
|
37
37
|
"type": "array",
|
|
38
38
|
"items": {
|
|
39
39
|
"type": "string"
|
|
40
40
|
},
|
|
41
|
-
"description": "Array of base
|
|
41
|
+
"description": "Array of base Write paths or URLs"
|
|
42
42
|
}
|
|
43
43
|
]
|
|
44
44
|
},
|
|
@@ -110,7 +110,7 @@
|
|
|
110
110
|
"type": "string",
|
|
111
111
|
"enum": [
|
|
112
112
|
"update-json",
|
|
113
|
-
"
|
|
113
|
+
"write",
|
|
114
114
|
"create",
|
|
115
115
|
"regex-replace",
|
|
116
116
|
"replace-in-file",
|
|
@@ -135,8 +135,8 @@
|
|
|
135
135
|
},
|
|
136
136
|
{
|
|
137
137
|
"properties": {
|
|
138
|
-
"type": { "const": "
|
|
139
|
-
"config": { "$ref": "#/$defs/config-
|
|
138
|
+
"type": { "const": "write" },
|
|
139
|
+
"config": { "$ref": "#/$defs/config-write" }
|
|
140
140
|
}
|
|
141
141
|
},
|
|
142
142
|
{
|
|
@@ -269,10 +269,10 @@
|
|
|
269
269
|
"description": "JavaScript expression to evaluate. Can reference variables, prompts, and config values."
|
|
270
270
|
},
|
|
271
271
|
"ifTrue": {
|
|
272
|
-
"description": "Value to use if condition evaluates to true. Can be a static value or a
|
|
272
|
+
"description": "Value to use if condition evaluates to true. Can be a static value or a Write string with {{variables}}."
|
|
273
273
|
},
|
|
274
274
|
"ifFalse": {
|
|
275
|
-
"description": "Value to use if condition evaluates to false. Can be a static value or a
|
|
275
|
+
"description": "Value to use if condition evaluates to false. Can be a static value or a Write string with {{variables}}."
|
|
276
276
|
}
|
|
277
277
|
}
|
|
278
278
|
}
|
|
@@ -405,8 +405,8 @@
|
|
|
405
405
|
},
|
|
406
406
|
"required": ["file", "updates"]
|
|
407
407
|
},
|
|
408
|
-
"config-
|
|
409
|
-
"title": "
|
|
408
|
+
"config-write": {
|
|
409
|
+
"title": "Write Config",
|
|
410
410
|
"type": "object",
|
|
411
411
|
"additionalProperties": false,
|
|
412
412
|
"properties": {
|
|
@@ -446,13 +446,13 @@
|
|
|
446
446
|
"type": "string",
|
|
447
447
|
"description": "Path to the file to create (will not overwrite if file already exists)"
|
|
448
448
|
},
|
|
449
|
-
"
|
|
449
|
+
"write": {
|
|
450
450
|
"type": "string",
|
|
451
|
-
"description": "Inline
|
|
451
|
+
"description": "Inline Write string with {{variable}} placeholders. Cannot be used with templateFile."
|
|
452
452
|
},
|
|
453
453
|
"templateFile": {
|
|
454
454
|
"type": "string",
|
|
455
|
-
"description": "Path to external
|
|
455
|
+
"description": "Path to external Write file (relative to project root). Files with .hbs extension automatically use Handlebars templating. Cannot be used with template."
|
|
456
456
|
},
|
|
457
457
|
"condition": {
|
|
458
458
|
"type": "string",
|
|
@@ -462,7 +462,7 @@
|
|
|
462
462
|
"required": ["file"],
|
|
463
463
|
"oneOf": [
|
|
464
464
|
{
|
|
465
|
-
"required": ["
|
|
465
|
+
"required": ["write"]
|
|
466
466
|
},
|
|
467
467
|
{
|
|
468
468
|
"required": ["templateFile"]
|
package/dist/src-BWFVB-OE.cjs
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
const e=require(`./utils-BeLs5aXN.cjs`);let t=require(`node:fs`);t=e.v(t);let n=require(`node:path`);n=e.v(n);let r=require(`node:process`);r=e.v(r);let i=require(`node:util`);i=e.v(i);let a=require(`node:child_process`);a=e.v(a);let o=require(`@inquirer/prompts`);o=e.v(o);function s(){return{}}const c=(0,i.promisify)(t.default.readFile),l=2,u=10,d=55,f={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function p(e,t){switch(t){case`add`:return`${f.green}+ ${e}${f.reset}`;case`remove`:return`${f.red}- ${e}${f.reset}`;case`context`:return`${f.gray} ${e}${f.reset}`;default:return e}}function m(e,t){let n=e.split(`
|
|
2
|
-
`),r=t.split(`
|
|
3
|
-
`),i=[],a=Math.max(n.length,r.length);for(let e=0;e<a;e++){let t=n[e],a=r[e];t===a?t!==void 0&&i.push(p(t,`context`)):(t!==void 0&&i.push(p(t,`remove`)),a!==void 0&&i.push(p(a,`add`)))}return i}async function h(i,a){if(i.condition!=null&&i.condition!==``&&!e.r(i.condition,a))return`${f.yellow}⊘ Condition not met - task would be skipped${f.reset}`;let o=n.default.join(r.default.cwd(),i.file);if(!t.default.existsSync(o))return`${f.red}✗ File not found: ${i.file}${f.reset}`;try{let t=await c(o,`utf-8`),n=JSON.parse(t),r={...n};function s(t){if(typeof t==`string`)return e.a(t,a);if(Array.isArray(t))return t.map(e=>s(e));if(typeof t==`object`&&t){let e={};for(let[n,r]of Object.entries(t))e[n]=s(r);return e}return t}for(let[t,r]of Object.entries(i.updates)){let i=s(r);t.includes(`.`)?e.l(n,t,i):n[t]=i}let l=JSON.stringify(r,null,2),u=JSON.stringify(n,null,2);if(l===u)return`${f.cyan}→ No changes${f.reset}`;let d=m(l,u);return`${f.blue}File: ${i.file}${f.reset}\n${d.join(`
|
|
4
|
-
`)}`}catch(e){return`${f.red}✗ Error: ${e instanceof Error?e.message:String(e)}${f.reset}`}}async function g(i,a){if(i.condition!=null&&i.condition!==``&&!e.r(i.condition,a))return`${f.yellow}⊘ Condition not met - task would be skipped${f.reset}`;if(i.template==null||i.template===``)return`${f.red}✗ No template content provided for file: ${i.file}${f.reset}`;let o=n.default.join(r.default.cwd(),i.file),s=e.a(i.template,a);if(!t.default.existsSync(o)){let e=s.split(`
|
|
5
|
-
`).slice(0,10).join(`
|
|
6
|
-
`),t=s.split(`
|
|
7
|
-
`).length>10;return`${f.blue}File: ${i.file}${f.reset}\n${f.green}+ New file would be created${f.reset}\n${f.gray}Content preview:${f.reset}\n${e}${t?`
|
|
8
|
-
...`:``}`}try{let e=await c(o,`utf-8`);if(e===s)return`${f.cyan}→ No changes${f.reset}`;let t=m(e,s);return`${f.blue}File: ${i.file}${f.reset}\n${t.join(`
|
|
9
|
-
`)}`}catch(e){return`${f.red}✗ Error: ${e instanceof Error?e.message:String(e)}${f.reset}`}}async function _(i,a){if(i.condition!=null&&i.condition!==``&&!e.r(i.condition,a))return`${f.yellow}⊘ Condition not met - task would be skipped${f.reset}`;let o=n.default.join(r.default.cwd(),i.file);if(t.default.existsSync(o))return`${f.cyan}→ File already exists, would be skipped: ${i.file}${f.reset}`;let s=i.template!=null&&i.template!==``,c=i.templateFile!=null&&i.templateFile!==``;if(!s&&!c)return`${f.red}✗ No template content provided for file: ${i.file}${f.reset}`;try{let t;if(s)t=e.a(i.template,a);else return`${f.blue}File: ${i.file}${f.reset}\n${f.green}+ New file would be created from template: ${i.templateFile}${f.reset}`;let n=t.split(`
|
|
10
|
-
`).slice(0,10).join(`
|
|
11
|
-
`),r=t.split(`
|
|
12
|
-
`).length>10;return`${f.blue}File: ${i.file}${f.reset}\n${f.green}+ New file would be created${f.reset}\n${f.gray}Content preview:${f.reset}\n${n}${r?`
|
|
13
|
-
...`:``}`}catch(e){return`${f.red}✗ Error: ${e instanceof Error?e.message:String(e)}${f.reset}`}}async function v(i,a){if(i.condition!=null&&i.condition!==``&&!e.r(i.condition,a))return`${f.yellow}⊘ Condition not met - task would be skipped${f.reset}`;let o=n.default.join(r.default.cwd(),i.file);if(!t.default.existsSync(o))return`${f.red}✗ File not found: ${i.file}${f.reset}`;try{let t=await c(o,`utf-8`),n=new RegExp(i.pattern,i.flags??`g`),r=e.a(i.replacement,a),s=t.replace(n,r);if(t===s)return`${f.cyan}→ No matches found${f.reset}`;let l=m(t,s);return`${f.blue}File: ${i.file}${f.reset}\n${l.join(`
|
|
14
|
-
`)}`}catch(e){return`${f.red}✗ Error: ${e instanceof Error?e.message:String(e)}${f.reset}`}}async function y(i,a){if(i.condition!=null&&i.condition!==``&&!e.r(i.condition,a))return`${f.yellow}⊘ Condition not met - task would be skipped${f.reset}`;let o=n.default.join(r.default.cwd(),i.file);if(!t.default.existsSync(o))return`${f.red}✗ File not found: ${i.file}${f.reset}`;try{let t=await c(o,`utf-8`),n=t;for(let{find:n,replace:r}of i.replacements){let i=e.a(n,a),o=e.a(r,a);t=t.replace(i,o)}if(n===t)return`${f.cyan}→ No changes${f.reset}`;let r=m(n,t);return`${f.blue}File: ${i.file}${f.reset}\n${r.join(`
|
|
15
|
-
`)}`}catch(e){return`${f.red}✗ Error: ${e instanceof Error?e.message:String(e)}${f.reset}`}}function ee(i,a){if(i.condition!=null&&i.condition!==``&&!e.r(i.condition,a))return`${f.yellow}⊘ Condition not met - task would be skipped${f.reset}`;let o=i.paths.map(t=>e.a(t,a)).filter(e=>t.default.existsSync(n.default.join(r.default.cwd(),e)));return o.length===0?`${f.cyan}→ No files/directories to delete${f.reset}`:`${f.red}Would delete:${f.reset}\n${o.map(e=>`${f.red} - ${e}${f.reset}`).join(`
|
|
16
|
-
`)}`}function b(i,a){if(i.condition!=null&&i.condition!==``&&!e.r(i.condition,a))return`${f.yellow}⊘ Condition not met - task would be skipped${f.reset}`;let o=e.a(i.from,a),s=e.a(i.to,a),c=n.default.join(r.default.cwd(),o),l=n.default.join(r.default.cwd(),s);return t.default.existsSync(c)?t.default.existsSync(l)?`${f.yellow}⚠ Destination already exists: ${s}${f.reset}\n${f.cyan}Would rename: ${o} → ${s}${f.reset}`:`${f.cyan}Would rename: ${o} → ${s}${f.reset}`:`${f.red}✗ Source not found: ${o}${f.reset}`}function x(e){if(e.condition!=null&&e.condition!==``)return`${f.yellow}⊘ Condition check skipped in dry-run${f.reset}`;let i=n.default.join(r.default.cwd(),`.git`),a=t.default.existsSync(i),o=[];if(e.removeExisting&&a&&o.push(`${f.red}Would remove existing .git directory${f.reset}`),o.push(`${f.green}Would initialize git repository${f.reset}`),e.initialCommit){let t=e.message??`Initial commit`;o.push(`${f.green}Would create initial commit: "${t}"${f.reset}`)}return o.join(`
|
|
17
|
-
`)}function S(t,n){if(t.condition!=null&&t.condition!==``&&!e.r(t.condition,n))return`${f.yellow}⊘ Condition not met - task would be skipped${f.reset}`;let i=e.a(t.command,n),a=t.cwd==null?r.default.cwd():e.a(t.cwd,n);return`${f.yellow}Would execute:${f.reset}\n${f.cyan} Command: ${i}${f.reset}\n${f.cyan} Working directory: ${a}${f.reset}`}async function C(e,t){try{switch(e.type){case`update-json`:return await h(e.config,t);case`template`:return await g(e.config,t);case`create`:return await _(e.config,t);case`regex-replace`:return await v(e.config,t);case`replace-in-file`:return await y(e.config,t);case`delete`:return ee(e.config,t);case`rename`:return b(e.config,t);case`git-init`:return x(e.config);case`exec`:return S(e.config,t);default:{let t=e.type;return`${f.yellow}⚠ Diff not available for task type: ${t}${f.reset}`}}}catch(e){return`${f.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${f.reset}`}}async function w(e,t){console.log(`${f.blue}═══════════════════════════════════════════════════════${f.reset}`),console.log(`${f.blue} DRY RUN - Preview of changes${f.reset}`),console.log(`${f.blue}═══════════════════════════════════════════════════════${f.reset}`);for(let n of e){console.log(`${f.cyan}▶ Task: ${n.name}${f.reset}`),n.description!=null&&n.description!==``&&console.log(`${f.gray} ${n.description}${f.reset}`);let e=await C(n,t);console.log(e),console.log(`${f.gray}${`─`.repeat(55)}${f.reset}`)}console.log(`${f.blue}═══════════════════════════════════════════════════════${f.reset}`),console.log(`${f.yellow} No changes were applied (dry-run mode)${f.reset}`),console.log(`${f.blue}═══════════════════════════════════════════════════════${f.reset}`)}const T=new Map,E={},D=new Map;function O(t){if(t.name==null||t.name===``)throw TypeError(`Plugin name is required`);if(!Array.isArray(t.taskTypes)||t.taskTypes.length===0)throw TypeError(`Plugin ${t.name} must define at least one task type`);if(typeof t.execute!=`function`)throw TypeError(`Plugin ${t.name} must provide an execute function`);if(T.has(t.name))throw TypeError(`Plugin ${t.name} is already registered`);for(let e of t.taskTypes)if(D.has(e)){let t=D.get(e);throw TypeError(`Task type "${e}" is already registered by plugin "${t}"`)}T.set(t.name,t);for(let e of t.taskTypes)D.set(e,t.name);e.o(`✓ Registered plugin: ${t.name}${t.version==null?``:` v${t.version}`}`,`info`)}function te(e){let t=T.get(e);if(t!=null){for(let e of t.taskTypes)D.delete(e);T.delete(e)}}function ne(e){return T.get(e)}function k(e){let t=D.get(e);if(t!=null)return T.get(t)}function A(e){return D.has(e)}function re(){return Array.from(T.keys())}function ie(){T.clear(),D.clear()}function ae(e){e.beforeAll!=null&&(E.beforeAll=e.beforeAll),e.afterAll!=null&&(E.afterAll=e.afterAll),e.beforeTask!=null&&(E.beforeTask=e.beforeTask),e.afterTask!=null&&(E.afterTask=e.afterTask),e.onError!=null&&(E.onError=e.onError)}async function j(t,...n){let r=E[t];if(r!=null)try{t===`beforeAll`||t===`afterAll`?await r(n[0]):(t===`beforeTask`||t===`afterTask`||t===`onError`)&&await r(n[0],n[1])}catch(n){e.o(`Error in ${t} hook: ${n instanceof Error?n.message:String(n)}`,`error`)}}async function oe(e,t,n){let r=k(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}async function se(e,t){let n=k(e.type);if(!(n==null||n.getDiff==null))return n.getDiff(e,t)}function ce(e){let t=k(e.type);return t==null?[`No plugin found for task type: ${e.type}`]:t.validate==null?[]:t.validate(e)}function le(e,t,n,r){return{name:e,...r?.version!=null&&{version:r.version},taskTypes:[t],execute:n,...r?.getDiff!=null&&{getDiff:r.getDiff},...r?.validate!=null&&{validate:r.validate}}}var ue=class t extends e._{constructor(e,t){super(e,`TASK_NOT_FOUND`),this.taskId=t,this.name=`TaskNotFoundError`}static forId(e){return new t(`Task not found: ${e}`,e)}},M=class t extends e._{constructor(e,t,n){super(e,`PROMPT_VALIDATION_ERROR`),this.promptId=t,this.reason=n,this.name=`PromptValidationError`}static required(e){return new t(`Prompt "${e}" is required`,e,`required`)}static unknownType(e){return new t(`Unknown prompt type: ${e}`,e,`unknown_type`)}},N=class t extends e._{constructor(e,t,n){super(e,`PLUGIN_CONFIGURATION_ERROR`),this.pluginType=t,this.configIssue=n,this.name=`PluginConfigurationError`}static templateMissingTemplateOrFile(){return new t(`Template task requires either "template" (inline) or "templateFile" (file path) to be specified`,`template`,`missing_template_or_file`)}static templateHasBothTemplateAndFile(){return new t(`Template task cannot have both "template" and "templateFile" specified. Use one or the other.`,`template`,`both_template_and_file`)}static createMissingTemplateOrFile(){return new t(`Create task requires either "template" (inline) or "templateFile" (file path) to be specified`,`create`,`missing_template_or_file`)}static createHasBothTemplateAndFile(){return new t(`Create task cannot have both "template" and "templateFile" specified. Use one or the other.`,`create`,`both_template_and_file`)}};async function P(t,n,r){if(t===void 0)return;if(typeof t!=`object`||!t||Array.isArray(t))return typeof t==`string`&&r&&/\{\{\w+\}\}/u.test(t)?e.a(t,r):t;let i=t;if(i.type===`conditional`){if(!r)return;if(typeof i.condition!=`string`){e.o(`Prompt "${n}": conditional default must have a string condition`,`error`);return}try{let{evaluateCondition:t}=await Promise.resolve().then(()=>require(`./utils-zjkNe5C1.cjs`)),n=t(i.condition,r)?i.ifTrue:i.ifFalse;return typeof n==`string`&&/\{\{\w+\}\}/u.test(n)&&(n=e.a(n,r)),n}catch(t){e.o(`Prompt "${n}": failed to evaluate conditional default: ${t instanceof Error?t.message:`Unknown error`}`,`warn`);return}}if(i.type===`exec`){let t=i.value;if(typeof t!=`string`){e.o(`Prompt "${n}": exec default value must have a string command`,`error`);return}try{let e=(0,a.execSync)(t,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(e.startsWith(`{`)||e.startsWith(`[`))try{return JSON.parse(e)}catch{return e}if(/^-?\d+(?:\.\d+)?$/u.test(e)){let t=Number.parseFloat(e);if(!Number.isNaN(t))return t}return e===`true`||e===`false`?e===`true`:e}catch(t){e.o(`Prompt "${n}": failed to execute default value command: ${t instanceof Error?t.message:`Unknown error`}`,`warn`);return}}else if(i.type===`static`)return i.value;else if(i.type!==void 0){e.o(`Prompt "${n}": unknown default value type "${i.type}". Expected "static", "exec", or "conditional".`,`error`);return}return t}async function F(t,n=new Map,r={}){let i={};if(t.length===0)return i;for(let a of t){let t={...r,...i};if(e.u(a.enabled,t))try{let r,s=n.get(a.id);switch(a.default!==void 0&&(s=await P(a.default,a.id,t)),a.type){case`input`:{let t={message:a.message};if(s!==void 0&&(t.default=String(s)),a.required!==void 0&&(t.required=a.required),r=await(0,o.input)(t),a.required&&(r==null||typeof r==`string`&&r.trim()===``))throw e.o(`${a.message} is required`,`error`),M.required(a.id);break}case`password`:if(r=await(0,o.password)({message:a.message,mask:`*`}),a.required&&(r==null||typeof r==`string`&&r.trim()===``))throw e.o(`${a.message} is required`,`error`),M.required(a.id);break;case`number`:{let t={message:a.message};if(s!==void 0&&(t.default=Number(s)),a.required!==void 0&&(t.required=a.required),a.min!==void 0&&(t.min=a.min),a.max!==void 0&&(t.max=a.max),r=await(0,o.number)(t),a.required&&r==null)throw e.o(`${a.message} is required`,`error`),M.required(a.id);break}case`select`:{let e={message:a.message,choices:a.choices.map(e=>({name:e.name,value:e.value}))};s!==void 0&&(e.default=s),r=await(0,o.select)(e);break}case`confirm`:{let e=s===void 0?!1:!!s;r=await(0,o.confirm)({message:a.message,default:e});break}default:throw e.o(`Unknown prompt type: ${a.type}`,`error`),M.unknownType(a.type)}i[a.id]=r}catch(t){throw t instanceof Error&&e.o(`Failed to collect prompt "${a.id}": ${t.message}`,`error`),t}}return i}async function I(e){let t=new Map,n=e.map(async e=>{if(e.default!==void 0){let n=await P(e.default,e.id);n!==void 0&&t.set(e.id,n)}});return await Promise.all(n),t}function L(e){let t=[],n=new Set;for(let r of e){if(n.has(r.id)&&t.push(`Duplicate prompt ID: ${r.id}`),n.add(r.id),/^[a-zA-Z_$][a-zA-Z0-9_$]*$/u.test(r.id)||t.push(`Invalid prompt ID "${r.id}": must be a valid JavaScript identifier (start with letter, underscore, or $, followed by letters, digits, underscores, or $)`),(!r.message||r.message.trim()===``)&&t.push(`Prompt "${r.id}" must have a non-empty message`),r.type===`select`){r.choices.length===0&&t.push(`Select prompt "${r.id}" must have at least one choice`);for(let e of r.choices)(!e.name||e.name.trim()===``)&&t.push(`Select prompt "${r.id}" has a choice with empty name`),e.value===void 0&&t.push(`Select prompt "${r.id}" has a choice with undefined value`)}r.type===`number`&&r.min!==void 0&&r.max!==void 0&&r.min>r.max&&t.push(`Number prompt "${r.id}" has min greater than max`)}return t}const de=(0,i.promisify)(t.default.writeFile);async function fe(i,a){if(i.condition!=null&&i.condition!==``&&!e.r(i.condition,a)){e.o(`Condition not met, skipping create task`,`info`);return}let o=n.default.join(r.default.cwd(),i.file);if(t.default.existsSync(o)){e.o(`File already exists, skipping: ${i.file}`,`info`);return}let s=i.template!=null&&i.template!==``,c=i.templateFile!=null&&i.templateFile!==``;if(!s&&!c)throw N.createMissingTemplateOrFile();if(s&&c)throw N.createHasBothTemplateAndFile();let l;if(c&&i.templateFile.endsWith(`.hbs`))l=e.n(i.templateFile,a);else if(c){let o=i.templateFile,s=n.default.isAbsolute(o)?o:n.default.join(r.default.cwd(),o);if(!t.default.existsSync(s))throw e.p.forPath(o);l=e.a(t.default.readFileSync(s,`utf-8`),a)}else l=e.a(i.template,a);let u=n.default.dirname(o);t.default.existsSync(u)||t.default.mkdirSync(u,{recursive:!0}),await de(o,l),e.o(`Created file: ${i.file}`,`success`)}const pe={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await fe(e.config,t)}};async function me(i,a){let{paths:o,condition:s}=i;if(s!=null&&s!==``){if(!a){e.o(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!e.r(s,a)){e.o(`Condition not met, skipping deletion`,`info`);return}}for(let e of o){let i=n.default.join(r.default.cwd(),e);t.default.existsSync(i)&&t.default.rmSync(i,{recursive:!0,force:!0})}}const he={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await me(e.config,t)}};async function ge(t,i){if(t.condition!=null&&t.condition!==``){if(!i){e.o(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!e.r(t.condition,i)){e.o(`Condition not met, skipping exec task`,`info`);return}}let o=t.cwd==null?r.default.cwd():n.default.join(r.default.cwd(),t.cwd);(0,a.execSync)(t.command,{cwd:o,stdio:`inherit`})}const _e={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await ge(e.config,t)}};async function ve(i,o){if(i.condition!=null&&i.condition!==``){if(!o){e.o(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!e.r(i.condition,o)){e.o(`Condition not met, skipping git-init task`,`info`);return}}if(i.removeExisting){let e=n.default.join(r.default.cwd(),`.git`);t.default.existsSync(e)&&t.default.rmSync(e,{recursive:!0,force:!0})}if((0,a.execSync)(`git init`,{stdio:`inherit`}),i.initialCommit){let e=i.message??`Initial commit`;(0,a.execSync)(`git add .`,{stdio:`inherit`}),(0,a.execSync)(`git commit -m "${e}"`,{stdio:`inherit`})}}const ye={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await ve(e.config,t)}},be=(0,i.promisify)(t.default.readFile),xe=(0,i.promisify)(t.default.writeFile);async function Se(t,i){if(t.condition!=null&&t.condition!==``&&!e.r(t.condition,i)){e.o(`Condition not met, skipping regex-replace task`,`info`);return}let a=n.default.join(r.default.cwd(),t.file),{pattern:o}=t,s=t.flags??``,c=t.replacement||``,l=await be(a,`utf-8`),u=new RegExp(o,s);l=l.replace(u,e.a(c,i)),await xe(a,l)}const Ce={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await Se(e.config,t)}},we=(0,i.promisify)(t.default.rename);async function Te(i,a){if(i.condition!=null&&i.condition!==``&&!e.r(i.condition,a)){e.o(`Condition not met, skipping rename task`,`info`);return}let o=n.default.join(r.default.cwd(),e.a(i.from,a)),s=n.default.join(r.default.cwd(),e.a(i.to,a));if(!t.default.existsSync(o)){e.o(`Source path does not exist: ${o}`,`warn`);return}await we(o,s)}const Ee={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await Te(e.config,t)}},De=(0,i.promisify)(t.default.readFile),Oe=(0,i.promisify)(t.default.writeFile);async function ke(i,a){if(i.condition!=null&&i.condition!==``&&!e.r(i.condition,a)){e.o(`Condition not met, skipping replace-in-file task`,`info`);return}let o=n.default.join(r.default.cwd(),i.file),{replacements:s}=i;if(!t.default.existsSync(o)){e.o(`File not found: ${o}, skipping`,`warn`);return}let c=await De(o,`utf-8`);for(let{find:t,replace:n}of s){let r=e.a(n,a);c=c.replace(new RegExp(t,`gu`),r)}await Oe(o,c)}const Ae={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await ke(e.config,t)}};var R=class t extends e._{constructor(e,t,n,r){super(e,`DUPLICATE_ID`),this.id=t,this.type=n,this.existingType=r,this.name=`DuplicateIdError`}static forId(e,n,r){return new t(`Duplicate ID "${e}" found in ${n}. This ID is already used in ${r??`unknown`}`,e,n,r)}},z=class t extends e._{constructor(e,t,n,r,i){super(e,`ID_CONFLICT`),this.id=t,this.type=n,this.baseSource=r,this.overrideSource=i,this.name=`IdConflictError`}static forTask(e,n,r){return new t(`Task ID conflict: "${e}" is defined in multiple templates.\n Base task from: ${n??`unknown`}\n Override task from: ${r??`unknown`}\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the task.\n Task is being extended/overridden but no override strategy was specified.`,e,`task`,n,r)}static forVariable(e){return new t(`Variable ID conflict: "${e}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the variable.\n Variable is being extended/overridden but no override strategy was specified.`,e,`variable`)}static forPrompt(e){return new t(`Prompt ID conflict: "${e}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the prompt.\n Prompt is being extended/overridden but no override strategy was specified.`,e,`prompt`)}};const B=(0,i.promisify)(t.default.readFile),V={template:[[`template`,`templateFile`]]};function H(e){if(e==null||e===``)return`current template`;if(U(e))return e;let t=r.default.cwd();return e.startsWith(t)?n.default.relative(t,e):e}function U(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function je(t,i){if(U(t))return t;if(i==null||i===``)return n.default.isAbsolute(t)?t:n.default.resolve(r.default.cwd(),t);if(U(i))try{let e=new URL(`.`,i);return new URL(t,e).href}catch{throw e.h.forRemoteTemplate(t,i)}let a=n.default.dirname(i);return n.default.isAbsolute(t)?t:n.default.resolve(a,t)}async function W(n){if(U(n))return G(n);if(!t.default.existsSync(n))throw e.p.forPath(n);return B(n,`utf-8`)}async function G(t){try{let n=await fetch(t);if(!n.ok)throw e.f.forUrl(t,n.status,n.statusText);return await n.text()}catch(n){throw n instanceof Error&&n.message.includes(`Failed to fetch`)?n:e.f.forUrl(t,n instanceof Error?n:void 0)}}const K=new Map;async function q(i,a=new Set){let o=U(i),s;if(s=o||n.default.isAbsolute(i)?i:n.default.resolve(r.default.cwd(),i),K.has(s))return K.get(s);if(a.has(s))throw e.g.forTemplateInheritance(a,s);a.add(s);let c;if(o)c=await G(s);else{if(!t.default.existsSync(s))throw e.p.forPath(s);c=await B(s,`utf-8`)}let l;try{l=JSON.parse(c)}catch(t){throw e.m.forFile(s,t instanceof Error?t:Error(String(t)))}if(l.name==null||l.name.trim()===``)throw e.d.missingName(s);if(!/^[a-z\d]+(?:-[a-z\d]+)*$/u.test(l.name))throw e.d.invalidNameFormat(s,l.name);if(l.tasks!==void 0&&!Array.isArray(l.tasks))throw e.d.tasksNotArray(s);l.tasks===void 0&&(l.tasks=[]);for(let e of l.tasks)e.$sourceUrl=s;return K.set(s,l),l}async function J(t,i,a=new Set){let o=U(t),s;if(s=o||n.default.isAbsolute(t)?t:i==null?n.default.resolve(r.default.cwd(),t):U(i)?new URL(t,i).href:n.default.resolve(i,t),a.has(s))throw e.g.forTemplateInheritance(a,s);a.add(s);let c=await q(s);if(c.extends==null||c.extends===``)return c;let l=U(s)?new URL(`.`,s).href:n.default.dirname(s),u=Array.isArray(c.extends)?c.extends:[c.extends],d=[];for(let e of u){let t=await J(e,l,a);d.push(t)}return X([...d,c])}function Y(e,t,n){let r=new Map;for(let t of e){if(r.has(t.id))throw R.forId(t.id,`task`,r.get(t.id));r.set(t.id,`task`)}if(t!=null)for(let e of t){if(r.has(e.id))throw R.forId(e.id,`variable`,r.get(e.id));r.set(e.id,`variable`)}if(n!=null)for(let e of n){if(r.has(e.id))throw R.forId(e.id,`prompt`,r.get(e.id));r.set(e.id,`prompt`)}}function Me(t,n){if((n.override??`merge`)===`replace`){e.o(` → Variable "${n.id}" using 'replace' strategy`,`info`);let{override:t,...r}=n;return r}e.o(` → Variable "${n.id}" merged (value replaced)`,`info`);let r={...t,...n};return delete r.override,r}function Ne(t,n){if((n.override??`merge`)===`replace`){e.o(` → Prompt "${n.id}" using 'replace' strategy`,`info`);let{override:t,...r}=n;return r}e.o(` → Prompt "${n.id}" merged`,`info`);let r={...t,...n};return delete r.override,r}function X(e){if(e.length===0)return{name:`Empty Template`,tasks:[]};if(e.length===1){let t=e[0];return Y(t.tasks??[],t.variables,t.prompts),t}let t=new Map,n=new Map,r=new Map;for(let i of e){if(i.prompts!=null)for(let e of i.prompts)if(r.has(e.id)){if(e.override==null)throw z.forPrompt(e.id);let t=r.get(e.id);r.set(e.id,Ne(t,e))}else r.set(e.id,{...e});if(i.variables!=null)for(let e of i.variables)if(n.has(e.id)){if(e.override==null)throw z.forVariable(e.id);let t=n.get(e.id);n.set(e.id,Me(t,e))}else n.set(e.id,{...e});for(let e of i.tasks??[])if(t.has(e.id)){if(e.override==null){let n=t.get(e.id);throw z.forTask(e.id,H(n.$sourceUrl),H(e.$sourceUrl))}let n=t.get(e.id);t.set(e.id,Ie(n,e))}else t.set(e.id,{...e})}let i=Array.from(t.values()),a=r.size>0?Array.from(r.values()):void 0,o=n.size>0?Array.from(n.values()):void 0;Y(i,o,a);let s=e[e.length-1],c={name:s.name,tasks:i};return s.description!=null&&(c.description=s.description),s.dependencies!=null&&(c.dependencies=s.dependencies),a!=null&&(c.prompts=a),o!=null&&(c.variables=o),c}function Pe(e,t){let n=V[e];if(!n)return null;for(let e of n){let n=e.filter(e=>e in t&&t[e]!=null);if(n.length>1)return n}return null}function Fe(e,t,n){let r={...e},i=V[n]??[];for(let[e,n]of Object.entries(t)){for(let t of i)if(t.includes(e)){for(let n of t)n!==e&&delete r[n];break}r[e]=n}return r}function Ie(t,n){if((n.override??`merge`)===`replace`){e.o(` → Task "${n.id}" using 'replace' strategy - completely replacing base task`,`info`),e.o(` Base: ${H(t.$sourceUrl)}`,`info`),e.o(` Override: ${H(n.$sourceUrl)}`,`info`);let{override:r,...i}=n;return i}e.o(` → Merging task "${n.id}"`,`info`),e.o(` Base: ${H(t.$sourceUrl)}`,`info`),e.o(` Override: ${H(n.$sourceUrl)}`,`info`);let r;if(typeof t.config==`object`&&t.config!==null&&typeof n.config==`object`&&n.config!==null){r=Fe(t.config,n.config,n.type);let i=Pe(n.type,r);i!==null&&i.length>0&&(e.o(` ⚠️ Warning: Conflicting config fields detected: ${i.join(`, `)}`,`warn`),e.o(` Please use override: "replace" or specify only one of these fields`,`warn`))}else r=n.config??t.config;let i=t.prompts?[...t.prompts]:void 0;if(n.prompts&&n.prompts.length>0)if(!i)i=[...n.prompts];else{let e=new Map(i.map(e=>[e.id,e]));for(let t of n.prompts)e.set(t.id,t);i=Array.from(e.values())}let a=t.variables?[...t.variables]:void 0;if(n.variables&&n.variables.length>0)if(!a)a=[...n.variables];else{let e=new Map(a.map(e=>[e.id,e]));for(let t of n.variables)e.set(t.id,t);a=Array.from(e.values())}let o=[...t.dependencies??[],...n.dependencies??[]],s=o.length>0?[...new Set(o)]:void 0,c=n.$sourceUrl??t.$sourceUrl,l={...t,...n,config:r,...i!=null&&{prompts:i},...a!=null&&{variables:a},...s!=null&&{dependencies:s},...c!=null&&{$sourceUrl:c}};return delete l.override,l}function Le(){K.clear()}async function Re(t){e.o(`Loading tasks from ${t}...`,`info`);let n=await J(t);e.o(`Loaded ${n.tasks?.length??0} task(s)`,`info`),n.extends!=null&&n.extends!==``&&e.o(`Extended from: ${(Array.isArray(n.extends)?n.extends:[n.extends]).join(`, `)}`,`info`),n.prompts!=null&&n.prompts.length>0&&e.o(`Found ${n.prompts.length} top-level prompt(s)`,`info`),n.variables!=null&&n.variables.length>0&&e.o(`Found ${n.variables.length} top-level variable(s)`,`info`);let r={tasks:n.tasks??[]};return n.prompts!=null&&(r.prompts=n.prompts),n.variables!=null&&(r.variables=n.variables),r}const ze=(0,i.promisify)(t.default.writeFile);async function Be(t,i,a){if(t.condition!=null&&t.condition!==``&&!e.r(t.condition,i)){e.o(`Condition not met, skipping template task`,`info`);return}let o=n.default.join(r.default.cwd(),t.file),s=t.template!=null&&t.template!==``,c=t.templateFile!=null&&t.templateFile!==``;if(!s&&!c)throw N.templateMissingTemplateOrFile();if(s&&c)throw N.templateHasBothTemplateAndFile();let l;if(c&&t.templateFile.endsWith(`.hbs`)){let e=await W(je(t.templateFile,a?.$sourceUrl));l=(await import(`handlebars`)).default.compile(e)(i)}else l=c?e.a(await W(je(t.templateFile,a?.$sourceUrl)),i):e.a(t.template,i);await ze(o,l)}const Ve={name:`template`,version:`1.0.0`,taskTypes:[`template`],execute:async(e,t,n)=>{n.dryRun||await Be(e.config,t,e)}},He=(0,i.promisify)(t.default.readFile),Ue=(0,i.promisify)(t.default.writeFile),We=2;async function Ge(t,i){if(t.condition!=null&&t.condition!==``&&!e.r(t.condition,i)){e.o(`Condition not met, skipping update-json task`,`info`);return}let a=n.default.join(r.default.cwd(),t.file),{updates:o}=t,s=await He(a,`utf-8`),c=JSON.parse(s);function l(t){if(typeof t==`string`)return e.a(t,i);if(Array.isArray(t))return t.map(e=>l(e));if(typeof t==`object`&&t){let e={};for(let[n,r]of Object.entries(t))e[n]=l(r);return e}return t}for(let[t,n]of Object.entries(o)){let r=l(n);t.includes(`.`)?e.l(c,t,r):c[t]=r}await Ue(a,`${JSON.stringify(c,null,2)}\n`)}const Ke={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await Ge(e.config,t)}};function Z(){A(`update-json`)||(O(Ke),O(Ve),O(pe),O(Ce),O(Ae),O(he),O(Ee),O(ye),O(_e))}async function qe(t,n,r=!1){if(Z(),r){e.o(`[DRY RUN] Would execute: ${t.name}`,`info`);return}if(A(t.type)){await oe(t,n,{dryRun:r});return}throw TypeError(`Unknown task type: ${t.type}`)}async function Je(t,n,i,a,o=!1){try{return e.o(`[${i}/${a}] Running: ${t.name}...`,`info`),await qe(t,n,o),e.o(`✓ ${t.name}`,`success`),!0}catch(n){return e.o(`✗ Failed: ${t.name}`,`error`),n instanceof Error&&(e.o(` Reason: ${n.message}`,`error`),n.stack!=null&&r.default.env.DEBUG!=null&&console.error(n.stack)),(t.required??!0)&&e.o(` This is a required task. Initialization cannot continue.`,`error`),!1}}function Ye(t){let n=[],r=new Set,i=new Set,a=new Map(t.map(e=>[e.id,e]));function o(t){if(r.has(t))return;if(i.has(t))throw e.g.forTaskDependency(t);i.add(t);let s=a.get(t);if(!s)throw ue.forId(t);if(s.dependencies)for(let e of s.dependencies)o(e);i.delete(t),r.add(t),n.push(s)}for(let e of t)r.has(e.id)||o(e.id);return n}function Xe(e){let t=[];for(let n of e)if(!A(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`template`){let e=Ze(n);t.push(...e)}return t}function Ze(e){let t=[],n=e.config,r=n.template!=null&&n.template!==``,i=n.templateFile!=null&&n.templateFile!==``;return!r&&!i&&t.push(`Task "${e.id}" (${e.name}): Template task requires either "template" (inline) or "templateFile" (file path) to be specified`),r&&i&&t.push(`Task "${e.id}" (${e.name}): Template task cannot have both "template" and "templateFile" specified. Use one or the other.`),(n.file==null||n.file===``)&&t.push(`Task "${e.id}" (${e.name}): Template task requires "file" property to specify the output file path`),t}function Qe(t){e.o(`❌ Template validation failed:`,`error`),e.o(``,`error`);for(let n of t)e.o(` • ${n}`,`error`);e.o(``,`error`),e.o(`Please fix these errors before continuing.`,`error`)}function Q(e,t=new Map){let n={};for(let r of e){let e=t.get(r.id);e!==void 0&&(n[r.id]=e)}return n}async function $e(t,n){if(t==null)return;if(typeof t!=`object`||!t||Array.isArray(t))return t;let r=t;if(r.type===`exec`){let t=r.value;if(typeof t!=`string`){e.o(`Variable "${n}": exec value must have a string command`,`error`);return}try{let e=(0,a.execSync)(t,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(e.startsWith(`{`)||e.startsWith(`[`))try{return JSON.parse(e)}catch{return e}if(/^-?\d+(?:\.\d+)?$/u.test(e)){let t=Number.parseFloat(e);if(!Number.isNaN(t))return t}return e===`true`||e===`false`?e===`true`:e}catch(t){e.o(`Variable "${n}": failed to execute command: ${t instanceof Error?t.message:`Unknown error`}`,`warn`);return}}else if(r.type===`static`)return r.value;return t}async function et(e){let t=new Map,n=e.map(async e=>{let t=await $e(e.value,e.id);return{id:e.id,value:t}}),r=await Promise.all(n);for(let e of r)e.value!==void 0&&t.set(e.id,e.value);return t}function tt(e){let t=[],n=new Set;for(let r of e)if(n.has(r.id)&&t.push(`Duplicate variable ID: "${r.id}"`),n.add(r.id),/^[a-zA-Z_$][a-zA-Z0-9_$]*$/u.test(r.id)||t.push(`Variable ID "${r.id}" is invalid. Must be a valid JavaScript identifier (start with letter, underscore, or $, followed by letters, digits, underscores, or $).`),r.value===void 0||r.value===null)t.push(`Variable "${r.id}" must have a value`);else if(typeof r.value==`object`&&!Array.isArray(r.value)&&r.value!==null){let e=r.value;e.type==null||e.type===``?t.push(`Variable "${r.id}": value object must have a "type" field ("static" or "exec")`):e.type!==`static`&&e.type!==`exec`&&t.push(`Variable "${r.id}": type must be "static" or "exec", got "${e.type}"`),(e.value===void 0||e.value===null)&&t.push(`Variable "${r.id}": value config must have a "value" field`),e.type===`exec`&&typeof e.value!=`string`&&t.push(`Variable "${r.id}": exec type must have a string command as value`)}return t}async function nt(t,n){Z(),e.o(`Validating task configurations...`,`info`);let i=Xe(t);i.length>0&&(Qe(i),r.default.exit(1)),e.o(`✓ All tasks validated successfully`,`success`);let a=t.filter(t=>e.u(t.enabled,s(),{lazy:!0}));e.o(`Resolving task dependencies...`,`info`);let o=Ye(a);e.o(`Welcome! Let's execute your tasks.`,`info`),n.dryRun&&e.o(`🔍 DRY RUN MODE - No changes will be made`,`warn`),e.o(`This will execute your project tasks based on the defined configuration.`,`info`);let c=s(),l=n.globalVariables??[],u=[],d=[...l];for(let e of o)if(e.variables&&e.variables.length>0)for(let t of e.variables)u.push(t),d.push(t);if(d.length>0){let t=tt(d);t.length>0&&(e.o(`❌ Variable validation errors:`,`error`),t.forEach(t=>e.o(` - ${t}`,`error`)),r.default.exit(1)),e.o(`Resolving variable values...`,`info`);let n=Q(d,await et(d));Object.assign(c,n),Object.keys(n).length>0&&e.o(`✓ Resolved ${Object.keys(n).length} variable(s)`,`success`)}let f=n.globalPrompts??[],p=[],m=[...f];for(let e of o)if(e.prompts&&e.prompts.length>0)for(let t of e.prompts)p.push(t),m.push(t);if(m.length>0){let t=L(m);t.length>0&&(e.o(`❌ Prompt validation errors:`,`error`),t.forEach(t=>e.o(` - ${t}`,`error`)),r.default.exit(1)),e.o(`Resolving prompt default values...`,`info`);let n=await I(m),i={};if(f.length>0&&(e.o(`📋 Top-level prompts (available to all tasks):`,`info`),i=await F(f,n,c),Object.assign(c,i)),p.length>0){f.length>0&&e.o(`📋 Task-specific prompts:`,`info`);let t=await F(p,n,c);Object.assign(c,t)}}let h=o.filter(t=>e.u(t.enabled,c));if(e.o(`${h.length} of ${o.length} task(s) enabled for execution`,`info`),n.dryRun){await w(h,c),e.o(`🔍 Dry run completed - no changes were made`,`info`),e.o(`Run without --dry-run to apply changes`,`info`);return}e.o(`Starting task execution...`,`info`),await j(`beforeAll`,c);let g=h.length,_=0,v=0,y=[];for(let t=0;t<h.length;t++){let r=h[t];if(r!=null)if(await j(`beforeTask`,r,c),await Je(r,c,t+1,g,n.dryRun))_++,y.push(r.id),await j(`afterTask`,r,c);else if(r.required??!0){v++,await j(`onError`,Error(`Task ${r.name} failed`),r);break}else e.o(`⚠️ Non-critical task failed, continuing...`,`warn`),await j(`onError`,Error(`Task ${r.name} failed`),r)}v>0&&(e.o(`❌ Task execution failed with ${v} critical error(s)`,`error`),e.o(`✓ Completed: ${_}/${g} tasks`,`info`),r.default.exit(1)),await j(`afterAll`,c),e.o(`✅ All tasks completed successfully!`,`success`),e.o(`✓ Completed: ${_}/${g} tasks`,`success`)}const rt=r.default.argv.includes(`--dry-run`),$=r.default.argv.includes(`--force`);async function it(t){try{let n=t||[];n.length===0&&(e.o(`⚠️ No tasks defined. Use --tasks-file to specify tasks or call runWithTasks() programmatically.`,`warn`),e.o(`Example: scaffoldfy --tasks-file ./tasks.json`,`info`),r.default.exit(1)),await nt(n,{dryRun:rt,force:$,tasksFilePath:void 0})}catch(t){e.o(`❌ Task execution failed`,`error`),t instanceof Error?(e.o(`Error: ${t.message}`,`error`),r.default.env.DEBUG!=null&&console.error(t.stack)):console.error(t),r.default.exit(1)}}async function at(t,n){try{await nt(t,{dryRun:n?.dryRun??rt,force:n?.force??$,tasksFilePath:n?.tasksFilePath??void 0,...n?.globalVariables!=null&&{globalVariables:n.globalVariables},...n?.globalPrompts!=null&&{globalPrompts:n.globalPrompts}})}catch(t){e.o(`❌ Task execution failed`,`error`),t instanceof Error?(e.o(`Error: ${t.message}`,`error`),r.default.env.DEBUG!=null&&console.error(t.stack)):console.error(t),r.default.exit(1)}}Object.defineProperty(exports,`A`,{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,`B`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`C`,{enumerable:!0,get:function(){return oe}}),Object.defineProperty(exports,`D`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`E`,{enumerable:!0,get:function(){return se}}),Object.defineProperty(exports,`F`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`H`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`I`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`L`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`M`,{enumerable:!0,get:function(){return ce}}),Object.defineProperty(exports,`N`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`O`,{enumerable:!0,get:function(){return re}}),Object.defineProperty(exports,`P`,{enumerable:!0,get:function(){return ee}}),Object.defineProperty(exports,`R`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return le}}),Object.defineProperty(exports,`T`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`V`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return $e}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return qe}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return Le}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return et}}),Object.defineProperty(exports,`j`,{enumerable:!0,get:function(){return te}}),Object.defineProperty(exports,`k`,{enumerable:!0,get:function(){return ae}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return Z}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return at}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return Q}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return Re}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return tt}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return Ye}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return it}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return Je}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`w`,{enumerable:!0,get:function(){return ne}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return ie}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`z`,{enumerable:!0,get:function(){return y}});
|
package/dist/src-DYtpmv9N.js
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import{_ as e,a as t,d as n,f as r,g as i,h as a,l as o,m as s,n as c,o as l,p as u,r as d,u as f}from"./utils-ii_k_uXl.js";import p from"node:path";import m from"node:fs";import h from"node:process";import{promisify as g}from"node:util";import{execSync as _}from"node:child_process";import{confirm as v,input as y,number as ee,password as te,select as ne}from"@inquirer/prompts";function re(){return{}}const b=g(m.readFile),x={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function S(e,t){switch(t){case`add`:return`${x.green}+ ${e}${x.reset}`;case`remove`:return`${x.red}- ${e}${x.reset}`;case`context`:return`${x.gray} ${e}${x.reset}`;default:return e}}function C(e,t){let n=e.split(`
|
|
2
|
-
`),r=t.split(`
|
|
3
|
-
`),i=[],a=Math.max(n.length,r.length);for(let e=0;e<a;e++){let t=n[e],a=r[e];t===a?t!==void 0&&i.push(S(t,`context`)):(t!==void 0&&i.push(S(t,`remove`)),a!==void 0&&i.push(S(a,`add`)))}return i}async function w(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n))return`${x.yellow}⊘ Condition not met - task would be skipped${x.reset}`;let r=p.join(h.cwd(),e.file);if(!m.existsSync(r))return`${x.red}✗ File not found: ${e.file}${x.reset}`;try{let i=await b(r,`utf-8`),a=JSON.parse(i),s={...a};function c(e){if(typeof e==`string`)return t(e,n);if(Array.isArray(e))return e.map(e=>c(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=c(r);return t}return e}for(let[t,n]of Object.entries(e.updates)){let e=c(n);t.includes(`.`)?o(a,t,e):a[t]=e}let l=JSON.stringify(s,null,2),u=JSON.stringify(a,null,2);if(l===u)return`${x.cyan}→ No changes${x.reset}`;let d=C(l,u);return`${x.blue}File: ${e.file}${x.reset}\n${d.join(`
|
|
4
|
-
`)}`}catch(e){return`${x.red}✗ Error: ${e instanceof Error?e.message:String(e)}${x.reset}`}}async function T(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n))return`${x.yellow}⊘ Condition not met - task would be skipped${x.reset}`;if(e.template==null||e.template===``)return`${x.red}✗ No template content provided for file: ${e.file}${x.reset}`;let r=p.join(h.cwd(),e.file),i=t(e.template,n);if(!m.existsSync(r)){let t=i.split(`
|
|
5
|
-
`).slice(0,10).join(`
|
|
6
|
-
`),n=i.split(`
|
|
7
|
-
`).length>10;return`${x.blue}File: ${e.file}${x.reset}\n${x.green}+ New file would be created${x.reset}\n${x.gray}Content preview:${x.reset}\n${t}${n?`
|
|
8
|
-
...`:``}`}try{let t=await b(r,`utf-8`);if(t===i)return`${x.cyan}→ No changes${x.reset}`;let n=C(t,i);return`${x.blue}File: ${e.file}${x.reset}\n${n.join(`
|
|
9
|
-
`)}`}catch(e){return`${x.red}✗ Error: ${e instanceof Error?e.message:String(e)}${x.reset}`}}async function ie(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n))return`${x.yellow}⊘ Condition not met - task would be skipped${x.reset}`;let r=p.join(h.cwd(),e.file);if(m.existsSync(r))return`${x.cyan}→ File already exists, would be skipped: ${e.file}${x.reset}`;let i=e.template!=null&&e.template!==``,a=e.templateFile!=null&&e.templateFile!==``;if(!i&&!a)return`${x.red}✗ No template content provided for file: ${e.file}${x.reset}`;try{let r;if(i)r=t(e.template,n);else return`${x.blue}File: ${e.file}${x.reset}\n${x.green}+ New file would be created from template: ${e.templateFile}${x.reset}`;let a=r.split(`
|
|
10
|
-
`).slice(0,10).join(`
|
|
11
|
-
`),o=r.split(`
|
|
12
|
-
`).length>10;return`${x.blue}File: ${e.file}${x.reset}\n${x.green}+ New file would be created${x.reset}\n${x.gray}Content preview:${x.reset}\n${a}${o?`
|
|
13
|
-
...`:``}`}catch(e){return`${x.red}✗ Error: ${e instanceof Error?e.message:String(e)}${x.reset}`}}async function ae(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n))return`${x.yellow}⊘ Condition not met - task would be skipped${x.reset}`;let r=p.join(h.cwd(),e.file);if(!m.existsSync(r))return`${x.red}✗ File not found: ${e.file}${x.reset}`;try{let i=await b(r,`utf-8`),a=new RegExp(e.pattern,e.flags??`g`),o=t(e.replacement,n),s=i.replace(a,o);if(i===s)return`${x.cyan}→ No matches found${x.reset}`;let c=C(i,s);return`${x.blue}File: ${e.file}${x.reset}\n${c.join(`
|
|
14
|
-
`)}`}catch(e){return`${x.red}✗ Error: ${e instanceof Error?e.message:String(e)}${x.reset}`}}async function oe(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n))return`${x.yellow}⊘ Condition not met - task would be skipped${x.reset}`;let r=p.join(h.cwd(),e.file);if(!m.existsSync(r))return`${x.red}✗ File not found: ${e.file}${x.reset}`;try{let i=await b(r,`utf-8`),a=i;for(let{find:r,replace:a}of e.replacements){let e=t(r,n),o=t(a,n);i=i.replace(e,o)}if(a===i)return`${x.cyan}→ No changes${x.reset}`;let o=C(a,i);return`${x.blue}File: ${e.file}${x.reset}\n${o.join(`
|
|
15
|
-
`)}`}catch(e){return`${x.red}✗ Error: ${e instanceof Error?e.message:String(e)}${x.reset}`}}function se(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n))return`${x.yellow}⊘ Condition not met - task would be skipped${x.reset}`;let r=e.paths.map(e=>t(e,n)).filter(e=>m.existsSync(p.join(h.cwd(),e)));return r.length===0?`${x.cyan}→ No files/directories to delete${x.reset}`:`${x.red}Would delete:${x.reset}\n${r.map(e=>`${x.red} - ${e}${x.reset}`).join(`
|
|
16
|
-
`)}`}function E(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n))return`${x.yellow}⊘ Condition not met - task would be skipped${x.reset}`;let r=t(e.from,n),i=t(e.to,n),a=p.join(h.cwd(),r),o=p.join(h.cwd(),i);return m.existsSync(a)?m.existsSync(o)?`${x.yellow}⚠ Destination already exists: ${i}${x.reset}\n${x.cyan}Would rename: ${r} → ${i}${x.reset}`:`${x.cyan}Would rename: ${r} → ${i}${x.reset}`:`${x.red}✗ Source not found: ${r}${x.reset}`}function D(e){if(e.condition!=null&&e.condition!==``)return`${x.yellow}⊘ Condition check skipped in dry-run${x.reset}`;let t=p.join(h.cwd(),`.git`),n=m.existsSync(t),r=[];if(e.removeExisting&&n&&r.push(`${x.red}Would remove existing .git directory${x.reset}`),r.push(`${x.green}Would initialize git repository${x.reset}`),e.initialCommit){let t=e.message??`Initial commit`;r.push(`${x.green}Would create initial commit: "${t}"${x.reset}`)}return r.join(`
|
|
17
|
-
`)}function O(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n))return`${x.yellow}⊘ Condition not met - task would be skipped${x.reset}`;let r=t(e.command,n),i=e.cwd==null?h.cwd():t(e.cwd,n);return`${x.yellow}Would execute:${x.reset}\n${x.cyan} Command: ${r}${x.reset}\n${x.cyan} Working directory: ${i}${x.reset}`}async function k(e,t){try{switch(e.type){case`update-json`:return await w(e.config,t);case`template`:return await T(e.config,t);case`create`:return await ie(e.config,t);case`regex-replace`:return await ae(e.config,t);case`replace-in-file`:return await oe(e.config,t);case`delete`:return se(e.config,t);case`rename`:return E(e.config,t);case`git-init`:return D(e.config);case`exec`:return O(e.config,t);default:{let t=e.type;return`${x.yellow}⚠ Diff not available for task type: ${t}${x.reset}`}}}catch(e){return`${x.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${x.reset}`}}async function A(e,t){console.log(`${x.blue}═══════════════════════════════════════════════════════${x.reset}`),console.log(`${x.blue} DRY RUN - Preview of changes${x.reset}`),console.log(`${x.blue}═══════════════════════════════════════════════════════${x.reset}`);for(let n of e){console.log(`${x.cyan}▶ Task: ${n.name}${x.reset}`),n.description!=null&&n.description!==``&&console.log(`${x.gray} ${n.description}${x.reset}`);let e=await k(n,t);console.log(e),console.log(`${x.gray}${`─`.repeat(55)}${x.reset}`)}console.log(`${x.blue}═══════════════════════════════════════════════════════${x.reset}`),console.log(`${x.yellow} No changes were applied (dry-run mode)${x.reset}`),console.log(`${x.blue}═══════════════════════════════════════════════════════${x.reset}`)}const j=new Map,M={},N=new Map;function P(e){if(e.name==null||e.name===``)throw TypeError(`Plugin name is required`);if(!Array.isArray(e.taskTypes)||e.taskTypes.length===0)throw TypeError(`Plugin ${e.name} must define at least one task type`);if(typeof e.execute!=`function`)throw TypeError(`Plugin ${e.name} must provide an execute function`);if(j.has(e.name))throw TypeError(`Plugin ${e.name} is already registered`);for(let t of e.taskTypes)if(N.has(t)){let e=N.get(t);throw TypeError(`Task type "${t}" is already registered by plugin "${e}"`)}j.set(e.name,e);for(let t of e.taskTypes)N.set(t,e.name);l(`✓ Registered plugin: ${e.name}${e.version==null?``:` v${e.version}`}`,`info`)}function ce(e){let t=j.get(e);if(t!=null){for(let e of t.taskTypes)N.delete(e);j.delete(e)}}function le(e){return j.get(e)}function F(e){let t=N.get(e);if(t!=null)return j.get(t)}function I(e){return N.has(e)}function ue(){return Array.from(j.keys())}function de(){j.clear(),N.clear()}function fe(e){e.beforeAll!=null&&(M.beforeAll=e.beforeAll),e.afterAll!=null&&(M.afterAll=e.afterAll),e.beforeTask!=null&&(M.beforeTask=e.beforeTask),e.afterTask!=null&&(M.afterTask=e.afterTask),e.onError!=null&&(M.onError=e.onError)}async function L(e,...t){let n=M[e];if(n!=null)try{e===`beforeAll`||e===`afterAll`?await n(t[0]):(e===`beforeTask`||e===`afterTask`||e===`onError`)&&await n(t[0],t[1])}catch(t){l(`Error in ${e} hook: ${t instanceof Error?t.message:String(t)}`,`error`)}}async function pe(e,t,n){let r=F(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}async function me(e,t){let n=F(e.type);if(!(n==null||n.getDiff==null))return n.getDiff(e,t)}function he(e){let t=F(e.type);return t==null?[`No plugin found for task type: ${e.type}`]:t.validate==null?[]:t.validate(e)}function ge(e,t,n,r){return{name:e,...r?.version!=null&&{version:r.version},taskTypes:[t],execute:n,...r?.getDiff!=null&&{getDiff:r.getDiff},...r?.validate!=null&&{validate:r.validate}}}var _e=class t extends e{constructor(e,t){super(e,`TASK_NOT_FOUND`),this.taskId=t,this.name=`TaskNotFoundError`}static forId(e){return new t(`Task not found: ${e}`,e)}},R=class t extends e{constructor(e,t,n){super(e,`PROMPT_VALIDATION_ERROR`),this.promptId=t,this.reason=n,this.name=`PromptValidationError`}static required(e){return new t(`Prompt "${e}" is required`,e,`required`)}static unknownType(e){return new t(`Unknown prompt type: ${e}`,e,`unknown_type`)}},z=class t extends e{constructor(e,t,n){super(e,`PLUGIN_CONFIGURATION_ERROR`),this.pluginType=t,this.configIssue=n,this.name=`PluginConfigurationError`}static templateMissingTemplateOrFile(){return new t(`Template task requires either "template" (inline) or "templateFile" (file path) to be specified`,`template`,`missing_template_or_file`)}static templateHasBothTemplateAndFile(){return new t(`Template task cannot have both "template" and "templateFile" specified. Use one or the other.`,`template`,`both_template_and_file`)}static createMissingTemplateOrFile(){return new t(`Create task requires either "template" (inline) or "templateFile" (file path) to be specified`,`create`,`missing_template_or_file`)}static createHasBothTemplateAndFile(){return new t(`Create task cannot have both "template" and "templateFile" specified. Use one or the other.`,`create`,`both_template_and_file`)}};async function B(e,n,r){if(e===void 0)return;if(typeof e!=`object`||!e||Array.isArray(e))return typeof e==`string`&&r&&/\{\{\w+\}\}/u.test(e)?t(e,r):e;let i=e;if(i.type===`conditional`){if(!r)return;if(typeof i.condition!=`string`){l(`Prompt "${n}": conditional default must have a string condition`,`error`);return}try{let{evaluateCondition:e}=await import(`./utils-YBR62LwC.js`),n=e(i.condition,r)?i.ifTrue:i.ifFalse;return typeof n==`string`&&/\{\{\w+\}\}/u.test(n)&&(n=t(n,r)),n}catch(e){l(`Prompt "${n}": failed to evaluate conditional default: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(i.type===`exec`){let e=i.value;if(typeof e!=`string`){l(`Prompt "${n}": exec default value must have a string command`,`error`);return}try{let t=_(e,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(t.startsWith(`{`)||t.startsWith(`[`))try{return JSON.parse(t)}catch{return t}if(/^-?\d+(?:\.\d+)?$/u.test(t)){let e=Number.parseFloat(t);if(!Number.isNaN(e))return e}return t===`true`||t===`false`?t===`true`:t}catch(e){l(`Prompt "${n}": failed to execute default value command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}else if(i.type===`static`)return i.value;else if(i.type!==void 0){l(`Prompt "${n}": unknown default value type "${i.type}". Expected "static", "exec", or "conditional".`,`error`);return}return e}async function V(e,t=new Map,n={}){let r={};if(e.length===0)return r;for(let i of e){let e={...n,...r};if(f(i.enabled,e))try{let n,a=t.get(i.id);switch(i.default!==void 0&&(a=await B(i.default,i.id,e)),i.type){case`input`:{let e={message:i.message};if(a!==void 0&&(e.default=String(a)),i.required!==void 0&&(e.required=i.required),n=await y(e),i.required&&(n==null||typeof n==`string`&&n.trim()===``))throw l(`${i.message} is required`,`error`),R.required(i.id);break}case`password`:if(n=await te({message:i.message,mask:`*`}),i.required&&(n==null||typeof n==`string`&&n.trim()===``))throw l(`${i.message} is required`,`error`),R.required(i.id);break;case`number`:{let e={message:i.message};if(a!==void 0&&(e.default=Number(a)),i.required!==void 0&&(e.required=i.required),i.min!==void 0&&(e.min=i.min),i.max!==void 0&&(e.max=i.max),n=await ee(e),i.required&&n==null)throw l(`${i.message} is required`,`error`),R.required(i.id);break}case`select`:{let e={message:i.message,choices:i.choices.map(e=>({name:e.name,value:e.value}))};a!==void 0&&(e.default=a),n=await ne(e);break}case`confirm`:{let e=a===void 0?!1:!!a;n=await v({message:i.message,default:e});break}default:throw l(`Unknown prompt type: ${i.type}`,`error`),R.unknownType(i.type)}r[i.id]=n}catch(e){throw e instanceof Error&&l(`Failed to collect prompt "${i.id}": ${e.message}`,`error`),e}}return r}async function H(e){let t=new Map,n=e.map(async e=>{if(e.default!==void 0){let n=await B(e.default,e.id);n!==void 0&&t.set(e.id,n)}});return await Promise.all(n),t}function U(e){let t=[],n=new Set;for(let r of e){if(n.has(r.id)&&t.push(`Duplicate prompt ID: ${r.id}`),n.add(r.id),/^[a-zA-Z_$][a-zA-Z0-9_$]*$/u.test(r.id)||t.push(`Invalid prompt ID "${r.id}": must be a valid JavaScript identifier (start with letter, underscore, or $, followed by letters, digits, underscores, or $)`),(!r.message||r.message.trim()===``)&&t.push(`Prompt "${r.id}" must have a non-empty message`),r.type===`select`){r.choices.length===0&&t.push(`Select prompt "${r.id}" must have at least one choice`);for(let e of r.choices)(!e.name||e.name.trim()===``)&&t.push(`Select prompt "${r.id}" has a choice with empty name`),e.value===void 0&&t.push(`Select prompt "${r.id}" has a choice with undefined value`)}r.type===`number`&&r.min!==void 0&&r.max!==void 0&&r.min>r.max&&t.push(`Number prompt "${r.id}" has min greater than max`)}return t}const ve=g(m.writeFile);async function ye(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n)){l(`Condition not met, skipping create task`,`info`);return}let r=p.join(h.cwd(),e.file);if(m.existsSync(r)){l(`File already exists, skipping: ${e.file}`,`info`);return}let i=e.template!=null&&e.template!==``,a=e.templateFile!=null&&e.templateFile!==``;if(!i&&!a)throw z.createMissingTemplateOrFile();if(i&&a)throw z.createHasBothTemplateAndFile();let o;if(a&&e.templateFile.endsWith(`.hbs`))o=c(e.templateFile,n);else if(a){let r=e.templateFile,i=p.isAbsolute(r)?r:p.join(h.cwd(),r);if(!m.existsSync(i))throw u.forPath(r);o=t(m.readFileSync(i,`utf-8`),n)}else o=t(e.template,n);let s=p.dirname(r);m.existsSync(s)||m.mkdirSync(s,{recursive:!0}),await ve(r,o),l(`Created file: ${e.file}`,`success`)}const be={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await ye(e.config,t)}};async function xe(e,t){let{paths:n,condition:r}=e;if(r!=null&&r!==``){if(!t){l(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!d(r,t)){l(`Condition not met, skipping deletion`,`info`);return}}for(let e of n){let t=p.join(h.cwd(),e);m.existsSync(t)&&m.rmSync(t,{recursive:!0,force:!0})}}const Se={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await xe(e.config,t)}};async function Ce(e,t){if(e.condition!=null&&e.condition!==``){if(!t){l(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!d(e.condition,t)){l(`Condition not met, skipping exec task`,`info`);return}}let n=e.cwd==null?h.cwd():p.join(h.cwd(),e.cwd);_(e.command,{cwd:n,stdio:`inherit`})}const we={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await Ce(e.config,t)}};async function Te(e,t){if(e.condition!=null&&e.condition!==``){if(!t){l(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!d(e.condition,t)){l(`Condition not met, skipping git-init task`,`info`);return}}if(e.removeExisting){let e=p.join(h.cwd(),`.git`);m.existsSync(e)&&m.rmSync(e,{recursive:!0,force:!0})}if(_(`git init`,{stdio:`inherit`}),e.initialCommit){let t=e.message??`Initial commit`;_(`git add .`,{stdio:`inherit`}),_(`git commit -m "${t}"`,{stdio:`inherit`})}}const Ee={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await Te(e.config,t)}},De=g(m.readFile),Oe=g(m.writeFile);async function ke(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n)){l(`Condition not met, skipping regex-replace task`,`info`);return}let r=p.join(h.cwd(),e.file),{pattern:i}=e,a=e.flags??``,o=e.replacement||``,s=await De(r,`utf-8`),c=new RegExp(i,a);s=s.replace(c,t(o,n)),await Oe(r,s)}const Ae={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await ke(e.config,t)}},je=g(m.rename);async function Me(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n)){l(`Condition not met, skipping rename task`,`info`);return}let r=p.join(h.cwd(),t(e.from,n)),i=p.join(h.cwd(),t(e.to,n));if(!m.existsSync(r)){l(`Source path does not exist: ${r}`,`warn`);return}await je(r,i)}const Ne={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await Me(e.config,t)}},Pe=g(m.readFile),Fe=g(m.writeFile);async function Ie(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n)){l(`Condition not met, skipping replace-in-file task`,`info`);return}let r=p.join(h.cwd(),e.file),{replacements:i}=e;if(!m.existsSync(r)){l(`File not found: ${r}, skipping`,`warn`);return}let a=await Pe(r,`utf-8`);for(let{find:e,replace:r}of i){let i=t(r,n);a=a.replace(new RegExp(e,`gu`),i)}await Fe(r,a)}const Le={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await Ie(e.config,t)}};var W=class t extends e{constructor(e,t,n,r){super(e,`DUPLICATE_ID`),this.id=t,this.type=n,this.existingType=r,this.name=`DuplicateIdError`}static forId(e,n,r){return new t(`Duplicate ID "${e}" found in ${n}. This ID is already used in ${r??`unknown`}`,e,n,r)}},G=class t extends e{constructor(e,t,n,r,i){super(e,`ID_CONFLICT`),this.id=t,this.type=n,this.baseSource=r,this.overrideSource=i,this.name=`IdConflictError`}static forTask(e,n,r){return new t(`Task ID conflict: "${e}" is defined in multiple templates.\n Base task from: ${n??`unknown`}\n Override task from: ${r??`unknown`}\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the task.\n Task is being extended/overridden but no override strategy was specified.`,e,`task`,n,r)}static forVariable(e){return new t(`Variable ID conflict: "${e}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the variable.\n Variable is being extended/overridden but no override strategy was specified.`,e,`variable`)}static forPrompt(e){return new t(`Prompt ID conflict: "${e}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the prompt.\n Prompt is being extended/overridden but no override strategy was specified.`,e,`prompt`)}};const K=g(m.readFile),q={template:[[`template`,`templateFile`]]};function J(e){if(e==null||e===``)return`current template`;if(Y(e))return e;let t=h.cwd();return e.startsWith(t)?p.relative(t,e):e}function Y(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function Re(e,t){if(Y(e))return e;if(t==null||t===``)return p.isAbsolute(e)?e:p.resolve(h.cwd(),e);if(Y(t))try{let n=new URL(`.`,t);return new URL(e,n).href}catch{throw a.forRemoteTemplate(e,t)}let n=p.dirname(t);return p.isAbsolute(e)?e:p.resolve(n,e)}async function ze(e){if(Y(e))return Be(e);if(!m.existsSync(e))throw u.forPath(e);return K(e,`utf-8`)}async function Be(e){try{let t=await fetch(e);if(!t.ok)throw r.forUrl(e,t.status,t.statusText);return await t.text()}catch(t){throw t instanceof Error&&t.message.includes(`Failed to fetch`)?t:r.forUrl(e,t instanceof Error?t:void 0)}}const X=new Map;async function Ve(e,t=new Set){let r=Y(e),a;if(a=r||p.isAbsolute(e)?e:p.resolve(h.cwd(),e),X.has(a))return X.get(a);if(t.has(a))throw i.forTemplateInheritance(t,a);t.add(a);let o;if(r)o=await Be(a);else{if(!m.existsSync(a))throw u.forPath(a);o=await K(a,`utf-8`)}let c;try{c=JSON.parse(o)}catch(e){throw s.forFile(a,e instanceof Error?e:Error(String(e)))}if(c.name==null||c.name.trim()===``)throw n.missingName(a);if(!/^[a-z\d]+(?:-[a-z\d]+)*$/u.test(c.name))throw n.invalidNameFormat(a,c.name);if(c.tasks!==void 0&&!Array.isArray(c.tasks))throw n.tasksNotArray(a);c.tasks===void 0&&(c.tasks=[]);for(let e of c.tasks)e.$sourceUrl=a;return X.set(a,c),c}async function Z(e,t,n=new Set){let r=Y(e),a;if(a=r||p.isAbsolute(e)?e:t==null?p.resolve(h.cwd(),e):Y(t)?new URL(e,t).href:p.resolve(t,e),n.has(a))throw i.forTemplateInheritance(n,a);n.add(a);let o=await Ve(a);if(o.extends==null||o.extends===``)return o;let s=Y(a)?new URL(`.`,a).href:p.dirname(a),c=Array.isArray(o.extends)?o.extends:[o.extends],l=[];for(let e of c){let t=await Z(e,s,n);l.push(t)}return Ge([...l,o])}function He(e,t,n){let r=new Map;for(let t of e){if(r.has(t.id))throw W.forId(t.id,`task`,r.get(t.id));r.set(t.id,`task`)}if(t!=null)for(let e of t){if(r.has(e.id))throw W.forId(e.id,`variable`,r.get(e.id));r.set(e.id,`variable`)}if(n!=null)for(let e of n){if(r.has(e.id))throw W.forId(e.id,`prompt`,r.get(e.id));r.set(e.id,`prompt`)}}function Ue(e,t){if((t.override??`merge`)===`replace`){l(` → Variable "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}l(` → Variable "${t.id}" merged (value replaced)`,`info`);let n={...e,...t};return delete n.override,n}function We(e,t){if((t.override??`merge`)===`replace`){l(` → Prompt "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}l(` → Prompt "${t.id}" merged`,`info`);let n={...e,...t};return delete n.override,n}function Ge(e){if(e.length===0)return{name:`Empty Template`,tasks:[]};if(e.length===1){let t=e[0];return He(t.tasks??[],t.variables,t.prompts),t}let t=new Map,n=new Map,r=new Map;for(let i of e){if(i.prompts!=null)for(let e of i.prompts)if(r.has(e.id)){if(e.override==null)throw G.forPrompt(e.id);let t=r.get(e.id);r.set(e.id,We(t,e))}else r.set(e.id,{...e});if(i.variables!=null)for(let e of i.variables)if(n.has(e.id)){if(e.override==null)throw G.forVariable(e.id);let t=n.get(e.id);n.set(e.id,Ue(t,e))}else n.set(e.id,{...e});for(let e of i.tasks??[])if(t.has(e.id)){if(e.override==null){let n=t.get(e.id);throw G.forTask(e.id,J(n.$sourceUrl),J(e.$sourceUrl))}let n=t.get(e.id);t.set(e.id,Je(n,e))}else t.set(e.id,{...e})}let i=Array.from(t.values()),a=r.size>0?Array.from(r.values()):void 0,o=n.size>0?Array.from(n.values()):void 0;He(i,o,a);let s=e[e.length-1],c={name:s.name,tasks:i};return s.description!=null&&(c.description=s.description),s.dependencies!=null&&(c.dependencies=s.dependencies),a!=null&&(c.prompts=a),o!=null&&(c.variables=o),c}function Ke(e,t){let n=q[e];if(!n)return null;for(let e of n){let n=e.filter(e=>e in t&&t[e]!=null);if(n.length>1)return n}return null}function qe(e,t,n){let r={...e},i=q[n]??[];for(let[e,n]of Object.entries(t)){for(let t of i)if(t.includes(e)){for(let n of t)n!==e&&delete r[n];break}r[e]=n}return r}function Je(e,t){if((t.override??`merge`)===`replace`){l(` → Task "${t.id}" using 'replace' strategy - completely replacing base task`,`info`),l(` Base: ${J(e.$sourceUrl)}`,`info`),l(` Override: ${J(t.$sourceUrl)}`,`info`);let{override:n,...r}=t;return r}l(` → Merging task "${t.id}"`,`info`),l(` Base: ${J(e.$sourceUrl)}`,`info`),l(` Override: ${J(t.$sourceUrl)}`,`info`);let n;if(typeof e.config==`object`&&e.config!==null&&typeof t.config==`object`&&t.config!==null){n=qe(e.config,t.config,t.type);let r=Ke(t.type,n);r!==null&&r.length>0&&(l(` ⚠️ Warning: Conflicting config fields detected: ${r.join(`, `)}`,`warn`),l(` Please use override: "replace" or specify only one of these fields`,`warn`))}else n=t.config??e.config;let r=e.prompts?[...e.prompts]:void 0;if(t.prompts&&t.prompts.length>0)if(!r)r=[...t.prompts];else{let e=new Map(r.map(e=>[e.id,e]));for(let n of t.prompts)e.set(n.id,n);r=Array.from(e.values())}let i=e.variables?[...e.variables]:void 0;if(t.variables&&t.variables.length>0)if(!i)i=[...t.variables];else{let e=new Map(i.map(e=>[e.id,e]));for(let n of t.variables)e.set(n.id,n);i=Array.from(e.values())}let a=[...e.dependencies??[],...t.dependencies??[]],o=a.length>0?[...new Set(a)]:void 0,s=t.$sourceUrl??e.$sourceUrl,c={...e,...t,config:n,...r!=null&&{prompts:r},...i!=null&&{variables:i},...o!=null&&{dependencies:o},...s!=null&&{$sourceUrl:s}};return delete c.override,c}function Ye(){X.clear()}async function Xe(e){l(`Loading tasks from ${e}...`,`info`);let t=await Z(e);l(`Loaded ${t.tasks?.length??0} task(s)`,`info`),t.extends!=null&&t.extends!==``&&l(`Extended from: ${(Array.isArray(t.extends)?t.extends:[t.extends]).join(`, `)}`,`info`),t.prompts!=null&&t.prompts.length>0&&l(`Found ${t.prompts.length} top-level prompt(s)`,`info`),t.variables!=null&&t.variables.length>0&&l(`Found ${t.variables.length} top-level variable(s)`,`info`);let n={tasks:t.tasks??[]};return t.prompts!=null&&(n.prompts=t.prompts),t.variables!=null&&(n.variables=t.variables),n}const Ze=g(m.writeFile);async function Qe(e,n,r){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n)){l(`Condition not met, skipping template task`,`info`);return}let i=p.join(h.cwd(),e.file),a=e.template!=null&&e.template!==``,o=e.templateFile!=null&&e.templateFile!==``;if(!a&&!o)throw z.templateMissingTemplateOrFile();if(a&&o)throw z.templateHasBothTemplateAndFile();let s;if(o&&e.templateFile.endsWith(`.hbs`)){let t=await ze(Re(e.templateFile,r?.$sourceUrl));s=(await import(`handlebars`)).default.compile(t)(n)}else s=t(o?await ze(Re(e.templateFile,r?.$sourceUrl)):e.template,n);await Ze(i,s)}const $e={name:`template`,version:`1.0.0`,taskTypes:[`template`],execute:async(e,t,n)=>{n.dryRun||await Qe(e.config,t,e)}},et=g(m.readFile),tt=g(m.writeFile);async function nt(e,n){if(e.condition!=null&&e.condition!==``&&!d(e.condition,n)){l(`Condition not met, skipping update-json task`,`info`);return}let r=p.join(h.cwd(),e.file),{updates:i}=e,a=await et(r,`utf-8`),s=JSON.parse(a);function c(e){if(typeof e==`string`)return t(e,n);if(Array.isArray(e))return e.map(e=>c(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=c(r);return t}return e}for(let[e,t]of Object.entries(i)){let n=c(t);e.includes(`.`)?o(s,e,n):s[e]=n}await tt(r,`${JSON.stringify(s,null,2)}\n`)}const rt={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await nt(e.config,t)}};function Q(){I(`update-json`)||(P(rt),P($e),P(be),P(Ae),P(Le),P(Se),P(Ne),P(Ee),P(we))}async function $(e,t,n=!1){if(Q(),n){l(`[DRY RUN] Would execute: ${e.name}`,`info`);return}if(I(e.type)){await pe(e,t,{dryRun:n});return}throw TypeError(`Unknown task type: ${e.type}`)}async function it(e,t,n,r,i=!1){try{return l(`[${n}/${r}] Running: ${e.name}...`,`info`),await $(e,t,i),l(`✓ ${e.name}`,`success`),!0}catch(t){return l(`✗ Failed: ${e.name}`,`error`),t instanceof Error&&(l(` Reason: ${t.message}`,`error`),t.stack!=null&&h.env.DEBUG!=null&&console.error(t.stack)),(e.required??!0)&&l(` This is a required task. Initialization cannot continue.`,`error`),!1}}function at(e){let t=[],n=new Set,r=new Set,a=new Map(e.map(e=>[e.id,e]));function o(e){if(n.has(e))return;if(r.has(e))throw i.forTaskDependency(e);r.add(e);let s=a.get(e);if(!s)throw _e.forId(e);if(s.dependencies)for(let e of s.dependencies)o(e);r.delete(e),n.add(e),t.push(s)}for(let t of e)n.has(t.id)||o(t.id);return t}function ot(e){let t=[];for(let n of e)if(!I(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`template`){let e=st(n);t.push(...e)}return t}function st(e){let t=[],n=e.config,r=n.template!=null&&n.template!==``,i=n.templateFile!=null&&n.templateFile!==``;return!r&&!i&&t.push(`Task "${e.id}" (${e.name}): Template task requires either "template" (inline) or "templateFile" (file path) to be specified`),r&&i&&t.push(`Task "${e.id}" (${e.name}): Template task cannot have both "template" and "templateFile" specified. Use one or the other.`),(n.file==null||n.file===``)&&t.push(`Task "${e.id}" (${e.name}): Template task requires "file" property to specify the output file path`),t}function ct(e){l(`❌ Template validation failed:`,`error`),l(``,`error`);for(let t of e)l(` • ${t}`,`error`);l(``,`error`),l(`Please fix these errors before continuing.`,`error`)}function lt(e,t=new Map){let n={};for(let r of e){let e=t.get(r.id);e!==void 0&&(n[r.id]=e)}return n}async function ut(e,t){if(e==null)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let n=e;if(n.type===`exec`){let e=n.value;if(typeof e!=`string`){l(`Variable "${t}": exec value must have a string command`,`error`);return}try{let t=_(e,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(t.startsWith(`{`)||t.startsWith(`[`))try{return JSON.parse(t)}catch{return t}if(/^-?\d+(?:\.\d+)?$/u.test(t)){let e=Number.parseFloat(t);if(!Number.isNaN(e))return e}return t===`true`||t===`false`?t===`true`:t}catch(e){l(`Variable "${t}": failed to execute command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}else if(n.type===`static`)return n.value;return e}async function dt(e){let t=new Map,n=e.map(async e=>{let t=await ut(e.value,e.id);return{id:e.id,value:t}}),r=await Promise.all(n);for(let e of r)e.value!==void 0&&t.set(e.id,e.value);return t}function ft(e){let t=[],n=new Set;for(let r of e)if(n.has(r.id)&&t.push(`Duplicate variable ID: "${r.id}"`),n.add(r.id),/^[a-zA-Z_$][a-zA-Z0-9_$]*$/u.test(r.id)||t.push(`Variable ID "${r.id}" is invalid. Must be a valid JavaScript identifier (start with letter, underscore, or $, followed by letters, digits, underscores, or $).`),r.value===void 0||r.value===null)t.push(`Variable "${r.id}" must have a value`);else if(typeof r.value==`object`&&!Array.isArray(r.value)&&r.value!==null){let e=r.value;e.type==null||e.type===``?t.push(`Variable "${r.id}": value object must have a "type" field ("static" or "exec")`):e.type!==`static`&&e.type!==`exec`&&t.push(`Variable "${r.id}": type must be "static" or "exec", got "${e.type}"`),(e.value===void 0||e.value===null)&&t.push(`Variable "${r.id}": value config must have a "value" field`),e.type===`exec`&&typeof e.value!=`string`&&t.push(`Variable "${r.id}": exec type must have a string command as value`)}return t}async function pt(e,t){Q(),l(`Validating task configurations...`,`info`);let n=ot(e);n.length>0&&(ct(n),h.exit(1)),l(`✓ All tasks validated successfully`,`success`);let r=e.filter(e=>f(e.enabled,re(),{lazy:!0}));l(`Resolving task dependencies...`,`info`);let i=at(r);l(`Welcome! Let's execute your tasks.`,`info`),t.dryRun&&l(`🔍 DRY RUN MODE - No changes will be made`,`warn`),l(`This will execute your project tasks based on the defined configuration.`,`info`);let a=re(),o=t.globalVariables??[],s=[],c=[...o];for(let e of i)if(e.variables&&e.variables.length>0)for(let t of e.variables)s.push(t),c.push(t);if(c.length>0){let e=ft(c);e.length>0&&(l(`❌ Variable validation errors:`,`error`),e.forEach(e=>l(` - ${e}`,`error`)),h.exit(1)),l(`Resolving variable values...`,`info`);let t=lt(c,await dt(c));Object.assign(a,t),Object.keys(t).length>0&&l(`✓ Resolved ${Object.keys(t).length} variable(s)`,`success`)}let u=t.globalPrompts??[],d=[],p=[...u];for(let e of i)if(e.prompts&&e.prompts.length>0)for(let t of e.prompts)d.push(t),p.push(t);if(p.length>0){let e=U(p);e.length>0&&(l(`❌ Prompt validation errors:`,`error`),e.forEach(e=>l(` - ${e}`,`error`)),h.exit(1)),l(`Resolving prompt default values...`,`info`);let t=await H(p),n={};if(u.length>0&&(l(`📋 Top-level prompts (available to all tasks):`,`info`),n=await V(u,t,a),Object.assign(a,n)),d.length>0){u.length>0&&l(`📋 Task-specific prompts:`,`info`);let e=await V(d,t,a);Object.assign(a,e)}}let m=i.filter(e=>f(e.enabled,a));if(l(`${m.length} of ${i.length} task(s) enabled for execution`,`info`),t.dryRun){await A(m,a),l(`🔍 Dry run completed - no changes were made`,`info`),l(`Run without --dry-run to apply changes`,`info`);return}l(`Starting task execution...`,`info`),await L(`beforeAll`,a);let g=m.length,_=0,v=0,y=[];for(let e=0;e<m.length;e++){let n=m[e];if(n!=null)if(await L(`beforeTask`,n,a),await it(n,a,e+1,g,t.dryRun))_++,y.push(n.id),await L(`afterTask`,n,a);else if(n.required??!0){v++,await L(`onError`,Error(`Task ${n.name} failed`),n);break}else l(`⚠️ Non-critical task failed, continuing...`,`warn`),await L(`onError`,Error(`Task ${n.name} failed`),n)}v>0&&(l(`❌ Task execution failed with ${v} critical error(s)`,`error`),l(`✓ Completed: ${_}/${g} tasks`,`info`),h.exit(1)),await L(`afterAll`,a),l(`✅ All tasks completed successfully!`,`success`),l(`✓ Completed: ${_}/${g} tasks`,`success`)}const mt=h.argv.includes(`--dry-run`),ht=h.argv.includes(`--force`);async function gt(e){try{let t=e||[];t.length===0&&(l(`⚠️ No tasks defined. Use --tasks-file to specify tasks or call runWithTasks() programmatically.`,`warn`),l(`Example: scaffoldfy --tasks-file ./tasks.json`,`info`),h.exit(1)),await pt(t,{dryRun:mt,force:ht,tasksFilePath:void 0})}catch(e){l(`❌ Task execution failed`,`error`),e instanceof Error?(l(`Error: ${e.message}`,`error`),h.env.DEBUG!=null&&console.error(e.stack)):console.error(e),h.exit(1)}}async function _t(e,t){try{await pt(e,{dryRun:t?.dryRun??mt,force:t?.force??ht,tasksFilePath:t?.tasksFilePath??void 0,...t?.globalVariables!=null&&{globalVariables:t.globalVariables},...t?.globalPrompts!=null&&{globalPrompts:t.globalPrompts}})}catch(e){l(`❌ Task execution failed`,`error`),e instanceof Error?(l(`Error: ${e.message}`,`error`),h.env.DEBUG!=null&&console.error(e.stack)):console.error(e),h.exit(1)}}export{P as A,k as B,pe as C,I as D,me as E,O as F,w as H,D as I,ae as L,he as M,A as N,ue as O,se as P,E as R,ge as S,F as T,T as V,H as _,ut as a,L as b,$ as c,Ye as d,Z as f,U as g,Ge as h,dt as i,ce as j,fe as k,Q as l,Ve as m,_t as n,lt as o,Xe as p,ft as r,at as s,gt as t,it as u,V as v,le as w,de as x,B as y,oe as z};
|
package/dist/utils-BeLs5aXN.cjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`node:fs`);c=s(c);let l=require(`node:path`);l=s(l);let u=require(`node:process`);u=s(u);let d=require(`node:child_process`);d=s(d);let f=require(`node:readline`);f=s(f);let p=require(`handlebars`);p=s(p);var m=class extends Error{constructor(e,t){super(e),this.code=t,this.name=this.constructor.name}},h=class e extends m{constructor(e,t,n){super(e,`CIRCULAR_DEPENDENCY`),this.dependencyChain=t,this.resolvedPath=n,this.name=`CircularDependencyError`}static forTemplateInheritance(t,n){let r=Array.from(t);return new e(`Circular dependency detected: ${r.join(` -> `)} -> ${n}`,r,n)}static forTaskDependency(t){return new e(`Circular dependency detected involving task: ${t}`,[t])}},g=class e extends m{constructor(e,t){super(e,`TEMPLATE_FILE_NOT_FOUND`),this.filePath=t,this.name=`TemplateFileNotFoundError`}static forPath(t){return new e(`Template file not found: ${t}`,t)}},_=class e extends m{constructor(e,t,n){super(e,`TEMPLATE_RESOLUTION_ERROR`),this.templateFilePath=t,this.sourceUrl=n,this.name=`TemplateResolutionError`}static forRemoteTemplate(t,n){return new e(`Failed to resolve templateFile "${t}" relative to remote template "${n}"`,t,n)}},v=class e extends m{constructor(e,t,n){super(e,`TEMPLATE_FETCH_ERROR`),this.url=t,this.originalError=n,this.name=`TemplateFetchError`}static forUrl(t,n,r){return typeof n==`number`?new e(`Failed to fetch template from ${t}: ${n} ${r??``}`.trim(),t):new e(`Failed to fetch template from ${t}: ${n?.message??String(n??`Unknown error`)}`,t,n)}},y=class e extends m{constructor(e,t,n){super(e,`TEMPLATE_PARSE_ERROR`),this.filePath=t,this.originalError=n,this.name=`TemplateParseError`}static forFile(t,n){return new e(`Failed to parse template file ${t}: ${n.message}`,t,n)}},b=class e extends m{constructor(e,t){super(e,`INVALID_TEMPLATE`),this.filePath=t,this.name=`InvalidTemplateError`}static forFile(t,n){return new e(`Invalid template file ${t}: ${n}`,t)}static tasksNotArray(t){return new e(`Invalid template file ${t}: 'tasks' must be an array if provided`,t)}static missingName(t){return new e(`Invalid template file ${t}: 'name' field is required`,t)}static invalidNameFormat(t,n){return new e(`Invalid template file ${t}: 'name' field "${n}" must contain only lowercase letters, digits, and hyphens. It cannot start or end with a hyphen, and cannot contain consecutive hyphens.`,t)}};function x(e,t,n){return e===void 0?!0:typeof e==`boolean`?e:typeof e==`string`?O(e,t,n?.lazy===!0?{lazy:!0}:void 0):typeof e==`object`&&`condition`in e?O(e.condition,t,n?.lazy===!0?{lazy:!0}:void 0):!1}function S(){try{let e=(0,d.execSync)(`git remote get-url origin`,{encoding:`utf-8`}).trim(),t=e.match(/github\.com[:/](?<owner>[^/]+)\/(?<name>[^/]+)$/u);if(t?.groups){let{owner:n,name:r}=t.groups,i=r;return i.endsWith(`.git`)&&(i=i.slice(0,-4)),{owner:n,name:i,url:e}}return null}catch{return null}}async function C(e,t){let n=f.default.createInterface({input:u.default.stdin,output:u.default.stdout});return new Promise(r=>{let i;i=t==null?`${e}: `:`${e} (${t}): `,n.question(i,e=>{n.close(),r(e.trim()||(t??``))})})}async function w(e,t=!1){return C(`${e} (${t?`Y/n`:`y/N`})`,t?`y`:`n`).then(e=>e.toLowerCase()===`y`||e.toLowerCase()===`yes`)}function T(e,t=`info`){console.log(`${{info:`\x1B[36m`,success:`\x1B[32m`,error:`\x1B[31m`,warn:`\x1B[33m`}[t]}${{info:`ℹ`,success:`✓`,error:`✗`,warn:`⚠`}[t]} ${e}[0m`)}function E(e,t){return e.replace(/\{\{(?<key>\w+)\}\}/gu,(e,n)=>t[n]?.toString()??``)}function D(e,t,n){let r=t.split(`.`),i=e;for(let e=0;e<r.length-1;e++){let t=r[e];t!=null&&t!==``&&((!(t in i)||typeof i[t]!=`object`||i[t]===null)&&(i[t]={}),i=i[t])}let a=r[r.length-1];a!=null&&a!==``&&(i[a]=n)}function O(e,t,n){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch(t){return n?.lazy===!0&&t instanceof ReferenceError?!0:(n?.silent!==!0&&(T(`Failed to evaluate condition: ${e}`,`warn`),t instanceof Error&&T(` Error: ${t.message}`,`warn`)),!1)}}function k(e,t){try{let n=l.default.isAbsolute(e)?e:l.default.join(u.default.cwd(),e);if(!c.default.existsSync(n))throw g.forPath(e);return A(c.default.readFileSync(n,`utf-8`),t)}catch(t){throw T(`Failed to read template file: ${e}`,`error`),t instanceof Error&&T(` Error: ${t.message}`,`error`),t}}function A(e,t){try{return p.default.compile(e)(t)}catch(e){throw T(`Failed to compile Handlebars template`,`error`),e instanceof Error&&T(` Error: ${e.message}`,`error`),e}}Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return s}});
|
package/dist/utils-YBR62LwC.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e,c as t,i as n,l as r,n as i,o as a,r as o,s,t as c,u as l}from"./utils-ii_k_uXl.js";export{c as compileHandlebarsTemplate,i as compileHandlebarsTemplateFile,o as evaluateCondition,l as evaluateEnabled,n as getGitRepoInfo,e as interpolateTemplate,a as log,s as prompt,t as promptYesNo,r as setNestedProperty};
|
package/dist/utils-ii_k_uXl.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import e from"node:path";import t from"node:fs";import n from"node:process";import{execSync as r}from"node:child_process";import i from"node:readline";import a from"handlebars";var o=class extends Error{constructor(e,t){super(e),this.code=t,this.name=this.constructor.name}},s=class e extends o{constructor(e,t,n){super(e,`CIRCULAR_DEPENDENCY`),this.dependencyChain=t,this.resolvedPath=n,this.name=`CircularDependencyError`}static forTemplateInheritance(t,n){let r=Array.from(t);return new e(`Circular dependency detected: ${r.join(` -> `)} -> ${n}`,r,n)}static forTaskDependency(t){return new e(`Circular dependency detected involving task: ${t}`,[t])}},c=class e extends o{constructor(e,t){super(e,`TEMPLATE_FILE_NOT_FOUND`),this.filePath=t,this.name=`TemplateFileNotFoundError`}static forPath(t){return new e(`Template file not found: ${t}`,t)}},l=class e extends o{constructor(e,t,n){super(e,`TEMPLATE_RESOLUTION_ERROR`),this.templateFilePath=t,this.sourceUrl=n,this.name=`TemplateResolutionError`}static forRemoteTemplate(t,n){return new e(`Failed to resolve templateFile "${t}" relative to remote template "${n}"`,t,n)}},u=class e extends o{constructor(e,t,n){super(e,`TEMPLATE_FETCH_ERROR`),this.url=t,this.originalError=n,this.name=`TemplateFetchError`}static forUrl(t,n,r){return typeof n==`number`?new e(`Failed to fetch template from ${t}: ${n} ${r??``}`.trim(),t):new e(`Failed to fetch template from ${t}: ${n?.message??String(n??`Unknown error`)}`,t,n)}},d=class e extends o{constructor(e,t,n){super(e,`TEMPLATE_PARSE_ERROR`),this.filePath=t,this.originalError=n,this.name=`TemplateParseError`}static forFile(t,n){return new e(`Failed to parse template file ${t}: ${n.message}`,t,n)}},f=class e extends o{constructor(e,t){super(e,`INVALID_TEMPLATE`),this.filePath=t,this.name=`InvalidTemplateError`}static forFile(t,n){return new e(`Invalid template file ${t}: ${n}`,t)}static tasksNotArray(t){return new e(`Invalid template file ${t}: 'tasks' must be an array if provided`,t)}static missingName(t){return new e(`Invalid template file ${t}: 'name' field is required`,t)}static invalidNameFormat(t,n){return new e(`Invalid template file ${t}: 'name' field "${n}" must contain only lowercase letters, digits, and hyphens. It cannot start or end with a hyphen, and cannot contain consecutive hyphens.`,t)}};function p(e,t,n){return e===void 0?!0:typeof e==`boolean`?e:typeof e==`string`?b(e,t,n?.lazy===!0?{lazy:!0}:void 0):typeof e==`object`&&`condition`in e?b(e.condition,t,n?.lazy===!0?{lazy:!0}:void 0):!1}function m(){try{let e=r(`git remote get-url origin`,{encoding:`utf-8`}).trim(),t=e.match(/github\.com[:/](?<owner>[^/]+)\/(?<name>[^/]+)$/u);if(t?.groups){let{owner:n,name:r}=t.groups,i=r;return i.endsWith(`.git`)&&(i=i.slice(0,-4)),{owner:n,name:i,url:e}}return null}catch{return null}}async function h(e,t){let r=i.createInterface({input:n.stdin,output:n.stdout});return new Promise(n=>{let i;i=t==null?`${e}: `:`${e} (${t}): `,r.question(i,e=>{r.close(),n(e.trim()||(t??``))})})}async function g(e,t=!1){return h(`${e} (${t?`Y/n`:`y/N`})`,t?`y`:`n`).then(e=>e.toLowerCase()===`y`||e.toLowerCase()===`yes`)}function _(e,t=`info`){console.log(`${{info:`\x1B[36m`,success:`\x1B[32m`,error:`\x1B[31m`,warn:`\x1B[33m`}[t]}${{info:`ℹ`,success:`✓`,error:`✗`,warn:`⚠`}[t]} ${e}[0m`)}function v(e,t){return e.replace(/\{\{(?<key>\w+)\}\}/gu,(e,n)=>t[n]?.toString()??``)}function y(e,t,n){let r=t.split(`.`),i=e;for(let e=0;e<r.length-1;e++){let t=r[e];t!=null&&t!==``&&((!(t in i)||typeof i[t]!=`object`||i[t]===null)&&(i[t]={}),i=i[t])}let a=r[r.length-1];a!=null&&a!==``&&(i[a]=n)}function b(e,t,n){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch(t){return n?.lazy===!0&&t instanceof ReferenceError?!0:(n?.silent!==!0&&(_(`Failed to evaluate condition: ${e}`,`warn`),t instanceof Error&&_(` Error: ${t.message}`,`warn`)),!1)}}function x(r,i){try{let a=e.isAbsolute(r)?r:e.join(n.cwd(),r);if(!t.existsSync(a))throw c.forPath(r);return S(t.readFileSync(a,`utf-8`),i)}catch(e){throw _(`Failed to read template file: ${r}`,`error`),e instanceof Error&&_(` Error: ${e.message}`,`error`),e}}function S(e,t){try{return a.compile(e)(t)}catch(e){throw _(`Failed to compile Handlebars template`,`error`),e instanceof Error&&_(` Error: ${e.message}`,`error`),e}}export{o as _,v as a,g as c,f as d,u as f,s as g,l as h,m as i,y as l,d as m,x as n,_ as o,c as p,b as r,h as s,S as t,p as u};
|
package/dist/utils-zjkNe5C1.cjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const e=require(`./utils-BeLs5aXN.cjs`);exports.compileHandlebarsTemplate=e.t,exports.compileHandlebarsTemplateFile=e.n,exports.evaluateCondition=e.r,exports.evaluateEnabled=e.u,exports.getGitRepoInfo=e.i,exports.interpolateTemplate=e.a,exports.log=e.o,exports.prompt=e.s,exports.promptYesNo=e.c,exports.setNestedProperty=e.l;
|