@pixpilot/scaffoldfy 0.38.0 → 0.39.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/configurations-Bjun5iKX.js +1 -0
- package/dist/configurations-KSynsxPT.cjs +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +27 -15
- package/dist/index.d.ts +27 -15
- package/dist/index.js +1 -1
- package/dist/run-tasks--KK3MvU0.js +26 -0
- package/dist/run-tasks-B0buAbAD.cjs +1 -0
- package/dist/run-tasks-BPQFQ9vD.js +1 -0
- package/dist/run-tasks-DU00U3qI.cjs +26 -0
- package/dist/src-BYAwq7zv.cjs +1 -0
- package/dist/src-DBk71cIW.js +1 -0
- package/dist/utils-C-yGs5_V.cjs +1 -0
- package/dist/utils-DXSrTxhI.js +1 -0
- package/package.json +2 -2
- package/dist/config-inheritance-CtSb5haE.cjs +0 -1
- package/dist/config-inheritance-DLd3amMI.js +0 -1
- package/dist/run-tasks-BOQ90AJk.cjs +0 -1
- package/dist/run-tasks-C0IZQ4SX.js +0 -26
- package/dist/run-tasks-CgFJyU4i.cjs +0 -26
- package/dist/run-tasks-i1yaGln9.js +0 -1
- package/dist/src-B0yHfPGS.cjs +0 -1
- package/dist/src-CfaEuN4Q.js +0 -1
- package/dist/utils-Cs2XFh4Z.cjs +0 -1
- package/dist/utils-DO-s6Uy8.js +0 -1
package/dist/cli.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
const e=require(`./chunk-DjWAcSYV.cjs`),t=require(`./
|
|
2
|
+
const e=require(`./chunk-DjWAcSYV.cjs`),t=require(`./configurations-KSynsxPT.cjs`);require(`./run-tasks-DU00U3qI.cjs`),require(`./config-CQ-mWBG5.cjs`),require(`./validate-scaffoldfy-json-Dkaz9ueq.cjs`),require(`./scaffoldfy-config-json-validator-CpEXHRsI.cjs`);const n=require(`./src-BYAwq7zv.cjs`);let r=require(`node:fs`);r=e.t(r);let i=require(`node:path`);i=e.t(i);let a=require(`node:process`);a=e.t(a);let o=require(`commander`);o=e.t(o);let s=require(`node:url`);s=e.t(s);let c=require(`ajv`);c=e.t(c);const l=1,u=(0,s.fileURLToPath)(require(`url`).pathToFileURL(__filename).href),d=i.default.dirname(u);function f(){return new c.default({allErrors:!0,verbose:!0,strict:!1,discriminator:!0})}function p(){let e=i.default.join(d,`..`,`schema`,`scaffoldfy.schema.json`);try{let t=r.default.readFileSync(e,`utf-8`);return JSON.parse(t)}catch(t){throw Error(`Failed to load tasks schema from ${e}: ${t instanceof Error?t.message:String(t)}`)}}function m(e){return e.filter(t=>{if(t.keyword===`oneOf`){let e=t.params;if(e.passingSchemas&&e.passingSchemas.length>0)return!1}if(t.keyword===`required`){let n=e.find(e=>e.keyword===`oneOf`&&e.instancePath===t.instancePath);if(n){let e=n.params;if(e.passingSchemas&&e.passingSchemas.length>0)return!1}}return!0}).map(e=>{let t=e.instancePath||`root`,n=e.message??`Unknown error`;switch(e.keyword){case`required`:return`${t}: Missing required property "${String(e.params.missingProperty??`unknown`)}"`;case`type`:return`${t}: Expected type "${String(e.params.type??`unknown`)}", received "${typeof e.data}"`;case`enum`:{let r=e.params.allowedValues;return`${t}: ${n}. Allowed values: ${Array.isArray(r)?r.join(`, `):String(r)}`}case`pattern`:{let{pattern:r}=e.params;return`${t}: ${n}. Value must match pattern: ${String(r)}`}case`oneOf`:return`${t}: ${n}. Configuration must match exactly one of the allowed schemas`;case`additionalProperties`:return`${t}: ${n}. Unknown property: "${String(e.params.additionalProperty??`unknown`)}"`;default:return`${t}: ${n}`}})}function h(e,n={}){try{let t=f(),r=p(),i=t.compile(r);if(!i(e)&&i.errors){let e=m(i.errors);return e.length===0?{valid:!0,errors:[]}:(n.silent||g(e),{valid:!1,errors:e})}return{valid:!0,errors:[]}}catch(e){let r=e instanceof Error?e.message:`Unknown error occurred during schema validation`;return n.silent||(t.S(`❌ Schema validation error:`,`error`),t.S(` ${r}`,`error`)),{valid:!1,errors:[r]}}}function g(e){t.S(`❌ Schema validation failed:`,`error`),t.S(``,`error`),t.S(`The following validation errors were found:`,`error`),t.S(``,`error`);for(let n of e)t.S(` • ${n}`,`error`);t.S(``,`error`),t.S(`Please fix these errors in your template configuration file.`,`error`),t.S(``,`error`),t.S(`For schema documentation, see: https://github.com/pixpilot/scaffoldfy/tree/main/packages/scaffoldfy/schema`,`info`)}const _=new o.Command,v=i.default.join(__dirname,`..`,`package.json`);let y=`0.0.0`;try{y=JSON.parse(r.default.readFileSync(v,`utf-8`)).version??`0.0.0`}catch{}_.name(`scaffoldfy`).description(`Automate project setup and configuration with customizable tasks`).version(y),_.option(`--dry-run`,`Run in dry mode without making any changes`).option(`--force`,`Force execution even if checks fail`).option(`--config <path>`,`Path to task configuration file (JSON 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 e=>{e.debug===!0&&t.C(!0);try{let o=[],s,c,l,u,d;if(e.config!=null&&e.config!==``){let n=i.default.resolve(a.default.cwd(),e.config);if(r.default.existsSync(n))if(d=n,n.endsWith(`.ts`)||n.endsWith(`.mts`)){t.S(`Loading tasks from TypeScript file: ${e.config}`,`info`);try{let e=await import(n);o=e.default??e.tasks??[],(!Array.isArray(o)||o.length===0)&&(t.S(`⚠️ No tasks found in TypeScript file or invalid format`,`warn`),t.S(`Expected default export or named export "tasks" with TaskDefinition[]`,`info`))}catch(n){t.S(`Failed to load TypeScript config file: ${e.config}`,`error`),n instanceof Error&&t.S(` Error: ${n.message}`,`error`),a.default.exit(1)}}else try{if(e.validate!==!1){t.y(`Validating task configuration against schema...`);let e=r.default.readFileSync(n,`utf-8`);h(JSON.parse(e),{silent:!1}).valid||(t.S(``,`error`),t.S(`💡 You can skip validation with --no-validate flag, but this is not recommended.`,`info`),a.default.exit(1)),t.S(`Configuration validated`,`success`)}let i=await t.n(n,{sequential:!0});if(i.configs!=null&&i.configs.length>0){let{runTemplatesSequentially:t}=await Promise.resolve().then(()=>require(`./run-tasks-B0buAbAD.cjs`)),{createInitialConfig:r}=await Promise.resolve().then(()=>require(`./config-DZmWkoaW.cjs`));await t(i.configs,{dryRun:e.dryRun??!1,force:e.force??!1,configFilePath:n},r()),a.default.exit(0)}o=i.tasks,s=i.variables,c=i.prompts,l=i.enabled,u=i.transformers,Array.isArray(o)||(t.S(`❌ Invalid config file format`,`error`),t.S(`Expected JSON with { "tasks": [...] } structure`,`info`),a.default.exit(1))}catch(n){t.S(`Failed to load JSON config file: ${e.config}`,`error`),n instanceof Error&&t.S(` Error: ${n.message}`,`error`),a.default.exit(1)}else t.S(`Config file not found: ${e.config}`,`warn`)}let f=c!=null&&c.length>0||s!=null&&s.length>0;o.length===0&&!f&&(t.S(`❌ No tasks defined`,`error`),t.S(`Please provide tasks using one of these methods:`,`info`),t.S(` 1. Create a template-tasks.json file in the current directory`,`info`),t.S(` 2. Create a template-tasks.ts file in the current directory`,`info`),t.S(` 3. Use --config option to specify a different config file`,`info`),t.S(`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)),o.length===0?t.S(`Loaded template with 0 tasks (template may only provide prompts/variables for extending)`,`info`):t.S(`Loaded ${o.length} task(s)`,`success`),await n.t(o,{dryRun:e.dryRun,force:e.force,configFilePath:d,variables:s,prompts:c,configEnabled:l,transformers:u})}catch(e){if(t.S(`❌ CLI execution failed`,`error`),e instanceof Error){t.S(`Error: ${e.message}`,`error`);let n=a.default.env.DEBUG;n!=null&&n!==``&&console.error(e.stack)}else console.error(e);a.default.exit(1)}}),_.parse(a.default.argv);
|
package/dist/cli.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{
|
|
2
|
+
import{C as e,S as t,n,y as r}from"./configurations-Bjun5iKX.js";import"./run-tasks--KK3MvU0.js";import"./config-nfiOxhDM.js";import"./validate-scaffoldfy-json-Cfq-nQjy.js";import"./scaffoldfy-config-json-validator-DP8-e4Yy.js";import{t as i}from"./src-DBk71cIW.js";import a from"node:path";import{fileURLToPath as o}from"node:url";import s from"node:fs";import c from"node:process";import{Command as l}from"commander";import u from"ajv";const d=()=>o(import.meta.url),f=(()=>a.dirname(d()))(),p=o(import.meta.url),m=a.dirname(p);function h(){return new u({allErrors:!0,verbose:!0,strict:!1,discriminator:!0})}function g(){let e=a.join(m,`..`,`schema`,`scaffoldfy.schema.json`);try{let t=s.readFileSync(e,`utf-8`);return JSON.parse(t)}catch(t){throw Error(`Failed to load tasks schema from ${e}: ${t instanceof Error?t.message:String(t)}`)}}function _(e){return e.filter(t=>{if(t.keyword===`oneOf`){let e=t.params;if(e.passingSchemas&&e.passingSchemas.length>0)return!1}if(t.keyword===`required`){let n=e.find(e=>e.keyword===`oneOf`&&e.instancePath===t.instancePath);if(n){let e=n.params;if(e.passingSchemas&&e.passingSchemas.length>0)return!1}}return!0}).map(e=>{let t=e.instancePath||`root`,n=e.message??`Unknown error`;switch(e.keyword){case`required`:return`${t}: Missing required property "${String(e.params.missingProperty??`unknown`)}"`;case`type`:return`${t}: Expected type "${String(e.params.type??`unknown`)}", received "${typeof e.data}"`;case`enum`:{let r=e.params.allowedValues;return`${t}: ${n}. Allowed values: ${Array.isArray(r)?r.join(`, `):String(r)}`}case`pattern`:{let{pattern:r}=e.params;return`${t}: ${n}. Value must match pattern: ${String(r)}`}case`oneOf`:return`${t}: ${n}. Configuration must match exactly one of the allowed schemas`;case`additionalProperties`:return`${t}: ${n}. Unknown property: "${String(e.params.additionalProperty??`unknown`)}"`;default:return`${t}: ${n}`}})}function v(e,n={}){try{let t=h(),r=g(),i=t.compile(r);if(!i(e)&&i.errors){let e=_(i.errors);return e.length===0?{valid:!0,errors:[]}:(n.silent||y(e),{valid:!1,errors:e})}return{valid:!0,errors:[]}}catch(e){let r=e instanceof Error?e.message:`Unknown error occurred during schema validation`;return n.silent||(t(`❌ Schema validation error:`,`error`),t(` ${r}`,`error`)),{valid:!1,errors:[r]}}}function y(e){t(`❌ Schema validation failed:`,`error`),t(``,`error`),t(`The following validation errors were found:`,`error`),t(``,`error`);for(let n of e)t(` • ${n}`,`error`);t(``,`error`),t(`Please fix these errors in your template configuration file.`,`error`),t(``,`error`),t(`For schema documentation, see: https://github.com/pixpilot/scaffoldfy/tree/main/packages/scaffoldfy/schema`,`info`)}const b=new l,x=a.join(f,`..`,`package.json`);let S=`0.0.0`;try{S=JSON.parse(s.readFileSync(x,`utf-8`)).version??`0.0.0`}catch{}b.name(`scaffoldfy`).description(`Automate project setup and configuration with customizable tasks`).version(S),b.option(`--dry-run`,`Run in dry mode without making any changes`).option(`--force`,`Force execution even if checks fail`).option(`--config <path>`,`Path to task configuration file (JSON 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(!0);try{let e=[],l,u,d,f,p;if(o.config!=null&&o.config!==``){let i=a.resolve(c.cwd(),o.config);if(s.existsSync(i))if(p=i,i.endsWith(`.ts`)||i.endsWith(`.mts`)){t(`Loading tasks from TypeScript file: ${o.config}`,`info`);try{let n=await import(i);e=n.default??n.tasks??[],(!Array.isArray(e)||e.length===0)&&(t(`⚠️ No tasks found in TypeScript file or invalid format`,`warn`),t(`Expected default export or named export "tasks" with TaskDefinition[]`,`info`))}catch(e){t(`Failed to load TypeScript config file: ${o.config}`,`error`),e instanceof Error&&t(` Error: ${e.message}`,`error`),c.exit(1)}}else try{if(o.validate!==!1){r(`Validating task configuration against schema...`);let e=s.readFileSync(i,`utf-8`);v(JSON.parse(e),{silent:!1}).valid||(t(``,`error`),t(`💡 You can skip validation with --no-validate flag, but this is not recommended.`,`info`),c.exit(1)),t(`Configuration validated`,`success`)}let a=await n(i,{sequential:!0});if(a.configs!=null&&a.configs.length>0){let{runTemplatesSequentially:e}=await import(`./run-tasks-BPQFQ9vD.js`),{createInitialConfig:t}=await import(`./config-DFR0mwj6.js`);await e(a.configs,{dryRun:o.dryRun??!1,force:o.force??!1,configFilePath:i},t()),c.exit(0)}e=a.tasks,l=a.variables,u=a.prompts,d=a.enabled,f=a.transformers,Array.isArray(e)||(t(`❌ Invalid config file format`,`error`),t(`Expected JSON with { "tasks": [...] } structure`,`info`),c.exit(1))}catch(e){t(`Failed to load JSON config file: ${o.config}`,`error`),e instanceof Error&&t(` Error: ${e.message}`,`error`),c.exit(1)}else t(`Config file not found: ${o.config}`,`warn`)}let m=u!=null&&u.length>0||l!=null&&l.length>0;e.length===0&&!m&&(t(`❌ No tasks defined`,`error`),t(`Please provide tasks using one of these methods:`,`info`),t(` 1. Create a template-tasks.json file in the current directory`,`info`),t(` 2. Create a template-tasks.ts file in the current directory`,`info`),t(` 3. Use --config option to specify a different config file`,`info`),t(`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)),c.exit(1)),e.length===0?t(`Loaded template with 0 tasks (template may only provide prompts/variables for extending)`,`info`):t(`Loaded ${e.length} task(s)`,`success`),await i(e,{dryRun:o.dryRun,force:o.force,configFilePath:p,variables:l,prompts:u,configEnabled:d,transformers:f})}catch(e){if(t(`❌ CLI execution failed`,`error`),e instanceof Error){t(`Error: ${e.message}`,`error`);let n=c.env.DEBUG;n!=null&&n!==``&&console.error(e.stack)}else console.error(e);c.exit(1)}}),b.parse(c.argv);export{};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import e from"node:path";import t from"node:fs";import n from"node:process";import{promisify as r}from"node:util";import"handlebars";import i from"node:os";import{execSync as a}from"node:child_process";const o=new Map;function s(){o.clear()}var c=class extends Error{constructor(e,t){super(e),this.code=t,this.name=this.constructor.name}},l=class e extends c{constructor(e,t,n){super(e,`CIRCULAR_DEPENDENCY`),this.dependencyChain=t,this.resolvedPath=n,this.name=`CircularDependencyError`}static forConfigurationInheritance(t,n){let r=Array.from(t);return new e(`Circular dependency detected: ${r.join(` -> `)} -> ${n}`,r,n)}static forTemplateInheritance(t,n){return e.forConfigurationInheritance(t,n)}static forTaskDependency(t){return new e(`Circular dependency detected involving task: ${t}`,[t])}static forTemplateDependencies(t,n){let r=[...t,n];return new e(`Circular dependency detected in template dependencies: ${r.join(` -> `)}`,r)}},u=class e extends c{constructor(e,t){super(e,`CONFIG_FILE_NOT_FOUND`),this.filePath=t,this.name=`ConfigFileNotFoundError`}static forPath(t){return new e(`Configuration file not found: ${t}`,t)}},d=class e extends c{constructor(e,t,n){super(e,`CONFIG_FETCH_ERROR`),this.url=t,this.originalError=n,this.name=`ConfigFetchError`}static forUrl(t,n,r){return typeof n==`number`?new e(`Failed to fetch configuration from ${t}: ${n} ${r??``}`.trim(),t):new e(`Failed to fetch configuration from ${t}: ${n?.message??String(n??`Unknown error`)}`,t,n)}},f=class e extends c{constructor(e,t,n){super(e,`CONFIG_PARSE_ERROR`),this.filePath=t,this.originalError=n,this.name=`ConfigParseError`}static forFile(t,n){return new e(`Failed to parse configuration file ${t}: ${n.message}`,t,n)}},p=class e extends c{constructor(e,t){super(e,`INVALID_CONFIG`),this.filePath=t,this.name=`InvalidConfigError`}static forFile(t,n){return new e(`Invalid configuration file ${t}: ${n}`,t)}static tasksNotArray(t){return new e(`Invalid configuration file ${t}: 'tasks' must be an array if provided`,t)}static missingName(t){return new e(`Invalid configuration file ${t}: 'name' field is required`,t)}static invalidNameFormat(t,n){return new e(`Invalid configuration file ${t}: 'name' field "${n}" must contain only lowercase letters, digits, and hyphens. It cannot start or end with a hyphen, and cannot contain consecutive hyphens.`,t)}},m=class e extends c{constructor(e,t,n,r){super(e,`DUPLICATE_ID`),this.id=t,this.type=n,this.existingType=r,this.name=`DuplicateIdError`}static forId(t,n,r){return new e(`Duplicate ID "${t}" found in ${n}. This ID is already used in ${r??`unknown`}`,t,n,r)}},h=class e extends c{constructor(e,t,n,r,i){super(e,`ID_CONFLICT`),this.id=t,this.type=n,this.baseSource=r,this.overrideSource=i,this.name=`IdConflictError`}static forTask(t,n,r){return new e(`Task ID conflict: "${t}" is defined in multiple templates.\n Base task from: ${n??`unknown`}\n Override task from: ${r??`unknown`}\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the task.\n Task is being extended/overridden but no override strategy was specified.`,t,`task`,n,r)}static forVariable(t){return new e(`Variable ID conflict: "${t}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the variable.\n Variable is being extended/overridden but no override strategy was specified.`,t,`variable`)}static forPrompt(t){return new e(`Prompt ID conflict: "${t}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the prompt.\n Prompt is being extended/overridden but no override strategy was specified.`,t,`prompt`)}};let g=!1;function ee(e){g=e}const _={debug:`🐛`,info:`ℹ`,success:`✓`,warn:`⚠`,error:`✗`},v={debug:`\x1B[35m`,info:`\x1B[36m`,success:`\x1B[32m`,warn:`\x1B[33m`,error:`\x1B[31m`},y=`\x1B[0m`;function b(e){g&&console.log(`${v.debug}${_.debug} ${e}${y}`)}function x(e){console.log(`${v.info}${_.info} ${e}${y}`)}function S(e){console.log(`${v.success}${_.success} ${e}${y}`)}function C(e){console.log(`${v.warn}${_.warn} ${e}${y}`)}function w(e){console.log(`${v.error}${_.error} ${e}${y}`)}function T(e,t=`info`){switch(t){case`debug`:b(e);break;case`info`:x(e);break;case`success`:S(e);break;case`warn`:C(e);break;case`error`:w(e);break}}function E(e,t,n){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch(t){return n?.lazy===!0&&t instanceof ReferenceError?!0:(n?.silent!==!0&&(T(`Failed to evaluate condition: ${e}`,`warn`),t instanceof Error&&T(` Error: ${t.message}`,`warn`)),!1)}}function te(e,t,n){if(e===void 0)return!0;if(typeof e==`boolean`)return e;if(typeof e==`object`&&`type`in e){if(e.type===`exec`)return n?.lazy===!0;if(e.type===`condition`)return E(e.value,t,n?.lazy===!0?{lazy:!0}:void 0)}return!1}async function D(e,t,n){if(e===void 0)return!0;if(typeof e==`boolean`)return e;if(typeof e==`object`&&`type`in e){if(e.type===`exec`)try{let{execSync:n}=await import(`node:child_process`),{interpolateTemplate:r}=await import(`./utils-DXSrTxhI.js`),i=n(r(e.value,t),{encoding:`utf-8`}).trim();if(i===``||i===`0`)return!1;let a=i.toLowerCase();return!(a===`false`||a===`no`)}catch(t){let{log:n}=await import(`./utils-DXSrTxhI.js`);return n(`Failed to execute enabled command: ${e.value}`,`warn`),t instanceof Error&&n(` Error: ${t.message}`,`warn`),!1}if(e.type===`condition`)return E(e.value,t,n?.lazy===!0?{lazy:!0}:void 0)}return!1}function O(e,t){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch{return!0}}function ne(e){return e===void 0||typeof e==`boolean`?e:typeof e==`string`?{type:`condition`,value:e}:typeof e==`object`&&e&&`condition`in e&&!(`type`in e)?{type:`condition`,value:e.condition}:e}async function k(e,t){let n=ne(e);if(n===void 0)return!0;if(typeof n==`boolean`)return n;if(typeof n==`object`&&n&&`type`in n){if(n.type===`exec`)try{let{execSync:e}=await import(`node:child_process`),{interpolateTemplate:r}=await import(`./utils-DXSrTxhI.js`);return e(r(n.value,t),{encoding:`utf-8`,stdio:`ignore`}),!0}catch(e){let{log:t}=await import(`./utils-DXSrTxhI.js`);if(typeof e==`object`&&e&&`status`in e&&typeof e.status==`number`){let{status:r}=e;if(r>=1&&r<=255)return t(`Failed to execute required command: ${n.value}`,`warn`),e instanceof Error&&t(` Error: ${e.message}`,`warn`),!1}return t(`Failed to execute required command: ${n.value}`,`warn`),e instanceof Error&&t(` Error: ${e.message}`,`warn`),!1}if(n.type===`condition`)return O(n.value,t)}return!0}function A(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function re(e,t,n){let r=t.split(`.`),i=e;for(let e=0;e<r.length-1;e++){let t=r[e];t!=null&&t!==``&&((!(t in i)||typeof i[t]!=`object`||i[t]===null)&&(i[t]={}),i=i[t])}let a=r[r.length-1];a!=null&&a!==``&&(i[a]=n)}function j(e,t){let n=t.split(`.`),r=e;for(let e of n)if(e!==``&&typeof r==`object`&&r)r=r[e];else return;return r}function M(t,r){if(A(t))return t;if(r==null||r===``)return e.isAbsolute(t)?t:e.resolve(n.cwd(),t);if(A(r))try{let e=new URL(`.`,r);return new URL(t,e).href}catch{throw Error(`Failed to resolve file path '${t}' relative to source URL '${r}'`)}let i=e.dirname(r);return e.isAbsolute(t)?t:e.resolve(i,t)}async function N(n){let{file:r,sourceUrl:a,tempFileExtension:o=`.tmp`,tempFilePrefix:s=`scaffoldfy`}=n,c=r,l,u,d=!1;if(A(r)){l=r,b(`Fetching remote file: ${l}`);let n=await H(l);d=!0;let a=i.tmpdir(),c=`${s}-${Date.now()}${o}`;u=e.join(a,c),t.writeFileSync(u,n,`utf-8`),b(`Remote file saved to temporary location: ${u}`)}else if(l=M(r,a),A(l)){b(`Fetching remote file: ${l}`);let n=await H(l);d=!0;let r=i.tmpdir(),a=`${s}-${Date.now()}${o}`;u=e.join(r,a),t.writeFileSync(u,n,`utf-8`),b(`Remote file saved to temporary location: ${u}`)}else{if(!t.existsSync(l))throw Error(`File not found: ${l}`);u=l,b(`Using local file: ${u}`)}return{localFilePath:u,isRemote:d,originalPath:c,resolvedPath:l}}function P(e){if(e.isRemote&&t.existsSync(e.localFilePath))try{t.unlinkSync(e.localFilePath),b(`Temporary file cleaned up: ${e.localFilePath}`)}catch(e){b(`Warning: Failed to clean up temporary file: ${e instanceof Error?e.message:String(e)}`)}}function F(t){switch(e.extname(t).toLowerCase()){case`.js`:case`.cjs`:case`.mjs`:return`node`;case`.sh`:return`bash`;case`.bash`:return`bash`;case`.ps1`:return`pwsh`;default:return}}function I(e,t){switch(e){case`node`:return`node "${t}"`;case`bash`:return`bash "${t}"`;case`sh`:return`sh "${t}"`;case`pwsh`:return`pwsh -File "${t}"`;case`powershell`:return`powershell -File "${t}"`;default:return`node "${t}"`}}function L(e){switch(e){case`node`:return`.js`;case`bash`:case`sh`:return`.sh`;case`pwsh`:case`powershell`:return`.ps1`;default:return`.js`}}async function R(t,r){let i=V(t.file,r),o=t.args?.map(e=>V(e,r))??[],s={};if(t.parameters)for(let[e,n]of Object.entries(t.parameters))s[e]=V(n,r);let c=t.cwd!=null&&t.cwd!==``?e.join(n.cwd(),V(t.cwd,r)):n.cwd(),l=await N({file:i,...t.sourceUrl!=null&&t.sourceUrl!==``&&{sourceUrl:t.sourceUrl},tempFileExtension:L(t.runtime??F(i)??`node`),tempFilePrefix:`scaffoldfy-exec`}),{localFilePath:u}=l,d=t.runtime??F(u)??`node`;!t.runtime&&!F(u)&&T(`Could not detect runtime from file extension, defaulting to 'node'`,`warn`);try{let e=I(d,u),r=o.join(` `),i=r?`${e} ${r}`:e;b(`Executing: ${i}`);let l=a(i,{cwd:c,stdio:t.captureOutput?[`pipe`,`pipe`,`pipe`]:`inherit`,env:{...n.env,...s},encoding:t.captureOutput?`utf-8`:void 0});if(t.captureOutput)return b(`Script executed successfully with output`),typeof l==`string`?l:void 0;b(`Script executed successfully`);return}finally{P(l)}}async function z(e,t){let{id:n,contextType:r,context:i,sourceUrl:o}=t;if(e==null)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let s=e;if(s.type===`conditional`){if(!i){T(`${r} "${n}": conditional value requires context but none provided`,`warn`);return}if(typeof s.condition!=`string`){T(`${r} "${n}": conditional value must have a string condition`,`error`);return}try{let e=E(s.condition,i)?s.ifTrue:s.ifFalse;return typeof e==`object`&&e?await z(e,t):e}catch(e){T(`${r} "${n}": failed to evaluate conditional value: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(s.type===`exec`){let e=s.value;if(typeof e!=`string`){T(`${r} "${n}": exec value must have a string command`,`error`);return}try{return B(a(e,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim())}catch(e){T(`${r} "${n}": failed to execute command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(s.type===`exec-file`){let e=s;if(typeof e.file!=`string`){T(`${r} "${n}": exec-file value must have a file path`,`error`);return}try{let t=await R({file:e.file,...e.runtime!=null&&e.runtime.trim()!==``&&{runtime:e.runtime},...e.args&&{args:e.args},...e.parameters&&{parameters:e.parameters},...e.cwd!==void 0&&e.cwd.trim()!==``&&{cwd:e.cwd},...o!=null&&{sourceUrl:o},captureOutput:!0},i??{});return t===void 0?void 0:B(t.trim())}catch(e){T(`${r} "${n}": failed to execute script file: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(s.type===`static`)return s.value;if(s.type===`interpolate`){let e=s.value;if(typeof e!=`string`){T(`${r} "${n}": interpolate value must be a string with {{variable}} placeholders`,`error`);return}if(!i)return T(`${r} "${n}": interpolate value requires context but none provided`,`warn`),e;try{return V(e,i)}catch(t){return T(`${r} "${n}": failed to interpolate value: ${t instanceof Error?t.message:`Unknown error`}`,`warn`),e}}if(s.type!==void 0){T(`${r} "${n}": unknown value type "${s.type}". Expected "static", "exec", "exec-file", "conditional", or "interpolate".`,`error`);return}return e}function B(e){if(e.startsWith(`{`)||e.startsWith(`[`))try{return JSON.parse(e)}catch{return e}if(/^-?\d+(?:\.\d+)?$/u.test(e)){let t=Number.parseFloat(e);if(!Number.isNaN(t))return t}return e===`true`||e===`false`?e===`true`:e}function V(e,t){return e.replace(/\{\{(?<key>[\w.]+)\}\}/gu,(e,n)=>j(t,n)?.toString()??``)}const ie=r(t.readFile);async function H(e){if(A(e))return U(e);if(!t.existsSync(e))throw u.forPath(e);return ie(e,`utf-8`)}async function U(e){try{let t=await fetch(e);if(!t.ok)throw d.forUrl(e,t.status,t.statusText);return await t.text()}catch(t){throw t instanceof Error&&t.message.includes(`Failed to fetch`)?t:d.forUrl(e,t instanceof Error?t:void 0)}}const W=r(t.readFile);async function G(r,i=new Set){let a=A(r),s;if(s=a||e.isAbsolute(r)?r:e.resolve(n.cwd(),r),o.has(s))return o.get(s);if(i.has(s))throw l.forConfigurationInheritance(i,s);i.add(s);let c;if(a)c=await U(s);else{if(!t.existsSync(s))throw u.forPath(s);c=await W(s,`utf-8`)}let d;try{d=JSON.parse(c)}catch(e){throw f.forFile(s,e instanceof Error?e:Error(String(e)))}if(d.name==null||d.name.trim()===``)throw p.missingName(s);if(!/^[a-z\d]+(?:-[a-z\d]+)*$/u.test(d.name))throw p.invalidNameFormat(s,d.name);if(d.tasks!==void 0&&!Array.isArray(d.tasks))throw p.tasksNotArray(s);d.tasks===void 0&&(d.tasks=[]);for(let e of d.tasks)e.$sourceUrl=s;if(d.variables!==void 0)for(let e of d.variables)e.$sourceUrl=s;if(d.prompts!==void 0)for(let e of d.prompts)e.$sourceUrl=s;return o.set(s,d),d}function K(e){let t=new Map;for(let n of e){let e=t.get(n.name)||[];e.push(n),t.set(n.name,e)}if(Array.from(t.values()).some(e=>e.length>1))return e;let n=new Map,r=new Map,i=new Map;for(let t of e)if(n.set(t.name,t),i.set(t.name,new Set),t.dependencies!=null&&t.dependencies.length>0)for(let e of t.dependencies)i.get(t.name).add(e),r.has(e)||r.set(e,new Set),r.get(e).add(t.name);let a=new Set,o=new Map;for(let t=0;t<e.length;t++){let n=e[t],s=i.get(n.name).size>0,c=r.has(n.name)&&r.get(n.name).size>0;!s&&!c&&(a.add(n.name),o.set(n.name,t))}let s=e.filter(e=>!a.has(e.name)),c=[],u=new Set,d=new Set;function f(e){if(u.has(e))return;if(d.has(e))throw l.forTemplateDependencies(Array.from(d),e);d.add(e);let t=n.get(e);if(t!=null){let t=i.get(e);if(t!=null&&t.size>0)for(let e of t)f(e)}d.delete(e),u.add(e),t!=null&&!a.has(e)&&c.push(t)}for(let e of s)f(e.name);let p=[],m=0;for(let t=0;t<e.length;t++){let n=e[t];a.has(n.name)?p.push(n):m<c.length&&(p.push(c[m]),m++)}return p}async function q(t,r,i,a,o){let s=A(t),c;if(c=s||e.isAbsolute(t)?t:r==null?e.resolve(n.cwd(),t):A(r)?new URL(t,r).href:e.resolve(r,t),i.has(c))return;if(a.has(c))throw l.forConfigurationInheritance(a,c);a.add(c);let u=await G(c),d=A(c)?new URL(`.`,c).href:e.dirname(c);if(u.extends!=null&&u.extends!==``){let e=Array.isArray(u.extends)?u.extends:[u.extends];for(let t of e)await q(t,d,i,a,o)}a.delete(c),i.add(c),o.push(u)}async function J(e,t,n=new Set){let r=[];return await q(e,t,n,new Set,r),K(r)}function Y(e,t,n){let r=new Map;for(let t of e){if(r.has(t.id))throw m.forId(t.id,`task`,r.get(t.id));r.set(t.id,`task`)}if(t!=null)for(let e of t){if(r.has(e.id))throw m.forId(e.id,`variable`,r.get(e.id));r.set(e.id,`variable`)}if(n!=null)for(let e of n){if(r.has(e.id))throw m.forId(e.id,`prompt`,r.get(e.id));r.set(e.id,`prompt`)}}const X={template:[[`template`,`templateFile`]]};function Z(t){if(t==null||t===``)return`current configuration`;if(A(t))return t;let r=n.cwd();return t.startsWith(r)?e.relative(r,t):t}function ae(e,t){if((t.override??`merge`)===`replace`){T(` → Variable "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}T(` → Variable "${t.id}" merged (value replaced)`,`info`);let n=t.$sourceUrl??e.$sourceUrl,r={...e,...t,...n!=null&&{$sourceUrl:n}};return delete r.override,r}function oe(e,t){if((t.override??`merge`)===`replace`){T(` → Prompt "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}T(` → Prompt "${t.id}" merged`,`info`);let n=t.$sourceUrl??e.$sourceUrl,r={...e,...t,...n!=null&&{$sourceUrl:n}};return delete r.override,r}function Q(e){if(e.length===0)return{name:`Empty Configuration`,tasks:[]};if(e.length===1){let t=e[0];return Y(t.tasks??[],t.variables,t.prompts),t}let t=new Map,n=new Map,r=new Map,i={};for(let a of e){if(a.enabled!=null&&(i[a.name]=a.enabled),a.enabled===!1){T(`⊘ Skipping disabled configuration "${a.name}" - its tasks, prompts, and variables will not be included`,`info`);continue}if(a.prompts!=null)for(let e of a.prompts)if(r.has(e.id)){if(e.override==null)throw h.forPrompt(e.id);let t=oe(r.get(e.id),e);a.enabled!=null&&(t.$configEnabled=a.enabled),r.set(e.id,t)}else{let t={...e};a.enabled!=null&&(t.$configEnabled=a.enabled),r.set(e.id,t)}if(a.variables!=null)for(let e of a.variables)if(n.has(e.id)){if(e.override==null)throw h.forVariable(e.id);let t=ae(n.get(e.id),e);a.enabled!=null&&(t.$configEnabled=a.enabled),n.set(e.id,t)}else{let t={...e};a.enabled!=null&&(t.$configEnabled=a.enabled),n.set(e.id,t)}for(let e of a.tasks??[])if(t.has(e.id)){if(e.override==null){let n=t.get(e.id);throw h.forTask(e.id,Z(n.$sourceUrl),Z(e.$sourceUrl))}let n=le(t.get(e.id),e);a.enabled!=null&&(n.$configEnabled=a.enabled),t.set(e.id,n)}else{let n={...e};a.enabled!=null&&(n.$configEnabled=a.enabled),t.set(e.id,n)}}let a=Array.from(t.values()),o=r.size>0?Array.from(r.values()):void 0,s=n.size>0?Array.from(n.values()):void 0;Y(a,s,o);let c=e[e.length-1],l={name:c.name,tasks:a};return c.description!=null&&(l.description=c.description),c.dependencies!=null&&(l.dependencies=c.dependencies),c.enabled!=null&&(l.enabled=c.enabled),o!=null&&(l.prompts=o),s!=null&&(l.variables=s),l}function se(e,t){let n=X[e];if(!n)return null;for(let e of n){let n=e.filter(e=>e in t&&t[e]!=null);if(n.length>1)return n}return null}function ce(e,t,n){let r={...e},i=X[n]??[];for(let[e,n]of Object.entries(t)){for(let t of i)if(t.includes(e)){for(let n of t)n!==e&&delete r[n];break}r[e]=n}return r}function le(e,t){if((t.override??`merge`)===`replace`){T(` → Task "${t.id}" using 'replace' strategy - completely replacing base task`,`info`),T(` Base: ${Z(e.$sourceUrl)}`,`info`),T(` Override: ${Z(t.$sourceUrl)}`,`info`);let{override:n,...r}=t;return r}T(` → Merging task "${t.id}"`,`info`),T(` Base: ${Z(e.$sourceUrl)}`,`info`),T(` Override: ${Z(t.$sourceUrl)}`,`info`);let n;if(typeof e.config==`object`&&e.config!==null&&typeof t.config==`object`&&t.config!==null){n=ce(e.config,t.config,t.type);let r=se(t.type,n);r!==null&&r.length>0&&(T(` ⚠️ Warning: Conflicting config fields detected: ${r.join(`, `)}`,`warn`),T(` Please use override: "replace" or specify only one of these fields`,`warn`))}else n=t.config??e.config;let r=[...e.dependencies??[],...t.dependencies??[]],i=r.length>0?[...new Set(r)]:void 0,a=t.$sourceUrl??e.$sourceUrl,o={...e,...t,config:n,...i!=null&&{dependencies:i},...a!=null&&{$sourceUrl:a}};return delete o.override,o}async function $(e,t,n=new Set){return Q(await J(e,t,n))}async function ue(e,t){if(b(`Loading tasks from ${e}...`),t?.sequential===!0){let t=await J(e);return b(`Loaded ${t.length} configuration(s) for processing`),{tasks:[],configs:t}}let n=await $(e);T(`Loaded ${n.tasks?.length??0} task(s)`,`info`),n.extends!=null&&n.extends!==``&&T(`Extended from: ${(Array.isArray(n.extends)?n.extends:[n.extends]).join(`, `)}`,`info`),n.prompts!=null&&n.prompts.length>0&&T(`Found ${n.prompts.length} top-level prompt(s)`,`info`),n.variables!=null&&n.variables.length>0&&T(`Found ${n.variables.length} top-level variable(s)`,`info`);let r={tasks:n.tasks??[]};return n.prompts!=null&&(r.prompts=n.prompts),n.variables!=null&&(r.variables=n.variables),n.enabled!=null&&(r.enabled=n.enabled),n.transformers!=null&&(r.transformers=n.transformers),r}export{ee as C,c as D,l as E,s as O,T as S,C as T,D as _,H as a,w as b,R as c,M as d,j as f,te as g,k as h,G as i,P as l,A as m,ue as n,V as o,re as p,Q as r,z as s,$ as t,N as u,E as v,S as w,x,b as y};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require(`./chunk-DjWAcSYV.cjs`);let t=require(`node:fs`);t=e.t(t);let n=require(`node:path`);n=e.t(n);let r=require(`node:process`);r=e.t(r);let i=require(`node:util`);i=e.t(i),require(`handlebars`);let a=require(`node:os`);a=e.t(a);let o=require(`node:child_process`);o=e.t(o);const s=new Map;function c(){s.clear()}var l=class extends Error{constructor(e,t){super(e),this.code=t,this.name=this.constructor.name}},u=class e extends l{constructor(e,t,n){super(e,`CIRCULAR_DEPENDENCY`),this.dependencyChain=t,this.resolvedPath=n,this.name=`CircularDependencyError`}static forConfigurationInheritance(t,n){let r=Array.from(t);return new e(`Circular dependency detected: ${r.join(` -> `)} -> ${n}`,r,n)}static forTemplateInheritance(t,n){return e.forConfigurationInheritance(t,n)}static forTaskDependency(t){return new e(`Circular dependency detected involving task: ${t}`,[t])}static forTemplateDependencies(t,n){let r=[...t,n];return new e(`Circular dependency detected in template dependencies: ${r.join(` -> `)}`,r)}},d=class e extends l{constructor(e,t){super(e,`CONFIG_FILE_NOT_FOUND`),this.filePath=t,this.name=`ConfigFileNotFoundError`}static forPath(t){return new e(`Configuration file not found: ${t}`,t)}},f=class e extends l{constructor(e,t,n){super(e,`CONFIG_FETCH_ERROR`),this.url=t,this.originalError=n,this.name=`ConfigFetchError`}static forUrl(t,n,r){return typeof n==`number`?new e(`Failed to fetch configuration from ${t}: ${n} ${r??``}`.trim(),t):new e(`Failed to fetch configuration from ${t}: ${n?.message??String(n??`Unknown error`)}`,t,n)}},p=class e extends l{constructor(e,t,n){super(e,`CONFIG_PARSE_ERROR`),this.filePath=t,this.originalError=n,this.name=`ConfigParseError`}static forFile(t,n){return new e(`Failed to parse configuration file ${t}: ${n.message}`,t,n)}},m=class e extends l{constructor(e,t){super(e,`INVALID_CONFIG`),this.filePath=t,this.name=`InvalidConfigError`}static forFile(t,n){return new e(`Invalid configuration file ${t}: ${n}`,t)}static tasksNotArray(t){return new e(`Invalid configuration file ${t}: 'tasks' must be an array if provided`,t)}static missingName(t){return new e(`Invalid configuration file ${t}: 'name' field is required`,t)}static invalidNameFormat(t,n){return new e(`Invalid configuration file ${t}: 'name' field "${n}" must contain only lowercase letters, digits, and hyphens. It cannot start or end with a hyphen, and cannot contain consecutive hyphens.`,t)}},h=class e extends l{constructor(e,t,n,r){super(e,`DUPLICATE_ID`),this.id=t,this.type=n,this.existingType=r,this.name=`DuplicateIdError`}static forId(t,n,r){return new e(`Duplicate ID "${t}" found in ${n}. This ID is already used in ${r??`unknown`}`,t,n,r)}},g=class e extends l{constructor(e,t,n,r,i){super(e,`ID_CONFLICT`),this.id=t,this.type=n,this.baseSource=r,this.overrideSource=i,this.name=`IdConflictError`}static forTask(t,n,r){return new e(`Task ID conflict: "${t}" is defined in multiple templates.\n Base task from: ${n??`unknown`}\n Override task from: ${r??`unknown`}\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the task.\n Task is being extended/overridden but no override strategy was specified.`,t,`task`,n,r)}static forVariable(t){return new e(`Variable ID conflict: "${t}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the variable.\n Variable is being extended/overridden but no override strategy was specified.`,t,`variable`)}static forPrompt(t){return new e(`Prompt ID conflict: "${t}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the prompt.\n Prompt is being extended/overridden but no override strategy was specified.`,t,`prompt`)}};let _=!1;function v(e){_=e}const y={debug:`🐛`,info:`ℹ`,success:`✓`,warn:`⚠`,error:`✗`},b={debug:`\x1B[35m`,info:`\x1B[36m`,success:`\x1B[32m`,warn:`\x1B[33m`,error:`\x1B[31m`},x=`\x1B[0m`;function S(e){_&&console.log(`${b.debug}${y.debug} ${e}${x}`)}function C(e){console.log(`${b.info}${y.info} ${e}${x}`)}function w(e){console.log(`${b.success}${y.success} ${e}${x}`)}function T(e){console.log(`${b.warn}${y.warn} ${e}${x}`)}function E(e){console.log(`${b.error}${y.error} ${e}${x}`)}function D(e,t=`info`){switch(t){case`debug`:S(e);break;case`info`:C(e);break;case`success`:w(e);break;case`warn`:T(e);break;case`error`:E(e);break}}function O(e,t,n){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch(t){return n?.lazy===!0&&t instanceof ReferenceError?!0:(n?.silent!==!0&&(D(`Failed to evaluate condition: ${e}`,`warn`),t instanceof Error&&D(` Error: ${t.message}`,`warn`)),!1)}}function ee(e,t,n){if(e===void 0)return!0;if(typeof e==`boolean`)return e;if(typeof e==`object`&&`type`in e){if(e.type===`exec`)return n?.lazy===!0;if(e.type===`condition`)return O(e.value,t,n?.lazy===!0?{lazy:!0}:void 0)}return!1}async function k(e,t,n){if(e===void 0)return!0;if(typeof e==`boolean`)return e;if(typeof e==`object`&&`type`in e){if(e.type===`exec`)try{let{execSync:n}=await import(`node:child_process`),{interpolateTemplate:r}=await Promise.resolve().then(()=>require(`./utils-C-yGs5_V.cjs`)),i=n(r(e.value,t),{encoding:`utf-8`}).trim();if(i===``||i===`0`)return!1;let a=i.toLowerCase();return!(a===`false`||a===`no`)}catch(t){let{log:n}=await Promise.resolve().then(()=>require(`./utils-C-yGs5_V.cjs`));return n(`Failed to execute enabled command: ${e.value}`,`warn`),t instanceof Error&&n(` Error: ${t.message}`,`warn`),!1}if(e.type===`condition`)return O(e.value,t,n?.lazy===!0?{lazy:!0}:void 0)}return!1}function A(e,t){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch{return!0}}function te(e){return e===void 0||typeof e==`boolean`?e:typeof e==`string`?{type:`condition`,value:e}:typeof e==`object`&&e&&`condition`in e&&!(`type`in e)?{type:`condition`,value:e.condition}:e}async function j(e,t){let n=te(e);if(n===void 0)return!0;if(typeof n==`boolean`)return n;if(typeof n==`object`&&n&&`type`in n){if(n.type===`exec`)try{let{execSync:e}=await import(`node:child_process`),{interpolateTemplate:r}=await Promise.resolve().then(()=>require(`./utils-C-yGs5_V.cjs`));return e(r(n.value,t),{encoding:`utf-8`,stdio:`ignore`}),!0}catch(e){let{log:t}=await Promise.resolve().then(()=>require(`./utils-C-yGs5_V.cjs`));if(typeof e==`object`&&e&&`status`in e&&typeof e.status==`number`){let{status:r}=e;if(r>=1&&r<=255)return t(`Failed to execute required command: ${n.value}`,`warn`),e instanceof Error&&t(` Error: ${e.message}`,`warn`),!1}return t(`Failed to execute required command: ${n.value}`,`warn`),e instanceof Error&&t(` Error: ${e.message}`,`warn`),!1}if(n.type===`condition`)return A(n.value,t)}return!0}function M(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function ne(e,t,n){let r=t.split(`.`),i=e;for(let e=0;e<r.length-1;e++){let t=r[e];t!=null&&t!==``&&((!(t in i)||typeof i[t]!=`object`||i[t]===null)&&(i[t]={}),i=i[t])}let a=r[r.length-1];a!=null&&a!==``&&(i[a]=n)}function N(e,t){let n=t.split(`.`),r=e;for(let e of n)if(e!==``&&typeof r==`object`&&r)r=r[e];else return;return r}function P(e,t){if(M(e))return e;if(t==null||t===``)return n.default.isAbsolute(e)?e:n.default.resolve(r.default.cwd(),e);if(M(t))try{let n=new URL(`.`,t);return new URL(e,n).href}catch{throw Error(`Failed to resolve file path '${e}' relative to source URL '${t}'`)}let i=n.default.dirname(t);return n.default.isAbsolute(e)?e:n.default.resolve(i,e)}async function F(e){let{file:r,sourceUrl:i,tempFileExtension:o=`.tmp`,tempFilePrefix:s=`scaffoldfy`}=e,c=r,l,u,d=!1;if(M(r)){l=r,S(`Fetching remote file: ${l}`);let e=await H(l);d=!0;let i=a.default.tmpdir(),c=`${s}-${Date.now()}${o}`;u=n.default.join(i,c),t.default.writeFileSync(u,e,`utf-8`),S(`Remote file saved to temporary location: ${u}`)}else if(l=P(r,i),M(l)){S(`Fetching remote file: ${l}`);let e=await H(l);d=!0;let r=a.default.tmpdir(),i=`${s}-${Date.now()}${o}`;u=n.default.join(r,i),t.default.writeFileSync(u,e,`utf-8`),S(`Remote file saved to temporary location: ${u}`)}else{if(!t.default.existsSync(l))throw Error(`File not found: ${l}`);u=l,S(`Using local file: ${u}`)}return{localFilePath:u,isRemote:d,originalPath:c,resolvedPath:l}}function I(e){if(e.isRemote&&t.default.existsSync(e.localFilePath))try{t.default.unlinkSync(e.localFilePath),S(`Temporary file cleaned up: ${e.localFilePath}`)}catch(e){S(`Warning: Failed to clean up temporary file: ${e instanceof Error?e.message:String(e)}`)}}function L(e){switch(n.default.extname(e).toLowerCase()){case`.js`:case`.cjs`:case`.mjs`:return`node`;case`.sh`:return`bash`;case`.bash`:return`bash`;case`.ps1`:return`pwsh`;default:return}}function re(e,t){switch(e){case`node`:return`node "${t}"`;case`bash`:return`bash "${t}"`;case`sh`:return`sh "${t}"`;case`pwsh`:return`pwsh -File "${t}"`;case`powershell`:return`powershell -File "${t}"`;default:return`node "${t}"`}}function ie(e){switch(e){case`node`:return`.js`;case`bash`:case`sh`:return`.sh`;case`pwsh`:case`powershell`:return`.ps1`;default:return`.js`}}async function R(e,t){let i=V(e.file,t),a=e.args?.map(e=>V(e,t))??[],s={};if(e.parameters)for(let[n,r]of Object.entries(e.parameters))s[n]=V(r,t);let c=e.cwd!=null&&e.cwd!==``?n.default.join(r.default.cwd(),V(e.cwd,t)):r.default.cwd(),l=await F({file:i,...e.sourceUrl!=null&&e.sourceUrl!==``&&{sourceUrl:e.sourceUrl},tempFileExtension:ie(e.runtime??L(i)??`node`),tempFilePrefix:`scaffoldfy-exec`}),{localFilePath:u}=l,d=e.runtime??L(u)??`node`;!e.runtime&&!L(u)&&D(`Could not detect runtime from file extension, defaulting to 'node'`,`warn`);try{let t=re(d,u),n=a.join(` `),i=n?`${t} ${n}`:t;S(`Executing: ${i}`);let l=(0,o.execSync)(i,{cwd:c,stdio:e.captureOutput?[`pipe`,`pipe`,`pipe`]:`inherit`,env:{...r.default.env,...s},encoding:e.captureOutput?`utf-8`:void 0});if(e.captureOutput)return S(`Script executed successfully with output`),typeof l==`string`?l:void 0;S(`Script executed successfully`);return}finally{I(l)}}async function z(e,t){let{id:n,contextType:r,context:i,sourceUrl:a}=t;if(e==null)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let s=e;if(s.type===`conditional`){if(!i){D(`${r} "${n}": conditional value requires context but none provided`,`warn`);return}if(typeof s.condition!=`string`){D(`${r} "${n}": conditional value must have a string condition`,`error`);return}try{let e=O(s.condition,i)?s.ifTrue:s.ifFalse;return typeof e==`object`&&e?await z(e,t):e}catch(e){D(`${r} "${n}": failed to evaluate conditional value: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(s.type===`exec`){let e=s.value;if(typeof e!=`string`){D(`${r} "${n}": exec value must have a string command`,`error`);return}try{return B((0,o.execSync)(e,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim())}catch(e){D(`${r} "${n}": failed to execute command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(s.type===`exec-file`){let e=s;if(typeof e.file!=`string`){D(`${r} "${n}": exec-file value must have a file path`,`error`);return}try{let t=await R({file:e.file,...e.runtime!=null&&e.runtime.trim()!==``&&{runtime:e.runtime},...e.args&&{args:e.args},...e.parameters&&{parameters:e.parameters},...e.cwd!==void 0&&e.cwd.trim()!==``&&{cwd:e.cwd},...a!=null&&{sourceUrl:a},captureOutput:!0},i??{});return t===void 0?void 0:B(t.trim())}catch(e){D(`${r} "${n}": failed to execute script file: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(s.type===`static`)return s.value;if(s.type===`interpolate`){let e=s.value;if(typeof e!=`string`){D(`${r} "${n}": interpolate value must be a string with {{variable}} placeholders`,`error`);return}if(!i)return D(`${r} "${n}": interpolate value requires context but none provided`,`warn`),e;try{return V(e,i)}catch(t){return D(`${r} "${n}": failed to interpolate value: ${t instanceof Error?t.message:`Unknown error`}`,`warn`),e}}if(s.type!==void 0){D(`${r} "${n}": unknown value type "${s.type}". Expected "static", "exec", "exec-file", "conditional", or "interpolate".`,`error`);return}return e}function B(e){if(e.startsWith(`{`)||e.startsWith(`[`))try{return JSON.parse(e)}catch{return e}if(/^-?\d+(?:\.\d+)?$/u.test(e)){let t=Number.parseFloat(e);if(!Number.isNaN(t))return t}return e===`true`||e===`false`?e===`true`:e}function V(e,t){return e.replace(/\{\{(?<key>[\w.]+)\}\}/gu,(e,n)=>N(t,n)?.toString()??``)}const ae=(0,i.promisify)(t.default.readFile);async function H(e){if(M(e))return U(e);if(!t.default.existsSync(e))throw d.forPath(e);return ae(e,`utf-8`)}async function U(e){try{let t=await fetch(e);if(!t.ok)throw f.forUrl(e,t.status,t.statusText);return await t.text()}catch(t){throw t instanceof Error&&t.message.includes(`Failed to fetch`)?t:f.forUrl(e,t instanceof Error?t:void 0)}}const W=(0,i.promisify)(t.default.readFile);async function G(e,i=new Set){let a=M(e),o;if(o=a||n.default.isAbsolute(e)?e:n.default.resolve(r.default.cwd(),e),s.has(o))return s.get(o);if(i.has(o))throw u.forConfigurationInheritance(i,o);i.add(o);let c;if(a)c=await U(o);else{if(!t.default.existsSync(o))throw d.forPath(o);c=await W(o,`utf-8`)}let l;try{l=JSON.parse(c)}catch(e){throw p.forFile(o,e instanceof Error?e:Error(String(e)))}if(l.name==null||l.name.trim()===``)throw m.missingName(o);if(!/^[a-z\d]+(?:-[a-z\d]+)*$/u.test(l.name))throw m.invalidNameFormat(o,l.name);if(l.tasks!==void 0&&!Array.isArray(l.tasks))throw m.tasksNotArray(o);l.tasks===void 0&&(l.tasks=[]);for(let e of l.tasks)e.$sourceUrl=o;if(l.variables!==void 0)for(let e of l.variables)e.$sourceUrl=o;if(l.prompts!==void 0)for(let e of l.prompts)e.$sourceUrl=o;return s.set(o,l),l}function K(e){let t=new Map;for(let n of e){let e=t.get(n.name)||[];e.push(n),t.set(n.name,e)}if(Array.from(t.values()).some(e=>e.length>1))return e;let n=new Map,r=new Map,i=new Map;for(let t of e)if(n.set(t.name,t),i.set(t.name,new Set),t.dependencies!=null&&t.dependencies.length>0)for(let e of t.dependencies)i.get(t.name).add(e),r.has(e)||r.set(e,new Set),r.get(e).add(t.name);let a=new Set,o=new Map;for(let t=0;t<e.length;t++){let n=e[t],s=i.get(n.name).size>0,c=r.has(n.name)&&r.get(n.name).size>0;!s&&!c&&(a.add(n.name),o.set(n.name,t))}let s=e.filter(e=>!a.has(e.name)),c=[],l=new Set,d=new Set;function f(e){if(l.has(e))return;if(d.has(e))throw u.forTemplateDependencies(Array.from(d),e);d.add(e);let t=n.get(e);if(t!=null){let t=i.get(e);if(t!=null&&t.size>0)for(let e of t)f(e)}d.delete(e),l.add(e),t!=null&&!a.has(e)&&c.push(t)}for(let e of s)f(e.name);let p=[],m=0;for(let t=0;t<e.length;t++){let n=e[t];a.has(n.name)?p.push(n):m<c.length&&(p.push(c[m]),m++)}return p}async function q(e,t,i,a,o){let s=M(e),c;if(c=s||n.default.isAbsolute(e)?e:t==null?n.default.resolve(r.default.cwd(),e):M(t)?new URL(e,t).href:n.default.resolve(t,e),i.has(c))return;if(a.has(c))throw u.forConfigurationInheritance(a,c);a.add(c);let l=await G(c),d=M(c)?new URL(`.`,c).href:n.default.dirname(c);if(l.extends!=null&&l.extends!==``){let e=Array.isArray(l.extends)?l.extends:[l.extends];for(let t of e)await q(t,d,i,a,o)}a.delete(c),i.add(c),o.push(l)}async function J(e,t,n=new Set){let r=[];return await q(e,t,n,new Set,r),K(r)}function Y(e,t,n){let r=new Map;for(let t of e){if(r.has(t.id))throw h.forId(t.id,`task`,r.get(t.id));r.set(t.id,`task`)}if(t!=null)for(let e of t){if(r.has(e.id))throw h.forId(e.id,`variable`,r.get(e.id));r.set(e.id,`variable`)}if(n!=null)for(let e of n){if(r.has(e.id))throw h.forId(e.id,`prompt`,r.get(e.id));r.set(e.id,`prompt`)}}const X={template:[[`template`,`templateFile`]]};function Z(e){if(e==null||e===``)return`current configuration`;if(M(e))return e;let t=r.default.cwd();return e.startsWith(t)?n.default.relative(t,e):e}function oe(e,t){if((t.override??`merge`)===`replace`){D(` → Variable "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}D(` → Variable "${t.id}" merged (value replaced)`,`info`);let n=t.$sourceUrl??e.$sourceUrl,r={...e,...t,...n!=null&&{$sourceUrl:n}};return delete r.override,r}function se(e,t){if((t.override??`merge`)===`replace`){D(` → Prompt "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}D(` → Prompt "${t.id}" merged`,`info`);let n=t.$sourceUrl??e.$sourceUrl,r={...e,...t,...n!=null&&{$sourceUrl:n}};return delete r.override,r}function Q(e){if(e.length===0)return{name:`Empty Configuration`,tasks:[]};if(e.length===1){let t=e[0];return Y(t.tasks??[],t.variables,t.prompts),t}let t=new Map,n=new Map,r=new Map,i={};for(let a of e){if(a.enabled!=null&&(i[a.name]=a.enabled),a.enabled===!1){D(`⊘ Skipping disabled configuration "${a.name}" - its tasks, prompts, and variables will not be included`,`info`);continue}if(a.prompts!=null)for(let e of a.prompts)if(r.has(e.id)){if(e.override==null)throw g.forPrompt(e.id);let t=se(r.get(e.id),e);a.enabled!=null&&(t.$configEnabled=a.enabled),r.set(e.id,t)}else{let t={...e};a.enabled!=null&&(t.$configEnabled=a.enabled),r.set(e.id,t)}if(a.variables!=null)for(let e of a.variables)if(n.has(e.id)){if(e.override==null)throw g.forVariable(e.id);let t=oe(n.get(e.id),e);a.enabled!=null&&(t.$configEnabled=a.enabled),n.set(e.id,t)}else{let t={...e};a.enabled!=null&&(t.$configEnabled=a.enabled),n.set(e.id,t)}for(let e of a.tasks??[])if(t.has(e.id)){if(e.override==null){let n=t.get(e.id);throw g.forTask(e.id,Z(n.$sourceUrl),Z(e.$sourceUrl))}let n=ue(t.get(e.id),e);a.enabled!=null&&(n.$configEnabled=a.enabled),t.set(e.id,n)}else{let n={...e};a.enabled!=null&&(n.$configEnabled=a.enabled),t.set(e.id,n)}}let a=Array.from(t.values()),o=r.size>0?Array.from(r.values()):void 0,s=n.size>0?Array.from(n.values()):void 0;Y(a,s,o);let c=e[e.length-1],l={name:c.name,tasks:a};return c.description!=null&&(l.description=c.description),c.dependencies!=null&&(l.dependencies=c.dependencies),c.enabled!=null&&(l.enabled=c.enabled),o!=null&&(l.prompts=o),s!=null&&(l.variables=s),l}function ce(e,t){let n=X[e];if(!n)return null;for(let e of n){let n=e.filter(e=>e in t&&t[e]!=null);if(n.length>1)return n}return null}function le(e,t,n){let r={...e},i=X[n]??[];for(let[e,n]of Object.entries(t)){for(let t of i)if(t.includes(e)){for(let n of t)n!==e&&delete r[n];break}r[e]=n}return r}function ue(e,t){if((t.override??`merge`)===`replace`){D(` → Task "${t.id}" using 'replace' strategy - completely replacing base task`,`info`),D(` Base: ${Z(e.$sourceUrl)}`,`info`),D(` Override: ${Z(t.$sourceUrl)}`,`info`);let{override:n,...r}=t;return r}D(` → Merging task "${t.id}"`,`info`),D(` Base: ${Z(e.$sourceUrl)}`,`info`),D(` Override: ${Z(t.$sourceUrl)}`,`info`);let n;if(typeof e.config==`object`&&e.config!==null&&typeof t.config==`object`&&t.config!==null){n=le(e.config,t.config,t.type);let r=ce(t.type,n);r!==null&&r.length>0&&(D(` ⚠️ Warning: Conflicting config fields detected: ${r.join(`, `)}`,`warn`),D(` Please use override: "replace" or specify only one of these fields`,`warn`))}else n=t.config??e.config;let r=[...e.dependencies??[],...t.dependencies??[]],i=r.length>0?[...new Set(r)]:void 0,a=t.$sourceUrl??e.$sourceUrl,o={...e,...t,config:n,...i!=null&&{dependencies:i},...a!=null&&{$sourceUrl:a}};return delete o.override,o}async function $(e,t,n=new Set){return Q(await J(e,t,n))}async function de(e,t){if(S(`Loading tasks from ${e}...`),t?.sequential===!0){let t=await J(e);return S(`Loaded ${t.length} configuration(s) for processing`),{tasks:[],configs:t}}let n=await $(e);D(`Loaded ${n.tasks?.length??0} task(s)`,`info`),n.extends!=null&&n.extends!==``&&D(`Extended from: ${(Array.isArray(n.extends)?n.extends:[n.extends]).join(`, `)}`,`info`),n.prompts!=null&&n.prompts.length>0&&D(`Found ${n.prompts.length} top-level prompt(s)`,`info`),n.variables!=null&&n.variables.length>0&&D(`Found ${n.variables.length} top-level variable(s)`,`info`);let r={tasks:n.tasks??[]};return n.prompts!=null&&(r.prompts=n.prompts),n.variables!=null&&(r.variables=n.variables),n.enabled!=null&&(r.enabled=n.enabled),n.transformers!=null&&(r.transformers=n.transformers),r}Object.defineProperty(exports,`C`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`D`,{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,`E`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`O`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`T`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return H}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return ee}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return G}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return de}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return V}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return ne}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return Q}}),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 F}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,`w`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return S}});
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const e=require(`./
|
|
1
|
+
const e=require(`./configurations-KSynsxPT.cjs`),t=require(`./run-tasks-DU00U3qI.cjs`);require(`./config-CQ-mWBG5.cjs`);const n=require(`./validate-scaffoldfy-json-Dkaz9ueq.cjs`);require(`./scaffoldfy-config-json-validator-CpEXHRsI.cjs`);const r=require(`./src-BYAwq7zv.cjs`);exports.clearConfigurationCache=e.O,exports.clearPlugins=t.r,exports.createTaskPlugin=t.i,exports.displayTasksDiff=t.p,exports.executePluginTask=t.a,exports.getDeleteDiff=t._,exports.getExecDiff=t.h,exports.getGitInitDiff=t.g,exports.getPlugin=t.o,exports.getPluginForTaskType=t.s,exports.getRegexReplaceDiff=t.y,exports.getRenameDiff=t.v,exports.getReplaceInFileDiff=t.b,exports.getTaskDiff=t.m,exports.getUpdateJsonDiff=t.x,exports.isPluginTaskType=t.c,exports.listPlugins=t.l,exports.loadAndMergeConfiguration=e.t,exports.loadConfiguration=e.i,exports.loadTasksWithInheritance=e.n,exports.mergeConfigurations=e.r,exports.registerHooks=t.u,exports.registerPlugin=t.d,exports.runWithTasks=r.t,exports.unregisterPlugin=t.f,exports.validateScaffoldfyJsonFile=n.t;
|
package/dist/index.d.cts
CHANGED
|
@@ -228,7 +228,7 @@ interface DefaultValueConfig<T = string | number | boolean> {
|
|
|
228
228
|
* - For explicit static values, use { type: 'static', value: yourValue }
|
|
229
229
|
* - For conditional defaults, use { type: 'conditional', condition: 'expression', ifTrue: value, ifFalse: value }
|
|
230
230
|
* - For interpolate strings, use { type: 'interpolate', value: '{{variable}}' } (will be interpolated with previously resolved prompts/variables)
|
|
231
|
-
* - For exec-file, use { type: 'exec-file', file: 'path/to/script
|
|
231
|
+
* - For exec-file, use { type: 'exec-file', file: 'path/to/script', args: [...], parameters: {...} }
|
|
232
232
|
*/
|
|
233
233
|
type DefaultValue<T = string | number | boolean> = T | DefaultValueConfig<T> | ConditionalDefaultConfig<T> | ExecFileValueConfig;
|
|
234
234
|
/**
|
|
@@ -382,7 +382,13 @@ interface PluginHooks {
|
|
|
382
382
|
onError?: (error: Error, task?: TaskDefinition) => Promise<void>;
|
|
383
383
|
}
|
|
384
384
|
//#endregion
|
|
385
|
-
//#region src/
|
|
385
|
+
//#region src/configurations/cache.d.ts
|
|
386
|
+
/**
|
|
387
|
+
* Clear the configuration cache (useful for testing)
|
|
388
|
+
*/
|
|
389
|
+
declare function clearConfigurationCache(): void;
|
|
390
|
+
//#endregion
|
|
391
|
+
//#region src/configurations/load-configuration.d.ts
|
|
386
392
|
/**
|
|
387
393
|
* Load a configuration file from local path or remote URL
|
|
388
394
|
* @param configPath - Path or URL to the configuration file
|
|
@@ -390,6 +396,8 @@ interface PluginHooks {
|
|
|
390
396
|
* @returns The loaded configuration
|
|
391
397
|
*/
|
|
392
398
|
declare function loadConfiguration(configPath: string, visitedPaths?: Set<string>): Promise<TasksConfiguration>;
|
|
399
|
+
//#endregion
|
|
400
|
+
//#region src/configurations/load-tasks-with-inheritance.d.ts
|
|
393
401
|
/**
|
|
394
402
|
* Recursively load and merge configurations
|
|
395
403
|
* @param configPath - Path or URL to the configuration file
|
|
@@ -398,17 +406,6 @@ declare function loadConfiguration(configPath: string, visitedPaths?: Set<string
|
|
|
398
406
|
* @returns Merged configuration
|
|
399
407
|
*/
|
|
400
408
|
declare function loadAndMergeConfiguration(configPath: string, baseDir?: string, visitedPaths?: Set<string>): Promise<TasksConfiguration>;
|
|
401
|
-
/**
|
|
402
|
-
* Merge multiple configurations
|
|
403
|
-
* Later configurations override earlier ones for conflicting task IDs
|
|
404
|
-
* @param configurations - Array of configurations to merge (in priority order)
|
|
405
|
-
* @returns Merged configuration
|
|
406
|
-
*/
|
|
407
|
-
declare function mergeConfigurations(configurations: TasksConfiguration[]): TasksConfiguration;
|
|
408
|
-
/**
|
|
409
|
-
* Clear the configuration cache (useful for testing)
|
|
410
|
-
*/
|
|
411
|
-
declare function clearConfigurationCache(): void;
|
|
412
409
|
/**
|
|
413
410
|
* Load tasks from a configuration file with configuration inheritance support
|
|
414
411
|
* @param tasksFilePath - Path to the tasks configuration file
|
|
@@ -423,11 +420,20 @@ declare function loadTasksWithInheritance(tasksFilePath: string, options?: {
|
|
|
423
420
|
variables?: VariableDefinition[];
|
|
424
421
|
prompts?: PromptDefinition[];
|
|
425
422
|
enabled?: EnabledValue;
|
|
426
|
-
|
|
423
|
+
configs?: TasksConfiguration[];
|
|
427
424
|
transformers?: Transformer[];
|
|
428
425
|
}>;
|
|
429
426
|
//#endregion
|
|
430
|
-
//#region src/
|
|
427
|
+
//#region src/configurations/merge-configurations.d.ts
|
|
428
|
+
/**
|
|
429
|
+
* Merge multiple configurations
|
|
430
|
+
* Later configurations override earlier ones for conflicting task IDs
|
|
431
|
+
* @param configurations - Array of configurations to merge (in priority order)
|
|
432
|
+
* @returns Merged configuration
|
|
433
|
+
*/
|
|
434
|
+
declare function mergeConfigurations(configurations: TasksConfiguration[]): TasksConfiguration;
|
|
435
|
+
//#endregion
|
|
436
|
+
//#region src/dry-run/content-tasks.d.ts
|
|
431
437
|
/**
|
|
432
438
|
* Get diff for update-json task
|
|
433
439
|
*/
|
|
@@ -440,6 +446,8 @@ declare function getRegexReplaceDiff(config: RegexReplaceConfig, initConfig: Ini
|
|
|
440
446
|
* Get diff for replace-in-file task
|
|
441
447
|
*/
|
|
442
448
|
declare function getReplaceInFileDiff(config: ReplaceInFileConfig, initConfig: InitConfig): Promise<string>;
|
|
449
|
+
//#endregion
|
|
450
|
+
//#region src/dry-run/file-tasks.d.ts
|
|
443
451
|
/**
|
|
444
452
|
* Get diff for delete task
|
|
445
453
|
*/
|
|
@@ -448,6 +456,8 @@ declare function getDeleteDiff(config: DeleteConfig, initConfig: InitConfig): st
|
|
|
448
456
|
* Get diff for rename task
|
|
449
457
|
*/
|
|
450
458
|
declare function getRenameDiff(config: RenameConfig, initConfig: InitConfig): string;
|
|
459
|
+
//#endregion
|
|
460
|
+
//#region src/dry-run/system-tasks.d.ts
|
|
451
461
|
/**
|
|
452
462
|
* Get diff for git-init task
|
|
453
463
|
*/
|
|
@@ -456,6 +466,8 @@ declare function getGitInitDiff(config: GitInitConfig): string;
|
|
|
456
466
|
* Get diff for exec task
|
|
457
467
|
*/
|
|
458
468
|
declare function getExecDiff(config: ExecConfig, initConfig: InitConfig): string;
|
|
469
|
+
//#endregion
|
|
470
|
+
//#region src/dry-run/index.d.ts
|
|
459
471
|
/**
|
|
460
472
|
* Get diff for any task type
|
|
461
473
|
*/
|
package/dist/index.d.ts
CHANGED
|
@@ -228,7 +228,7 @@ interface DefaultValueConfig<T = string | number | boolean> {
|
|
|
228
228
|
* - For explicit static values, use { type: 'static', value: yourValue }
|
|
229
229
|
* - For conditional defaults, use { type: 'conditional', condition: 'expression', ifTrue: value, ifFalse: value }
|
|
230
230
|
* - For interpolate strings, use { type: 'interpolate', value: '{{variable}}' } (will be interpolated with previously resolved prompts/variables)
|
|
231
|
-
* - For exec-file, use { type: 'exec-file', file: 'path/to/script
|
|
231
|
+
* - For exec-file, use { type: 'exec-file', file: 'path/to/script', args: [...], parameters: {...} }
|
|
232
232
|
*/
|
|
233
233
|
type DefaultValue<T = string | number | boolean> = T | DefaultValueConfig<T> | ConditionalDefaultConfig<T> | ExecFileValueConfig;
|
|
234
234
|
/**
|
|
@@ -382,7 +382,13 @@ interface PluginHooks {
|
|
|
382
382
|
onError?: (error: Error, task?: TaskDefinition) => Promise<void>;
|
|
383
383
|
}
|
|
384
384
|
//#endregion
|
|
385
|
-
//#region src/
|
|
385
|
+
//#region src/configurations/cache.d.ts
|
|
386
|
+
/**
|
|
387
|
+
* Clear the configuration cache (useful for testing)
|
|
388
|
+
*/
|
|
389
|
+
declare function clearConfigurationCache(): void;
|
|
390
|
+
//#endregion
|
|
391
|
+
//#region src/configurations/load-configuration.d.ts
|
|
386
392
|
/**
|
|
387
393
|
* Load a configuration file from local path or remote URL
|
|
388
394
|
* @param configPath - Path or URL to the configuration file
|
|
@@ -390,6 +396,8 @@ interface PluginHooks {
|
|
|
390
396
|
* @returns The loaded configuration
|
|
391
397
|
*/
|
|
392
398
|
declare function loadConfiguration(configPath: string, visitedPaths?: Set<string>): Promise<TasksConfiguration>;
|
|
399
|
+
//#endregion
|
|
400
|
+
//#region src/configurations/load-tasks-with-inheritance.d.ts
|
|
393
401
|
/**
|
|
394
402
|
* Recursively load and merge configurations
|
|
395
403
|
* @param configPath - Path or URL to the configuration file
|
|
@@ -398,17 +406,6 @@ declare function loadConfiguration(configPath: string, visitedPaths?: Set<string
|
|
|
398
406
|
* @returns Merged configuration
|
|
399
407
|
*/
|
|
400
408
|
declare function loadAndMergeConfiguration(configPath: string, baseDir?: string, visitedPaths?: Set<string>): Promise<TasksConfiguration>;
|
|
401
|
-
/**
|
|
402
|
-
* Merge multiple configurations
|
|
403
|
-
* Later configurations override earlier ones for conflicting task IDs
|
|
404
|
-
* @param configurations - Array of configurations to merge (in priority order)
|
|
405
|
-
* @returns Merged configuration
|
|
406
|
-
*/
|
|
407
|
-
declare function mergeConfigurations(configurations: TasksConfiguration[]): TasksConfiguration;
|
|
408
|
-
/**
|
|
409
|
-
* Clear the configuration cache (useful for testing)
|
|
410
|
-
*/
|
|
411
|
-
declare function clearConfigurationCache(): void;
|
|
412
409
|
/**
|
|
413
410
|
* Load tasks from a configuration file with configuration inheritance support
|
|
414
411
|
* @param tasksFilePath - Path to the tasks configuration file
|
|
@@ -423,11 +420,20 @@ declare function loadTasksWithInheritance(tasksFilePath: string, options?: {
|
|
|
423
420
|
variables?: VariableDefinition[];
|
|
424
421
|
prompts?: PromptDefinition[];
|
|
425
422
|
enabled?: EnabledValue;
|
|
426
|
-
|
|
423
|
+
configs?: TasksConfiguration[];
|
|
427
424
|
transformers?: Transformer[];
|
|
428
425
|
}>;
|
|
429
426
|
//#endregion
|
|
430
|
-
//#region src/
|
|
427
|
+
//#region src/configurations/merge-configurations.d.ts
|
|
428
|
+
/**
|
|
429
|
+
* Merge multiple configurations
|
|
430
|
+
* Later configurations override earlier ones for conflicting task IDs
|
|
431
|
+
* @param configurations - Array of configurations to merge (in priority order)
|
|
432
|
+
* @returns Merged configuration
|
|
433
|
+
*/
|
|
434
|
+
declare function mergeConfigurations(configurations: TasksConfiguration[]): TasksConfiguration;
|
|
435
|
+
//#endregion
|
|
436
|
+
//#region src/dry-run/content-tasks.d.ts
|
|
431
437
|
/**
|
|
432
438
|
* Get diff for update-json task
|
|
433
439
|
*/
|
|
@@ -440,6 +446,8 @@ declare function getRegexReplaceDiff(config: RegexReplaceConfig, initConfig: Ini
|
|
|
440
446
|
* Get diff for replace-in-file task
|
|
441
447
|
*/
|
|
442
448
|
declare function getReplaceInFileDiff(config: ReplaceInFileConfig, initConfig: InitConfig): Promise<string>;
|
|
449
|
+
//#endregion
|
|
450
|
+
//#region src/dry-run/file-tasks.d.ts
|
|
443
451
|
/**
|
|
444
452
|
* Get diff for delete task
|
|
445
453
|
*/
|
|
@@ -448,6 +456,8 @@ declare function getDeleteDiff(config: DeleteConfig, initConfig: InitConfig): st
|
|
|
448
456
|
* Get diff for rename task
|
|
449
457
|
*/
|
|
450
458
|
declare function getRenameDiff(config: RenameConfig, initConfig: InitConfig): string;
|
|
459
|
+
//#endregion
|
|
460
|
+
//#region src/dry-run/system-tasks.d.ts
|
|
451
461
|
/**
|
|
452
462
|
* Get diff for git-init task
|
|
453
463
|
*/
|
|
@@ -456,6 +466,8 @@ declare function getGitInitDiff(config: GitInitConfig): string;
|
|
|
456
466
|
* Get diff for exec task
|
|
457
467
|
*/
|
|
458
468
|
declare function getExecDiff(config: ExecConfig, initConfig: InitConfig): string;
|
|
469
|
+
//#endregion
|
|
470
|
+
//#region src/dry-run/index.d.ts
|
|
459
471
|
/**
|
|
460
472
|
* Get diff for any task type
|
|
461
473
|
*/
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{O as e,i as t,n,r,t as i}from"./configurations-Bjun5iKX.js";import{_ as a,a as o,b as s,c,d as l,f as u,g as d,h as f,i as p,l as m,m as h,o as g,p as _,r as v,s as y,u as b,v as x,x as S,y as C}from"./run-tasks--KK3MvU0.js";import"./config-nfiOxhDM.js";import{t as w}from"./validate-scaffoldfy-json-Cfq-nQjy.js";import"./scaffoldfy-config-json-validator-DP8-e4Yy.js";import{t as T}from"./src-DBk71cIW.js";export{e as clearConfigurationCache,v as clearPlugins,p as createTaskPlugin,_ as displayTasksDiff,o as executePluginTask,a as getDeleteDiff,f as getExecDiff,d as getGitInitDiff,g as getPlugin,y as getPluginForTaskType,C as getRegexReplaceDiff,x as getRenameDiff,s as getReplaceInFileDiff,h as getTaskDiff,S as getUpdateJsonDiff,c as isPluginTaskType,m as listPlugins,i as loadAndMergeConfiguration,t as loadConfiguration,n as loadTasksWithInheritance,r as mergeConfigurations,b as registerHooks,l as registerPlugin,T as runWithTasks,u as unregisterPlugin,w as validateScaffoldfyJsonFile};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import{D as e,E as t,S as n,T as r,_ as i,a,c as o,d as s,g as c,h as l,o as u,p as d,s as f,v as p,w as m,x as h,y as g}from"./configurations-Bjun5iKX.js";import{t as ee}from"./config-nfiOxhDM.js";import _ from"node:path";import v from"node:fs";import y from"node:process";import{promisify as b}from"node:util";import{execSync as x}from"node:child_process";import{confirm as S,input as C,number as w,password as te,select as ne}from"@inquirer/prompts";import{camelCase as re,capitalCase as ie,constantCase as ae,kebabCase as oe,lowerCase as se,pascalCase as ce,snakeCase as le,upperCase as ue}from"case-anything";var de=class t extends e{constructor(e,t){super(e,`TASK_NOT_FOUND`),this.taskId=t,this.name=`TaskNotFoundError`}static forId(e){return new t(`Task not found: ${e}`,e)}},T=class t extends e{constructor(e,t,n){super(e,`PROMPT_VALIDATION_ERROR`),this.promptId=t,this.reason=n,this.name=`PromptValidationError`}static required(e){return new t(`Prompt "${e}" is required`,e,`required`)}static unknownType(e){return new t(`Unknown prompt type: ${e}`,e,`unknown_type`)}},E=class t extends e{constructor(e,t,n){super(e,`PLUGIN_CONFIGURATION_ERROR`),this.pluginType=t,this.configIssue=n,this.name=`PluginConfigurationError`}static templateMissingTemplateOrFile(){return new t(`Template task requires either "template" (inline) or "templateFile" (file path) to be specified`,`template`,`missing_template_or_file`)}static templateHasBothTemplateAndFile(){return new t(`Template task cannot have both "template" and "templateFile" specified. Use one or the other.`,`template`,`both_template_and_file`)}static createMissingTemplateOrFile(){return new t(`Create task requires either "template" (inline) or "templateFile" (file path) to be specified`,`create`,`missing_template_or_file`)}static createHasBothTemplateAndFile(){return new t(`Create task cannot have both "template" and "templateFile" specified. Use one or the other.`,`create`,`both_template_and_file`)}},D=class t extends e{constructor(e,t,n){super(e,`TRANSFORMER_ERROR`),this.transformerId=t,this.reason=n,this.name=`TransformerError`}static notFound(e){return new t(`Transformer "${e}" not found`,e,`not_found`)}static executionFailed(e,n){return new t(`Transformer "${e}" execution failed: ${n}`,e,`execution_failed`)}static invalidType(e,n){return new t(`Invalid transformer type "${n}" for transformer "${e}"`,e,`invalid_type`)}};const fe=b(v.readFile),O={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function k(e,t){switch(t){case`add`:return`${O.green}+ ${e}${O.reset}`;case`remove`:return`${O.red}- ${e}${O.reset}`;case`context`:return`${O.gray} ${e}${O.reset}`;default:return e}}function A(e,t){let n=e.split(`
|
|
2
|
+
`),r=t.split(`
|
|
3
|
+
`),i=[],a=Math.max(n.length,r.length);for(let e=0;e<a;e++){let t=n[e],a=r[e];t===a?t!==void 0&&i.push(k(t,`context`)):(t!==void 0&&i.push(k(t,`remove`)),a!==void 0&&i.push(k(a,`add`)))}return i}function j(e){return v.existsSync(_.join(y.cwd(),e))}async function M(e){return fe(_.join(y.cwd(),e),`utf-8`)}async function N(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${O.yellow}⊘ Condition not met - task would be skipped${O.reset}`;let n=e.file;if(!j(n))return`${O.red}✗ File not found: ${e.file}${O.reset}`;try{let r=await M(n),i=JSON.parse(r),a={...i};function o(e){if(typeof e==`string`)return u(e,t);if(Array.isArray(e))return e.map(e=>o(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=o(r);return t}return e}for(let[t,n]of Object.entries(e.updates)){let e=o(n);t.includes(`.`)?d(i,t,e):i[t]=e}let s=JSON.stringify(a,null,2),c=JSON.stringify(i,null,2);if(s===c)return`${O.cyan}→ No changes${O.reset}`;let l=A(s,c);return`${O.blue}File: ${e.file}${O.reset}\n${l.join(`
|
|
4
|
+
`)}`}catch(e){return`${O.red}✗ Error: ${e instanceof Error?e.message:String(e)}${O.reset}`}}async function P(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${O.yellow}⊘ Condition not met - task would be skipped${O.reset}`;let n=e.file;if(!j(n))return`${O.red}✗ File not found: ${e.file}${O.reset}`;try{let r=await M(n),i=new RegExp(e.pattern,e.flags??`g`),a=u(e.replacement,t),o=r.replace(i,a);if(r===o)return`${O.cyan}→ No matches found${O.reset}`;let s=A(r,o);return`${O.blue}File: ${e.file}${O.reset}\n${s.join(`
|
|
5
|
+
`)}`}catch(e){return`${O.red}✗ Error: ${e instanceof Error?e.message:String(e)}${O.reset}`}}async function F(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${O.yellow}⊘ Condition not met - task would be skipped${O.reset}`;let n=e.file;if(!j(n))return`${O.red}✗ File not found: ${e.file}${O.reset}`;try{let r=await M(n),i=r;for(let{find:n,replace:i}of e.replacements){let e=u(n,t),a=u(i,t);r=r.replace(e,a)}if(i===r)return`${O.cyan}→ No changes${O.reset}`;let a=A(i,r);return`${O.blue}File: ${e.file}${O.reset}\n${a.join(`
|
|
6
|
+
`)}`}catch(e){return`${O.red}✗ Error: ${e instanceof Error?e.message:String(e)}${O.reset}`}}function I(e){return e.template!=null&&e.template!==``}function L(e){return e.templateFile!=null&&e.templateFile!==``}function pe(e){return e.endsWith(`.hbs`)}function R(e){let t=I(e),n=L(e);return!t&&!n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration requires either "template" (inline) or "templateFile" (file path) to be specified`}:t&&n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration cannot have both "template" and "templateFile" specified. Use one or the other.`}:{isValid:!0,hasInlineTemplate:t,hasTemplateFile:n}}async function z(e,t,n,r={}){let{enableHandlebars:i=!0,sourceUrl:o=n?.$sourceUrl}=r,c=I(e),l=L(e);if(c)return u(e.template,t);if(l){let n=e.templateFile,r=i&&pe(n),c=await a(s(n,o));return r?(await import(`handlebars`)).default.compile(c)(t):u(c,t)}throw Error(`No template content available`)}function me(e){return I(e)?`inline template`:L(e)?`template file: ${e.templateFile}`:`no template source`}async function he(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${O.yellow}⊘ Condition not met - task would be skipped${O.reset}`;if(e.template==null||e.template===``)return`${O.red}✗ No template content provided for file: ${e.file}${O.reset}`;let n=e.file,r=u(e.template,t);if(!j(n)){let t=r.split(`
|
|
7
|
+
`).slice(0,10).join(`
|
|
8
|
+
`),n=r.split(`
|
|
9
|
+
`).length>10;return`${O.blue}File: ${e.file}${O.reset}\n${O.green}+ New file would be created${O.reset}\n${O.gray}Content preview:${O.reset}\n${t}${n?`
|
|
10
|
+
...`:``}`}try{let t=await M(n);if(t===r)return`${O.cyan}→ No changes${O.reset}`;let i=A(t,r);return`${O.blue}File: ${e.file}${O.reset}\n${i.join(`
|
|
11
|
+
`)}`}catch(e){return`${O.red}✗ Error: ${e instanceof Error?e.message:String(e)}${O.reset}`}}async function ge(e,t,n){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${O.yellow}⊘ Condition not met - task would be skipped${O.reset}`;let r=e.file;if(j(r))return`${O.cyan}→ File already exists, would be skipped: ${e.file}${O.reset}`;try{if(I(e)){let r=await z(e,t,n),i=r.split(`
|
|
12
|
+
`).slice(0,10).join(`
|
|
13
|
+
`),a=r.split(`
|
|
14
|
+
`).length>10;return`${O.blue}File: ${e.file}${O.reset}\n${O.green}+ New file would be created${O.reset}\n${O.gray}Content preview:${O.reset}\n${i}${a?`
|
|
15
|
+
...`:``}`}let r=me(e);return`${O.blue}File: ${e.file}${O.reset}\n${O.green}+ New file would be created from ${r}${O.reset}`}catch(e){return`${O.red}✗ Error: ${e instanceof Error?e.message:String(e)}${O.reset}`}}async function _e(e,t,n){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${O.yellow}⊘ Condition not met - task would be skipped${O.reset}`;let r=e.file,i={};e.content==null?e.template!=null&&(i.template=e.template):i.template=e.content,e.templateFile!=null&&(i.templateFile=e.templateFile);try{let a=await z(i,t,n),o=a.split(`
|
|
16
|
+
`).slice(0,10).join(`
|
|
17
|
+
`),s=a.split(`
|
|
18
|
+
`).length>10;return j(r)?`${O.blue}File: ${e.file}${O.reset}\n${O.green}+ Would append content${O.reset}\n${O.gray}Content preview:${O.reset}\n${o}${s?`
|
|
19
|
+
...`:``}`:`${O.blue}File: ${e.file}${O.reset}\n${O.green}+ New file would be created with content${O.reset}\n${O.gray}Content preview:${O.reset}\n${o}${s?`
|
|
20
|
+
...`:``}`}catch(e){return`${O.red}✗ Error: ${e instanceof Error?e.message:String(e)}${O.reset}`}}function ve(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${O.yellow}⊘ Condition not met - task would be skipped${O.reset}`;let n=e.paths.map(e=>u(e,t)).filter(e=>j(e));return n.length===0?`${O.cyan}→ No files/directories to delete${O.reset}`:`${O.red}Would delete:${O.reset}\n${n.map(e=>`${O.red} - ${e}${O.reset}`).join(`
|
|
21
|
+
`)}`}function ye(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${O.yellow}⊘ Condition not met - task would be skipped${O.reset}`;let n=u(e.from,t),r=u(e.to,t);return j(n)?j(r)?`${O.yellow}⚠ Destination already exists: ${r}${O.reset}\n${O.cyan}Would rename: ${n} → ${r}${O.reset}`:`${O.cyan}Would rename: ${n} → ${r}${O.reset}`:`${O.red}✗ Source not found: ${n}${O.reset}`}function be(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${O.yellow}⊘ Condition not met - task would be skipped${O.reset}`;let n=u(e.from,t),r=u(e.to,t);return j(n)?j(r)?`${O.yellow}⚠ Destination already exists: ${r}${O.reset}\n${O.cyan}Would move: ${n} → ${r}${O.reset}`:`${O.cyan}Would move: ${n} → ${r}${O.reset}`:`${O.red}✗ Source not found: ${n}${O.reset}`}function xe(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${O.yellow}⊘ Condition not met - task would be skipped${O.reset}`;let n=u(e.from,t),r=u(e.to,t);if(!j(n))return`${O.red}✗ Source not found: ${n}${O.reset}`;let i=`file`;return j(r)?`${O.yellow}⚠ Destination already exists: ${r}${O.reset}\n${O.cyan}Would copy ${i}: ${n} → ${r}${O.reset}`:`${O.cyan}Would copy ${i}: ${n} → ${r}${O.reset}`}function Se(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${O.yellow}⊘ Condition not met - task would be skipped${O.reset}`;let n=u(e.path,t);return j(n)?`${O.cyan}→ Directory already exists: ${n}${O.reset}`:`${O.green}+ Would create directory: ${n}${O.reset}`}function Ce(e){if(e.condition!=null&&e.condition!==``)return`${O.yellow}⊘ Condition check skipped in dry-run${O.reset}`;let t=j(`.git`),n=[];if(e.removeExisting&&t&&n.push(`${O.red}Would remove existing .git directory${O.reset}`),n.push(`${O.green}Would initialize git repository${O.reset}`),e.initialCommit){let t=e.message??`Initial commit`;n.push(`${O.green}Would create initial commit: "${t}"${O.reset}`)}return n.join(`
|
|
22
|
+
`)}function B(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${O.yellow}⊘ Condition not met - task would be skipped${O.reset}`;let n=u(e.command,t),r=e.cwd==null?y.cwd():u(e.cwd,t);return`${O.yellow}Would execute:${O.reset}\n${O.cyan} Command: ${n}${O.reset}\n${O.cyan} Working directory: ${r}${O.reset}`}async function we(e,t){try{switch(e.type){case`update-json`:return await N(e.config,t);case`write`:return await he(e.config,t);case`create`:return await ge(e.config,t,e);case`regex-replace`:return await P(e.config,t);case`replace-in-file`:return await F(e.config,t);case`delete`:return ve(e.config,t);case`rename`:return ye(e.config,t);case`move`:return be(e.config,t);case`copy`:return xe(e.config,t);case`append`:return await _e(e.config,t,e);case`mkdir`:return Se(e.config,t);case`git-init`:return Ce(e.config);case`exec`:return B(e.config,t);case`exec-file`:return B(e.config,t);default:{let t=e.type;return`${O.yellow}⚠ Diff not available for task type: ${t}${O.reset}`}}}catch(e){return`${O.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${O.reset}`}}async function V(e,t){console.log(`${O.blue}═══════════════════════════════════════════════════════${O.reset}`),console.log(`${O.blue} DRY RUN - Preview of changes${O.reset}`),console.log(`${O.blue}═══════════════════════════════════════════════════════${O.reset}`);for(let n of e){console.log(`${O.cyan}▶ Task: ${n.name}${O.reset}`),n.description!=null&&n.description!==``&&console.log(`${O.gray} ${n.description}${O.reset}`);let e=await we(n,t);console.log(e),console.log(`${O.gray}${`─`.repeat(55)}${O.reset}`)}console.log(`${O.blue}═══════════════════════════════════════════════════════${O.reset}`),console.log(`${O.yellow} No changes were applied (dry-run mode)${O.reset}`),console.log(`${O.blue}═══════════════════════════════════════════════════════${O.reset}`)}const H=new Map,U={},W=new Map;function G(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(H.has(e.name))throw TypeError(`Plugin ${e.name} is already registered`);for(let t of e.taskTypes)if(W.has(t)){let e=W.get(t);throw TypeError(`Task type "${t}" is already registered by plugin "${e}"`)}H.set(e.name,e);for(let t of e.taskTypes)W.set(t,e.name);g(`Registered plugin: ${e.name}${e.version==null?``:` v${e.version}`}`)}function Te(e){let t=H.get(e);if(t!=null){for(let e of t.taskTypes)W.delete(e);H.delete(e)}}function Ee(e){return H.get(e)}function K(e){let t=W.get(e);if(t!=null)return H.get(t)}function q(e){return W.has(e)}function De(){return Array.from(H.keys())}function Oe(){H.clear(),W.clear()}function ke(e){e.beforeAll!=null&&(U.beforeAll=e.beforeAll),e.afterAll!=null&&(U.afterAll=e.afterAll),e.beforeTask!=null&&(U.beforeTask=e.beforeTask),e.afterTask!=null&&(U.afterTask=e.afterTask),e.onError!=null&&(U.onError=e.onError)}async function J(e,...t){let r=U[e];if(r!=null)try{e===`beforeAll`||e===`afterAll`?await r(t[0]):(e===`beforeTask`||e===`afterTask`||e===`onError`)&&await r(t[0],t[1])}catch(t){n(`Error in ${e} hook: ${t instanceof Error?t.message:String(t)}`,`error`)}}async function Ae(e,t,n){let r=K(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}function je(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 Y=new class{transformers=new Map;constructor(){this.registerBuiltInTransformers()}registerBuiltInTransformers(){for(let e of[{id:`lowercase`,type:`lowercase`},{id:`uppercase`,type:`uppercase`},{id:`trim`,type:`trim`},{id:`slugify`,type:`slugify`},{id:`capitalize`,type:`capitalize`},{id:`titlecase`,type:`titlecase`},{id:`camelcase`,type:`camelcase`},{id:`pascalcase`,type:`pascalcase`},{id:`snakecase`,type:`snakecase`},{id:`kebabcase`,type:`kebabcase`},{id:`constantcase`,type:`constantcase`},{id:`alphanumeric`,type:`alphanumeric`},{id:`collapse-spaces`,type:`collapse-spaces`},{id:`remove-spaces`,type:`remove-spaces`},{id:`urlencode`,type:`urlencode`},{id:`dasherize`,type:`dasherize`},{id:`underscore`,type:`underscore`}])this.transformers.set(e.id,e)}register(e){this.transformers.has(e.id)&&n(`Transformer with id "${e.id}" is already registered. Overwriting.`,`warn`),this.transformers.set(e.id,e)}registerAll(e){for(let t of e)this.register(t)}get(e){return this.transformers.get(e)}has(e){return this.transformers.has(e)}async execute(e,t,n={}){let r=this.transformers.get(e);if(!r)throw D.notFound(e);try{return await this.executeTransformer(r,t,n)}catch(t){throw t instanceof D?t:D.executionFailed(e,t instanceof Error?t.message:String(t))}}async executeChain(e,t,n={}){let r=t;for(let t of e)r=await this.execute(t,r,n);return r}async apply(e,t,n={}){return e===void 0?t:this.executeChain(e,t,n)}validate(e){if(e===void 0)return[];let t=e,n=[];for(let e of t)this.has(e)||n.push(`Transformer "${e}" not found`);return n}async executeTransformer(e,t,n){switch(e.type){case`regex`:return this.executeRegex(e,t);case`computed`:return this.executeComputed(e,t,n);case`lowercase`:return this.executeLowercase(t);case`uppercase`:return this.executeUppercase(t);case`trim`:return this.executeTrim(t);case`slugify`:return this.executeSlugify(t);case`capitalize`:return this.executeCapitalize(t);case`titlecase`:return this.executeTitlecase(t);case`camelcase`:return this.executeCamelcase(t);case`pascalcase`:return this.executePascalcase(t);case`snakecase`:return this.executeSnakecase(t);case`kebabcase`:return this.executeKebabcase(t);case`constantcase`:return this.executeConstantcase(t);case`alphanumeric`:return this.executeAlphanumeric(t);case`collapse-spaces`:return this.executeCollapseSpaces(t);case`remove-spaces`:return this.executeRemoveSpaces(t);case`urlencode`:return this.executeUrlencode(t);case`dasherize`:return this.executeDasherize(t);case`underscore`:return this.executeUnderscore(t);case`custom`:return this.executeCustom(e,t,n);case`chain`:return this.executeChainTransformer(e,t,n);default:{let t=e;throw D.invalidType(t.id,t.type)}}}executeRegex(e,t){let n=String(t),{pattern:r,flags:i,replacement:a}=e.config;try{let e=new RegExp(r,i);return n.replace(e,a)}catch(t){throw D.executionFailed(e.id,`Invalid regex pattern: ${t instanceof Error?t.message:String(t)}`)}}executeComputed(e,t,n){let{expression:r}=e.config;try{return Function(`value`,`context`,...Object.keys(n),`return ${r}`)(t,n,...Object.values(n))}catch(t){throw D.executionFailed(e.id,`Expression evaluation failed: ${t instanceof Error?t.message:String(t)}`)}}executeLowercase(e){return se(String(e))}executeUppercase(e){return ue(String(e))}executeTrim(e){return String(e).trim()}executeSlugify(e){return String(e).toLowerCase().trim().replace(/[\s_]+/gu,`-`).replace(/[^\w-]+/gu,``).replace(/-{2,}/gu,`-`).replace(/^-+/u,``).replace(/-+$/u,``)}async executeCustom(e,t,n){let{handler:r}=e.config;if(typeof r==`function`)return r(t,n);throw D.executionFailed(e.id,`String-based custom handlers are not yet supported. Please use function handlers.`)}async executeChainTransformer(e,t,n){let{transformers:r}=e.config;if(r.length===0)throw D.executionFailed(e.id,`Chain transformer must have at least one transformer`);return this.executeChain(r,t,n)}executeCapitalize(e){return ie(String(e))}executeTitlecase(e){return ie(String(e))}executeCamelcase(e){return re(String(e))}executePascalcase(e){return ce(String(e))}executeSnakecase(e){return le(String(e))}executeKebabcase(e){return oe(String(e))}executeConstantcase(e){return ae(String(e))}executeAlphanumeric(e){return String(e).replace(/[^a-zA-Z0-9]/gu,``)}executeCollapseSpaces(e){return String(e).replace(/\s+/gu,` `)}executeRemoveSpaces(e){return String(e).replace(/\s/gu,``)}executeUrlencode(e){return encodeURIComponent(String(e))}executeDasherize(e){return oe(String(e))}executeUnderscore(e){return le(String(e))}clear(){this.transformers.clear()}getIds(){return Array.from(this.transformers.keys())}};async function Me(e,t,n,r){if(e!==void 0)return f(e,{id:t,contextType:`Prompt`,...n!=null&&{context:n},...r?.$sourceUrl!=null&&{sourceUrl:r.$sourceUrl}})}async function Ne(e,t=new Map,r={}){let a={};if(e.length===0)return a;for(let o of e){if(o.$configEnabled!=null&&!await i(o.$configEnabled,{...r,...a}))continue;let e={...r,...a};if(await i(o.enabled,e))try{let r,i=t.get(o.id);switch(o.default!==void 0&&(i=await Me(o.default,o.id,e,o)),o.type){case`input`:{let t={message:o.message};i!==void 0&&(t.default=String(i));let a=await l(o.required,e);if(a!==void 0&&(t.required=a),r=await C(t),a&&(r==null||typeof r==`string`&&r.trim()===``))throw n(`${o.message} is required`,`error`),T.required(o.id);break}case`password`:if(r=await te({message:o.message,mask:`*`}),await l(o.required,e)&&(r==null||typeof r==`string`&&r.trim()===``))throw n(`${o.message} is required`,`error`),T.required(o.id);break;case`number`:{let t={message:o.message};i!==void 0&&(t.default=Number(i));let a=await l(o.required,e);if(a!==void 0&&(t.required=a),o.min!==void 0&&(t.min=o.min),o.max!==void 0&&(t.max=o.max),r=await w(t),a&&r==null)throw n(`${o.message} is required`,`error`),T.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),r=await ne(e);break}case`confirm`:{let e=i===void 0?!1:!!i;r=await S({message:o.message,default:e});break}default:throw n(`Unknown prompt type: ${o.type}`,`error`),T.unknownType(o.type)}o.transformers!==void 0&&(r=await Y.apply(o.transformers,r,{...e,...a})),a[o.id]=r}catch(e){throw e instanceof Error&&n(`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 Me(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.choices.length===0&&t.push(`Select prompt "${r.id}" must have at least one choice`);for(let e of r.choices)(!e.name||e.name.trim()===``)&&t.push(`Select prompt "${r.id}" has a choice with empty name`),e.value===void 0&&t.push(`Select prompt "${r.id}" has a choice with undefined value`)}r.type===`number`&&r.min!==void 0&&r.max!==void 0&&r.min>r.max&&t.push(`Number prompt "${r.id}" has min greater than max`)}return t}const Ie=b(v.appendFile),Le=b(v.readFile),Re=b(v.stat);async function ze(e,t,r){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){n(`Condition not met, skipping append task`,`info`);return}let i=_.join(y.cwd(),e.file),a={};e.content==null?e.template!=null&&(a.template=e.template):a.template=e.content,e.templateFile!=null&&(a.templateFile=e.templateFile);let o=R(a);if(!o.isValid)throw o.error?.includes(`cannot have both`)?E.templateHasBothTemplateAndFile():E.templateMissingTemplateOrFile();let s=await z(a,t,r),c=!1,l=!1;try{await Re(i),c=!0;let t=await Le(i,`utf-8`);t.length>0&&!t.endsWith(`
|
|
23
|
+
`)&&(l=e.newline!==!1)}catch{}c&&l?await Ie(i,`\n${s}`):await Ie(i,s),n(`Appended content to ${e.file}`,`success`)}const Be={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await ze(e.config,t,e)}},Ve=b(v.copyFile),He=b(v.stat),Ue=b(v.mkdir),We=b(v.readdir);async function Ge(e,t){await Ue(t,{recursive:!0});let n=await We(e,{withFileTypes:!0});await Promise.all(n.map(async n=>{let r=_.join(e,n.name),i=_.join(t,n.name);n.isDirectory()?await Ge(r,i):await Ve(r,i)}))}async function Ke(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){n(`Condition not met, skipping copy task`,`info`);return}let r=_.join(y.cwd(),e.from),i=_.join(y.cwd(),e.to),a;try{a=await He(r)}catch{n(`Source path does not exist: ${r}`,`warn`);return}await Ue(_.dirname(i),{recursive:!0}),a.isDirectory()?(await Ge(r,i),n(`Copied directory ${e.from} to ${e.to}`,`success`)):(await Ve(r,i),n(`Copied file ${e.from} to ${e.to}`,`success`))}const qe={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await Ke(e.config,t)}},Je=b(v.writeFile);async function Ye(e,t,r){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){n(`Condition not met, skipping create task`,`info`);return}let i=_.join(y.cwd(),e.file);if(v.existsSync(i)){n(`File already exists, skipping: ${e.file}`,`info`);return}let a=R(e);if(!a.isValid)throw a.error?.includes(`cannot have both`)?E.createHasBothTemplateAndFile():E.createMissingTemplateOrFile();let o=await z(e,t,r),s=_.dirname(i);v.existsSync(s)||v.mkdirSync(s,{recursive:!0}),await Je(i,o),n(`Created file: ${e.file}`,`success`)}const Xe={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await Ye(e.config,t,e)}};async function Ze(e,t){let{paths:r,condition:i}=e;if(i!=null&&i!==``){if(!t){n(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!p(i,t)){n(`Condition not met, skipping deletion`,`info`);return}}for(let e of r){let t=_.join(y.cwd(),e);v.existsSync(t)&&v.rmSync(t,{recursive:!0,force:!0})}}const Qe={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await Ze(e.config,t)}};async function $e(e,t,n){e.condition!=null&&e.condition!==``&&!p(e.condition,t)||await o({file:e.file,...e.runtime&&{runtime:e.runtime},...e.args&&{args:e.args},...e.parameters&&{parameters:e.parameters},...e.cwd!=null&&e.cwd.trim()!==``&&{cwd:e.cwd},...n?.$sourceUrl!=null&&n.$sourceUrl.trim()!==``&&{sourceUrl:n.$sourceUrl},captureOutput:!1},t)}const et={name:`exec-file`,version:`1.0.0`,taskTypes:[`exec-file`],execute:async(e,t,n)=>{n.dryRun||await $e(e.config,t,e)}};async function tt(e,t){if(e.condition!=null&&e.condition!==``){if(!t){n(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!p(e.condition,t)){n(`Condition not met, skipping exec task`,`info`);return}}let r=e.cwd==null?y.cwd():_.join(y.cwd(),e.cwd);x(e.command,{cwd:r,stdio:`inherit`})}const nt={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await tt(e.config,t)}};async function rt(e,t){if(e.condition!=null&&e.condition!==``){if(!t){n(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!p(e.condition,t)){n(`Condition not met, skipping git-init task`,`info`);return}}if(e.removeExisting){let e=_.join(y.cwd(),`.git`);v.existsSync(e)&&v.rmSync(e,{recursive:!0,force:!0})}if(x(`git init`,{stdio:`inherit`}),e.initialCommit){let t=e.message??`Initial commit`;x(`git add .`,{stdio:`inherit`}),x(`git commit -m "${t}"`,{stdio:`inherit`})}}const it={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await rt(e.config,t)}},at=b(v.mkdir);async function ot(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){n(`Condition not met, skipping mkdir task`,`info`);return}await at(_.join(y.cwd(),e.path),{recursive:!0}),n(`Created directory: ${e.path}`,`success`)}const st={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await ot(e.config,t)}},ct=b(v.rename),lt=b(v.stat),ut=b(v.mkdir);async function dt(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){n(`Condition not met, skipping move task`,`info`);return}let r=_.join(y.cwd(),e.from),i=_.join(y.cwd(),e.to);try{await lt(r)}catch{n(`Source path does not exist: ${r}`,`warn`);return}await ut(_.dirname(i),{recursive:!0}),await ct(r,i),n(`Moved ${e.from} to ${e.to}`,`success`)}const ft={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await dt(e.config,t)}},pt=b(v.readFile),mt=b(v.writeFile);async function ht(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){n(`Condition not met, skipping regex-replace task`,`info`);return}let r=_.join(y.cwd(),e.file),{pattern:i}=e,a=e.flags??``,o=e.replacement||``,s=await pt(r,`utf-8`),c=new RegExp(i,a);s=s.replace(c,u(o,t)),await mt(r,s)}const gt={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await ht(e.config,t)}},_t=b(v.rename);async function vt(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){n(`Condition not met, skipping rename task`,`info`);return}let r=_.join(y.cwd(),u(e.from,t)),i=_.join(y.cwd(),u(e.to,t));if(!v.existsSync(r)){n(`Source path does not exist: ${r}`,`warn`);return}await _t(r,i)}const yt={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await vt(e.config,t)}},bt=b(v.readFile),xt=b(v.writeFile);async function St(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){n(`Condition not met, skipping replace-in-file task`,`info`);return}let r=_.join(y.cwd(),e.file),{replacements:i}=e;if(!v.existsSync(r)){n(`File not found: ${r}, skipping`,`warn`);return}let a=await bt(r,`utf-8`);for(let{find:e,replace:n}of i){let r=u(n,t);a=a.replace(new RegExp(e,`gu`),r)}await xt(r,a)}const Ct={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await St(e.config,t)}},wt=b(v.readFile),Tt=b(v.writeFile);async function Et(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){n(`Condition not met, skipping update-json task`,`info`);return}let r=_.join(y.cwd(),e.file),{updates:i}=e,a=await wt(r,`utf-8`),o=JSON.parse(a);function s(e){if(typeof e==`string`)return u(e,t);if(Array.isArray(e))return e.map(e=>s(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=s(r);return t}return e}for(let[e,t]of Object.entries(i)){let n=s(t);e.includes(`.`)?d(o,e,n):o[e]=n}await Tt(r,`${JSON.stringify(o,null,2)}\n`)}const Dt={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await Et(e.config,t)}},Ot=b(v.writeFile);async function kt(e,t,r){let{allowCreate:i=!0}=e;if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){n(`Condition not met, skipping write task`,`info`);return}let a=_.join(y.cwd(),e.file);if(!v.existsSync(a)){if(i===!1)throw Error(`Write task failed: file does not exist (${e.file})`);n(`File not found, creating new file: ${e.file}`,`info`)}let o=R(e);if(!o.isValid)throw o.error?.includes(`cannot have both`)?E.templateHasBothTemplateAndFile():E.templateMissingTemplateOrFile();let s=await z(e,t,r),c=_.dirname(a);v.existsSync(c)||v.mkdirSync(c,{recursive:!0}),await Ot(a,s)}const At={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await kt(e.config,t,e)}};function X(){q(`update-json`)||(G(Dt),G(At),G(Xe),G(gt),G(Ct),G(Qe),G(yt),G(it),G(nt),G(et),G(ft),G(qe),G(Be),G(st))}async function jt(e,t,r=!1){if(X(),r){n(`[DRY RUN] Would execute: ${e.name}`,`info`);return}if(q(e.type)){await Ae(e,t,{dryRun:r});return}throw TypeError(`Unknown task type: ${e.type}`)}async function Mt(e,t,r,i,a=!1){try{return n(`[${r}/${i}] Running: ${e.name}...`,`info`),await jt(e,t,a),n(`[${r}/${i}] Completed: ${e.name}...`,`success`),!0}catch(t){return n(`Failed: ${e.name}`,`error`),t instanceof Error&&(n(` Reason: ${t.message}`,`error`),t.stack!=null&&y.env.DEBUG!=null&&console.error(t.stack)),!1}}function Nt(e){let n=[],r=new Set,i=new Set,a=new Map(e.map(e=>[e.id,e]));function o(e){if(r.has(e))return;if(i.has(e))throw t.forTaskDependency(e);i.add(e);let s=a.get(e);if(!s)throw de.forId(e);if(s.dependencies)for(let e of s.dependencies)o(e);i.delete(e),r.add(e),n.push(s)}for(let t of e)r.has(t.id)||o(t.id);return n}function Z(e){let t=[];for(let n of e)if(!q(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=Pt(n);t.push(...e)}return t}function Pt(e){let t=[],n=e.config,r=typeof n.template==`string`?n.template:void 0,i=typeof n.templateFile==`string`?n.templateFile:void 0,a=R({...r!==void 0&&{template:r},...i!==void 0&&{templateFile:i}});return!a.isValid&&a.error!=null&&a.error!==``&&t.push(`Task "${e.id}" (${e.name}): ${a.error}`),(n.file==null||n.file===``)&&t.push(`Task "${e.id}" (${e.name}): Write task requires "file" property to specify the output file path`),t}function Ft(e){n(`❌ Template validation failed:`,`error`),n(``,`error`);for(let t of e)n(` • ${t}`,`error`);n(``,`error`),n(`Please fix these errors before continuing.`,`error`)}async function Q(e,t=new Map,n={}){let r={};for(let i of e){let e=t.get(i.id);e!==void 0&&(i.transformers!==void 0&&(e=await Y.apply(i.transformers,e,{...n,...r})),r[i.id]=e)}return r}async function $(e,t,n){let r=new Map;for(let a of e){if(n?.skipConditional===!0&&typeof a.value==`object`&&a.value!==null&&!Array.isArray(a.value)&&a.value.type===`conditional`)continue;if(a.$configEnabled!=null){let e={...t};for(let[t,n]of r.entries())e[t]=n;if(!await i(a.$configEnabled,e))continue}let e={...t};for(let[t,n]of r.entries())e[t]=n;let o=await f(a.value,{id:a.id,contextType:`Variable`,context:e,...a.$sourceUrl!=null&&{sourceUrl:a.$sourceUrl}});o!==void 0&&r.set(a.id,o)}return r}function It(e){let t=[],n=new Set;for(let r of e)n.has(r.id)&&t.push(`Duplicate variable ID: "${r.id}"`),n.add(r.id);return t}async function Lt(e,t){let a=ee();if(!await i(t.configEnabled,a,{lazy:!0})){h(`⊘ Template is disabled - skipping all execution`);return}t.transformers!==void 0&&t.transformers.length>0&&(g(`Registering ${t.transformers.length} transformer(s)...`),Y.registerAll(t.transformers)),g(`Registering built-in plugins...`),X(),g(`Validating task configurations...`);let o=Z(e);o.length>0&&(Ft(o),y.exit(1)),g(`All tasks validated successfully`);let s=e.filter(e=>c(e.enabled,ee(),{lazy:!0}));g(`Resolving task dependencies...`);let u=Nt(s);g(`Sorted ${u.length} task(s) by dependencies`),h(`Welcome! Let's execute your tasks.`),t.dryRun&&r(`🔍 DRY RUN MODE - No changes will be made`),h(`This will execute your project tasks based on the defined configuration.`);let d=a,f=[...t.variables??[]];if(f.length>0){let e=It(f);e.length>0&&(n(`❌ Variable validation errors:`,`error`),e.forEach(e=>n(` - ${e}`,`error`)),y.exit(1)),g(`Resolving variable values...`);let t=await Q(f,await $(f,d,{skipConditional:!0}),d);Object.assign(d,t),Object.keys(t).length>0&&(g(`Resolved ${Object.keys(t).length} variable(s)`),g(`Variable values: ${JSON.stringify(t)}`))}let p=t.prompts??[],_=[...p];if(_.length>0){let e=Fe(_);e.length>0&&(n(`❌ Prompt validation errors:`,`error`),e.forEach(e=>n(` - ${e}`,`error`)),y.exit(1)),g(`Resolving prompt default values...`);let t=await Pe(_,d);if(p.length>0){h(`📋 Collecting prompts (available to all tasks):`);let e=await Ne(p,t,d);Object.assign(d,e)}}if(f.length>0){let e=f.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1);if(e.length>0){g(`Re-resolving conditional variables with prompt values...`);let t=await Q(e,await $(e,d),d);Object.assign(d,t),Object.keys(t).length>0&&g(`Resolved ${Object.keys(t).length} conditional variable(s)`)}}if(!await i(t.configEnabled,d)){h(`⊘ Template is disabled after variable resolution - skipping all execution`);return}let v=[];for(let e of u)e.$configEnabled!=null&&!await i(e.$configEnabled,d)||await i(e.enabled,d)&&v.push(e);if(n(`${v.length} of ${u.length} task(s) enabled for execution`,`info`),t.dryRun){await V(v,d),h(`🔍 Dry run completed - no changes were made`),h(`Run without --dry-run to apply changes`);return}g(`Calling beforeAll hook...`),await J(`beforeAll`,d);let b=v.length,x=0,S=0,C=[],w=[];for(let e=0;e<v.length;e++){let n=v[e];n!=null&&(g(`Calling beforeTask hook for task: ${n.name}`),await J(`beforeTask`,n,d),await Mt(n,d,e+1,b,t.dryRun)?(x++,C.push(n.id),g(`Calling afterTask hook for task: ${n.name}`),await J(`afterTask`,n,d)):(await l(n.required,d)&&(S++,w.push(n.name)),g(`Calling onError hook for task: ${n.name}`),await J(`onError`,Error(`Task ${n.name} failed`),n),r(`⚠️ Task "${n.name}" failed, continuing with remaining tasks...`)))}S>0&&(n(`\n❌ Task execution completed with ${S} error(s)`,`error`),n(`Completed: ${x}/${b} tasks`,`info`),n(`Failed tasks: ${w.join(`, `)}`,`error`),y.exit(1)),g(`Calling afterAll hook...`),await J(`afterAll`,d),m(`✅ All tasks completed successfully!`),m(` Completed: ${x}/${b} tasks`)}async function Rt(e,t,a={}){g(`Running templates with sequential variable/prompt resolution...`),g(`Total templates to process: ${e.length}`),g(`Registering built-in plugins...`),X();let o=[];console.log(``),h(`📋 Collecting input...`),console.log(``);for(let t=0;t<e.length;t++){let r=e[t];if(r==null)continue;let s=`=`.repeat(60);if(g(`\n${s}`),g(`Processing template ${t+1}/${e.length}: "${r.name}"`),g(s),g(`Current config keys: ${Object.keys(a).join(`, `)}`),!await i(r.enabled,a)){h(`⊘ Template "${r.name}" is disabled - skipping`),g(` Enabled condition: ${JSON.stringify(r.enabled)}`);continue}let c=r.variables??[];if(c.length>0){g(`Processing ${c.length} variable(s) for template "${r.name}"...`);let e=It(c);e.length>0&&(n(`❌ Variable validation errors:`,`error`),e.forEach(e=>n(` - ${e}`,`error`)),y.exit(1));let t=await Q(c,await $(c,a,{skipConditional:!0}),a);Object.assign(a,t);let i=c.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1),o=0;if(i.length>0){let e=await Q(i,await $(i,a),a);if(o=Object.keys(e).length,Object.assign(a,e),o>0){g(`Resolved ${o} conditional variable(s)`);for(let[t,n]of Object.entries(e))g(` ${t} = ${JSON.stringify(n)}`)}}let s=Object.keys(t).length+o;if(s>0){g(`Total variables resolved for template: ${s}`);for(let[e,n]of Object.entries(t))g(` ${e} = ${JSON.stringify(n)}`)}}let l=r.prompts??[];if(l.length>0){g(`Processing ${l.length} prompt(s) for template "${r.name}"...`);let e=Fe(l);e.length>0&&(n(`❌ Prompt validation errors:`,`error`),e.forEach(e=>n(` - ${e}`,`error`)),y.exit(1));let t=await Ne(l,await Pe(l,a),a);Object.assign(a,t),g(`Collected ${Object.keys(t).length} prompt answer(s)`)}if(!await i(r.enabled,a)){h(`⊘ Template "${r.name}" became disabled after variable/prompt resolution - skipping tasks`);continue}let u=r.tasks??[];u.length>0&&(g(`Found ${u.length} task(s) in template "${r.name}" (will execute later)`),o.push(...u))}if(g(`
|
|
24
|
+
🔧 Validating and filtering all collected tasks...`),o.length===0){n(`No tasks found in any template`,`info`);return}let s=Z(o);s.length>0&&(Ft(s),y.exit(1)),console.log(``),n(`🛠️ Preparing tasks...`,`info`);let c=[];for(let e of o)await i(e.enabled,a)&&c.push(e);if(console.log(``),n(`Found ${o.length} tasks (${c.length} enabled)`,`info`),n(`All tasks validated successfully`,`success`),c.length===0){n(`No enabled tasks to execute`,`info`);return}let u=Nt(c);if(t.dryRun){n(`
|
|
25
|
+
🔍 Dry run - showing task changes...`,`info`),await V(u,a),n(`
|
|
26
|
+
🔍 Dry run completed - no changes were made`,`info`),n(`Run without --dry-run to apply changes`,`info`);return}console.log(``),h(`⚙️ Executing tasks...`),console.log(``),await J(`beforeAll`,a);let d=0,f=0,p=[];for(let e=0;e<u.length;e++){let n=u[e];n!=null&&(await J(`beforeTask`,n,a),await Mt(n,a,e+1,u.length,t.dryRun)?(d++,await J(`afterTask`,n,a)):(await l(n.required,a)&&(f++,p.push(n.name)),await J(`onError`,Error(`Task ${n.name} failed`),n),r(`⚠️ Task "${n.name}" failed, continuing with remaining tasks...`)))}await J(`afterAll`,a),f>0&&(n(`\n❌ Task execution completed with ${f} error(s)`,`error`),n(`Completed: ${d}/${u.length} tasks`,`info`),n(`Failed tasks: ${p.join(`, `)}`,`error`),y.exit(1)),n(`Completed: ${d}/${u.length} tasks`,`success`)}export{ve as _,Ae as a,F as b,q as c,G as d,Te as f,Ce as g,B as h,je as i,De as l,we as m,Rt as n,Ee as o,V as p,Oe as r,K as s,Lt as t,ke as u,ye as v,N as x,P as y};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require(`./configurations-KSynsxPT.cjs`);const e=require(`./run-tasks-DU00U3qI.cjs`);require(`./config-CQ-mWBG5.cjs`),exports.runTasks=e.t,exports.runTemplatesSequentially=e.n;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./configurations-Bjun5iKX.js";import{n as e,t}from"./run-tasks--KK3MvU0.js";import"./config-nfiOxhDM.js";export{t as runTasks,e as runTemplatesSequentially};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
const e=require(`./chunk-DjWAcSYV.cjs`),t=require(`./configurations-KSynsxPT.cjs`),n=require(`./config-CQ-mWBG5.cjs`);let r=require(`node:fs`);r=e.t(r);let i=require(`node:path`);i=e.t(i);let a=require(`node:process`);a=e.t(a);let o=require(`node:util`);o=e.t(o);let s=require(`node:child_process`);s=e.t(s);let c=require(`@inquirer/prompts`);c=e.t(c);let l=require(`case-anything`);l=e.t(l);var u=class e extends t.D{constructor(e,t){super(e,`TASK_NOT_FOUND`),this.taskId=t,this.name=`TaskNotFoundError`}static forId(t){return new e(`Task not found: ${t}`,t)}},d=class e extends t.D{constructor(e,t,n){super(e,`PROMPT_VALIDATION_ERROR`),this.promptId=t,this.reason=n,this.name=`PromptValidationError`}static required(t){return new e(`Prompt "${t}" is required`,t,`required`)}static unknownType(t){return new e(`Unknown prompt type: ${t}`,t,`unknown_type`)}},f=class e extends t.D{constructor(e,t,n){super(e,`PLUGIN_CONFIGURATION_ERROR`),this.pluginType=t,this.configIssue=n,this.name=`PluginConfigurationError`}static templateMissingTemplateOrFile(){return new e(`Template task requires either "template" (inline) or "templateFile" (file path) to be specified`,`template`,`missing_template_or_file`)}static templateHasBothTemplateAndFile(){return new e(`Template task cannot have both "template" and "templateFile" specified. Use one or the other.`,`template`,`both_template_and_file`)}static createMissingTemplateOrFile(){return new e(`Create task requires either "template" (inline) or "templateFile" (file path) to be specified`,`create`,`missing_template_or_file`)}static createHasBothTemplateAndFile(){return new e(`Create task cannot have both "template" and "templateFile" specified. Use one or the other.`,`create`,`both_template_and_file`)}},p=class e extends t.D{constructor(e,t,n){super(e,`TRANSFORMER_ERROR`),this.transformerId=t,this.reason=n,this.name=`TransformerError`}static notFound(t){return new e(`Transformer "${t}" not found`,t,`not_found`)}static executionFailed(t,n){return new e(`Transformer "${t}" execution failed: ${n}`,t,`execution_failed`)}static invalidType(t,n){return new e(`Invalid transformer type "${n}" for transformer "${t}"`,t,`invalid_type`)}};const m=(0,o.promisify)(r.default.readFile),h=2,g=10,ee=55,_={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function v(e,t){switch(t){case`add`:return`${_.green}+ ${e}${_.reset}`;case`remove`:return`${_.red}- ${e}${_.reset}`;case`context`:return`${_.gray} ${e}${_.reset}`;default:return e}}function y(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(v(t,`context`)):(t!==void 0&&i.push(v(t,`remove`)),a!==void 0&&i.push(v(a,`add`)))}return i}function b(e){return r.default.existsSync(i.default.join(a.default.cwd(),e))}async function x(e){return m(i.default.join(a.default.cwd(),e),`utf-8`)}async function S(e,n){if(e.condition!=null&&e.condition!==``&&!t.v(e.condition,n))return`${_.yellow}⊘ Condition not met - task would be skipped${_.reset}`;let r=e.file;if(!b(r))return`${_.red}✗ File not found: ${e.file}${_.reset}`;try{let i=await x(r),a=JSON.parse(i),o={...a};function s(e){if(typeof e==`string`)return t.o(e,n);if(Array.isArray(e))return e.map(e=>s(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=s(r);return t}return e}for(let[n,r]of Object.entries(e.updates)){let e=s(r);n.includes(`.`)?t.p(a,n,e):a[n]=e}let c=JSON.stringify(o,null,2),l=JSON.stringify(a,null,2);if(c===l)return`${_.cyan}→ No changes${_.reset}`;let u=y(c,l);return`${_.blue}File: ${e.file}${_.reset}\n${u.join(`
|
|
4
|
+
`)}`}catch(e){return`${_.red}✗ Error: ${e instanceof Error?e.message:String(e)}${_.reset}`}}async function C(e,n){if(e.condition!=null&&e.condition!==``&&!t.v(e.condition,n))return`${_.yellow}⊘ Condition not met - task would be skipped${_.reset}`;let r=e.file;if(!b(r))return`${_.red}✗ File not found: ${e.file}${_.reset}`;try{let i=await x(r),a=new RegExp(e.pattern,e.flags??`g`),o=t.o(e.replacement,n),s=i.replace(a,o);if(i===s)return`${_.cyan}→ No matches found${_.reset}`;let c=y(i,s);return`${_.blue}File: ${e.file}${_.reset}\n${c.join(`
|
|
5
|
+
`)}`}catch(e){return`${_.red}✗ Error: ${e instanceof Error?e.message:String(e)}${_.reset}`}}async function w(e,n){if(e.condition!=null&&e.condition!==``&&!t.v(e.condition,n))return`${_.yellow}⊘ Condition not met - task would be skipped${_.reset}`;let r=e.file;if(!b(r))return`${_.red}✗ File not found: ${e.file}${_.reset}`;try{let i=await x(r),a=i;for(let{find:r,replace:a}of e.replacements){let e=t.o(r,n),o=t.o(a,n);i=i.replace(e,o)}if(a===i)return`${_.cyan}→ No changes${_.reset}`;let o=y(a,i);return`${_.blue}File: ${e.file}${_.reset}\n${o.join(`
|
|
6
|
+
`)}`}catch(e){return`${_.red}✗ Error: ${e instanceof Error?e.message:String(e)}${_.reset}`}}function T(e){return e.template!=null&&e.template!==``}function E(e){return e.templateFile!=null&&e.templateFile!==``}function te(e){return e.endsWith(`.hbs`)}function D(e){let t=T(e),n=E(e);return!t&&!n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration requires either "template" (inline) or "templateFile" (file path) to be specified`}:t&&n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration cannot have both "template" and "templateFile" specified. Use one or the other.`}:{isValid:!0,hasInlineTemplate:t,hasTemplateFile:n}}async function O(e,n,r,i={}){let{enableHandlebars:a=!0,sourceUrl:o=r?.$sourceUrl}=i,s=T(e),c=E(e);if(s)return t.o(e.template,n);if(c){let r=e.templateFile,i=a&&te(r),s=await t.a(t.d(r,o));return i?(await import(`handlebars`)).default.compile(s)(n):t.o(s,n)}throw Error(`No template content available`)}function ne(e){return T(e)?`inline template`:E(e)?`template file: ${e.templateFile}`:`no template source`}async function re(e,n){if(e.condition!=null&&e.condition!==``&&!t.v(e.condition,n))return`${_.yellow}⊘ Condition not met - task would be skipped${_.reset}`;if(e.template==null||e.template===``)return`${_.red}✗ No template content provided for file: ${e.file}${_.reset}`;let r=e.file,i=t.o(e.template,n);if(!b(r)){let t=i.split(`
|
|
7
|
+
`).slice(0,10).join(`
|
|
8
|
+
`),n=i.split(`
|
|
9
|
+
`).length>10;return`${_.blue}File: ${e.file}${_.reset}\n${_.green}+ New file would be created${_.reset}\n${_.gray}Content preview:${_.reset}\n${t}${n?`
|
|
10
|
+
...`:``}`}try{let t=await x(r);if(t===i)return`${_.cyan}→ No changes${_.reset}`;let n=y(t,i);return`${_.blue}File: ${e.file}${_.reset}\n${n.join(`
|
|
11
|
+
`)}`}catch(e){return`${_.red}✗ Error: ${e instanceof Error?e.message:String(e)}${_.reset}`}}async function ie(e,n,r){if(e.condition!=null&&e.condition!==``&&!t.v(e.condition,n))return`${_.yellow}⊘ Condition not met - task would be skipped${_.reset}`;let i=e.file;if(b(i))return`${_.cyan}→ File already exists, would be skipped: ${e.file}${_.reset}`;try{if(T(e)){let t=await O(e,n,r),i=t.split(`
|
|
12
|
+
`).slice(0,10).join(`
|
|
13
|
+
`),a=t.split(`
|
|
14
|
+
`).length>10;return`${_.blue}File: ${e.file}${_.reset}\n${_.green}+ New file would be created${_.reset}\n${_.gray}Content preview:${_.reset}\n${i}${a?`
|
|
15
|
+
...`:``}`}let t=ne(e);return`${_.blue}File: ${e.file}${_.reset}\n${_.green}+ New file would be created from ${t}${_.reset}`}catch(e){return`${_.red}✗ Error: ${e instanceof Error?e.message:String(e)}${_.reset}`}}async function ae(e,n,r){if(e.condition!=null&&e.condition!==``&&!t.v(e.condition,n))return`${_.yellow}⊘ Condition not met - task would be skipped${_.reset}`;let i=e.file,a={};e.content==null?e.template!=null&&(a.template=e.template):a.template=e.content,e.templateFile!=null&&(a.templateFile=e.templateFile);try{let t=await O(a,n,r),o=t.split(`
|
|
16
|
+
`).slice(0,10).join(`
|
|
17
|
+
`),s=t.split(`
|
|
18
|
+
`).length>10;return b(i)?`${_.blue}File: ${e.file}${_.reset}\n${_.green}+ Would append content${_.reset}\n${_.gray}Content preview:${_.reset}\n${o}${s?`
|
|
19
|
+
...`:``}`:`${_.blue}File: ${e.file}${_.reset}\n${_.green}+ New file would be created with content${_.reset}\n${_.gray}Content preview:${_.reset}\n${o}${s?`
|
|
20
|
+
...`:``}`}catch(e){return`${_.red}✗ Error: ${e instanceof Error?e.message:String(e)}${_.reset}`}}function k(e,n){if(e.condition!=null&&e.condition!==``&&!t.v(e.condition,n))return`${_.yellow}⊘ Condition not met - task would be skipped${_.reset}`;let r=e.paths.map(e=>t.o(e,n)).filter(e=>b(e));return r.length===0?`${_.cyan}→ No files/directories to delete${_.reset}`:`${_.red}Would delete:${_.reset}\n${r.map(e=>`${_.red} - ${e}${_.reset}`).join(`
|
|
21
|
+
`)}`}function oe(e,n){if(e.condition!=null&&e.condition!==``&&!t.v(e.condition,n))return`${_.yellow}⊘ Condition not met - task would be skipped${_.reset}`;let r=t.o(e.from,n),i=t.o(e.to,n);return b(r)?b(i)?`${_.yellow}⚠ Destination already exists: ${i}${_.reset}\n${_.cyan}Would rename: ${r} → ${i}${_.reset}`:`${_.cyan}Would rename: ${r} → ${i}${_.reset}`:`${_.red}✗ Source not found: ${r}${_.reset}`}function se(e,n){if(e.condition!=null&&e.condition!==``&&!t.v(e.condition,n))return`${_.yellow}⊘ Condition not met - task would be skipped${_.reset}`;let r=t.o(e.from,n),i=t.o(e.to,n);return b(r)?b(i)?`${_.yellow}⚠ Destination already exists: ${i}${_.reset}\n${_.cyan}Would move: ${r} → ${i}${_.reset}`:`${_.cyan}Would move: ${r} → ${i}${_.reset}`:`${_.red}✗ Source not found: ${r}${_.reset}`}function ce(e,n){if(e.condition!=null&&e.condition!==``&&!t.v(e.condition,n))return`${_.yellow}⊘ Condition not met - task would be skipped${_.reset}`;let r=t.o(e.from,n),i=t.o(e.to,n);if(!b(r))return`${_.red}✗ Source not found: ${r}${_.reset}`;let a=`file`;return b(i)?`${_.yellow}⚠ Destination already exists: ${i}${_.reset}\n${_.cyan}Would copy ${a}: ${r} → ${i}${_.reset}`:`${_.cyan}Would copy ${a}: ${r} → ${i}${_.reset}`}function le(e,n){if(e.condition!=null&&e.condition!==``&&!t.v(e.condition,n))return`${_.yellow}⊘ Condition not met - task would be skipped${_.reset}`;let r=t.o(e.path,n);return b(r)?`${_.cyan}→ Directory already exists: ${r}${_.reset}`:`${_.green}+ Would create directory: ${r}${_.reset}`}function A(e){if(e.condition!=null&&e.condition!==``)return`${_.yellow}⊘ Condition check skipped in dry-run${_.reset}`;let t=b(`.git`),n=[];if(e.removeExisting&&t&&n.push(`${_.red}Would remove existing .git directory${_.reset}`),n.push(`${_.green}Would initialize git repository${_.reset}`),e.initialCommit){let t=e.message??`Initial commit`;n.push(`${_.green}Would create initial commit: "${t}"${_.reset}`)}return n.join(`
|
|
22
|
+
`)}function j(e,n){if(e.condition!=null&&e.condition!==``&&!t.v(e.condition,n))return`${_.yellow}⊘ Condition not met - task would be skipped${_.reset}`;let r=t.o(e.command,n),i=e.cwd==null?a.default.cwd():t.o(e.cwd,n);return`${_.yellow}Would execute:${_.reset}\n${_.cyan} Command: ${r}${_.reset}\n${_.cyan} Working directory: ${i}${_.reset}`}async function M(e,t){try{switch(e.type){case`update-json`:return await S(e.config,t);case`write`:return await re(e.config,t);case`create`:return await ie(e.config,t,e);case`regex-replace`:return await C(e.config,t);case`replace-in-file`:return await w(e.config,t);case`delete`:return k(e.config,t);case`rename`:return oe(e.config,t);case`move`:return se(e.config,t);case`copy`:return ce(e.config,t);case`append`:return await ae(e.config,t,e);case`mkdir`:return le(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`${_.yellow}⚠ Diff not available for task type: ${t}${_.reset}`}}}catch(e){return`${_.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${_.reset}`}}async function N(e,t){console.log(`${_.blue}═══════════════════════════════════════════════════════${_.reset}`),console.log(`${_.blue} DRY RUN - Preview of changes${_.reset}`),console.log(`${_.blue}═══════════════════════════════════════════════════════${_.reset}`);for(let n of e){console.log(`${_.cyan}▶ Task: ${n.name}${_.reset}`),n.description!=null&&n.description!==``&&console.log(`${_.gray} ${n.description}${_.reset}`);let e=await M(n,t);console.log(e),console.log(`${_.gray}${`─`.repeat(55)}${_.reset}`)}console.log(`${_.blue}═══════════════════════════════════════════════════════${_.reset}`),console.log(`${_.yellow} No changes were applied (dry-run mode)${_.reset}`),console.log(`${_.blue}═══════════════════════════════════════════════════════${_.reset}`)}const P=new Map,F={},I=new Map;function L(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(P.has(e.name))throw TypeError(`Plugin ${e.name} is already registered`);for(let t of e.taskTypes)if(I.has(t)){let e=I.get(t);throw TypeError(`Task type "${t}" is already registered by plugin "${e}"`)}P.set(e.name,e);for(let t of e.taskTypes)I.set(t,e.name);t.y(`Registered plugin: ${e.name}${e.version==null?``:` v${e.version}`}`)}function ue(e){let t=P.get(e);if(t!=null){for(let e of t.taskTypes)I.delete(e);P.delete(e)}}function de(e){return P.get(e)}function R(e){let t=I.get(e);if(t!=null)return P.get(t)}function z(e){return I.has(e)}function fe(){return Array.from(P.keys())}function pe(){P.clear(),I.clear()}function me(e){e.beforeAll!=null&&(F.beforeAll=e.beforeAll),e.afterAll!=null&&(F.afterAll=e.afterAll),e.beforeTask!=null&&(F.beforeTask=e.beforeTask),e.afterTask!=null&&(F.afterTask=e.afterTask),e.onError!=null&&(F.onError=e.onError)}async function B(e,...n){let r=F[e];if(r!=null)try{e===`beforeAll`||e===`afterAll`?await r(n[0]):(e===`beforeTask`||e===`afterTask`||e===`onError`)&&await r(n[0],n[1])}catch(n){t.S(`Error in ${e} hook: ${n instanceof Error?n.message:String(n)}`,`error`)}}async function V(e,t,n){let r=R(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}function he(e,t,n,r){return{name:e,...r?.version!=null&&{version:r.version},taskTypes:[t],execute:n,...r?.getDiff!=null&&{getDiff:r.getDiff},...r?.validate!=null&&{validate:r.validate}}}var ge=class{transformers=new Map;constructor(){this.registerBuiltInTransformers()}registerBuiltInTransformers(){for(let e of[{id:`lowercase`,type:`lowercase`},{id:`uppercase`,type:`uppercase`},{id:`trim`,type:`trim`},{id:`slugify`,type:`slugify`},{id:`capitalize`,type:`capitalize`},{id:`titlecase`,type:`titlecase`},{id:`camelcase`,type:`camelcase`},{id:`pascalcase`,type:`pascalcase`},{id:`snakecase`,type:`snakecase`},{id:`kebabcase`,type:`kebabcase`},{id:`constantcase`,type:`constantcase`},{id:`alphanumeric`,type:`alphanumeric`},{id:`collapse-spaces`,type:`collapse-spaces`},{id:`remove-spaces`,type:`remove-spaces`},{id:`urlencode`,type:`urlencode`},{id:`dasherize`,type:`dasherize`},{id:`underscore`,type:`underscore`}])this.transformers.set(e.id,e)}register(e){this.transformers.has(e.id)&&t.S(`Transformer with id "${e.id}" is already registered. Overwriting.`,`warn`),this.transformers.set(e.id,e)}registerAll(e){for(let t of e)this.register(t)}get(e){return this.transformers.get(e)}has(e){return this.transformers.has(e)}async execute(e,t,n={}){let r=this.transformers.get(e);if(!r)throw p.notFound(e);try{return await this.executeTransformer(r,t,n)}catch(t){throw t instanceof p?t:p.executionFailed(e,t instanceof Error?t.message:String(t))}}async executeChain(e,t,n={}){let r=t;for(let t of e)r=await this.execute(t,r,n);return r}async apply(e,t,n={}){return e===void 0?t:this.executeChain(e,t,n)}validate(e){if(e===void 0)return[];let t=e,n=[];for(let e of t)this.has(e)||n.push(`Transformer "${e}" not found`);return n}async executeTransformer(e,t,n){switch(e.type){case`regex`:return this.executeRegex(e,t);case`computed`:return this.executeComputed(e,t,n);case`lowercase`:return this.executeLowercase(t);case`uppercase`:return this.executeUppercase(t);case`trim`:return this.executeTrim(t);case`slugify`:return this.executeSlugify(t);case`capitalize`:return this.executeCapitalize(t);case`titlecase`:return this.executeTitlecase(t);case`camelcase`:return this.executeCamelcase(t);case`pascalcase`:return this.executePascalcase(t);case`snakecase`:return this.executeSnakecase(t);case`kebabcase`:return this.executeKebabcase(t);case`constantcase`:return this.executeConstantcase(t);case`alphanumeric`:return this.executeAlphanumeric(t);case`collapse-spaces`:return this.executeCollapseSpaces(t);case`remove-spaces`:return this.executeRemoveSpaces(t);case`urlencode`:return this.executeUrlencode(t);case`dasherize`:return this.executeDasherize(t);case`underscore`:return this.executeUnderscore(t);case`custom`:return this.executeCustom(e,t,n);case`chain`:return this.executeChainTransformer(e,t,n);default:{let t=e;throw p.invalidType(t.id,t.type)}}}executeRegex(e,t){let n=String(t),{pattern:r,flags:i,replacement:a}=e.config;try{let e=new RegExp(r,i);return n.replace(e,a)}catch(t){throw p.executionFailed(e.id,`Invalid regex pattern: ${t instanceof Error?t.message:String(t)}`)}}executeComputed(e,t,n){let{expression:r}=e.config;try{return Function(`value`,`context`,...Object.keys(n),`return ${r}`)(t,n,...Object.values(n))}catch(t){throw p.executionFailed(e.id,`Expression evaluation failed: ${t instanceof Error?t.message:String(t)}`)}}executeLowercase(e){return(0,l.lowerCase)(String(e))}executeUppercase(e){return(0,l.upperCase)(String(e))}executeTrim(e){return String(e).trim()}executeSlugify(e){return String(e).toLowerCase().trim().replace(/[\s_]+/gu,`-`).replace(/[^\w-]+/gu,``).replace(/-{2,}/gu,`-`).replace(/^-+/u,``).replace(/-+$/u,``)}async executeCustom(e,t,n){let{handler:r}=e.config;if(typeof r==`function`)return r(t,n);throw p.executionFailed(e.id,`String-based custom handlers are not yet supported. Please use function handlers.`)}async executeChainTransformer(e,t,n){let{transformers:r}=e.config;if(r.length===0)throw p.executionFailed(e.id,`Chain transformer must have at least one transformer`);return this.executeChain(r,t,n)}executeCapitalize(e){return(0,l.capitalCase)(String(e))}executeTitlecase(e){return(0,l.capitalCase)(String(e))}executeCamelcase(e){return(0,l.camelCase)(String(e))}executePascalcase(e){return(0,l.pascalCase)(String(e))}executeSnakecase(e){return(0,l.snakeCase)(String(e))}executeKebabcase(e){return(0,l.kebabCase)(String(e))}executeConstantcase(e){return(0,l.constantCase)(String(e))}executeAlphanumeric(e){return String(e).replace(/[^a-zA-Z0-9]/gu,``)}executeCollapseSpaces(e){return String(e).replace(/\s+/gu,` `)}executeRemoveSpaces(e){return String(e).replace(/\s/gu,``)}executeUrlencode(e){return encodeURIComponent(String(e))}executeDasherize(e){return(0,l.kebabCase)(String(e))}executeUnderscore(e){return(0,l.snakeCase)(String(e))}clear(){this.transformers.clear()}getIds(){return Array.from(this.transformers.keys())}};const H=new ge;async function U(e,n,r,i){if(e!==void 0)return t.s(e,{id:n,contextType:`Prompt`,...r!=null&&{context:r},...i?.$sourceUrl!=null&&{sourceUrl:i.$sourceUrl}})}async function W(e,n=new Map,r={}){let i={};if(e.length===0)return i;for(let a of e){if(a.$configEnabled!=null&&!await t._(a.$configEnabled,{...r,...i}))continue;let e={...r,...i};if(await t._(a.enabled,e))try{let r,o=n.get(a.id);switch(a.default!==void 0&&(o=await U(a.default,a.id,e,a)),a.type){case`input`:{let n={message:a.message};o!==void 0&&(n.default=String(o));let i=await t.h(a.required,e);if(i!==void 0&&(n.required=i),r=await(0,c.input)(n),i&&(r==null||typeof r==`string`&&r.trim()===``))throw t.S(`${a.message} is required`,`error`),d.required(a.id);break}case`password`:if(r=await(0,c.password)({message:a.message,mask:`*`}),await t.h(a.required,e)&&(r==null||typeof r==`string`&&r.trim()===``))throw t.S(`${a.message} is required`,`error`),d.required(a.id);break;case`number`:{let n={message:a.message};o!==void 0&&(n.default=Number(o));let i=await t.h(a.required,e);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,c.number)(n),i&&r==null)throw t.S(`${a.message} is required`,`error`),d.required(a.id);break}case`select`:{let e={message:a.message,choices:a.choices.map(e=>({name:e.name,value:e.value}))};o!==void 0&&(e.default=o),r=await(0,c.select)(e);break}case`confirm`:{let e=o===void 0?!1:!!o;r=await(0,c.confirm)({message:a.message,default:e});break}default:throw t.S(`Unknown prompt type: ${a.type}`,`error`),d.unknownType(a.type)}a.transformers!==void 0&&(r=await H.apply(a.transformers,r,{...e,...i})),i[a.id]=r}catch(e){throw e instanceof Error&&t.S(`Failed to collect prompt "${a.id}": ${e.message}`,`error`),e}}return i}async function G(e,t){let n=new Map,r=e.map(async e=>{if(e.default!==void 0){let r=await U(e.default,e.id,t,e);r!==void 0&&n.set(e.id,r)}});return await Promise.all(r),n}function K(e){let t=[],n=new Set;for(let r of e){if(n.has(r.id)&&t.push(`Duplicate prompt ID: ${r.id}`),n.add(r.id),/^[a-zA-Z_$][a-zA-Z0-9_$]*$/u.test(r.id)||t.push(`Invalid prompt ID "${r.id}": must be a valid JavaScript identifier (start with letter, underscore, or $, followed by letters, digits, underscores, or $)`),(!r.message||r.message.trim()===``)&&t.push(`Prompt "${r.id}" must have a non-empty message`),r.type===`select`){r.choices.length===0&&t.push(`Select prompt "${r.id}" must have at least one choice`);for(let e of r.choices)(!e.name||e.name.trim()===``)&&t.push(`Select prompt "${r.id}" has a choice with empty name`),e.value===void 0&&t.push(`Select prompt "${r.id}" has a choice with undefined value`)}r.type===`number`&&r.min!==void 0&&r.max!==void 0&&r.min>r.max&&t.push(`Number prompt "${r.id}" has min greater than max`)}return t}const q=(0,o.promisify)(r.default.appendFile),_e=(0,o.promisify)(r.default.readFile),ve=(0,o.promisify)(r.default.stat);async function ye(e,n,r){if(e.condition!=null&&e.condition!==``&&!t.v(e.condition,n)){t.S(`Condition not met, skipping append task`,`info`);return}let o=i.default.join(a.default.cwd(),e.file),s={};e.content==null?e.template!=null&&(s.template=e.template):s.template=e.content,e.templateFile!=null&&(s.templateFile=e.templateFile);let c=D(s);if(!c.isValid)throw c.error?.includes(`cannot have both`)?f.templateHasBothTemplateAndFile():f.templateMissingTemplateOrFile();let l=await O(s,n,r),u=!1,d=!1;try{await ve(o),u=!0;let t=await _e(o,`utf-8`);t.length>0&&!t.endsWith(`
|
|
23
|
+
`)&&(d=e.newline!==!1)}catch{}u&&d?await q(o,`\n${l}`):await q(o,l),t.S(`Appended content to ${e.file}`,`success`)}const be={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await ye(e.config,t,e)}},J=(0,o.promisify)(r.default.copyFile),xe=(0,o.promisify)(r.default.stat),Y=(0,o.promisify)(r.default.mkdir),Se=(0,o.promisify)(r.default.readdir);async function X(e,t){await Y(t,{recursive:!0});let n=await Se(e,{withFileTypes:!0});await Promise.all(n.map(async n=>{let r=i.default.join(e,n.name),a=i.default.join(t,n.name);n.isDirectory()?await X(r,a):await J(r,a)}))}async function Ce(e,n){if(e.condition!=null&&e.condition!==``&&!t.v(e.condition,n)){t.S(`Condition not met, skipping copy task`,`info`);return}let r=i.default.join(a.default.cwd(),e.from),o=i.default.join(a.default.cwd(),e.to),s;try{s=await xe(r)}catch{t.S(`Source path does not exist: ${r}`,`warn`);return}await Y(i.default.dirname(o),{recursive:!0}),s.isDirectory()?(await X(r,o),t.S(`Copied directory ${e.from} to ${e.to}`,`success`)):(await J(r,o),t.S(`Copied file ${e.from} to ${e.to}`,`success`))}const we={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await Ce(e.config,t)}},Te=(0,o.promisify)(r.default.writeFile);async function Ee(e,n,o){if(e.condition!=null&&e.condition!==``&&!t.v(e.condition,n)){t.S(`Condition not met, skipping create task`,`info`);return}let s=i.default.join(a.default.cwd(),e.file);if(r.default.existsSync(s)){t.S(`File already exists, skipping: ${e.file}`,`info`);return}let c=D(e);if(!c.isValid)throw c.error?.includes(`cannot have both`)?f.createHasBothTemplateAndFile():f.createMissingTemplateOrFile();let l=await O(e,n,o),u=i.default.dirname(s);r.default.existsSync(u)||r.default.mkdirSync(u,{recursive:!0}),await Te(s,l),t.S(`Created file: ${e.file}`,`success`)}const De={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await Ee(e.config,t,e)}};async function Oe(e,n){let{paths:o,condition:s}=e;if(s!=null&&s!==``){if(!n){t.S(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!t.v(s,n)){t.S(`Condition not met, skipping deletion`,`info`);return}}for(let e of o){let t=i.default.join(a.default.cwd(),e);r.default.existsSync(t)&&r.default.rmSync(t,{recursive:!0,force:!0})}}const ke={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await Oe(e.config,t)}};async function Ae(e,n,r){e.condition!=null&&e.condition!==``&&!t.v(e.condition,n)||await t.c({file:e.file,...e.runtime&&{runtime:e.runtime},...e.args&&{args:e.args},...e.parameters&&{parameters:e.parameters},...e.cwd!=null&&e.cwd.trim()!==``&&{cwd:e.cwd},...r?.$sourceUrl!=null&&r.$sourceUrl.trim()!==``&&{sourceUrl:r.$sourceUrl},captureOutput:!1},n)}const je={name:`exec-file`,version:`1.0.0`,taskTypes:[`exec-file`],execute:async(e,t,n)=>{n.dryRun||await Ae(e.config,t,e)}};async function Me(e,n){if(e.condition!=null&&e.condition!==``){if(!n){t.S(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!t.v(e.condition,n)){t.S(`Condition not met, skipping exec task`,`info`);return}}let r=e.cwd==null?a.default.cwd():i.default.join(a.default.cwd(),e.cwd);(0,s.execSync)(e.command,{cwd:r,stdio:`inherit`})}const Ne={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await Me(e.config,t)}};async function Pe(e,n){if(e.condition!=null&&e.condition!==``){if(!n){t.S(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!t.v(e.condition,n)){t.S(`Condition not met, skipping git-init task`,`info`);return}}if(e.removeExisting){let e=i.default.join(a.default.cwd(),`.git`);r.default.existsSync(e)&&r.default.rmSync(e,{recursive:!0,force:!0})}if((0,s.execSync)(`git init`,{stdio:`inherit`}),e.initialCommit){let t=e.message??`Initial commit`;(0,s.execSync)(`git add .`,{stdio:`inherit`}),(0,s.execSync)(`git commit -m "${t}"`,{stdio:`inherit`})}}const Fe={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await Pe(e.config,t)}},Ie=(0,o.promisify)(r.default.mkdir);async function Le(e,n){if(e.condition!=null&&e.condition!==``&&!t.v(e.condition,n)){t.S(`Condition not met, skipping mkdir task`,`info`);return}await Ie(i.default.join(a.default.cwd(),e.path),{recursive:!0}),t.S(`Created directory: ${e.path}`,`success`)}const Re={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await Le(e.config,t)}},ze=(0,o.promisify)(r.default.rename),Be=(0,o.promisify)(r.default.stat),Ve=(0,o.promisify)(r.default.mkdir);async function He(e,n){if(e.condition!=null&&e.condition!==``&&!t.v(e.condition,n)){t.S(`Condition not met, skipping move task`,`info`);return}let r=i.default.join(a.default.cwd(),e.from),o=i.default.join(a.default.cwd(),e.to);try{await Be(r)}catch{t.S(`Source path does not exist: ${r}`,`warn`);return}await Ve(i.default.dirname(o),{recursive:!0}),await ze(r,o),t.S(`Moved ${e.from} to ${e.to}`,`success`)}const Ue={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await He(e.config,t)}},We=(0,o.promisify)(r.default.readFile),Ge=(0,o.promisify)(r.default.writeFile);async function Ke(e,n){if(e.condition!=null&&e.condition!==``&&!t.v(e.condition,n)){t.S(`Condition not met, skipping regex-replace task`,`info`);return}let r=i.default.join(a.default.cwd(),e.file),{pattern:o}=e,s=e.flags??``,c=e.replacement||``,l=await We(r,`utf-8`),u=new RegExp(o,s);l=l.replace(u,t.o(c,n)),await Ge(r,l)}const qe={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await Ke(e.config,t)}},Je=(0,o.promisify)(r.default.rename);async function Ye(e,n){if(e.condition!=null&&e.condition!==``&&!t.v(e.condition,n)){t.S(`Condition not met, skipping rename task`,`info`);return}let o=i.default.join(a.default.cwd(),t.o(e.from,n)),s=i.default.join(a.default.cwd(),t.o(e.to,n));if(!r.default.existsSync(o)){t.S(`Source path does not exist: ${o}`,`warn`);return}await Je(o,s)}const Xe={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await Ye(e.config,t)}},Ze=(0,o.promisify)(r.default.readFile),Qe=(0,o.promisify)(r.default.writeFile);async function $e(e,n){if(e.condition!=null&&e.condition!==``&&!t.v(e.condition,n)){t.S(`Condition not met, skipping replace-in-file task`,`info`);return}let o=i.default.join(a.default.cwd(),e.file),{replacements:s}=e;if(!r.default.existsSync(o)){t.S(`File not found: ${o}, skipping`,`warn`);return}let c=await Ze(o,`utf-8`);for(let{find:e,replace:r}of s){let i=t.o(r,n);c=c.replace(new RegExp(e,`gu`),i)}await Qe(o,c)}const et={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await $e(e.config,t)}},tt=(0,o.promisify)(r.default.readFile),nt=(0,o.promisify)(r.default.writeFile),rt=2;async function it(e,n){if(e.condition!=null&&e.condition!==``&&!t.v(e.condition,n)){t.S(`Condition not met, skipping update-json task`,`info`);return}let r=i.default.join(a.default.cwd(),e.file),{updates:o}=e,s=await tt(r,`utf-8`),c=JSON.parse(s);function l(e){if(typeof e==`string`)return t.o(e,n);if(Array.isArray(e))return e.map(e=>l(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=l(r);return t}return e}for(let[e,n]of Object.entries(o)){let r=l(n);e.includes(`.`)?t.p(c,e,r):c[e]=r}await nt(r,`${JSON.stringify(c,null,2)}\n`)}const at={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await it(e.config,t)}},ot=(0,o.promisify)(r.default.writeFile);async function st(e,n,o){let{allowCreate:s=!0}=e;if(e.condition!=null&&e.condition!==``&&!t.v(e.condition,n)){t.S(`Condition not met, skipping write task`,`info`);return}let c=i.default.join(a.default.cwd(),e.file);if(!r.default.existsSync(c)){if(s===!1)throw Error(`Write task failed: file does not exist (${e.file})`);t.S(`File not found, creating new file: ${e.file}`,`info`)}let l=D(e);if(!l.isValid)throw l.error?.includes(`cannot have both`)?f.templateHasBothTemplateAndFile():f.templateMissingTemplateOrFile();let u=await O(e,n,o),d=i.default.dirname(c);r.default.existsSync(d)||r.default.mkdirSync(d,{recursive:!0}),await ot(c,u)}const ct={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await st(e.config,t,e)}};function Z(){z(`update-json`)||(L(at),L(ct),L(De),L(qe),L(et),L(ke),L(Xe),L(Fe),L(Ne),L(je),L(Ue),L(we),L(be),L(Re))}async function lt(e,n,r=!1){if(Z(),r){t.S(`[DRY RUN] Would execute: ${e.name}`,`info`);return}if(z(e.type)){await V(e,n,{dryRun:r});return}throw TypeError(`Unknown task type: ${e.type}`)}async function ut(e,n,r,i,o=!1){try{return t.S(`[${r}/${i}] Running: ${e.name}...`,`info`),await lt(e,n,o),t.S(`[${r}/${i}] Completed: ${e.name}...`,`success`),!0}catch(n){return t.S(`Failed: ${e.name}`,`error`),n instanceof Error&&(t.S(` Reason: ${n.message}`,`error`),n.stack!=null&&a.default.env.DEBUG!=null&&console.error(n.stack)),!1}}function dt(e){let n=[],r=new Set,i=new Set,a=new Map(e.map(e=>[e.id,e]));function o(e){if(r.has(e))return;if(i.has(e))throw t.E.forTaskDependency(e);i.add(e);let s=a.get(e);if(!s)throw u.forId(e);if(s.dependencies)for(let e of s.dependencies)o(e);i.delete(e),r.add(e),n.push(s)}for(let t of e)r.has(t.id)||o(t.id);return n}function ft(e){let t=[];for(let n of e)if(!z(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=pt(n);t.push(...e)}return t}function pt(e){let t=[],n=e.config,r=typeof n.template==`string`?n.template:void 0,i=typeof n.templateFile==`string`?n.templateFile:void 0,a=D({...r!==void 0&&{template:r},...i!==void 0&&{templateFile:i}});return!a.isValid&&a.error!=null&&a.error!==``&&t.push(`Task "${e.id}" (${e.name}): ${a.error}`),(n.file==null||n.file===``)&&t.push(`Task "${e.id}" (${e.name}): Write task requires "file" property to specify the output file path`),t}function mt(e){t.S(`❌ Template validation failed:`,`error`),t.S(``,`error`);for(let n of e)t.S(` • ${n}`,`error`);t.S(``,`error`),t.S(`Please fix these errors before continuing.`,`error`)}async function Q(e,t=new Map,n={}){let r={};for(let i of e){let e=t.get(i.id);e!==void 0&&(i.transformers!==void 0&&(e=await H.apply(i.transformers,e,{...n,...r})),r[i.id]=e)}return r}async function $(e,n,r){let i=new Map;for(let a of e){if(r?.skipConditional===!0&&typeof a.value==`object`&&a.value!==null&&!Array.isArray(a.value)&&a.value.type===`conditional`)continue;if(a.$configEnabled!=null){let e={...n};for(let[t,n]of i.entries())e[t]=n;if(!await t._(a.$configEnabled,e))continue}let e={...n};for(let[t,n]of i.entries())e[t]=n;let o=await t.s(a.value,{id:a.id,contextType:`Variable`,context:e,...a.$sourceUrl!=null&&{sourceUrl:a.$sourceUrl}});o!==void 0&&i.set(a.id,o)}return i}function ht(e){let t=[],n=new Set;for(let r of e)n.has(r.id)&&t.push(`Duplicate variable ID: "${r.id}"`),n.add(r.id);return t}async function gt(e,r){let i=n.t();if(!await t._(r.configEnabled,i,{lazy:!0})){t.x(`⊘ Template is disabled - skipping all execution`);return}r.transformers!==void 0&&r.transformers.length>0&&(t.y(`Registering ${r.transformers.length} transformer(s)...`),H.registerAll(r.transformers)),t.y(`Registering built-in plugins...`),Z(),t.y(`Validating task configurations...`);let o=ft(e);o.length>0&&(mt(o),a.default.exit(1)),t.y(`All tasks validated successfully`);let s=e.filter(e=>t.g(e.enabled,n.t(),{lazy:!0}));t.y(`Resolving task dependencies...`);let c=dt(s);t.y(`Sorted ${c.length} task(s) by dependencies`),t.x(`Welcome! Let's execute your tasks.`),r.dryRun&&t.T(`🔍 DRY RUN MODE - No changes will be made`),t.x(`This will execute your project tasks based on the defined configuration.`);let l=i,u=[...r.variables??[]];if(u.length>0){let e=ht(u);e.length>0&&(t.S(`❌ Variable validation errors:`,`error`),e.forEach(e=>t.S(` - ${e}`,`error`)),a.default.exit(1)),t.y(`Resolving variable values...`);let n=await Q(u,await $(u,l,{skipConditional:!0}),l);Object.assign(l,n),Object.keys(n).length>0&&(t.y(`Resolved ${Object.keys(n).length} variable(s)`),t.y(`Variable values: ${JSON.stringify(n)}`))}let d=r.prompts??[],f=[...d];if(f.length>0){let e=K(f);e.length>0&&(t.S(`❌ Prompt validation errors:`,`error`),e.forEach(e=>t.S(` - ${e}`,`error`)),a.default.exit(1)),t.y(`Resolving prompt default values...`);let n=await G(f,l);if(d.length>0){t.x(`📋 Collecting prompts (available to all tasks):`);let e=await W(d,n,l);Object.assign(l,e)}}if(u.length>0){let e=u.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1);if(e.length>0){t.y(`Re-resolving conditional variables with prompt values...`);let n=await Q(e,await $(e,l),l);Object.assign(l,n),Object.keys(n).length>0&&t.y(`Resolved ${Object.keys(n).length} conditional variable(s)`)}}if(!await t._(r.configEnabled,l)){t.x(`⊘ Template is disabled after variable resolution - skipping all execution`);return}let p=[];for(let e of c)e.$configEnabled!=null&&!await t._(e.$configEnabled,l)||await t._(e.enabled,l)&&p.push(e);if(t.S(`${p.length} of ${c.length} task(s) enabled for execution`,`info`),r.dryRun){await N(p,l),t.x(`🔍 Dry run completed - no changes were made`),t.x(`Run without --dry-run to apply changes`);return}t.y(`Calling beforeAll hook...`),await B(`beforeAll`,l);let m=p.length,h=0,g=0,ee=[],_=[];for(let e=0;e<p.length;e++){let n=p[e];n!=null&&(t.y(`Calling beforeTask hook for task: ${n.name}`),await B(`beforeTask`,n,l),await ut(n,l,e+1,m,r.dryRun)?(h++,ee.push(n.id),t.y(`Calling afterTask hook for task: ${n.name}`),await B(`afterTask`,n,l)):(await t.h(n.required,l)&&(g++,_.push(n.name)),t.y(`Calling onError hook for task: ${n.name}`),await B(`onError`,Error(`Task ${n.name} failed`),n),t.T(`⚠️ Task "${n.name}" failed, continuing with remaining tasks...`)))}g>0&&(t.S(`\n❌ Task execution completed with ${g} error(s)`,`error`),t.S(`Completed: ${h}/${m} tasks`,`info`),t.S(`Failed tasks: ${_.join(`, `)}`,`error`),a.default.exit(1)),t.y(`Calling afterAll hook...`),await B(`afterAll`,l),t.w(`✅ All tasks completed successfully!`),t.w(` Completed: ${h}/${m} tasks`)}async function _t(e,n,r={}){t.y(`Running templates with sequential variable/prompt resolution...`),t.y(`Total templates to process: ${e.length}`),t.y(`Registering built-in plugins...`),Z();let i=[];console.log(``),t.x(`📋 Collecting input...`),console.log(``);for(let n=0;n<e.length;n++){let o=e[n];if(o==null)continue;let s=`=`.repeat(60);if(t.y(`\n${s}`),t.y(`Processing template ${n+1}/${e.length}: "${o.name}"`),t.y(s),t.y(`Current config keys: ${Object.keys(r).join(`, `)}`),!await t._(o.enabled,r)){t.x(`⊘ Template "${o.name}" is disabled - skipping`),t.y(` Enabled condition: ${JSON.stringify(o.enabled)}`);continue}let c=o.variables??[];if(c.length>0){t.y(`Processing ${c.length} variable(s) for template "${o.name}"...`);let e=ht(c);e.length>0&&(t.S(`❌ Variable validation errors:`,`error`),e.forEach(e=>t.S(` - ${e}`,`error`)),a.default.exit(1));let n=await Q(c,await $(c,r,{skipConditional:!0}),r);Object.assign(r,n);let i=c.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1),s=0;if(i.length>0){let e=await Q(i,await $(i,r),r);if(s=Object.keys(e).length,Object.assign(r,e),s>0){t.y(`Resolved ${s} conditional variable(s)`);for(let[n,r]of Object.entries(e))t.y(` ${n} = ${JSON.stringify(r)}`)}}let l=Object.keys(n).length+s;if(l>0){t.y(`Total variables resolved for template: ${l}`);for(let[e,r]of Object.entries(n))t.y(` ${e} = ${JSON.stringify(r)}`)}}let l=o.prompts??[];if(l.length>0){t.y(`Processing ${l.length} prompt(s) for template "${o.name}"...`);let e=K(l);e.length>0&&(t.S(`❌ Prompt validation errors:`,`error`),e.forEach(e=>t.S(` - ${e}`,`error`)),a.default.exit(1));let n=await W(l,await G(l,r),r);Object.assign(r,n),t.y(`Collected ${Object.keys(n).length} prompt answer(s)`)}if(!await t._(o.enabled,r)){t.x(`⊘ Template "${o.name}" became disabled after variable/prompt resolution - skipping tasks`);continue}let u=o.tasks??[];u.length>0&&(t.y(`Found ${u.length} task(s) in template "${o.name}" (will execute later)`),i.push(...u))}if(t.y(`
|
|
24
|
+
🔧 Validating and filtering all collected tasks...`),i.length===0){t.S(`No tasks found in any template`,`info`);return}let o=ft(i);o.length>0&&(mt(o),a.default.exit(1)),console.log(``),t.S(`🛠️ Preparing tasks...`,`info`);let s=[];for(let e of i)await t._(e.enabled,r)&&s.push(e);if(console.log(``),t.S(`Found ${i.length} tasks (${s.length} enabled)`,`info`),t.S(`All tasks validated successfully`,`success`),s.length===0){t.S(`No enabled tasks to execute`,`info`);return}let c=dt(s);if(n.dryRun){t.S(`
|
|
25
|
+
🔍 Dry run - showing task changes...`,`info`),await N(c,r),t.S(`
|
|
26
|
+
🔍 Dry run completed - no changes were made`,`info`),t.S(`Run without --dry-run to apply changes`,`info`);return}console.log(``),t.x(`⚙️ Executing tasks...`),console.log(``),await B(`beforeAll`,r);let l=0,u=0,d=[];for(let e=0;e<c.length;e++){let i=c[e];i!=null&&(await B(`beforeTask`,i,r),await ut(i,r,e+1,c.length,n.dryRun)?(l++,await B(`afterTask`,i,r)):(await t.h(i.required,r)&&(u++,d.push(i.name)),await B(`onError`,Error(`Task ${i.name} failed`),i),t.T(`⚠️ Task "${i.name}" failed, continuing with remaining tasks...`)))}await B(`afterAll`,r),u>0&&(t.S(`\n❌ Task execution completed with ${u} error(s)`,`error`),t.S(`Completed: ${l}/${c.length} tasks`,`info`),t.S(`Failed tasks: ${d.join(`, `)}`,`error`),a.default.exit(1)),t.S(`Completed: ${l}/${c.length} tasks`,`success`)}Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return V}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return z}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return ue}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return he}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return fe}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return _t}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return de}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return pe}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return gt}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return me}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return oe}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return C}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require(`./chunk-DjWAcSYV.cjs`),t=require(`./configurations-KSynsxPT.cjs`),n=require(`./run-tasks-DU00U3qI.cjs`);let r=require(`node:process`);r=e.t(r);const i=r.default.argv.includes(`--dry-run`),a=r.default.argv.includes(`--force`);async function o(e,o){try{await n.t(e,{dryRun:o?.dryRun??i,force:o?.force??a,configFilePath:o?.configFilePath??void 0,...o?.variables!=null&&{variables:o.variables},...o?.prompts!=null&&{prompts:o.prompts},...o?.configEnabled!=null&&{configEnabled:o.configEnabled},...o?.transformers!=null&&{transformers:o.transformers}})}catch(e){t.S(`❌ Task execution failed`,`error`),e instanceof Error?(t.S(`Error: ${e.message}`,`error`),r.default.env.DEBUG!=null&&console.error(e.stack)):console.error(e),r.default.exit(1)}}Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return o}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{S as e}from"./configurations-Bjun5iKX.js";import{t}from"./run-tasks--KK3MvU0.js";import n from"node:process";const r=n.argv.includes(`--dry-run`),i=n.argv.includes(`--force`);async function a(a,o){try{await t(a,{dryRun:o?.dryRun??r,force:o?.force??i,configFilePath:o?.configFilePath??void 0,...o?.variables!=null&&{variables:o.variables},...o?.prompts!=null&&{prompts:o.prompts},...o?.configEnabled!=null&&{configEnabled:o.configEnabled},...o?.transformers!=null&&{transformers:o.transformers}})}catch(t){e(`❌ Task execution failed`,`error`),t instanceof Error?(e(`Error: ${t.message}`,`error`),n.env.DEBUG!=null&&console.error(t.stack)):console.error(t),n.exit(1)}}export{a as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require(`./configurations-KSynsxPT.cjs`);exports.cleanupTempFile=e.l,exports.debug=e.y,exports.error=e.b,exports.logError=e.b,exports.evaluateCondition=e.v,exports.evaluateEnabled=e.g,exports.evaluateEnabledAsync=e._,exports.evaluateRequiredAsync=e.h,exports.getNestedProperty=e.f,exports.info=e.x,exports.logInfo=e.x,exports.interpolateTemplate=e.o,exports.isUrl=e.m,exports.log=e.S,exports.logSuccess=e.w,exports.success=e.w,exports.logWarn=e.T,exports.warn=e.T,exports.resolveAndFetchFile=e.u,exports.resolveFilePath=e.d,exports.resolveValue=e.s,exports.setDebugMode=e.C,exports.setNestedProperty=e.p;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{C as e,S as t,T as n,_ as r,b as i,d as a,f as o,g as s,h as c,l,m as u,o as d,p as f,s as p,u as m,v as h,w as g,x as _,y as v}from"./configurations-Bjun5iKX.js";export{l as cleanupTempFile,v as debug,i as error,i as logError,h as evaluateCondition,s as evaluateEnabled,r as evaluateEnabledAsync,c as evaluateRequiredAsync,o as getNestedProperty,_ as info,_ as logInfo,d as interpolateTemplate,u as isUrl,t as log,g as logSuccess,g as success,n as logWarn,n as warn,m as resolveAndFetchFile,a as resolveFilePath,p as resolveValue,e as setDebugMode,f as setNestedProperty};
|
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.39.0",
|
|
5
5
|
"author": "PixPilot <m.doaie@hotmail.com>",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
@@ -50,8 +50,8 @@
|
|
|
50
50
|
"typescript": "^5.9.3",
|
|
51
51
|
"@internal/eslint-config": "0.3.0",
|
|
52
52
|
"@internal/tsconfig": "0.1.0",
|
|
53
|
-
"@internal/prettier-config": "0.0.1",
|
|
54
53
|
"@internal/tsdown-config": "0.1.0",
|
|
54
|
+
"@internal/prettier-config": "0.0.1",
|
|
55
55
|
"@internal/vitest-config": "0.1.0"
|
|
56
56
|
},
|
|
57
57
|
"prettier": "@internal/prettier-config",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const e=require(`./chunk-DjWAcSYV.cjs`);let t=require(`node:fs`);t=e.t(t);let n=require(`node:path`);n=e.t(n);let r=require(`node:process`);r=e.t(r);let i=require(`node:util`);i=e.t(i),require(`handlebars`);let a=require(`node:os`);a=e.t(a);let o=require(`node:child_process`);o=e.t(o);var s=class extends Error{constructor(e,t){super(e),this.code=t,this.name=this.constructor.name}},c=class e extends s{constructor(e,t,n){super(e,`CIRCULAR_DEPENDENCY`),this.dependencyChain=t,this.resolvedPath=n,this.name=`CircularDependencyError`}static forConfigurationInheritance(t,n){let r=Array.from(t);return new e(`Circular dependency detected: ${r.join(` -> `)} -> ${n}`,r,n)}static forTemplateInheritance(t,n){return e.forConfigurationInheritance(t,n)}static forTaskDependency(t){return new e(`Circular dependency detected involving task: ${t}`,[t])}static forTemplateDependencies(t,n){let r=[...t,n];return new e(`Circular dependency detected in template dependencies: ${r.join(` -> `)}`,r)}},l=class e extends s{constructor(e,t){super(e,`CONFIG_FILE_NOT_FOUND`),this.filePath=t,this.name=`ConfigFileNotFoundError`}static forPath(t){return new e(`Configuration file not found: ${t}`,t)}},u=class e extends s{constructor(e,t,n){super(e,`CONFIG_FETCH_ERROR`),this.url=t,this.originalError=n,this.name=`ConfigFetchError`}static forUrl(t,n,r){return typeof n==`number`?new e(`Failed to fetch configuration from ${t}: ${n} ${r??``}`.trim(),t):new e(`Failed to fetch configuration from ${t}: ${n?.message??String(n??`Unknown error`)}`,t,n)}},d=class e extends s{constructor(e,t,n){super(e,`CONFIG_PARSE_ERROR`),this.filePath=t,this.originalError=n,this.name=`ConfigParseError`}static forFile(t,n){return new e(`Failed to parse configuration file ${t}: ${n.message}`,t,n)}},f=class e extends s{constructor(e,t){super(e,`INVALID_CONFIG`),this.filePath=t,this.name=`InvalidConfigError`}static forFile(t,n){return new e(`Invalid configuration file ${t}: ${n}`,t)}static tasksNotArray(t){return new e(`Invalid configuration file ${t}: 'tasks' must be an array if provided`,t)}static missingName(t){return new e(`Invalid configuration file ${t}: 'name' field is required`,t)}static invalidNameFormat(t,n){return new e(`Invalid configuration file ${t}: 'name' field "${n}" must contain only lowercase letters, digits, and hyphens. It cannot start or end with a hyphen, and cannot contain consecutive hyphens.`,t)}},p=class e extends s{constructor(e,t,n,r){super(e,`DUPLICATE_ID`),this.id=t,this.type=n,this.existingType=r,this.name=`DuplicateIdError`}static forId(t,n,r){return new e(`Duplicate ID "${t}" found in ${n}. This ID is already used in ${r??`unknown`}`,t,n,r)}},m=class e extends s{constructor(e,t,n,r,i){super(e,`ID_CONFLICT`),this.id=t,this.type=n,this.baseSource=r,this.overrideSource=i,this.name=`IdConflictError`}static forTask(t,n,r){return new e(`Task ID conflict: "${t}" is defined in multiple templates.\n Base task from: ${n??`unknown`}\n Override task from: ${r??`unknown`}\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the task.\n Task is being extended/overridden but no override strategy was specified.`,t,`task`,n,r)}static forVariable(t){return new e(`Variable ID conflict: "${t}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the variable.\n Variable is being extended/overridden but no override strategy was specified.`,t,`variable`)}static forPrompt(t){return new e(`Prompt ID conflict: "${t}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the prompt.\n Prompt is being extended/overridden but no override strategy was specified.`,t,`prompt`)}};function ee(e){let t=new Map;for(let n of e){let e=t.get(n.name)||[];e.push(n),t.set(n.name,e)}if(Array.from(t.values()).some(e=>e.length>1))return e;let n=new Map,r=new Map,i=new Map;for(let t of e)if(n.set(t.name,t),i.set(t.name,new Set),t.dependencies!=null&&t.dependencies.length>0)for(let e of t.dependencies)i.get(t.name).add(e),r.has(e)||r.set(e,new Set),r.get(e).add(t.name);let a=new Set,o=new Map;for(let t=0;t<e.length;t++){let n=e[t],s=i.get(n.name).size>0,c=r.has(n.name)&&r.get(n.name).size>0;!s&&!c&&(a.add(n.name),o.set(n.name,t))}let s=e.filter(e=>!a.has(e.name)),l=[],u=new Set,d=new Set;function f(e){if(u.has(e))return;if(d.has(e))throw c.forTemplateDependencies(Array.from(d),e);d.add(e);let t=n.get(e);if(t!=null){let t=i.get(e);if(t!=null&&t.size>0)for(let e of t)f(e)}d.delete(e),u.add(e),t!=null&&!a.has(e)&&l.push(t)}for(let e of s)f(e.name);let p=[],m=0;for(let t=0;t<e.length;t++){let n=e[t];a.has(n.name)?p.push(n):m<l.length&&(p.push(l[m]),m++)}return p}let te=!1;const h={debug:`🐛`,info:`ℹ`,success:`✓`,warn:`⚠`,error:`✗`},g={debug:`\x1B[35m`,info:`\x1B[36m`,success:`\x1B[32m`,warn:`\x1B[33m`,error:`\x1B[31m`},_=`\x1B[0m`;function v(e){}function y(e){console.log(`${g.info}${h.info} ${e}${_}`)}function b(e){console.log(`${g.success}${h.success} ${e}${_}`)}function x(e){console.log(`${g.warn}${h.warn} ${e}${_}`)}function S(e){console.log(`${g.error}${h.error} ${e}${_}`)}function C(e,t=`info`){switch(t){case`debug`:break;case`info`:y(e);break;case`success`:b(e);break;case`warn`:x(e);break;case`error`:S(e);break}}function w(e,t,n){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch(t){return n?.lazy===!0&&t instanceof ReferenceError?!0:(n?.silent!==!0&&(C(`Failed to evaluate condition: ${e}`,`warn`),t instanceof Error&&C(` Error: ${t.message}`,`warn`)),!1)}}function ne(e,t,n){if(e===void 0)return!0;if(typeof e==`boolean`)return e;if(typeof e==`object`&&`type`in e){if(e.type===`exec`)return n?.lazy===!0;if(e.type===`condition`)return w(e.value,t,n?.lazy===!0?{lazy:!0}:void 0)}return!1}async function re(e,t,n){if(e===void 0)return!0;if(typeof e==`boolean`)return e;if(typeof e==`object`&&`type`in e){if(e.type===`exec`)try{let{execSync:n}=await import(`node:child_process`),{interpolateTemplate:r}=await Promise.resolve().then(()=>require(`./utils-Cs2XFh4Z.cjs`)),i=n(r(e.value,t),{encoding:`utf-8`}).trim();if(i===``||i===`0`)return!1;let a=i.toLowerCase();return!(a===`false`||a===`no`)}catch(t){let{log:n}=await Promise.resolve().then(()=>require(`./utils-Cs2XFh4Z.cjs`));return n(`Failed to execute enabled command: ${e.value}`,`warn`),t instanceof Error&&n(` Error: ${t.message}`,`warn`),!1}if(e.type===`condition`)return w(e.value,t,n?.lazy===!0?{lazy:!0}:void 0)}return!1}function ie(e,t){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch{return!0}}function ae(e){return e===void 0||typeof e==`boolean`?e:typeof e==`string`?{type:`condition`,value:e}:typeof e==`object`&&e&&`condition`in e&&!(`type`in e)?{type:`condition`,value:e.condition}:e}async function T(e,t){let n=ae(e);if(n===void 0)return!0;if(typeof n==`boolean`)return n;if(typeof n==`object`&&n&&`type`in n){if(n.type===`exec`)try{let{execSync:e}=await import(`node:child_process`),{interpolateTemplate:r}=await Promise.resolve().then(()=>require(`./utils-Cs2XFh4Z.cjs`));return e(r(n.value,t),{encoding:`utf-8`,stdio:`ignore`}),!0}catch(e){let{log:t}=await Promise.resolve().then(()=>require(`./utils-Cs2XFh4Z.cjs`));if(typeof e==`object`&&e&&`status`in e&&typeof e.status==`number`){let{status:r}=e;if(r>=1&&r<=255)return t(`Failed to execute required command: ${n.value}`,`warn`),e instanceof Error&&t(` Error: ${e.message}`,`warn`),!1}return t(`Failed to execute required command: ${n.value}`,`warn`),e instanceof Error&&t(` Error: ${e.message}`,`warn`),!1}if(n.type===`condition`)return ie(n.value,t)}return!0}let E=!1;function oe(e){E=e}const D={debug:`🐛`,info:`ℹ`,success:`✓`,warn:`⚠`,error:`✗`},O={debug:`\x1B[35m`,info:`\x1B[36m`,success:`\x1B[32m`,warn:`\x1B[33m`,error:`\x1B[31m`},k=`\x1B[0m`;function A(e){E&&console.log(`${O.debug}${D.debug} ${e}${k}`)}function se(e){console.log(`${O.info}${D.info} ${e}${k}`)}function ce(e){console.log(`${O.success}${D.success} ${e}${k}`)}function le(e){console.log(`${O.warn}${D.warn} ${e}${k}`)}function j(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function ue(e,t,n){let r=t.split(`.`),i=e;for(let e=0;e<r.length-1;e++){let t=r[e];t!=null&&t!==``&&((!(t in i)||typeof i[t]!=`object`||i[t]===null)&&(i[t]={}),i=i[t])}let a=r[r.length-1];a!=null&&a!==``&&(i[a]=n)}function M(e,t){let n=t.split(`.`),r=e;for(let e of n)if(e!==``&&typeof r==`object`&&r)r=r[e];else return;return r}function N(e,t){if(j(e))return e;if(t==null||t===``)return n.default.isAbsolute(e)?e:n.default.resolve(r.default.cwd(),e);if(j(t))try{let n=new URL(`.`,t);return new URL(e,n).href}catch{throw Error(`Failed to resolve file path '${e}' relative to source URL '${t}'`)}let i=n.default.dirname(t);return n.default.isAbsolute(e)?e:n.default.resolve(i,e)}async function P(e){let{file:r,sourceUrl:i,tempFileExtension:o=`.tmp`,tempFilePrefix:s=`scaffoldfy`}=e,c=r,l,u,d=!1;if(j(r)){l=r,`${l}`;let e=await W(l);d=!0;let i=a.default.tmpdir(),c=`${s}-${Date.now()}${o}`;u=n.default.join(i,c),t.default.writeFileSync(u,e,`utf-8`),`${u}`}else if(l=N(r,i),j(l)){`${l}`;let e=await W(l);d=!0;let r=a.default.tmpdir(),i=`${s}-${Date.now()}${o}`;u=n.default.join(r,i),t.default.writeFileSync(u,e,`utf-8`),`${u}`}else{if(!t.default.existsSync(l))throw Error(`File not found: ${l}`);u=l,`${u}`}return{localFilePath:u,isRemote:d,originalPath:c,resolvedPath:l}}function F(e){if(e.isRemote&&t.default.existsSync(e.localFilePath))try{t.default.unlinkSync(e.localFilePath),`${e.localFilePath}`}catch(e){`${e instanceof Error?e.message:String(e)}`}}function I(e){switch(n.default.extname(e).toLowerCase()){case`.js`:case`.cjs`:case`.mjs`:return`node`;case`.sh`:return`bash`;case`.bash`:return`bash`;case`.ps1`:return`pwsh`;default:return}}function de(e,t){switch(e){case`node`:return`node "${t}"`;case`bash`:return`bash "${t}"`;case`sh`:return`sh "${t}"`;case`pwsh`:return`pwsh -File "${t}"`;case`powershell`:return`powershell -File "${t}"`;default:return`node "${t}"`}}function fe(e){switch(e){case`node`:return`.js`;case`bash`:case`sh`:return`.sh`;case`pwsh`:case`powershell`:return`.ps1`;default:return`.js`}}async function L(e,t){let i=B(e.file,t),a=e.args?.map(e=>B(e,t))??[],s={};if(e.parameters)for(let[n,r]of Object.entries(e.parameters))s[n]=B(r,t);let c=e.cwd!=null&&e.cwd!==``?n.default.join(r.default.cwd(),B(e.cwd,t)):r.default.cwd(),l=await P({file:i,...e.sourceUrl!=null&&e.sourceUrl!==``&&{sourceUrl:e.sourceUrl},tempFileExtension:fe(e.runtime??I(i)??`node`),tempFilePrefix:`scaffoldfy-exec`}),{localFilePath:u}=l,d=e.runtime??I(u)??`node`;!e.runtime&&!I(u)&&C(`Could not detect runtime from file extension, defaulting to 'node'`,`warn`);try{let t=de(d,u),n=a.join(` `),i=n?`${t} ${n}`:t;`${i}`;let l=(0,o.execSync)(i,{cwd:c,stdio:e.captureOutput?[`pipe`,`pipe`,`pipe`]:`inherit`,env:{...r.default.env,...s},encoding:e.captureOutput?`utf-8`:void 0});return e.captureOutput&&typeof l==`string`?l:void 0}finally{F(l)}}async function R(e,t){let{id:n,contextType:r,context:i,sourceUrl:a}=t;if(e==null)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let s=e;if(s.type===`conditional`){if(!i){C(`${r} "${n}": conditional value requires context but none provided`,`warn`);return}if(typeof s.condition!=`string`){C(`${r} "${n}": conditional value must have a string condition`,`error`);return}try{let e=w(s.condition,i)?s.ifTrue:s.ifFalse;return typeof e==`object`&&e?await R(e,t):e}catch(e){C(`${r} "${n}": failed to evaluate conditional value: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(s.type===`exec`){let e=s.value;if(typeof e!=`string`){C(`${r} "${n}": exec value must have a string command`,`error`);return}try{return z((0,o.execSync)(e,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim())}catch(e){C(`${r} "${n}": failed to execute command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(s.type===`exec-file`){let e=s;if(typeof e.file!=`string`){C(`${r} "${n}": exec-file value must have a file path`,`error`);return}try{let t=await L({file:e.file,...e.runtime!=null&&e.runtime.trim()!==``&&{runtime:e.runtime},...e.args&&{args:e.args},...e.parameters&&{parameters:e.parameters},...e.cwd!==void 0&&e.cwd.trim()!==``&&{cwd:e.cwd},...a!=null&&{sourceUrl:a},captureOutput:!0},i??{});return t===void 0?void 0:z(t.trim())}catch(e){C(`${r} "${n}": failed to execute script file: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(s.type===`static`)return s.value;if(s.type===`interpolate`){let e=s.value;if(typeof e!=`string`){C(`${r} "${n}": interpolate value must be a string with {{variable}} placeholders`,`error`);return}if(!i)return C(`${r} "${n}": interpolate value requires context but none provided`,`warn`),e;try{return B(e,i)}catch(t){return C(`${r} "${n}": failed to interpolate value: ${t instanceof Error?t.message:`Unknown error`}`,`warn`),e}}if(s.type!==void 0){C(`${r} "${n}": unknown value type "${s.type}". Expected "static", "exec", "exec-file", "conditional", or "interpolate".`,`error`);return}return e}function z(e){if(e.startsWith(`{`)||e.startsWith(`[`))try{return JSON.parse(e)}catch{return e}if(/^-?\d+(?:\.\d+)?$/u.test(e)){let t=Number.parseFloat(e);if(!Number.isNaN(t))return t}return e===`true`||e===`false`?e===`true`:e}function B(e,t){return e.replace(/\{\{(?<key>[\w.]+)\}\}/gu,(e,n)=>M(t,n)?.toString()??``)}const V=(0,i.promisify)(t.default.readFile),H={template:[[`template`,`templateFile`]]};function U(e){if(e==null||e===``)return`current configuration`;if(j(e))return e;let t=r.default.cwd();return e.startsWith(t)?n.default.relative(t,e):e}async function W(e){if(j(e))return G(e);if(!t.default.existsSync(e))throw l.forPath(e);return V(e,`utf-8`)}async function G(e){try{let t=await fetch(e);if(!t.ok)throw u.forUrl(e,t.status,t.statusText);return await t.text()}catch(t){throw t instanceof Error&&t.message.includes(`Failed to fetch`)?t:u.forUrl(e,t instanceof Error?t:void 0)}}const K=new Map;async function q(e,i=new Set){let a=j(e),o;if(o=a||n.default.isAbsolute(e)?e:n.default.resolve(r.default.cwd(),e),K.has(o))return K.get(o);if(i.has(o))throw c.forConfigurationInheritance(i,o);i.add(o);let s;if(a)s=await G(o);else{if(!t.default.existsSync(o))throw l.forPath(o);s=await V(o,`utf-8`)}let u;try{u=JSON.parse(s)}catch(e){throw d.forFile(o,e instanceof Error?e:Error(String(e)))}if(u.name==null||u.name.trim()===``)throw f.missingName(o);if(!/^[a-z\d]+(?:-[a-z\d]+)*$/u.test(u.name))throw f.invalidNameFormat(o,u.name);if(u.tasks!==void 0&&!Array.isArray(u.tasks))throw f.tasksNotArray(o);u.tasks===void 0&&(u.tasks=[]);for(let e of u.tasks)e.$sourceUrl=o;if(u.variables!==void 0)for(let e of u.variables)e.$sourceUrl=o;if(u.prompts!==void 0)for(let e of u.prompts)e.$sourceUrl=o;return K.set(o,u),u}async function J(e,t,i,a,o){let s=j(e),l;if(l=s||n.default.isAbsolute(e)?e:t==null?n.default.resolve(r.default.cwd(),e):j(t)?new URL(e,t).href:n.default.resolve(t,e),i.has(l))return;if(a.has(l))throw c.forConfigurationInheritance(a,l);a.add(l);let u=await q(l),d=j(l)?new URL(`.`,l).href:n.default.dirname(l);if(u.extends!=null&&u.extends!==``){let e=Array.isArray(u.extends)?u.extends:[u.extends];for(let t of e)await J(t,d,i,a,o)}a.delete(l),i.add(l),o.push(u)}async function Y(e,t,n=new Set){let r=[];return await J(e,t,n,new Set,r),ee(r)}async function X(e,t,n=new Set){return $(await Y(e,t,n))}function Z(e,t,n){let r=new Map;for(let t of e){if(r.has(t.id))throw p.forId(t.id,`task`,r.get(t.id));r.set(t.id,`task`)}if(t!=null)for(let e of t){if(r.has(e.id))throw p.forId(e.id,`variable`,r.get(e.id));r.set(e.id,`variable`)}if(n!=null)for(let e of n){if(r.has(e.id))throw p.forId(e.id,`prompt`,r.get(e.id));r.set(e.id,`prompt`)}}function Q(e,t){if((t.override??`merge`)===`replace`){C(` → Variable "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}C(` → Variable "${t.id}" merged (value replaced)`,`info`);let n=t.$sourceUrl??e.$sourceUrl,r={...e,...t,...n!=null&&{$sourceUrl:n}};return delete r.override,r}function pe(e,t){if((t.override??`merge`)===`replace`){C(` → Prompt "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}C(` → Prompt "${t.id}" merged`,`info`);let n=t.$sourceUrl??e.$sourceUrl,r={...e,...t,...n!=null&&{$sourceUrl:n}};return delete r.override,r}function $(e){if(e.length===0)return{name:`Empty Configuration`,tasks:[]};if(e.length===1){let t=e[0];return Z(t.tasks??[],t.variables,t.prompts),t}let t=new Map,n=new Map,r=new Map,i={};for(let a of e){if(a.enabled!=null&&(i[a.name]=a.enabled),a.enabled===!1){C(`⊘ Skipping disabled configuration "${a.name}" - its tasks, prompts, and variables will not be included`,`info`);continue}if(a.prompts!=null)for(let e of a.prompts)if(r.has(e.id)){if(e.override==null)throw m.forPrompt(e.id);let t=pe(r.get(e.id),e);a.enabled!=null&&(t.$configEnabled=a.enabled),r.set(e.id,t)}else{let t={...e};a.enabled!=null&&(t.$configEnabled=a.enabled),r.set(e.id,t)}if(a.variables!=null)for(let e of a.variables)if(n.has(e.id)){if(e.override==null)throw m.forVariable(e.id);let t=Q(n.get(e.id),e);a.enabled!=null&&(t.$configEnabled=a.enabled),n.set(e.id,t)}else{let t={...e};a.enabled!=null&&(t.$configEnabled=a.enabled),n.set(e.id,t)}for(let e of a.tasks??[])if(t.has(e.id)){if(e.override==null){let n=t.get(e.id);throw m.forTask(e.id,U(n.$sourceUrl),U(e.$sourceUrl))}let n=ge(t.get(e.id),e);a.enabled!=null&&(n.$configEnabled=a.enabled),t.set(e.id,n)}else{let n={...e};a.enabled!=null&&(n.$configEnabled=a.enabled),t.set(e.id,n)}}let a=Array.from(t.values()),o=r.size>0?Array.from(r.values()):void 0,s=n.size>0?Array.from(n.values()):void 0;Z(a,s,o);let c=e[e.length-1],l={name:c.name,tasks:a};return c.description!=null&&(l.description=c.description),c.dependencies!=null&&(l.dependencies=c.dependencies),c.enabled!=null&&(l.enabled=c.enabled),o!=null&&(l.prompts=o),s!=null&&(l.variables=s),l}function me(e,t){let n=H[e];if(!n)return null;for(let e of n){let n=e.filter(e=>e in t&&t[e]!=null);if(n.length>1)return n}return null}function he(e,t,n){let r={...e},i=H[n]??[];for(let[e,n]of Object.entries(t)){for(let t of i)if(t.includes(e)){for(let n of t)n!==e&&delete r[n];break}r[e]=n}return r}function ge(e,t){if((t.override??`merge`)===`replace`){C(` → Task "${t.id}" using 'replace' strategy - completely replacing base task`,`info`),C(` Base: ${U(e.$sourceUrl)}`,`info`),C(` Override: ${U(t.$sourceUrl)}`,`info`);let{override:n,...r}=t;return r}C(` → Merging task "${t.id}"`,`info`),C(` Base: ${U(e.$sourceUrl)}`,`info`),C(` Override: ${U(t.$sourceUrl)}`,`info`);let n;if(typeof e.config==`object`&&e.config!==null&&typeof t.config==`object`&&t.config!==null){n=he(e.config,t.config,t.type);let r=me(t.type,n);r!==null&&r.length>0&&(C(` ⚠️ Warning: Conflicting config fields detected: ${r.join(`, `)}`,`warn`),C(` Please use override: "replace" or specify only one of these fields`,`warn`))}else n=t.config??e.config;let r=[...e.dependencies??[],...t.dependencies??[]],i=r.length>0?[...new Set(r)]:void 0,a=t.$sourceUrl??e.$sourceUrl,o={...e,...t,config:n,...i!=null&&{dependencies:i},...a!=null&&{$sourceUrl:a}};return delete o.override,o}function _e(){K.clear()}async function ve(e,t){if(`${e}`,t?.sequential===!0){let t=await Y(e);return`${t.length}`,{tasks:[],templates:t}}let n=await X(e);C(`Loaded ${n.tasks?.length??0} task(s)`,`info`),n.extends!=null&&n.extends!==``&&C(`Extended from: ${(Array.isArray(n.extends)?n.extends:[n.extends]).join(`, `)}`,`info`),n.prompts!=null&&n.prompts.length>0&&C(`Found ${n.prompts.length} top-level prompt(s)`,`info`),n.variables!=null&&n.variables.length>0&&C(`Found ${n.variables.length} top-level variable(s)`,`info`);let r={tasks:n.tasks??[]};return n.prompts!=null&&(r.prompts=n.prompts),n.variables!=null&&(r.variables=n.variables),n.enabled!=null&&(r.enabled=n.enabled),n.transformers!=null&&(r.transformers=n.transformers),r}Object.defineProperty(exports,`A`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`C`,{enumerable:!0,get:function(){return re}}),Object.defineProperty(exports,`D`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`E`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`M`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`O`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return ne}}),Object.defineProperty(exports,`T`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return se}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return ve}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return le}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`j`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`k`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return ue}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return $}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return _e}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return oe}}),Object.defineProperty(exports,`w`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return ce}});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import e from"node:path";import t from"node:fs";import n from"node:process";import{promisify as r}from"node:util";import"handlebars";import i from"node:os";import{execSync as a}from"node:child_process";var o=class extends Error{constructor(e,t){super(e),this.code=t,this.name=this.constructor.name}},s=class e extends o{constructor(e,t,n){super(e,`CIRCULAR_DEPENDENCY`),this.dependencyChain=t,this.resolvedPath=n,this.name=`CircularDependencyError`}static forConfigurationInheritance(t,n){let r=Array.from(t);return new e(`Circular dependency detected: ${r.join(` -> `)} -> ${n}`,r,n)}static forTemplateInheritance(t,n){return e.forConfigurationInheritance(t,n)}static forTaskDependency(t){return new e(`Circular dependency detected involving task: ${t}`,[t])}static forTemplateDependencies(t,n){let r=[...t,n];return new e(`Circular dependency detected in template dependencies: ${r.join(` -> `)}`,r)}},c=class e extends o{constructor(e,t){super(e,`CONFIG_FILE_NOT_FOUND`),this.filePath=t,this.name=`ConfigFileNotFoundError`}static forPath(t){return new e(`Configuration file not found: ${t}`,t)}},l=class e extends o{constructor(e,t,n){super(e,`CONFIG_FETCH_ERROR`),this.url=t,this.originalError=n,this.name=`ConfigFetchError`}static forUrl(t,n,r){return typeof n==`number`?new e(`Failed to fetch configuration from ${t}: ${n} ${r??``}`.trim(),t):new e(`Failed to fetch configuration from ${t}: ${n?.message??String(n??`Unknown error`)}`,t,n)}},u=class e extends o{constructor(e,t,n){super(e,`CONFIG_PARSE_ERROR`),this.filePath=t,this.originalError=n,this.name=`ConfigParseError`}static forFile(t,n){return new e(`Failed to parse configuration file ${t}: ${n.message}`,t,n)}},d=class e extends o{constructor(e,t){super(e,`INVALID_CONFIG`),this.filePath=t,this.name=`InvalidConfigError`}static forFile(t,n){return new e(`Invalid configuration file ${t}: ${n}`,t)}static tasksNotArray(t){return new e(`Invalid configuration file ${t}: 'tasks' must be an array if provided`,t)}static missingName(t){return new e(`Invalid configuration file ${t}: 'name' field is required`,t)}static invalidNameFormat(t,n){return new e(`Invalid configuration file ${t}: 'name' field "${n}" must contain only lowercase letters, digits, and hyphens. It cannot start or end with a hyphen, and cannot contain consecutive hyphens.`,t)}},f=class e extends o{constructor(e,t,n,r){super(e,`DUPLICATE_ID`),this.id=t,this.type=n,this.existingType=r,this.name=`DuplicateIdError`}static forId(t,n,r){return new e(`Duplicate ID "${t}" found in ${n}. This ID is already used in ${r??`unknown`}`,t,n,r)}},p=class e extends o{constructor(e,t,n,r,i){super(e,`ID_CONFLICT`),this.id=t,this.type=n,this.baseSource=r,this.overrideSource=i,this.name=`IdConflictError`}static forTask(t,n,r){return new e(`Task ID conflict: "${t}" is defined in multiple templates.\n Base task from: ${n??`unknown`}\n Override task from: ${r??`unknown`}\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the task.\n Task is being extended/overridden but no override strategy was specified.`,t,`task`,n,r)}static forVariable(t){return new e(`Variable ID conflict: "${t}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the variable.\n Variable is being extended/overridden but no override strategy was specified.`,t,`variable`)}static forPrompt(t){return new e(`Prompt ID conflict: "${t}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the prompt.\n Prompt is being extended/overridden but no override strategy was specified.`,t,`prompt`)}};function m(e){let t=new Map;for(let n of e){let e=t.get(n.name)||[];e.push(n),t.set(n.name,e)}if(Array.from(t.values()).some(e=>e.length>1))return e;let n=new Map,r=new Map,i=new Map;for(let t of e)if(n.set(t.name,t),i.set(t.name,new Set),t.dependencies!=null&&t.dependencies.length>0)for(let e of t.dependencies)i.get(t.name).add(e),r.has(e)||r.set(e,new Set),r.get(e).add(t.name);let a=new Set,o=new Map;for(let t=0;t<e.length;t++){let n=e[t],s=i.get(n.name).size>0,c=r.has(n.name)&&r.get(n.name).size>0;!s&&!c&&(a.add(n.name),o.set(n.name,t))}let c=e.filter(e=>!a.has(e.name)),l=[],u=new Set,d=new Set;function f(e){if(u.has(e))return;if(d.has(e))throw s.forTemplateDependencies(Array.from(d),e);d.add(e);let t=n.get(e);if(t!=null){let t=i.get(e);if(t!=null&&t.size>0)for(let e of t)f(e)}d.delete(e),u.add(e),t!=null&&!a.has(e)&&l.push(t)}for(let e of c)f(e.name);let p=[],m=0;for(let t=0;t<e.length;t++){let n=e[t];a.has(n.name)?p.push(n):m<l.length&&(p.push(l[m]),m++)}return p}const h={debug:`🐛`,info:`ℹ`,success:`✓`,warn:`⚠`,error:`✗`},g={debug:`\x1B[35m`,info:`\x1B[36m`,success:`\x1B[32m`,warn:`\x1B[33m`,error:`\x1B[31m`},_=`\x1B[0m`;function ee(e){}function v(e){console.log(`${g.info}${h.info} ${e}${_}`)}function y(e){console.log(`${g.success}${h.success} ${e}${_}`)}function b(e){console.log(`${g.warn}${h.warn} ${e}${_}`)}function x(e){console.log(`${g.error}${h.error} ${e}${_}`)}function S(e,t=`info`){switch(t){case`debug`:break;case`info`:v(e);break;case`success`:y(e);break;case`warn`:b(e);break;case`error`:x(e);break}}function C(e,t,n){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch(t){return n?.lazy===!0&&t instanceof ReferenceError?!0:(n?.silent!==!0&&(S(`Failed to evaluate condition: ${e}`,`warn`),t instanceof Error&&S(` Error: ${t.message}`,`warn`)),!1)}}function w(e,t,n){if(e===void 0)return!0;if(typeof e==`boolean`)return e;if(typeof e==`object`&&`type`in e){if(e.type===`exec`)return n?.lazy===!0;if(e.type===`condition`)return C(e.value,t,n?.lazy===!0?{lazy:!0}:void 0)}return!1}async function te(e,t,n){if(e===void 0)return!0;if(typeof e==`boolean`)return e;if(typeof e==`object`&&`type`in e){if(e.type===`exec`)try{let{execSync:n}=await import(`node:child_process`),{interpolateTemplate:r}=await import(`./utils-DO-s6Uy8.js`),i=n(r(e.value,t),{encoding:`utf-8`}).trim();if(i===``||i===`0`)return!1;let a=i.toLowerCase();return!(a===`false`||a===`no`)}catch(t){let{log:n}=await import(`./utils-DO-s6Uy8.js`);return n(`Failed to execute enabled command: ${e.value}`,`warn`),t instanceof Error&&n(` Error: ${t.message}`,`warn`),!1}if(e.type===`condition`)return C(e.value,t,n?.lazy===!0?{lazy:!0}:void 0)}return!1}function ne(e,t){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch{return!0}}function T(e){return e===void 0||typeof e==`boolean`?e:typeof e==`string`?{type:`condition`,value:e}:typeof e==`object`&&e&&`condition`in e&&!(`type`in e)?{type:`condition`,value:e.condition}:e}async function re(e,t){let n=T(e);if(n===void 0)return!0;if(typeof n==`boolean`)return n;if(typeof n==`object`&&n&&`type`in n){if(n.type===`exec`)try{let{execSync:e}=await import(`node:child_process`),{interpolateTemplate:r}=await import(`./utils-DO-s6Uy8.js`);return e(r(n.value,t),{encoding:`utf-8`,stdio:`ignore`}),!0}catch(e){let{log:t}=await import(`./utils-DO-s6Uy8.js`);if(typeof e==`object`&&e&&`status`in e&&typeof e.status==`number`){let{status:r}=e;if(r>=1&&r<=255)return t(`Failed to execute required command: ${n.value}`,`warn`),e instanceof Error&&t(` Error: ${e.message}`,`warn`),!1}return t(`Failed to execute required command: ${n.value}`,`warn`),e instanceof Error&&t(` Error: ${e.message}`,`warn`),!1}if(n.type===`condition`)return ne(n.value,t)}return!0}let E=!1;function D(e){E=e}const O={debug:`🐛`,info:`ℹ`,success:`✓`,warn:`⚠`,error:`✗`},k={debug:`\x1B[35m`,info:`\x1B[36m`,success:`\x1B[32m`,warn:`\x1B[33m`,error:`\x1B[31m`},A=`\x1B[0m`;function j(e){E&&console.log(`${k.debug}${O.debug} ${e}${A}`)}function ie(e){console.log(`${k.info}${O.info} ${e}${A}`)}function ae(e){console.log(`${k.success}${O.success} ${e}${A}`)}function oe(e){console.log(`${k.warn}${O.warn} ${e}${A}`)}function M(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function se(e,t,n){let r=t.split(`.`),i=e;for(let e=0;e<r.length-1;e++){let t=r[e];t!=null&&t!==``&&((!(t in i)||typeof i[t]!=`object`||i[t]===null)&&(i[t]={}),i=i[t])}let a=r[r.length-1];a!=null&&a!==``&&(i[a]=n)}function N(e,t){let n=t.split(`.`),r=e;for(let e of n)if(e!==``&&typeof r==`object`&&r)r=r[e];else return;return r}function P(t,r){if(M(t))return t;if(r==null||r===``)return e.isAbsolute(t)?t:e.resolve(n.cwd(),t);if(M(r))try{let e=new URL(`.`,r);return new URL(t,e).href}catch{throw Error(`Failed to resolve file path '${t}' relative to source URL '${r}'`)}let i=e.dirname(r);return e.isAbsolute(t)?t:e.resolve(i,t)}async function F(n){let{file:r,sourceUrl:a,tempFileExtension:o=`.tmp`,tempFilePrefix:s=`scaffoldfy`}=n,c=r,l,u,d=!1;if(M(r)){l=r,`${l}`;let n=await G(l);d=!0;let a=i.tmpdir(),c=`${s}-${Date.now()}${o}`;u=e.join(a,c),t.writeFileSync(u,n,`utf-8`),`${u}`}else if(l=P(r,a),M(l)){`${l}`;let n=await G(l);d=!0;let r=i.tmpdir(),a=`${s}-${Date.now()}${o}`;u=e.join(r,a),t.writeFileSync(u,n,`utf-8`),`${u}`}else{if(!t.existsSync(l))throw Error(`File not found: ${l}`);u=l,`${u}`}return{localFilePath:u,isRemote:d,originalPath:c,resolvedPath:l}}function I(e){if(e.isRemote&&t.existsSync(e.localFilePath))try{t.unlinkSync(e.localFilePath),`${e.localFilePath}`}catch(e){`${e instanceof Error?e.message:String(e)}`}}function L(t){switch(e.extname(t).toLowerCase()){case`.js`:case`.cjs`:case`.mjs`:return`node`;case`.sh`:return`bash`;case`.bash`:return`bash`;case`.ps1`:return`pwsh`;default:return}}function ce(e,t){switch(e){case`node`:return`node "${t}"`;case`bash`:return`bash "${t}"`;case`sh`:return`sh "${t}"`;case`pwsh`:return`pwsh -File "${t}"`;case`powershell`:return`powershell -File "${t}"`;default:return`node "${t}"`}}function le(e){switch(e){case`node`:return`.js`;case`bash`:case`sh`:return`.sh`;case`pwsh`:case`powershell`:return`.ps1`;default:return`.js`}}async function R(t,r){let i=V(t.file,r),o=t.args?.map(e=>V(e,r))??[],s={};if(t.parameters)for(let[e,n]of Object.entries(t.parameters))s[e]=V(n,r);let c=t.cwd!=null&&t.cwd!==``?e.join(n.cwd(),V(t.cwd,r)):n.cwd(),l=await F({file:i,...t.sourceUrl!=null&&t.sourceUrl!==``&&{sourceUrl:t.sourceUrl},tempFileExtension:le(t.runtime??L(i)??`node`),tempFilePrefix:`scaffoldfy-exec`}),{localFilePath:u}=l,d=t.runtime??L(u)??`node`;!t.runtime&&!L(u)&&S(`Could not detect runtime from file extension, defaulting to 'node'`,`warn`);try{let e=ce(d,u),r=o.join(` `),i=r?`${e} ${r}`:e;`${i}`;let l=a(i,{cwd:c,stdio:t.captureOutput?[`pipe`,`pipe`,`pipe`]:`inherit`,env:{...n.env,...s},encoding:t.captureOutput?`utf-8`:void 0});return t.captureOutput&&typeof l==`string`?l:void 0}finally{I(l)}}async function z(e,t){let{id:n,contextType:r,context:i,sourceUrl:o}=t;if(e==null)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let s=e;if(s.type===`conditional`){if(!i){S(`${r} "${n}": conditional value requires context but none provided`,`warn`);return}if(typeof s.condition!=`string`){S(`${r} "${n}": conditional value must have a string condition`,`error`);return}try{let e=C(s.condition,i)?s.ifTrue:s.ifFalse;return typeof e==`object`&&e?await z(e,t):e}catch(e){S(`${r} "${n}": failed to evaluate conditional value: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(s.type===`exec`){let e=s.value;if(typeof e!=`string`){S(`${r} "${n}": exec value must have a string command`,`error`);return}try{return B(a(e,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim())}catch(e){S(`${r} "${n}": failed to execute command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(s.type===`exec-file`){let e=s;if(typeof e.file!=`string`){S(`${r} "${n}": exec-file value must have a file path`,`error`);return}try{let t=await R({file:e.file,...e.runtime!=null&&e.runtime.trim()!==``&&{runtime:e.runtime},...e.args&&{args:e.args},...e.parameters&&{parameters:e.parameters},...e.cwd!==void 0&&e.cwd.trim()!==``&&{cwd:e.cwd},...o!=null&&{sourceUrl:o},captureOutput:!0},i??{});return t===void 0?void 0:B(t.trim())}catch(e){S(`${r} "${n}": failed to execute script file: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(s.type===`static`)return s.value;if(s.type===`interpolate`){let e=s.value;if(typeof e!=`string`){S(`${r} "${n}": interpolate value must be a string with {{variable}} placeholders`,`error`);return}if(!i)return S(`${r} "${n}": interpolate value requires context but none provided`,`warn`),e;try{return V(e,i)}catch(t){return S(`${r} "${n}": failed to interpolate value: ${t instanceof Error?t.message:`Unknown error`}`,`warn`),e}}if(s.type!==void 0){S(`${r} "${n}": unknown value type "${s.type}". Expected "static", "exec", "exec-file", "conditional", or "interpolate".`,`error`);return}return e}function B(e){if(e.startsWith(`{`)||e.startsWith(`[`))try{return JSON.parse(e)}catch{return e}if(/^-?\d+(?:\.\d+)?$/u.test(e)){let t=Number.parseFloat(e);if(!Number.isNaN(t))return t}return e===`true`||e===`false`?e===`true`:e}function V(e,t){return e.replace(/\{\{(?<key>[\w.]+)\}\}/gu,(e,n)=>N(t,n)?.toString()??``)}const H=r(t.readFile),U={template:[[`template`,`templateFile`]]};function W(t){if(t==null||t===``)return`current configuration`;if(M(t))return t;let r=n.cwd();return t.startsWith(r)?e.relative(r,t):t}async function G(e){if(M(e))return K(e);if(!t.existsSync(e))throw c.forPath(e);return H(e,`utf-8`)}async function K(e){try{let t=await fetch(e);if(!t.ok)throw l.forUrl(e,t.status,t.statusText);return await t.text()}catch(t){throw t instanceof Error&&t.message.includes(`Failed to fetch`)?t:l.forUrl(e,t instanceof Error?t:void 0)}}const q=new Map;async function J(r,i=new Set){let a=M(r),o;if(o=a||e.isAbsolute(r)?r:e.resolve(n.cwd(),r),q.has(o))return q.get(o);if(i.has(o))throw s.forConfigurationInheritance(i,o);i.add(o);let l;if(a)l=await K(o);else{if(!t.existsSync(o))throw c.forPath(o);l=await H(o,`utf-8`)}let f;try{f=JSON.parse(l)}catch(e){throw u.forFile(o,e instanceof Error?e:Error(String(e)))}if(f.name==null||f.name.trim()===``)throw d.missingName(o);if(!/^[a-z\d]+(?:-[a-z\d]+)*$/u.test(f.name))throw d.invalidNameFormat(o,f.name);if(f.tasks!==void 0&&!Array.isArray(f.tasks))throw d.tasksNotArray(o);f.tasks===void 0&&(f.tasks=[]);for(let e of f.tasks)e.$sourceUrl=o;if(f.variables!==void 0)for(let e of f.variables)e.$sourceUrl=o;if(f.prompts!==void 0)for(let e of f.prompts)e.$sourceUrl=o;return q.set(o,f),f}async function Y(t,r,i,a,o){let c=M(t),l;if(l=c||e.isAbsolute(t)?t:r==null?e.resolve(n.cwd(),t):M(r)?new URL(t,r).href:e.resolve(r,t),i.has(l))return;if(a.has(l))throw s.forConfigurationInheritance(a,l);a.add(l);let u=await J(l),d=M(l)?new URL(`.`,l).href:e.dirname(l);if(u.extends!=null&&u.extends!==``){let e=Array.isArray(u.extends)?u.extends:[u.extends];for(let t of e)await Y(t,d,i,a,o)}a.delete(l),i.add(l),o.push(u)}async function X(e,t,n=new Set){let r=[];return await Y(e,t,n,new Set,r),m(r)}async function Z(e,t,n=new Set){return $(await X(e,t,n))}function Q(e,t,n){let r=new Map;for(let t of e){if(r.has(t.id))throw f.forId(t.id,`task`,r.get(t.id));r.set(t.id,`task`)}if(t!=null)for(let e of t){if(r.has(e.id))throw f.forId(e.id,`variable`,r.get(e.id));r.set(e.id,`variable`)}if(n!=null)for(let e of n){if(r.has(e.id))throw f.forId(e.id,`prompt`,r.get(e.id));r.set(e.id,`prompt`)}}function ue(e,t){if((t.override??`merge`)===`replace`){S(` → Variable "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}S(` → Variable "${t.id}" merged (value replaced)`,`info`);let n=t.$sourceUrl??e.$sourceUrl,r={...e,...t,...n!=null&&{$sourceUrl:n}};return delete r.override,r}function de(e,t){if((t.override??`merge`)===`replace`){S(` → Prompt "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}S(` → Prompt "${t.id}" merged`,`info`);let n=t.$sourceUrl??e.$sourceUrl,r={...e,...t,...n!=null&&{$sourceUrl:n}};return delete r.override,r}function $(e){if(e.length===0)return{name:`Empty Configuration`,tasks:[]};if(e.length===1){let t=e[0];return Q(t.tasks??[],t.variables,t.prompts),t}let t=new Map,n=new Map,r=new Map,i={};for(let a of e){if(a.enabled!=null&&(i[a.name]=a.enabled),a.enabled===!1){S(`⊘ Skipping disabled configuration "${a.name}" - its tasks, prompts, and variables will not be included`,`info`);continue}if(a.prompts!=null)for(let e of a.prompts)if(r.has(e.id)){if(e.override==null)throw p.forPrompt(e.id);let t=de(r.get(e.id),e);a.enabled!=null&&(t.$configEnabled=a.enabled),r.set(e.id,t)}else{let t={...e};a.enabled!=null&&(t.$configEnabled=a.enabled),r.set(e.id,t)}if(a.variables!=null)for(let e of a.variables)if(n.has(e.id)){if(e.override==null)throw p.forVariable(e.id);let t=ue(n.get(e.id),e);a.enabled!=null&&(t.$configEnabled=a.enabled),n.set(e.id,t)}else{let t={...e};a.enabled!=null&&(t.$configEnabled=a.enabled),n.set(e.id,t)}for(let e of a.tasks??[])if(t.has(e.id)){if(e.override==null){let n=t.get(e.id);throw p.forTask(e.id,W(n.$sourceUrl),W(e.$sourceUrl))}let n=me(t.get(e.id),e);a.enabled!=null&&(n.$configEnabled=a.enabled),t.set(e.id,n)}else{let n={...e};a.enabled!=null&&(n.$configEnabled=a.enabled),t.set(e.id,n)}}let a=Array.from(t.values()),o=r.size>0?Array.from(r.values()):void 0,s=n.size>0?Array.from(n.values()):void 0;Q(a,s,o);let c=e[e.length-1],l={name:c.name,tasks:a};return c.description!=null&&(l.description=c.description),c.dependencies!=null&&(l.dependencies=c.dependencies),c.enabled!=null&&(l.enabled=c.enabled),o!=null&&(l.prompts=o),s!=null&&(l.variables=s),l}function fe(e,t){let n=U[e];if(!n)return null;for(let e of n){let n=e.filter(e=>e in t&&t[e]!=null);if(n.length>1)return n}return null}function pe(e,t,n){let r={...e},i=U[n]??[];for(let[e,n]of Object.entries(t)){for(let t of i)if(t.includes(e)){for(let n of t)n!==e&&delete r[n];break}r[e]=n}return r}function me(e,t){if((t.override??`merge`)===`replace`){S(` → Task "${t.id}" using 'replace' strategy - completely replacing base task`,`info`),S(` Base: ${W(e.$sourceUrl)}`,`info`),S(` Override: ${W(t.$sourceUrl)}`,`info`);let{override:n,...r}=t;return r}S(` → Merging task "${t.id}"`,`info`),S(` Base: ${W(e.$sourceUrl)}`,`info`),S(` Override: ${W(t.$sourceUrl)}`,`info`);let n;if(typeof e.config==`object`&&e.config!==null&&typeof t.config==`object`&&t.config!==null){n=pe(e.config,t.config,t.type);let r=fe(t.type,n);r!==null&&r.length>0&&(S(` ⚠️ Warning: Conflicting config fields detected: ${r.join(`, `)}`,`warn`),S(` Please use override: "replace" or specify only one of these fields`,`warn`))}else n=t.config??e.config;let r=[...e.dependencies??[],...t.dependencies??[]],i=r.length>0?[...new Set(r)]:void 0,a=t.$sourceUrl??e.$sourceUrl,o={...e,...t,config:n,...i!=null&&{dependencies:i},...a!=null&&{$sourceUrl:a}};return delete o.override,o}function he(){q.clear()}async function ge(e,t){if(`${e}`,t?.sequential===!0){let t=await X(e);return`${t.length}`,{tasks:[],templates:t}}let n=await Z(e);S(`Loaded ${n.tasks?.length??0} task(s)`,`info`),n.extends!=null&&n.extends!==``&&S(`Extended from: ${(Array.isArray(n.extends)?n.extends:[n.extends]).join(`, `)}`,`info`),n.prompts!=null&&n.prompts.length>0&&S(`Found ${n.prompts.length} top-level prompt(s)`,`info`),n.variables!=null&&n.variables.length>0&&S(`Found ${n.variables.length} top-level variable(s)`,`info`);let r={tasks:n.tasks??[]};return n.prompts!=null&&(r.prompts=n.prompts),n.variables!=null&&(r.variables=n.variables),n.enabled!=null&&(r.enabled=n.enabled),n.transformers!=null&&(r.transformers=n.transformers),r}export{b as A,te as C,v as D,x as E,o as M,S as O,w as S,ee as T,ie as _,ge as a,oe as b,z as c,F as d,P as f,j as g,M as h,J as i,s as j,y as k,R as l,se as m,G as n,$ as o,N as p,Z as r,V as s,he as t,I as u,D as v,C as w,re as x,ae as y};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
require(`./config-inheritance-CtSb5haE.cjs`);const e=require(`./run-tasks-CgFJyU4i.cjs`);require(`./config-CQ-mWBG5.cjs`),exports.runTasks=e.t,exports.runTemplatesSequentially=e.n;
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import{C as e,D as t,M as n,O as r,S as i,T as a,_ as o,b as s,c,f as l,g as u,j as d,l as f,m as p,n as m,s as h,w as g,x as _,y as v}from"./config-inheritance-DLd3amMI.js";import{t as ee}from"./config-nfiOxhDM.js";import y from"node:path";import b from"node:fs";import x from"node:process";import{promisify as S}from"node:util";import{execSync as C}from"node:child_process";import{confirm as w,input as te,number as ne,password as re,select as ie}from"@inquirer/prompts";import{camelCase as ae,capitalCase as oe,constantCase as se,kebabCase as T,lowerCase as ce,pascalCase as le,snakeCase as E,upperCase as ue}from"case-anything";var de=class e extends n{constructor(e,t){super(e,`TASK_NOT_FOUND`),this.taskId=t,this.name=`TaskNotFoundError`}static forId(t){return new e(`Task not found: ${t}`,t)}},D=class e extends n{constructor(e,t,n){super(e,`PROMPT_VALIDATION_ERROR`),this.promptId=t,this.reason=n,this.name=`PromptValidationError`}static required(t){return new e(`Prompt "${t}" is required`,t,`required`)}static unknownType(t){return new e(`Unknown prompt type: ${t}`,t,`unknown_type`)}},O=class e extends n{constructor(e,t,n){super(e,`PLUGIN_CONFIGURATION_ERROR`),this.pluginType=t,this.configIssue=n,this.name=`PluginConfigurationError`}static templateMissingTemplateOrFile(){return new e(`Template task requires either "template" (inline) or "templateFile" (file path) to be specified`,`template`,`missing_template_or_file`)}static templateHasBothTemplateAndFile(){return new e(`Template task cannot have both "template" and "templateFile" specified. Use one or the other.`,`template`,`both_template_and_file`)}static createMissingTemplateOrFile(){return new e(`Create task requires either "template" (inline) or "templateFile" (file path) to be specified`,`create`,`missing_template_or_file`)}static createHasBothTemplateAndFile(){return new e(`Create task cannot have both "template" and "templateFile" specified. Use one or the other.`,`create`,`both_template_and_file`)}},k=class e extends n{constructor(e,t,n){super(e,`TRANSFORMER_ERROR`),this.transformerId=t,this.reason=n,this.name=`TransformerError`}static notFound(t){return new e(`Transformer "${t}" not found`,t,`not_found`)}static executionFailed(t,n){return new e(`Transformer "${t}" execution failed: ${n}`,t,`execution_failed`)}static invalidType(t,n){return new e(`Invalid transformer type "${n}" for transformer "${t}"`,t,`invalid_type`)}};function A(e){return e.template!=null&&e.template!==``}function j(e){return e.templateFile!=null&&e.templateFile!==``}function fe(e){return e.endsWith(`.hbs`)}function M(e){let t=A(e),n=j(e);return!t&&!n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration requires either "template" (inline) or "templateFile" (file path) to be specified`}:t&&n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration cannot have both "template" and "templateFile" specified. Use one or the other.`}:{isValid:!0,hasInlineTemplate:t,hasTemplateFile:n}}async function N(e,t,n,r={}){let{enableHandlebars:i=!0,sourceUrl:a=n?.$sourceUrl}=r,o=A(e),s=j(e);if(o)return h(e.template,t);if(s){let n=e.templateFile,r=i&&fe(n),o=await m(l(n,a));return r?(await import(`handlebars`)).default.compile(o)(t):h(o,t)}throw Error(`No template content available`)}function pe(e){return A(e)?`inline template`:j(e)?`template file: ${e.templateFile}`:`no template source`}const P=S(b.readFile),F={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function I(e,t){switch(t){case`add`:return`${F.green}+ ${e}${F.reset}`;case`remove`:return`${F.red}- ${e}${F.reset}`;case`context`:return`${F.gray} ${e}${F.reset}`;default:return e}}function L(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(I(t,`context`)):(t!==void 0&&i.push(I(t,`remove`)),a!==void 0&&i.push(I(a,`add`)))}return i}async function R(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;let n=y.join(x.cwd(),e.file);if(!b.existsSync(n))return`${F.red}✗ File not found: ${e.file}${F.reset}`;try{let r=await P(n,`utf-8`),i=JSON.parse(r),a={...i};function o(e){if(typeof e==`string`)return h(e,t);if(Array.isArray(e))return e.map(e=>o(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=o(r);return t}return e}for(let[t,n]of Object.entries(e.updates)){let e=o(n);t.includes(`.`)?p(i,t,e):i[t]=e}let s=JSON.stringify(a,null,2),c=JSON.stringify(i,null,2);if(s===c)return`${F.cyan}→ No changes${F.reset}`;let l=L(s,c);return`${F.blue}File: ${e.file}${F.reset}\n${l.join(`
|
|
4
|
-
`)}`}catch(e){return`${F.red}✗ Error: ${e instanceof Error?e.message:String(e)}${F.reset}`}}async function me(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;if(e.template==null||e.template===``)return`${F.red}✗ No template content provided for file: ${e.file}${F.reset}`;let n=y.join(x.cwd(),e.file),r=h(e.template,t);if(!b.existsSync(n)){let t=r.split(`
|
|
5
|
-
`).slice(0,10).join(`
|
|
6
|
-
`),n=r.split(`
|
|
7
|
-
`).length>10;return`${F.blue}File: ${e.file}${F.reset}\n${F.green}+ New file would be created${F.reset}\n${F.gray}Content preview:${F.reset}\n${t}${n?`
|
|
8
|
-
...`:``}`}try{let t=await P(n,`utf-8`);if(t===r)return`${F.cyan}→ No changes${F.reset}`;let i=L(t,r);return`${F.blue}File: ${e.file}${F.reset}\n${i.join(`
|
|
9
|
-
`)}`}catch(e){return`${F.red}✗ Error: ${e instanceof Error?e.message:String(e)}${F.reset}`}}async function he(e,t,n){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;let r=y.join(x.cwd(),e.file);if(b.existsSync(r))return`${F.cyan}→ File already exists, would be skipped: ${e.file}${F.reset}`;try{if(A(e)){let r=await N(e,t,n),i=r.split(`
|
|
10
|
-
`).slice(0,10).join(`
|
|
11
|
-
`),a=r.split(`
|
|
12
|
-
`).length>10;return`${F.blue}File: ${e.file}${F.reset}\n${F.green}+ New file would be created${F.reset}\n${F.gray}Content preview:${F.reset}\n${i}${a?`
|
|
13
|
-
...`:``}`}let r=pe(e);return`${F.blue}File: ${e.file}${F.reset}\n${F.green}+ New file would be created from ${r}${F.reset}`}catch(e){return`${F.red}✗ Error: ${e instanceof Error?e.message:String(e)}${F.reset}`}}async function z(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;let n=y.join(x.cwd(),e.file);if(!b.existsSync(n))return`${F.red}✗ File not found: ${e.file}${F.reset}`;try{let r=await P(n,`utf-8`),i=new RegExp(e.pattern,e.flags??`g`),a=h(e.replacement,t),o=r.replace(i,a);if(r===o)return`${F.cyan}→ No matches found${F.reset}`;let s=L(r,o);return`${F.blue}File: ${e.file}${F.reset}\n${s.join(`
|
|
14
|
-
`)}`}catch(e){return`${F.red}✗ Error: ${e instanceof Error?e.message:String(e)}${F.reset}`}}async function ge(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;let n=y.join(x.cwd(),e.file);if(!b.existsSync(n))return`${F.red}✗ File not found: ${e.file}${F.reset}`;try{let r=await P(n,`utf-8`),i=r;for(let{find:n,replace:i}of e.replacements){let e=h(n,t),a=h(i,t);r=r.replace(e,a)}if(i===r)return`${F.cyan}→ No changes${F.reset}`;let a=L(i,r);return`${F.blue}File: ${e.file}${F.reset}\n${a.join(`
|
|
15
|
-
`)}`}catch(e){return`${F.red}✗ Error: ${e instanceof Error?e.message:String(e)}${F.reset}`}}function _e(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;let n=e.paths.map(e=>h(e,t)).filter(e=>b.existsSync(y.join(x.cwd(),e)));return n.length===0?`${F.cyan}→ No files/directories to delete${F.reset}`:`${F.red}Would delete:${F.reset}\n${n.map(e=>`${F.red} - ${e}${F.reset}`).join(`
|
|
16
|
-
`)}`}function ve(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;let n=h(e.from,t),r=h(e.to,t),i=y.join(x.cwd(),n),a=y.join(x.cwd(),r);return b.existsSync(i)?b.existsSync(a)?`${F.yellow}⚠ Destination already exists: ${r}${F.reset}\n${F.cyan}Would rename: ${n} → ${r}${F.reset}`:`${F.cyan}Would rename: ${n} → ${r}${F.reset}`:`${F.red}✗ Source not found: ${n}${F.reset}`}function ye(e){if(e.condition!=null&&e.condition!==``)return`${F.yellow}⊘ Condition check skipped in dry-run${F.reset}`;let t=y.join(x.cwd(),`.git`),n=b.existsSync(t),r=[];if(e.removeExisting&&n&&r.push(`${F.red}Would remove existing .git directory${F.reset}`),r.push(`${F.green}Would initialize git repository${F.reset}`),e.initialCommit){let t=e.message??`Initial commit`;r.push(`${F.green}Would create initial commit: "${t}"${F.reset}`)}return r.join(`
|
|
17
|
-
`)}function B(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;let n=h(e.command,t),r=e.cwd==null?x.cwd():h(e.cwd,t);return`${F.yellow}Would execute:${F.reset}\n${F.cyan} Command: ${n}${F.reset}\n${F.cyan} Working directory: ${r}${F.reset}`}function be(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;let n=h(e.from,t),r=h(e.to,t),i=y.join(x.cwd(),n),a=y.join(x.cwd(),r);return b.existsSync(i)?b.existsSync(a)?`${F.yellow}⚠ Destination already exists: ${r}${F.reset}\n${F.cyan}Would move: ${n} → ${r}${F.reset}`:`${F.cyan}Would move: ${n} → ${r}${F.reset}`:`${F.red}✗ Source not found: ${n}${F.reset}`}function xe(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;let n=h(e.from,t),r=h(e.to,t),i=y.join(x.cwd(),n),a=y.join(x.cwd(),r);if(!b.existsSync(i))return`${F.red}✗ Source not found: ${n}${F.reset}`;let o=b.statSync(i).isDirectory()?`directory`:`file`;return b.existsSync(a)?`${F.yellow}⚠ Destination already exists: ${r}${F.reset}\n${F.cyan}Would copy ${o}: ${n} → ${r}${F.reset}`:`${F.cyan}Would copy ${o}: ${n} → ${r}${F.reset}`}async function Se(e,t,n){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;let r=y.join(x.cwd(),e.file),i={};e.content==null?e.template!=null&&(i.template=e.template):i.template=e.content,e.templateFile!=null&&(i.templateFile=e.templateFile);try{let a=await N(i,t,n),o=a.split(`
|
|
18
|
-
`).slice(0,10).join(`
|
|
19
|
-
`),s=a.split(`
|
|
20
|
-
`).length>10;return b.existsSync(r)?`${F.blue}File: ${e.file}${F.reset}\n${F.green}+ Would append content${F.reset}\n${F.gray}Content preview:${F.reset}\n${o}${s?`
|
|
21
|
-
...`:``}`:`${F.blue}File: ${e.file}${F.reset}\n${F.green}+ New file would be created with content${F.reset}\n${F.gray}Content preview:${F.reset}\n${o}${s?`
|
|
22
|
-
...`:``}`}catch(e){return`${F.red}✗ Error: ${e instanceof Error?e.message:String(e)}${F.reset}`}}function Ce(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;let n=h(e.path,t),r=y.join(x.cwd(),n);return b.existsSync(r)?`${F.cyan}→ Directory already exists: ${n}${F.reset}`:`${F.green}+ Would create directory: ${n}${F.reset}`}async function we(e,t){try{switch(e.type){case`update-json`:return await R(e.config,t);case`write`:return await me(e.config,t);case`create`:return await he(e.config,t,e);case`regex-replace`:return await z(e.config,t);case`replace-in-file`:return await ge(e.config,t);case`delete`:return _e(e.config,t);case`rename`:return ve(e.config,t);case`move`:return be(e.config,t);case`copy`:return xe(e.config,t);case`append`:return await Se(e.config,t,e);case`mkdir`:return Ce(e.config,t);case`git-init`:return ye(e.config);case`exec`:return B(e.config,t);case`exec-file`:return B(e.config,t);default:{let t=e.type;return`${F.yellow}⚠ Diff not available for task type: ${t}${F.reset}`}}}catch(e){return`${F.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${F.reset}`}}async function V(e,t){console.log(`${F.blue}═══════════════════════════════════════════════════════${F.reset}`),console.log(`${F.blue} DRY RUN - Preview of changes${F.reset}`),console.log(`${F.blue}═══════════════════════════════════════════════════════${F.reset}`);for(let n of e){console.log(`${F.cyan}▶ Task: ${n.name}${F.reset}`),n.description!=null&&n.description!==``&&console.log(`${F.gray} ${n.description}${F.reset}`);let e=await we(n,t);console.log(e),console.log(`${F.gray}${`─`.repeat(55)}${F.reset}`)}console.log(`${F.blue}═══════════════════════════════════════════════════════${F.reset}`),console.log(`${F.yellow} No changes were applied (dry-run mode)${F.reset}`),console.log(`${F.blue}═══════════════════════════════════════════════════════${F.reset}`)}const H=new Map,U={},W=new Map;function G(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(H.has(e.name))throw TypeError(`Plugin ${e.name} is already registered`);for(let t of e.taskTypes)if(W.has(t)){let e=W.get(t);throw TypeError(`Task type "${t}" is already registered by plugin "${e}"`)}H.set(e.name,e);for(let t of e.taskTypes)W.set(t,e.name);a(`Registered plugin: ${e.name}${e.version==null?``:` v${e.version}`}`)}function Te(e){let t=H.get(e);if(t!=null){for(let e of t.taskTypes)W.delete(e);H.delete(e)}}function Ee(e){return H.get(e)}function K(e){let t=W.get(e);if(t!=null)return H.get(t)}function q(e){return W.has(e)}function De(){return Array.from(H.keys())}function Oe(){H.clear(),W.clear()}function ke(e){e.beforeAll!=null&&(U.beforeAll=e.beforeAll),e.afterAll!=null&&(U.afterAll=e.afterAll),e.beforeTask!=null&&(U.beforeTask=e.beforeTask),e.afterTask!=null&&(U.afterTask=e.afterTask),e.onError!=null&&(U.onError=e.onError)}async function J(e,...t){let n=U[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){r(`Error in ${e} hook: ${t instanceof Error?t.message:String(t)}`,`error`)}}async function Ae(e,t,n){let r=K(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}function je(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 Y=new class{transformers=new Map;constructor(){this.registerBuiltInTransformers()}registerBuiltInTransformers(){for(let e of[{id:`lowercase`,type:`lowercase`},{id:`uppercase`,type:`uppercase`},{id:`trim`,type:`trim`},{id:`slugify`,type:`slugify`},{id:`capitalize`,type:`capitalize`},{id:`titlecase`,type:`titlecase`},{id:`camelcase`,type:`camelcase`},{id:`pascalcase`,type:`pascalcase`},{id:`snakecase`,type:`snakecase`},{id:`kebabcase`,type:`kebabcase`},{id:`constantcase`,type:`constantcase`},{id:`alphanumeric`,type:`alphanumeric`},{id:`collapse-spaces`,type:`collapse-spaces`},{id:`remove-spaces`,type:`remove-spaces`},{id:`urlencode`,type:`urlencode`},{id:`dasherize`,type:`dasherize`},{id:`underscore`,type:`underscore`}])this.transformers.set(e.id,e)}register(e){this.transformers.has(e.id)&&r(`Transformer with id "${e.id}" is already registered. Overwriting.`,`warn`),this.transformers.set(e.id,e)}registerAll(e){for(let t of e)this.register(t)}get(e){return this.transformers.get(e)}has(e){return this.transformers.has(e)}async execute(e,t,n={}){let r=this.transformers.get(e);if(!r)throw k.notFound(e);try{return await this.executeTransformer(r,t,n)}catch(t){throw t instanceof k?t:k.executionFailed(e,t instanceof Error?t.message:String(t))}}async executeChain(e,t,n={}){let r=t;for(let t of e)r=await this.execute(t,r,n);return r}async apply(e,t,n={}){return e===void 0?t:this.executeChain(e,t,n)}validate(e){if(e===void 0)return[];let t=e,n=[];for(let e of t)this.has(e)||n.push(`Transformer "${e}" not found`);return n}async executeTransformer(e,t,n){switch(e.type){case`regex`:return this.executeRegex(e,t);case`computed`:return this.executeComputed(e,t,n);case`lowercase`:return this.executeLowercase(t);case`uppercase`:return this.executeUppercase(t);case`trim`:return this.executeTrim(t);case`slugify`:return this.executeSlugify(t);case`capitalize`:return this.executeCapitalize(t);case`titlecase`:return this.executeTitlecase(t);case`camelcase`:return this.executeCamelcase(t);case`pascalcase`:return this.executePascalcase(t);case`snakecase`:return this.executeSnakecase(t);case`kebabcase`:return this.executeKebabcase(t);case`constantcase`:return this.executeConstantcase(t);case`alphanumeric`:return this.executeAlphanumeric(t);case`collapse-spaces`:return this.executeCollapseSpaces(t);case`remove-spaces`:return this.executeRemoveSpaces(t);case`urlencode`:return this.executeUrlencode(t);case`dasherize`:return this.executeDasherize(t);case`underscore`:return this.executeUnderscore(t);case`custom`:return this.executeCustom(e,t,n);case`chain`:return this.executeChainTransformer(e,t,n);default:{let t=e;throw k.invalidType(t.id,t.type)}}}executeRegex(e,t){let n=String(t),{pattern:r,flags:i,replacement:a}=e.config;try{let e=new RegExp(r,i);return n.replace(e,a)}catch(t){throw k.executionFailed(e.id,`Invalid regex pattern: ${t instanceof Error?t.message:String(t)}`)}}executeComputed(e,t,n){let{expression:r}=e.config;try{return Function(`value`,`context`,...Object.keys(n),`return ${r}`)(t,n,...Object.values(n))}catch(t){throw k.executionFailed(e.id,`Expression evaluation failed: ${t instanceof Error?t.message:String(t)}`)}}executeLowercase(e){return ce(String(e))}executeUppercase(e){return ue(String(e))}executeTrim(e){return String(e).trim()}executeSlugify(e){return String(e).toLowerCase().trim().replace(/[\s_]+/gu,`-`).replace(/[^\w-]+/gu,``).replace(/-{2,}/gu,`-`).replace(/^-+/u,``).replace(/-+$/u,``)}async executeCustom(e,t,n){let{handler:r}=e.config;if(typeof r==`function`)return r(t,n);throw k.executionFailed(e.id,`String-based custom handlers are not yet supported. Please use function handlers.`)}async executeChainTransformer(e,t,n){let{transformers:r}=e.config;if(r.length===0)throw k.executionFailed(e.id,`Chain transformer must have at least one transformer`);return this.executeChain(r,t,n)}executeCapitalize(e){return oe(String(e))}executeTitlecase(e){return oe(String(e))}executeCamelcase(e){return ae(String(e))}executePascalcase(e){return le(String(e))}executeSnakecase(e){return E(String(e))}executeKebabcase(e){return T(String(e))}executeConstantcase(e){return se(String(e))}executeAlphanumeric(e){return String(e).replace(/[^a-zA-Z0-9]/gu,``)}executeCollapseSpaces(e){return String(e).replace(/\s+/gu,` `)}executeRemoveSpaces(e){return String(e).replace(/\s/gu,``)}executeUrlencode(e){return encodeURIComponent(String(e))}executeDasherize(e){return T(String(e))}executeUnderscore(e){return E(String(e))}clear(){this.transformers.clear()}getIds(){return Array.from(this.transformers.keys())}};async function Me(e,t,n,r){if(e!==void 0)return c(e,{id:t,contextType:`Prompt`,...n!=null&&{context:n},...r?.$sourceUrl!=null&&{sourceUrl:r.$sourceUrl}})}async function Ne(t,n=new Map,i={}){let a={};if(t.length===0)return a;for(let o of t){if(o.$configEnabled!=null&&!await e(o.$configEnabled,{...i,...a}))continue;let t={...i,...a};if(await e(o.enabled,t))try{let e,i=n.get(o.id);switch(o.default!==void 0&&(i=await Me(o.default,o.id,t,o)),o.type){case`input`:{let n={message:o.message};i!==void 0&&(n.default=String(i));let a=await _(o.required,t);if(a!==void 0&&(n.required=a),e=await te(n),a&&(e==null||typeof e==`string`&&e.trim()===``))throw r(`${o.message} is required`,`error`),D.required(o.id);break}case`password`:if(e=await re({message:o.message,mask:`*`}),await _(o.required,t)&&(e==null||typeof e==`string`&&e.trim()===``))throw r(`${o.message} is required`,`error`),D.required(o.id);break;case`number`:{let n={message:o.message};i!==void 0&&(n.default=Number(i));let a=await _(o.required,t);if(a!==void 0&&(n.required=a),o.min!==void 0&&(n.min=o.min),o.max!==void 0&&(n.max=o.max),e=await ne(n),a&&e==null)throw r(`${o.message} is required`,`error`),D.required(o.id);break}case`select`:{let t={message:o.message,choices:o.choices.map(e=>({name:e.name,value:e.value}))};i!==void 0&&(t.default=i),e=await ie(t);break}case`confirm`:{let t=i===void 0?!1:!!i;e=await w({message:o.message,default:t});break}default:throw r(`Unknown prompt type: ${o.type}`,`error`),D.unknownType(o.type)}o.transformers!==void 0&&(e=await Y.apply(o.transformers,e,{...t,...a})),a[o.id]=e}catch(e){throw e instanceof Error&&r(`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 Me(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.choices.length===0&&t.push(`Select prompt "${r.id}" must have at least one choice`);for(let e of r.choices)(!e.name||e.name.trim()===``)&&t.push(`Select prompt "${r.id}" has a choice with empty name`),e.value===void 0&&t.push(`Select prompt "${r.id}" has a choice with undefined value`)}r.type===`number`&&r.min!==void 0&&r.max!==void 0&&r.min>r.max&&t.push(`Number prompt "${r.id}" has min greater than max`)}return t}const Ie=S(b.appendFile),Le=S(b.readFile),Re=S(b.stat);async function ze(e,t,n){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t)){r(`Condition not met, skipping append task`,`info`);return}let i=y.join(x.cwd(),e.file),a={};e.content==null?e.template!=null&&(a.template=e.template):a.template=e.content,e.templateFile!=null&&(a.templateFile=e.templateFile);let o=M(a);if(!o.isValid)throw o.error?.includes(`cannot have both`)?O.templateHasBothTemplateAndFile():O.templateMissingTemplateOrFile();let s=await N(a,t,n),c=!1,l=!1;try{await Re(i),c=!0;let t=await Le(i,`utf-8`);t.length>0&&!t.endsWith(`
|
|
23
|
-
`)&&(l=e.newline!==!1)}catch{}c&&l?await Ie(i,`\n${s}`):await Ie(i,s),r(`Appended content to ${e.file}`,`success`)}const Be={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await ze(e.config,t,e)}},Ve=S(b.copyFile),He=S(b.stat),Ue=S(b.mkdir),We=S(b.readdir);async function Ge(e,t){await Ue(t,{recursive:!0});let n=await We(e,{withFileTypes:!0});await Promise.all(n.map(async n=>{let r=y.join(e,n.name),i=y.join(t,n.name);n.isDirectory()?await Ge(r,i):await Ve(r,i)}))}async function Ke(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t)){r(`Condition not met, skipping copy task`,`info`);return}let n=y.join(x.cwd(),e.from),i=y.join(x.cwd(),e.to),a;try{a=await He(n)}catch{r(`Source path does not exist: ${n}`,`warn`);return}await Ue(y.dirname(i),{recursive:!0}),a.isDirectory()?(await Ge(n,i),r(`Copied directory ${e.from} to ${e.to}`,`success`)):(await Ve(n,i),r(`Copied file ${e.from} to ${e.to}`,`success`))}const qe={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await Ke(e.config,t)}},Je=S(b.writeFile);async function Ye(e,t,n){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t)){r(`Condition not met, skipping create task`,`info`);return}let i=y.join(x.cwd(),e.file);if(b.existsSync(i)){r(`File already exists, skipping: ${e.file}`,`info`);return}let a=M(e);if(!a.isValid)throw a.error?.includes(`cannot have both`)?O.createHasBothTemplateAndFile():O.createMissingTemplateOrFile();let o=await N(e,t,n),s=y.dirname(i);b.existsSync(s)||b.mkdirSync(s,{recursive:!0}),await Je(i,o),r(`Created file: ${e.file}`,`success`)}const Xe={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await Ye(e.config,t,e)}};async function Ze(e,t){let{paths:n,condition:i}=e;if(i!=null&&i!==``){if(!t){r(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!g(i,t)){r(`Condition not met, skipping deletion`,`info`);return}}for(let e of n){let t=y.join(x.cwd(),e);b.existsSync(t)&&b.rmSync(t,{recursive:!0,force:!0})}}const Qe={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await Ze(e.config,t)}};async function $e(e,t,n){e.condition!=null&&e.condition!==``&&!g(e.condition,t)||await f({file:e.file,...e.runtime&&{runtime:e.runtime},...e.args&&{args:e.args},...e.parameters&&{parameters:e.parameters},...e.cwd!=null&&e.cwd.trim()!==``&&{cwd:e.cwd},...n?.$sourceUrl!=null&&n.$sourceUrl.trim()!==``&&{sourceUrl:n.$sourceUrl},captureOutput:!1},t)}const et={name:`exec-file`,version:`1.0.0`,taskTypes:[`exec-file`],execute:async(e,t,n)=>{n.dryRun||await $e(e.config,t,e)}};async function tt(e,t){if(e.condition!=null&&e.condition!==``){if(!t){r(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!g(e.condition,t)){r(`Condition not met, skipping exec task`,`info`);return}}let n=e.cwd==null?x.cwd():y.join(x.cwd(),e.cwd);C(e.command,{cwd:n,stdio:`inherit`})}const nt={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await tt(e.config,t)}};async function rt(e,t){if(e.condition!=null&&e.condition!==``){if(!t){r(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!g(e.condition,t)){r(`Condition not met, skipping git-init task`,`info`);return}}if(e.removeExisting){let e=y.join(x.cwd(),`.git`);b.existsSync(e)&&b.rmSync(e,{recursive:!0,force:!0})}if(C(`git init`,{stdio:`inherit`}),e.initialCommit){let t=e.message??`Initial commit`;C(`git add .`,{stdio:`inherit`}),C(`git commit -m "${t}"`,{stdio:`inherit`})}}const it={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await rt(e.config,t)}},at=S(b.mkdir);async function ot(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t)){r(`Condition not met, skipping mkdir task`,`info`);return}await at(y.join(x.cwd(),e.path),{recursive:!0}),r(`Created directory: ${e.path}`,`success`)}const st={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await ot(e.config,t)}},ct=S(b.rename),lt=S(b.stat),ut=S(b.mkdir);async function dt(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t)){r(`Condition not met, skipping move task`,`info`);return}let n=y.join(x.cwd(),e.from),i=y.join(x.cwd(),e.to);try{await lt(n)}catch{r(`Source path does not exist: ${n}`,`warn`);return}await ut(y.dirname(i),{recursive:!0}),await ct(n,i),r(`Moved ${e.from} to ${e.to}`,`success`)}const ft={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await dt(e.config,t)}},pt=S(b.readFile),mt=S(b.writeFile);async function ht(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t)){r(`Condition not met, skipping regex-replace task`,`info`);return}let n=y.join(x.cwd(),e.file),{pattern:i}=e,a=e.flags??``,o=e.replacement||``,s=await pt(n,`utf-8`),c=new RegExp(i,a);s=s.replace(c,h(o,t)),await mt(n,s)}const gt={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await ht(e.config,t)}},_t=S(b.rename);async function vt(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t)){r(`Condition not met, skipping rename task`,`info`);return}let n=y.join(x.cwd(),h(e.from,t)),i=y.join(x.cwd(),h(e.to,t));if(!b.existsSync(n)){r(`Source path does not exist: ${n}`,`warn`);return}await _t(n,i)}const yt={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await vt(e.config,t)}},bt=S(b.readFile),xt=S(b.writeFile);async function St(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t)){r(`Condition not met, skipping replace-in-file task`,`info`);return}let n=y.join(x.cwd(),e.file),{replacements:i}=e;if(!b.existsSync(n)){r(`File not found: ${n}, skipping`,`warn`);return}let a=await bt(n,`utf-8`);for(let{find:e,replace:n}of i){let r=h(n,t);a=a.replace(new RegExp(e,`gu`),r)}await xt(n,a)}const Ct={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await St(e.config,t)}},wt=S(b.readFile),Tt=S(b.writeFile);async function Et(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t)){r(`Condition not met, skipping update-json task`,`info`);return}let n=y.join(x.cwd(),e.file),{updates:i}=e,a=await wt(n,`utf-8`),o=JSON.parse(a);function s(e){if(typeof e==`string`)return h(e,t);if(Array.isArray(e))return e.map(e=>s(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=s(r);return t}return e}for(let[e,t]of Object.entries(i)){let n=s(t);e.includes(`.`)?p(o,e,n):o[e]=n}await Tt(n,`${JSON.stringify(o,null,2)}\n`)}const Dt={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await Et(e.config,t)}},Ot=S(b.writeFile);async function kt(e,t,n){let{allowCreate:i=!0}=e;if(e.condition!=null&&e.condition!==``&&!g(e.condition,t)){r(`Condition not met, skipping write task`,`info`);return}let a=y.join(x.cwd(),e.file);if(!b.existsSync(a)){if(i===!1)throw Error(`Write task failed: file does not exist (${e.file})`);r(`File not found, creating new file: ${e.file}`,`info`)}let o=M(e);if(!o.isValid)throw o.error?.includes(`cannot have both`)?O.templateHasBothTemplateAndFile():O.templateMissingTemplateOrFile();let s=await N(e,t,n),c=y.dirname(a);b.existsSync(c)||b.mkdirSync(c,{recursive:!0}),await Ot(a,s)}const At={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await kt(e.config,t,e)}};function X(){q(`update-json`)||(G(Dt),G(At),G(Xe),G(gt),G(Ct),G(Qe),G(yt),G(it),G(nt),G(et),G(ft),G(qe),G(Be),G(st))}async function jt(e,t,n=!1){if(X(),n){r(`[DRY RUN] Would execute: ${e.name}`,`info`);return}if(q(e.type)){await Ae(e,t,{dryRun:n});return}throw TypeError(`Unknown task type: ${e.type}`)}async function Z(e,t,n,i,a=!1){try{return r(`[${n}/${i}] Running: ${e.name}...`,`info`),await jt(e,t,a),r(`[${n}/${i}] Completed: ${e.name}...`,`success`),!0}catch(t){return r(`Failed: ${e.name}`,`error`),t instanceof Error&&(r(` Reason: ${t.message}`,`error`),t.stack!=null&&x.env.DEBUG!=null&&console.error(t.stack)),!1}}function Mt(e){let t=[],n=new Set,r=new Set,i=new Map(e.map(e=>[e.id,e]));function a(e){if(n.has(e))return;if(r.has(e))throw d.forTaskDependency(e);r.add(e);let o=i.get(e);if(!o)throw de.forId(e);if(o.dependencies)for(let e of o.dependencies)a(e);r.delete(e),n.add(e),t.push(o)}for(let t of e)n.has(t.id)||a(t.id);return t}function Nt(e){let t=[];for(let n of e)if(!q(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=Pt(n);t.push(...e)}return t}function Pt(e){let t=[],n=e.config,r=typeof n.template==`string`?n.template:void 0,i=typeof n.templateFile==`string`?n.templateFile:void 0,a=M({...r!==void 0&&{template:r},...i!==void 0&&{templateFile:i}});return!a.isValid&&a.error!=null&&a.error!==``&&t.push(`Task "${e.id}" (${e.name}): ${a.error}`),(n.file==null||n.file===``)&&t.push(`Task "${e.id}" (${e.name}): Write task requires "file" property to specify the output file path`),t}function Ft(e){r(`❌ Template validation failed:`,`error`),r(``,`error`);for(let t of e)r(` • ${t}`,`error`);r(``,`error`),r(`Please fix these errors before continuing.`,`error`)}async function Q(e,t=new Map,n={}){let r={};for(let i of e){let e=t.get(i.id);e!==void 0&&(i.transformers!==void 0&&(e=await Y.apply(i.transformers,e,{...n,...r})),r[i.id]=e)}return r}async function $(t,n,r){let i=new Map;for(let a of t){if(r?.skipConditional===!0&&typeof a.value==`object`&&a.value!==null&&!Array.isArray(a.value)&&a.value.type===`conditional`)continue;if(a.$configEnabled!=null){let t={...n};for(let[e,n]of i.entries())t[e]=n;if(!await e(a.$configEnabled,t))continue}let t={...n};for(let[e,n]of i.entries())t[e]=n;let o=await c(a.value,{id:a.id,contextType:`Variable`,context:t,...a.$sourceUrl!=null&&{sourceUrl:a.$sourceUrl}});o!==void 0&&i.set(a.id,o)}return i}function It(e){let t=[],n=new Set;for(let r of e)n.has(r.id)&&t.push(`Duplicate variable ID: "${r.id}"`),n.add(r.id);return t}async function Lt(t,n){let a=ee();if(!await e(n.configEnabled,a,{lazy:!0})){o(`⊘ Template is disabled - skipping all execution`);return}n.transformers!==void 0&&n.transformers.length>0&&(u(`Registering ${n.transformers.length} transformer(s)...`),Y.registerAll(n.transformers)),u(`Registering built-in plugins...`),X(),u(`Validating task configurations...`);let c=Nt(t);c.length>0&&(Ft(c),x.exit(1)),u(`All tasks validated successfully`);let l=t.filter(e=>i(e.enabled,ee(),{lazy:!0}));u(`Resolving task dependencies...`);let d=Mt(l);u(`Sorted ${d.length} task(s) by dependencies`),o(`Welcome! Let's execute your tasks.`),n.dryRun&&s(`🔍 DRY RUN MODE - No changes will be made`),o(`This will execute your project tasks based on the defined configuration.`);let f=a,p=[...n.variables??[]];if(p.length>0){let e=It(p);e.length>0&&(r(`❌ Variable validation errors:`,`error`),e.forEach(e=>r(` - ${e}`,`error`)),x.exit(1)),u(`Resolving variable values...`);let t=await Q(p,await $(p,f,{skipConditional:!0}),f);Object.assign(f,t),Object.keys(t).length>0&&(u(`Resolved ${Object.keys(t).length} variable(s)`),u(`Variable values: ${JSON.stringify(t)}`))}let m=n.prompts??[],h=[...m];if(h.length>0){let e=Fe(h);e.length>0&&(r(`❌ Prompt validation errors:`,`error`),e.forEach(e=>r(` - ${e}`,`error`)),x.exit(1)),u(`Resolving prompt default values...`);let t=await Pe(h,f);if(m.length>0){o(`📋 Collecting prompts (available to all tasks):`);let e=await Ne(m,t,f);Object.assign(f,e)}}if(p.length>0){let e=p.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1);if(e.length>0){u(`Re-resolving conditional variables with prompt values...`);let t=await Q(e,await $(e,f),f);Object.assign(f,t),Object.keys(t).length>0&&u(`Resolved ${Object.keys(t).length} conditional variable(s)`)}}if(!await e(n.configEnabled,f)){o(`⊘ Template is disabled after variable resolution - skipping all execution`);return}let g=[];for(let t of d)t.$configEnabled!=null&&!await e(t.$configEnabled,f)||await e(t.enabled,f)&&g.push(t);if(r(`${g.length} of ${d.length} task(s) enabled for execution`,`info`),n.dryRun){await V(g,f),o(`🔍 Dry run completed - no changes were made`),o(`Run without --dry-run to apply changes`);return}u(`Calling beforeAll hook...`),await J(`beforeAll`,f);let y=g.length,b=0,S=0,C=[],w=[];for(let e=0;e<g.length;e++){let t=g[e];t!=null&&(u(`Calling beforeTask hook for task: ${t.name}`),await J(`beforeTask`,t,f),await Z(t,f,e+1,y,n.dryRun)?(b++,C.push(t.id),u(`Calling afterTask hook for task: ${t.name}`),await J(`afterTask`,t,f)):(await _(t.required,f)&&(S++,w.push(t.name)),u(`Calling onError hook for task: ${t.name}`),await J(`onError`,Error(`Task ${t.name} failed`),t),s(`⚠️ Task "${t.name}" failed, continuing with remaining tasks...`)))}S>0&&(r(`\n❌ Task execution completed with ${S} error(s)`,`error`),r(`Completed: ${b}/${y} tasks`,`info`),r(`Failed tasks: ${w.join(`, `)}`,`error`),x.exit(1)),u(`Calling afterAll hook...`),await J(`afterAll`,f),v(`✅ All tasks completed successfully!`),v(` Completed: ${b}/${y} tasks`)}async function Rt(n,i,a={}){u(`Running templates with sequential variable/prompt resolution...`),u(`Total templates to process: ${n.length}`),u(`Registering built-in plugins...`),X();let c=[];console.log(``),o(`📋 Collecting input...`),console.log(``);for(let t=0;t<n.length;t++){let i=n[t];if(i==null)continue;let s=`=`.repeat(60);if(u(`\n${s}`),u(`Processing template ${t+1}/${n.length}: "${i.name}"`),u(s),u(`Current config keys: ${Object.keys(a).join(`, `)}`),!await e(i.enabled,a)){o(`⊘ Template "${i.name}" is disabled - skipping`),u(` Enabled condition: ${JSON.stringify(i.enabled)}`);continue}let l=i.variables??[];if(l.length>0){u(`Processing ${l.length} variable(s) for template "${i.name}"...`);let e=It(l);e.length>0&&(r(`❌ Variable validation errors:`,`error`),e.forEach(e=>r(` - ${e}`,`error`)),x.exit(1));let t=await Q(l,await $(l,a,{skipConditional:!0}),a);Object.assign(a,t);let n=l.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1),o=0;if(n.length>0){let e=await Q(n,await $(n,a),a);if(o=Object.keys(e).length,Object.assign(a,e),o>0){u(`Resolved ${o} conditional variable(s)`);for(let[t,n]of Object.entries(e))u(` ${t} = ${JSON.stringify(n)}`)}}let s=Object.keys(t).length+o;if(s>0){u(`Total variables resolved for template: ${s}`);for(let[e,n]of Object.entries(t))u(` ${e} = ${JSON.stringify(n)}`)}}let d=i.prompts??[];if(d.length>0){u(`Processing ${d.length} prompt(s) for template "${i.name}"...`);let e=Fe(d);e.length>0&&(r(`❌ Prompt validation errors:`,`error`),e.forEach(e=>r(` - ${e}`,`error`)),x.exit(1));let t=await Ne(d,await Pe(d,a),a);Object.assign(a,t),u(`Collected ${Object.keys(t).length} prompt answer(s)`)}if(!await e(i.enabled,a)){o(`⊘ Template "${i.name}" became disabled after variable/prompt resolution - skipping tasks`);continue}let f=i.tasks??[];f.length>0&&(u(`Found ${f.length} task(s) in template "${i.name}" (will execute later)`),c.push(...f))}if(u(`
|
|
24
|
-
🔧 Validating and filtering all collected tasks...`),c.length===0){r(`No tasks found in any template`,`info`);return}let l=Nt(c);l.length>0&&(Ft(l),x.exit(1)),console.log(``),r(`🛠️ Preparing tasks...`,`info`);let d=[];for(let t of c)await e(t.enabled,a)&&d.push(t);if(console.log(``),r(`Found ${c.length} tasks (${d.length} enabled)`,`info`),r(`All tasks validated successfully`,`success`),d.length===0){r(`No enabled tasks to execute`,`info`);return}let f=Mt(d);if(i.dryRun){r(`
|
|
25
|
-
🔍 Dry run - showing task changes...`,`info`),await V(f,a),r(`
|
|
26
|
-
🔍 Dry run completed - no changes were made`,`info`),r(`Run without --dry-run to apply changes`,`info`);return}console.log(``),t(`⚙️ Executing tasks...`),console.log(``),await J(`beforeAll`,a);let p=0,m=0,h=[];for(let e=0;e<f.length;e++){let t=f[e];t!=null&&(await J(`beforeTask`,t,a),await Z(t,a,e+1,f.length,i.dryRun)?(p++,await J(`afterTask`,t,a)):(await _(t.required,a)&&(m++,h.push(t.name)),await J(`onError`,Error(`Task ${t.name} failed`),t),s(`⚠️ Task "${t.name}" failed, continuing with remaining tasks...`)))}await J(`afterAll`,a),m>0&&(r(`\n❌ Task execution completed with ${m} error(s)`,`error`),r(`Completed: ${p}/${f.length} tasks`,`info`),r(`Failed tasks: ${h.join(`, `)}`,`error`),x.exit(1)),r(`Completed: ${p}/${f.length} tasks`,`success`)}export{z as _,Ae as a,we as b,q as c,G as d,Te as f,ye as g,B as h,je as i,De as l,_e as m,Rt as n,Ee as o,V as p,Oe as r,K as s,Lt as t,ke as u,ve as v,R as x,ge as y};
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
const e=require(`./chunk-DjWAcSYV.cjs`),t=require(`./config-inheritance-CtSb5haE.cjs`),n=require(`./config-CQ-mWBG5.cjs`);let r=require(`node:fs`);r=e.t(r);let i=require(`node:path`);i=e.t(i);let a=require(`node:process`);a=e.t(a);let o=require(`node:util`);o=e.t(o);let s=require(`node:child_process`);s=e.t(s);let c=require(`@inquirer/prompts`);c=e.t(c);let l=require(`case-anything`);l=e.t(l);var u=class e extends t.M{constructor(e,t){super(e,`TASK_NOT_FOUND`),this.taskId=t,this.name=`TaskNotFoundError`}static forId(t){return new e(`Task not found: ${t}`,t)}},d=class e extends t.M{constructor(e,t,n){super(e,`PROMPT_VALIDATION_ERROR`),this.promptId=t,this.reason=n,this.name=`PromptValidationError`}static required(t){return new e(`Prompt "${t}" is required`,t,`required`)}static unknownType(t){return new e(`Unknown prompt type: ${t}`,t,`unknown_type`)}},f=class e extends t.M{constructor(e,t,n){super(e,`PLUGIN_CONFIGURATION_ERROR`),this.pluginType=t,this.configIssue=n,this.name=`PluginConfigurationError`}static templateMissingTemplateOrFile(){return new e(`Template task requires either "template" (inline) or "templateFile" (file path) to be specified`,`template`,`missing_template_or_file`)}static templateHasBothTemplateAndFile(){return new e(`Template task cannot have both "template" and "templateFile" specified. Use one or the other.`,`template`,`both_template_and_file`)}static createMissingTemplateOrFile(){return new e(`Create task requires either "template" (inline) or "templateFile" (file path) to be specified`,`create`,`missing_template_or_file`)}static createHasBothTemplateAndFile(){return new e(`Create task cannot have both "template" and "templateFile" specified. Use one or the other.`,`create`,`both_template_and_file`)}},p=class e extends t.M{constructor(e,t,n){super(e,`TRANSFORMER_ERROR`),this.transformerId=t,this.reason=n,this.name=`TransformerError`}static notFound(t){return new e(`Transformer "${t}" not found`,t,`not_found`)}static executionFailed(t,n){return new e(`Transformer "${t}" execution failed: ${n}`,t,`execution_failed`)}static invalidType(t,n){return new e(`Invalid transformer type "${n}" for transformer "${t}"`,t,`invalid_type`)}};function m(e){return e.template!=null&&e.template!==``}function h(e){return e.templateFile!=null&&e.templateFile!==``}function g(e){return e.endsWith(`.hbs`)}function _(e){let t=m(e),n=h(e);return!t&&!n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration requires either "template" (inline) or "templateFile" (file path) to be specified`}:t&&n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration cannot have both "template" and "templateFile" specified. Use one or the other.`}:{isValid:!0,hasInlineTemplate:t,hasTemplateFile:n}}async function v(e,n,r,i={}){let{enableHandlebars:a=!0,sourceUrl:o=r?.$sourceUrl}=i,s=m(e),c=h(e);if(s)return t.s(e.template,n);if(c){let r=e.templateFile,i=a&&g(r),s=await t.n(t.f(r,o));return i?(await import(`handlebars`)).default.compile(s)(n):t.s(s,n)}throw Error(`No template content available`)}function ee(e){return m(e)?`inline template`:h(e)?`template file: ${e.templateFile}`:`no template source`}const y=(0,o.promisify)(r.default.readFile),te=2,ne=10,re=55,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}async function C(e,n){if(e.condition!=null&&e.condition!==``&&!t.w(e.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let o=i.default.join(a.default.cwd(),e.file);if(!r.default.existsSync(o))return`${b.red}✗ File not found: ${e.file}${b.reset}`;try{let r=await y(o,`utf-8`),i=JSON.parse(r),a={...i};function s(e){if(typeof e==`string`)return t.s(e,n);if(Array.isArray(e))return e.map(e=>s(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=s(r);return t}return e}for(let[n,r]of Object.entries(e.updates)){let e=s(r);n.includes(`.`)?t.m(i,n,e):i[n]=e}let c=JSON.stringify(a,null,2),l=JSON.stringify(i,null,2);if(c===l)return`${b.cyan}→ No changes${b.reset}`;let u=S(c,l);return`${b.blue}File: ${e.file}${b.reset}\n${u.join(`
|
|
4
|
-
`)}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}async function ie(e,n){if(e.condition!=null&&e.condition!==``&&!t.w(e.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;if(e.template==null||e.template===``)return`${b.red}✗ No template content provided for file: ${e.file}${b.reset}`;let o=i.default.join(a.default.cwd(),e.file),s=t.s(e.template,n);if(!r.default.existsSync(o)){let t=s.split(`
|
|
5
|
-
`).slice(0,10).join(`
|
|
6
|
-
`),n=s.split(`
|
|
7
|
-
`).length>10;return`${b.blue}File: ${e.file}${b.reset}\n${b.green}+ New file would be created${b.reset}\n${b.gray}Content preview:${b.reset}\n${t}${n?`
|
|
8
|
-
...`:``}`}try{let t=await y(o,`utf-8`);if(t===s)return`${b.cyan}→ No changes${b.reset}`;let n=S(t,s);return`${b.blue}File: ${e.file}${b.reset}\n${n.join(`
|
|
9
|
-
`)}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}async function ae(e,n,o){if(e.condition!=null&&e.condition!==``&&!t.w(e.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let s=i.default.join(a.default.cwd(),e.file);if(r.default.existsSync(s))return`${b.cyan}→ File already exists, would be skipped: ${e.file}${b.reset}`;try{if(m(e)){let t=await v(e,n,o),r=t.split(`
|
|
10
|
-
`).slice(0,10).join(`
|
|
11
|
-
`),i=t.split(`
|
|
12
|
-
`).length>10;return`${b.blue}File: ${e.file}${b.reset}\n${b.green}+ New file would be created${b.reset}\n${b.gray}Content preview:${b.reset}\n${r}${i?`
|
|
13
|
-
...`:``}`}let t=ee(e);return`${b.blue}File: ${e.file}${b.reset}\n${b.green}+ New file would be created from ${t}${b.reset}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}async function w(e,n){if(e.condition!=null&&e.condition!==``&&!t.w(e.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let o=i.default.join(a.default.cwd(),e.file);if(!r.default.existsSync(o))return`${b.red}✗ File not found: ${e.file}${b.reset}`;try{let r=await y(o,`utf-8`),i=new RegExp(e.pattern,e.flags??`g`),a=t.s(e.replacement,n),s=r.replace(i,a);if(r===s)return`${b.cyan}→ No matches found${b.reset}`;let c=S(r,s);return`${b.blue}File: ${e.file}${b.reset}\n${c.join(`
|
|
14
|
-
`)}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}async function T(e,n){if(e.condition!=null&&e.condition!==``&&!t.w(e.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let o=i.default.join(a.default.cwd(),e.file);if(!r.default.existsSync(o))return`${b.red}✗ File not found: ${e.file}${b.reset}`;try{let r=await y(o,`utf-8`),i=r;for(let{find:i,replace:a}of e.replacements){let e=t.s(i,n),o=t.s(a,n);r=r.replace(e,o)}if(i===r)return`${b.cyan}→ No changes${b.reset}`;let a=S(i,r);return`${b.blue}File: ${e.file}${b.reset}\n${a.join(`
|
|
15
|
-
`)}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}function E(e,n){if(e.condition!=null&&e.condition!==``&&!t.w(e.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let o=e.paths.map(e=>t.s(e,n)).filter(e=>r.default.existsSync(i.default.join(a.default.cwd(),e)));return o.length===0?`${b.cyan}→ No files/directories to delete${b.reset}`:`${b.red}Would delete:${b.reset}\n${o.map(e=>`${b.red} - ${e}${b.reset}`).join(`
|
|
16
|
-
`)}`}function D(e,n){if(e.condition!=null&&e.condition!==``&&!t.w(e.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let o=t.s(e.from,n),s=t.s(e.to,n),c=i.default.join(a.default.cwd(),o),l=i.default.join(a.default.cwd(),s);return r.default.existsSync(c)?r.default.existsSync(l)?`${b.yellow}⚠ Destination already exists: ${s}${b.reset}\n${b.cyan}Would rename: ${o} → ${s}${b.reset}`:`${b.cyan}Would rename: ${o} → ${s}${b.reset}`:`${b.red}✗ Source not found: ${o}${b.reset}`}function oe(e){if(e.condition!=null&&e.condition!==``)return`${b.yellow}⊘ Condition check skipped in dry-run${b.reset}`;let t=i.default.join(a.default.cwd(),`.git`),n=r.default.existsSync(t),o=[];if(e.removeExisting&&n&&o.push(`${b.red}Would remove existing .git directory${b.reset}`),o.push(`${b.green}Would initialize git repository${b.reset}`),e.initialCommit){let t=e.message??`Initial commit`;o.push(`${b.green}Would create initial commit: "${t}"${b.reset}`)}return o.join(`
|
|
17
|
-
`)}function O(e,n){if(e.condition!=null&&e.condition!==``&&!t.w(e.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let r=t.s(e.command,n),i=e.cwd==null?a.default.cwd():t.s(e.cwd,n);return`${b.yellow}Would execute:${b.reset}\n${b.cyan} Command: ${r}${b.reset}\n${b.cyan} Working directory: ${i}${b.reset}`}function se(e,n){if(e.condition!=null&&e.condition!==``&&!t.w(e.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let o=t.s(e.from,n),s=t.s(e.to,n),c=i.default.join(a.default.cwd(),o),l=i.default.join(a.default.cwd(),s);return r.default.existsSync(c)?r.default.existsSync(l)?`${b.yellow}⚠ Destination already exists: ${s}${b.reset}\n${b.cyan}Would move: ${o} → ${s}${b.reset}`:`${b.cyan}Would move: ${o} → ${s}${b.reset}`:`${b.red}✗ Source not found: ${o}${b.reset}`}function ce(e,n){if(e.condition!=null&&e.condition!==``&&!t.w(e.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let o=t.s(e.from,n),s=t.s(e.to,n),c=i.default.join(a.default.cwd(),o),l=i.default.join(a.default.cwd(),s);if(!r.default.existsSync(c))return`${b.red}✗ Source not found: ${o}${b.reset}`;let u=r.default.statSync(c).isDirectory()?`directory`:`file`;return r.default.existsSync(l)?`${b.yellow}⚠ Destination already exists: ${s}${b.reset}\n${b.cyan}Would copy ${u}: ${o} → ${s}${b.reset}`:`${b.cyan}Would copy ${u}: ${o} → ${s}${b.reset}`}async function le(e,n,o){if(e.condition!=null&&e.condition!==``&&!t.w(e.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let s=i.default.join(a.default.cwd(),e.file),c={};e.content==null?e.template!=null&&(c.template=e.template):c.template=e.content,e.templateFile!=null&&(c.templateFile=e.templateFile);try{let t=await v(c,n,o),i=t.split(`
|
|
18
|
-
`).slice(0,10).join(`
|
|
19
|
-
`),a=t.split(`
|
|
20
|
-
`).length>10;return r.default.existsSync(s)?`${b.blue}File: ${e.file}${b.reset}\n${b.green}+ Would append content${b.reset}\n${b.gray}Content preview:${b.reset}\n${i}${a?`
|
|
21
|
-
...`:``}`:`${b.blue}File: ${e.file}${b.reset}\n${b.green}+ New file would be created with content${b.reset}\n${b.gray}Content preview:${b.reset}\n${i}${a?`
|
|
22
|
-
...`:``}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}function ue(e,n){if(e.condition!=null&&e.condition!==``&&!t.w(e.condition,n))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let o=t.s(e.path,n),s=i.default.join(a.default.cwd(),o);return r.default.existsSync(s)?`${b.cyan}→ Directory already exists: ${o}${b.reset}`:`${b.green}+ Would create directory: ${o}${b.reset}`}async function k(e,t){try{switch(e.type){case`update-json`:return await C(e.config,t);case`write`:return await ie(e.config,t);case`create`:return await ae(e.config,t,e);case`regex-replace`:return await w(e.config,t);case`replace-in-file`:return await T(e.config,t);case`delete`:return E(e.config,t);case`rename`:return D(e.config,t);case`move`:return se(e.config,t);case`copy`:return ce(e.config,t);case`append`:return await le(e.config,t,e);case`mkdir`:return ue(e.config,t);case`git-init`:return oe(e.config);case`exec`:return O(e.config,t);case`exec-file`:return O(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 A(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 k(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 j=new Map,M={},N=new Map;function P(e){if(e.name==null||e.name===``)throw TypeError(`Plugin name is required`);if(!Array.isArray(e.taskTypes)||e.taskTypes.length===0)throw TypeError(`Plugin ${e.name} must define at least one task type`);if(typeof e.execute!=`function`)throw TypeError(`Plugin ${e.name} must provide an execute function`);if(j.has(e.name))throw TypeError(`Plugin ${e.name} is already registered`);for(let t of e.taskTypes)if(N.has(t)){let e=N.get(t);throw TypeError(`Task type "${t}" is already registered by plugin "${e}"`)}j.set(e.name,e);for(let t of e.taskTypes)N.set(t,e.name);t.T(`Registered plugin: ${e.name}${e.version==null?``:` v${e.version}`}`)}function de(e){let t=j.get(e);if(t!=null){for(let e of t.taskTypes)N.delete(e);j.delete(e)}}function fe(e){return j.get(e)}function F(e){let t=N.get(e);if(t!=null)return j.get(t)}function I(e){return N.has(e)}function pe(){return Array.from(j.keys())}function me(){j.clear(),N.clear()}function he(e){e.beforeAll!=null&&(M.beforeAll=e.beforeAll),e.afterAll!=null&&(M.afterAll=e.afterAll),e.beforeTask!=null&&(M.beforeTask=e.beforeTask),e.afterTask!=null&&(M.afterTask=e.afterTask),e.onError!=null&&(M.onError=e.onError)}async function L(e,...n){let r=M[e];if(r!=null)try{e===`beforeAll`||e===`afterAll`?await r(n[0]):(e===`beforeTask`||e===`afterTask`||e===`onError`)&&await r(n[0],n[1])}catch(n){t.O(`Error in ${e} hook: ${n instanceof Error?n.message:String(n)}`,`error`)}}async function R(e,t,n){let r=F(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}function ge(e,t,n,r){return{name:e,...r?.version!=null&&{version:r.version},taskTypes:[t],execute:n,...r?.getDiff!=null&&{getDiff:r.getDiff},...r?.validate!=null&&{validate:r.validate}}}var _e=class{transformers=new Map;constructor(){this.registerBuiltInTransformers()}registerBuiltInTransformers(){for(let e of[{id:`lowercase`,type:`lowercase`},{id:`uppercase`,type:`uppercase`},{id:`trim`,type:`trim`},{id:`slugify`,type:`slugify`},{id:`capitalize`,type:`capitalize`},{id:`titlecase`,type:`titlecase`},{id:`camelcase`,type:`camelcase`},{id:`pascalcase`,type:`pascalcase`},{id:`snakecase`,type:`snakecase`},{id:`kebabcase`,type:`kebabcase`},{id:`constantcase`,type:`constantcase`},{id:`alphanumeric`,type:`alphanumeric`},{id:`collapse-spaces`,type:`collapse-spaces`},{id:`remove-spaces`,type:`remove-spaces`},{id:`urlencode`,type:`urlencode`},{id:`dasherize`,type:`dasherize`},{id:`underscore`,type:`underscore`}])this.transformers.set(e.id,e)}register(e){this.transformers.has(e.id)&&t.O(`Transformer with id "${e.id}" is already registered. Overwriting.`,`warn`),this.transformers.set(e.id,e)}registerAll(e){for(let t of e)this.register(t)}get(e){return this.transformers.get(e)}has(e){return this.transformers.has(e)}async execute(e,t,n={}){let r=this.transformers.get(e);if(!r)throw p.notFound(e);try{return await this.executeTransformer(r,t,n)}catch(t){throw t instanceof p?t:p.executionFailed(e,t instanceof Error?t.message:String(t))}}async executeChain(e,t,n={}){let r=t;for(let t of e)r=await this.execute(t,r,n);return r}async apply(e,t,n={}){return e===void 0?t:this.executeChain(e,t,n)}validate(e){if(e===void 0)return[];let t=e,n=[];for(let e of t)this.has(e)||n.push(`Transformer "${e}" not found`);return n}async executeTransformer(e,t,n){switch(e.type){case`regex`:return this.executeRegex(e,t);case`computed`:return this.executeComputed(e,t,n);case`lowercase`:return this.executeLowercase(t);case`uppercase`:return this.executeUppercase(t);case`trim`:return this.executeTrim(t);case`slugify`:return this.executeSlugify(t);case`capitalize`:return this.executeCapitalize(t);case`titlecase`:return this.executeTitlecase(t);case`camelcase`:return this.executeCamelcase(t);case`pascalcase`:return this.executePascalcase(t);case`snakecase`:return this.executeSnakecase(t);case`kebabcase`:return this.executeKebabcase(t);case`constantcase`:return this.executeConstantcase(t);case`alphanumeric`:return this.executeAlphanumeric(t);case`collapse-spaces`:return this.executeCollapseSpaces(t);case`remove-spaces`:return this.executeRemoveSpaces(t);case`urlencode`:return this.executeUrlencode(t);case`dasherize`:return this.executeDasherize(t);case`underscore`:return this.executeUnderscore(t);case`custom`:return this.executeCustom(e,t,n);case`chain`:return this.executeChainTransformer(e,t,n);default:{let t=e;throw p.invalidType(t.id,t.type)}}}executeRegex(e,t){let n=String(t),{pattern:r,flags:i,replacement:a}=e.config;try{let e=new RegExp(r,i);return n.replace(e,a)}catch(t){throw p.executionFailed(e.id,`Invalid regex pattern: ${t instanceof Error?t.message:String(t)}`)}}executeComputed(e,t,n){let{expression:r}=e.config;try{return Function(`value`,`context`,...Object.keys(n),`return ${r}`)(t,n,...Object.values(n))}catch(t){throw p.executionFailed(e.id,`Expression evaluation failed: ${t instanceof Error?t.message:String(t)}`)}}executeLowercase(e){return(0,l.lowerCase)(String(e))}executeUppercase(e){return(0,l.upperCase)(String(e))}executeTrim(e){return String(e).trim()}executeSlugify(e){return String(e).toLowerCase().trim().replace(/[\s_]+/gu,`-`).replace(/[^\w-]+/gu,``).replace(/-{2,}/gu,`-`).replace(/^-+/u,``).replace(/-+$/u,``)}async executeCustom(e,t,n){let{handler:r}=e.config;if(typeof r==`function`)return r(t,n);throw p.executionFailed(e.id,`String-based custom handlers are not yet supported. Please use function handlers.`)}async executeChainTransformer(e,t,n){let{transformers:r}=e.config;if(r.length===0)throw p.executionFailed(e.id,`Chain transformer must have at least one transformer`);return this.executeChain(r,t,n)}executeCapitalize(e){return(0,l.capitalCase)(String(e))}executeTitlecase(e){return(0,l.capitalCase)(String(e))}executeCamelcase(e){return(0,l.camelCase)(String(e))}executePascalcase(e){return(0,l.pascalCase)(String(e))}executeSnakecase(e){return(0,l.snakeCase)(String(e))}executeKebabcase(e){return(0,l.kebabCase)(String(e))}executeConstantcase(e){return(0,l.constantCase)(String(e))}executeAlphanumeric(e){return String(e).replace(/[^a-zA-Z0-9]/gu,``)}executeCollapseSpaces(e){return String(e).replace(/\s+/gu,` `)}executeRemoveSpaces(e){return String(e).replace(/\s/gu,``)}executeUrlencode(e){return encodeURIComponent(String(e))}executeDasherize(e){return(0,l.kebabCase)(String(e))}executeUnderscore(e){return(0,l.snakeCase)(String(e))}clear(){this.transformers.clear()}getIds(){return Array.from(this.transformers.keys())}};const z=new _e;async function B(e,n,r,i){if(e!==void 0)return t.c(e,{id:n,contextType:`Prompt`,...r!=null&&{context:r},...i?.$sourceUrl!=null&&{sourceUrl:i.$sourceUrl}})}async function V(e,n=new Map,r={}){let i={};if(e.length===0)return i;for(let a of e){if(a.$configEnabled!=null&&!await t.C(a.$configEnabled,{...r,...i}))continue;let e={...r,...i};if(await t.C(a.enabled,e))try{let r,o=n.get(a.id);switch(a.default!==void 0&&(o=await B(a.default,a.id,e,a)),a.type){case`input`:{let n={message:a.message};o!==void 0&&(n.default=String(o));let i=await t.x(a.required,e);if(i!==void 0&&(n.required=i),r=await(0,c.input)(n),i&&(r==null||typeof r==`string`&&r.trim()===``))throw t.O(`${a.message} is required`,`error`),d.required(a.id);break}case`password`:if(r=await(0,c.password)({message:a.message,mask:`*`}),await t.x(a.required,e)&&(r==null||typeof r==`string`&&r.trim()===``))throw t.O(`${a.message} is required`,`error`),d.required(a.id);break;case`number`:{let n={message:a.message};o!==void 0&&(n.default=Number(o));let i=await t.x(a.required,e);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,c.number)(n),i&&r==null)throw t.O(`${a.message} is required`,`error`),d.required(a.id);break}case`select`:{let e={message:a.message,choices:a.choices.map(e=>({name:e.name,value:e.value}))};o!==void 0&&(e.default=o),r=await(0,c.select)(e);break}case`confirm`:{let e=o===void 0?!1:!!o;r=await(0,c.confirm)({message:a.message,default:e});break}default:throw t.O(`Unknown prompt type: ${a.type}`,`error`),d.unknownType(a.type)}a.transformers!==void 0&&(r=await z.apply(a.transformers,r,{...e,...i})),i[a.id]=r}catch(e){throw e instanceof Error&&t.O(`Failed to collect prompt "${a.id}": ${e.message}`,`error`),e}}return i}async function H(e,t){let n=new Map,r=e.map(async e=>{if(e.default!==void 0){let r=await B(e.default,e.id,t,e);r!==void 0&&n.set(e.id,r)}});return await Promise.all(r),n}function U(e){let t=[],n=new Set;for(let r of e){if(n.has(r.id)&&t.push(`Duplicate prompt ID: ${r.id}`),n.add(r.id),/^[a-zA-Z_$][a-zA-Z0-9_$]*$/u.test(r.id)||t.push(`Invalid prompt ID "${r.id}": must be a valid JavaScript identifier (start with letter, underscore, or $, followed by letters, digits, underscores, or $)`),(!r.message||r.message.trim()===``)&&t.push(`Prompt "${r.id}" must have a non-empty message`),r.type===`select`){r.choices.length===0&&t.push(`Select prompt "${r.id}" must have at least one choice`);for(let e of r.choices)(!e.name||e.name.trim()===``)&&t.push(`Select prompt "${r.id}" has a choice with empty name`),e.value===void 0&&t.push(`Select prompt "${r.id}" has a choice with undefined value`)}r.type===`number`&&r.min!==void 0&&r.max!==void 0&&r.min>r.max&&t.push(`Number prompt "${r.id}" has min greater than max`)}return t}const W=(0,o.promisify)(r.default.appendFile),ve=(0,o.promisify)(r.default.readFile),ye=(0,o.promisify)(r.default.stat);async function be(e,n,r){if(e.condition!=null&&e.condition!==``&&!t.w(e.condition,n)){t.O(`Condition not met, skipping append task`,`info`);return}let o=i.default.join(a.default.cwd(),e.file),s={};e.content==null?e.template!=null&&(s.template=e.template):s.template=e.content,e.templateFile!=null&&(s.templateFile=e.templateFile);let c=_(s);if(!c.isValid)throw c.error?.includes(`cannot have both`)?f.templateHasBothTemplateAndFile():f.templateMissingTemplateOrFile();let l=await v(s,n,r),u=!1,d=!1;try{await ye(o),u=!0;let t=await ve(o,`utf-8`);t.length>0&&!t.endsWith(`
|
|
23
|
-
`)&&(d=e.newline!==!1)}catch{}u&&d?await W(o,`\n${l}`):await W(o,l),t.O(`Appended content to ${e.file}`,`success`)}const xe={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await be(e.config,t,e)}},G=(0,o.promisify)(r.default.copyFile),Se=(0,o.promisify)(r.default.stat),K=(0,o.promisify)(r.default.mkdir),Ce=(0,o.promisify)(r.default.readdir);async function q(e,t){await K(t,{recursive:!0});let n=await Ce(e,{withFileTypes:!0});await Promise.all(n.map(async n=>{let r=i.default.join(e,n.name),a=i.default.join(t,n.name);n.isDirectory()?await q(r,a):await G(r,a)}))}async function we(e,n){if(e.condition!=null&&e.condition!==``&&!t.w(e.condition,n)){t.O(`Condition not met, skipping copy task`,`info`);return}let r=i.default.join(a.default.cwd(),e.from),o=i.default.join(a.default.cwd(),e.to),s;try{s=await Se(r)}catch{t.O(`Source path does not exist: ${r}`,`warn`);return}await K(i.default.dirname(o),{recursive:!0}),s.isDirectory()?(await q(r,o),t.O(`Copied directory ${e.from} to ${e.to}`,`success`)):(await G(r,o),t.O(`Copied file ${e.from} to ${e.to}`,`success`))}const Te={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await we(e.config,t)}},Ee=(0,o.promisify)(r.default.writeFile);async function De(e,n,o){if(e.condition!=null&&e.condition!==``&&!t.w(e.condition,n)){t.O(`Condition not met, skipping create task`,`info`);return}let s=i.default.join(a.default.cwd(),e.file);if(r.default.existsSync(s)){t.O(`File already exists, skipping: ${e.file}`,`info`);return}let c=_(e);if(!c.isValid)throw c.error?.includes(`cannot have both`)?f.createHasBothTemplateAndFile():f.createMissingTemplateOrFile();let l=await v(e,n,o),u=i.default.dirname(s);r.default.existsSync(u)||r.default.mkdirSync(u,{recursive:!0}),await Ee(s,l),t.O(`Created file: ${e.file}`,`success`)}const Oe={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await De(e.config,t,e)}};async function ke(e,n){let{paths:o,condition:s}=e;if(s!=null&&s!==``){if(!n){t.O(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!t.w(s,n)){t.O(`Condition not met, skipping deletion`,`info`);return}}for(let e of o){let t=i.default.join(a.default.cwd(),e);r.default.existsSync(t)&&r.default.rmSync(t,{recursive:!0,force:!0})}}const Ae={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await ke(e.config,t)}};async function je(e,n,r){e.condition!=null&&e.condition!==``&&!t.w(e.condition,n)||await t.l({file:e.file,...e.runtime&&{runtime:e.runtime},...e.args&&{args:e.args},...e.parameters&&{parameters:e.parameters},...e.cwd!=null&&e.cwd.trim()!==``&&{cwd:e.cwd},...r?.$sourceUrl!=null&&r.$sourceUrl.trim()!==``&&{sourceUrl:r.$sourceUrl},captureOutput:!1},n)}const Me={name:`exec-file`,version:`1.0.0`,taskTypes:[`exec-file`],execute:async(e,t,n)=>{n.dryRun||await je(e.config,t,e)}};async function Ne(e,n){if(e.condition!=null&&e.condition!==``){if(!n){t.O(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!t.w(e.condition,n)){t.O(`Condition not met, skipping exec task`,`info`);return}}let r=e.cwd==null?a.default.cwd():i.default.join(a.default.cwd(),e.cwd);(0,s.execSync)(e.command,{cwd:r,stdio:`inherit`})}const Pe={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await Ne(e.config,t)}};async function Fe(e,n){if(e.condition!=null&&e.condition!==``){if(!n){t.O(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!t.w(e.condition,n)){t.O(`Condition not met, skipping git-init task`,`info`);return}}if(e.removeExisting){let e=i.default.join(a.default.cwd(),`.git`);r.default.existsSync(e)&&r.default.rmSync(e,{recursive:!0,force:!0})}if((0,s.execSync)(`git init`,{stdio:`inherit`}),e.initialCommit){let t=e.message??`Initial commit`;(0,s.execSync)(`git add .`,{stdio:`inherit`}),(0,s.execSync)(`git commit -m "${t}"`,{stdio:`inherit`})}}const Ie={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await Fe(e.config,t)}},Le=(0,o.promisify)(r.default.mkdir);async function Re(e,n){if(e.condition!=null&&e.condition!==``&&!t.w(e.condition,n)){t.O(`Condition not met, skipping mkdir task`,`info`);return}await Le(i.default.join(a.default.cwd(),e.path),{recursive:!0}),t.O(`Created directory: ${e.path}`,`success`)}const ze={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await Re(e.config,t)}},Be=(0,o.promisify)(r.default.rename),Ve=(0,o.promisify)(r.default.stat),He=(0,o.promisify)(r.default.mkdir);async function Ue(e,n){if(e.condition!=null&&e.condition!==``&&!t.w(e.condition,n)){t.O(`Condition not met, skipping move task`,`info`);return}let r=i.default.join(a.default.cwd(),e.from),o=i.default.join(a.default.cwd(),e.to);try{await Ve(r)}catch{t.O(`Source path does not exist: ${r}`,`warn`);return}await He(i.default.dirname(o),{recursive:!0}),await Be(r,o),t.O(`Moved ${e.from} to ${e.to}`,`success`)}const We={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await Ue(e.config,t)}},Ge=(0,o.promisify)(r.default.readFile),Ke=(0,o.promisify)(r.default.writeFile);async function qe(e,n){if(e.condition!=null&&e.condition!==``&&!t.w(e.condition,n)){t.O(`Condition not met, skipping regex-replace task`,`info`);return}let r=i.default.join(a.default.cwd(),e.file),{pattern:o}=e,s=e.flags??``,c=e.replacement||``,l=await Ge(r,`utf-8`),u=new RegExp(o,s);l=l.replace(u,t.s(c,n)),await Ke(r,l)}const Je={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await qe(e.config,t)}},Ye=(0,o.promisify)(r.default.rename);async function Xe(e,n){if(e.condition!=null&&e.condition!==``&&!t.w(e.condition,n)){t.O(`Condition not met, skipping rename task`,`info`);return}let o=i.default.join(a.default.cwd(),t.s(e.from,n)),s=i.default.join(a.default.cwd(),t.s(e.to,n));if(!r.default.existsSync(o)){t.O(`Source path does not exist: ${o}`,`warn`);return}await Ye(o,s)}const Ze={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await Xe(e.config,t)}},Qe=(0,o.promisify)(r.default.readFile),$e=(0,o.promisify)(r.default.writeFile);async function et(e,n){if(e.condition!=null&&e.condition!==``&&!t.w(e.condition,n)){t.O(`Condition not met, skipping replace-in-file task`,`info`);return}let o=i.default.join(a.default.cwd(),e.file),{replacements:s}=e;if(!r.default.existsSync(o)){t.O(`File not found: ${o}, skipping`,`warn`);return}let c=await Qe(o,`utf-8`);for(let{find:e,replace:r}of s){let i=t.s(r,n);c=c.replace(new RegExp(e,`gu`),i)}await $e(o,c)}const tt={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await et(e.config,t)}},nt=(0,o.promisify)(r.default.readFile),rt=(0,o.promisify)(r.default.writeFile),it=2;async function at(e,n){if(e.condition!=null&&e.condition!==``&&!t.w(e.condition,n)){t.O(`Condition not met, skipping update-json task`,`info`);return}let r=i.default.join(a.default.cwd(),e.file),{updates:o}=e,s=await nt(r,`utf-8`),c=JSON.parse(s);function l(e){if(typeof e==`string`)return t.s(e,n);if(Array.isArray(e))return e.map(e=>l(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=l(r);return t}return e}for(let[e,n]of Object.entries(o)){let r=l(n);e.includes(`.`)?t.m(c,e,r):c[e]=r}await rt(r,`${JSON.stringify(c,null,2)}\n`)}const ot={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await at(e.config,t)}},st=(0,o.promisify)(r.default.writeFile);async function ct(e,n,o){let{allowCreate:s=!0}=e;if(e.condition!=null&&e.condition!==``&&!t.w(e.condition,n)){t.O(`Condition not met, skipping write task`,`info`);return}let c=i.default.join(a.default.cwd(),e.file);if(!r.default.existsSync(c)){if(s===!1)throw Error(`Write task failed: file does not exist (${e.file})`);t.O(`File not found, creating new file: ${e.file}`,`info`)}let l=_(e);if(!l.isValid)throw l.error?.includes(`cannot have both`)?f.templateHasBothTemplateAndFile():f.templateMissingTemplateOrFile();let u=await v(e,n,o),d=i.default.dirname(c);r.default.existsSync(d)||r.default.mkdirSync(d,{recursive:!0}),await st(c,u)}const lt={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await ct(e.config,t,e)}};function J(){I(`update-json`)||(P(ot),P(lt),P(Oe),P(Je),P(tt),P(Ae),P(Ze),P(Ie),P(Pe),P(Me),P(We),P(Te),P(xe),P(ze))}async function ut(e,n,r=!1){if(J(),r){t.O(`[DRY RUN] Would execute: ${e.name}`,`info`);return}if(I(e.type)){await R(e,n,{dryRun:r});return}throw TypeError(`Unknown task type: ${e.type}`)}async function Y(e,n,r,i,o=!1){try{return t.O(`[${r}/${i}] Running: ${e.name}...`,`info`),await ut(e,n,o),t.O(`[${r}/${i}] Completed: ${e.name}...`,`success`),!0}catch(n){return t.O(`Failed: ${e.name}`,`error`),n instanceof Error&&(t.O(` Reason: ${n.message}`,`error`),n.stack!=null&&a.default.env.DEBUG!=null&&console.error(n.stack)),!1}}function X(e){let n=[],r=new Set,i=new Set,a=new Map(e.map(e=>[e.id,e]));function o(e){if(r.has(e))return;if(i.has(e))throw t.j.forTaskDependency(e);i.add(e);let s=a.get(e);if(!s)throw u.forId(e);if(s.dependencies)for(let e of s.dependencies)o(e);i.delete(e),r.add(e),n.push(s)}for(let t of e)r.has(t.id)||o(t.id);return n}function dt(e){let t=[];for(let n of e)if(!I(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=ft(n);t.push(...e)}return t}function ft(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=_({...r!==void 0&&{template:r},...i!==void 0&&{templateFile:i}});return!a.isValid&&a.error!=null&&a.error!==``&&t.push(`Task "${e.id}" (${e.name}): ${a.error}`),(n.file==null||n.file===``)&&t.push(`Task "${e.id}" (${e.name}): Write task requires "file" property to specify the output file path`),t}function pt(e){t.O(`❌ Template validation failed:`,`error`),t.O(``,`error`);for(let n of e)t.O(` • ${n}`,`error`);t.O(``,`error`),t.O(`Please fix these errors before continuing.`,`error`)}async function Z(e,t=new Map,n={}){let r={};for(let i of e){let e=t.get(i.id);e!==void 0&&(i.transformers!==void 0&&(e=await z.apply(i.transformers,e,{...n,...r})),r[i.id]=e)}return r}async function Q(e,n,r){let i=new Map;for(let a of e){if(r?.skipConditional===!0&&typeof a.value==`object`&&a.value!==null&&!Array.isArray(a.value)&&a.value.type===`conditional`)continue;if(a.$configEnabled!=null){let e={...n};for(let[t,n]of i.entries())e[t]=n;if(!await t.C(a.$configEnabled,e))continue}let e={...n};for(let[t,n]of i.entries())e[t]=n;let o=await t.c(a.value,{id:a.id,contextType:`Variable`,context:e,...a.$sourceUrl!=null&&{sourceUrl:a.$sourceUrl}});o!==void 0&&i.set(a.id,o)}return i}function $(e){let t=[],n=new Set;for(let r of e)n.has(r.id)&&t.push(`Duplicate variable ID: "${r.id}"`),n.add(r.id);return t}async function mt(e,r){let i=n.t();if(!await t.C(r.configEnabled,i,{lazy:!0})){t._(`⊘ Template is disabled - skipping all execution`);return}r.transformers!==void 0&&r.transformers.length>0&&(t.g(`Registering ${r.transformers.length} transformer(s)...`),z.registerAll(r.transformers)),t.g(`Registering built-in plugins...`),J(),t.g(`Validating task configurations...`);let o=dt(e);o.length>0&&(pt(o),a.default.exit(1)),t.g(`All tasks validated successfully`);let s=e.filter(e=>t.S(e.enabled,n.t(),{lazy:!0}));t.g(`Resolving task dependencies...`);let c=X(s);t.g(`Sorted ${c.length} task(s) by dependencies`),t._(`Welcome! Let's execute your tasks.`),r.dryRun&&t.b(`🔍 DRY RUN MODE - No changes will be made`),t._(`This will execute your project tasks based on the defined configuration.`);let l=i,u=[...r.variables??[]];if(u.length>0){let e=$(u);e.length>0&&(t.O(`❌ Variable validation errors:`,`error`),e.forEach(e=>t.O(` - ${e}`,`error`)),a.default.exit(1)),t.g(`Resolving variable values...`);let n=await Z(u,await Q(u,l,{skipConditional:!0}),l);Object.assign(l,n),Object.keys(n).length>0&&(t.g(`Resolved ${Object.keys(n).length} variable(s)`),t.g(`Variable values: ${JSON.stringify(n)}`))}let d=r.prompts??[],f=[...d];if(f.length>0){let e=U(f);e.length>0&&(t.O(`❌ Prompt validation errors:`,`error`),e.forEach(e=>t.O(` - ${e}`,`error`)),a.default.exit(1)),t.g(`Resolving prompt default values...`);let n=await H(f,l);if(d.length>0){t._(`📋 Collecting prompts (available to all tasks):`);let e=await V(d,n,l);Object.assign(l,e)}}if(u.length>0){let e=u.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1);if(e.length>0){t.g(`Re-resolving conditional variables with prompt values...`);let n=await Z(e,await Q(e,l),l);Object.assign(l,n),Object.keys(n).length>0&&t.g(`Resolved ${Object.keys(n).length} conditional variable(s)`)}}if(!await t.C(r.configEnabled,l)){t._(`⊘ Template is disabled after variable resolution - skipping all execution`);return}let p=[];for(let e of c)e.$configEnabled!=null&&!await t.C(e.$configEnabled,l)||await t.C(e.enabled,l)&&p.push(e);if(t.O(`${p.length} of ${c.length} task(s) enabled for execution`,`info`),r.dryRun){await A(p,l),t._(`🔍 Dry run completed - no changes were made`),t._(`Run without --dry-run to apply changes`);return}t.g(`Calling beforeAll hook...`),await L(`beforeAll`,l);let m=p.length,h=0,g=0,_=[],v=[];for(let e=0;e<p.length;e++){let n=p[e];n!=null&&(t.g(`Calling beforeTask hook for task: ${n.name}`),await L(`beforeTask`,n,l),await Y(n,l,e+1,m,r.dryRun)?(h++,_.push(n.id),t.g(`Calling afterTask hook for task: ${n.name}`),await L(`afterTask`,n,l)):(await t.x(n.required,l)&&(g++,v.push(n.name)),t.g(`Calling onError hook for task: ${n.name}`),await L(`onError`,Error(`Task ${n.name} failed`),n),t.b(`⚠️ Task "${n.name}" failed, continuing with remaining tasks...`)))}g>0&&(t.O(`\n❌ Task execution completed with ${g} error(s)`,`error`),t.O(`Completed: ${h}/${m} tasks`,`info`),t.O(`Failed tasks: ${v.join(`, `)}`,`error`),a.default.exit(1)),t.g(`Calling afterAll hook...`),await L(`afterAll`,l),t.y(`✅ All tasks completed successfully!`),t.y(` Completed: ${h}/${m} tasks`)}async function ht(e,n,r={}){t.g(`Running templates with sequential variable/prompt resolution...`),t.g(`Total templates to process: ${e.length}`),t.g(`Registering built-in plugins...`),J();let i=[];console.log(``),t._(`📋 Collecting input...`),console.log(``);for(let n=0;n<e.length;n++){let o=e[n];if(o==null)continue;let s=`=`.repeat(60);if(t.g(`\n${s}`),t.g(`Processing template ${n+1}/${e.length}: "${o.name}"`),t.g(s),t.g(`Current config keys: ${Object.keys(r).join(`, `)}`),!await t.C(o.enabled,r)){t._(`⊘ Template "${o.name}" is disabled - skipping`),t.g(` Enabled condition: ${JSON.stringify(o.enabled)}`);continue}let c=o.variables??[];if(c.length>0){t.g(`Processing ${c.length} variable(s) for template "${o.name}"...`);let e=$(c);e.length>0&&(t.O(`❌ Variable validation errors:`,`error`),e.forEach(e=>t.O(` - ${e}`,`error`)),a.default.exit(1));let n=await Z(c,await Q(c,r,{skipConditional:!0}),r);Object.assign(r,n);let i=c.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1),s=0;if(i.length>0){let e=await Z(i,await Q(i,r),r);if(s=Object.keys(e).length,Object.assign(r,e),s>0){t.g(`Resolved ${s} conditional variable(s)`);for(let[n,r]of Object.entries(e))t.g(` ${n} = ${JSON.stringify(r)}`)}}let l=Object.keys(n).length+s;if(l>0){t.g(`Total variables resolved for template: ${l}`);for(let[e,r]of Object.entries(n))t.g(` ${e} = ${JSON.stringify(r)}`)}}let l=o.prompts??[];if(l.length>0){t.g(`Processing ${l.length} prompt(s) for template "${o.name}"...`);let e=U(l);e.length>0&&(t.O(`❌ Prompt validation errors:`,`error`),e.forEach(e=>t.O(` - ${e}`,`error`)),a.default.exit(1));let n=await V(l,await H(l,r),r);Object.assign(r,n),t.g(`Collected ${Object.keys(n).length} prompt answer(s)`)}if(!await t.C(o.enabled,r)){t._(`⊘ Template "${o.name}" became disabled after variable/prompt resolution - skipping tasks`);continue}let u=o.tasks??[];u.length>0&&(t.g(`Found ${u.length} task(s) in template "${o.name}" (will execute later)`),i.push(...u))}if(t.g(`
|
|
24
|
-
🔧 Validating and filtering all collected tasks...`),i.length===0){t.O(`No tasks found in any template`,`info`);return}let o=dt(i);o.length>0&&(pt(o),a.default.exit(1)),console.log(``),t.O(`🛠️ Preparing tasks...`,`info`);let s=[];for(let e of i)await t.C(e.enabled,r)&&s.push(e);if(console.log(``),t.O(`Found ${i.length} tasks (${s.length} enabled)`,`info`),t.O(`All tasks validated successfully`,`success`),s.length===0){t.O(`No enabled tasks to execute`,`info`);return}let c=X(s);if(n.dryRun){t.O(`
|
|
25
|
-
🔍 Dry run - showing task changes...`,`info`),await A(c,r),t.O(`
|
|
26
|
-
🔍 Dry run completed - no changes were made`,`info`),t.O(`Run without --dry-run to apply changes`,`info`);return}console.log(``),t.D(`⚙️ Executing tasks...`),console.log(``),await L(`beforeAll`,r);let l=0,u=0,d=[];for(let e=0;e<c.length;e++){let i=c[e];i!=null&&(await L(`beforeTask`,i,r),await Y(i,r,e+1,c.length,n.dryRun)?(l++,await L(`afterTask`,i,r)):(await t.x(i.required,r)&&(u++,d.push(i.name)),await L(`onError`,Error(`Task ${i.name} failed`),i),t.b(`⚠️ Task "${i.name}" failed, continuing with remaining tasks...`)))}await L(`afterAll`,r),u>0&&(t.O(`\n❌ Task execution completed with ${u} error(s)`,`error`),t.O(`Completed: ${l}/${c.length} tasks`,`info`),t.O(`Failed tasks: ${d.join(`, `)}`,`error`),a.default.exit(1)),t.O(`Completed: ${l}/${c.length} tasks`,`success`)}Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return de}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return oe}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return ge}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return pe}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return ht}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return fe}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return me}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return mt}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return he}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return T}});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./config-inheritance-DLd3amMI.js";import{n as e,t}from"./run-tasks-C0IZQ4SX.js";import"./config-nfiOxhDM.js";export{t as runTasks,e as runTemplatesSequentially};
|
package/dist/src-B0yHfPGS.cjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const e=require(`./chunk-DjWAcSYV.cjs`),t=require(`./config-inheritance-CtSb5haE.cjs`),n=require(`./run-tasks-CgFJyU4i.cjs`);let r=require(`node:process`);r=e.t(r);const i=r.default.argv.includes(`--dry-run`),a=r.default.argv.includes(`--force`);async function o(e,o){try{await n.t(e,{dryRun:o?.dryRun??i,force:o?.force??a,configFilePath:o?.configFilePath??void 0,...o?.variables!=null&&{variables:o.variables},...o?.prompts!=null&&{prompts:o.prompts},...o?.configEnabled!=null&&{configEnabled:o.configEnabled},...o?.transformers!=null&&{transformers:o.transformers}})}catch(e){t.O(`❌ Task execution failed`,`error`),e instanceof Error?(t.O(`Error: ${e.message}`,`error`),r.default.env.DEBUG!=null&&console.error(e.stack)):console.error(e),r.default.exit(1)}}Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return o}});
|
package/dist/src-CfaEuN4Q.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{O as e}from"./config-inheritance-DLd3amMI.js";import{t}from"./run-tasks-C0IZQ4SX.js";import n from"node:process";const r=n.argv.includes(`--dry-run`),i=n.argv.includes(`--force`);async function a(a,o){try{await t(a,{dryRun:o?.dryRun??r,force:o?.force??i,configFilePath:o?.configFilePath??void 0,...o?.variables!=null&&{variables:o.variables},...o?.prompts!=null&&{prompts:o.prompts},...o?.configEnabled!=null&&{configEnabled:o.configEnabled},...o?.transformers!=null&&{transformers:o.transformers}})}catch(t){e(`❌ Task execution failed`,`error`),t instanceof Error?(e(`Error: ${t.message}`,`error`),n.env.DEBUG!=null&&console.error(t.stack)):console.error(t),n.exit(1)}}export{a as t};
|
package/dist/utils-Cs2XFh4Z.cjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const e=require(`./config-inheritance-CtSb5haE.cjs`);exports.cleanupTempFile=e.u,exports.debug=e.T,exports.error=e.E,exports.logError=e.E,exports.evaluateCondition=e.w,exports.evaluateEnabled=e.S,exports.evaluateEnabledAsync=e.C,exports.evaluateRequiredAsync=e.x,exports.getNestedProperty=e.p,exports.info=e.D,exports.logInfo=e.D,exports.interpolateTemplate=e.s,exports.isUrl=e.h,exports.log=e.O,exports.logSuccess=e.k,exports.success=e.k,exports.logWarn=e.A,exports.warn=e.A,exports.resolveAndFetchFile=e.d,exports.resolveFilePath=e.f,exports.resolveValue=e.c,exports.setNestedProperty=e.m;
|
package/dist/utils-DO-s6Uy8.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{A as e,C as t,D as n,E as r,O as i,S as a,T as o,c as s,d as c,f as l,h as u,k as d,m as f,p,s as m,u as h,w as g,x as _}from"./config-inheritance-DLd3amMI.js";export{h as cleanupTempFile,o as debug,r as error,r as logError,g as evaluateCondition,a as evaluateEnabled,t as evaluateEnabledAsync,_ as evaluateRequiredAsync,p as getNestedProperty,n as info,n as logInfo,m as interpolateTemplate,u as isUrl,i as log,d as logSuccess,d as success,e as logWarn,e as warn,c as resolveAndFetchFile,l as resolveFilePath,s as resolveValue,f as setNestedProperty};
|