@pixpilot/scaffoldfy 0.56.0 → 0.58.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/README.md +15 -8
  2. package/dist/cli.cjs +21 -1
  3. package/dist/cli.js +11 -1
  4. package/dist/{configurations-C9hGwa2c.cjs → configurations-iSmGgORy.cjs} +1 -1
  5. package/dist/{configurations-C6TwZWBm.js → configurations-sRFCjZJV.js} +1 -1
  6. package/dist/index.cjs +1 -1
  7. package/dist/index.d.cts +41 -1
  8. package/dist/index.d.ts +41 -1
  9. package/dist/index.js +1 -1
  10. package/dist/{run-configuration-sequentially-BK8SqkMc.cjs → run-configuration-sequentially-CJCntxv9.cjs} +2 -2
  11. package/dist/run-configuration-sequentially-Cj1kYWTZ.js +4 -0
  12. package/dist/scaffoldfy-config-validator/cli.cjs +2 -2
  13. package/dist/scaffoldfy-config-validator/cli.js +2 -2
  14. package/dist/scaffoldfy-config-validator/index.cjs +1 -1
  15. package/dist/scaffoldfy-config-validator/index.js +1 -1
  16. package/dist/scaffoldfy-config-validator/validate-scaffoldfy-json.cjs +1 -1
  17. package/dist/scaffoldfy-config-validator/validate-scaffoldfy-json.js +1 -1
  18. package/dist/{src-BN2NvYkL.cjs → src-CJxBSFwf.cjs} +1 -1
  19. package/dist/{src-DnGLJZBR.js → src-Clk5H1_d.js} +1 -1
  20. package/dist/tasks-D-wcmZrW.js +27 -0
  21. package/dist/tasks-shq57X_d.cjs +27 -0
  22. package/dist/{utils-C0leVEJZ.cjs → utils-Co7iWW4X.cjs} +1 -1
  23. package/dist/{utils-vMswJANY.js → utils-uPeG29Q4.js} +1 -1
  24. package/dist/{validate-scaffoldfy-json-C0CBAgLY.js → validate-scaffoldfy-json-DZ1arWdk.js} +1 -1
  25. package/dist/{validate-scaffoldfy-json-vxz6VQQa.cjs → validate-scaffoldfy-json-DgRRmNSc.cjs} +1 -1
  26. package/package.json +1 -1
  27. package/schema/scaffoldfy.schema.json +14 -0
  28. package/dist/run-configuration-sequentially-CCnrvgMw.js +0 -4
  29. package/dist/tasks-CfkqwNGd.cjs +0 -23
  30. package/dist/tasks-cEW0YvaN.js +0 -23
