@pixpilot/scaffoldfy 0.18.0 → 0.19.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 +9 -8
- package/dist/cli.cjs +1 -1
- package/dist/cli.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +16 -4
- package/dist/index.d.ts +16 -4
- package/dist/index.js +1 -1
- package/dist/src-BWFVB-OE.cjs +17 -0
- package/dist/src-DYtpmv9N.js +17 -0
- package/dist/utils-BeLs5aXN.cjs +1 -0
- package/dist/{utils-B8XKlHJ4.js → utils-YBR62LwC.js} +1 -1
- package/dist/{utils-DLJmCo92.js → utils-ii_k_uXl.js} +1 -1
- package/dist/{utils-C9ZSOWzP.cjs → utils-zjkNe5C1.cjs} +1 -1
- package/package.json +4 -3
- package/schema/tasks.schema.json +25 -3
- package/dist/src-Bz_skljF.js +0 -17
- package/dist/src-Cjwkvk6V.cjs +0 -17
- package/dist/utils-BOEvDxDB.cjs +0 -1
package/README.md
CHANGED
|
@@ -65,14 +65,15 @@ npx @pixpilot/scaffoldfy --force
|
|
|
65
65
|
|
|
66
66
|
### CLI Options
|
|
67
67
|
|
|
68
|
-
| Option | Description
|
|
69
|
-
| --------------------- |
|
|
70
|
-
| `--tasks-file <path>` | Path to JSON task file (default: `./template-tasks.json`)
|
|
71
|
-
| `--tasks-ts <path>` | Path to TypeScript task file (default: `./template-tasks.ts`)
|
|
72
|
-
| `--dry-run` | Preview changes without applying them
|
|
73
|
-
| `--force` | Force re-initialization
|
|
74
|
-
|
|
|
75
|
-
| `-
|
|
68
|
+
| Option | Description |
|
|
69
|
+
| --------------------- | ------------------------------------------------------------------------------- |
|
|
70
|
+
| `--tasks-file <path>` | Path to JSON task file (default: `./template-tasks.json`) |
|
|
71
|
+
| `--tasks-ts <path>` | Path to TypeScript task file (default: `./template-tasks.ts`) |
|
|
72
|
+
| `--dry-run` | Preview changes without applying them |
|
|
73
|
+
| `--force` | Force re-initialization |
|
|
74
|
+
| `--no-validate` | Skip schema validation of task configuration (validation is enabled by default) |
|
|
75
|
+
| `-h, --help` | Show help message |
|
|
76
|
+
| `-v, --version` | Show version |
|
|
76
77
|
|
|
77
78
|
### Programmatic API
|
|
78
79
|
|
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-BeLs5aXN.cjs`),t=require(`./src-BWFVB-OE.cjs`);let n=require(`node:fs`);n=e.v(n);let r=require(`node:path`);r=e.v(r);let i=require(`node:process`);i=e.v(i);let a=require(`commander`);a=e.v(a);let o=require(`node:url`);o=e.v(o);let s=require(`ajv`);s=e.v(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.o(`❌ Schema validation error:`,`error`),e.o(` ${r}`,`error`)),{valid:!1,errors:[r]}}}function h(t){e.o(`❌ Schema validation failed:`,`error`),e.o(``,`error`),e.o(`The following validation errors were found:`,`error`),e.o(``,`error`);for(let n of t)e.o(` • ${n}`,`error`);e.o(``,`error`),e.o(`Please fix these errors in your template configuration file.`,`error`),e.o(``,`error`),e.o(`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.o(`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.o(`⚠️ No tasks found in TypeScript file or invalid format`,`warn`),e.o(`Expected default export or named export "tasks" with TaskDefinition[]`,`info`))}catch(t){e.o(`Failed to load TypeScript tasks file: ${a.tasksTs}`,`error`),t instanceof Error&&e.o(` 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.o(`Validating task configuration against schema...`,`info`);let t=n.default.readFileSync(u,`utf-8`);m(JSON.parse(t),{silent:!1}).valid||(e.o(``,`error`),e.o(`💡 You can skip validation with --no-validate flag, but this is not recommended.`,`info`),i.default.exit(1)),e.o(`✓ Schema validation passed`,`success`)}let r=await t.p(u);o=r.tasks,s=r.variables,c=r.prompts,Array.isArray(o)||(e.o(`❌ Invalid tasks file format`,`error`),e.o(`Expected JSON with { "tasks": [...] } structure`,`info`),i.default.exit(1))}catch(t){e.o(`Failed to load JSON tasks file: ${a.tasksFile}`,`error`),t instanceof Error&&e.o(` Error: ${t.message}`,`error`),i.default.exit(1)}}else e.o(`Tasks file not found: ${a.tasksFile}`,`warn`)}let u=c!=null&&c.length>0||s!=null&&s.length>0;o.length===0&&!u&&(e.o(`❌ No tasks defined`,`error`),e.o(`Please provide tasks using one of these methods:`,`info`),e.o(` 1. Create a template-tasks.json file in the current directory`,`info`),e.o(` 2. Create a template-tasks.ts file in the current directory`,`info`),e.o(` 3. Use --tasks-file option to specify a different JSON file`,`info`),e.o(` 4. Use --tasks-ts option to specify a different TypeScript file`,`info`),e.o(`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.o(`Loaded template with 0 tasks (template may only provide prompts/variables for extending)`,`info`):e.o(`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.o(`❌ CLI execution failed`,`error`),t instanceof Error){e.o(`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,p as t}from"./src-
|
|
2
|
+
import{n as e,p as t}from"./src-DYtpmv9N.js";import{o as n}from"./utils-ii_k_uXl.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-BeLs5aXN.cjs`),t=require(`./src-BWFVB-OE.cjs`);exports.callHook=t.b,exports.clearPlugins=t.x,exports.clearTemplateCache=t.d,exports.collectPrompts=t.v,exports.collectVariables=t.o,exports.createPlugin=t.S,exports.displayTasksDiff=t.N,exports.evaluateCondition=e.r,exports.executePluginTask=t.C,exports.executeTask=t.c,exports.getDeleteDiff=t.P,exports.getExecDiff=t.F,exports.getGitInitDiff=t.I,exports.getGitRepoInfo=e.i,exports.getPlugin=t.w,exports.getPluginForTaskType=t.T,exports.getPluginTaskDiff=t.E,exports.getRegexReplaceDiff=t.L,exports.getRenameDiff=t.R,exports.getReplaceInFileDiff=t.z,exports.getTaskDiff=t.B,exports.getTemplateDiff=t.V,exports.getUpdateJsonDiff=t.H,exports.interpolateTemplate=e.a,exports.isPluginTaskType=t.D,exports.listPlugins=t.O,exports.loadAndMergeTemplate=t.f,exports.loadTasksWithInheritance=t.p,exports.loadTemplate=t.m,exports.log=e.o,exports.main=t.t,exports.mergeTemplates=t.h,exports.prompt=e.s,exports.promptYesNo=e.c,exports.registerBuiltInPlugins=t.l,exports.registerHooks=t.k,exports.registerPlugin=t.A,exports.resolveAllDefaultValues=t._,exports.resolveAllVariableValues=t.i,exports.resolveDefaultValue=t.y,exports.resolveVariableValue=t.a,exports.runTask=t.u,exports.runWithTasks=t.n,exports.setNestedProperty=e.l,exports.topologicalSort=t.s,exports.unregisterPlugin=t.j,exports.validatePluginTask=t.M,exports.validatePrompts=t.g,exports.validateVariables=t.r;
|
package/dist/index.d.cts
CHANGED
|
@@ -117,9 +117,12 @@ interface ConditionalEnabled {
|
|
|
117
117
|
condition: ConditionExpression;
|
|
118
118
|
}
|
|
119
119
|
/**
|
|
120
|
-
* Type for enabled field that can be boolean or conditional
|
|
120
|
+
* Type for enabled field that can be boolean, string condition, or conditional object
|
|
121
|
+
* - boolean: Simple true/false
|
|
122
|
+
* - string: JavaScript expression to evaluate (shorthand for { condition: "..." })
|
|
123
|
+
* - ConditionalEnabled: Object with condition property
|
|
121
124
|
*/
|
|
122
|
-
type EnabledValue = boolean | ConditionalEnabled;
|
|
125
|
+
type EnabledValue = boolean | string | ConditionalEnabled;
|
|
123
126
|
interface BasePrompt {
|
|
124
127
|
id: string;
|
|
125
128
|
type: PromptType;
|
|
@@ -505,8 +508,17 @@ declare function interpolateTemplate(template: string, config: InitConfig): stri
|
|
|
505
508
|
declare function setNestedProperty(obj: Record<string, unknown>, propertyPath: string, value: unknown): void;
|
|
506
509
|
/**
|
|
507
510
|
* Evaluate a condition expression with the given config
|
|
508
|
-
|
|
509
|
-
|
|
511
|
+
* @param condition - JavaScript expression to evaluate
|
|
512
|
+
* @param config - Configuration context for evaluation
|
|
513
|
+
* @param options - Optional evaluation options
|
|
514
|
+
* @param options.lazy - If true, return true (assume enabled) when condition fails due to missing variables
|
|
515
|
+
* @param options.silent - If true, suppress warning messages
|
|
516
|
+
* @returns The result of condition evaluation
|
|
517
|
+
*/
|
|
518
|
+
declare function evaluateCondition(condition: string, config: InitConfig, options?: {
|
|
519
|
+
lazy?: boolean;
|
|
520
|
+
silent?: boolean;
|
|
521
|
+
}): boolean;
|
|
510
522
|
//#endregion
|
|
511
523
|
//#region src/variables/collect-variables.d.ts
|
|
512
524
|
/**
|
package/dist/index.d.ts
CHANGED
|
@@ -117,9 +117,12 @@ interface ConditionalEnabled {
|
|
|
117
117
|
condition: ConditionExpression;
|
|
118
118
|
}
|
|
119
119
|
/**
|
|
120
|
-
* Type for enabled field that can be boolean or conditional
|
|
120
|
+
* Type for enabled field that can be boolean, string condition, or conditional object
|
|
121
|
+
* - boolean: Simple true/false
|
|
122
|
+
* - string: JavaScript expression to evaluate (shorthand for { condition: "..." })
|
|
123
|
+
* - ConditionalEnabled: Object with condition property
|
|
121
124
|
*/
|
|
122
|
-
type EnabledValue = boolean | ConditionalEnabled;
|
|
125
|
+
type EnabledValue = boolean | string | ConditionalEnabled;
|
|
123
126
|
interface BasePrompt {
|
|
124
127
|
id: string;
|
|
125
128
|
type: PromptType;
|
|
@@ -505,8 +508,17 @@ declare function interpolateTemplate(template: string, config: InitConfig): stri
|
|
|
505
508
|
declare function setNestedProperty(obj: Record<string, unknown>, propertyPath: string, value: unknown): void;
|
|
506
509
|
/**
|
|
507
510
|
* Evaluate a condition expression with the given config
|
|
508
|
-
|
|
509
|
-
|
|
511
|
+
* @param condition - JavaScript expression to evaluate
|
|
512
|
+
* @param config - Configuration context for evaluation
|
|
513
|
+
* @param options - Optional evaluation options
|
|
514
|
+
* @param options.lazy - If true, return true (assume enabled) when condition fails due to missing variables
|
|
515
|
+
* @param options.silent - If true, suppress warning messages
|
|
516
|
+
* @returns The result of condition evaluation
|
|
517
|
+
*/
|
|
518
|
+
declare function evaluateCondition(condition: string, config: InitConfig, options?: {
|
|
519
|
+
lazy?: boolean;
|
|
520
|
+
silent?: boolean;
|
|
521
|
+
}): boolean;
|
|
510
522
|
//#endregion
|
|
511
523
|
//#region src/variables/collect-variables.d.ts
|
|
512
524
|
/**
|
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,H as o,I as s,L as c,M as l,N as u,O as d,P as f,R as p,S as m,T as h,V as g,_,a as v,b as y,c as b,d as x,f as S,g as C,h as w,i as T,j as E,k as D,l as O,m as k,n as A,o as j,p as M,r as N,s as P,t as F,u as I,v as L,w as R,x as z,y as B,z as V}from"./src-
|
|
1
|
+
import{A as e,B as t,C as n,D as r,E as i,F as a,H as o,I as s,L as c,M as l,N as u,O as d,P as f,R as p,S as m,T as h,V as g,_,a as v,b as y,c as b,d as x,f as S,g as C,h as w,i as T,j as E,k as D,l as O,m as k,n as A,o as j,p as M,r as N,s as P,t as F,u as I,v as L,w as R,x as z,y as B,z as V}from"./src-DYtpmv9N.js";import{a as H,c as U,i as W,l as G,o as K,r as q,s as J}from"./utils-ii_k_uXl.js";export{y as callHook,z as clearPlugins,x as clearTemplateCache,L as collectPrompts,j as collectVariables,m as createPlugin,u as displayTasksDiff,q as evaluateCondition,n as executePluginTask,b as executeTask,f as getDeleteDiff,a as getExecDiff,s as getGitInitDiff,W as getGitRepoInfo,R as getPlugin,h as getPluginForTaskType,i as getPluginTaskDiff,c as getRegexReplaceDiff,p as getRenameDiff,V as getReplaceInFileDiff,t as getTaskDiff,g as getTemplateDiff,o as getUpdateJsonDiff,H as interpolateTemplate,r as isPluginTaskType,d as listPlugins,S as loadAndMergeTemplate,M as loadTasksWithInheritance,k as loadTemplate,K as log,F as main,w as mergeTemplates,J as prompt,U as promptYesNo,O as registerBuiltInPlugins,D as registerHooks,e as registerPlugin,_ as resolveAllDefaultValues,T as resolveAllVariableValues,B as resolveDefaultValue,v as resolveVariableValue,I as runTask,A as runWithTasks,G as setNestedProperty,P as topologicalSort,E as unregisterPlugin,l as validatePluginTask,C as validatePrompts,N as validateVariables};
|
|
@@ -0,0 +1,17 @@
|
|
|
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}});
|
|
@@ -0,0 +1,17 @@
|
|
|
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};
|
|
@@ -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);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}});
|
|
@@ -1 +1 @@
|
|
|
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-
|
|
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};
|
|
@@ -1 +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 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){return e===void 0?!0:typeof e==`boolean`?e:typeof e==`object`&&`condition`in e?b(e.condition,t):!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){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch(t){return _(`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};
|
|
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};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const e=require(`./utils-
|
|
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;
|
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.19.0",
|
|
5
5
|
"author": "PixPilot <m.doaie@hotmail.com>",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"@inquirer/prompts": "^7.9.0",
|
|
40
|
+
"ajv": "^8.17.1",
|
|
40
41
|
"commander": "^14.0.1",
|
|
41
42
|
"handlebars": "^4.7.8"
|
|
42
43
|
},
|
|
@@ -47,10 +48,10 @@
|
|
|
47
48
|
"tsdown": "^0.15.8",
|
|
48
49
|
"typescript": "^5.9.3",
|
|
49
50
|
"@internal/eslint-config": "0.3.0",
|
|
51
|
+
"@internal/tsconfig": "0.1.0",
|
|
50
52
|
"@internal/prettier-config": "0.0.1",
|
|
51
53
|
"@internal/tsdown-config": "0.1.0",
|
|
52
|
-
"@internal/vitest-config": "0.1.0"
|
|
53
|
-
"@internal/tsconfig": "0.1.0"
|
|
54
|
+
"@internal/vitest-config": "0.1.0"
|
|
54
55
|
},
|
|
55
56
|
"prettier": "@internal/prettier-config",
|
|
56
57
|
"scripts": {
|
package/schema/tasks.schema.json
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
"description": "Configuration for template task automation and cleanup",
|
|
5
5
|
"type": "object",
|
|
6
6
|
"required": ["name"],
|
|
7
|
+
"additionalProperties": false,
|
|
7
8
|
"properties": {
|
|
8
9
|
"name": {
|
|
9
10
|
"type": "string",
|
|
@@ -43,6 +44,7 @@
|
|
|
43
44
|
"items": {
|
|
44
45
|
"type": "object",
|
|
45
46
|
"required": ["id", "value"],
|
|
47
|
+
"additionalProperties": false,
|
|
46
48
|
"properties": {
|
|
47
49
|
"id": {
|
|
48
50
|
"type": "string",
|
|
@@ -86,6 +88,7 @@
|
|
|
86
88
|
"items": {
|
|
87
89
|
"type": "object",
|
|
88
90
|
"required": ["id", "type", "message"],
|
|
91
|
+
"additionalProperties": false,
|
|
89
92
|
"properties": {
|
|
90
93
|
"id": {
|
|
91
94
|
"type": "string",
|
|
@@ -106,12 +109,16 @@
|
|
|
106
109
|
"description": "Whether the prompt value is required (cannot be empty)"
|
|
107
110
|
},
|
|
108
111
|
"enabled": {
|
|
109
|
-
"description": "Whether this prompt should be displayed. Can be a boolean or a conditional expression based on variables or other prompt values.",
|
|
112
|
+
"description": "Whether this prompt should be displayed. Can be a boolean, a string expression, or a conditional expression based on variables or other prompt values.",
|
|
110
113
|
"oneOf": [
|
|
111
114
|
{
|
|
112
115
|
"type": "boolean",
|
|
113
116
|
"description": "Static enabled state"
|
|
114
117
|
},
|
|
118
|
+
{
|
|
119
|
+
"type": "string",
|
|
120
|
+
"description": "JavaScript expression to evaluate (shorthand for { condition: \"...\" }). Prompt only displays if expression evaluates to true."
|
|
121
|
+
},
|
|
115
122
|
{
|
|
116
123
|
"type": "object",
|
|
117
124
|
"description": "Conditional enabled configuration",
|
|
@@ -212,6 +219,7 @@
|
|
|
212
219
|
"items": {
|
|
213
220
|
"type": "object",
|
|
214
221
|
"required": ["id", "name", "type"],
|
|
222
|
+
"additionalProperties": false,
|
|
215
223
|
"properties": {
|
|
216
224
|
"id": {
|
|
217
225
|
"type": "string",
|
|
@@ -231,13 +239,17 @@
|
|
|
231
239
|
"default": true
|
|
232
240
|
},
|
|
233
241
|
"enabled": {
|
|
234
|
-
"description": "Whether this task should be executed. Can be a boolean or a conditional expression based on variables or prompt values (optional, defaults to true).",
|
|
242
|
+
"description": "Whether this task should be executed. Can be a boolean, a string expression, or a conditional expression based on variables or prompt values (optional, defaults to true).",
|
|
235
243
|
"default": true,
|
|
236
244
|
"oneOf": [
|
|
237
245
|
{
|
|
238
246
|
"type": "boolean",
|
|
239
247
|
"description": "Static enabled state"
|
|
240
248
|
},
|
|
249
|
+
{
|
|
250
|
+
"type": "string",
|
|
251
|
+
"description": "JavaScript expression to evaluate (shorthand for { condition: \"...\" }). Task only executes if expression evaluates to true."
|
|
252
|
+
},
|
|
241
253
|
{
|
|
242
254
|
"type": "object",
|
|
243
255
|
"description": "Conditional enabled configuration",
|
|
@@ -263,12 +275,17 @@
|
|
|
263
275
|
"enum": ["merge", "replace"],
|
|
264
276
|
"description": "Strategy for merging with base task when extending templates. 'merge' (default) intelligently merges properties, 'replace' completely replaces the base task. Must be specified when task ID conflicts with base template."
|
|
265
277
|
},
|
|
278
|
+
"$sourceUrl": {
|
|
279
|
+
"type": "string",
|
|
280
|
+
"description": "Internal: URL or path of the template file this task came from (for resolving relative paths). This property is automatically added by the template inheritance system."
|
|
281
|
+
},
|
|
266
282
|
"prompts": {
|
|
267
283
|
"type": "array",
|
|
268
284
|
"description": "Task-specific prompts collected when the task is executed. These values are only available to this task.",
|
|
269
285
|
"items": {
|
|
270
286
|
"type": "object",
|
|
271
287
|
"required": ["id", "type", "message"],
|
|
288
|
+
"additionalProperties": false,
|
|
272
289
|
"properties": {
|
|
273
290
|
"id": {
|
|
274
291
|
"type": "string",
|
|
@@ -289,12 +306,16 @@
|
|
|
289
306
|
"description": "Whether the prompt value is required (cannot be empty)"
|
|
290
307
|
},
|
|
291
308
|
"enabled": {
|
|
292
|
-
"description": "Whether this prompt should be displayed. Can be a boolean or a conditional expression based on variables or other prompt values.",
|
|
309
|
+
"description": "Whether this prompt should be displayed. Can be a boolean, a string expression, or a conditional expression based on variables or other prompt values.",
|
|
293
310
|
"oneOf": [
|
|
294
311
|
{
|
|
295
312
|
"type": "boolean",
|
|
296
313
|
"description": "Static enabled state"
|
|
297
314
|
},
|
|
315
|
+
{
|
|
316
|
+
"type": "string",
|
|
317
|
+
"description": "JavaScript expression to evaluate (shorthand for { condition: \"...\" }). Prompt only displays if expression evaluates to true."
|
|
318
|
+
},
|
|
298
319
|
{
|
|
299
320
|
"type": "object",
|
|
300
321
|
"description": "Conditional enabled configuration",
|
|
@@ -391,6 +412,7 @@
|
|
|
391
412
|
"items": {
|
|
392
413
|
"type": "object",
|
|
393
414
|
"required": ["id", "value"],
|
|
415
|
+
"additionalProperties": false,
|
|
394
416
|
"properties": {
|
|
395
417
|
"id": {
|
|
396
418
|
"type": "string",
|
package/dist/src-Bz_skljF.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-DLJmCo92.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){l(`Prompt "${n}": conditional default requires context but none was provided`,`warn`);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-B8XKlHJ4.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;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()));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/src-Cjwkvk6V.cjs
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
const e=require(`./utils-BOEvDxDB.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){e.o(`Prompt "${n}": conditional default requires context but none was provided`,`warn`);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-C9ZSOWzP.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;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()));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/utils-BOEvDxDB.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){return e===void 0?!0:typeof e==`boolean`?e:typeof e==`object`&&`condition`in e?O(e.condition,t):!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){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch(t){return 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}});
|