@pixpilot/scaffoldfy 0.53.0 → 0.54.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.cjs +1 -1
- package/dist/cli.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +7 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +1 -1
- package/dist/{run-configuration-sequentially-Vn1WHSpe.js → run-configuration-sequentially-CVEMRSR6.js} +1 -1
- package/dist/{run-configuration-sequentially-CY4nltk2.cjs → run-configuration-sequentially-ChcX4RwO.cjs} +1 -1
- package/dist/{src-CRaJNXop.cjs → src-CbecHt0y.cjs} +1 -1
- package/dist/{src-Ca0M6WB_.js → src-Dg7KHmtw.js} +1 -1
- package/dist/tasks-Bl4_CA4o.cjs +23 -0
- package/dist/tasks-DnOWByrf.js +23 -0
- package/package.json +4 -4
- package/schema/scaffoldfy.schema.json +7 -2
- package/dist/tasks-DXiKtquA.cjs +0 -23
- package/dist/tasks-DmJ1l2eo.js +0 -23
package/dist/cli.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
const e=require(`./configurations-DtzF7Hpe.cjs`);require(`./initial-config-CESipc-c.cjs`),require(`./tasks-
|
|
2
|
+
const e=require(`./configurations-DtzF7Hpe.cjs`);require(`./initial-config-CESipc-c.cjs`),require(`./tasks-Bl4_CA4o.cjs`);const t=require(`./validate-scaffoldfy-json-CDZ4RApr.cjs`);require(`./scaffoldfy-config-validator-BvNnGMO1.cjs`);const n=require(`./src-CbecHt0y.cjs`);let r=require(`node:fs`);r=e.z(r);let i=require(`node:path`);i=e.z(i);let a=require(`node:process`);a=e.z(a);let o=require(`commander`);o=e.z(o);const s=1,c=new o.Command,l=i.default.join(__dirname,`..`,`package.json`);let u=`0.0.0`;try{u=JSON.parse(r.default.readFileSync(l,`utf-8`)).version??`0.0.0`}catch{}c.name(`scaffoldfy`).description(`Automate project setup and configuration with customizable tasks`).version(u),c.option(`--dry-run`,`Run in dry mode without making any changes`).option(`--force`,`Force execution even if checks fail`).option(`--config <path>`,`Path or URL to task configuration file (JSON, JSONC, or TypeScript)`,`./scaffoldfy.json`).option(`--no-validate`,`Skip schema validation of task configuration (validation is enabled by default)`).option(`--debug`,`Enable debug logging for verbose output`).action(async o=>{o.debug===!0&&e.M(!0);try{let s=[],c,l,u,d,f;if(o.config!=null&&o.config!==``){let n=e.C(o.config),p=n?o.config:i.default.resolve(a.default.cwd(),o.config);if(n||r.default.existsSync(p))if(f=p,p.endsWith(`.ts`)||p.endsWith(`.mts`)){n&&(e.j(`❌ Remote TypeScript config files are not supported`,`error`),e.j(`Only JSON config files can be loaded from a URL`,`info`),a.default.exit(1)),e.j(`Loading tasks from TypeScript file: ${o.config}`,`info`);try{let t=await import(p);s=t.default??t.tasks??[],(!Array.isArray(s)||s.length===0)&&(e.j(`⚠️ No tasks found in TypeScript file or invalid format`,`warn`),e.j(`Expected default export or named export "tasks" with TaskDefinition[]`,`info`))}catch(t){e.j(`Failed to load TypeScript config file: ${o.config}`,`error`),t instanceof Error&&e.j(` Error: ${t.message}`,`error`),a.default.exit(1)}}else try{o.validate!==!1&&(e.O(`Validating task configuration against schema...`),t.r(e.y(await e.u(p)),{silent:!1}).valid||(e.j(``,`error`),e.j(`💡 You can skip validation with --no-validate flag, but this is not recommended.`,`info`),a.default.exit(1)),e.j(`Configuration validated`,`success`));let n=e.g(`Loading config`),r;try{r=await e.n(p,{sequential:!0})}finally{e._(n)}if(r.configs!=null&&r.configs.length>0){let{runConfigurationSequentially:e}=await Promise.resolve().then(()=>require(`./run-configuration-sequentially-ChcX4RwO.cjs`)),{createInitialConfig:t}=await Promise.resolve().then(()=>require(`./initial-config-CbzFPdT_.cjs`));await e(r.configs,{dryRun:o.dryRun??!1,force:o.force??!1,configFilePath:p},t()),a.default.exit(0)}s=r.tasks,c=r.variables,l=r.prompts,u=r.enabled,d=r.transformers,Array.isArray(s)||(e.j(`❌ Invalid config file format`,`error`),e.j(`Expected JSON with { "tasks": [...] } structure`,`info`),a.default.exit(1))}catch(t){e.j(`Failed to load JSON config file: ${o.config}`,`error`),t instanceof Error&&e.j(` Error: ${t.message}`,`error`),a.default.exit(1)}else e.j(`Config file not found: ${o.config}`,`warn`)}let p=l!=null&&l.length>0||c!=null&&c.length>0;s.length===0&&!p&&(e.j(`❌ No tasks defined`,`error`),e.j(`Please provide tasks using one of these methods:`,`info`),e.j(` 1. Create a template-tasks.json file in the current directory`,`info`),e.j(` 2. Create a template-tasks.ts file in the current directory`,`info`),e.j(` 3. Use --config option to specify a different config file`,`info`),e.j(`Example JSON structure:`,`info`),console.log(JSON.stringify({tasks:[{id:`update-package`,name:`Update package.json`,description:`Update package.json with repository information`,required:!0,enabled:!0,type:`update-json`,prompts:[{id:`projectName`,type:`input`,message:`What is your project name?`,default:`my-project`,required:!0},{id:`includeTests`,type:`confirm`,message:`Include test files?`,default:!0}],config:{file:`package.json`,updates:{name:`{{projectName}}`,author:`{{author}}`}}}]},null,2)),a.default.exit(1)),s.length===0?e.j(`Loaded template with 0 tasks (template may only provide prompts/variables for extending)`,`info`):e.j(`Loaded ${s.length} task(s)`,`success`),await n.t(s,{dryRun:o.dryRun,force:o.force,configFilePath:f,variables:c,prompts:l,configEnabled:u,transformers:d})}catch(t){if(e.j(`❌ CLI execution failed`,`error`),t instanceof Error){e.j(`Error: ${t.message}`,`error`);let n=a.default.env.DEBUG;n!=null&&n!==``&&console.error(t.stack)}else console.error(t);a.default.exit(1)}}),c.parse(a.default.argv);
|
package/dist/cli.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{C as e,M as t,O as n,_ as r,g as i,j as a,n as o,u as s,y as c}from"./configurations-Bx3IQ0vv.js";import"./initial-config-Dt0jw4Vs.js";import"./tasks-
|
|
2
|
+
import{C as e,M as t,O as n,_ as r,g as i,j as a,n as o,u as s,y as c}from"./configurations-Bx3IQ0vv.js";import"./initial-config-Dt0jw4Vs.js";import"./tasks-DnOWByrf.js";import{r as l}from"./validate-scaffoldfy-json-sisq-2h1.js";import"./scaffoldfy-config-validator-D1iJBnRE.js";import{t as u}from"./src-Dg7KHmtw.js";import d from"node:path";import{fileURLToPath as f}from"node:url";import p from"node:fs";import m from"node:process";import{Command as h}from"commander";const g=()=>f(import.meta.url),_=(()=>d.dirname(g()))(),v=new h,y=d.join(_,`..`,`package.json`);let b=`0.0.0`;try{b=JSON.parse(p.readFileSync(y,`utf-8`)).version??`0.0.0`}catch{}v.name(`scaffoldfy`).description(`Automate project setup and configuration with customizable tasks`).version(b),v.option(`--dry-run`,`Run in dry mode without making any changes`).option(`--force`,`Force execution even if checks fail`).option(`--config <path>`,`Path or URL to task configuration file (JSON, JSONC, or TypeScript)`,`./scaffoldfy.json`).option(`--no-validate`,`Skip schema validation of task configuration (validation is enabled by default)`).option(`--debug`,`Enable debug logging for verbose output`).action(async f=>{f.debug===!0&&t(!0);try{let t=[],h,g,_,v,y;if(f.config!=null&&f.config!==``){let u=e(f.config),b=u?f.config:d.resolve(m.cwd(),f.config);if(u||p.existsSync(b))if(y=b,b.endsWith(`.ts`)||b.endsWith(`.mts`)){u&&(a(`❌ Remote TypeScript config files are not supported`,`error`),a(`Only JSON config files can be loaded from a URL`,`info`),m.exit(1)),a(`Loading tasks from TypeScript file: ${f.config}`,`info`);try{let e=await import(b);t=e.default??e.tasks??[],(!Array.isArray(t)||t.length===0)&&(a(`⚠️ No tasks found in TypeScript file or invalid format`,`warn`),a(`Expected default export or named export "tasks" with TaskDefinition[]`,`info`))}catch(e){a(`Failed to load TypeScript config file: ${f.config}`,`error`),e instanceof Error&&a(` Error: ${e.message}`,`error`),m.exit(1)}}else try{f.validate!==!1&&(n(`Validating task configuration against schema...`),l(c(await s(b)),{silent:!1}).valid||(a(``,`error`),a(`💡 You can skip validation with --no-validate flag, but this is not recommended.`,`info`),m.exit(1)),a(`Configuration validated`,`success`));let e=i(`Loading config`),u;try{u=await o(b,{sequential:!0})}finally{r(e)}if(u.configs!=null&&u.configs.length>0){let{runConfigurationSequentially:e}=await import(`./run-configuration-sequentially-CVEMRSR6.js`),{createInitialConfig:t}=await import(`./initial-config-V9mm6hls.js`);await e(u.configs,{dryRun:f.dryRun??!1,force:f.force??!1,configFilePath:b},t()),m.exit(0)}t=u.tasks,h=u.variables,g=u.prompts,_=u.enabled,v=u.transformers,Array.isArray(t)||(a(`❌ Invalid config file format`,`error`),a(`Expected JSON with { "tasks": [...] } structure`,`info`),m.exit(1))}catch(e){a(`Failed to load JSON config file: ${f.config}`,`error`),e instanceof Error&&a(` Error: ${e.message}`,`error`),m.exit(1)}else a(`Config file not found: ${f.config}`,`warn`)}let b=g!=null&&g.length>0||h!=null&&h.length>0;t.length===0&&!b&&(a(`❌ No tasks defined`,`error`),a(`Please provide tasks using one of these methods:`,`info`),a(` 1. Create a template-tasks.json file in the current directory`,`info`),a(` 2. Create a template-tasks.ts file in the current directory`,`info`),a(` 3. Use --config option to specify a different config file`,`info`),a(`Example JSON structure:`,`info`),console.log(JSON.stringify({tasks:[{id:`update-package`,name:`Update package.json`,description:`Update package.json with repository information`,required:!0,enabled:!0,type:`update-json`,prompts:[{id:`projectName`,type:`input`,message:`What is your project name?`,default:`my-project`,required:!0},{id:`includeTests`,type:`confirm`,message:`Include test files?`,default:!0}],config:{file:`package.json`,updates:{name:`{{projectName}}`,author:`{{author}}`}}}]},null,2)),m.exit(1)),t.length===0?a(`Loaded template with 0 tasks (template may only provide prompts/variables for extending)`,`info`):a(`Loaded ${t.length} task(s)`,`success`),await u(t,{dryRun:f.dryRun,force:f.force,configFilePath:y,variables:h,prompts:g,configEnabled:_,transformers:v})}catch(e){if(a(`❌ CLI execution failed`,`error`),e instanceof Error){a(`Error: ${e.message}`,`error`);let t=m.env.DEBUG;t!=null&&t!==``&&console.error(e.stack)}else console.error(e);m.exit(1)}}),v.parse(m.argv);export{};
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const e=require(`./configurations-DtzF7Hpe.cjs`);require(`./initial-config-CESipc-c.cjs`);const t=require(`./tasks-
|
|
1
|
+
const e=require(`./configurations-DtzF7Hpe.cjs`);require(`./initial-config-CESipc-c.cjs`);const t=require(`./tasks-Bl4_CA4o.cjs`),n=require(`./validate-scaffoldfy-json-CDZ4RApr.cjs`);require(`./scaffoldfy-config-validator-BvNnGMO1.cjs`);const r=require(`./src-CbecHt0y.cjs`);exports.clearConfigurationCache=e.l,exports.clearPlugins=t.h,exports.createTaskPlugin=t.d,exports.displayTasksDiff=t.S,exports.executePluginTask=t.f,exports.getDeleteDiff=t.E,exports.getExecDiff=t.w,exports.getGitInitDiff=t.T,exports.getPlugin=t.g,exports.getPluginForTaskType=t.p,exports.getRegexReplaceDiff=t.O,exports.getRenameDiff=t.D,exports.getReplaceInFileDiff=t.k,exports.getTaskDiff=t.C,exports.getUpdateJsonDiff=t.A,exports.isPluginTaskType=t.m,exports.listPlugins=t._,exports.loadAndMergeConfiguration=e.t,exports.loadConfiguration=e.c,exports.loadTasksWithInheritance=e.n,exports.mergeConfigurations=e.r,exports.registerHooks=t.x,exports.registerPlugin=t.v,exports.runWithTasks=r.t,exports.unregisterPlugin=t.y,exports.validateScaffoldfyJsonFile=n.n;
|
package/dist/index.d.cts
CHANGED
|
@@ -100,6 +100,13 @@ interface DeleteConfig {
|
|
|
100
100
|
//#region src/plugins/exec/types.d.ts
|
|
101
101
|
interface ExecConfig {
|
|
102
102
|
command: string;
|
|
103
|
+
/**
|
|
104
|
+
* Arguments appended to the command. Each entry supports {{variable}}
|
|
105
|
+
* interpolation and is quoted for the current shell, so values containing
|
|
106
|
+
* spaces do not need manual quotes. Entries that interpolate to an empty
|
|
107
|
+
* string are dropped, which makes optional flags easy to express.
|
|
108
|
+
*/
|
|
109
|
+
args?: string[];
|
|
103
110
|
cwd?: string;
|
|
104
111
|
condition?: ConditionExpression;
|
|
105
112
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -100,6 +100,13 @@ interface DeleteConfig {
|
|
|
100
100
|
//#region src/plugins/exec/types.d.ts
|
|
101
101
|
interface ExecConfig {
|
|
102
102
|
command: string;
|
|
103
|
+
/**
|
|
104
|
+
* Arguments appended to the command. Each entry supports {{variable}}
|
|
105
|
+
* interpolation and is quoted for the current shell, so values containing
|
|
106
|
+
* spaces do not need manual quotes. Entries that interpolate to an empty
|
|
107
|
+
* string are dropped, which makes optional flags easy to express.
|
|
108
|
+
*/
|
|
109
|
+
args?: string[];
|
|
103
110
|
cwd?: string;
|
|
104
111
|
condition?: ConditionExpression;
|
|
105
112
|
}
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as e,l as t,n,r,t as i}from"./configurations-Bx3IQ0vv.js";import"./initial-config-Dt0jw4Vs.js";import{A as a,C as o,D as s,E as c,O as l,S as u,T as d,_ as f,d as p,f as m,g as h,h as g,k as _,m as v,p as y,v as b,w as x,x as S,y as C}from"./tasks-
|
|
1
|
+
import{c as e,l as t,n,r,t as i}from"./configurations-Bx3IQ0vv.js";import"./initial-config-Dt0jw4Vs.js";import{A as a,C as o,D as s,E as c,O as l,S as u,T as d,_ as f,d as p,f as m,g as h,h as g,k as _,m as v,p as y,v as b,w as x,x as S,y as C}from"./tasks-DnOWByrf.js";import{n as w}from"./validate-scaffoldfy-json-sisq-2h1.js";import"./scaffoldfy-config-validator-D1iJBnRE.js";import{t as T}from"./src-Dg7KHmtw.js";export{t as clearConfigurationCache,g as clearPlugins,p as createTaskPlugin,u as displayTasksDiff,m as executePluginTask,c as getDeleteDiff,x as getExecDiff,d as getGitInitDiff,h as getPlugin,y as getPluginForTaskType,l as getRegexReplaceDiff,s as getRenameDiff,_ as getReplaceInFileDiff,o as getTaskDiff,a as getUpdateJsonDiff,v as isPluginTaskType,f as listPlugins,i as loadAndMergeConfiguration,e as loadConfiguration,n as loadTasksWithInheritance,r as mergeConfigurations,S as registerHooks,b as registerPlugin,T as runWithTasks,C as unregisterPlugin,w as validateScaffoldfyJsonFile};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{A as e,E as t,O as n,a as r,i,j as a,o}from"./configurations-Bx3IQ0vv.js";import{S as s,a as c,c as l,l as u,n as d,o as f,r as p,u as m}from"./tasks-
|
|
1
|
+
import{A as e,E as t,O as n,a as r,i,j as a,o}from"./configurations-Bx3IQ0vv.js";import{S as s,a as c,c as l,l as u,n as d,o as f,r as p,u as m}from"./tasks-DnOWByrf.js";import h from"node:process";async function g(e,t){let n=e.prompts??[];if(n.length>0){let e=l(n);e.length>0&&(console.error(`❌ Prompt validation errors:`),e.forEach(e=>console.error(` - ${e}`)),h.exit(1));let r=await m(n,await u(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...`),f();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
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 l=await p(o,i);if(console.log(``),a(`Found ${o.length} tasks (${l.length} enabled)`,`info`),a(`All tasks validated successfully`,`success`),l.length===0){a(`No enabled tasks to execute`,`info`);return}let u=d(l);if(r.dryRun){a(`
|
|
3
3
|
🔍 Dry run - showing task changes...`,`info`),await s(u,i),a(`
|
|
4
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 c(u,i,r)}export{b as runConfigurationSequentially};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const e=require(`./configurations-DtzF7Hpe.cjs`),t=require(`./tasks-
|
|
1
|
+
const e=require(`./configurations-DtzF7Hpe.cjs`),t=require(`./tasks-Bl4_CA4o.cjs`);let n=require(`node:process`);n=e.z(n);async function r(e,r){let i=e.prompts??[];if(i.length>0){let e=t.c(i);e.length>0&&(console.error(`❌ Prompt validation errors:`),e.forEach(e=>console.error(` - ${e}`)),n.default.exit(1));let a=await t.u(i,await t.l(i,r),r);Object.assign(r,a)}}async function i(t,r){let i=t.variables??[];if(i.length>0){let o=e.i(i);o.length>0&&(console.error(`❌ Variable validation errors:`),o.forEach(e=>console.error(` - ${e}`)),n.default.exit(1));let s=await e.o(i,await e.a(i,r,{skipConditional:!0}),r);Object.assign(r,s),await a(t,r)}}async function a(t,n){let r=t.variables??[];if(r.length===0)return;let i=r.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1);if(i.length>0){let t=await e.o(i,await e.a(i,n),n);Object.assign(n,t)}}async function o(t,n){return await e.E(t.enabled,n)?(await i(t,n),await r(t,n),await a(t,n),await e.E(t.enabled,n)?!0:(e.A(`⊘ Config "${t.name}" became disabled after variable/prompt resolution - skipping tasks`),!1)):(e.A(`⊘ Config "${t.name}" is disabled - skipping`),!1)}async function s(n,r,i={}){e.O(`Running configs with sequential variable/prompt resolution...`),e.O(`Total configs to process: ${n.length}`),e.O(`Registering built-in plugins...`),t.o();let a=[];console.log(``),e.A(`📋 Collecting input...`),console.log(``);for(let t=0;t<n.length;t++){let r=n[t];if(r==null)continue;let s=`=`.repeat(60);if(e.O(`\n${s}`),e.O(`Processing config ${t+1}/${n.length}: "${r.name}"`),e.O(s),e.O(`Current config keys: ${Object.keys(i).join(`, `)}`),await o(r,i)){let t=r.tasks??[];t.length>0&&(e.O(`Found ${t.length} task(s) in config "${r.name}" (will execute later)`),a.push(...t))}}if(e.O(`
|
|
2
2
|
🔧 Validating and filtering all collected tasks...`),a.length===0){e.j(`No tasks found in any config`,`info`);return}console.log(``),e.j(`🛠️ Preparing tasks...`,`info`);let s=await t.r(a,i);if(console.log(``),e.j(`Found ${a.length} tasks (${s.length} enabled)`,`info`),e.j(`All tasks validated successfully`,`success`),s.length===0){e.j(`No enabled tasks to execute`,`info`);return}let c=t.n(s);if(r.dryRun){e.j(`
|
|
3
3
|
🔍 Dry run - showing task changes...`,`info`),await t.S(c,i),e.j(`
|
|
4
4
|
🔍 Dry run completed - no changes were made`,`info`),e.j(`Run without --dry-run to apply changes`,`info`);return}console.log(``),e.A(`⚙️ Executing tasks...`),console.log(``),await t.a(c,i,r)}exports.runConfigurationSequentially=s;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const e=require(`./configurations-DtzF7Hpe.cjs`),t=require(`./initial-config-CESipc-c.cjs`),n=require(`./tasks-
|
|
1
|
+
const e=require(`./configurations-DtzF7Hpe.cjs`),t=require(`./initial-config-CESipc-c.cjs`),n=require(`./tasks-Bl4_CA4o.cjs`),r=require(`./validate-scaffoldfy-json-CDZ4RApr.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.S(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.b(`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.b(`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.b(`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.b(`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.b(`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-Bx3IQ0vv.js";import{t as f}from"./initial-config-Dt0jw4Vs.js";import{S as p,b as m,c as h,i as g,l as _,o as v,s as y,t as b,u as x}from"./tasks-
|
|
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-Bx3IQ0vv.js";import{t as f}from"./initial-config-Dt0jw4Vs.js";import{S as p,b as m,c as h,i as g,l as _,o as v,s as y,t as b,u as x}from"./tasks-DnOWByrf.js";import{t as S}from"./validate-scaffoldfy-json-sisq-2h1.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 p(P,A),e(`🔍 Dry run completed - no changes were made`),e(`Run without --dry-run to apply changes`);return}r(`Calling beforeAll hook...`),await m(`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 m(`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 m(`afterTask`,t,A)):(await d(t.required,A)&&(L++,z.push(t.name)),r(`Calling onError hook for task: ${t.name}`),await m(`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 m(`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,23 @@
|
|
|
1
|
+
const e=require(`./configurations-DtzF7Hpe.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 T(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 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=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 D(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 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}`;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 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);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 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.path,n);return m(r)?`${d.cyan}→ Directory already exists: ${r}${d.reset}`:`${d.green}+ Would create directory: ${r}${d.reset}`}const ae=/^[\w+,./:=@-]+$/u;function O(e){return ae.test(e)?e:r.default.platform===`win32`?`"${e.replace(/(?<slashes>\\*)"/gu,`$<slashes>$<slashes>\\"`).replace(/(?<slashes>\\+)$/u,`$<slashes>$<slashes>`)}"`:`'${e.replace(/'/gu,String.raw`'\''`)}'`}function k(e,t){let n=(t??[]).filter(e=>e!==``).map(O);return n.length>0?`${e} ${n.join(` `)}`:e}function A(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 j(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=k(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 M(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 E(e.config,t);case`rename`:return D(e.config,t);case`move`:return ne(e.config,t);case`copy`:return re(e.config,t);case`append`:return await T(e.config,t,e);case`mkdir`:return ie(e.config,t);case`git-init`:return A(e.config);case`exec`:return j(e.config,t);case`exec-file`:return j(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 oe(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 M(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 N=new Map,P={},F=new Map;function se(e){e.beforeAll!=null&&(P.beforeAll=e.beforeAll),e.afterAll!=null&&(P.afterAll=e.afterAll),e.beforeTask!=null&&(P.beforeTask=e.beforeTask),e.afterTask!=null&&(P.afterTask=e.afterTask),e.onError!=null&&(P.onError=e.onError)}async function I(t,...n){let r=P[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 L(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(N.has(t.name))throw TypeError(`Plugin ${t.name} is already registered`);for(let e of t.taskTypes)if(F.has(e)){let t=F.get(e);throw TypeError(`Task type "${e}" is already registered by plugin "${t}"`)}N.set(t.name,t);for(let e of t.taskTypes)F.set(e,t.name);e.O(`Registered plugin: ${t.name}${t.version==null?``:` v${t.version}`}`)}function ce(e){let t=N.get(e);if(t!=null){for(let e of t.taskTypes)F.delete(e);N.delete(e)}}function le(e){return N.get(e)}function R(){return Array.from(N.keys())}function z(){N.clear(),F.clear()}function B(e){let t=F.get(e);if(t!=null)return N.get(t)}function V(e){return F.has(e)}async function H(e,t,n){let r=B(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}function U(e,t,n,r){return{name:e,...r?.version!=null&&{version:r.version},taskTypes:[t],execute:n,...r?.getDiff!=null&&{getDiff:r.getDiff},...r?.validate!=null&&{validate:r.validate}}}async function 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 ue(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}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 de(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 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 G=(0,i.promisify)(t.default.appendFile),pe=(0,i.promisify)(t.default.readFile),me=(0,i.promisify)(t.default.stat);async function he(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 me(o),u=!0;let e=await pe(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 ge={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await he(e.config,t,e)}},K=(0,i.promisify)(t.default.copyFile),_e=(0,i.promisify)(t.default.stat),q=(0,i.promisify)(t.default.mkdir),ve=(0,i.promisify)(t.default.readdir);async function J(e,t){await q(t,{recursive:!0});let r=await ve(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 ye(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 _e(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 be={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await ye(e.config,t)}},xe=(0,i.promisify)(t.default.writeFile);async function Se(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 xe(c,u),e.j(`Created file: ${s}`,`success`)}const Ce={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await Se(e.config,t,e)}};async function we(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 Te={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await we(e.config,t)}};async function Ee(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 De={name:`exec-file`,version:`1.0.0`,taskTypes:[`exec-file`],execute:async(e,t,n)=>{n.dryRun||await Ee(e.config,t,e)}};async function Oe(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=k(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 ke={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await Oe(e.config,t)}};async function Ae(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 je={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await Ae(e.config,t)}},Me=(0,i.promisify)(t.default.mkdir);async function Ne(t,i){if(t.condition!=null&&t.condition!==``&&!e.D(t.condition,i)){e.j(`Condition not met, skipping mkdir task`,`info`);return}await Me(n.default.join(r.default.cwd(),e.d(t.path,i)),{recursive:!0}),e.j(`Created directory: ${t.path}`,`success`)}const Pe={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await Ne(e.config,t)}},Fe=(0,i.promisify)(t.default.rename),Ie=(0,i.promisify)(t.default.stat),Le=(0,i.promisify)(t.default.mkdir);async function Re(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 Ie(a)}catch{e.j(`Source path does not exist: ${a}`,`warn`);return}await Le(n.default.dirname(o),{recursive:!0}),await Fe(a,o),e.j(`Moved ${t.from} to ${t.to}`,`success`)}const ze={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await Re(e.config,t)}},Be=(0,i.promisify)(t.default.readFile),Ve=(0,i.promisify)(t.default.writeFile);async function He(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 Be(a,`utf-8`),u=new RegExp(o,s);l=l.replace(u,e.d(c,i)),await Ve(a,l)}const Ue={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await He(e.config,t)}},We=(0,i.promisify)(t.default.rename);async function Ge(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 We(o,s)}const Ke={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],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 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 qe(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 Je(o,c)}const Ye={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await Y(e.config,t)}},Xe=(0,i.promisify)(t.default.readFile),Ze=(0,i.promisify)(t.default.writeFile),Qe=2;async function $e(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 Xe(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 Ze(a,`${JSON.stringify(s,null,2)}\n`)}const et={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await $e(e.config,t)}},tt=(0,i.promisify)(t.default.writeFile);async function nt(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 tt(l,d)}const rt={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await nt(e.config,t,e)}};function X(){V(`update-json`)||(L(et),L(rt),L(Ce),L(Ue),L(Ye),L(Te),L(Ke),L(je),L(ke),L(De),L(ze),L(be),L(ge),L(Pe))}async function it(t,n,r=!1){if(X(),r){e.j(`[DRY RUN] Would execute: ${t.name}`,`info`);return}if(V(t.type)){await H(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 it(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 at(t,n,i){await I(`beforeAll`,n);let a=0,o=0,s=[];for(let r=0;r<t.length;r++){let c=t[r];c!=null&&(await I(`beforeTask`,c,n),await Z(c,n,r+1,t.length,i.dryRun)?(a++,await I(`afterTask`,c,n)):(await e.w(c.required,n)&&(o++,s.push(c.name)),await I(`onError`,Error(`Task ${c.name} failed`),c),e.P(`⚠️ Task "${c.name}" failed, continuing with remaining tasks...`)))}await I(`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 ot(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 st(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 ct(e){return Q(e)}function $(e){let t=[];for(let n of e)if(!V(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=ot(n);t.push(...e)}return t}Object.defineProperty(exports,`A`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`C`,{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,`D`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`E`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`O`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return oe}}),Object.defineProperty(exports,`T`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return at}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return fe}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return U}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return H}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return le}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return z}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return Q}}),Object.defineProperty(exports,`k`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return de}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return V}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return ct}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return st}}),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 ue}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`w`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return se}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return ce}});
|
|
@@ -0,0 +1,23 @@
|
|
|
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-Bx3IQ0vv.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}}}async function K(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 De(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}try{let t,i=n.get(o.id);switch(o.default!==void 0&&(i=await K(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 Oe(e,t){let n=new Map,r=e.map(async e=>{if(e.default!==void 0){let r=await K(e.default,e.id,t,e);r!==void 0&&n.set(e.id,r)}});return await Promise.all(r),n}function ke(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 q=v(g.appendFile),Ae=v(g.readFile),je=v(g.stat);async function Me(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 je(a),d=!0;let e=await Ae(a,`utf-8`);e.length>0&&!e.endsWith(`
|
|
23
|
+
`)&&(f=t.newline!==!1)}catch{}d&&f?await q(a,`\n${l}`):await q(a,l),u(`Appended content to ${t.file}`,`success`)}const Ne={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await Me(e.config,t,e)}},J=v(g.copyFile),Pe=v(g.stat),Y=v(g.mkdir),Fe=v(g.readdir);async function X(e,t){await Y(t,{recursive:!0});let n=await Fe(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 X(r,i):await J(r,i)}))}async function Ie(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 Pe(r)}catch{u(`Source path does not exist: ${r}`,`warn`);return}await Y(h.dirname(i),{recursive:!0}),a.isDirectory()?(await X(r,i),u(`Copied directory ${t.from} to ${t.to}`,`success`)):(await J(r,i),u(`Copied file ${t.from} to ${t.to}`,`success`))}const Le={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await Ie(e.config,t)}},Re=v(g.writeFile);async function ze(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 Re(o,l),u(`Created file: ${a}`,`success`)}const Be={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await ze(e.config,t,e)}};async function Ve(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 He={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await Ve(e.config,t)}};async function Ue(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 We={name:`exec-file`,version:`1.0.0`,taskTypes:[`exec-file`],execute:async(e,t,n)=>{n.dryRun||await Ue(e.config,t,e)}};async function Ge(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 Ke={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await Ge(e.config,t)}};async function qe(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 Je={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await qe(e.config,t)}},Ye=v(g.mkdir);async function Xe(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n)){u(`Condition not met, skipping mkdir task`,`info`);return}await Ye(h.join(_.cwd(),c(t.path,n)),{recursive:!0}),u(`Created directory: ${t.path}`,`success`)}const Ze={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await Xe(e.config,t)}},Qe=v(g.rename),$e=v(g.stat),et=v(g.mkdir);async function tt(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 $e(r)}catch{u(`Source path does not exist: ${r}`,`warn`);return}await et(h.dirname(i),{recursive:!0}),await Qe(r,i),u(`Moved ${t.from} to ${t.to}`,`success`)}const nt={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await tt(e.config,t)}},rt=v(g.readFile),it=v(g.writeFile);async function at(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 rt(r,`utf-8`),l=new RegExp(i,a);s=s.replace(l,c(o,n)),await it(r,s)}const ot={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await at(e.config,t)}},st=v(g.rename);async function ct(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 st(r,i)}const lt={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await ct(e.config,t)}},ut=v(g.readFile),dt=v(g.writeFile);async function ft(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 ut(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 dt(r,a)}const pt={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await ft(e.config,t)}},mt=v(g.readFile),ht=v(g.writeFile);async function gt(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 mt(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 ht(r,`${JSON.stringify(a,null,2)}\n`)}const _t={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await gt(e.config,t)}},vt=v(g.writeFile);async function yt(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 vt(s,d)}const bt={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await yt(e.config,t,e)}};function Z(){W(`update-json`)||(H(_t),H(bt),H(Be),H(ot),H(pt),H(He),H(lt),H(Je),H(Ke),H(We),H(nt),H(Le),H(Ne),H(Ze))}async function xt(e,t,n=!1){if(Z(),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 Q(e,t,n,r,i=!1){try{return u(`[${n}/${r}] Running: ${e.name}...`,`info`),await xt(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 St(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 Q(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 $(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 Ct(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 wt(e,n){let r=Et(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 Tt(e){return $(e)}function Et(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=Ct(n);t.push(...e)}return t}export{T as A,L as C,N as D,M as E,E as O,be as S,F as T,we as _,St as a,V as b,ke as c,Ee as d,G as f,Ce as g,Te as h,$ as i,D as k,Oe as l,W as m,Tt as n,Z as o,U as p,wt as r,Q as s,Et as t,De as u,H as v,I as w,xe as x,Se as y};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pixpilot/scaffoldfy",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.54.0",
|
|
5
5
|
"author": "PixPilot <m.doaie@hotmail.com>",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
@@ -50,10 +50,10 @@
|
|
|
50
50
|
"tsdown": "^0.15.10",
|
|
51
51
|
"typescript": "^5.9.3",
|
|
52
52
|
"@internal/eslint-config": "0.3.0",
|
|
53
|
-
"@internal/prettier-config": "0.0.1",
|
|
54
|
-
"@internal/vitest-config": "0.1.0",
|
|
55
53
|
"@internal/tsconfig": "0.1.0",
|
|
56
|
-
"@internal/
|
|
54
|
+
"@internal/prettier-config": "0.0.1",
|
|
55
|
+
"@internal/tsdown-config": "0.1.0",
|
|
56
|
+
"@internal/vitest-config": "0.1.0"
|
|
57
57
|
},
|
|
58
58
|
"prettier": "@internal/prettier-config",
|
|
59
59
|
"scripts": {
|
|
@@ -870,11 +870,16 @@
|
|
|
870
870
|
"properties": {
|
|
871
871
|
"command": {
|
|
872
872
|
"type": "string",
|
|
873
|
-
"description": "Shell command to execute"
|
|
873
|
+
"description": "Shell command to execute. Supports {{variable}} interpolation."
|
|
874
|
+
},
|
|
875
|
+
"args": {
|
|
876
|
+
"type": "array",
|
|
877
|
+
"items": { "type": "string" },
|
|
878
|
+
"description": "Arguments appended to the command. Each argument supports {{variable}} interpolation and is quoted automatically; arguments that interpolate to an empty string are dropped."
|
|
874
879
|
},
|
|
875
880
|
"cwd": {
|
|
876
881
|
"type": "string",
|
|
877
|
-
"description": "Working directory for the command"
|
|
882
|
+
"description": "Working directory for the command. Supports {{variable}} interpolation."
|
|
878
883
|
},
|
|
879
884
|
"condition": { "$ref": "#/$defs/condition" }
|
|
880
885
|
},
|
package/dist/tasks-DXiKtquA.cjs
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
const e=require(`./configurations-DtzF7Hpe.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 T(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 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=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 D(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 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}`;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 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);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 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.path,n);return m(r)?`${d.cyan}→ Directory already exists: ${r}${d.reset}`:`${d.green}+ Would create directory: ${r}${d.reset}`}function O(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 k(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=e.d(t.command,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 A(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 E(e.config,t);case`rename`:return D(e.config,t);case`move`:return ne(e.config,t);case`copy`:return re(e.config,t);case`append`:return await T(e.config,t,e);case`mkdir`:return ie(e.config,t);case`git-init`:return O(e.config);case`exec`:return k(e.config,t);case`exec-file`:return k(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 j(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 A(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 ae(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 oe(e){let t=M.get(e);if(t!=null){for(let e of t.taskTypes)P.delete(e);M.delete(e)}}function se(e){return M.get(e)}function ce(){return Array.from(M.keys())}function le(){M.clear(),P.clear()}function L(e){let t=P.get(e);if(t!=null)return M.get(t)}function R(e){return P.has(e)}async function z(e,t,n){let r=L(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}function B(e,t,n,r){return{name:e,...r?.version!=null&&{version:r.version},taskTypes:[t],execute:n,...r?.getDiff!=null&&{getDiff:r.getDiff},...r?.validate!=null&&{validate:r.validate}}}async function V(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 H(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}try{let r,s=n.get(a.id);switch(a.default!==void 0&&(s=await V(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 U(e,t){let n=new Map,r=e.map(async e=>{if(e.default!==void 0){let r=await V(e.default,e.id,t,e);r!==void 0&&n.set(e.id,r)}});return await Promise.all(r),n}function W(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),ue=(0,i.promisify)(t.default.readFile),de=(0,i.promisify)(t.default.stat);async function fe(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 de(o),u=!0;let e=await ue(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 pe={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await fe(e.config,t,e)}},K=(0,i.promisify)(t.default.copyFile),me=(0,i.promisify)(t.default.stat),q=(0,i.promisify)(t.default.mkdir),he=(0,i.promisify)(t.default.readdir);async function J(e,t){await q(t,{recursive:!0});let r=await he(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 ge(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 me(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 _e={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await ge(e.config,t)}},ve=(0,i.promisify)(t.default.writeFile);async function ye(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 ve(c,u),e.j(`Created file: ${s}`,`success`)}const be={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await ye(e.config,t,e)}};async function xe(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 Se={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await xe(e.config,t)}};async function Ce(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 we={name:`exec-file`,version:`1.0.0`,taskTypes:[`exec-file`],execute:async(e,t,n)=>{n.dryRun||await Ce(e.config,t,e)}};async function Te(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.cwd==null?r.default.cwd():n.default.join(r.default.cwd(),t.cwd);(0,a.execSync)(t.command,{cwd:o,stdio:`inherit`})}const Ee={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await Te(e.config,t)}};async function De(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 Oe={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await De(e.config,t)}},ke=(0,i.promisify)(t.default.mkdir);async function Ae(t,i){if(t.condition!=null&&t.condition!==``&&!e.D(t.condition,i)){e.j(`Condition not met, skipping mkdir task`,`info`);return}await ke(n.default.join(r.default.cwd(),e.d(t.path,i)),{recursive:!0}),e.j(`Created directory: ${t.path}`,`success`)}const je={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await Ae(e.config,t)}},Me=(0,i.promisify)(t.default.rename),Ne=(0,i.promisify)(t.default.stat),Pe=(0,i.promisify)(t.default.mkdir);async function Fe(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 Ne(a)}catch{e.j(`Source path does not exist: ${a}`,`warn`);return}await Pe(n.default.dirname(o),{recursive:!0}),await Me(a,o),e.j(`Moved ${t.from} to ${t.to}`,`success`)}const Ie={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await Fe(e.config,t)}},Le=(0,i.promisify)(t.default.readFile),Re=(0,i.promisify)(t.default.writeFile);async function ze(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 Le(a,`utf-8`),u=new RegExp(o,s);l=l.replace(u,e.d(c,i)),await Re(a,l)}const Be={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await ze(e.config,t)}},Ve=(0,i.promisify)(t.default.rename);async function He(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 Ve(o,s)}const Ue={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await He(e.config,t)}},We=(0,i.promisify)(t.default.readFile),Ge=(0,i.promisify)(t.default.writeFile);async function Ke(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 We(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 Ge(o,c)}const qe={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await Ke(e.config,t)}},Je=(0,i.promisify)(t.default.readFile),Ye=(0,i.promisify)(t.default.writeFile),Xe=2;async function Ze(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 Je(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 Ye(a,`${JSON.stringify(s,null,2)}\n`)}const Qe={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await Ze(e.config,t)}},Y=(0,i.promisify)(t.default.writeFile);async function $e(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 Y(l,d)}const et={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await $e(e.config,t,e)}};function X(){R(`update-json`)||(I(Qe),I(et),I(be),I(Be),I(qe),I(Se),I(Ue),I(Oe),I(Ee),I(we),I(Ie),I(_e),I(pe),I(je))}async function tt(t,n,r=!1){if(X(),r){e.j(`[DRY RUN] Would execute: ${t.name}`,`info`);return}if(R(t.type)){await z(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 tt(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 nt(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 rt(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 it(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 at(e){return Q(e)}function $(e){let t=[];for(let n of e)if(!R(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=rt(n);t.push(...e)}return t}Object.defineProperty(exports,`A`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`C`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`D`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`E`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`O`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`T`,{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return ce}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return nt}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return z}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return se}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return le}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return Q}}),Object.defineProperty(exports,`k`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return U}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return at}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return it}}),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 H}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`w`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return ae}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return oe}});
|
package/dist/tasks-DmJ1l2eo.js
DELETED
|
@@ -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-Bx3IQ0vv.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}`}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=c(t.command,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 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 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 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 ve(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 ye(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 be(e){let t=L.get(e);if(t!=null){for(let e of t.taskTypes)z.delete(e);L.delete(e)}}function xe(e){return L.get(e)}function Se(){return Array.from(L.keys())}function Ce(){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 we(e,t,n,r){return{name:e,...r?.version!=null&&{version:r.version},taskTypes:[t],execute:n,...r?.getDiff!=null&&{getDiff:r.getDiff},...r?.validate!=null&&{validate:r.validate}}}async function G(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 Te(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}try{let t,i=n.get(o.id);switch(o.default!==void 0&&(i=await G(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 Ee(e,t){let n=new Map,r=e.map(async e=>{if(e.default!==void 0){let r=await G(e.default,e.id,t,e);r!==void 0&&n.set(e.id,r)}});return await Promise.all(r),n}function De(e){let t=[],n=new Set;for(let r of e){if(n.has(r.id)&&t.push(`Duplicate prompt ID: ${r.id}`),n.add(r.id),/^[a-zA-Z_$][a-zA-Z0-9_$]*$/u.test(r.id)||t.push(`Invalid prompt ID "${r.id}": must be a valid JavaScript identifier (start with letter, underscore, or $, followed by letters, digits, underscores, or $)`),(!r.message||r.message.trim()===``)&&t.push(`Prompt "${r.id}" must have a non-empty message`),r.type===`select`||r.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 K=v(g.appendFile),Oe=v(g.readFile),ke=v(g.stat);async function Ae(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 ke(a),d=!0;let e=await Oe(a,`utf-8`);e.length>0&&!e.endsWith(`
|
|
23
|
-
`)&&(f=t.newline!==!1)}catch{}d&&f?await K(a,`\n${l}`):await K(a,l),u(`Appended content to ${t.file}`,`success`)}const je={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await Ae(e.config,t,e)}},q=v(g.copyFile),Me=v(g.stat),J=v(g.mkdir),Ne=v(g.readdir);async function Y(e,t){await J(t,{recursive:!0});let n=await Ne(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 Y(r,i):await q(r,i)}))}async function Pe(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 Me(r)}catch{u(`Source path does not exist: ${r}`,`warn`);return}await J(h.dirname(i),{recursive:!0}),a.isDirectory()?(await Y(r,i),u(`Copied directory ${t.from} to ${t.to}`,`success`)):(await q(r,i),u(`Copied file ${t.from} to ${t.to}`,`success`))}const Fe={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await Pe(e.config,t)}},Ie=v(g.writeFile);async function Le(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 Ie(o,l),u(`Created file: ${a}`,`success`)}const Re={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await Le(e.config,t,e)}};async function ze(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 Be={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await ze(e.config,t)}};async function Ve(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 He={name:`exec-file`,version:`1.0.0`,taskTypes:[`exec-file`],execute:async(e,t,n)=>{n.dryRun||await Ve(e.config,t,e)}};async function Ue(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=t.cwd==null?_.cwd():h.join(_.cwd(),t.cwd);y(t.command,{cwd:r,stdio:`inherit`})}const We={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await Ue(e.config,t)}};async function Ge(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 Ke={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await Ge(e.config,t)}},qe=v(g.mkdir);async function Je(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n)){u(`Condition not met, skipping mkdir task`,`info`);return}await qe(h.join(_.cwd(),c(t.path,n)),{recursive:!0}),u(`Created directory: ${t.path}`,`success`)}const Ye={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await Je(e.config,t)}},Xe=v(g.rename),Ze=v(g.stat),Qe=v(g.mkdir);async function $e(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 Ze(r)}catch{u(`Source path does not exist: ${r}`,`warn`);return}await Qe(h.dirname(i),{recursive:!0}),await Xe(r,i),u(`Moved ${t.from} to ${t.to}`,`success`)}const et={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await $e(e.config,t)}},tt=v(g.readFile),nt=v(g.writeFile);async function rt(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 tt(r,`utf-8`),l=new RegExp(i,a);s=s.replace(l,c(o,n)),await nt(r,s)}const it={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await rt(e.config,t)}},at=v(g.rename);async function ot(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 at(r,i)}const st={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await ot(e.config,t)}},ct=v(g.readFile),lt=v(g.writeFile);async function ut(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 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 lt(r,a)}const dt={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await ut(e.config,t)}},ft=v(g.readFile),pt=v(g.writeFile);async function mt(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 ft(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 pt(r,`${JSON.stringify(a,null,2)}\n`)}const ht={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await mt(e.config,t)}},gt=v(g.writeFile);async function _t(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 gt(s,d)}const vt={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await _t(e.config,t,e)}};function X(){U(`update-json`)||(V(ht),V(vt),V(Re),V(it),V(dt),V(Be),V(st),V(Ke),V(We),V(He),V(et),V(Fe),V(je),V(Ye))}async function yt(e,t,n=!1){if(X(),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 Z(e,t,n,r,i=!1){try{return u(`[${n}/${r}] Running: ${e.name}...`,`info`),await yt(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 bt(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 Z(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`),_.exit(1)),u(`Completed: ${r}/${e.length} tasks`,`success`)}function Q(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 xt(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 St(e,n){let r=$(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 Ct(e){return Q(e)}function $(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=xt(n);t.push(...e)}return t}export{T as A,I as C,N as D,M as E,E as O,ve as S,P as T,Se as _,bt as a,B as b,De as c,we as d,W as f,xe as g,Ce as h,Q as i,D as k,Ee as l,U as m,Ct as n,X as o,H as p,St as r,Z as s,$ as t,Te as u,V as v,F as w,ye as x,be as y};
|