@@ -1,23 +0,0 @@
1
- import{D as e,E as t,F as n,I as r,L as i,O as a,P as o,R as s,d as c,f as l,j as u,p as d,s as f,u as ee,v as te,w as p,x as m,y as ne}from"./configurations-C6TwZWBm.js";import h from"node:path";import g from"node:fs";import _ from"node:process";import{promisify as v}from"node:util";import{execSync as y}from"node:child_process";import{checkbox as re,confirm as ie,input as ae,number as oe,password as se,select as ce}from"@inquirer/prompts";const le=v(g.readFile),b={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function x(e,t){switch(t){case`add`:return`${b.green}+ ${e}${b.reset}`;case`remove`:return`${b.red}- ${e}${b.reset}`;case`context`:return`${b.gray} ${e}${b.reset}`;default:return e}}function S(e,t){let n=e.split(`
2
- `),r=t.split(`
3
- `),i=[],a=Math.max(n.length,r.length);for(let e=0;e<a;e++){let t=n[e],a=r[e];t===a?t!==void 0&&i.push(x(t,`context`)):(t!==void 0&&i.push(x(t,`remove`)),a!==void 0&&i.push(x(a,`add`)))}return i}function C(e){return g.existsSync(h.join(_.cwd(),e))}async function w(e){return le(h.join(_.cwd(),e),`utf-8`)}async function T(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let r=t.file;if(!C(r))return`${b.red}✗ File not found: ${t.file}${b.reset}`;try{let e=await w(r),i=JSON.parse(e),a={...i};function o(e){if(typeof e==`string`)return c(e,n);if(Array.isArray(e))return e.map(e=>o(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=o(r);return t}return e}for(let[e,n]of Object.entries(t.updates)){let t=o(n);e.includes(`.`)?m(i,e,t):i[e]=t}let s=JSON.stringify(a,null,2),l=JSON.stringify(i,null,2);if(s===l)return`${b.cyan}→ No changes${b.reset}`;let u=S(s,l);return`${b.blue}File: ${t.file}${b.reset}\n${u.join(`
4
- `)}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}async function E(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let r=t.file;if(!C(r))return`${b.red}✗ File not found: ${t.file}${b.reset}`;try{let e=await w(r),i=new RegExp(t.pattern,t.flags??`g`),a=c(t.replacement,n),o=e.replace(i,a);if(e===o)return`${b.cyan}→ No matches found${b.reset}`;let s=S(e,o);return`${b.blue}File: ${t.file}${b.reset}\n${s.join(`
5
- `)}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}async function D(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let r=t.file;if(!C(r))return`${b.red}✗ File not found: ${t.file}${b.reset}`;try{let e=await w(r),i=e;for(let{find:r,replace:i}of t.replacements){let t=c(r,n),a=c(i,n);e=e.replace(t,a)}if(i===e)return`${b.cyan}→ No changes${b.reset}`;let a=S(i,e);return`${b.blue}File: ${t.file}${b.reset}\n${a.join(`
6
- `)}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}function O(e){return e.template!=null&&e.template!==``}function k(e){return e.templateFile!=null&&e.templateFile!==``}function ue(e){return e.endsWith(`.hbs`)}function A(e){let t=O(e),n=k(e);return!t&&!n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration requires either "template" (inline) or "templateFile" (file path) to be specified`}:t&&n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration cannot have both "template" and "templateFile" specified. Use one or the other.`}:{isValid:!0,hasInlineTemplate:t,hasTemplateFile:n}}function de(e){return O(e)?`inline template`:k(e)?`template file: ${e.templateFile}`:`no template source`}async function j(e,t,n,r={}){let{enableHandlebars:i=!0,sourceUrl:a=n?.$sourceUrl}=r,o=O(e),s=k(e);if(o)return c(e.template,t);if(s){let n=e.templateFile,r=i&&ue(n),o=await ee(te(n,a));return r?(await import(`handlebars`)).default.compile(o)(t):c(o,t)}throw Error(`No template content available`)}async function fe(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;if(t.template==null||t.template===``)return`${b.red}✗ No template content provided for file: ${t.file}${b.reset}`;let r=t.file,i=c(t.template,n);if(!C(r)){let e=i.split(`
7
- `).slice(0,10).join(`
8
- `),n=i.split(`
9
- `).length>10;return`${b.blue}File: ${t.file}${b.reset}\n${b.green}+ New file would be created${b.reset}\n${b.gray}Content preview:${b.reset}\n${e}${n?`
10
- ...`:``}`}try{let e=await w(r);if(e===i)return`${b.cyan}→ No changes${b.reset}`;let n=S(e,i);return`${b.blue}File: ${t.file}${b.reset}\n${n.join(`
11
- `)}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}async function pe(t,n,r){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let i=t.file;if(C(i))return`${b.cyan}→ File already exists, would be skipped: ${t.file}${b.reset}`;try{if(O(t)){let e=await j(t,n,r),i=e.split(`
12
- `).slice(0,10).join(`
13
- `),a=e.split(`
14
- `).length>10;return`${b.blue}File: ${t.file}${b.reset}\n${b.green}+ New file would be created${b.reset}\n${b.gray}Content preview:${b.reset}\n${i}${a?`
15
- ...`:``}`}let e=de(t);return`${b.blue}File: ${t.file}${b.reset}\n${b.green}+ New file would be created from ${e}${b.reset}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}async function me(t,n,r){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let i=t.file,a={};t.content==null?t.template!=null&&(a.template=t.template):a.template=t.content,t.templateFile!=null&&(a.templateFile=t.templateFile);try{let e=await j(a,n,r),o=e.split(`
16
- `).slice(0,10).join(`
17
- `),s=e.split(`
18
- `).length>10;return C(i)?`${b.blue}File: ${t.file}${b.reset}\n${b.green}+ Would append content${b.reset}\n${b.gray}Content preview:${b.reset}\n${o}${s?`
19
- ...`:``}`:`${b.blue}File: ${t.file}${b.reset}\n${b.green}+ New file would be created with content${b.reset}\n${b.gray}Content preview:${b.reset}\n${o}${s?`
20
- ...`:``}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}function M(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let r=t.paths.map(e=>c(e,n)).filter(e=>C(e));return r.length===0?`${b.cyan}→ No files/directories to delete${b.reset}`:`${b.red}Would delete:${b.reset}\n${r.map(e=>`${b.red} - ${e}${b.reset}`).join(`
21
- `)}`}function N(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let r=c(t.from,n),i=c(t.to,n);return C(r)?C(i)?`${b.yellow}⚠ Destination already exists: ${i}${b.reset}\n${b.cyan}Would rename: ${r} → ${i}${b.reset}`:`${b.cyan}Would rename: ${r} → ${i}${b.reset}`:`${b.red}✗ Source not found: ${r}${b.reset}`}function he(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let r=c(t.from,n),i=c(t.to,n);return C(r)?C(i)?`${b.yellow}⚠ Destination already exists: ${i}${b.reset}\n${b.cyan}Would move: ${r} → ${i}${b.reset}`:`${b.cyan}Would move: ${r} → ${i}${b.reset}`:`${b.red}✗ Source not found: ${r}${b.reset}`}function ge(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let r=c(t.from,n),i=c(t.to,n);if(!C(r))return`${b.red}✗ Source not found: ${r}${b.reset}`;let a=`file`;return C(i)?`${b.yellow}⚠ Destination already exists: ${i}${b.reset}\n${b.cyan}Would copy ${a}: ${r} → ${i}${b.reset}`:`${b.cyan}Would copy ${a}: ${r} → ${i}${b.reset}`}function _e(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let r=c(t.path,n);return C(r)?`${b.cyan}→ Directory already exists: ${r}${b.reset}`:`${b.green}+ Would create directory: ${r}${b.reset}`}const ve=/^[\w+,./:=@-]+$/u;function ye(e){return ve.test(e)?e:_.platform===`win32`?`"${e.replace(/(?<slashes>\\*)"/gu,`$<slashes>$<slashes>\\"`).replace(/(?<slashes>\\+)$/u,`$<slashes>$<slashes>`)}"`:`'${e.replace(/'/gu,String.raw`'\''`)}'`}function P(e,t){let n=(t??[]).filter(e=>e!==``).map(ye);return n.length>0?`${e} ${n.join(` `)}`:e}function F(e){if(e.condition!=null&&e.condition!==``)return`${b.yellow}⊘ Condition check skipped in dry-run${b.reset}`;let t=C(`.git`),n=[];if(e.removeExisting&&t&&n.push(`${b.red}Would remove existing .git directory${b.reset}`),n.push(`${b.green}Would initialize git repository${b.reset}`),e.initialCommit){let t=e.message??`Initial commit`;n.push(`${b.green}Would create initial commit: "${t}"${b.reset}`)}return n.join(`
22
- `)}function I(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let r=P(c(t.command,n),t.args?.map(e=>c(e,n))),i=t.cwd==null?_.cwd():c(t.cwd,n);return`${b.yellow}Would execute:${b.reset}\n${b.cyan} Command: ${r}${b.reset}\n${b.cyan} Working directory: ${i}${b.reset}`}async function L(e,t){try{switch(e.type){case`update-json`:return await T(e.config,t);case`write`:return await fe(e.config,t);case`create`:return await pe(e.config,t,e);case`regex-replace`:return await E(e.config,t);case`replace-in-file`:return await D(e.config,t);case`delete`:return M(e.config,t);case`rename`:return N(e.config,t);case`move`:return he(e.config,t);case`copy`:return ge(e.config,t);case`append`:return await me(e.config,t,e);case`mkdir`:return _e(e.config,t);case`git-init`:return F(e.config);case`exec`:return I(e.config,t);case`exec-file`:return I(e.config,t);default:{let t=e.type;return`${b.yellow}⚠ Diff not available for task type: ${t}${b.reset}`}}}catch(e){return`${b.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${b.reset}`}}async function be(e,t){console.log(`${b.blue}═══════════════════════════════════════════════════════${b.reset}`),console.log(`${b.blue} DRY RUN - Preview of changes${b.reset}`),console.log(`${b.blue}═══════════════════════════════════════════════════════${b.reset}`);for(let n of e){console.log(`${b.cyan}▶ Task: ${n.name}${b.reset}`),n.description!=null&&n.description!==``&&console.log(`${b.gray} ${n.description}${b.reset}`);let e=await L(n,t);console.log(e),console.log(`${b.gray}${`─`.repeat(55)}${b.reset}`)}console.log(`${b.blue}═══════════════════════════════════════════════════════${b.reset}`),console.log(`${b.yellow} No changes were applied (dry-run mode)${b.reset}`),console.log(`${b.blue}═══════════════════════════════════════════════════════${b.reset}`)}const R=new Map,z={},B=new Map;function xe(e){e.beforeAll!=null&&(z.beforeAll=e.beforeAll),e.afterAll!=null&&(z.afterAll=e.afterAll),e.beforeTask!=null&&(z.beforeTask=e.beforeTask),e.afterTask!=null&&(z.afterTask=e.afterTask),e.onError!=null&&(z.onError=e.onError)}async function V(e,...t){let n=z[e];if(n!=null)try{e===`beforeAll`||e===`afterAll`?await n(t[0]):(e===`beforeTask`||e===`afterTask`||e===`onError`)&&await n(t[0],t[1])}catch(t){u(`Error in ${e} hook: ${t instanceof Error?t.message:String(t)}`,`error`)}}function H(e){if(e.name==null||e.name===``)throw TypeError(`Plugin name is required`);if(!Array.isArray(e.taskTypes)||e.taskTypes.length===0)throw TypeError(`Plugin ${e.name} must define at least one task type`);if(typeof e.execute!=`function`)throw TypeError(`Plugin ${e.name} must provide an execute function`);if(R.has(e.name))throw TypeError(`Plugin ${e.name} is already registered`);for(let t of e.taskTypes)if(B.has(t)){let e=B.get(t);throw TypeError(`Task type "${t}" is already registered by plugin "${e}"`)}R.set(e.name,e);for(let t of e.taskTypes)B.set(t,e.name);a(`Registered plugin: ${e.name}${e.version==null?``:` v${e.version}`}`)}function Se(e){let t=R.get(e);if(t!=null){for(let e of t.taskTypes)B.delete(e);R.delete(e)}}function Ce(e){return R.get(e)}function we(){return Array.from(R.keys())}function Te(){R.clear(),B.clear()}function U(e){let t=B.get(e);if(t!=null)return R.get(t)}function W(e){return B.has(e)}async function G(e,t,n){let r=U(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}function Ee(e,t,n,r){return{name:e,...r?.version!=null&&{version:r.version},taskTypes:[t],execute:n,...r?.getDiff!=null&&{getDiff:r.getDiff},...r?.validate!=null&&{validate:r.validate}}}const De=new Set([`true`,`1`,`yes`,`y`]),Oe=new Set([`false`,`0`,`no`,`n`]);let K=new Map;function ke(e){K=new Map(Object.entries(e))}function Ae(e){return K.get(e)}function je(e){let t=e.indexOf(`=`);if(t<=0)throw Error(`Invalid --set value "${e}". Expected format: key=value`);return[e.slice(0,t).trim(),e.slice(t+1)]}function Me(e,t){switch(e.type){case`confirm`:{let n=t.trim().toLowerCase();if(De.has(n))return!0;if(Oe.has(n))return!1;throw r.invalidValue(e.id,t,`expected true or false`)}case`number`:{let n=Number(t);if(t.trim()===``||Number.isNaN(n))throw r.invalidValue(e.id,t,`expected a number`);return n}case`select`:{let n=e.choices.find(e=>String(e.value)===t);if(n==null)throw r.invalidValue(e.id,t,`expected one of ${e.choices.map(e=>String(e.value)).join(`, `)}`);return n.value}case`checkbox`:return t.split(`,`).map(e=>e.trim()).filter(e=>e!==``).map(t=>{let n=e.choices.find(e=>String(e.value)===t);if(n==null)throw r.invalidValue(e.id,t,`expected one of ${e.choices.map(e=>String(e.value)).join(`, `)}`);return n.value});case`input`:case`password`:return t;default:throw r.unknownType(e.type)}}async function q(e,t,n,r){if(e!==void 0)return l(e,{id:t,contextType:`Prompt`,...n!=null&&{context:n},...r?.$sourceUrl!=null&&{sourceUrl:r.$sourceUrl}})}async function Ne(e,n=new Map,i={}){let a={};if(e.length===0)return a;for(let o of e){if(o.$configEnabled!=null&&!await t(o.$configEnabled,{...i,...a}))continue;let e={...i,...a};if(!await t(o.enabled,e)){a[o.id]=void 0;continue}let s=Ae(o.id);if(s!==void 0){let t=Me(o,s);if(typeof t==`string`&&t.trim()===``&&await p(o.required,e)===!0)throw r.required(o.id);o.transformers!==void 0&&(t=await f.apply(o.transformers,t,e)),u(`${o.message}: ${String(t)} (preset)`,`info`),a[o.id]=t;continue}try{let t,i=n.get(o.id);switch(o.default!==void 0&&(i=await q(o.default,o.id,e,o)),i!==void 0&&o.transformers!==void 0&&(i=await f.apply(o.transformers,i,e)),o.type){case`input`:{let n={message:o.message};i!==void 0&&(n.default=String(i));let a=await p(o.required,e);if(a!==void 0&&(n.required=a),t=await ae(n),a&&(t==null||typeof t==`string`&&t.trim()===``))throw u(`${o.message} is required`,`error`),r.required(o.id);break}case`password`:if(t=await se({message:o.message,mask:`*`}),await p(o.required,e)&&(t==null||typeof t==`string`&&t.trim()===``))throw u(`${o.message} is required`,`error`),r.required(o.id);break;case`number`:{let n={message:o.message};i!==void 0&&(n.default=Number(i));let a=await p(o.required,e);if(a!==void 0&&(n.required=a),o.min!==void 0&&(n.min=o.min),o.max!==void 0&&(n.max=o.max),t=await oe(n),a&&t==null)throw u(`${o.message} is required`,`error`),r.required(o.id);break}case`select`:{let e={message:o.message,choices:o.choices.map(e=>({name:e.name,value:e.value}))};i!==void 0&&(e.default=i),t=await ce(e);break}case`checkbox`:{let n={message:o.message,choices:o.choices.map(e=>({name:e.name,value:e.value}))};i!==void 0&&(n.default=i);let r=await p(o.required,e);r!==void 0&&(n.required=r),t=await re(n);break}case`confirm`:{let e=i===void 0?!1:!!i;t=await ie({message:o.message,default:e});break}default:throw u(`Unknown prompt type: ${o.type}`,`error`),r.unknownType(o.type)}o.transformers!==void 0&&(i!==void 0&&(t===i||String(t)===String(i))||(t=await f.apply(o.transformers,t,{...e,...a}))),a[o.id]=t}catch(e){throw e instanceof Error&&u(`Failed to collect prompt "${o.id}": ${e.message}`,`error`),e}}return a}async function Pe(e,t){let n=new Map,r=e.map(async e=>{if(e.default!==void 0){let r=await q(e.default,e.id,t,e);r!==void 0&&n.set(e.id,r)}});return await Promise.all(r),n}function Fe(e){let t=[],n=new Set;for(let r of e){if(n.has(r.id)&&t.push(`Duplicate prompt ID: ${r.id}`),n.add(r.id),/^[a-zA-Z_$][a-zA-Z0-9_$]*$/u.test(r.id)||t.push(`Invalid prompt ID "${r.id}": must be a valid JavaScript identifier (start with letter, underscore, or $, followed by letters, digits, underscores, or $)`),(!r.message||r.message.trim()===``)&&t.push(`Prompt "${r.id}" must have a non-empty message`),r.type===`select`||r.type===`checkbox`){r.choices.length===0&&t.push(`${r.type===`select`?`Select`:`Checkbox`} prompt "${r.id}" must have at least one choice`);for(let e of r.choices)(!e.name||e.name.trim()===``)&&t.push(`${r.type===`select`?`Select`:`Checkbox`} prompt "${r.id}" has a choice with empty name`),e.value===void 0&&t.push(`${r.type===`select`?`Select`:`Checkbox`} prompt "${r.id}" has a choice with undefined value`)}r.type===`number`&&r.min!==void 0&&r.max!==void 0&&r.min>r.max&&t.push(`Number prompt "${r.id}" has min greater than max`)}return t}const J=v(g.appendFile),Ie=v(g.readFile),Le=v(g.stat);async function Re(t,r,i){if(t.condition!=null&&t.condition!==``&&!e(t.condition,r)){u(`Condition not met, skipping append task`,`info`);return}let a=h.join(_.cwd(),c(t.file,r)),o={};t.content==null?t.template!=null&&(o.template=t.template):o.template=t.content,t.templateFile!=null&&(o.templateFile=t.templateFile);let s=A(o);if(!s.isValid)throw s.error?.includes(`cannot have both`)?n.templateHasBothTemplateAndFile():n.templateMissingTemplateOrFile();let l=await j(o,r,i),d=!1,f=!1;try{await Le(a),d=!0;let e=await Ie(a,`utf-8`);e.length>0&&!e.endsWith(`
23
- `)&&(f=t.newline!==!1)}catch{}d&&f?await J(a,`\n${l}`):await J(a,l),u(`Appended content to ${t.file}`,`success`)}const ze={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await Re(e.config,t,e)}},Y=v(g.copyFile),Be=v(g.stat),X=v(g.mkdir),Ve=v(g.readdir);async function Z(e,t){await X(t,{recursive:!0});let n=await Ve(e,{withFileTypes:!0});await Promise.all(n.map(async n=>{let r=h.join(e,n.name),i=h.join(t,n.name);n.isDirectory()?await Z(r,i):await Y(r,i)}))}async function He(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n)){u(`Condition not met, skipping copy task`,`info`);return}let r=h.join(_.cwd(),c(t.from,n)),i=h.join(_.cwd(),c(t.to,n)),a;try{a=await Be(r)}catch{u(`Source path does not exist: ${r}`,`warn`);return}await X(h.dirname(i),{recursive:!0}),a.isDirectory()?(await Z(r,i),u(`Copied directory ${t.from} to ${t.to}`,`success`)):(await Y(r,i),u(`Copied file ${t.from} to ${t.to}`,`success`))}const Ue={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await He(e.config,t)}},We=v(g.writeFile);async function Ge(t,r,i){if(t.condition!=null&&t.condition!==``&&!e(t.condition,r)){u(`Condition not met, skipping create task`,`info`);return}let a=c(t.file,r),o=h.join(_.cwd(),a);if(g.existsSync(o)){u(`File already exists, skipping: ${a}`,`info`);return}let s=A(t);if(!s.isValid)throw s.error?.includes(`cannot have both`)?n.createHasBothTemplateAndFile():n.createMissingTemplateOrFile();let l=await j(t,r,i),d=h.dirname(o);g.existsSync(d)||g.mkdirSync(d,{recursive:!0}),await We(o,l),u(`Created file: ${a}`,`success`)}const Ke={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await Ge(e.config,t,e)}};async function qe(t,n){let{paths:r,condition:i}=t;if(i!=null&&i!==``){if(!n){u(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!e(i,n)){u(`Condition not met, skipping deletion`,`info`);return}}for(let e of r){let t=n==null?e:c(e,n),r=h.join(_.cwd(),t);g.existsSync(r)&&g.rmSync(r,{recursive:!0,force:!0})}}const Je={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await qe(e.config,t)}};async function Ye(t,n,r){t.condition!=null&&t.condition!==``&&!e(t.condition,n)||await d({file:t.file,...t.runtime&&{runtime:t.runtime},...t.args&&{args:t.args},...t.parameters&&{parameters:t.parameters},...t.cwd!=null&&t.cwd.trim()!==``&&{cwd:t.cwd},...r?.$sourceUrl!=null&&r.$sourceUrl.trim()!==``&&{sourceUrl:r.$sourceUrl},captureOutput:!1},n)}const Xe={name:`exec-file`,version:`1.0.0`,taskTypes:[`exec-file`],execute:async(e,t,n)=>{n.dryRun||await Ye(e.config,t,e)}};async function Ze(t,n){if(t.condition!=null&&t.condition!==``){if(!n){u(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!e(t.condition,n)){u(`Condition not met, skipping exec task`,`info`);return}}let r=e=>n==null?e:c(e,n),i=P(r(t.command),t.args?.map(r)),o=t.cwd==null?_.cwd():h.join(_.cwd(),r(t.cwd));a(`Executing: ${i}`),y(i,{cwd:o,stdio:`inherit`})}const Qe={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await Ze(e.config,t)}};async function $e(t,n){if(t.condition!=null&&t.condition!==``){if(!n){u(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!e(t.condition,n)){u(`Condition not met, skipping git-init task`,`info`);return}}if(t.removeExisting){let e=h.join(_.cwd(),`.git`);g.existsSync(e)&&g.rmSync(e,{recursive:!0,force:!0})}if(y(`git init`,{stdio:`inherit`}),t.initialCommit){let e=t.message??`Initial commit`;y(`git add .`,{stdio:`inherit`}),y(`git commit -m "${e}"`,{stdio:`inherit`})}}const et={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await $e(e.config,t)}},tt=v(g.mkdir);async function nt(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n)){u(`Condition not met, skipping mkdir task`,`info`);return}await tt(h.join(_.cwd(),c(t.path,n)),{recursive:!0}),u(`Created directory: ${t.path}`,`success`)}const rt={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await nt(e.config,t)}},it=v(g.rename),at=v(g.stat),ot=v(g.mkdir);async function st(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n)){u(`Condition not met, skipping move task`,`info`);return}let r=h.join(_.cwd(),c(t.from,n)),i=h.join(_.cwd(),c(t.to,n));try{await at(r)}catch{u(`Source path does not exist: ${r}`,`warn`);return}await ot(h.dirname(i),{recursive:!0}),await it(r,i),u(`Moved ${t.from} to ${t.to}`,`success`)}const ct={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await st(e.config,t)}},lt=v(g.readFile),ut=v(g.writeFile);async function dt(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n)){u(`Condition not met, skipping regex-replace task`,`info`);return}let r=h.join(_.cwd(),c(t.file,n)),{pattern:i}=t,a=t.flags??``,o=t.replacement||``,s=await lt(r,`utf-8`),l=new RegExp(i,a);s=s.replace(l,c(o,n)),await ut(r,s)}const ft={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await dt(e.config,t)}},pt=v(g.rename);async function mt(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n)){u(`Condition not met, skipping rename task`,`info`);return}let r=h.join(_.cwd(),c(t.from,n)),i=h.join(_.cwd(),c(t.to,n));if(!g.existsSync(r)){u(`Source path does not exist: ${r}`,`warn`);return}await pt(r,i)}const ht={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await mt(e.config,t)}},gt=v(g.readFile),_t=v(g.writeFile);async function vt(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n)){u(`Condition not met, skipping replace-in-file task`,`info`);return}let r=h.join(_.cwd(),c(t.file,n)),{replacements:i}=t;if(!g.existsSync(r)){u(`File not found: ${r}, skipping`,`warn`);return}let a=await gt(r,`utf-8`);for(let{find:e,replace:t}of i){let r=c(t,n);a=a.replace(new RegExp(e,`gu`),r)}await _t(r,a)}const yt={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await vt(e.config,t)}},bt=v(g.readFile),xt=v(g.writeFile);async function St(t,n){if(t.condition!=null&&t.condition!==``&&!e(t.condition,n)){u(`Condition not met, skipping update-json task`,`info`);return}let r=h.join(_.cwd(),c(t.file,n)),{updates:i}=t,a=ne(await bt(r,`utf-8`));function o(e){if(typeof e==`string`)return c(e,n);if(Array.isArray(e))return e.map(e=>o(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=o(r);return t}return e}for(let[e,t]of Object.entries(i)){let n=o(t);e.includes(`.`)?m(a,e,n):a[e]=n}await xt(r,`${JSON.stringify(a,null,2)}\n`)}const Ct={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await St(e.config,t)}},wt=v(g.writeFile);async function Tt(t,r,i){let{allowCreate:a=!0}=t;if(t.condition!=null&&t.condition!==``&&!e(t.condition,r)){u(`Condition not met, skipping write task`,`info`);return}let o=c(t.file,r),s=h.join(_.cwd(),o);if(!g.existsSync(s)){if(a===!1)throw Error(`Write task failed: file does not exist (${o})`);u(`File not found, creating new file: ${o}`,`info`)}let l=A(t);if(!l.isValid)throw l.error?.includes(`cannot have both`)?n.templateHasBothTemplateAndFile():n.templateMissingTemplateOrFile();let d=await j(t,r,i),f=h.dirname(s);g.existsSync(f)||g.mkdirSync(f,{recursive:!0}),await wt(s,d)}const Et={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await Tt(e.config,t,e)}};function Q(){W(`update-json`)||(H(Ct),H(Et),H(Ke),H(ft),H(yt),H(Je),H(ht),H(et),H(Qe),H(Xe),H(ct),H(Ue),H(ze),H(rt))}async function Dt(e,t,n=!1){if(Q(),n){u(`[DRY RUN] Would execute: ${e.name}`,`info`);return}if(W(e.type)){await G(e,t,{dryRun:n});return}throw TypeError(`Unknown task type: ${e.type}`)}async function $(e,t,n,r,i=!1){try{return u(`[${n}/${r}] Running: ${e.name}...`,`info`),await Dt(e,t,i),u(`[${n}/${r}] Completed: ${e.name}...`,`success`),!0}catch(t){return u(`Failed: ${e.name}`,`error`),t instanceof Error&&(u(` Reason: ${t.message}`,`error`),t.stack!=null&&_.env.DEBUG!=null&&console.error(t.stack)),!1}}async function Ot(e,t,n){await V(`beforeAll`,t);let r=0,i=0,a=[];for(let s=0;s<e.length;s++){let c=e[s];c!=null&&(await V(`beforeTask`,c,t),await $(c,t,s+1,e.length,n.dryRun)?(r++,await V(`afterTask`,c,t)):(await p(c.required,t)&&(i++,a.push(c.name)),await V(`onError`,Error(`Task ${c.name} failed`),c),o(`⚠️ Task "${c.name}" failed, continuing with remaining tasks...`)))}await V(`afterAll`,t),i>0&&(u(`\n❌ Task execution completed with ${i} error(s)`,`error`),u(`Completed: ${r}/${e.length} tasks`,`info`),u(`Failed tasks: ${a.join(`, `)}`,`error`),_.exit(1)),u(`Completed: ${r}/${e.length} tasks`,`success`)}function kt(e){let t=[],n=new Set,r=new Set,a=new Map(e.map(e=>[e.id,e]));function o(e){if(n.has(e))return;if(r.has(e))throw s.forTaskDependency(e);r.add(e);let c=a.get(e);if(!c)throw i.forId(e);if(c.dependencies)for(let e of c.dependencies)o(e);r.delete(e),n.add(e),t.push(c)}for(let t of e)n.has(t.id)||o(t.id);return t}function At(e){let t=[],n=e.config,r=typeof n.template==`string`?n.template:void 0,i=typeof n.templateFile==`string`?n.templateFile:void 0,a=A({...r!==void 0&&{template:r},...i!==void 0&&{templateFile:i}});return!a.isValid&&a.error!=null&&a.error!==``&&t.push(`Task "${e.id}" (${e.name}): ${a.error}`),(n.file==null||n.file===``)&&t.push(`Task "${e.id}" (${e.name}): Write task requires "file" property to specify the output file path`),t}async function jt(e,n){let r=Nt(e);r.length>0&&(console.error(`❌ Task validation errors:`),r.forEach(e=>console.error(` - ${e}`)),_.exit(1));let i=[];for(let r of e)await t(r.enabled,n)&&i.push(r);return i}function Mt(e){return kt(e)}function Nt(e){let t=[];for(let n of e)if(!W(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=At(n);t.push(...e)}return t}export{E as A,xe as C,F as D,I as E,T as M,M as O,V as S,L as T,Te as _,Ot as a,H as b,Fe as c,je as d,ke as f,W as g,U as h,kt as i,D as j,N as k,Pe as l,G as m,Mt as n,Q as o,Ee as p,jt as r,$ as s,Nt as t,Ne as u,Ce as v,be as w,Se as x,we as y};