@pixpilot/scaffoldfy 0.56.0 → 0.57.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/README.md +15 -8
  2. package/dist/cli.cjs +21 -1
  3. package/dist/cli.js +11 -1
  4. package/dist/{configurations-C9hGwa2c.cjs → configurations-iSmGgORy.cjs} +1 -1
  5. package/dist/{configurations-C6TwZWBm.js → configurations-sRFCjZJV.js} +1 -1
  6. package/dist/index.cjs +1 -1
  7. package/dist/index.d.cts +27 -1
  8. package/dist/index.d.ts +27 -1
  9. package/dist/index.js +1 -1
  10. package/dist/{run-configuration-sequentially-BK8SqkMc.cjs → run-configuration-sequentially-DvhESKyi.cjs} +2 -2
  11. package/dist/run-configuration-sequentially-QttHwxn_.js +4 -0
  12. package/dist/scaffoldfy-config-validator/cli.cjs +2 -2
  13. package/dist/scaffoldfy-config-validator/cli.js +2 -2
  14. package/dist/scaffoldfy-config-validator/index.cjs +1 -1
  15. package/dist/scaffoldfy-config-validator/index.js +1 -1
  16. package/dist/scaffoldfy-config-validator/validate-scaffoldfy-json.cjs +1 -1
  17. package/dist/scaffoldfy-config-validator/validate-scaffoldfy-json.js +1 -1
  18. package/dist/{src-BN2NvYkL.cjs → src-C8x8K2Wl.cjs} +1 -1
  19. package/dist/{src-DnGLJZBR.js → src-DeP5BHt6.js} +1 -1
  20. package/dist/tasks-CoJIuLRc.js +26 -0
  21. package/dist/tasks-sQUUhxhX.cjs +26 -0
  22. package/dist/{utils-C0leVEJZ.cjs → utils-Co7iWW4X.cjs} +1 -1
  23. package/dist/{utils-vMswJANY.js → utils-uPeG29Q4.js} +1 -1
  24. package/dist/{validate-scaffoldfy-json-C0CBAgLY.js → validate-scaffoldfy-json-DZ1arWdk.js} +1 -1
  25. package/dist/{validate-scaffoldfy-json-vxz6VQQa.cjs → validate-scaffoldfy-json-DgRRmNSc.cjs} +1 -1
  26. package/package.json +4 -4
  27. package/dist/run-configuration-sequentially-CCnrvgMw.js +0 -4
  28. package/dist/tasks-CfkqwNGd.cjs +0 -23
  29. package/dist/tasks-cEW0YvaN.js +0 -23
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- import"../configurations-C6TwZWBm.js";import{n as e}from"../validate-scaffoldfy-json-C0CBAgLY.js";import t from"node:path";import n from"node:fs";import r from"node:process";import{Command as i}from"commander";function a(e){let r=[];function i(e){let a=n.readdirSync(e,{withFileTypes:!0});for(let n of a){let a=t.join(e,n.name);n.isDirectory()?n.name!==`node_modules`&&n.name!==`.git`&&!n.name.startsWith(`.`)&&i(a):n.isFile()&&/\.jsonc?$/u.test(n.name)&&r.push(a)}}return i(e),r}function o(){let t=new i;t.name(`validate-scaffoldfy-json`).description(`Validate scaffoldfy JSON and JSONC files against their schemas`).version(`1.0.0`).option(`-f, --file <path>`,`Path to a JSON or JSONC file to validate`).option(`-d, --dir <path>`,`Path to a directory to scan for JSON and JSONC files`).parse(r.argv);let n=t.opts(),o=[];n.file!==void 0&&n.file!==``?o=[n.file]:n.dir!==void 0&&n.dir!==``?(console.log(`Scanning directory: ${n.dir}`),o=a(n.dir),console.log(`Found ${o.length} JSON or JSONC file(s)\n`)):(console.error(`Error: Please provide either --file or --dir option`),t.help());let s=!1;for(let t of o){console.log(`Validating ${t}...`);let n=e(t);if(n.valid)console.log(`✅ ${t} is valid`);else if(s=!0,console.error(`❌ ${t} validation failed:`),n.errors)for(let e of n.errors)console.error(` ${e}`)}s&&r.exit(1),console.log(`
3
- ✅ All files validated successfully!`)}import.meta.url===`file://${r.argv[1]}`&&o();export{};
2
+ import"../configurations-sRFCjZJV.js";import{n as e}from"../validate-scaffoldfy-json-DZ1arWdk.js";import t from"node:process";import n from"node:path";import r from"node:fs";import{Command as i}from"commander";function a(e){let t=[];function i(e){let a=r.readdirSync(e,{withFileTypes:!0});for(let r of a){let a=n.join(e,r.name);r.isDirectory()?r.name!==`node_modules`&&r.name!==`.git`&&!r.name.startsWith(`.`)&&i(a):r.isFile()&&/\.jsonc?$/u.test(r.name)&&t.push(a)}}return i(e),t}function o(){let n=new i;n.name(`validate-scaffoldfy-json`).description(`Validate scaffoldfy JSON and JSONC files against their schemas`).version(`1.0.0`).option(`-f, --file <path>`,`Path to a JSON or JSONC file to validate`).option(`-d, --dir <path>`,`Path to a directory to scan for JSON and JSONC files`).parse(t.argv);let r=n.opts(),o=[];r.file!==void 0&&r.file!==``?o=[r.file]:r.dir!==void 0&&r.dir!==``?(console.log(`Scanning directory: ${r.dir}`),o=a(r.dir),console.log(`Found ${o.length} JSON or JSONC file(s)\n`)):(console.error(`Error: Please provide either --file or --dir option`),n.help());let s=!1;for(let t of o){console.log(`Validating ${t}...`);let n=e(t);if(n.valid)console.log(`✅ ${t} is valid`);else if(s=!0,console.error(`❌ ${t} validation failed:`),n.errors)for(let e of n.errors)console.error(` ${e}`)}s&&t.exit(1),console.log(`
3
+ ✅ All files validated successfully!`)}import.meta.url===`file://${t.argv[1]}`&&o();export{};
@@ -1 +1 @@
1
- require(`../configurations-C9hGwa2c.cjs`);const e=require(`../validate-scaffoldfy-json-vxz6VQQa.cjs`);require(`../scaffoldfy-config-validator-BvNnGMO1.cjs`),exports.displayValidationErrors=e.t,exports.validateScaffoldfyJsonFile=e.n,exports.validateTasksSchema=e.r;
1
+ require(`../configurations-iSmGgORy.cjs`);const e=require(`../validate-scaffoldfy-json-DgRRmNSc.cjs`);require(`../scaffoldfy-config-validator-BvNnGMO1.cjs`),exports.displayValidationErrors=e.t,exports.validateScaffoldfyJsonFile=e.n,exports.validateTasksSchema=e.r;
@@ -1 +1 @@
1
- import"../configurations-C6TwZWBm.js";import{n as e,r as t,t as n}from"../validate-scaffoldfy-json-C0CBAgLY.js";import"../scaffoldfy-config-validator-D1iJBnRE.js";export{n as displayValidationErrors,e as validateScaffoldfyJsonFile,t as validateTasksSchema};
1
+ import"../configurations-sRFCjZJV.js";import{n as e,r as t,t as n}from"../validate-scaffoldfy-json-DZ1arWdk.js";import"../scaffoldfy-config-validator-D1iJBnRE.js";export{n as displayValidationErrors,e as validateScaffoldfyJsonFile,t as validateTasksSchema};
@@ -1 +1 @@
1
- require(`../configurations-C9hGwa2c.cjs`);const e=require(`../validate-scaffoldfy-json-vxz6VQQa.cjs`);exports.displayValidationErrors=e.t,exports.validateScaffoldfyJsonFile=e.n,exports.validateTasksSchema=e.r;
1
+ require(`../configurations-iSmGgORy.cjs`);const e=require(`../validate-scaffoldfy-json-DgRRmNSc.cjs`);exports.displayValidationErrors=e.t,exports.validateScaffoldfyJsonFile=e.n,exports.validateTasksSchema=e.r;
@@ -1 +1 @@
1
- import"../configurations-C6TwZWBm.js";import{n as e,r as t,t as n}from"../validate-scaffoldfy-json-C0CBAgLY.js";export{n as displayValidationErrors,e as validateScaffoldfyJsonFile,t as validateTasksSchema};
1
+ import"../configurations-sRFCjZJV.js";import{n as e,r as t,t as n}from"../validate-scaffoldfy-json-DZ1arWdk.js";export{n as displayValidationErrors,e as validateScaffoldfyJsonFile,t as validateTasksSchema};
@@ -1 +1 @@
1
- const e=require(`./configurations-C9hGwa2c.cjs`),t=require(`./initial-config-CESipc-c.cjs`),n=require(`./tasks-CfkqwNGd.cjs`),r=require(`./validate-scaffoldfy-json-vxz6VQQa.cjs`);let i=require(`node:process`);i=e.z(i);async function a(a,o){let s=t.t();if(!await e.E(o.configEnabled,s,{lazy:!0})){e.A(`⊘ Template is disabled - skipping all execution`);return}o.transformers!==void 0&&o.transformers.length>0&&(e.O(`Registering ${o.transformers.length} transformer(s)...`),e.s.registerAll(o.transformers)),e.O(`Registering built-in plugins...`),n.o(),e.O(`Validating task configurations...`);let c=n.t(a);c.length>0&&(r.t(c),i.default.exit(1)),e.O(`All tasks validated successfully`);let l=a.filter(n=>e.T(n.enabled,t.t(),{lazy:!0}));e.O(`Resolving task dependencies...`);let u=n.i(l);e.O(`Sorted ${u.length} task(s) by dependencies`),e.A(`Welcome! Let's execute your tasks.`),o.dryRun&&e.P(`🔍 DRY RUN MODE - No changes will be made`),e.A(`This will execute your project tasks based on the defined configuration.`);let d=s,f=[...o.variables??[]];if(f.length>0){let t=e.i(f);t.length>0&&(e.j(`❌ Variable validation errors:`,`error`),t.forEach(t=>e.j(` - ${t}`,`error`)),i.default.exit(1)),e.O(`Resolving variable values...`);let n=await e.o(f,await e.a(f,d,{skipConditional:!0}),d);Object.assign(d,n),Object.keys(n).length>0&&(e.O(`Resolved ${Object.keys(n).length} variable(s)`),e.O(`Variable values: ${JSON.stringify(n)}`))}let p=o.prompts??[],m=[...p];if(m.length>0){let t=n.c(m);t.length>0&&(e.j(`❌ Prompt validation errors:`,`error`),t.forEach(t=>e.j(` - ${t}`,`error`)),i.default.exit(1)),e.O(`Resolving prompt default values...`);let r=await n.l(m,d);if(p.length>0){e.A(`📋 Collecting prompts (available to all tasks):`);let t=await n.u(p,r,d);Object.assign(d,t)}}if(f.length>0){let t=f.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1);if(t.length>0){e.O(`Re-resolving conditional variables with prompt values...`);let n=await e.o(t,await e.a(t,d),d);Object.assign(d,n),Object.keys(n).length>0&&e.O(`Resolved ${Object.keys(n).length} conditional variable(s)`)}}if(!await e.E(o.configEnabled,d)){e.A(`⊘ Template is disabled after variable resolution - skipping all execution`);return}let h=[];for(let t of u)t.$configEnabled!=null&&!await e.E(t.$configEnabled,d)||await e.E(t.enabled,d)&&h.push(t);if(e.j(`${h.length} of ${u.length} task(s) enabled for execution`,`info`),o.dryRun){await n.w(h,d),e.A(`🔍 Dry run completed - no changes were made`),e.A(`Run without --dry-run to apply changes`);return}e.O(`Calling beforeAll hook...`),await n.S(`beforeAll`,d);let g=h.length,_=0,v=0,y=[],b=[];for(let t=0;t<h.length;t++){let r=h[t];r!=null&&(e.O(`Calling beforeTask hook for task: ${r.name}`),await n.S(`beforeTask`,r,d),await n.s(r,d,t+1,g,o.dryRun)?(_++,y.push(r.id),e.O(`Calling afterTask hook for task: ${r.name}`),await n.S(`afterTask`,r,d)):(await e.w(r.required,d)&&(v++,b.push(r.name)),e.O(`Calling onError hook for task: ${r.name}`),await n.S(`onError`,Error(`Task ${r.name} failed`),r),e.P(`⚠️ Task "${r.name}" failed, continuing with remaining tasks...`)))}v>0&&(e.j(`\n❌ Task execution completed with ${v} error(s)`,`error`),e.j(`Completed: ${_}/${g} tasks`,`info`),e.j(`Failed tasks: ${b.join(`, `)}`,`error`),i.default.exit(1)),e.O(`Calling afterAll hook...`),await n.S(`afterAll`,d),e.N(`✅ All tasks completed successfully!`),e.N(` Completed: ${_}/${g} tasks`)}const o=i.default.argv.includes(`--dry-run`),s=i.default.argv.includes(`--force`);async function c(t,n){try{await a(t,{dryRun:n?.dryRun??o,force:n?.force??s,configFilePath:n?.configFilePath??void 0,...n?.variables!=null&&{variables:n.variables},...n?.prompts!=null&&{prompts:n.prompts},...n?.configEnabled!=null&&{configEnabled:n.configEnabled},...n?.transformers!=null&&{transformers:n.transformers}})}catch(t){e.j(`❌ Task execution failed`,`error`),t instanceof Error?(e.j(`Error: ${t.message}`,`error`),i.default.env.DEBUG!=null&&console.error(t.stack)):console.error(t),i.default.exit(1)}}Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return c}});
1
+ const e=require(`./configurations-iSmGgORy.cjs`),t=require(`./initial-config-CESipc-c.cjs`),n=require(`./tasks-sQUUhxhX.cjs`),r=require(`./validate-scaffoldfy-json-DgRRmNSc.cjs`);let i=require(`node:process`);i=e.z(i);async function a(a,o){let s=t.t();if(!await e.E(o.configEnabled,s,{lazy:!0})){e.A(`⊘ Template is disabled - skipping all execution`);return}o.transformers!==void 0&&o.transformers.length>0&&(e.O(`Registering ${o.transformers.length} transformer(s)...`),e.s.registerAll(o.transformers)),e.O(`Registering built-in plugins...`),n.o(),e.O(`Validating task configurations...`);let c=n.t(a);c.length>0&&(r.t(c),i.default.exit(1)),e.O(`All tasks validated successfully`);let l=a.filter(n=>e.T(n.enabled,t.t(),{lazy:!0}));e.O(`Resolving task dependencies...`);let u=n.i(l);e.O(`Sorted ${u.length} task(s) by dependencies`),e.A(`Welcome! Let's execute your tasks.`),o.dryRun&&e.P(`🔍 DRY RUN MODE - No changes will be made`),e.A(`This will execute your project tasks based on the defined configuration.`);let d=s,f=[...o.variables??[]];if(f.length>0){let t=e.i(f);t.length>0&&(e.j(`❌ Variable validation errors:`,`error`),t.forEach(t=>e.j(` - ${t}`,`error`)),i.default.exit(1)),e.O(`Resolving variable values...`);let n=await e.o(f,await e.a(f,d,{skipConditional:!0}),d);Object.assign(d,n),Object.keys(n).length>0&&(e.O(`Resolved ${Object.keys(n).length} variable(s)`),e.O(`Variable values: ${JSON.stringify(n)}`))}let p=o.prompts??[],m=[...p];if(m.length>0){let t=n.c(m);t.length>0&&(e.j(`❌ Prompt validation errors:`,`error`),t.forEach(t=>e.j(` - ${t}`,`error`)),i.default.exit(1)),e.O(`Resolving prompt default values...`);let r=await n.l(m,d);if(p.length>0){e.A(`📋 Collecting prompts (available to all tasks):`);let t=await n.u(p,r,d);Object.assign(d,t)}}if(f.length>0){let t=f.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1);if(t.length>0){e.O(`Re-resolving conditional variables with prompt values...`);let n=await e.o(t,await e.a(t,d),d);Object.assign(d,n),Object.keys(n).length>0&&e.O(`Resolved ${Object.keys(n).length} conditional variable(s)`)}}if(!await e.E(o.configEnabled,d)){e.A(`⊘ Template is disabled after variable resolution - skipping all execution`);return}let h=[];for(let t of u)t.$configEnabled!=null&&!await e.E(t.$configEnabled,d)||await e.E(t.enabled,d)&&h.push(t);if(e.j(`${h.length} of ${u.length} task(s) enabled for execution`,`info`),o.dryRun){await n.O(h,d),e.A(`🔍 Dry run completed - no changes were made`),e.A(`Run without --dry-run to apply changes`);return}e.O(`Calling beforeAll hook...`),await n.E(`beforeAll`,d);let g=h.length,_=0,v=0,y=[],b=[];for(let t=0;t<h.length;t++){let r=h[t];r!=null&&(e.O(`Calling beforeTask hook for task: ${r.name}`),await n.E(`beforeTask`,r,d),await n.s(r,d,t+1,g,o.dryRun)?(_++,y.push(r.id),e.O(`Calling afterTask hook for task: ${r.name}`),await n.E(`afterTask`,r,d)):(await e.w(r.required,d)&&(v++,b.push(r.name)),e.O(`Calling onError hook for task: ${r.name}`),await n.E(`onError`,Error(`Task ${r.name} failed`),r),e.P(`⚠️ Task "${r.name}" failed, continuing with remaining tasks...`)))}v>0&&(e.j(`\n❌ Task execution completed with ${v} error(s)`,`error`),e.j(`Completed: ${_}/${g} tasks`,`info`),e.j(`Failed tasks: ${b.join(`, `)}`,`error`),i.default.exit(1)),e.O(`Calling afterAll hook...`),await n.E(`afterAll`,d),e.N(`✅ All tasks completed successfully!`),e.N(` Completed: ${_}/${g} tasks`)}const o=i.default.argv.includes(`--dry-run`),s=i.default.argv.includes(`--force`);async function c(t,n){try{await a(t,{dryRun:n?.dryRun??o,force:n?.force??s,configFilePath:n?.configFilePath??void 0,...n?.variables!=null&&{variables:n.variables},...n?.prompts!=null&&{prompts:n.prompts},...n?.configEnabled!=null&&{configEnabled:n.configEnabled},...n?.transformers!=null&&{transformers:n.transformers}})}catch(t){e.j(`❌ Task execution failed`,`error`),t instanceof Error?(e.j(`Error: ${t.message}`,`error`),i.default.env.DEBUG!=null&&console.error(t.stack)):console.error(t),i.default.exit(1)}}Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return c}});
@@ -1 +1 @@
1
- import{A as e,E as t,N as n,O as r,P as i,T as a,a as o,i as s,j as c,o as l,s as u,w as d}from"./configurations-C6TwZWBm.js";import{t as f}from"./initial-config-Dt0jw4Vs.js";import{S as p,c as m,i as h,l as g,o as _,s as v,t as y,u as b,w as x}from"./tasks-cEW0YvaN.js";import{t as S}from"./validate-scaffoldfy-json-C0CBAgLY.js";import C from"node:process";async function w(w,T){let E=f();if(!await t(T.configEnabled,E,{lazy:!0})){e(`⊘ Template is disabled - skipping all execution`);return}T.transformers!==void 0&&T.transformers.length>0&&(r(`Registering ${T.transformers.length} transformer(s)...`),u.registerAll(T.transformers)),r(`Registering built-in plugins...`),_(),r(`Validating task configurations...`);let D=y(w);D.length>0&&(S(D),C.exit(1)),r(`All tasks validated successfully`);let O=w.filter(e=>a(e.enabled,f(),{lazy:!0}));r(`Resolving task dependencies...`);let k=h(O);r(`Sorted ${k.length} task(s) by dependencies`),e(`Welcome! Let's execute your tasks.`),T.dryRun&&i(`🔍 DRY RUN MODE - No changes will be made`),e(`This will execute your project tasks based on the defined configuration.`);let A=E,j=[...T.variables??[]];if(j.length>0){let e=s(j);e.length>0&&(c(`❌ Variable validation errors:`,`error`),e.forEach(e=>c(` - ${e}`,`error`)),C.exit(1)),r(`Resolving variable values...`);let t=await l(j,await o(j,A,{skipConditional:!0}),A);Object.assign(A,t),Object.keys(t).length>0&&(r(`Resolved ${Object.keys(t).length} variable(s)`),r(`Variable values: ${JSON.stringify(t)}`))}let M=T.prompts??[],N=[...M];if(N.length>0){let t=m(N);t.length>0&&(c(`❌ Prompt validation errors:`,`error`),t.forEach(e=>c(` - ${e}`,`error`)),C.exit(1)),r(`Resolving prompt default values...`);let n=await g(N,A);if(M.length>0){e(`📋 Collecting prompts (available to all tasks):`);let t=await b(M,n,A);Object.assign(A,t)}}if(j.length>0){let e=j.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1);if(e.length>0){r(`Re-resolving conditional variables with prompt values...`);let t=await l(e,await o(e,A),A);Object.assign(A,t),Object.keys(t).length>0&&r(`Resolved ${Object.keys(t).length} conditional variable(s)`)}}if(!await t(T.configEnabled,A)){e(`⊘ Template is disabled after variable resolution - skipping all execution`);return}let P=[];for(let e of k)e.$configEnabled!=null&&!await t(e.$configEnabled,A)||await t(e.enabled,A)&&P.push(e);if(c(`${P.length} of ${k.length} task(s) enabled for execution`,`info`),T.dryRun){await x(P,A),e(`🔍 Dry run completed - no changes were made`),e(`Run without --dry-run to apply changes`);return}r(`Calling beforeAll hook...`),await p(`beforeAll`,A);let F=P.length,I=0,L=0,R=[],z=[];for(let e=0;e<P.length;e++){let t=P[e];t!=null&&(r(`Calling beforeTask hook for task: ${t.name}`),await p(`beforeTask`,t,A),await v(t,A,e+1,F,T.dryRun)?(I++,R.push(t.id),r(`Calling afterTask hook for task: ${t.name}`),await p(`afterTask`,t,A)):(await d(t.required,A)&&(L++,z.push(t.name)),r(`Calling onError hook for task: ${t.name}`),await p(`onError`,Error(`Task ${t.name} failed`),t),i(`⚠️ Task "${t.name}" failed, continuing with remaining tasks...`)))}L>0&&(c(`\n❌ Task execution completed with ${L} error(s)`,`error`),c(`Completed: ${I}/${F} tasks`,`info`),c(`Failed tasks: ${z.join(`, `)}`,`error`),C.exit(1)),r(`Calling afterAll hook...`),await p(`afterAll`,A),n(`✅ All tasks completed successfully!`),n(` Completed: ${I}/${F} tasks`)}const T=C.argv.includes(`--dry-run`),E=C.argv.includes(`--force`);async function D(e,t){try{await w(e,{dryRun:t?.dryRun??T,force:t?.force??E,configFilePath:t?.configFilePath??void 0,...t?.variables!=null&&{variables:t.variables},...t?.prompts!=null&&{prompts:t.prompts},...t?.configEnabled!=null&&{configEnabled:t.configEnabled},...t?.transformers!=null&&{transformers:t.transformers}})}catch(e){c(`❌ Task execution failed`,`error`),e instanceof Error?(c(`Error: ${e.message}`,`error`),C.env.DEBUG!=null&&console.error(e.stack)):console.error(e),C.exit(1)}}export{D as t};
1
+ import{A as e,E as t,N as n,O as r,P as i,T as a,a as o,i as s,j as c,o as l,s as u,w as d}from"./configurations-sRFCjZJV.js";import{t as f}from"./initial-config-Dt0jw4Vs.js";import{E as p,O as m,c as h,i as g,l as _,o as v,s as y,t as b,u as x}from"./tasks-CoJIuLRc.js";import{t as S}from"./validate-scaffoldfy-json-DZ1arWdk.js";import C from"node:process";async function w(w,T){let E=f();if(!await t(T.configEnabled,E,{lazy:!0})){e(`⊘ Template is disabled - skipping all execution`);return}T.transformers!==void 0&&T.transformers.length>0&&(r(`Registering ${T.transformers.length} transformer(s)...`),u.registerAll(T.transformers)),r(`Registering built-in plugins...`),v(),r(`Validating task configurations...`);let D=b(w);D.length>0&&(S(D),C.exit(1)),r(`All tasks validated successfully`);let O=w.filter(e=>a(e.enabled,f(),{lazy:!0}));r(`Resolving task dependencies...`);let k=g(O);r(`Sorted ${k.length} task(s) by dependencies`),e(`Welcome! Let's execute your tasks.`),T.dryRun&&i(`🔍 DRY RUN MODE - No changes will be made`),e(`This will execute your project tasks based on the defined configuration.`);let A=E,j=[...T.variables??[]];if(j.length>0){let e=s(j);e.length>0&&(c(`❌ Variable validation errors:`,`error`),e.forEach(e=>c(` - ${e}`,`error`)),C.exit(1)),r(`Resolving variable values...`);let t=await l(j,await o(j,A,{skipConditional:!0}),A);Object.assign(A,t),Object.keys(t).length>0&&(r(`Resolved ${Object.keys(t).length} variable(s)`),r(`Variable values: ${JSON.stringify(t)}`))}let M=T.prompts??[],N=[...M];if(N.length>0){let t=h(N);t.length>0&&(c(`❌ Prompt validation errors:`,`error`),t.forEach(e=>c(` - ${e}`,`error`)),C.exit(1)),r(`Resolving prompt default values...`);let n=await _(N,A);if(M.length>0){e(`📋 Collecting prompts (available to all tasks):`);let t=await x(M,n,A);Object.assign(A,t)}}if(j.length>0){let e=j.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1);if(e.length>0){r(`Re-resolving conditional variables with prompt values...`);let t=await l(e,await o(e,A),A);Object.assign(A,t),Object.keys(t).length>0&&r(`Resolved ${Object.keys(t).length} conditional variable(s)`)}}if(!await t(T.configEnabled,A)){e(`⊘ Template is disabled after variable resolution - skipping all execution`);return}let P=[];for(let e of k)e.$configEnabled!=null&&!await t(e.$configEnabled,A)||await t(e.enabled,A)&&P.push(e);if(c(`${P.length} of ${k.length} task(s) enabled for execution`,`info`),T.dryRun){await m(P,A),e(`🔍 Dry run completed - no changes were made`),e(`Run without --dry-run to apply changes`);return}r(`Calling beforeAll hook...`),await p(`beforeAll`,A);let F=P.length,I=0,L=0,R=[],z=[];for(let e=0;e<P.length;e++){let t=P[e];t!=null&&(r(`Calling beforeTask hook for task: ${t.name}`),await p(`beforeTask`,t,A),await y(t,A,e+1,F,T.dryRun)?(I++,R.push(t.id),r(`Calling afterTask hook for task: ${t.name}`),await p(`afterTask`,t,A)):(await d(t.required,A)&&(L++,z.push(t.name)),r(`Calling onError hook for task: ${t.name}`),await p(`onError`,Error(`Task ${t.name} failed`),t),i(`⚠️ Task "${t.name}" failed, continuing with remaining tasks...`)))}L>0&&(c(`\n❌ Task execution completed with ${L} error(s)`,`error`),c(`Completed: ${I}/${F} tasks`,`info`),c(`Failed tasks: ${z.join(`, `)}`,`error`),C.exit(1)),r(`Calling afterAll hook...`),await p(`afterAll`,A),n(`✅ All tasks completed successfully!`),n(` Completed: ${I}/${F} tasks`)}const T=C.argv.includes(`--dry-run`),E=C.argv.includes(`--force`);async function D(e,t){try{await w(e,{dryRun:t?.dryRun??T,force:t?.force??E,configFilePath:t?.configFilePath??void 0,...t?.variables!=null&&{variables:t.variables},...t?.prompts!=null&&{prompts:t.prompts},...t?.configEnabled!=null&&{configEnabled:t.configEnabled},...t?.transformers!=null&&{transformers:t.transformers}})}catch(e){c(`❌ Task execution failed`,`error`),e instanceof Error?(c(`Error: ${e.message}`,`error`),C.env.DEBUG!=null&&console.error(e.stack)):console.error(e),C.exit(1)}}export{D as t};
@@ -0,0 +1,26 @@
1
+ import{D as e,E as t,F as n,I as r,L as i,O as a,P as o,R as s,d as c,f as l,j as u,p as d,s as f,u as ee,v as te,w as p,x as m,y as ne}from"./configurations-sRFCjZJV.js";import h from"node:process";import g from"node:path";import _ from"node:fs";import{promisify as v}from"node:util";import{execSync as y}from"node:child_process";import{checkbox as re,confirm as ie,input as ae,number as oe,password as se,select as ce}from"@inquirer/prompts";const le=v(_.readFile),b={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function x(e,t){switch(t){case`add`:return`${b.green}+ ${e}${b.reset}`;case`remove`:return`${b.red}- ${e}${b.reset}`;case`context`:return`${b.gray} ${e}${b.reset}`;default:return e}}function S(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(x(t,`context`)):(t!==void 0&&i.push(x(t,`remove`)),a!==void 0&&i.push(x(a,`add`)))}return i}function C(e){return _.existsSync(g.join(h.cwd(),e))}async function w(e){return le(g.join(h.cwd(),e),`utf-8`)}async function T(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let r=t.file;if(!C(r))return`${b.red}✗ File not found: ${t.file}${b.reset}`;try{let e=await w(r),i=JSON.parse(e),a={...i};function o(e){if(typeof e==`string`)return c(e,n);if(Array.isArray(e))return e.map(e=>o(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=o(r);return t}return e}for(let[e,n]of Object.entries(t.updates)){let t=o(n);e.includes(`.`)?m(i,e,t):i[e]=t}let s=JSON.stringify(a,null,2),l=JSON.stringify(i,null,2);if(s===l)return`${b.cyan}→ No changes${b.reset}`;let u=S(s,l);return`${b.blue}File: ${t.file}${b.reset}\n${u.join(`
4
+ `)}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}async function E(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let r=t.file;if(!C(r))return`${b.red}✗ File not found: ${t.file}${b.reset}`;try{let e=await w(r),i=new RegExp(t.pattern,t.flags??`g`),a=c(t.replacement,n),o=e.replace(i,a);if(e===o)return`${b.cyan}→ No matches found${b.reset}`;let s=S(e,o);return`${b.blue}File: ${t.file}${b.reset}\n${s.join(`
5
+ `)}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}async function D(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let r=t.file;if(!C(r))return`${b.red}✗ File not found: ${t.file}${b.reset}`;try{let e=await w(r),i=e;for(let{find:r,replace:i}of t.replacements){let t=c(r,n),a=c(i,n);e=e.replace(t,a)}if(i===e)return`${b.cyan}→ No changes${b.reset}`;let a=S(i,e);return`${b.blue}File: ${t.file}${b.reset}\n${a.join(`
6
+ `)}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}function O(e){return e.template!=null&&e.template!==``}function k(e){return e.templateFile!=null&&e.templateFile!==``}function ue(e){return e.endsWith(`.hbs`)}function A(e){let t=O(e),n=k(e);return!t&&!n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration requires either "template" (inline) or "templateFile" (file path) to be specified`}:t&&n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration cannot have both "template" and "templateFile" specified. Use one or the other.`}:{isValid:!0,hasInlineTemplate:t,hasTemplateFile:n}}function de(e){return O(e)?`inline template`:k(e)?`template file: ${e.templateFile}`:`no template source`}async function j(e,t,n,r={}){let{enableHandlebars:i=!0,sourceUrl:a=n?.$sourceUrl}=r,o=O(e),s=k(e);if(o)return c(e.template,t);if(s){let n=e.templateFile,r=i&&ue(n),o=await ee(te(n,a));return r?(await import(`handlebars`)).default.compile(o)(t):c(o,t)}throw Error(`No template content available`)}async function fe(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;if(t.template==null||t.template===``)return`${b.red}✗ No template content provided for file: ${t.file}${b.reset}`;let r=t.file,i=c(t.template,n);if(!C(r)){let e=i.split(`
7
+ `).slice(0,10).join(`
8
+ `),n=i.split(`
9
+ `).length>10;return`${b.blue}File: ${t.file}${b.reset}\n${b.green}+ New file would be created${b.reset}\n${b.gray}Content preview:${b.reset}\n${e}${n?`
10
+ ...`:``}`}try{let e=await w(r);if(e===i)return`${b.cyan}→ No changes${b.reset}`;let n=S(e,i);return`${b.blue}File: ${t.file}${b.reset}\n${n.join(`
11
+ `)}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}async function pe(t,n,r){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let i=t.file;if(C(i))return`${b.cyan}→ File already exists, would be skipped: ${t.file}${b.reset}`;try{if(O(t)){let e=await j(t,n,r),i=e.split(`
12
+ `).slice(0,10).join(`
13
+ `),a=e.split(`
14
+ `).length>10;return`${b.blue}File: ${t.file}${b.reset}\n${b.green}+ New file would be created${b.reset}\n${b.gray}Content preview:${b.reset}\n${i}${a?`
15
+ ...`:``}`}let e=de(t);return`${b.blue}File: ${t.file}${b.reset}\n${b.green}+ New file would be created from ${e}${b.reset}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}async function me(t,n,r){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let i=t.file,a={};t.content==null?t.template!=null&&(a.template=t.template):a.template=t.content,t.templateFile!=null&&(a.templateFile=t.templateFile);try{let e=await j(a,n,r),o=e.split(`
16
+ `).slice(0,10).join(`
17
+ `),s=e.split(`
18
+ `).length>10;return C(i)?`${b.blue}File: ${t.file}${b.reset}\n${b.green}+ Would append content${b.reset}\n${b.gray}Content preview:${b.reset}\n${o}${s?`
19
+ ...`:``}`:`${b.blue}File: ${t.file}${b.reset}\n${b.green}+ New file would be created with content${b.reset}\n${b.gray}Content preview:${b.reset}\n${o}${s?`
20
+ ...`:``}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}function M(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let r=t.paths.map(e=>c(e,n)).filter(e=>C(e));return r.length===0?`${b.cyan}→ No files/directories to delete${b.reset}`:`${b.red}Would delete:${b.reset}\n${r.map(e=>`${b.red} - ${e}${b.reset}`).join(`
21
+ `)}`}function he(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let r=c(t.from,n),i=c(t.to,n);return C(r)?C(i)?`${b.yellow}⚠ Destination already exists: ${i}${b.reset}\n${b.cyan}Would rename: ${r} → ${i}${b.reset}`:`${b.cyan}Would rename: ${r} → ${i}${b.reset}`:`${b.red}✗ Source not found: ${r}${b.reset}`}function ge(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let r=c(t.from,n),i=c(t.to,n);return C(r)?C(i)?`${b.yellow}⚠ Destination already exists: ${i}${b.reset}\n${b.cyan}Would move: ${r} → ${i}${b.reset}`:`${b.cyan}Would move: ${r} → ${i}${b.reset}`:`${b.red}✗ Source not found: ${r}${b.reset}`}function _e(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let r=c(t.from,n),i=c(t.to,n);if(!C(r))return`${b.red}✗ Source not found: ${r}${b.reset}`;let a=`file`;return C(i)?`${b.yellow}⚠ Destination already exists: ${i}${b.reset}\n${b.cyan}Would copy ${a}: ${r} → ${i}${b.reset}`:`${b.cyan}Would copy ${a}: ${r} → ${i}${b.reset}`}function ve(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let r=c(t.path,n);return C(r)?`${b.cyan}→ Directory already exists: ${r}${b.reset}`:`${b.green}+ Would create directory: ${r}${b.reset}`}const ye=/^[\w+,./:=@-]+$/u;function be(e){return ye.test(e)?e:h.platform===`win32`?`"${e.replace(/(?<slashes>\\*)"/gu,`$<slashes>$<slashes>\\"`).replace(/(?<slashes>\\+)$/u,`$<slashes>$<slashes>`)}"`:`'${e.replace(/'/gu,String.raw`'\''`)}'`}function N(e,t){let n=(t??[]).filter(e=>e!==``).map(be);return n.length>0?`${e} ${n.join(` `)}`:e}function P(e){if(e.condition!=null&&e.condition!==``)return`${b.yellow}⊘ Condition check skipped in dry-run${b.reset}`;let t=C(`.git`),n=[];if(e.removeExisting&&t&&n.push(`${b.red}Would remove existing .git directory${b.reset}`),n.push(`${b.green}Would initialize git repository${b.reset}`),e.initialCommit){let t=e.message??`Initial commit`;n.push(`${b.green}Would create initial commit: "${t}"${b.reset}`)}return n.join(`
22
+ `)}function F(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let r=N(c(t.command,n),t.args?.map(e=>c(e,n))),i=t.cwd==null?h.cwd():c(t.cwd,n);return`${b.yellow}Would execute:${b.reset}\n${b.cyan} Command: ${r}${b.reset}\n${b.cyan} Working directory: ${i}${b.reset}`}async function I(e,t){try{switch(e.type){case`update-json`:return await T(e.config,t);case`write`:return await fe(e.config,t);case`create`:return await pe(e.config,t,e);case`regex-replace`:return await E(e.config,t);case`replace-in-file`:return await D(e.config,t);case`delete`:return M(e.config,t);case`rename`:return he(e.config,t);case`move`:return ge(e.config,t);case`copy`:return _e(e.config,t);case`append`:return await me(e.config,t,e);case`mkdir`:return ve(e.config,t);case`git-init`:return P(e.config);case`exec`:return F(e.config,t);case`exec-file`:return F(e.config,t);default:{let t=e.type;return`${b.yellow}⚠ Diff not available for task type: ${t}${b.reset}`}}}catch(e){return`${b.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${b.reset}`}}async function xe(e,t){console.log(`${b.blue}═══════════════════════════════════════════════════════${b.reset}`),console.log(`${b.blue} DRY RUN - Preview of changes${b.reset}`),console.log(`${b.blue}═══════════════════════════════════════════════════════${b.reset}`);for(let n of e){console.log(`${b.cyan}▶ Task: ${n.name}${b.reset}`),n.description!=null&&n.description!==``&&console.log(`${b.gray} ${n.description}${b.reset}`);let e=await I(n,t);console.log(e),console.log(`${b.gray}${`─`.repeat(55)}${b.reset}`)}console.log(`${b.blue}═══════════════════════════════════════════════════════${b.reset}`),console.log(`${b.yellow} No changes were applied (dry-run mode)${b.reset}`),console.log(`${b.blue}═══════════════════════════════════════════════════════${b.reset}`)}const L=new Map,R={},z=new Map;function Se(e){e.beforeAll!=null&&(R.beforeAll=e.beforeAll),e.afterAll!=null&&(R.afterAll=e.afterAll),e.beforeTask!=null&&(R.beforeTask=e.beforeTask),e.afterTask!=null&&(R.afterTask=e.afterTask),e.onError!=null&&(R.onError=e.onError)}async function B(e,...t){let n=R[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){u(`Error in ${e} hook: ${t instanceof Error?t.message:String(t)}`,`error`)}}function V(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(L.has(e.name))throw TypeError(`Plugin ${e.name} is already registered`);for(let t of e.taskTypes)if(z.has(t)){let e=z.get(t);throw TypeError(`Task type "${t}" is already registered by plugin "${e}"`)}L.set(e.name,e);for(let t of e.taskTypes)z.set(t,e.name);a(`Registered plugin: ${e.name}${e.version==null?``:` v${e.version}`}`)}function Ce(e){let t=L.get(e);if(t!=null){for(let e of t.taskTypes)z.delete(e);L.delete(e)}}function we(e){return L.get(e)}function Te(){return Array.from(L.keys())}function Ee(){L.clear(),z.clear()}function H(e){let t=z.get(e);if(t!=null)return L.get(t)}function U(e){return z.has(e)}async function W(e,t,n){let r=H(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}function De(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}}}function G(e){return e.replace(/[-_]/gu,``).toLowerCase()}function K(e,t){if(t.includes(e))return e;let n=G(e);return t.find(e=>G(e)===n)}function Oe(e){let t=[];for(let n=0;n<e.length;n++){let r=e[n]??``;if(!r.startsWith(`--`)||r.length===2)throw Error(r.startsWith(`-`)?`Unknown option "${r}"`:`Unexpected argument "${r}". Prompt answers are passed as --<promptId> <value>`);let i=r.indexOf(`=`),a=i===-1?r:r.slice(0,i),o=a.slice(2);if(o===``)throw Error(`Unknown option "${r}"`);let s;if(i!==-1)s=r.slice(i+1);else{let t=e[n+1];t!=null&&!t.startsWith(`-`)&&(s=t,n++)}t.push({flag:a,name:o,value:s})}return t}function q(e,t){let n=t.map(e=>e.id),r=new Map(t.map(e=>[e.id,e.type])),i={},a=[],o=[];for(let{flag:t,name:s,value:c}of e){let e=K(s,n);if(e!=null){c===void 0?r.get(e)===`confirm`?i[e]=`true`:o.push(`Option ${t} needs a value, e.g. ${t}=<value>`):i[e]=c;continue}let l=c===void 0&&s.startsWith(`no-`)?K(s.slice(3),n):void 0;l==null?a.push(t):r.get(l)===`confirm`?i[l]=`false`:o.push(`Option ${t} only works for yes/no (confirm) prompts`)}if(a.length>0&&o.unshift(`Unknown option(s) ${a.join(`, `)}: no prompt with a matching id. ${n.length>0?`Prompts in this configuration: ${n.join(`, `)}`:`This configuration has no prompts`}`),o.length>0)throw Error(o.join(`
23
+ `));return i}function ke(e,t,n){let r=n.map(e=>e.id),i=q(e,n);for(let[e,n]of t)i[K(e,r)??e]=n;return i}const Ae={input:`<value>`,password:`<value>`,select:`<value>`,number:`<number>`,checkbox:`<values>`};function je(e){return e.type===`confirm`?`--[no-]${e.id}`:`--${e.id} ${Ae[e.type]}`}function Me(e){let t=[];(e.type===`select`||e.type===`checkbox`)&&t.push(`choices: ${e.choices.map(e=>String(e.value)).join(`, `)}`);let n=e.default;return([`string`,`number`,`boolean`].includes(typeof n)||Array.isArray(n))&&t.push(`default: ${String(n)}`),e.required===!0&&t.push(`required`),typeof e.enabled==`object`?t.push(e.enabled.type===`condition`?`when: ${e.enabled.value}`:`conditional`):e.enabled===!1&&t.push(`disabled`),t.length>0?`${e.message} [${t.join(`; `)}]`:e.message}function Ne(e){let t=e.map(e=>({name:e.name,items:(e.prompts??[]).map(e=>({flag:je(e),description:Me(e)}))})).filter(e=>e.items.length>0);if(t.length===0)return`Prompts:
24
+ This configuration has no prompts.`;let n=Math.min(40,Math.max(...t.flatMap(e=>e.items.map(e=>e.flag.length)))),r=[`Prompts (answer with a flag instead of being asked; kebab-case ids work too):`];for(let e of t){r.push(``,` ${e.name}:`);for(let t of e.items)r.push(` ${t.flag.padEnd(n)} ${t.description}`)}return r.join(`
25
+ `)}const Pe=new Set([`true`,`1`,`yes`,`y`]),Fe=new Set([`false`,`0`,`no`,`n`]);let J=new Map;function Ie(e){J=new Map(Object.entries(e))}function Le(e){return J.get(e)}function Re(e){let t=e.indexOf(`=`);if(t<=0)throw Error(`Invalid --set value "${e}". Expected format: key=value`);return[e.slice(0,t).trim(),e.slice(t+1)]}function ze(e,t){switch(e.type){case`confirm`:{let n=t.trim().toLowerCase();if(Pe.has(n))return!0;if(Fe.has(n))return!1;throw r.invalidValue(e.id,t,`expected true or false`)}case`number`:{let n=Number(t);if(t.trim()===``||Number.isNaN(n))throw r.invalidValue(e.id,t,`expected a number`);return n}case`select`:{let n=e.choices.find(e=>String(e.value)===t);if(n==null)throw r.invalidValue(e.id,t,`expected one of ${e.choices.map(e=>String(e.value)).join(`, `)}`);return n.value}case`checkbox`:return t.split(`,`).map(e=>e.trim()).filter(e=>e!==``).map(t=>{let n=e.choices.find(e=>String(e.value)===t);if(n==null)throw r.invalidValue(e.id,t,`expected one of ${e.choices.map(e=>String(e.value)).join(`, `)}`);return n.value});case`input`:case`password`:return t;default:throw r.unknownType(e.type)}}async function Y(e,t,n,r){if(e!==void 0)return l(e,{id:t,contextType:`Prompt`,...n!=null&&{context:n},...r?.$sourceUrl!=null&&{sourceUrl:r.$sourceUrl}})}async function Be(e,n=new Map,i={}){let a={};if(e.length===0)return a;for(let o of e){if(o.$configEnabled!=null&&!await t(o.$configEnabled,{...i,...a}))continue;let e={...i,...a};if(!await t(o.enabled,e)){a[o.id]=void 0;continue}let s=Le(o.id);if(s!==void 0){let t=ze(o,s);if(typeof t==`string`&&t.trim()===``&&await p(o.required,e)===!0)throw r.required(o.id);o.transformers!==void 0&&(t=await f.apply(o.transformers,t,e)),u(`${o.message}: ${String(t)} (preset)`,`info`),a[o.id]=t;continue}try{let t,i=n.get(o.id);switch(o.default!==void 0&&(i=await Y(o.default,o.id,e,o)),i!==void 0&&o.transformers!==void 0&&(i=await f.apply(o.transformers,i,e)),o.type){case`input`:{let n={message:o.message};i!==void 0&&(n.default=String(i));let a=await p(o.required,e);if(a!==void 0&&(n.required=a),t=await ae(n),a&&(t==null||typeof t==`string`&&t.trim()===``))throw u(`${o.message} is required`,`error`),r.required(o.id);break}case`password`:if(t=await se({message:o.message,mask:`*`}),await p(o.required,e)&&(t==null||typeof t==`string`&&t.trim()===``))throw u(`${o.message} is required`,`error`),r.required(o.id);break;case`number`:{let n={message:o.message};i!==void 0&&(n.default=Number(i));let a=await p(o.required,e);if(a!==void 0&&(n.required=a),o.min!==void 0&&(n.min=o.min),o.max!==void 0&&(n.max=o.max),t=await oe(n),a&&t==null)throw u(`${o.message} is required`,`error`),r.required(o.id);break}case`select`:{let e={message:o.message,choices:o.choices.map(e=>({name:e.name,value:e.value}))};i!==void 0&&(e.default=i),t=await ce(e);break}case`checkbox`:{let n={message:o.message,choices:o.choices.map(e=>({name:e.name,value:e.value}))};i!==void 0&&(n.default=i);let r=await p(o.required,e);r!==void 0&&(n.required=r),t=await re(n);break}case`confirm`:{let e=i===void 0?!1:!!i;t=await ie({message:o.message,default:e});break}default:throw u(`Unknown prompt type: ${o.type}`,`error`),r.unknownType(o.type)}o.transformers!==void 0&&(i!==void 0&&(t===i||String(t)===String(i))||(t=await f.apply(o.transformers,t,{...e,...a}))),a[o.id]=t}catch(e){throw e instanceof Error&&u(`Failed to collect prompt "${o.id}": ${e.message}`,`error`),e}}return a}async function Ve(e,t){let n=new Map,r=e.map(async e=>{if(e.default!==void 0){let r=await Y(e.default,e.id,t,e);r!==void 0&&n.set(e.id,r)}});return await Promise.all(r),n}function He(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.type===`checkbox`){r.choices.length===0&&t.push(`${r.type===`select`?`Select`:`Checkbox`} prompt "${r.id}" must have at least one choice`);for(let e of r.choices)(!e.name||e.name.trim()===``)&&t.push(`${r.type===`select`?`Select`:`Checkbox`} prompt "${r.id}" has a choice with empty name`),e.value===void 0&&t.push(`${r.type===`select`?`Select`:`Checkbox`} 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 X=v(_.appendFile),Ue=v(_.readFile),We=v(_.stat);async function Ge(t,r,i){if(t.condition!=null&&t.condition!==``&&!e(t.condition,r)){u(`Condition not met, skipping append task`,`info`);return}let a=g.join(h.cwd(),c(t.file,r)),o={};t.content==null?t.template!=null&&(o.template=t.template):o.template=t.content,t.templateFile!=null&&(o.templateFile=t.templateFile);let s=A(o);if(!s.isValid)throw s.error?.includes(`cannot have both`)?n.templateHasBothTemplateAndFile():n.templateMissingTemplateOrFile();let l=await j(o,r,i),d=!1,f=!1;try{await We(a),d=!0;let e=await Ue(a,`utf-8`);e.length>0&&!e.endsWith(`
26
+ `)&&(f=t.newline!==!1)}catch{}d&&f?await X(a,`\n${l}`):await X(a,l),u(`Appended content to ${t.file}`,`success`)}const Ke={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await Ge(e.config,t,e)}},Z=v(_.copyFile),qe=v(_.stat),Q=v(_.mkdir),Je=v(_.readdir);async function $(e,t){await Q(t,{recursive:!0});let n=await Je(e,{withFileTypes:!0});await Promise.all(n.map(async n=>{let r=g.join(e,n.name),i=g.join(t,n.name);n.isDirectory()?await $(r,i):await Z(r,i)}))}async function Ye(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n)){u(`Condition not met, skipping copy task`,`info`);return}let r=g.join(h.cwd(),c(t.from,n)),i=g.join(h.cwd(),c(t.to,n)),a;try{a=await qe(r)}catch{u(`Source path does not exist: ${r}`,`warn`);return}await Q(g.dirname(i),{recursive:!0}),a.isDirectory()?(await $(r,i),u(`Copied directory ${t.from} to ${t.to}`,`success`)):(await Z(r,i),u(`Copied file ${t.from} to ${t.to}`,`success`))}const Xe={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await Ye(e.config,t)}},Ze=v(_.writeFile);async function Qe(t,r,i){if(t.condition!=null&&t.condition!==``&&!e(t.condition,r)){u(`Condition not met, skipping create task`,`info`);return}let a=c(t.file,r),o=g.join(h.cwd(),a);if(_.existsSync(o)){u(`File already exists, skipping: ${a}`,`info`);return}let s=A(t);if(!s.isValid)throw s.error?.includes(`cannot have both`)?n.createHasBothTemplateAndFile():n.createMissingTemplateOrFile();let l=await j(t,r,i),d=g.dirname(o);_.existsSync(d)||_.mkdirSync(d,{recursive:!0}),await Ze(o,l),u(`Created file: ${a}`,`success`)}const $e={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await Qe(e.config,t,e)}};async function et(t,n){let{paths:r,condition:i}=t;if(i!=null&&i!==``){if(!n){u(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!e(i,n)){u(`Condition not met, skipping deletion`,`info`);return}}for(let e of r){let t=n==null?e:c(e,n),r=g.join(h.cwd(),t);_.existsSync(r)&&_.rmSync(r,{recursive:!0,force:!0})}}const tt={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await et(e.config,t)}};async function nt(t,n,r){t.condition!=null&&t.condition!==``&&!e(t.condition,n)||await d({file:t.file,...t.runtime&&{runtime:t.runtime},...t.args&&{args:t.args},...t.parameters&&{parameters:t.parameters},...t.cwd!=null&&t.cwd.trim()!==``&&{cwd:t.cwd},...r?.$sourceUrl!=null&&r.$sourceUrl.trim()!==``&&{sourceUrl:r.$sourceUrl},captureOutput:!1},n)}const rt={name:`exec-file`,version:`1.0.0`,taskTypes:[`exec-file`],execute:async(e,t,n)=>{n.dryRun||await nt(e.config,t,e)}};async function it(t,n){if(t.condition!=null&&t.condition!==``){if(!n){u(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!e(t.condition,n)){u(`Condition not met, skipping exec task`,`info`);return}}let r=e=>n==null?e:c(e,n),i=N(r(t.command),t.args?.map(r)),o=t.cwd==null?h.cwd():g.join(h.cwd(),r(t.cwd));a(`Executing: ${i}`),y(i,{cwd:o,stdio:`inherit`})}const at={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await it(e.config,t)}};async function ot(t,n){if(t.condition!=null&&t.condition!==``){if(!n){u(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!e(t.condition,n)){u(`Condition not met, skipping git-init task`,`info`);return}}if(t.removeExisting){let e=g.join(h.cwd(),`.git`);_.existsSync(e)&&_.rmSync(e,{recursive:!0,force:!0})}if(y(`git init`,{stdio:`inherit`}),t.initialCommit){let e=t.message??`Initial commit`;y(`git add .`,{stdio:`inherit`}),y(`git commit -m "${e}"`,{stdio:`inherit`})}}const st={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await ot(e.config,t)}},ct=v(_.mkdir);async function lt(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n)){u(`Condition not met, skipping mkdir task`,`info`);return}await ct(g.join(h.cwd(),c(t.path,n)),{recursive:!0}),u(`Created directory: ${t.path}`,`success`)}const ut={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await lt(e.config,t)}},dt=v(_.rename),ft=v(_.stat),pt=v(_.mkdir);async function mt(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n)){u(`Condition not met, skipping move task`,`info`);return}let r=g.join(h.cwd(),c(t.from,n)),i=g.join(h.cwd(),c(t.to,n));try{await ft(r)}catch{u(`Source path does not exist: ${r}`,`warn`);return}await pt(g.dirname(i),{recursive:!0}),await dt(r,i),u(`Moved ${t.from} to ${t.to}`,`success`)}const ht={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await mt(e.config,t)}},gt=v(_.readFile),_t=v(_.writeFile);async function vt(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n)){u(`Condition not met, skipping regex-replace task`,`info`);return}let r=g.join(h.cwd(),c(t.file,n)),{pattern:i}=t,a=t.flags??``,o=t.replacement||``,s=await gt(r,`utf-8`),l=new RegExp(i,a);s=s.replace(l,c(o,n)),await _t(r,s)}const yt={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await vt(e.config,t)}},bt=v(_.rename);async function xt(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n)){u(`Condition not met, skipping rename task`,`info`);return}let r=g.join(h.cwd(),c(t.from,n)),i=g.join(h.cwd(),c(t.to,n));if(!_.existsSync(r)){u(`Source path does not exist: ${r}`,`warn`);return}await bt(r,i)}const St={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await xt(e.config,t)}},Ct=v(_.readFile),wt=v(_.writeFile);async function Tt(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n)){u(`Condition not met, skipping replace-in-file task`,`info`);return}let r=g.join(h.cwd(),c(t.file,n)),{replacements:i}=t;if(!_.existsSync(r)){u(`File not found: ${r}, skipping`,`warn`);return}let a=await Ct(r,`utf-8`);for(let{find:e,replace:t}of i){let r=c(t,n);a=a.replace(new RegExp(e,`gu`),r)}await wt(r,a)}const Et={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await Tt(e.config,t)}},Dt=v(_.readFile),Ot=v(_.writeFile);async function kt(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n)){u(`Condition not met, skipping update-json task`,`info`);return}let r=g.join(h.cwd(),c(t.file,n)),{updates:i}=t,a=ne(await Dt(r,`utf-8`));function o(e){if(typeof e==`string`)return c(e,n);if(Array.isArray(e))return e.map(e=>o(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=o(r);return t}return e}for(let[e,t]of Object.entries(i)){let n=o(t);e.includes(`.`)?m(a,e,n):a[e]=n}await Ot(r,`${JSON.stringify(a,null,2)}\n`)}const At={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await kt(e.config,t)}},jt=v(_.writeFile);async function Mt(t,r,i){let{allowCreate:a=!0}=t;if(t.condition!=null&&t.condition!==``&&!e(t.condition,r)){u(`Condition not met, skipping write task`,`info`);return}let o=c(t.file,r),s=g.join(h.cwd(),o);if(!_.existsSync(s)){if(a===!1)throw Error(`Write task failed: file does not exist (${o})`);u(`File not found, creating new file: ${o}`,`info`)}let l=A(t);if(!l.isValid)throw l.error?.includes(`cannot have both`)?n.templateHasBothTemplateAndFile():n.templateMissingTemplateOrFile();let d=await j(t,r,i),f=g.dirname(s);_.existsSync(f)||_.mkdirSync(f,{recursive:!0}),await jt(s,d)}const Nt={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await Mt(e.config,t,e)}};function Pt(){U(`update-json`)||(V(At),V(Nt),V($e),V(yt),V(Et),V(tt),V(St),V(st),V(at),V(rt),V(ht),V(Xe),V(Ke),V(ut))}async function Ft(e,t,n=!1){if(Pt(),n){u(`[DRY RUN] Would execute: ${e.name}`,`info`);return}if(U(e.type)){await W(e,t,{dryRun:n});return}throw TypeError(`Unknown task type: ${e.type}`)}async function It(e,t,n,r,i=!1){try{return u(`[${n}/${r}] Running: ${e.name}...`,`info`),await Ft(e,t,i),u(`[${n}/${r}] Completed: ${e.name}...`,`success`),!0}catch(t){return u(`Failed: ${e.name}`,`error`),t instanceof Error&&(u(` Reason: ${t.message}`,`error`),t.stack!=null&&h.env.DEBUG!=null&&console.error(t.stack)),!1}}async function Lt(e,t,n){await B(`beforeAll`,t);let r=0,i=0,a=[];for(let s=0;s<e.length;s++){let c=e[s];c!=null&&(await B(`beforeTask`,c,t),await It(c,t,s+1,e.length,n.dryRun)?(r++,await B(`afterTask`,c,t)):(await p(c.required,t)&&(i++,a.push(c.name)),await B(`onError`,Error(`Task ${c.name} failed`),c),o(`⚠️ Task "${c.name}" failed, continuing with remaining tasks...`)))}await B(`afterAll`,t),i>0&&(u(`\n❌ Task execution completed with ${i} error(s)`,`error`),u(`Completed: ${r}/${e.length} tasks`,`info`),u(`Failed tasks: ${a.join(`, `)}`,`error`),h.exit(1)),u(`Completed: ${r}/${e.length} tasks`,`success`)}function Rt(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 s.forTaskDependency(e);r.add(e);let c=a.get(e);if(!c)throw i.forId(e);if(c.dependencies)for(let e of c.dependencies)o(e);r.delete(e),n.add(e),t.push(c)}for(let t of e)n.has(t.id)||o(t.id);return t}function zt(e){let t=[],n=e.config,r=typeof n.template==`string`?n.template:void 0,i=typeof n.templateFile==`string`?n.templateFile:void 0,a=A({...r!==void 0&&{template:r},...i!==void 0&&{templateFile:i}});return!a.isValid&&a.error!=null&&a.error!==``&&t.push(`Task "${e.id}" (${e.name}): ${a.error}`),(n.file==null||n.file===``)&&t.push(`Task "${e.id}" (${e.name}): Write task requires "file" property to specify the output file path`),t}async function Bt(e,n){let r=Ht(e);r.length>0&&(console.error(`❌ Task validation errors:`),r.forEach(e=>console.error(` - ${e}`)),h.exit(1));let i=[];for(let r of e)await t(r.enabled,n)&&i.push(r);return i}function Vt(e){return Rt(e)}function Ht(e){let t=[];for(let n of e)if(!U(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=zt(n);t.push(...e)}return t}export{F as A,Te as C,Se as D,B as E,D as F,T as I,M,he as N,xe as O,E as P,we as S,Ce as T,De as _,Lt as a,U as b,He as c,Re as d,Ie as f,ke as g,q as h,Rt as i,P as j,I as k,Ve as l,Oe as m,Vt as n,Pt as o,Ne as p,Bt as r,It as s,Ht as t,Be as u,W as v,V as w,Ee as x,H as y};
@@ -0,0 +1,26 @@
1
+ const e=require(`./configurations-iSmGgORy.cjs`);let t=require(`node:process`);t=e.z(t);let n=require(`node:fs`);n=e.z(n);let r=require(`node:path`);r=e.z(r);let i=require(`node:util`);i=e.z(i);let a=require(`node:child_process`);a=e.z(a);let o=require(`@inquirer/prompts`);o=e.z(o);const s=(0,i.promisify)(n.default.readFile),c=2,l=10,u=55,d={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function f(e,t){switch(t){case`add`:return`${d.green}+ ${e}${d.reset}`;case`remove`:return`${d.red}- ${e}${d.reset}`;case`context`:return`${d.gray} ${e}${d.reset}`;default:return e}}function p(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(f(t,`context`)):(t!==void 0&&i.push(f(t,`remove`)),a!==void 0&&i.push(f(a,`add`)))}return i}function m(e){return n.default.existsSync(r.default.join(t.default.cwd(),e))}async function h(e){return s(r.default.join(t.default.cwd(),e),`utf-8`)}async function g(t,n){if(t.condition!=null&&t.condition!==``&&!e.D(t.condition,n))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;let r=t.file;if(!m(r))return`${d.red}✗ File not found: ${t.file}${d.reset}`;try{let i=await h(r),a=JSON.parse(i),o={...a};function s(t){if(typeof t==`string`)return e.d(t,n);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[n,r]of Object.entries(t.updates)){let t=s(r);n.includes(`.`)?e.x(a,n,t):a[n]=t}let c=JSON.stringify(o,null,2),l=JSON.stringify(a,null,2);if(c===l)return`${d.cyan}→ No changes${d.reset}`;let u=p(c,l);return`${d.blue}File: ${t.file}${d.reset}\n${u.join(`
4
+ `)}`}catch(e){return`${d.red}✗ Error: ${e instanceof Error?e.message:String(e)}${d.reset}`}}async function _(t,n){if(t.condition!=null&&t.condition!==``&&!e.D(t.condition,n))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;let r=t.file;if(!m(r))return`${d.red}✗ File not found: ${t.file}${d.reset}`;try{let i=await h(r),a=new RegExp(t.pattern,t.flags??`g`),o=e.d(t.replacement,n),s=i.replace(a,o);if(i===s)return`${d.cyan}→ No matches found${d.reset}`;let c=p(i,s);return`${d.blue}File: ${t.file}${d.reset}\n${c.join(`
5
+ `)}`}catch(e){return`${d.red}✗ Error: ${e instanceof Error?e.message:String(e)}${d.reset}`}}async function v(t,n){if(t.condition!=null&&t.condition!==``&&!e.D(t.condition,n))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;let r=t.file;if(!m(r))return`${d.red}✗ File not found: ${t.file}${d.reset}`;try{let i=await h(r),a=i;for(let{find:r,replace:a}of t.replacements){let t=e.d(r,n),o=e.d(a,n);i=i.replace(t,o)}if(a===i)return`${d.cyan}→ No changes${d.reset}`;let o=p(a,i);return`${d.blue}File: ${t.file}${d.reset}\n${o.join(`
6
+ `)}`}catch(e){return`${d.red}✗ Error: ${e instanceof Error?e.message:String(e)}${d.reset}`}}function y(e){return e.template!=null&&e.template!==``}function b(e){return e.templateFile!=null&&e.templateFile!==``}function ee(e){return e.endsWith(`.hbs`)}function x(e){let t=y(e),n=b(e);return!t&&!n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration requires either "template" (inline) or "templateFile" (file path) to be specified`}:t&&n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration cannot have both "template" and "templateFile" specified. Use one or the other.`}:{isValid:!0,hasInlineTemplate:t,hasTemplateFile:n}}function te(e){return y(e)?`inline template`:b(e)?`template file: ${e.templateFile}`:`no template source`}async function S(t,n,r,i={}){let{enableHandlebars:a=!0,sourceUrl:o=r?.$sourceUrl}=i,s=y(t),c=b(t);if(s)return e.d(t.template,n);if(c){let r=t.templateFile,i=a&&ee(r),s=await e.u(e.v(r,o));return i?(await import(`handlebars`)).default.compile(s)(n):e.d(s,n)}throw Error(`No template content available`)}async function ne(t,n){if(t.condition!=null&&t.condition!==``&&!e.D(t.condition,n))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;if(t.template==null||t.template===``)return`${d.red}✗ No template content provided for file: ${t.file}${d.reset}`;let r=t.file,i=e.d(t.template,n);if(!m(r)){let e=i.split(`
7
+ `).slice(0,10).join(`
8
+ `),n=i.split(`
9
+ `).length>10;return`${d.blue}File: ${t.file}${d.reset}\n${d.green}+ New file would be created${d.reset}\n${d.gray}Content preview:${d.reset}\n${e}${n?`
10
+ ...`:``}`}try{let e=await h(r);if(e===i)return`${d.cyan}→ No changes${d.reset}`;let n=p(e,i);return`${d.blue}File: ${t.file}${d.reset}\n${n.join(`
11
+ `)}`}catch(e){return`${d.red}✗ Error: ${e instanceof Error?e.message:String(e)}${d.reset}`}}async function re(t,n,r){if(t.condition!=null&&t.condition!==``&&!e.D(t.condition,n))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;let i=t.file;if(m(i))return`${d.cyan}→ File already exists, would be skipped: ${t.file}${d.reset}`;try{if(y(t)){let e=await S(t,n,r),i=e.split(`
12
+ `).slice(0,10).join(`
13
+ `),a=e.split(`
14
+ `).length>10;return`${d.blue}File: ${t.file}${d.reset}\n${d.green}+ New file would be created${d.reset}\n${d.gray}Content preview:${d.reset}\n${i}${a?`
15
+ ...`:``}`}let e=te(t);return`${d.blue}File: ${t.file}${d.reset}\n${d.green}+ New file would be created from ${e}${d.reset}`}catch(e){return`${d.red}✗ Error: ${e instanceof Error?e.message:String(e)}${d.reset}`}}async function ie(t,n,r){if(t.condition!=null&&t.condition!==``&&!e.D(t.condition,n))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;let i=t.file,a={};t.content==null?t.template!=null&&(a.template=t.template):a.template=t.content,t.templateFile!=null&&(a.templateFile=t.templateFile);try{let e=await S(a,n,r),o=e.split(`
16
+ `).slice(0,10).join(`
17
+ `),s=e.split(`
18
+ `).length>10;return m(i)?`${d.blue}File: ${t.file}${d.reset}\n${d.green}+ Would append content${d.reset}\n${d.gray}Content preview:${d.reset}\n${o}${s?`
19
+ ...`:``}`:`${d.blue}File: ${t.file}${d.reset}\n${d.green}+ New file would be created with content${d.reset}\n${d.gray}Content preview:${d.reset}\n${o}${s?`
20
+ ...`:``}`}catch(e){return`${d.red}✗ Error: ${e instanceof Error?e.message:String(e)}${d.reset}`}}function C(t,n){if(t.condition!=null&&t.condition!==``&&!e.D(t.condition,n))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;let r=t.paths.map(t=>e.d(t,n)).filter(e=>m(e));return r.length===0?`${d.cyan}→ No files/directories to delete${d.reset}`:`${d.red}Would delete:${d.reset}\n${r.map(e=>`${d.red} - ${e}${d.reset}`).join(`
21
+ `)}`}function w(t,n){if(t.condition!=null&&t.condition!==``&&!e.D(t.condition,n))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;let r=e.d(t.from,n),i=e.d(t.to,n);return m(r)?m(i)?`${d.yellow}⚠ Destination already exists: ${i}${d.reset}\n${d.cyan}Would rename: ${r} → ${i}${d.reset}`:`${d.cyan}Would rename: ${r} → ${i}${d.reset}`:`${d.red}✗ Source not found: ${r}${d.reset}`}function ae(t,n){if(t.condition!=null&&t.condition!==``&&!e.D(t.condition,n))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;let r=e.d(t.from,n),i=e.d(t.to,n);return m(r)?m(i)?`${d.yellow}⚠ Destination already exists: ${i}${d.reset}\n${d.cyan}Would move: ${r} → ${i}${d.reset}`:`${d.cyan}Would move: ${r} → ${i}${d.reset}`:`${d.red}✗ Source not found: ${r}${d.reset}`}function oe(t,n){if(t.condition!=null&&t.condition!==``&&!e.D(t.condition,n))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;let r=e.d(t.from,n),i=e.d(t.to,n);if(!m(r))return`${d.red}✗ Source not found: ${r}${d.reset}`;let a=`file`;return m(i)?`${d.yellow}⚠ Destination already exists: ${i}${d.reset}\n${d.cyan}Would copy ${a}: ${r} → ${i}${d.reset}`:`${d.cyan}Would copy ${a}: ${r} → ${i}${d.reset}`}function se(t,n){if(t.condition!=null&&t.condition!==``&&!e.D(t.condition,n))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;let r=e.d(t.path,n);return m(r)?`${d.cyan}→ Directory already exists: ${r}${d.reset}`:`${d.green}+ Would create directory: ${r}${d.reset}`}const ce=/^[\w+,./:=@-]+$/u;function T(e){return ce.test(e)?e:t.default.platform===`win32`?`"${e.replace(/(?<slashes>\\*)"/gu,`$<slashes>$<slashes>\\"`).replace(/(?<slashes>\\+)$/u,`$<slashes>$<slashes>`)}"`:`'${e.replace(/'/gu,String.raw`'\''`)}'`}function E(e,t){let n=(t??[]).filter(e=>e!==``).map(T);return n.length>0?`${e} ${n.join(` `)}`:e}function D(e){if(e.condition!=null&&e.condition!==``)return`${d.yellow}⊘ Condition check skipped in dry-run${d.reset}`;let t=m(`.git`),n=[];if(e.removeExisting&&t&&n.push(`${d.red}Would remove existing .git directory${d.reset}`),n.push(`${d.green}Would initialize git repository${d.reset}`),e.initialCommit){let t=e.message??`Initial commit`;n.push(`${d.green}Would create initial commit: "${t}"${d.reset}`)}return n.join(`
22
+ `)}function O(n,r){if(n.condition!=null&&n.condition!==``&&!e.D(n.condition,r))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;let i=E(e.d(n.command,r),n.args?.map(t=>e.d(t,r))),a=n.cwd==null?t.default.cwd():e.d(n.cwd,r);return`${d.yellow}Would execute:${d.reset}\n${d.cyan} Command: ${i}${d.reset}\n${d.cyan} Working directory: ${a}${d.reset}`}async function k(e,t){try{switch(e.type){case`update-json`:return await g(e.config,t);case`write`:return await ne(e.config,t);case`create`:return await re(e.config,t,e);case`regex-replace`:return await _(e.config,t);case`replace-in-file`:return await v(e.config,t);case`delete`:return C(e.config,t);case`rename`:return w(e.config,t);case`move`:return ae(e.config,t);case`copy`:return oe(e.config,t);case`append`:return await ie(e.config,t,e);case`mkdir`:return se(e.config,t);case`git-init`:return D(e.config);case`exec`:return O(e.config,t);case`exec-file`:return O(e.config,t);default:{let t=e.type;return`${d.yellow}⚠ Diff not available for task type: ${t}${d.reset}`}}}catch(e){return`${d.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${d.reset}`}}async function A(e,t){console.log(`${d.blue}═══════════════════════════════════════════════════════${d.reset}`),console.log(`${d.blue} DRY RUN - Preview of changes${d.reset}`),console.log(`${d.blue}═══════════════════════════════════════════════════════${d.reset}`);for(let n of e){console.log(`${d.cyan}▶ Task: ${n.name}${d.reset}`),n.description!=null&&n.description!==``&&console.log(`${d.gray} ${n.description}${d.reset}`);let e=await k(n,t);console.log(e),console.log(`${d.gray}${`─`.repeat(55)}${d.reset}`)}console.log(`${d.blue}═══════════════════════════════════════════════════════${d.reset}`),console.log(`${d.yellow} No changes were applied (dry-run mode)${d.reset}`),console.log(`${d.blue}═══════════════════════════════════════════════════════${d.reset}`)}const j=new Map,M={},N=new Map;function le(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 P(t,...n){let r=M[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.j(`Error in ${t} hook: ${n instanceof Error?n.message:String(n)}`,`error`)}}function F(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(j.has(t.name))throw TypeError(`Plugin ${t.name} is already registered`);for(let e of t.taskTypes)if(N.has(e)){let t=N.get(e);throw TypeError(`Task type "${e}" is already registered by plugin "${t}"`)}j.set(t.name,t);for(let e of t.taskTypes)N.set(e,t.name);e.O(`Registered plugin: ${t.name}${t.version==null?``:` v${t.version}`}`)}function ue(e){let t=j.get(e);if(t!=null){for(let e of t.taskTypes)N.delete(e);j.delete(e)}}function de(e){return j.get(e)}function fe(){return Array.from(j.keys())}function pe(){j.clear(),N.clear()}function I(e){let t=N.get(e);if(t!=null)return j.get(t)}function L(e){return N.has(e)}async function R(e,t,n){let r=I(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}function z(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}}}const me=`--`,he=`no-`;function B(e){return e.replace(/[-_]/gu,``).toLowerCase()}function V(e,t){if(t.includes(e))return e;let n=B(e);return t.find(e=>B(e)===n)}function ge(e){let t=[];for(let n=0;n<e.length;n++){let r=e[n]??``;if(!r.startsWith(`--`)||r.length===2)throw Error(r.startsWith(`-`)?`Unknown option "${r}"`:`Unexpected argument "${r}". Prompt answers are passed as --<promptId> <value>`);let i=r.indexOf(`=`),a=i===-1?r:r.slice(0,i),o=a.slice(2);if(o===``)throw Error(`Unknown option "${r}"`);let s;if(i!==-1)s=r.slice(i+1);else{let t=e[n+1];t!=null&&!t.startsWith(`-`)&&(s=t,n++)}t.push({flag:a,name:o,value:s})}return t}function H(e,t){let n=t.map(e=>e.id),r=new Map(t.map(e=>[e.id,e.type])),i={},a=[],o=[];for(let{flag:t,name:s,value:c}of e){let e=V(s,n);if(e!=null){c===void 0?r.get(e)===`confirm`?i[e]=`true`:o.push(`Option ${t} needs a value, e.g. ${t}=<value>`):i[e]=c;continue}let l=c===void 0&&s.startsWith(`no-`)?V(s.slice(3),n):void 0;l==null?a.push(t):r.get(l)===`confirm`?i[l]=`false`:o.push(`Option ${t} only works for yes/no (confirm) prompts`)}if(a.length>0&&o.unshift(`Unknown option(s) ${a.join(`, `)}: no prompt with a matching id. ${n.length>0?`Prompts in this configuration: ${n.join(`, `)}`:`This configuration has no prompts`}`),o.length>0)throw Error(o.join(`
23
+ `));return i}function _e(e,t,n){let r=n.map(e=>e.id),i=H(e,n);for(let[e,n]of t)i[V(e,r)??e]=n;return i}const ve=40,ye={input:`<value>`,password:`<value>`,select:`<value>`,number:`<number>`,checkbox:`<values>`};function be(e){return e.type===`confirm`?`--[no-]${e.id}`:`--${e.id} ${ye[e.type]}`}function xe(e){let t=[];(e.type===`select`||e.type===`checkbox`)&&t.push(`choices: ${e.choices.map(e=>String(e.value)).join(`, `)}`);let n=e.default;return([`string`,`number`,`boolean`].includes(typeof n)||Array.isArray(n))&&t.push(`default: ${String(n)}`),e.required===!0&&t.push(`required`),typeof e.enabled==`object`?t.push(e.enabled.type===`condition`?`when: ${e.enabled.value}`:`conditional`):e.enabled===!1&&t.push(`disabled`),t.length>0?`${e.message} [${t.join(`; `)}]`:e.message}function Se(e){let t=e.map(e=>({name:e.name,items:(e.prompts??[]).map(e=>({flag:be(e),description:xe(e)}))})).filter(e=>e.items.length>0);if(t.length===0)return`Prompts:
24
+ This configuration has no prompts.`;let n=Math.min(40,Math.max(...t.flatMap(e=>e.items.map(e=>e.flag.length)))),r=[`Prompts (answer with a flag instead of being asked; kebab-case ids work too):`];for(let e of t){r.push(``,` ${e.name}:`);for(let t of e.items)r.push(` ${t.flag.padEnd(n)} ${t.description}`)}return r.join(`
25
+ `)}const Ce=new Set([`true`,`1`,`yes`,`y`]),we=new Set([`false`,`0`,`no`,`n`]);let U=new Map;function Te(e){U=new Map(Object.entries(e))}function Ee(e){return U.get(e)}function De(e){let t=e.indexOf(`=`);if(t<=0)throw Error(`Invalid --set value "${e}". Expected format: key=value`);return[e.slice(0,t).trim(),e.slice(t+1)]}function Oe(t,n){switch(t.type){case`confirm`:{let r=n.trim().toLowerCase();if(Ce.has(r))return!0;if(we.has(r))return!1;throw e.I.invalidValue(t.id,n,`expected true or false`)}case`number`:{let r=Number(n);if(n.trim()===``||Number.isNaN(r))throw e.I.invalidValue(t.id,n,`expected a number`);return r}case`select`:{let r=t.choices.find(e=>String(e.value)===n);if(r==null)throw e.I.invalidValue(t.id,n,`expected one of ${t.choices.map(e=>String(e.value)).join(`, `)}`);return r.value}case`checkbox`:return n.split(`,`).map(e=>e.trim()).filter(e=>e!==``).map(n=>{let r=t.choices.find(e=>String(e.value)===n);if(r==null)throw e.I.invalidValue(t.id,n,`expected one of ${t.choices.map(e=>String(e.value)).join(`, `)}`);return r.value});case`input`:case`password`:return n;default:throw e.I.unknownType(t.type)}}async function W(t,n,r,i){if(t!==void 0)return e.f(t,{id:n,contextType:`Prompt`,...r!=null&&{context:r},...i?.$sourceUrl!=null&&{sourceUrl:i.$sourceUrl}})}async function ke(t,n=new Map,r={}){let i={};if(t.length===0)return i;for(let a of t){if(a.$configEnabled!=null&&!await e.E(a.$configEnabled,{...r,...i}))continue;let t={...r,...i};if(!await e.E(a.enabled,t)){i[a.id]=void 0;continue}let s=Ee(a.id);if(s!==void 0){let n=Oe(a,s);if(typeof n==`string`&&n.trim()===``&&await e.w(a.required,t)===!0)throw e.I.required(a.id);a.transformers!==void 0&&(n=await e.s.apply(a.transformers,n,t)),e.j(`${a.message}: ${String(n)} (preset)`,`info`),i[a.id]=n;continue}try{let r,s=n.get(a.id);switch(a.default!==void 0&&(s=await W(a.default,a.id,t,a)),s!==void 0&&a.transformers!==void 0&&(s=await e.s.apply(a.transformers,s,t)),a.type){case`input`:{let n={message:a.message};s!==void 0&&(n.default=String(s));let i=await e.w(a.required,t);if(i!==void 0&&(n.required=i),r=await(0,o.input)(n),i&&(r==null||typeof r==`string`&&r.trim()===``))throw e.j(`${a.message} is required`,`error`),e.I.required(a.id);break}case`password`:if(r=await(0,o.password)({message:a.message,mask:`*`}),await e.w(a.required,t)&&(r==null||typeof r==`string`&&r.trim()===``))throw e.j(`${a.message} is required`,`error`),e.I.required(a.id);break;case`number`:{let n={message:a.message};s!==void 0&&(n.default=Number(s));let i=await e.w(a.required,t);if(i!==void 0&&(n.required=i),a.min!==void 0&&(n.min=a.min),a.max!==void 0&&(n.max=a.max),r=await(0,o.number)(n),i&&r==null)throw e.j(`${a.message} is required`,`error`),e.I.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`checkbox`:{let n={message:a.message,choices:a.choices.map(e=>({name:e.name,value:e.value}))};s!==void 0&&(n.default=s);let i=await e.w(a.required,t);i!==void 0&&(n.required=i),r=await(0,o.checkbox)(n);break}case`confirm`:{let e=s===void 0?!1:!!s;r=await(0,o.confirm)({message:a.message,default:e});break}default:throw e.j(`Unknown prompt type: ${a.type}`,`error`),e.I.unknownType(a.type)}a.transformers!==void 0&&(s!==void 0&&(r===s||String(r)===String(s))||(r=await e.s.apply(a.transformers,r,{...t,...i}))),i[a.id]=r}catch(t){throw t instanceof Error&&e.j(`Failed to collect prompt "${a.id}": ${t.message}`,`error`),t}}return i}async function Ae(e,t){let n=new Map,r=e.map(async e=>{if(e.default!==void 0){let r=await W(e.default,e.id,t,e);r!==void 0&&n.set(e.id,r)}});return await Promise.all(r),n}function je(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.type===`checkbox`){r.choices.length===0&&t.push(`${r.type===`select`?`Select`:`Checkbox`} prompt "${r.id}" must have at least one choice`);for(let e of r.choices)(!e.name||e.name.trim()===``)&&t.push(`${r.type===`select`?`Select`:`Checkbox`} prompt "${r.id}" has a choice with empty name`),e.value===void 0&&t.push(`${r.type===`select`?`Select`:`Checkbox`} 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 G=(0,i.promisify)(n.default.appendFile),Me=(0,i.promisify)(n.default.readFile),Ne=(0,i.promisify)(n.default.stat);async function Pe(n,i,a){if(n.condition!=null&&n.condition!==``&&!e.D(n.condition,i)){e.j(`Condition not met, skipping append task`,`info`);return}let o=r.default.join(t.default.cwd(),e.d(n.file,i)),s={};n.content==null?n.template!=null&&(s.template=n.template):s.template=n.content,n.templateFile!=null&&(s.templateFile=n.templateFile);let c=x(s);if(!c.isValid)throw c.error?.includes(`cannot have both`)?e.F.templateHasBothTemplateAndFile():e.F.templateMissingTemplateOrFile();let l=await S(s,i,a),u=!1,d=!1;try{await Ne(o),u=!0;let e=await Me(o,`utf-8`);e.length>0&&!e.endsWith(`
26
+ `)&&(d=n.newline!==!1)}catch{}u&&d?await G(o,`\n${l}`):await G(o,l),e.j(`Appended content to ${n.file}`,`success`)}const Fe={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await Pe(e.config,t,e)}},K=(0,i.promisify)(n.default.copyFile),Ie=(0,i.promisify)(n.default.stat),q=(0,i.promisify)(n.default.mkdir),Le=(0,i.promisify)(n.default.readdir);async function J(e,t){await q(t,{recursive:!0});let n=await Le(e,{withFileTypes:!0});await Promise.all(n.map(async n=>{let i=r.default.join(e,n.name),a=r.default.join(t,n.name);n.isDirectory()?await J(i,a):await K(i,a)}))}async function Re(n,i){if(n.condition!=null&&n.condition!==``&&!e.D(n.condition,i)){e.j(`Condition not met, skipping copy task`,`info`);return}let a=r.default.join(t.default.cwd(),e.d(n.from,i)),o=r.default.join(t.default.cwd(),e.d(n.to,i)),s;try{s=await Ie(a)}catch{e.j(`Source path does not exist: ${a}`,`warn`);return}await q(r.default.dirname(o),{recursive:!0}),s.isDirectory()?(await J(a,o),e.j(`Copied directory ${n.from} to ${n.to}`,`success`)):(await K(a,o),e.j(`Copied file ${n.from} to ${n.to}`,`success`))}const ze={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await Re(e.config,t)}},Be=(0,i.promisify)(n.default.writeFile);async function Ve(i,a,o){if(i.condition!=null&&i.condition!==``&&!e.D(i.condition,a)){e.j(`Condition not met, skipping create task`,`info`);return}let s=e.d(i.file,a),c=r.default.join(t.default.cwd(),s);if(n.default.existsSync(c)){e.j(`File already exists, skipping: ${s}`,`info`);return}let l=x(i);if(!l.isValid)throw l.error?.includes(`cannot have both`)?e.F.createHasBothTemplateAndFile():e.F.createMissingTemplateOrFile();let u=await S(i,a,o),d=r.default.dirname(c);n.default.existsSync(d)||n.default.mkdirSync(d,{recursive:!0}),await Be(c,u),e.j(`Created file: ${s}`,`success`)}const He={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await Ve(e.config,t,e)}};async function Ue(i,a){let{paths:o,condition:s}=i;if(s!=null&&s!==``){if(!a){e.j(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!e.D(s,a)){e.j(`Condition not met, skipping deletion`,`info`);return}}for(let i of o){let o=a==null?i:e.d(i,a),s=r.default.join(t.default.cwd(),o);n.default.existsSync(s)&&n.default.rmSync(s,{recursive:!0,force:!0})}}const We={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await Ue(e.config,t)}};async function Ge(t,n,r){t.condition!=null&&t.condition!==``&&!e.D(t.condition,n)||await e.p({file:t.file,...t.runtime&&{runtime:t.runtime},...t.args&&{args:t.args},...t.parameters&&{parameters:t.parameters},...t.cwd!=null&&t.cwd.trim()!==``&&{cwd:t.cwd},...r?.$sourceUrl!=null&&r.$sourceUrl.trim()!==``&&{sourceUrl:r.$sourceUrl},captureOutput:!1},n)}const Ke={name:`exec-file`,version:`1.0.0`,taskTypes:[`exec-file`],execute:async(e,t,n)=>{n.dryRun||await Ge(e.config,t,e)}};async function qe(n,i){if(n.condition!=null&&n.condition!==``){if(!i){e.j(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!e.D(n.condition,i)){e.j(`Condition not met, skipping exec task`,`info`);return}}let o=t=>i==null?t:e.d(t,i),s=E(o(n.command),n.args?.map(o)),c=n.cwd==null?t.default.cwd():r.default.join(t.default.cwd(),o(n.cwd));e.O(`Executing: ${s}`),(0,a.execSync)(s,{cwd:c,stdio:`inherit`})}const Je={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await qe(e.config,t)}};async function Ye(i,o){if(i.condition!=null&&i.condition!==``){if(!o){e.j(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!e.D(i.condition,o)){e.j(`Condition not met, skipping git-init task`,`info`);return}}if(i.removeExisting){let e=r.default.join(t.default.cwd(),`.git`);n.default.existsSync(e)&&n.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 Xe={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await Ye(e.config,t)}},Ze=(0,i.promisify)(n.default.mkdir);async function Qe(n,i){if(n.condition!=null&&n.condition!==``&&!e.D(n.condition,i)){e.j(`Condition not met, skipping mkdir task`,`info`);return}await Ze(r.default.join(t.default.cwd(),e.d(n.path,i)),{recursive:!0}),e.j(`Created directory: ${n.path}`,`success`)}const $e={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await Qe(e.config,t)}},et=(0,i.promisify)(n.default.rename),tt=(0,i.promisify)(n.default.stat),nt=(0,i.promisify)(n.default.mkdir);async function rt(n,i){if(n.condition!=null&&n.condition!==``&&!e.D(n.condition,i)){e.j(`Condition not met, skipping move task`,`info`);return}let a=r.default.join(t.default.cwd(),e.d(n.from,i)),o=r.default.join(t.default.cwd(),e.d(n.to,i));try{await tt(a)}catch{e.j(`Source path does not exist: ${a}`,`warn`);return}await nt(r.default.dirname(o),{recursive:!0}),await et(a,o),e.j(`Moved ${n.from} to ${n.to}`,`success`)}const it={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await rt(e.config,t)}},at=(0,i.promisify)(n.default.readFile),ot=(0,i.promisify)(n.default.writeFile);async function st(n,i){if(n.condition!=null&&n.condition!==``&&!e.D(n.condition,i)){e.j(`Condition not met, skipping regex-replace task`,`info`);return}let a=r.default.join(t.default.cwd(),e.d(n.file,i)),{pattern:o}=n,s=n.flags??``,c=n.replacement||``,l=await at(a,`utf-8`),u=new RegExp(o,s);l=l.replace(u,e.d(c,i)),await ot(a,l)}const ct={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await st(e.config,t)}},lt=(0,i.promisify)(n.default.rename);async function ut(i,a){if(i.condition!=null&&i.condition!==``&&!e.D(i.condition,a)){e.j(`Condition not met, skipping rename task`,`info`);return}let o=r.default.join(t.default.cwd(),e.d(i.from,a)),s=r.default.join(t.default.cwd(),e.d(i.to,a));if(!n.default.existsSync(o)){e.j(`Source path does not exist: ${o}`,`warn`);return}await lt(o,s)}const dt={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await ut(e.config,t)}},ft=(0,i.promisify)(n.default.readFile),pt=(0,i.promisify)(n.default.writeFile);async function mt(i,a){if(i.condition!=null&&i.condition!==``&&!e.D(i.condition,a)){e.j(`Condition not met, skipping replace-in-file task`,`info`);return}let o=r.default.join(t.default.cwd(),e.d(i.file,a)),{replacements:s}=i;if(!n.default.existsSync(o)){e.j(`File not found: ${o}, skipping`,`warn`);return}let c=await ft(o,`utf-8`);for(let{find:t,replace:n}of s){let r=e.d(n,a);c=c.replace(new RegExp(t,`gu`),r)}await pt(o,c)}const ht={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await mt(e.config,t)}},gt=(0,i.promisify)(n.default.readFile),_t=(0,i.promisify)(n.default.writeFile),vt=2;async function yt(n,i){if(n.condition!=null&&n.condition!==``&&!e.D(n.condition,i)){e.j(`Condition not met, skipping update-json task`,`info`);return}let a=r.default.join(t.default.cwd(),e.d(n.file,i)),{updates:o}=n,s=e.y(await gt(a,`utf-8`));function c(t){if(typeof t==`string`)return e.d(t,i);if(Array.isArray(t))return t.map(e=>c(e));if(typeof t==`object`&&t){let e={};for(let[n,r]of Object.entries(t))e[n]=c(r);return e}return t}for(let[t,n]of Object.entries(o)){let r=c(n);t.includes(`.`)?e.x(s,t,r):s[t]=r}await _t(a,`${JSON.stringify(s,null,2)}\n`)}const bt={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await yt(e.config,t)}},Y=(0,i.promisify)(n.default.writeFile);async function xt(i,a,o){let{allowCreate:s=!0}=i;if(i.condition!=null&&i.condition!==``&&!e.D(i.condition,a)){e.j(`Condition not met, skipping write task`,`info`);return}let c=e.d(i.file,a),l=r.default.join(t.default.cwd(),c);if(!n.default.existsSync(l)){if(s===!1)throw Error(`Write task failed: file does not exist (${c})`);e.j(`File not found, creating new file: ${c}`,`info`)}let u=x(i);if(!u.isValid)throw u.error?.includes(`cannot have both`)?e.F.templateHasBothTemplateAndFile():e.F.templateMissingTemplateOrFile();let d=await S(i,a,o),f=r.default.dirname(l);n.default.existsSync(f)||n.default.mkdirSync(f,{recursive:!0}),await Y(l,d)}const St={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await xt(e.config,t,e)}};function X(){L(`update-json`)||(F(bt),F(St),F(He),F(ct),F(ht),F(We),F(dt),F(Xe),F(Je),F(Ke),F(it),F(ze),F(Fe),F($e))}async function Ct(t,n,r=!1){if(X(),r){e.j(`[DRY RUN] Would execute: ${t.name}`,`info`);return}if(L(t.type)){await R(t,n,{dryRun:r});return}throw TypeError(`Unknown task type: ${t.type}`)}async function Z(n,r,i,a,o=!1){try{return e.j(`[${i}/${a}] Running: ${n.name}...`,`info`),await Ct(n,r,o),e.j(`[${i}/${a}] Completed: ${n.name}...`,`success`),!0}catch(r){return e.j(`Failed: ${n.name}`,`error`),r instanceof Error&&(e.j(` Reason: ${r.message}`,`error`),r.stack!=null&&t.default.env.DEBUG!=null&&console.error(r.stack)),!1}}async function wt(n,r,i){await P(`beforeAll`,r);let a=0,o=0,s=[];for(let t=0;t<n.length;t++){let c=n[t];c!=null&&(await P(`beforeTask`,c,r),await Z(c,r,t+1,n.length,i.dryRun)?(a++,await P(`afterTask`,c,r)):(await e.w(c.required,r)&&(o++,s.push(c.name)),await P(`onError`,Error(`Task ${c.name} failed`),c),e.P(`⚠️ Task "${c.name}" failed, continuing with remaining tasks...`)))}await P(`afterAll`,r),o>0&&(e.j(`\n❌ Task execution completed with ${o} error(s)`,`error`),e.j(`Completed: ${a}/${n.length} tasks`,`info`),e.j(`Failed tasks: ${s.join(`, `)}`,`error`),t.default.exit(1)),e.j(`Completed: ${a}/${n.length} tasks`,`success`)}function Q(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.R.forTaskDependency(t);i.add(t);let s=a.get(t);if(!s)throw e.L.forId(t);if(s.dependencies)for(let e of s.dependencies)o(e);i.delete(t),r.add(t),n.push(s)}for(let e of t)r.has(e.id)||o(e.id);return n}function Tt(e){let t=[],n=e.config,r=typeof n.template==`string`?n.template:void 0,i=typeof n.templateFile==`string`?n.templateFile:void 0,a=x({...r!==void 0&&{template:r},...i!==void 0&&{templateFile:i}});return!a.isValid&&a.error!=null&&a.error!==``&&t.push(`Task "${e.id}" (${e.name}): ${a.error}`),(n.file==null||n.file===``)&&t.push(`Task "${e.id}" (${e.name}): Write task requires "file" property to specify the output file path`),t}async function Et(n,r){let i=$(n);i.length>0&&(console.error(`❌ Task validation errors:`),i.forEach(e=>console.error(` - ${e}`)),t.default.exit(1));let a=[];for(let t of n)await e.E(t.enabled,r)&&a.push(t);return a}function Dt(e){return Q(e)}function $(e){let t=[];for(let n of e)if(!L(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=Tt(n);t.push(...e)}return t}Object.defineProperty(exports,`A`,{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,`C`,{enumerable:!0,get:function(){return fe}}),Object.defineProperty(exports,`D`,{enumerable:!0,get:function(){return le}}),Object.defineProperty(exports,`E`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`F`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`I`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`M`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`N`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`O`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`P`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return de}}),Object.defineProperty(exports,`T`,{enumerable:!0,get:function(){return ue}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return z}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return wt}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return je}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return De}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return Te}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return _e}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return H}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return Q}}),Object.defineProperty(exports,`j`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`k`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return Ae}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return ge}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return Dt}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return Se}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return Et}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return Z}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return $}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return ke}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`w`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return pe}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return I}});
@@ -1 +1 @@
1
- const e=require(`./configurations-C9hGwa2c.cjs`);exports.cleanupTempFile=e.m,exports.debug=e.O,exports.error=e.k,exports.logError=e.k,exports.evaluateCondition=e.D,exports.evaluateEnabled=e.T,exports.evaluateEnabledAsync=e.E,exports.evaluateRequiredAsync=e.w,exports.getNestedProperty=e.b,exports.getSourceDisplayName=e.S,exports.info=e.A,exports.logInfo=e.A,exports.interpolateTemplate=e.d,exports.isUrl=e.C,exports.log=e.j,exports.logSuccess=e.N,exports.success=e.N,exports.logWarn=e.P,exports.warn=e.P,exports.parseJsonc=e.y,exports.resolveAndFetchFile=e.h,exports.resolveFilePath=e.v,exports.resolveValue=e.f,exports.setDebugMode=e.M,exports.setNestedProperty=e.x;
1
+ const e=require(`./configurations-iSmGgORy.cjs`);exports.cleanupTempFile=e.m,exports.debug=e.O,exports.error=e.k,exports.logError=e.k,exports.evaluateCondition=e.D,exports.evaluateEnabled=e.T,exports.evaluateEnabledAsync=e.E,exports.evaluateRequiredAsync=e.w,exports.getNestedProperty=e.b,exports.getSourceDisplayName=e.S,exports.info=e.A,exports.logInfo=e.A,exports.interpolateTemplate=e.d,exports.isUrl=e.C,exports.log=e.j,exports.logSuccess=e.N,exports.success=e.N,exports.logWarn=e.P,exports.warn=e.P,exports.parseJsonc=e.y,exports.resolveAndFetchFile=e.h,exports.resolveFilePath=e.v,exports.resolveValue=e.f,exports.setDebugMode=e.M,exports.setNestedProperty=e.x;
@@ -1 +1 @@
1
- import{A as e,C as t,D as n,E as r,M as i,N as a,O as o,P as s,S as c,T as l,b as u,d,f,h as p,j as m,k as h,m as g,v as _,w as v,x as y,y as b}from"./configurations-C6TwZWBm.js";export{g as cleanupTempFile,o as debug,h as error,h as logError,n as evaluateCondition,l as evaluateEnabled,r as evaluateEnabledAsync,v as evaluateRequiredAsync,u as getNestedProperty,c as getSourceDisplayName,e as info,e as logInfo,d as interpolateTemplate,t as isUrl,m as log,a as logSuccess,a as success,s as logWarn,s as warn,b as parseJsonc,p as resolveAndFetchFile,_ as resolveFilePath,f as resolveValue,i as setDebugMode,y as setNestedProperty};
1
+ import{A as e,C as t,D as n,E as r,M as i,N as a,O as o,P as s,S as c,T as l,b as u,d,f,h as p,j as m,k as h,m as g,v as _,w as v,x as y,y as b}from"./configurations-sRFCjZJV.js";export{g as cleanupTempFile,o as debug,h as error,h as logError,n as evaluateCondition,l as evaluateEnabled,r as evaluateEnabledAsync,v as evaluateRequiredAsync,u as getNestedProperty,c as getSourceDisplayName,e as info,e as logInfo,d as interpolateTemplate,t as isUrl,m as log,a as logSuccess,a as success,s as logWarn,s as warn,b as parseJsonc,p as resolveAndFetchFile,_ as resolveFilePath,f as resolveValue,i as setDebugMode,y as setNestedProperty};
@@ -1 +1 @@
1
- import{j as e,y as t}from"./configurations-C6TwZWBm.js";import n from"node:path";import{fileURLToPath as r}from"node:url";import i from"node:fs";import a from"node:process";import o from"ajv";const s=r(import.meta.url),c=n.dirname(s);function l(){let e=[n.join(c,`..`,`schema`,`scaffoldfy.schema.json`),n.join(c,`..`,`..`,`schema`,`scaffoldfy.schema.json`)];for(let t of e)if(i.existsSync(t))return t;return n.join(c,`..`,`schema`,`scaffoldfy.schema.json`)}function u(){return new o({allErrors:!0,verbose:!0,strict:!1,discriminator:!0})}function d(e){try{let t=i.readFileSync(e,`utf-8`);return JSON.parse(t)}catch(t){throw Error(`Failed to load schema from ${e}: ${t instanceof Error?t.message:String(t)}`)}}function f(e,t,n={}){let r=u().compile(t);if(!r(e)&&r.errors){let e=n.filterOneOfErrors?h(r.errors):m(r.errors);return e.length===0?{valid:!0,errors:[]}:{valid:!1,errors:e}}return{valid:!0,errors:[]}}function p(e,t){return e.startsWith(`http`)?e.includes(`scaffoldfy/schema`)||e.includes(`@pixpilot/scaffoldfy`)?l():null:e.startsWith(`../`)||e.startsWith(`./`)?n.resolve(n.dirname(t),e):e}function m(e){return e.map(e=>`${e.instancePath||`root`}: ${e.message}`)}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(t){e(`❌ Schema validation failed:`,`error`),e(``,`error`),e(`The following validation errors were found:`,`error`),e(``,`error`);for(let n of t)e(` • ${n}`,`error`);e(``,`error`),e(`Please fix these errors in your template configuration file.`,`error`),e(``,`error`),e(`For schema documentation, see: https://github.com/pixpilot/scaffoldfy/tree/main/packages/scaffoldfy/schema`,`info`)}function _(e){let r=n.isAbsolute(e)?e:n.resolve(a.cwd(),e);try{let e=t(i.readFileSync(r,`utf-8`));if(!e||typeof e!=`object`||!(`$schema`in e))return{valid:!0};let n=e.$schema;if(typeof n!=`string`)return{valid:!0};let a=p(n,r);return a===null||!i.existsSync(a)?(console.warn(`Schema file not found: ${a}`),{valid:!0}):f(e,d(a))}catch(e){return{valid:!1,errors:[`Failed to parse JSON file ${r}: ${e instanceof Error?e.message:String(e)}`]}}}function v(t,n={}){try{let e=f(t,d(l()),{filterOneOfErrors:!0});return!e.valid&&!n.silent&&g(e.errors),e}catch(t){let r=t instanceof Error?t.message:`Unknown error occurred during schema validation`;return n.silent||(e(`❌ Schema validation error:`,`error`),e(` ${r}`,`error`)),{valid:!1,errors:[r]}}}export{_ as n,v as r,g as t};
1
+ import{j as e,y as t}from"./configurations-sRFCjZJV.js";import n from"node:process";import r from"node:path";import{fileURLToPath as i}from"node:url";import a from"node:fs";import o from"ajv";const s=i(import.meta.url),c=r.dirname(s);function l(){let e=[r.join(c,`..`,`schema`,`scaffoldfy.schema.json`),r.join(c,`..`,`..`,`schema`,`scaffoldfy.schema.json`)];for(let t of e)if(a.existsSync(t))return t;return r.join(c,`..`,`schema`,`scaffoldfy.schema.json`)}function u(){return new o({allErrors:!0,verbose:!0,strict:!1,discriminator:!0})}function d(e){try{let t=a.readFileSync(e,`utf-8`);return JSON.parse(t)}catch(t){throw Error(`Failed to load schema from ${e}: ${t instanceof Error?t.message:String(t)}`)}}function f(e,t,n={}){let r=u().compile(t);if(!r(e)&&r.errors){let e=n.filterOneOfErrors?h(r.errors):m(r.errors);return e.length===0?{valid:!0,errors:[]}:{valid:!1,errors:e}}return{valid:!0,errors:[]}}function p(e,t){return e.startsWith(`http`)?e.includes(`scaffoldfy/schema`)||e.includes(`@pixpilot/scaffoldfy`)?l():null:e.startsWith(`../`)||e.startsWith(`./`)?r.resolve(r.dirname(t),e):e}function m(e){return e.map(e=>`${e.instancePath||`root`}: ${e.message}`)}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(t){e(`❌ Schema validation failed:`,`error`),e(``,`error`),e(`The following validation errors were found:`,`error`),e(``,`error`);for(let n of t)e(` • ${n}`,`error`);e(``,`error`),e(`Please fix these errors in your template configuration file.`,`error`),e(``,`error`),e(`For schema documentation, see: https://github.com/pixpilot/scaffoldfy/tree/main/packages/scaffoldfy/schema`,`info`)}function _(e){let i=r.isAbsolute(e)?e:r.resolve(n.cwd(),e);try{let e=t(a.readFileSync(i,`utf-8`));if(!e||typeof e!=`object`||!(`$schema`in e))return{valid:!0};let n=e.$schema;if(typeof n!=`string`)return{valid:!0};let r=p(n,i);return r===null||!a.existsSync(r)?(console.warn(`Schema file not found: ${r}`),{valid:!0}):f(e,d(r))}catch(e){return{valid:!1,errors:[`Failed to parse JSON file ${i}: ${e instanceof Error?e.message:String(e)}`]}}}function v(t,n={}){try{let e=f(t,d(l()),{filterOneOfErrors:!0});return!e.valid&&!n.silent&&g(e.errors),e}catch(t){let r=t instanceof Error?t.message:`Unknown error occurred during schema validation`;return n.silent||(e(`❌ Schema validation error:`,`error`),e(` ${r}`,`error`)),{valid:!1,errors:[r]}}}export{_ as n,v as r,g as t};
@@ -1 +1 @@
1
- const e=require(`./configurations-C9hGwa2c.cjs`);let t=require(`node:fs`);t=e.z(t);let n=require(`node:path`);n=e.z(n);let r=require(`node:process`);r=e.z(r);let i=require(`node:url`);i=e.z(i);let a=require(`ajv`);a=e.z(a);const o=(0,i.fileURLToPath)(require(`url`).pathToFileURL(__filename).href),s=n.default.dirname(o);function c(){let e=[n.default.join(s,`..`,`schema`,`scaffoldfy.schema.json`),n.default.join(s,`..`,`..`,`schema`,`scaffoldfy.schema.json`)];for(let n of e)if(t.default.existsSync(n))return n;return n.default.join(s,`..`,`schema`,`scaffoldfy.schema.json`)}function l(){return new a.default({allErrors:!0,verbose:!0,strict:!1,discriminator:!0})}function u(e){try{let n=t.default.readFileSync(e,`utf-8`);return JSON.parse(n)}catch(t){throw Error(`Failed to load schema from ${e}: ${t instanceof Error?t.message:String(t)}`)}}function d(e,t,n={}){let r=l().compile(t);if(!r(e)&&r.errors){let e=n.filterOneOfErrors?m(r.errors):p(r.errors);return e.length===0?{valid:!0,errors:[]}:{valid:!1,errors:e}}return{valid:!0,errors:[]}}function f(e,t){return e.startsWith(`http`)?e.includes(`scaffoldfy/schema`)||e.includes(`@pixpilot/scaffoldfy`)?c():null:e.startsWith(`../`)||e.startsWith(`./`)?n.default.resolve(n.default.dirname(t),e):e}function p(e){return e.map(e=>`${e.instancePath||`root`}: ${e.message}`)}function m(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 h(t){e.j(`❌ Schema validation failed:`,`error`),e.j(``,`error`),e.j(`The following validation errors were found:`,`error`),e.j(``,`error`);for(let n of t)e.j(` • ${n}`,`error`);e.j(``,`error`),e.j(`Please fix these errors in your template configuration file.`,`error`),e.j(``,`error`),e.j(`For schema documentation, see: https://github.com/pixpilot/scaffoldfy/tree/main/packages/scaffoldfy/schema`,`info`)}function g(i){let a=n.default.isAbsolute(i)?i:n.default.resolve(r.default.cwd(),i);try{let n=e.y(t.default.readFileSync(a,`utf-8`));if(!n||typeof n!=`object`||!(`$schema`in n))return{valid:!0};let r=n.$schema;if(typeof r!=`string`)return{valid:!0};let i=f(r,a);return i===null||!t.default.existsSync(i)?(console.warn(`Schema file not found: ${i}`),{valid:!0}):d(n,u(i))}catch(e){return{valid:!1,errors:[`Failed to parse JSON file ${a}: ${e instanceof Error?e.message:String(e)}`]}}}function _(t,n={}){try{let e=d(t,u(c()),{filterOneOfErrors:!0});return!e.valid&&!n.silent&&h(e.errors),e}catch(t){let r=t instanceof Error?t.message:`Unknown error occurred during schema validation`;return n.silent||(e.j(`❌ Schema validation error:`,`error`),e.j(` ${r}`,`error`)),{valid:!1,errors:[r]}}}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return h}});
1
+ const e=require(`./configurations-iSmGgORy.cjs`);let t=require(`node:process`);t=e.z(t);let n=require(`node:fs`);n=e.z(n);let r=require(`node:path`);r=e.z(r);let i=require(`node:url`);i=e.z(i);let a=require(`ajv`);a=e.z(a);const o=(0,i.fileURLToPath)(require(`url`).pathToFileURL(__filename).href),s=r.default.dirname(o);function c(){let e=[r.default.join(s,`..`,`schema`,`scaffoldfy.schema.json`),r.default.join(s,`..`,`..`,`schema`,`scaffoldfy.schema.json`)];for(let t of e)if(n.default.existsSync(t))return t;return r.default.join(s,`..`,`schema`,`scaffoldfy.schema.json`)}function l(){return new a.default({allErrors:!0,verbose:!0,strict:!1,discriminator:!0})}function u(e){try{let t=n.default.readFileSync(e,`utf-8`);return JSON.parse(t)}catch(t){throw Error(`Failed to load schema from ${e}: ${t instanceof Error?t.message:String(t)}`)}}function d(e,t,n={}){let r=l().compile(t);if(!r(e)&&r.errors){let e=n.filterOneOfErrors?m(r.errors):p(r.errors);return e.length===0?{valid:!0,errors:[]}:{valid:!1,errors:e}}return{valid:!0,errors:[]}}function f(e,t){return e.startsWith(`http`)?e.includes(`scaffoldfy/schema`)||e.includes(`@pixpilot/scaffoldfy`)?c():null:e.startsWith(`../`)||e.startsWith(`./`)?r.default.resolve(r.default.dirname(t),e):e}function p(e){return e.map(e=>`${e.instancePath||`root`}: ${e.message}`)}function m(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 h(t){e.j(`❌ Schema validation failed:`,`error`),e.j(``,`error`),e.j(`The following validation errors were found:`,`error`),e.j(``,`error`);for(let n of t)e.j(` • ${n}`,`error`);e.j(``,`error`),e.j(`Please fix these errors in your template configuration file.`,`error`),e.j(``,`error`),e.j(`For schema documentation, see: https://github.com/pixpilot/scaffoldfy/tree/main/packages/scaffoldfy/schema`,`info`)}function g(i){let a=r.default.isAbsolute(i)?i:r.default.resolve(t.default.cwd(),i);try{let t=e.y(n.default.readFileSync(a,`utf-8`));if(!t||typeof t!=`object`||!(`$schema`in t))return{valid:!0};let r=t.$schema;if(typeof r!=`string`)return{valid:!0};let i=f(r,a);return i===null||!n.default.existsSync(i)?(console.warn(`Schema file not found: ${i}`),{valid:!0}):d(t,u(i))}catch(e){return{valid:!1,errors:[`Failed to parse JSON file ${a}: ${e instanceof Error?e.message:String(e)}`]}}}function _(t,n={}){try{let e=d(t,u(c()),{filterOneOfErrors:!0});return!e.valid&&!n.silent&&h(e.errors),e}catch(t){let r=t instanceof Error?t.message:`Unknown error occurred during schema validation`;return n.silent||(e.j(`❌ Schema validation error:`,`error`),e.j(` ${r}`,`error`)),{valid:!1,errors:[r]}}}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return h}});
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@pixpilot/scaffoldfy",
3
3
  "type": "module",
4
- "version": "0.56.0",
4
+ "version": "0.57.0",
5
5
  "author": "PixPilot <m.doaie@hotmail.com>",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -52,11 +52,11 @@
52
52
  "eslint": "^9.38.0",
53
53
  "tsdown": "^0.15.10",
54
54
  "typescript": "^5.9.3",
55
+ "@internal/eslint-config": "0.3.0",
55
56
  "@internal/prettier-config": "0.0.1",
56
57
  "@internal/tsconfig": "0.1.0",
57
- "@internal/eslint-config": "0.3.0",
58
- "@internal/tsdown-config": "0.1.0",
59
- "@internal/vitest-config": "0.1.0"
58
+ "@internal/vitest-config": "0.1.0",
59
+ "@internal/tsdown-config": "0.1.0"
60
60
  },
61
61
  "prettier": "@internal/prettier-config",
62
62
  "scripts": {
@@ -1,4 +0,0 @@
1
- import{A as e,E as t,O as n,a as r,i,j as a,o}from"./configurations-C6TwZWBm.js";import{a as s,c,l,n as u,o as d,r as f,u as p,w as m}from"./tasks-cEW0YvaN.js";import h from"node:process";async function g(e,t){let n=e.prompts??[];if(n.length>0){let e=c(n);e.length>0&&(console.error(`❌ Prompt validation errors:`),e.forEach(e=>console.error(` - ${e}`)),h.exit(1));let r=await p(n,await l(n,t),t);Object.assign(t,r)}}async function _(e,t){let n=e.variables??[];if(n.length>0){let a=i(n);a.length>0&&(console.error(`❌ Variable validation errors:`),a.forEach(e=>console.error(` - ${e}`)),h.exit(1));let s=await o(n,await r(n,t,{skipConditional:!0}),t);Object.assign(t,s),await v(e,t)}}async function v(e,t){let n=e.variables??[];if(n.length===0)return;let i=n.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1);if(i.length>0){let e=await o(i,await r(i,t),t);Object.assign(t,e)}}async function y(n,r){return await t(n.enabled,r)?(await _(n,r),await g(n,r),await v(n,r),await t(n.enabled,r)?!0:(e(`⊘ Config "${n.name}" became disabled after variable/prompt resolution - skipping tasks`),!1)):(e(`⊘ Config "${n.name}" is disabled - skipping`),!1)}async function b(t,r,i={}){n(`Running configs with sequential variable/prompt resolution...`),n(`Total configs to process: ${t.length}`),n(`Registering built-in plugins...`),d();let o=[];console.log(``),e(`📋 Collecting input...`),console.log(``);for(let e=0;e<t.length;e++){let r=t[e];if(r==null)continue;let a=`=`.repeat(60);if(n(`\n${a}`),n(`Processing config ${e+1}/${t.length}: "${r.name}"`),n(a),n(`Current config keys: ${Object.keys(i).join(`, `)}`),await y(r,i)){let e=r.tasks??[];e.length>0&&(n(`Found ${e.length} task(s) in config "${r.name}" (will execute later)`),o.push(...e))}}if(n(`
2
- 🔧 Validating and filtering all collected tasks...`),o.length===0){a(`No tasks found in any config`,`info`);return}console.log(``),a(`🛠️ Preparing tasks...`,`info`);let c=await f(o,i);if(console.log(``),a(`Found ${o.length} tasks (${c.length} enabled)`,`info`),a(`All tasks validated successfully`,`success`),c.length===0){a(`No enabled tasks to execute`,`info`);return}let l=u(c);if(r.dryRun){a(`
3
- 🔍 Dry run - showing task changes...`,`info`),await m(l,i),a(`
4
- 🔍 Dry run completed - no changes were made`,`info`),a(`Run without --dry-run to apply changes`,`info`);return}console.log(``),e(`⚙️ Executing tasks...`),console.log(``),await s(l,i,r)}export{b as runConfigurationSequentially};
@@ -1,23 +0,0 @@
1
- const e=require(`./configurations-C9hGwa2c.cjs`);let t=require(`node:fs`);t=e.z(t);let n=require(`node:path`);n=e.z(n);let r=require(`node:process`);r=e.z(r);let i=require(`node:util`);i=e.z(i);let a=require(`node:child_process`);a=e.z(a);let o=require(`@inquirer/prompts`);o=e.z(o);const s=(0,i.promisify)(t.default.readFile),c=2,l=10,u=55,d={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function f(e,t){switch(t){case`add`:return`${d.green}+ ${e}${d.reset}`;case`remove`:return`${d.red}- ${e}${d.reset}`;case`context`:return`${d.gray} ${e}${d.reset}`;default:return e}}function p(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(f(t,`context`)):(t!==void 0&&i.push(f(t,`remove`)),a!==void 0&&i.push(f(a,`add`)))}return i}function m(e){return t.default.existsSync(n.default.join(r.default.cwd(),e))}async function h(e){return s(n.default.join(r.default.cwd(),e),`utf-8`)}async function g(t,n){if(t.condition!=null&&t.condition!==``&&!e.D(t.condition,n))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;let r=t.file;if(!m(r))return`${d.red}✗ File not found: ${t.file}${d.reset}`;try{let i=await h(r),a=JSON.parse(i),o={...a};function s(t){if(typeof t==`string`)return e.d(t,n);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[n,r]of Object.entries(t.updates)){let t=s(r);n.includes(`.`)?e.x(a,n,t):a[n]=t}let c=JSON.stringify(o,null,2),l=JSON.stringify(a,null,2);if(c===l)return`${d.cyan}→ No changes${d.reset}`;let u=p(c,l);return`${d.blue}File: ${t.file}${d.reset}\n${u.join(`
4
- `)}`}catch(e){return`${d.red}✗ Error: ${e instanceof Error?e.message:String(e)}${d.reset}`}}async function _(t,n){if(t.condition!=null&&t.condition!==``&&!e.D(t.condition,n))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;let r=t.file;if(!m(r))return`${d.red}✗ File not found: ${t.file}${d.reset}`;try{let i=await h(r),a=new RegExp(t.pattern,t.flags??`g`),o=e.d(t.replacement,n),s=i.replace(a,o);if(i===s)return`${d.cyan}→ No matches found${d.reset}`;let c=p(i,s);return`${d.blue}File: ${t.file}${d.reset}\n${c.join(`
5
- `)}`}catch(e){return`${d.red}✗ Error: ${e instanceof Error?e.message:String(e)}${d.reset}`}}async function v(t,n){if(t.condition!=null&&t.condition!==``&&!e.D(t.condition,n))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;let r=t.file;if(!m(r))return`${d.red}✗ File not found: ${t.file}${d.reset}`;try{let i=await h(r),a=i;for(let{find:r,replace:a}of t.replacements){let t=e.d(r,n),o=e.d(a,n);i=i.replace(t,o)}if(a===i)return`${d.cyan}→ No changes${d.reset}`;let o=p(a,i);return`${d.blue}File: ${t.file}${d.reset}\n${o.join(`
6
- `)}`}catch(e){return`${d.red}✗ Error: ${e instanceof Error?e.message:String(e)}${d.reset}`}}function y(e){return e.template!=null&&e.template!==``}function b(e){return e.templateFile!=null&&e.templateFile!==``}function ee(e){return e.endsWith(`.hbs`)}function x(e){let t=y(e),n=b(e);return!t&&!n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration requires either "template" (inline) or "templateFile" (file path) to be specified`}:t&&n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration cannot have both "template" and "templateFile" specified. Use one or the other.`}:{isValid:!0,hasInlineTemplate:t,hasTemplateFile:n}}function te(e){return y(e)?`inline template`:b(e)?`template file: ${e.templateFile}`:`no template source`}async function S(t,n,r,i={}){let{enableHandlebars:a=!0,sourceUrl:o=r?.$sourceUrl}=i,s=y(t),c=b(t);if(s)return e.d(t.template,n);if(c){let r=t.templateFile,i=a&&ee(r),s=await e.u(e.v(r,o));return i?(await import(`handlebars`)).default.compile(s)(n):e.d(s,n)}throw Error(`No template content available`)}async function C(t,n){if(t.condition!=null&&t.condition!==``&&!e.D(t.condition,n))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;if(t.template==null||t.template===``)return`${d.red}✗ No template content provided for file: ${t.file}${d.reset}`;let r=t.file,i=e.d(t.template,n);if(!m(r)){let e=i.split(`
7
- `).slice(0,10).join(`
8
- `),n=i.split(`
9
- `).length>10;return`${d.blue}File: ${t.file}${d.reset}\n${d.green}+ New file would be created${d.reset}\n${d.gray}Content preview:${d.reset}\n${e}${n?`
10
- ...`:``}`}try{let e=await h(r);if(e===i)return`${d.cyan}→ No changes${d.reset}`;let n=p(e,i);return`${d.blue}File: ${t.file}${d.reset}\n${n.join(`
11
- `)}`}catch(e){return`${d.red}✗ Error: ${e instanceof Error?e.message:String(e)}${d.reset}`}}async function w(t,n,r){if(t.condition!=null&&t.condition!==``&&!e.D(t.condition,n))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;let i=t.file;if(m(i))return`${d.cyan}→ File already exists, would be skipped: ${t.file}${d.reset}`;try{if(y(t)){let e=await S(t,n,r),i=e.split(`
12
- `).slice(0,10).join(`
13
- `),a=e.split(`
14
- `).length>10;return`${d.blue}File: ${t.file}${d.reset}\n${d.green}+ New file would be created${d.reset}\n${d.gray}Content preview:${d.reset}\n${i}${a?`
15
- ...`:``}`}let e=te(t);return`${d.blue}File: ${t.file}${d.reset}\n${d.green}+ New file would be created from ${e}${d.reset}`}catch(e){return`${d.red}✗ Error: ${e instanceof Error?e.message:String(e)}${d.reset}`}}async function ne(t,n,r){if(t.condition!=null&&t.condition!==``&&!e.D(t.condition,n))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;let i=t.file,a={};t.content==null?t.template!=null&&(a.template=t.template):a.template=t.content,t.templateFile!=null&&(a.templateFile=t.templateFile);try{let e=await S(a,n,r),o=e.split(`
16
- `).slice(0,10).join(`
17
- `),s=e.split(`
18
- `).length>10;return m(i)?`${d.blue}File: ${t.file}${d.reset}\n${d.green}+ Would append content${d.reset}\n${d.gray}Content preview:${d.reset}\n${o}${s?`
19
- ...`:``}`:`${d.blue}File: ${t.file}${d.reset}\n${d.green}+ New file would be created with content${d.reset}\n${d.gray}Content preview:${d.reset}\n${o}${s?`
20
- ...`:``}`}catch(e){return`${d.red}✗ Error: ${e instanceof Error?e.message:String(e)}${d.reset}`}}function T(t,n){if(t.condition!=null&&t.condition!==``&&!e.D(t.condition,n))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;let r=t.paths.map(t=>e.d(t,n)).filter(e=>m(e));return r.length===0?`${d.cyan}→ No files/directories to delete${d.reset}`:`${d.red}Would delete:${d.reset}\n${r.map(e=>`${d.red} - ${e}${d.reset}`).join(`
21
- `)}`}function E(t,n){if(t.condition!=null&&t.condition!==``&&!e.D(t.condition,n))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;let r=e.d(t.from,n),i=e.d(t.to,n);return m(r)?m(i)?`${d.yellow}⚠ Destination already exists: ${i}${d.reset}\n${d.cyan}Would rename: ${r} → ${i}${d.reset}`:`${d.cyan}Would rename: ${r} → ${i}${d.reset}`:`${d.red}✗ Source not found: ${r}${d.reset}`}function re(t,n){if(t.condition!=null&&t.condition!==``&&!e.D(t.condition,n))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;let r=e.d(t.from,n),i=e.d(t.to,n);return m(r)?m(i)?`${d.yellow}⚠ Destination already exists: ${i}${d.reset}\n${d.cyan}Would move: ${r} → ${i}${d.reset}`:`${d.cyan}Would move: ${r} → ${i}${d.reset}`:`${d.red}✗ Source not found: ${r}${d.reset}`}function ie(t,n){if(t.condition!=null&&t.condition!==``&&!e.D(t.condition,n))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;let r=e.d(t.from,n),i=e.d(t.to,n);if(!m(r))return`${d.red}✗ Source not found: ${r}${d.reset}`;let a=`file`;return m(i)?`${d.yellow}⚠ Destination already exists: ${i}${d.reset}\n${d.cyan}Would copy ${a}: ${r} → ${i}${d.reset}`:`${d.cyan}Would copy ${a}: ${r} → ${i}${d.reset}`}function ae(t,n){if(t.condition!=null&&t.condition!==``&&!e.D(t.condition,n))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;let r=e.d(t.path,n);return m(r)?`${d.cyan}→ Directory already exists: ${r}${d.reset}`:`${d.green}+ Would create directory: ${r}${d.reset}`}const oe=/^[\w+,./:=@-]+$/u;function D(e){return oe.test(e)?e:r.default.platform===`win32`?`"${e.replace(/(?<slashes>\\*)"/gu,`$<slashes>$<slashes>\\"`).replace(/(?<slashes>\\+)$/u,`$<slashes>$<slashes>`)}"`:`'${e.replace(/'/gu,String.raw`'\''`)}'`}function O(e,t){let n=(t??[]).filter(e=>e!==``).map(D);return n.length>0?`${e} ${n.join(` `)}`:e}function k(e){if(e.condition!=null&&e.condition!==``)return`${d.yellow}⊘ Condition check skipped in dry-run${d.reset}`;let t=m(`.git`),n=[];if(e.removeExisting&&t&&n.push(`${d.red}Would remove existing .git directory${d.reset}`),n.push(`${d.green}Would initialize git repository${d.reset}`),e.initialCommit){let t=e.message??`Initial commit`;n.push(`${d.green}Would create initial commit: "${t}"${d.reset}`)}return n.join(`
22
- `)}function A(t,n){if(t.condition!=null&&t.condition!==``&&!e.D(t.condition,n))return`${d.yellow}⊘ Condition not met - task would be skipped${d.reset}`;let i=O(e.d(t.command,n),t.args?.map(t=>e.d(t,n))),a=t.cwd==null?r.default.cwd():e.d(t.cwd,n);return`${d.yellow}Would execute:${d.reset}\n${d.cyan} Command: ${i}${d.reset}\n${d.cyan} Working directory: ${a}${d.reset}`}async function j(e,t){try{switch(e.type){case`update-json`:return await g(e.config,t);case`write`:return await C(e.config,t);case`create`:return await w(e.config,t,e);case`regex-replace`:return await _(e.config,t);case`replace-in-file`:return await v(e.config,t);case`delete`:return T(e.config,t);case`rename`:return E(e.config,t);case`move`:return re(e.config,t);case`copy`:return ie(e.config,t);case`append`:return await ne(e.config,t,e);case`mkdir`:return ae(e.config,t);case`git-init`:return k(e.config);case`exec`:return A(e.config,t);case`exec-file`:return A(e.config,t);default:{let t=e.type;return`${d.yellow}⚠ Diff not available for task type: ${t}${d.reset}`}}}catch(e){return`${d.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${d.reset}`}}async function se(e,t){console.log(`${d.blue}═══════════════════════════════════════════════════════${d.reset}`),console.log(`${d.blue} DRY RUN - Preview of changes${d.reset}`),console.log(`${d.blue}═══════════════════════════════════════════════════════${d.reset}`);for(let n of e){console.log(`${d.cyan}▶ Task: ${n.name}${d.reset}`),n.description!=null&&n.description!==``&&console.log(`${d.gray} ${n.description}${d.reset}`);let e=await j(n,t);console.log(e),console.log(`${d.gray}${`─`.repeat(55)}${d.reset}`)}console.log(`${d.blue}═══════════════════════════════════════════════════════${d.reset}`),console.log(`${d.yellow} No changes were applied (dry-run mode)${d.reset}`),console.log(`${d.blue}═══════════════════════════════════════════════════════${d.reset}`)}const M=new Map,N={},P=new Map;function ce(e){e.beforeAll!=null&&(N.beforeAll=e.beforeAll),e.afterAll!=null&&(N.afterAll=e.afterAll),e.beforeTask!=null&&(N.beforeTask=e.beforeTask),e.afterTask!=null&&(N.afterTask=e.afterTask),e.onError!=null&&(N.onError=e.onError)}async function F(t,...n){let r=N[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.j(`Error in ${t} hook: ${n instanceof Error?n.message:String(n)}`,`error`)}}function I(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(M.has(t.name))throw TypeError(`Plugin ${t.name} is already registered`);for(let e of t.taskTypes)if(P.has(e)){let t=P.get(e);throw TypeError(`Task type "${e}" is already registered by plugin "${t}"`)}M.set(t.name,t);for(let e of t.taskTypes)P.set(e,t.name);e.O(`Registered plugin: ${t.name}${t.version==null?``:` v${t.version}`}`)}function le(e){let t=M.get(e);if(t!=null){for(let e of t.taskTypes)P.delete(e);M.delete(e)}}function ue(e){return M.get(e)}function de(){return Array.from(M.keys())}function L(){M.clear(),P.clear()}function R(e){let t=P.get(e);if(t!=null)return M.get(t)}function z(e){return P.has(e)}async function B(e,t,n){let r=R(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}function V(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}}}const H=new Set([`true`,`1`,`yes`,`y`]),fe=new Set([`false`,`0`,`no`,`n`]);let U=new Map;function pe(e){U=new Map(Object.entries(e))}function me(e){return U.get(e)}function he(e){let t=e.indexOf(`=`);if(t<=0)throw Error(`Invalid --set value "${e}". Expected format: key=value`);return[e.slice(0,t).trim(),e.slice(t+1)]}function ge(t,n){switch(t.type){case`confirm`:{let r=n.trim().toLowerCase();if(H.has(r))return!0;if(fe.has(r))return!1;throw e.I.invalidValue(t.id,n,`expected true or false`)}case`number`:{let r=Number(n);if(n.trim()===``||Number.isNaN(r))throw e.I.invalidValue(t.id,n,`expected a number`);return r}case`select`:{let r=t.choices.find(e=>String(e.value)===n);if(r==null)throw e.I.invalidValue(t.id,n,`expected one of ${t.choices.map(e=>String(e.value)).join(`, `)}`);return r.value}case`checkbox`:return n.split(`,`).map(e=>e.trim()).filter(e=>e!==``).map(n=>{let r=t.choices.find(e=>String(e.value)===n);if(r==null)throw e.I.invalidValue(t.id,n,`expected one of ${t.choices.map(e=>String(e.value)).join(`, `)}`);return r.value});case`input`:case`password`:return n;default:throw e.I.unknownType(t.type)}}async function W(t,n,r,i){if(t!==void 0)return e.f(t,{id:n,contextType:`Prompt`,...r!=null&&{context:r},...i?.$sourceUrl!=null&&{sourceUrl:i.$sourceUrl}})}async function _e(t,n=new Map,r={}){let i={};if(t.length===0)return i;for(let a of t){if(a.$configEnabled!=null&&!await e.E(a.$configEnabled,{...r,...i}))continue;let t={...r,...i};if(!await e.E(a.enabled,t)){i[a.id]=void 0;continue}let s=me(a.id);if(s!==void 0){let n=ge(a,s);if(typeof n==`string`&&n.trim()===``&&await e.w(a.required,t)===!0)throw e.I.required(a.id);a.transformers!==void 0&&(n=await e.s.apply(a.transformers,n,t)),e.j(`${a.message}: ${String(n)} (preset)`,`info`),i[a.id]=n;continue}try{let r,s=n.get(a.id);switch(a.default!==void 0&&(s=await W(a.default,a.id,t,a)),s!==void 0&&a.transformers!==void 0&&(s=await e.s.apply(a.transformers,s,t)),a.type){case`input`:{let n={message:a.message};s!==void 0&&(n.default=String(s));let i=await e.w(a.required,t);if(i!==void 0&&(n.required=i),r=await(0,o.input)(n),i&&(r==null||typeof r==`string`&&r.trim()===``))throw e.j(`${a.message} is required`,`error`),e.I.required(a.id);break}case`password`:if(r=await(0,o.password)({message:a.message,mask:`*`}),await e.w(a.required,t)&&(r==null||typeof r==`string`&&r.trim()===``))throw e.j(`${a.message} is required`,`error`),e.I.required(a.id);break;case`number`:{let n={message:a.message};s!==void 0&&(n.default=Number(s));let i=await e.w(a.required,t);if(i!==void 0&&(n.required=i),a.min!==void 0&&(n.min=a.min),a.max!==void 0&&(n.max=a.max),r=await(0,o.number)(n),i&&r==null)throw e.j(`${a.message} is required`,`error`),e.I.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`checkbox`:{let n={message:a.message,choices:a.choices.map(e=>({name:e.name,value:e.value}))};s!==void 0&&(n.default=s);let i=await e.w(a.required,t);i!==void 0&&(n.required=i),r=await(0,o.checkbox)(n);break}case`confirm`:{let e=s===void 0?!1:!!s;r=await(0,o.confirm)({message:a.message,default:e});break}default:throw e.j(`Unknown prompt type: ${a.type}`,`error`),e.I.unknownType(a.type)}a.transformers!==void 0&&(s!==void 0&&(r===s||String(r)===String(s))||(r=await e.s.apply(a.transformers,r,{...t,...i}))),i[a.id]=r}catch(t){throw t instanceof Error&&e.j(`Failed to collect prompt "${a.id}": ${t.message}`,`error`),t}}return i}async function ve(e,t){let n=new Map,r=e.map(async e=>{if(e.default!==void 0){let r=await W(e.default,e.id,t,e);r!==void 0&&n.set(e.id,r)}});return await Promise.all(r),n}function ye(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.type===`checkbox`){r.choices.length===0&&t.push(`${r.type===`select`?`Select`:`Checkbox`} prompt "${r.id}" must have at least one choice`);for(let e of r.choices)(!e.name||e.name.trim()===``)&&t.push(`${r.type===`select`?`Select`:`Checkbox`} prompt "${r.id}" has a choice with empty name`),e.value===void 0&&t.push(`${r.type===`select`?`Select`:`Checkbox`} 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 G=(0,i.promisify)(t.default.appendFile),be=(0,i.promisify)(t.default.readFile),xe=(0,i.promisify)(t.default.stat);async function Se(t,i,a){if(t.condition!=null&&t.condition!==``&&!e.D(t.condition,i)){e.j(`Condition not met, skipping append task`,`info`);return}let o=n.default.join(r.default.cwd(),e.d(t.file,i)),s={};t.content==null?t.template!=null&&(s.template=t.template):s.template=t.content,t.templateFile!=null&&(s.templateFile=t.templateFile);let c=x(s);if(!c.isValid)throw c.error?.includes(`cannot have both`)?e.F.templateHasBothTemplateAndFile():e.F.templateMissingTemplateOrFile();let l=await S(s,i,a),u=!1,d=!1;try{await xe(o),u=!0;let e=await be(o,`utf-8`);e.length>0&&!e.endsWith(`
23
- `)&&(d=t.newline!==!1)}catch{}u&&d?await G(o,`\n${l}`):await G(o,l),e.j(`Appended content to ${t.file}`,`success`)}const Ce={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await Se(e.config,t,e)}},K=(0,i.promisify)(t.default.copyFile),we=(0,i.promisify)(t.default.stat),q=(0,i.promisify)(t.default.mkdir),Te=(0,i.promisify)(t.default.readdir);async function J(e,t){await q(t,{recursive:!0});let r=await Te(e,{withFileTypes:!0});await Promise.all(r.map(async r=>{let i=n.default.join(e,r.name),a=n.default.join(t,r.name);r.isDirectory()?await J(i,a):await K(i,a)}))}async function Ee(t,i){if(t.condition!=null&&t.condition!==``&&!e.D(t.condition,i)){e.j(`Condition not met, skipping copy task`,`info`);return}let a=n.default.join(r.default.cwd(),e.d(t.from,i)),o=n.default.join(r.default.cwd(),e.d(t.to,i)),s;try{s=await we(a)}catch{e.j(`Source path does not exist: ${a}`,`warn`);return}await q(n.default.dirname(o),{recursive:!0}),s.isDirectory()?(await J(a,o),e.j(`Copied directory ${t.from} to ${t.to}`,`success`)):(await K(a,o),e.j(`Copied file ${t.from} to ${t.to}`,`success`))}const De={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await Ee(e.config,t)}},Oe=(0,i.promisify)(t.default.writeFile);async function ke(i,a,o){if(i.condition!=null&&i.condition!==``&&!e.D(i.condition,a)){e.j(`Condition not met, skipping create task`,`info`);return}let s=e.d(i.file,a),c=n.default.join(r.default.cwd(),s);if(t.default.existsSync(c)){e.j(`File already exists, skipping: ${s}`,`info`);return}let l=x(i);if(!l.isValid)throw l.error?.includes(`cannot have both`)?e.F.createHasBothTemplateAndFile():e.F.createMissingTemplateOrFile();let u=await S(i,a,o),d=n.default.dirname(c);t.default.existsSync(d)||t.default.mkdirSync(d,{recursive:!0}),await Oe(c,u),e.j(`Created file: ${s}`,`success`)}const Ae={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await ke(e.config,t,e)}};async function je(i,a){let{paths:o,condition:s}=i;if(s!=null&&s!==``){if(!a){e.j(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!e.D(s,a)){e.j(`Condition not met, skipping deletion`,`info`);return}}for(let i of o){let o=a==null?i:e.d(i,a),s=n.default.join(r.default.cwd(),o);t.default.existsSync(s)&&t.default.rmSync(s,{recursive:!0,force:!0})}}const Me={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await je(e.config,t)}};async function Ne(t,n,r){t.condition!=null&&t.condition!==``&&!e.D(t.condition,n)||await e.p({file:t.file,...t.runtime&&{runtime:t.runtime},...t.args&&{args:t.args},...t.parameters&&{parameters:t.parameters},...t.cwd!=null&&t.cwd.trim()!==``&&{cwd:t.cwd},...r?.$sourceUrl!=null&&r.$sourceUrl.trim()!==``&&{sourceUrl:r.$sourceUrl},captureOutput:!1},n)}const Pe={name:`exec-file`,version:`1.0.0`,taskTypes:[`exec-file`],execute:async(e,t,n)=>{n.dryRun||await Ne(e.config,t,e)}};async function Fe(t,i){if(t.condition!=null&&t.condition!==``){if(!i){e.j(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!e.D(t.condition,i)){e.j(`Condition not met, skipping exec task`,`info`);return}}let o=t=>i==null?t:e.d(t,i),s=O(o(t.command),t.args?.map(o)),c=t.cwd==null?r.default.cwd():n.default.join(r.default.cwd(),o(t.cwd));e.O(`Executing: ${s}`),(0,a.execSync)(s,{cwd:c,stdio:`inherit`})}const Ie={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await Fe(e.config,t)}};async function Le(i,o){if(i.condition!=null&&i.condition!==``){if(!o){e.j(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!e.D(i.condition,o)){e.j(`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 Re={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await Le(e.config,t)}},ze=(0,i.promisify)(t.default.mkdir);async function Be(t,i){if(t.condition!=null&&t.condition!==``&&!e.D(t.condition,i)){e.j(`Condition not met, skipping mkdir task`,`info`);return}await ze(n.default.join(r.default.cwd(),e.d(t.path,i)),{recursive:!0}),e.j(`Created directory: ${t.path}`,`success`)}const Ve={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await Be(e.config,t)}},He=(0,i.promisify)(t.default.rename),Ue=(0,i.promisify)(t.default.stat),We=(0,i.promisify)(t.default.mkdir);async function Ge(t,i){if(t.condition!=null&&t.condition!==``&&!e.D(t.condition,i)){e.j(`Condition not met, skipping move task`,`info`);return}let a=n.default.join(r.default.cwd(),e.d(t.from,i)),o=n.default.join(r.default.cwd(),e.d(t.to,i));try{await Ue(a)}catch{e.j(`Source path does not exist: ${a}`,`warn`);return}await We(n.default.dirname(o),{recursive:!0}),await He(a,o),e.j(`Moved ${t.from} to ${t.to}`,`success`)}const Ke={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await Ge(e.config,t)}},qe=(0,i.promisify)(t.default.readFile),Je=(0,i.promisify)(t.default.writeFile);async function Ye(t,i){if(t.condition!=null&&t.condition!==``&&!e.D(t.condition,i)){e.j(`Condition not met, skipping regex-replace task`,`info`);return}let a=n.default.join(r.default.cwd(),e.d(t.file,i)),{pattern:o}=t,s=t.flags??``,c=t.replacement||``,l=await qe(a,`utf-8`),u=new RegExp(o,s);l=l.replace(u,e.d(c,i)),await Je(a,l)}const Xe={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await Ye(e.config,t)}},Ze=(0,i.promisify)(t.default.rename);async function Qe(i,a){if(i.condition!=null&&i.condition!==``&&!e.D(i.condition,a)){e.j(`Condition not met, skipping rename task`,`info`);return}let o=n.default.join(r.default.cwd(),e.d(i.from,a)),s=n.default.join(r.default.cwd(),e.d(i.to,a));if(!t.default.existsSync(o)){e.j(`Source path does not exist: ${o}`,`warn`);return}await Ze(o,s)}const $e={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await Qe(e.config,t)}},et=(0,i.promisify)(t.default.readFile),tt=(0,i.promisify)(t.default.writeFile);async function Y(i,a){if(i.condition!=null&&i.condition!==``&&!e.D(i.condition,a)){e.j(`Condition not met, skipping replace-in-file task`,`info`);return}let o=n.default.join(r.default.cwd(),e.d(i.file,a)),{replacements:s}=i;if(!t.default.existsSync(o)){e.j(`File not found: ${o}, skipping`,`warn`);return}let c=await et(o,`utf-8`);for(let{find:t,replace:n}of s){let r=e.d(n,a);c=c.replace(new RegExp(t,`gu`),r)}await tt(o,c)}const nt={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await Y(e.config,t)}},rt=(0,i.promisify)(t.default.readFile),it=(0,i.promisify)(t.default.writeFile),at=2;async function ot(t,i){if(t.condition!=null&&t.condition!==``&&!e.D(t.condition,i)){e.j(`Condition not met, skipping update-json task`,`info`);return}let a=n.default.join(r.default.cwd(),e.d(t.file,i)),{updates:o}=t,s=e.y(await rt(a,`utf-8`));function c(t){if(typeof t==`string`)return e.d(t,i);if(Array.isArray(t))return t.map(e=>c(e));if(typeof t==`object`&&t){let e={};for(let[n,r]of Object.entries(t))e[n]=c(r);return e}return t}for(let[t,n]of Object.entries(o)){let r=c(n);t.includes(`.`)?e.x(s,t,r):s[t]=r}await it(a,`${JSON.stringify(s,null,2)}\n`)}const st={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await ot(e.config,t)}},ct=(0,i.promisify)(t.default.writeFile);async function lt(i,a,o){let{allowCreate:s=!0}=i;if(i.condition!=null&&i.condition!==``&&!e.D(i.condition,a)){e.j(`Condition not met, skipping write task`,`info`);return}let c=e.d(i.file,a),l=n.default.join(r.default.cwd(),c);if(!t.default.existsSync(l)){if(s===!1)throw Error(`Write task failed: file does not exist (${c})`);e.j(`File not found, creating new file: ${c}`,`info`)}let u=x(i);if(!u.isValid)throw u.error?.includes(`cannot have both`)?e.F.templateHasBothTemplateAndFile():e.F.templateMissingTemplateOrFile();let d=await S(i,a,o),f=n.default.dirname(l);t.default.existsSync(f)||t.default.mkdirSync(f,{recursive:!0}),await ct(l,d)}const ut={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await lt(e.config,t,e)}};function X(){z(`update-json`)||(I(st),I(ut),I(Ae),I(Xe),I(nt),I(Me),I($e),I(Re),I(Ie),I(Pe),I(Ke),I(De),I(Ce),I(Ve))}async function dt(t,n,r=!1){if(X(),r){e.j(`[DRY RUN] Would execute: ${t.name}`,`info`);return}if(z(t.type)){await B(t,n,{dryRun:r});return}throw TypeError(`Unknown task type: ${t.type}`)}async function Z(t,n,i,a,o=!1){try{return e.j(`[${i}/${a}] Running: ${t.name}...`,`info`),await dt(t,n,o),e.j(`[${i}/${a}] Completed: ${t.name}...`,`success`),!0}catch(n){return e.j(`Failed: ${t.name}`,`error`),n instanceof Error&&(e.j(` Reason: ${n.message}`,`error`),n.stack!=null&&r.default.env.DEBUG!=null&&console.error(n.stack)),!1}}async function ft(t,n,i){await F(`beforeAll`,n);let a=0,o=0,s=[];for(let r=0;r<t.length;r++){let c=t[r];c!=null&&(await F(`beforeTask`,c,n),await Z(c,n,r+1,t.length,i.dryRun)?(a++,await F(`afterTask`,c,n)):(await e.w(c.required,n)&&(o++,s.push(c.name)),await F(`onError`,Error(`Task ${c.name} failed`),c),e.P(`⚠️ Task "${c.name}" failed, continuing with remaining tasks...`)))}await F(`afterAll`,n),o>0&&(e.j(`\n❌ Task execution completed with ${o} error(s)`,`error`),e.j(`Completed: ${a}/${t.length} tasks`,`info`),e.j(`Failed tasks: ${s.join(`, `)}`,`error`),r.default.exit(1)),e.j(`Completed: ${a}/${t.length} tasks`,`success`)}function Q(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.R.forTaskDependency(t);i.add(t);let s=a.get(t);if(!s)throw e.L.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 pt(e){let t=[],n=e.config,r=typeof n.template==`string`?n.template:void 0,i=typeof n.templateFile==`string`?n.templateFile:void 0,a=x({...r!==void 0&&{template:r},...i!==void 0&&{templateFile:i}});return!a.isValid&&a.error!=null&&a.error!==``&&t.push(`Task "${e.id}" (${e.name}): ${a.error}`),(n.file==null||n.file===``)&&t.push(`Task "${e.id}" (${e.name}): Write task requires "file" property to specify the output file path`),t}async function mt(t,n){let i=$(t);i.length>0&&(console.error(`❌ Task validation errors:`),i.forEach(e=>console.error(` - ${e}`)),r.default.exit(1));let a=[];for(let r of t)await e.E(r.enabled,n)&&a.push(r);return a}function ht(e){return Q(e)}function $(e){let t=[];for(let n of e)if(!z(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=pt(n);t.push(...e)}return t}Object.defineProperty(exports,`A`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`C`,{enumerable:!0,get:function(){return ce}}),Object.defineProperty(exports,`D`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`E`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`M`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`O`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`T`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return ft}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return ye}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return he}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return pe}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return z}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return Q}}),Object.defineProperty(exports,`j`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`k`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return ve}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return ht}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return V}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return mt}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return Z}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return $}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return _e}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return ue}}),Object.defineProperty(exports,`w`,{enumerable:!0,get:function(){return se}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return le}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return de}});
@@ -1,23 +0,0 @@
1
- import{D as e,E as t,F as n,I as r,L as i,O as a,P as o,R as s,d as c,f as l,j as u,p as d,s as f,u as ee,v as te,w as p,x as m,y as ne}from"./configurations-C6TwZWBm.js";import h from"node:path";import g from"node:fs";import _ from"node:process";import{promisify as v}from"node:util";import{execSync as y}from"node:child_process";import{checkbox as re,confirm as ie,input as ae,number as oe,password as se,select as ce}from"@inquirer/prompts";const le=v(g.readFile),b={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function x(e,t){switch(t){case`add`:return`${b.green}+ ${e}${b.reset}`;case`remove`:return`${b.red}- ${e}${b.reset}`;case`context`:return`${b.gray} ${e}${b.reset}`;default:return e}}function S(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(x(t,`context`)):(t!==void 0&&i.push(x(t,`remove`)),a!==void 0&&i.push(x(a,`add`)))}return i}function C(e){return g.existsSync(h.join(_.cwd(),e))}async function w(e){return le(h.join(_.cwd(),e),`utf-8`)}async function T(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let r=t.file;if(!C(r))return`${b.red}✗ File not found: ${t.file}${b.reset}`;try{let e=await w(r),i=JSON.parse(e),a={...i};function o(e){if(typeof e==`string`)return c(e,n);if(Array.isArray(e))return e.map(e=>o(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=o(r);return t}return e}for(let[e,n]of Object.entries(t.updates)){let t=o(n);e.includes(`.`)?m(i,e,t):i[e]=t}let s=JSON.stringify(a,null,2),l=JSON.stringify(i,null,2);if(s===l)return`${b.cyan}→ No changes${b.reset}`;let u=S(s,l);return`${b.blue}File: ${t.file}${b.reset}\n${u.join(`
4
- `)}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}async function E(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let r=t.file;if(!C(r))return`${b.red}✗ File not found: ${t.file}${b.reset}`;try{let e=await w(r),i=new RegExp(t.pattern,t.flags??`g`),a=c(t.replacement,n),o=e.replace(i,a);if(e===o)return`${b.cyan}→ No matches found${b.reset}`;let s=S(e,o);return`${b.blue}File: ${t.file}${b.reset}\n${s.join(`
5
- `)}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}async function D(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let r=t.file;if(!C(r))return`${b.red}✗ File not found: ${t.file}${b.reset}`;try{let e=await w(r),i=e;for(let{find:r,replace:i}of t.replacements){let t=c(r,n),a=c(i,n);e=e.replace(t,a)}if(i===e)return`${b.cyan}→ No changes${b.reset}`;let a=S(i,e);return`${b.blue}File: ${t.file}${b.reset}\n${a.join(`
6
- `)}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}function O(e){return e.template!=null&&e.template!==``}function k(e){return e.templateFile!=null&&e.templateFile!==``}function ue(e){return e.endsWith(`.hbs`)}function A(e){let t=O(e),n=k(e);return!t&&!n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration requires either "template" (inline) or "templateFile" (file path) to be specified`}:t&&n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration cannot have both "template" and "templateFile" specified. Use one or the other.`}:{isValid:!0,hasInlineTemplate:t,hasTemplateFile:n}}function de(e){return O(e)?`inline template`:k(e)?`template file: ${e.templateFile}`:`no template source`}async function j(e,t,n,r={}){let{enableHandlebars:i=!0,sourceUrl:a=n?.$sourceUrl}=r,o=O(e),s=k(e);if(o)return c(e.template,t);if(s){let n=e.templateFile,r=i&&ue(n),o=await ee(te(n,a));return r?(await import(`handlebars`)).default.compile(o)(t):c(o,t)}throw Error(`No template content available`)}async function fe(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;if(t.template==null||t.template===``)return`${b.red}✗ No template content provided for file: ${t.file}${b.reset}`;let r=t.file,i=c(t.template,n);if(!C(r)){let e=i.split(`
7
- `).slice(0,10).join(`
8
- `),n=i.split(`
9
- `).length>10;return`${b.blue}File: ${t.file}${b.reset}\n${b.green}+ New file would be created${b.reset}\n${b.gray}Content preview:${b.reset}\n${e}${n?`
10
- ...`:``}`}try{let e=await w(r);if(e===i)return`${b.cyan}→ No changes${b.reset}`;let n=S(e,i);return`${b.blue}File: ${t.file}${b.reset}\n${n.join(`
11
- `)}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}async function pe(t,n,r){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let i=t.file;if(C(i))return`${b.cyan}→ File already exists, would be skipped: ${t.file}${b.reset}`;try{if(O(t)){let e=await j(t,n,r),i=e.split(`
12
- `).slice(0,10).join(`
13
- `),a=e.split(`
14
- `).length>10;return`${b.blue}File: ${t.file}${b.reset}\n${b.green}+ New file would be created${b.reset}\n${b.gray}Content preview:${b.reset}\n${i}${a?`
15
- ...`:``}`}let e=de(t);return`${b.blue}File: ${t.file}${b.reset}\n${b.green}+ New file would be created from ${e}${b.reset}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}async function me(t,n,r){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let i=t.file,a={};t.content==null?t.template!=null&&(a.template=t.template):a.template=t.content,t.templateFile!=null&&(a.templateFile=t.templateFile);try{let e=await j(a,n,r),o=e.split(`
16
- `).slice(0,10).join(`
17
- `),s=e.split(`
18
- `).length>10;return C(i)?`${b.blue}File: ${t.file}${b.reset}\n${b.green}+ Would append content${b.reset}\n${b.gray}Content preview:${b.reset}\n${o}${s?`
19
- ...`:``}`:`${b.blue}File: ${t.file}${b.reset}\n${b.green}+ New file would be created with content${b.reset}\n${b.gray}Content preview:${b.reset}\n${o}${s?`
20
- ...`:``}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}function M(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let r=t.paths.map(e=>c(e,n)).filter(e=>C(e));return r.length===0?`${b.cyan}→ No files/directories to delete${b.reset}`:`${b.red}Would delete:${b.reset}\n${r.map(e=>`${b.red} - ${e}${b.reset}`).join(`
21
- `)}`}function N(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let r=c(t.from,n),i=c(t.to,n);return C(r)?C(i)?`${b.yellow}⚠ Destination already exists: ${i}${b.reset}\n${b.cyan}Would rename: ${r} → ${i}${b.reset}`:`${b.cyan}Would rename: ${r} → ${i}${b.reset}`:`${b.red}✗ Source not found: ${r}${b.reset}`}function he(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let r=c(t.from,n),i=c(t.to,n);return C(r)?C(i)?`${b.yellow}⚠ Destination already exists: ${i}${b.reset}\n${b.cyan}Would move: ${r} → ${i}${b.reset}`:`${b.cyan}Would move: ${r} → ${i}${b.reset}`:`${b.red}✗ Source not found: ${r}${b.reset}`}function ge(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let r=c(t.from,n),i=c(t.to,n);if(!C(r))return`${b.red}✗ Source not found: ${r}${b.reset}`;let a=`file`;return C(i)?`${b.yellow}⚠ Destination already exists: ${i}${b.reset}\n${b.cyan}Would copy ${a}: ${r} → ${i}${b.reset}`:`${b.cyan}Would copy ${a}: ${r} → ${i}${b.reset}`}function _e(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let r=c(t.path,n);return C(r)?`${b.cyan}→ Directory already exists: ${r}${b.reset}`:`${b.green}+ Would create directory: ${r}${b.reset}`}const ve=/^[\w+,./:=@-]+$/u;function ye(e){return ve.test(e)?e:_.platform===`win32`?`"${e.replace(/(?<slashes>\\*)"/gu,`$<slashes>$<slashes>\\"`).replace(/(?<slashes>\\+)$/u,`$<slashes>$<slashes>`)}"`:`'${e.replace(/'/gu,String.raw`'\''`)}'`}function P(e,t){let n=(t??[]).filter(e=>e!==``).map(ye);return n.length>0?`${e} ${n.join(` `)}`:e}function F(e){if(e.condition!=null&&e.condition!==``)return`${b.yellow}⊘ Condition check skipped in dry-run${b.reset}`;let t=C(`.git`),n=[];if(e.removeExisting&&t&&n.push(`${b.red}Would remove existing .git directory${b.reset}`),n.push(`${b.green}Would initialize git repository${b.reset}`),e.initialCommit){let t=e.message??`Initial commit`;n.push(`${b.green}Would create initial commit: "${t}"${b.reset}`)}return n.join(`
22
- `)}function I(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let r=P(c(t.command,n),t.args?.map(e=>c(e,n))),i=t.cwd==null?_.cwd():c(t.cwd,n);return`${b.yellow}Would execute:${b.reset}\n${b.cyan} Command: ${r}${b.reset}\n${b.cyan} Working directory: ${i}${b.reset}`}async function L(e,t){try{switch(e.type){case`update-json`:return await T(e.config,t);case`write`:return await fe(e.config,t);case`create`:return await pe(e.config,t,e);case`regex-replace`:return await E(e.config,t);case`replace-in-file`:return await D(e.config,t);case`delete`:return M(e.config,t);case`rename`:return N(e.config,t);case`move`:return he(e.config,t);case`copy`:return ge(e.config,t);case`append`:return await me(e.config,t,e);case`mkdir`:return _e(e.config,t);case`git-init`:return F(e.config);case`exec`:return I(e.config,t);case`exec-file`:return I(e.config,t);default:{let t=e.type;return`${b.yellow}⚠ Diff not available for task type: ${t}${b.reset}`}}}catch(e){return`${b.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${b.reset}`}}async function be(e,t){console.log(`${b.blue}═══════════════════════════════════════════════════════${b.reset}`),console.log(`${b.blue} DRY RUN - Preview of changes${b.reset}`),console.log(`${b.blue}═══════════════════════════════════════════════════════${b.reset}`);for(let n of e){console.log(`${b.cyan}▶ Task: ${n.name}${b.reset}`),n.description!=null&&n.description!==``&&console.log(`${b.gray} ${n.description}${b.reset}`);let e=await L(n,t);console.log(e),console.log(`${b.gray}${`─`.repeat(55)}${b.reset}`)}console.log(`${b.blue}═══════════════════════════════════════════════════════${b.reset}`),console.log(`${b.yellow} No changes were applied (dry-run mode)${b.reset}`),console.log(`${b.blue}═══════════════════════════════════════════════════════${b.reset}`)}const R=new Map,z={},B=new Map;function xe(e){e.beforeAll!=null&&(z.beforeAll=e.beforeAll),e.afterAll!=null&&(z.afterAll=e.afterAll),e.beforeTask!=null&&(z.beforeTask=e.beforeTask),e.afterTask!=null&&(z.afterTask=e.afterTask),e.onError!=null&&(z.onError=e.onError)}async function V(e,...t){let n=z[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){u(`Error in ${e} hook: ${t instanceof Error?t.message:String(t)}`,`error`)}}function H(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(R.has(e.name))throw TypeError(`Plugin ${e.name} is already registered`);for(let t of e.taskTypes)if(B.has(t)){let e=B.get(t);throw TypeError(`Task type "${t}" is already registered by plugin "${e}"`)}R.set(e.name,e);for(let t of e.taskTypes)B.set(t,e.name);a(`Registered plugin: ${e.name}${e.version==null?``:` v${e.version}`}`)}function Se(e){let t=R.get(e);if(t!=null){for(let e of t.taskTypes)B.delete(e);R.delete(e)}}function Ce(e){return R.get(e)}function we(){return Array.from(R.keys())}function Te(){R.clear(),B.clear()}function U(e){let t=B.get(e);if(t!=null)return R.get(t)}function W(e){return B.has(e)}async function G(e,t,n){let r=U(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}function Ee(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}}}const De=new Set([`true`,`1`,`yes`,`y`]),Oe=new Set([`false`,`0`,`no`,`n`]);let K=new Map;function ke(e){K=new Map(Object.entries(e))}function Ae(e){return K.get(e)}function je(e){let t=e.indexOf(`=`);if(t<=0)throw Error(`Invalid --set value "${e}". Expected format: key=value`);return[e.slice(0,t).trim(),e.slice(t+1)]}function Me(e,t){switch(e.type){case`confirm`:{let n=t.trim().toLowerCase();if(De.has(n))return!0;if(Oe.has(n))return!1;throw r.invalidValue(e.id,t,`expected true or false`)}case`number`:{let n=Number(t);if(t.trim()===``||Number.isNaN(n))throw r.invalidValue(e.id,t,`expected a number`);return n}case`select`:{let n=e.choices.find(e=>String(e.value)===t);if(n==null)throw r.invalidValue(e.id,t,`expected one of ${e.choices.map(e=>String(e.value)).join(`, `)}`);return n.value}case`checkbox`:return t.split(`,`).map(e=>e.trim()).filter(e=>e!==``).map(t=>{let n=e.choices.find(e=>String(e.value)===t);if(n==null)throw r.invalidValue(e.id,t,`expected one of ${e.choices.map(e=>String(e.value)).join(`, `)}`);return n.value});case`input`:case`password`:return t;default:throw r.unknownType(e.type)}}async function q(e,t,n,r){if(e!==void 0)return l(e,{id:t,contextType:`Prompt`,...n!=null&&{context:n},...r?.$sourceUrl!=null&&{sourceUrl:r.$sourceUrl}})}async function Ne(e,n=new Map,i={}){let a={};if(e.length===0)return a;for(let o of e){if(o.$configEnabled!=null&&!await t(o.$configEnabled,{...i,...a}))continue;let e={...i,...a};if(!await t(o.enabled,e)){a[o.id]=void 0;continue}let s=Ae(o.id);if(s!==void 0){let t=Me(o,s);if(typeof t==`string`&&t.trim()===``&&await p(o.required,e)===!0)throw r.required(o.id);o.transformers!==void 0&&(t=await f.apply(o.transformers,t,e)),u(`${o.message}: ${String(t)} (preset)`,`info`),a[o.id]=t;continue}try{let t,i=n.get(o.id);switch(o.default!==void 0&&(i=await q(o.default,o.id,e,o)),i!==void 0&&o.transformers!==void 0&&(i=await f.apply(o.transformers,i,e)),o.type){case`input`:{let n={message:o.message};i!==void 0&&(n.default=String(i));let a=await p(o.required,e);if(a!==void 0&&(n.required=a),t=await ae(n),a&&(t==null||typeof t==`string`&&t.trim()===``))throw u(`${o.message} is required`,`error`),r.required(o.id);break}case`password`:if(t=await se({message:o.message,mask:`*`}),await p(o.required,e)&&(t==null||typeof t==`string`&&t.trim()===``))throw u(`${o.message} is required`,`error`),r.required(o.id);break;case`number`:{let n={message:o.message};i!==void 0&&(n.default=Number(i));let a=await p(o.required,e);if(a!==void 0&&(n.required=a),o.min!==void 0&&(n.min=o.min),o.max!==void 0&&(n.max=o.max),t=await oe(n),a&&t==null)throw u(`${o.message} is required`,`error`),r.required(o.id);break}case`select`:{let e={message:o.message,choices:o.choices.map(e=>({name:e.name,value:e.value}))};i!==void 0&&(e.default=i),t=await ce(e);break}case`checkbox`:{let n={message:o.message,choices:o.choices.map(e=>({name:e.name,value:e.value}))};i!==void 0&&(n.default=i);let r=await p(o.required,e);r!==void 0&&(n.required=r),t=await re(n);break}case`confirm`:{let e=i===void 0?!1:!!i;t=await ie({message:o.message,default:e});break}default:throw u(`Unknown prompt type: ${o.type}`,`error`),r.unknownType(o.type)}o.transformers!==void 0&&(i!==void 0&&(t===i||String(t)===String(i))||(t=await f.apply(o.transformers,t,{...e,...a}))),a[o.id]=t}catch(e){throw e instanceof Error&&u(`Failed to collect prompt "${o.id}": ${e.message}`,`error`),e}}return a}async function Pe(e,t){let n=new Map,r=e.map(async e=>{if(e.default!==void 0){let r=await q(e.default,e.id,t,e);r!==void 0&&n.set(e.id,r)}});return await Promise.all(r),n}function Fe(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.type===`checkbox`){r.choices.length===0&&t.push(`${r.type===`select`?`Select`:`Checkbox`} prompt "${r.id}" must have at least one choice`);for(let e of r.choices)(!e.name||e.name.trim()===``)&&t.push(`${r.type===`select`?`Select`:`Checkbox`} prompt "${r.id}" has a choice with empty name`),e.value===void 0&&t.push(`${r.type===`select`?`Select`:`Checkbox`} 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 J=v(g.appendFile),Ie=v(g.readFile),Le=v(g.stat);async function Re(t,r,i){if(t.condition!=null&&t.condition!==``&&!e(t.condition,r)){u(`Condition not met, skipping append task`,`info`);return}let a=h.join(_.cwd(),c(t.file,r)),o={};t.content==null?t.template!=null&&(o.template=t.template):o.template=t.content,t.templateFile!=null&&(o.templateFile=t.templateFile);let s=A(o);if(!s.isValid)throw s.error?.includes(`cannot have both`)?n.templateHasBothTemplateAndFile():n.templateMissingTemplateOrFile();let l=await j(o,r,i),d=!1,f=!1;try{await Le(a),d=!0;let e=await Ie(a,`utf-8`);e.length>0&&!e.endsWith(`
23
- `)&&(f=t.newline!==!1)}catch{}d&&f?await J(a,`\n${l}`):await J(a,l),u(`Appended content to ${t.file}`,`success`)}const ze={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await Re(e.config,t,e)}},Y=v(g.copyFile),Be=v(g.stat),X=v(g.mkdir),Ve=v(g.readdir);async function Z(e,t){await X(t,{recursive:!0});let n=await Ve(e,{withFileTypes:!0});await Promise.all(n.map(async n=>{let r=h.join(e,n.name),i=h.join(t,n.name);n.isDirectory()?await Z(r,i):await Y(r,i)}))}async function He(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n)){u(`Condition not met, skipping copy task`,`info`);return}let r=h.join(_.cwd(),c(t.from,n)),i=h.join(_.cwd(),c(t.to,n)),a;try{a=await Be(r)}catch{u(`Source path does not exist: ${r}`,`warn`);return}await X(h.dirname(i),{recursive:!0}),a.isDirectory()?(await Z(r,i),u(`Copied directory ${t.from} to ${t.to}`,`success`)):(await Y(r,i),u(`Copied file ${t.from} to ${t.to}`,`success`))}const Ue={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await He(e.config,t)}},We=v(g.writeFile);async function Ge(t,r,i){if(t.condition!=null&&t.condition!==``&&!e(t.condition,r)){u(`Condition not met, skipping create task`,`info`);return}let a=c(t.file,r),o=h.join(_.cwd(),a);if(g.existsSync(o)){u(`File already exists, skipping: ${a}`,`info`);return}let s=A(t);if(!s.isValid)throw s.error?.includes(`cannot have both`)?n.createHasBothTemplateAndFile():n.createMissingTemplateOrFile();let l=await j(t,r,i),d=h.dirname(o);g.existsSync(d)||g.mkdirSync(d,{recursive:!0}),await We(o,l),u(`Created file: ${a}`,`success`)}const Ke={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await Ge(e.config,t,e)}};async function qe(t,n){let{paths:r,condition:i}=t;if(i!=null&&i!==``){if(!n){u(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!e(i,n)){u(`Condition not met, skipping deletion`,`info`);return}}for(let e of r){let t=n==null?e:c(e,n),r=h.join(_.cwd(),t);g.existsSync(r)&&g.rmSync(r,{recursive:!0,force:!0})}}const Je={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await qe(e.config,t)}};async function Ye(t,n,r){t.condition!=null&&t.condition!==``&&!e(t.condition,n)||await d({file:t.file,...t.runtime&&{runtime:t.runtime},...t.args&&{args:t.args},...t.parameters&&{parameters:t.parameters},...t.cwd!=null&&t.cwd.trim()!==``&&{cwd:t.cwd},...r?.$sourceUrl!=null&&r.$sourceUrl.trim()!==``&&{sourceUrl:r.$sourceUrl},captureOutput:!1},n)}const Xe={name:`exec-file`,version:`1.0.0`,taskTypes:[`exec-file`],execute:async(e,t,n)=>{n.dryRun||await Ye(e.config,t,e)}};async function Ze(t,n){if(t.condition!=null&&t.condition!==``){if(!n){u(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!e(t.condition,n)){u(`Condition not met, skipping exec task`,`info`);return}}let r=e=>n==null?e:c(e,n),i=P(r(t.command),t.args?.map(r)),o=t.cwd==null?_.cwd():h.join(_.cwd(),r(t.cwd));a(`Executing: ${i}`),y(i,{cwd:o,stdio:`inherit`})}const Qe={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await Ze(e.config,t)}};async function $e(t,n){if(t.condition!=null&&t.condition!==``){if(!n){u(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!e(t.condition,n)){u(`Condition not met, skipping git-init task`,`info`);return}}if(t.removeExisting){let e=h.join(_.cwd(),`.git`);g.existsSync(e)&&g.rmSync(e,{recursive:!0,force:!0})}if(y(`git init`,{stdio:`inherit`}),t.initialCommit){let e=t.message??`Initial commit`;y(`git add .`,{stdio:`inherit`}),y(`git commit -m "${e}"`,{stdio:`inherit`})}}const et={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await $e(e.config,t)}},tt=v(g.mkdir);async function nt(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n)){u(`Condition not met, skipping mkdir task`,`info`);return}await tt(h.join(_.cwd(),c(t.path,n)),{recursive:!0}),u(`Created directory: ${t.path}`,`success`)}const rt={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await nt(e.config,t)}},it=v(g.rename),at=v(g.stat),ot=v(g.mkdir);async function st(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n)){u(`Condition not met, skipping move task`,`info`);return}let r=h.join(_.cwd(),c(t.from,n)),i=h.join(_.cwd(),c(t.to,n));try{await at(r)}catch{u(`Source path does not exist: ${r}`,`warn`);return}await ot(h.dirname(i),{recursive:!0}),await it(r,i),u(`Moved ${t.from} to ${t.to}`,`success`)}const ct={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await st(e.config,t)}},lt=v(g.readFile),ut=v(g.writeFile);async function dt(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n)){u(`Condition not met, skipping regex-replace task`,`info`);return}let r=h.join(_.cwd(),c(t.file,n)),{pattern:i}=t,a=t.flags??``,o=t.replacement||``,s=await lt(r,`utf-8`),l=new RegExp(i,a);s=s.replace(l,c(o,n)),await ut(r,s)}const ft={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await dt(e.config,t)}},pt=v(g.rename);async function mt(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n)){u(`Condition not met, skipping rename task`,`info`);return}let r=h.join(_.cwd(),c(t.from,n)),i=h.join(_.cwd(),c(t.to,n));if(!g.existsSync(r)){u(`Source path does not exist: ${r}`,`warn`);return}await pt(r,i)}const ht={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await mt(e.config,t)}},gt=v(g.readFile),_t=v(g.writeFile);async function vt(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n)){u(`Condition not met, skipping replace-in-file task`,`info`);return}let r=h.join(_.cwd(),c(t.file,n)),{replacements:i}=t;if(!g.existsSync(r)){u(`File not found: ${r}, skipping`,`warn`);return}let a=await gt(r,`utf-8`);for(let{find:e,replace:t}of i){let r=c(t,n);a=a.replace(new RegExp(e,`gu`),r)}await _t(r,a)}const yt={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await vt(e.config,t)}},bt=v(g.readFile),xt=v(g.writeFile);async function St(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n)){u(`Condition not met, skipping update-json task`,`info`);return}let r=h.join(_.cwd(),c(t.file,n)),{updates:i}=t,a=ne(await bt(r,`utf-8`));function o(e){if(typeof e==`string`)return c(e,n);if(Array.isArray(e))return e.map(e=>o(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=o(r);return t}return e}for(let[e,t]of Object.entries(i)){let n=o(t);e.includes(`.`)?m(a,e,n):a[e]=n}await xt(r,`${JSON.stringify(a,null,2)}\n`)}const Ct={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await St(e.config,t)}},wt=v(g.writeFile);async function Tt(t,r,i){let{allowCreate:a=!0}=t;if(t.condition!=null&&t.condition!==``&&!e(t.condition,r)){u(`Condition not met, skipping write task`,`info`);return}let o=c(t.file,r),s=h.join(_.cwd(),o);if(!g.existsSync(s)){if(a===!1)throw Error(`Write task failed: file does not exist (${o})`);u(`File not found, creating new file: ${o}`,`info`)}let l=A(t);if(!l.isValid)throw l.error?.includes(`cannot have both`)?n.templateHasBothTemplateAndFile():n.templateMissingTemplateOrFile();let d=await j(t,r,i),f=h.dirname(s);g.existsSync(f)||g.mkdirSync(f,{recursive:!0}),await wt(s,d)}const Et={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await Tt(e.config,t,e)}};function Q(){W(`update-json`)||(H(Ct),H(Et),H(Ke),H(ft),H(yt),H(Je),H(ht),H(et),H(Qe),H(Xe),H(ct),H(Ue),H(ze),H(rt))}async function Dt(e,t,n=!1){if(Q(),n){u(`[DRY RUN] Would execute: ${e.name}`,`info`);return}if(W(e.type)){await G(e,t,{dryRun:n});return}throw TypeError(`Unknown task type: ${e.type}`)}async function $(e,t,n,r,i=!1){try{return u(`[${n}/${r}] Running: ${e.name}...`,`info`),await Dt(e,t,i),u(`[${n}/${r}] Completed: ${e.name}...`,`success`),!0}catch(t){return u(`Failed: ${e.name}`,`error`),t instanceof Error&&(u(` Reason: ${t.message}`,`error`),t.stack!=null&&_.env.DEBUG!=null&&console.error(t.stack)),!1}}async function Ot(e,t,n){await V(`beforeAll`,t);let r=0,i=0,a=[];for(let s=0;s<e.length;s++){let c=e[s];c!=null&&(await V(`beforeTask`,c,t),await $(c,t,s+1,e.length,n.dryRun)?(r++,await V(`afterTask`,c,t)):(await p(c.required,t)&&(i++,a.push(c.name)),await V(`onError`,Error(`Task ${c.name} failed`),c),o(`⚠️ Task "${c.name}" failed, continuing with remaining tasks...`)))}await V(`afterAll`,t),i>0&&(u(`\n❌ Task execution completed with ${i} error(s)`,`error`),u(`Completed: ${r}/${e.length} tasks`,`info`),u(`Failed tasks: ${a.join(`, `)}`,`error`),_.exit(1)),u(`Completed: ${r}/${e.length} tasks`,`success`)}function kt(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 s.forTaskDependency(e);r.add(e);let c=a.get(e);if(!c)throw i.forId(e);if(c.dependencies)for(let e of c.dependencies)o(e);r.delete(e),n.add(e),t.push(c)}for(let t of e)n.has(t.id)||o(t.id);return t}function At(e){let t=[],n=e.config,r=typeof n.template==`string`?n.template:void 0,i=typeof n.templateFile==`string`?n.templateFile:void 0,a=A({...r!==void 0&&{template:r},...i!==void 0&&{templateFile:i}});return!a.isValid&&a.error!=null&&a.error!==``&&t.push(`Task "${e.id}" (${e.name}): ${a.error}`),(n.file==null||n.file===``)&&t.push(`Task "${e.id}" (${e.name}): Write task requires "file" property to specify the output file path`),t}async function jt(e,n){let r=Nt(e);r.length>0&&(console.error(`❌ Task validation errors:`),r.forEach(e=>console.error(` - ${e}`)),_.exit(1));let i=[];for(let r of e)await t(r.enabled,n)&&i.push(r);return i}function Mt(e){return kt(e)}function Nt(e){let t=[];for(let n of e)if(!W(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=At(n);t.push(...e)}return t}export{E as A,xe as C,F as D,I as E,T as M,M as O,V as S,L as T,Te as _,Ot as a,H as b,Fe as c,je as d,ke as f,W as g,U as h,kt as i,D as j,N as k,Pe as l,G as m,Mt as n,Q as o,Ee as p,jt as r,$ as s,Nt as t,Ne as u,Ce as v,be as w,Se as x,we as y};