@pixpilot/scaffoldfy 0.35.0 → 0.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.cjs +1 -1
- package/dist/cli.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +7 -15
- package/dist/index.d.ts +7 -15
- package/dist/index.js +1 -1
- package/dist/run-tasks-Bj88BeF9.js +26 -0
- package/dist/run-tasks-Cgq9q7tb.cjs +26 -0
- package/dist/run-tasks-D7y78ZbB.js +1 -0
- package/dist/run-tasks-DTD_VKiq.cjs +1 -0
- package/dist/src-lHDE7_Zd.cjs +1 -0
- package/dist/src-mfRU6tIv.js +1 -0
- package/dist/template-inheritance-CwBAv1Q9.cjs +1 -0
- package/dist/template-inheritance-bPw0ciBi.js +1 -0
- package/dist/utils-Bj8gkhe3.js +1 -0
- package/dist/utils-CRe7Fw3m.cjs +1 -0
- package/package.json +4 -4
- package/dist/run-tasks-Bjza7ZeL.cjs +0 -1
- package/dist/run-tasks-BnqvtWj4.cjs +0 -26
- package/dist/run-tasks-BqgVj4rO.js +0 -1
- package/dist/run-tasks-CEs2FBaf.js +0 -26
- package/dist/src-CboZxzVI.cjs +0 -1
- package/dist/src-TOw75kLW.js +0 -1
- package/dist/utils-B6BwGcug.cjs +0 -1
- package/dist/utils-B6WSsvMT.js +0 -1
- package/dist/utils-Bz23aLK_.cjs +0 -1
- package/dist/utils-CrJkuEEG.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`);require(`./config-DlJs75hK.cjs`);const t=require(`./
|
|
2
|
+
const e=require(`./chunk-DjWAcSYV.cjs`);require(`./config-DlJs75hK.cjs`);const t=require(`./template-inheritance-CwBAv1Q9.cjs`);require(`./run-tasks-Cgq9q7tb.cjs`),require(`./validate-scaffoldfy-json-Dkaz9ueq.cjs`),require(`./scaffoldfy-config-json-validator-CpEXHRsI.cjs`);const n=require(`./src-lHDE7_Zd.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.u(`❌ Schema validation error:`,`error`),t.u(` ${r}`,`error`)),{valid:!1,errors:[r]}}}function g(e){t.u(`❌ Schema validation failed:`,`error`),t.u(``,`error`),t.u(`The following validation errors were found:`,`error`),t.u(``,`error`);for(let n of e)t.u(` • ${n}`,`error`);t.u(``,`error`),t.u(`Please fix these errors in your template configuration file.`,`error`),t.u(``,`error`),t.u(`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)`,`./template-tasks.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.b(!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.u(`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.u(`⚠️ No tasks found in TypeScript file or invalid format`,`warn`),t.u(`Expected default export or named export "tasks" with TaskDefinition[]`,`info`))}catch(n){t.u(`Failed to load TypeScript config file: ${e.config}`,`error`),n instanceof Error&&t.u(` Error: ${n.message}`,`error`),a.default.exit(1)}}else try{if(e.validate!==!1){t.v(`Validating task configuration against schema...`);let e=r.default.readFileSync(n,`utf-8`);h(JSON.parse(e),{silent:!1}).valid||(t.u(``,`error`),t.u(`💡 You can skip validation with --no-validate flag, but this is not recommended.`,`info`),a.default.exit(1)),t.u(`Configuration validated`,`success`)}let i=await t.i(n,{sequential:!0});if(i.templates!=null&&i.templates.length>0){let{runTemplatesSequentially:t}=await Promise.resolve().then(()=>require(`./run-tasks-DTD_VKiq.cjs`)),{createInitialConfig:r}=await Promise.resolve().then(()=>require(`./config-DmK0Erv2.cjs`));await t(i.templates,{dryRun:e.dryRun??!1,force:e.force??!1,tasksFilePath: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.u(`❌ Invalid config file format`,`error`),t.u(`Expected JSON with { "tasks": [...] } structure`,`info`),a.default.exit(1))}catch(n){t.u(`Failed to load JSON config file: ${e.config}`,`error`),n instanceof Error&&t.u(` Error: ${n.message}`,`error`),a.default.exit(1)}else t.u(`Config file not found: ${e.config}`,`warn`)}let f=c!=null&&c.length>0||s!=null&&s.length>0;o.length===0&&!f&&(t.u(`❌ No tasks defined`,`error`),t.u(`Please provide tasks using one of these methods:`,`info`),t.u(` 1. Create a template-tasks.json file in the current directory`,`info`),t.u(` 2. Create a template-tasks.ts file in the current directory`,`info`),t.u(` 3. Use --config option to specify a different config file`,`info`),t.u(`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.u(`Loaded template with 0 tasks (template may only provide prompts/variables for extending)`,`info`):t.u(`Loaded ${o.length} task(s)`,`success`),await n.n(o,{dryRun:e.dryRun,force:e.force,tasksFilePath:d,variables:s,prompts:c,templateEnabled:l,transformers:u})}catch(e){if(t.u(`❌ CLI execution failed`,`error`),e instanceof Error){t.u(`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"./config-DfRbCqsT.js";import{
|
|
2
|
+
import"./config-DfRbCqsT.js";import{b as e,i as t,u as n,v as r}from"./template-inheritance-bPw0ciBi.js";import"./run-tasks-Bj88BeF9.js";import"./validate-scaffoldfy-json-Cfq-nQjy.js";import"./scaffoldfy-config-json-validator-DP8-e4Yy.js";import{n as i}from"./src-mfRU6tIv.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,t={}){try{let n=h(),r=g(),i=n.compile(r);if(!i(e)&&i.errors){let e=_(i.errors);return e.length===0?{valid:!0,errors:[]}:(t.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 t.silent||(n(`❌ Schema validation error:`,`error`),n(` ${r}`,`error`)),{valid:!1,errors:[r]}}}function y(e){n(`❌ Schema validation failed:`,`error`),n(``,`error`),n(`The following validation errors were found:`,`error`),n(``,`error`);for(let t of e)n(` • ${t}`,`error`);n(``,`error`),n(`Please fix these errors in your template configuration file.`,`error`),n(``,`error`),n(`For schema documentation, see: https://github.com/pixpilot/scaffoldfy/tree/main/packages/scaffoldfy/schema`,`info`)}const 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)`,`./template-tasks.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`)){n(`Loading tasks from TypeScript file: ${o.config}`,`info`);try{let t=await import(i);e=t.default??t.tasks??[],(!Array.isArray(e)||e.length===0)&&(n(`⚠️ No tasks found in TypeScript file or invalid format`,`warn`),n(`Expected default export or named export "tasks" with TaskDefinition[]`,`info`))}catch(e){n(`Failed to load TypeScript config file: ${o.config}`,`error`),e instanceof Error&&n(` 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||(n(``,`error`),n(`💡 You can skip validation with --no-validate flag, but this is not recommended.`,`info`),c.exit(1)),n(`Configuration validated`,`success`)}let a=await t(i,{sequential:!0});if(a.templates!=null&&a.templates.length>0){let{runTemplatesSequentially:e}=await import(`./run-tasks-D7y78ZbB.js`),{createInitialConfig:t}=await import(`./config-C8hh88Lc.js`);await e(a.templates,{dryRun:o.dryRun??!1,force:o.force??!1,tasksFilePath:i},t()),c.exit(0)}e=a.tasks,l=a.variables,u=a.prompts,d=a.enabled,f=a.transformers,Array.isArray(e)||(n(`❌ Invalid config file format`,`error`),n(`Expected JSON with { "tasks": [...] } structure`,`info`),c.exit(1))}catch(e){n(`Failed to load JSON config file: ${o.config}`,`error`),e instanceof Error&&n(` Error: ${e.message}`,`error`),c.exit(1)}else n(`Config file not found: ${o.config}`,`warn`)}let m=u!=null&&u.length>0||l!=null&&l.length>0;e.length===0&&!m&&(n(`❌ No tasks defined`,`error`),n(`Please provide tasks using one of these methods:`,`info`),n(` 1. Create a template-tasks.json file in the current directory`,`info`),n(` 2. Create a template-tasks.ts file in the current directory`,`info`),n(` 3. Use --config option to specify a different config file`,`info`),n(`Example JSON structure:`,`info`),console.log(JSON.stringify({tasks:[{id:`update-package`,name:`Update package.json`,description:`Update package.json with repository information`,required:!0,enabled:!0,type:`update-json`,prompts:[{id:`projectName`,type:`input`,message:`What is your project name?`,default:`my-project`,required:!0},{id:`includeTests`,type:`confirm`,message:`Include test files?`,default:!0}],config:{file:`package.json`,updates:{name:`{{projectName}}`,author:`{{author}}`}}}]},null,2)),c.exit(1)),e.length===0?n(`Loaded template with 0 tasks (template may only provide prompts/variables for extending)`,`info`):n(`Loaded ${e.length} task(s)`,`success`),await i(e,{dryRun:o.dryRun,force:o.force,tasksFilePath:p,variables:l,prompts:u,templateEnabled:d,transformers:f})}catch(e){if(n(`❌ CLI execution failed`,`error`),e instanceof Error){n(`Error: ${e.message}`,`error`);let t=c.env.DEBUG;t!=null&&t!==``&&console.error(e.stack)}else console.error(e);c.exit(1)}}),b.parse(c.argv);export{};
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
require(`./config-DlJs75hK.cjs`);const e=require(`./
|
|
1
|
+
require(`./config-DlJs75hK.cjs`);const e=require(`./template-inheritance-CwBAv1Q9.cjs`),t=require(`./run-tasks-Cgq9q7tb.cjs`),n=require(`./validate-scaffoldfy-json-Dkaz9ueq.cjs`);require(`./scaffoldfy-config-json-validator-CpEXHRsI.cjs`);const r=require(`./src-lHDE7_Zd.cjs`);exports.callHook=t.h,exports.clearPlugins=t.g,exports.clearTemplateCache=e.t,exports.collectPrompts=t.p,exports.collectVariables=t.o,exports.createTaskPlugin=t._,exports.displayTasksDiff=t.O,exports.evaluateCondition=e.c,exports.executePluginTask=t.v,exports.executeTask=t.c,exports.getCreateDiff=t.k,exports.getDeleteDiff=t.A,exports.getExecDiff=t.j,exports.getGitInitDiff=t.M,exports.getPlugin=t.y,exports.getPluginForTaskType=t.b,exports.getPluginTaskDiff=t.x,exports.getRegexReplaceDiff=t.N,exports.getRenameDiff=t.P,exports.getReplaceInFileDiff=t.F,exports.getTaskDiff=t.I,exports.getTemplateSourceDescription=t.z,exports.getUpdateJsonDiff=t.L,exports.getWriteDiff=t.R,exports.hasInlineTemplate=t.B,exports.hasTemplateFile=t.V,exports.interpolateTemplate=e.l,exports.isPluginTaskType=t.S,exports.listPlugins=t.C,exports.loadAndMergeTemplate=e.r,exports.loadTasksWithInheritance=e.i,exports.loadTemplate=e.a,exports.loadTemplatesInOrder=e.o,exports.log=e.u,exports.main=r.t,exports.mergeTemplates=e.s,exports.processTemplate=t.H,exports.prompt=e.d,exports.promptYesNo=e.f,exports.registerBuiltInPlugins=t.l,exports.registerHooks=t.w,exports.registerPlugin=t.T,exports.resolveAllDefaultValues=t.f,exports.resolveAllVariableValues=t.a,exports.resolveDefaultValue=t.m,exports.resolveVariableValue=t.i,exports.runTask=t.u,exports.runTasks=t.t,exports.runTemplatesSequentially=t.n,exports.runWithTasks=r.n,exports.shouldUseHandlebars=t.U,exports.topologicalSort=t.s,exports.unregisterPlugin=t.E,exports.validatePluginTask=t.D,exports.validatePrompts=t.d,exports.validateScaffoldfyJsonFile=n.t,exports.validateTemplateConfig=t.W,exports.validateVariables=t.r;
|
package/dist/index.d.cts
CHANGED
|
@@ -268,6 +268,7 @@ interface BasePrompt {
|
|
|
268
268
|
enabled?: DynamicBooleanValue;
|
|
269
269
|
override?: MergeStrategy;
|
|
270
270
|
$templateEnabled?: DynamicBooleanValue;
|
|
271
|
+
$sourceUrl?: string;
|
|
271
272
|
transformers?: string[];
|
|
272
273
|
}
|
|
273
274
|
interface InputPrompt extends BasePrompt {
|
|
@@ -307,6 +308,7 @@ interface VariableDefinition {
|
|
|
307
308
|
required?: DynamicBooleanValue;
|
|
308
309
|
override?: MergeStrategy;
|
|
309
310
|
$templateEnabled?: DynamicBooleanValue;
|
|
311
|
+
$sourceUrl?: string;
|
|
310
312
|
transformers?: string[];
|
|
311
313
|
}
|
|
312
314
|
/**
|
|
@@ -558,9 +560,10 @@ declare function resolveAllDefaultValues(prompts: PromptDefinition[], context?:
|
|
|
558
560
|
* @param defaultValue - The default value configuration
|
|
559
561
|
* @param promptId - The prompt ID for error reporting
|
|
560
562
|
* @param context - Optional context for interpolating template variables in string defaults
|
|
563
|
+
* @param prompt - Optional prompt definition for accessing $sourceUrl
|
|
561
564
|
* @returns The resolved default value
|
|
562
565
|
*/
|
|
563
|
-
declare function resolveDefaultValue<T = string | number | boolean>(defaultValue: DefaultValue<T> | undefined, promptId: string, context?: InitConfig): Promise<T | undefined>;
|
|
566
|
+
declare function resolveDefaultValue<T = string | number | boolean>(defaultValue: DefaultValue<T> | undefined, promptId: string, context?: InitConfig, prompt?: PromptDefinition): Promise<T | undefined>;
|
|
564
567
|
//#endregion
|
|
565
568
|
//#region src/prompts/validate-prompts.d.ts
|
|
566
569
|
/**
|
|
@@ -734,14 +737,6 @@ declare function processTemplate(config: TemplateSource, initConfig: InitConfig,
|
|
|
734
737
|
declare function getTemplateSourceDescription(config: TemplateSource): string;
|
|
735
738
|
//#endregion
|
|
736
739
|
//#region src/utils.d.ts
|
|
737
|
-
/**
|
|
738
|
-
* Get Git repository information from the current directory
|
|
739
|
-
*/
|
|
740
|
-
declare function getGitRepoInfo(): {
|
|
741
|
-
owner: string;
|
|
742
|
-
name: string;
|
|
743
|
-
url: string;
|
|
744
|
-
} | null;
|
|
745
740
|
/**
|
|
746
741
|
* Prompt user for input with optional default value
|
|
747
742
|
*/
|
|
@@ -759,10 +754,6 @@ declare function log(message: string, type?: 'info' | 'success' | 'error' | 'war
|
|
|
759
754
|
* Interpolate template variables in a string
|
|
760
755
|
*/
|
|
761
756
|
declare function interpolateTemplate(template: string, config: InitConfig): string;
|
|
762
|
-
/**
|
|
763
|
-
* Set a nested property in an object using dot notation
|
|
764
|
-
*/
|
|
765
|
-
declare function setNestedProperty(obj: Record<string, unknown>, propertyPath: string, value: unknown): void;
|
|
766
757
|
/**
|
|
767
758
|
* Evaluate a condition expression with the given config
|
|
768
759
|
* @param condition - JavaScript expression to evaluate
|
|
@@ -810,9 +801,10 @@ declare function resolveAllVariableValues(variables: VariableDefinition[], conte
|
|
|
810
801
|
* @param value - The variable value configuration
|
|
811
802
|
* @param variableId - The variable ID for error reporting
|
|
812
803
|
* @param context - Optional context for evaluating conditional values
|
|
804
|
+
* @param sourceUrl - Optional source URL for resolving relative file paths in exec-file
|
|
813
805
|
* @returns The resolved variable value
|
|
814
806
|
*/
|
|
815
|
-
declare function resolveVariableValue<T = string | number | boolean>(value: DefaultValue<T>, variableId: string, context?: InitConfig): Promise<T | undefined>;
|
|
807
|
+
declare function resolveVariableValue<T = string | number | boolean>(value: DefaultValue<T>, variableId: string, context?: InitConfig, sourceUrl?: string): Promise<T | undefined>;
|
|
816
808
|
//#endregion
|
|
817
809
|
//#region src/variables/validate-variables.d.ts
|
|
818
810
|
/**
|
|
@@ -850,4 +842,4 @@ declare function runWithTasks(customTasks: TaskDefinition[], options?: {
|
|
|
850
842
|
transformers?: Transformer[] | undefined;
|
|
851
843
|
}): Promise<void>;
|
|
852
844
|
//#endregion
|
|
853
|
-
export { type AppendConfig, BasePrompt, ConditionExpression, ConditionalConfig, ConditionalDefaultConfig, ConfirmPrompt, type CopyConfig, type CreateConfig, DefaultValue, DefaultValueConfig, DefaultValueType, type DeleteConfig, DynamicBooleanValue, EnabledValue, type ExecConfig, ExecFileRuntime, ExecFileValueConfig, ExecutableConfig, type GitInitConfig, InitConfig, InputPrompt, MergeStrategy, type MkdirConfig, type MoveConfig, NumberPrompt, PluginHooks, PromptDefinition, PromptType, type RegexReplaceConfig, type RenameConfig, type ReplaceInFileConfig, RollbackConfig, SelectPrompt, TaskDefinition, TaskPlugin, TaskType, TasksConfiguration, type UpdateJsonConfig, VariableDefinition, type WriteConfig, callHook, clearPlugins, clearTemplateCache, collectPrompts, collectVariables, createTaskPlugin, displayTasksDiff, evaluateCondition, executePluginTask, executeTask, getCreateDiff, getDeleteDiff, getExecDiff, getGitInitDiff,
|
|
845
|
+
export { type AppendConfig, BasePrompt, ConditionExpression, ConditionalConfig, ConditionalDefaultConfig, ConfirmPrompt, type CopyConfig, type CreateConfig, DefaultValue, DefaultValueConfig, DefaultValueType, type DeleteConfig, DynamicBooleanValue, EnabledValue, type ExecConfig, ExecFileRuntime, ExecFileValueConfig, ExecutableConfig, type GitInitConfig, InitConfig, InputPrompt, MergeStrategy, type MkdirConfig, type MoveConfig, NumberPrompt, PluginHooks, PromptDefinition, PromptType, type RegexReplaceConfig, type RenameConfig, type ReplaceInFileConfig, RollbackConfig, SelectPrompt, TaskDefinition, TaskPlugin, TaskType, TasksConfiguration, type UpdateJsonConfig, VariableDefinition, type WriteConfig, callHook, clearPlugins, clearTemplateCache, collectPrompts, collectVariables, createTaskPlugin, displayTasksDiff, evaluateCondition, executePluginTask, executeTask, getCreateDiff, getDeleteDiff, getExecDiff, getGitInitDiff, getPlugin, getPluginForTaskType, getPluginTaskDiff, getRegexReplaceDiff, getRenameDiff, getReplaceInFileDiff, getTaskDiff, getTemplateSourceDescription, getUpdateJsonDiff, getWriteDiff, hasInlineTemplate, hasTemplateFile, interpolateTemplate, isPluginTaskType, listPlugins, loadAndMergeTemplate, loadTasksWithInheritance, loadTemplate, loadTemplatesInOrder, log, main, mergeTemplates, processTemplate, prompt, promptYesNo, registerBuiltInPlugins, registerHooks, registerPlugin, resolveAllDefaultValues, resolveAllVariableValues, resolveDefaultValue, resolveVariableValue, runTask, runTasks, runTemplatesSequentially, runWithTasks, shouldUseHandlebars, topologicalSort, unregisterPlugin, validatePluginTask, validatePrompts, validateScaffoldfyJsonFile, validateTemplateConfig, validateVariables };
|
package/dist/index.d.ts
CHANGED
|
@@ -268,6 +268,7 @@ interface BasePrompt {
|
|
|
268
268
|
enabled?: DynamicBooleanValue;
|
|
269
269
|
override?: MergeStrategy;
|
|
270
270
|
$templateEnabled?: DynamicBooleanValue;
|
|
271
|
+
$sourceUrl?: string;
|
|
271
272
|
transformers?: string[];
|
|
272
273
|
}
|
|
273
274
|
interface InputPrompt extends BasePrompt {
|
|
@@ -307,6 +308,7 @@ interface VariableDefinition {
|
|
|
307
308
|
required?: DynamicBooleanValue;
|
|
308
309
|
override?: MergeStrategy;
|
|
309
310
|
$templateEnabled?: DynamicBooleanValue;
|
|
311
|
+
$sourceUrl?: string;
|
|
310
312
|
transformers?: string[];
|
|
311
313
|
}
|
|
312
314
|
/**
|
|
@@ -558,9 +560,10 @@ declare function resolveAllDefaultValues(prompts: PromptDefinition[], context?:
|
|
|
558
560
|
* @param defaultValue - The default value configuration
|
|
559
561
|
* @param promptId - The prompt ID for error reporting
|
|
560
562
|
* @param context - Optional context for interpolating template variables in string defaults
|
|
563
|
+
* @param prompt - Optional prompt definition for accessing $sourceUrl
|
|
561
564
|
* @returns The resolved default value
|
|
562
565
|
*/
|
|
563
|
-
declare function resolveDefaultValue<T = string | number | boolean>(defaultValue: DefaultValue<T> | undefined, promptId: string, context?: InitConfig): Promise<T | undefined>;
|
|
566
|
+
declare function resolveDefaultValue<T = string | number | boolean>(defaultValue: DefaultValue<T> | undefined, promptId: string, context?: InitConfig, prompt?: PromptDefinition): Promise<T | undefined>;
|
|
564
567
|
//#endregion
|
|
565
568
|
//#region src/prompts/validate-prompts.d.ts
|
|
566
569
|
/**
|
|
@@ -734,14 +737,6 @@ declare function processTemplate(config: TemplateSource, initConfig: InitConfig,
|
|
|
734
737
|
declare function getTemplateSourceDescription(config: TemplateSource): string;
|
|
735
738
|
//#endregion
|
|
736
739
|
//#region src/utils.d.ts
|
|
737
|
-
/**
|
|
738
|
-
* Get Git repository information from the current directory
|
|
739
|
-
*/
|
|
740
|
-
declare function getGitRepoInfo(): {
|
|
741
|
-
owner: string;
|
|
742
|
-
name: string;
|
|
743
|
-
url: string;
|
|
744
|
-
} | null;
|
|
745
740
|
/**
|
|
746
741
|
* Prompt user for input with optional default value
|
|
747
742
|
*/
|
|
@@ -759,10 +754,6 @@ declare function log(message: string, type?: 'info' | 'success' | 'error' | 'war
|
|
|
759
754
|
* Interpolate template variables in a string
|
|
760
755
|
*/
|
|
761
756
|
declare function interpolateTemplate(template: string, config: InitConfig): string;
|
|
762
|
-
/**
|
|
763
|
-
* Set a nested property in an object using dot notation
|
|
764
|
-
*/
|
|
765
|
-
declare function setNestedProperty(obj: Record<string, unknown>, propertyPath: string, value: unknown): void;
|
|
766
757
|
/**
|
|
767
758
|
* Evaluate a condition expression with the given config
|
|
768
759
|
* @param condition - JavaScript expression to evaluate
|
|
@@ -810,9 +801,10 @@ declare function resolveAllVariableValues(variables: VariableDefinition[], conte
|
|
|
810
801
|
* @param value - The variable value configuration
|
|
811
802
|
* @param variableId - The variable ID for error reporting
|
|
812
803
|
* @param context - Optional context for evaluating conditional values
|
|
804
|
+
* @param sourceUrl - Optional source URL for resolving relative file paths in exec-file
|
|
813
805
|
* @returns The resolved variable value
|
|
814
806
|
*/
|
|
815
|
-
declare function resolveVariableValue<T = string | number | boolean>(value: DefaultValue<T>, variableId: string, context?: InitConfig): Promise<T | undefined>;
|
|
807
|
+
declare function resolveVariableValue<T = string | number | boolean>(value: DefaultValue<T>, variableId: string, context?: InitConfig, sourceUrl?: string): Promise<T | undefined>;
|
|
816
808
|
//#endregion
|
|
817
809
|
//#region src/variables/validate-variables.d.ts
|
|
818
810
|
/**
|
|
@@ -850,4 +842,4 @@ declare function runWithTasks(customTasks: TaskDefinition[], options?: {
|
|
|
850
842
|
transformers?: Transformer[] | undefined;
|
|
851
843
|
}): Promise<void>;
|
|
852
844
|
//#endregion
|
|
853
|
-
export { type AppendConfig, BasePrompt, ConditionExpression, ConditionalConfig, ConditionalDefaultConfig, ConfirmPrompt, type CopyConfig, type CreateConfig, DefaultValue, DefaultValueConfig, DefaultValueType, type DeleteConfig, DynamicBooleanValue, EnabledValue, type ExecConfig, ExecFileRuntime, ExecFileValueConfig, ExecutableConfig, type GitInitConfig, InitConfig, InputPrompt, MergeStrategy, type MkdirConfig, type MoveConfig, NumberPrompt, PluginHooks, PromptDefinition, PromptType, type RegexReplaceConfig, type RenameConfig, type ReplaceInFileConfig, RollbackConfig, SelectPrompt, TaskDefinition, TaskPlugin, TaskType, TasksConfiguration, type UpdateJsonConfig, VariableDefinition, type WriteConfig, callHook, clearPlugins, clearTemplateCache, collectPrompts, collectVariables, createTaskPlugin, displayTasksDiff, evaluateCondition, executePluginTask, executeTask, getCreateDiff, getDeleteDiff, getExecDiff, getGitInitDiff,
|
|
845
|
+
export { type AppendConfig, BasePrompt, ConditionExpression, ConditionalConfig, ConditionalDefaultConfig, ConfirmPrompt, type CopyConfig, type CreateConfig, DefaultValue, DefaultValueConfig, DefaultValueType, type DeleteConfig, DynamicBooleanValue, EnabledValue, type ExecConfig, ExecFileRuntime, ExecFileValueConfig, ExecutableConfig, type GitInitConfig, InitConfig, InputPrompt, MergeStrategy, type MkdirConfig, type MoveConfig, NumberPrompt, PluginHooks, PromptDefinition, PromptType, type RegexReplaceConfig, type RenameConfig, type ReplaceInFileConfig, RollbackConfig, SelectPrompt, TaskDefinition, TaskPlugin, TaskType, TasksConfiguration, type UpdateJsonConfig, VariableDefinition, type WriteConfig, callHook, clearPlugins, clearTemplateCache, collectPrompts, collectVariables, createTaskPlugin, displayTasksDiff, evaluateCondition, executePluginTask, executeTask, getCreateDiff, getDeleteDiff, getExecDiff, getGitInitDiff, getPlugin, getPluginForTaskType, getPluginTaskDiff, getRegexReplaceDiff, getRenameDiff, getReplaceInFileDiff, getTaskDiff, getTemplateSourceDescription, getUpdateJsonDiff, getWriteDiff, hasInlineTemplate, hasTemplateFile, interpolateTemplate, isPluginTaskType, listPlugins, loadAndMergeTemplate, loadTasksWithInheritance, loadTemplate, loadTemplatesInOrder, log, main, mergeTemplates, processTemplate, prompt, promptYesNo, registerBuiltInPlugins, registerHooks, registerPlugin, resolveAllDefaultValues, resolveAllVariableValues, resolveDefaultValue, resolveVariableValue, runTask, runTasks, runTemplatesSequentially, runWithTasks, shouldUseHandlebars, topologicalSort, unregisterPlugin, validatePluginTask, validatePrompts, validateScaffoldfyJsonFile, validateTemplateConfig, validateVariables };
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./config-DfRbCqsT.js";import{a as e,c as t,
|
|
1
|
+
import"./config-DfRbCqsT.js";import{a as e,c as t,d as n,f as r,i,l as a,o,r as s,s as c,t as l,u}from"./template-inheritance-bPw0ciBi.js";import{A as d,B as f,C as p,D as m,E as h,F as g,H as _,I as v,L as y,M as b,N as x,O as S,P as C,R as w,S as T,T as E,U as D,V as O,W as k,_ as A,a as j,b as M,c as N,d as P,f as F,g as I,h as L,i as R,j as z,k as B,l as V,m as H,n as U,o as W,p as G,r as K,s as q,t as J,u as Y,v as X,w as Z,x as Q,y as $,z as ee}from"./run-tasks-Bj88BeF9.js";import{t as te}from"./validate-scaffoldfy-json-Cfq-nQjy.js";import"./scaffoldfy-config-json-validator-DP8-e4Yy.js";import{n as ne,t as re}from"./src-mfRU6tIv.js";export{L as callHook,I as clearPlugins,l as clearTemplateCache,G as collectPrompts,W as collectVariables,A as createTaskPlugin,S as displayTasksDiff,t as evaluateCondition,X as executePluginTask,N as executeTask,B as getCreateDiff,d as getDeleteDiff,z as getExecDiff,b as getGitInitDiff,$ as getPlugin,M as getPluginForTaskType,Q as getPluginTaskDiff,x as getRegexReplaceDiff,C as getRenameDiff,g as getReplaceInFileDiff,v as getTaskDiff,ee as getTemplateSourceDescription,y as getUpdateJsonDiff,w as getWriteDiff,f as hasInlineTemplate,O as hasTemplateFile,a as interpolateTemplate,T as isPluginTaskType,p as listPlugins,s as loadAndMergeTemplate,i as loadTasksWithInheritance,e as loadTemplate,o as loadTemplatesInOrder,u as log,re as main,c as mergeTemplates,_ as processTemplate,n as prompt,r as promptYesNo,V as registerBuiltInPlugins,Z as registerHooks,E as registerPlugin,F as resolveAllDefaultValues,j as resolveAllVariableValues,H as resolveDefaultValue,R as resolveVariableValue,Y as runTask,J as runTasks,U as runTemplatesSequentially,ne as runWithTasks,D as shouldUseHandlebars,q as topologicalSort,h as unregisterPlugin,m as validatePluginTask,P as validatePrompts,te as validateScaffoldfyJsonFile,k as validateTemplateConfig,K as validateVariables};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import{t as e}from"./config-DfRbCqsT.js";import{C as t,S as n,T as r,_ as i,c as a,g as o,h as s,l as c,m as l,n as u,p as d,u as f,v as p,w as m,x as ee,y as h}from"./template-inheritance-bPw0ciBi.js";import g from"node:path";import _ from"node:fs";import v from"node:process";import{promisify as y}from"node:util";import{execSync as b}from"node:child_process";import{confirm as x,input as te,number as S,password as ne,select as re}from"@inquirer/prompts";import{camelCase as ie,capitalCase as ae,constantCase as oe,kebabCase as se,lowerCase as ce,pascalCase as le,snakeCase as ue,upperCase as de}from"case-anything";var fe=class e extends r{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)}},C=class e extends r{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`)}},w=class e extends r{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`)}},T=class e extends r{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 E(e){return e.template!=null&&e.template!==``}function D(e){return e.templateFile!=null&&e.templateFile!==``}function pe(e){return e.endsWith(`.hbs`)}function O(e){let t=E(e),n=D(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 k(e,t,n,r={}){let{enableHandlebars:i=!0,sourceUrl:a=n?.$sourceUrl}=r,o=E(e),l=D(e);if(o)return c(e.template,t);if(l){let n=e.templateFile,r=i&&pe(n),o=await u(s(n,a));return r?(await import(`handlebars`)).default.compile(o)(t):c(o,t)}throw Error(`No template content available`)}function me(e){return E(e)?`inline template`:D(e)?`template file: ${e.templateFile}`:`no template source`}const A=y(_.readFile),j={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function M(e,t){switch(t){case`add`:return`${j.green}+ ${e}${j.reset}`;case`remove`:return`${j.red}- ${e}${j.reset}`;case`context`:return`${j.gray} ${e}${j.reset}`;default:return e}}function N(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(M(t,`context`)):(t!==void 0&&i.push(M(t,`remove`)),a!==void 0&&i.push(M(a,`add`)))}return i}async function he(e,n){if(e.condition!=null&&e.condition!==``&&!a(e.condition,n))return`${j.yellow}⊘ Condition not met - task would be skipped${j.reset}`;let r=g.join(v.cwd(),e.file);if(!_.existsSync(r))return`${j.red}✗ File not found: ${e.file}${j.reset}`;try{let i=await A(r,`utf-8`),a=JSON.parse(i),o={...a};function s(e){if(typeof e==`string`)return c(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(a,n,e):a[n]=e}let l=JSON.stringify(o,null,2),u=JSON.stringify(a,null,2);if(l===u)return`${j.cyan}→ No changes${j.reset}`;let d=N(l,u);return`${j.blue}File: ${e.file}${j.reset}\n${d.join(`
|
|
4
|
+
`)}`}catch(e){return`${j.red}✗ Error: ${e instanceof Error?e.message:String(e)}${j.reset}`}}async function ge(e,t){if(e.condition!=null&&e.condition!==``&&!a(e.condition,t))return`${j.yellow}⊘ Condition not met - task would be skipped${j.reset}`;if(e.template==null||e.template===``)return`${j.red}✗ No template content provided for file: ${e.file}${j.reset}`;let n=g.join(v.cwd(),e.file),r=c(e.template,t);if(!_.existsSync(n)){let t=r.split(`
|
|
5
|
+
`).slice(0,10).join(`
|
|
6
|
+
`),n=r.split(`
|
|
7
|
+
`).length>10;return`${j.blue}File: ${e.file}${j.reset}\n${j.green}+ New file would be created${j.reset}\n${j.gray}Content preview:${j.reset}\n${t}${n?`
|
|
8
|
+
...`:``}`}try{let t=await A(n,`utf-8`);if(t===r)return`${j.cyan}→ No changes${j.reset}`;let i=N(t,r);return`${j.blue}File: ${e.file}${j.reset}\n${i.join(`
|
|
9
|
+
`)}`}catch(e){return`${j.red}✗ Error: ${e instanceof Error?e.message:String(e)}${j.reset}`}}async function _e(e,t,n){if(e.condition!=null&&e.condition!==``&&!a(e.condition,t))return`${j.yellow}⊘ Condition not met - task would be skipped${j.reset}`;let r=g.join(v.cwd(),e.file);if(_.existsSync(r))return`${j.cyan}→ File already exists, would be skipped: ${e.file}${j.reset}`;try{if(E(e)){let r=await k(e,t,n),i=r.split(`
|
|
10
|
+
`).slice(0,10).join(`
|
|
11
|
+
`),a=r.split(`
|
|
12
|
+
`).length>10;return`${j.blue}File: ${e.file}${j.reset}\n${j.green}+ New file would be created${j.reset}\n${j.gray}Content preview:${j.reset}\n${i}${a?`
|
|
13
|
+
...`:``}`}let r=me(e);return`${j.blue}File: ${e.file}${j.reset}\n${j.green}+ New file would be created from ${r}${j.reset}`}catch(e){return`${j.red}✗ Error: ${e instanceof Error?e.message:String(e)}${j.reset}`}}async function ve(e,t){if(e.condition!=null&&e.condition!==``&&!a(e.condition,t))return`${j.yellow}⊘ Condition not met - task would be skipped${j.reset}`;let n=g.join(v.cwd(),e.file);if(!_.existsSync(n))return`${j.red}✗ File not found: ${e.file}${j.reset}`;try{let r=await A(n,`utf-8`),i=new RegExp(e.pattern,e.flags??`g`),a=c(e.replacement,t),o=r.replace(i,a);if(r===o)return`${j.cyan}→ No matches found${j.reset}`;let s=N(r,o);return`${j.blue}File: ${e.file}${j.reset}\n${s.join(`
|
|
14
|
+
`)}`}catch(e){return`${j.red}✗ Error: ${e instanceof Error?e.message:String(e)}${j.reset}`}}async function ye(e,t){if(e.condition!=null&&e.condition!==``&&!a(e.condition,t))return`${j.yellow}⊘ Condition not met - task would be skipped${j.reset}`;let n=g.join(v.cwd(),e.file);if(!_.existsSync(n))return`${j.red}✗ File not found: ${e.file}${j.reset}`;try{let r=await A(n,`utf-8`),i=r;for(let{find:n,replace:i}of e.replacements){let e=c(n,t),a=c(i,t);r=r.replace(e,a)}if(i===r)return`${j.cyan}→ No changes${j.reset}`;let a=N(i,r);return`${j.blue}File: ${e.file}${j.reset}\n${a.join(`
|
|
15
|
+
`)}`}catch(e){return`${j.red}✗ Error: ${e instanceof Error?e.message:String(e)}${j.reset}`}}function be(e,t){if(e.condition!=null&&e.condition!==``&&!a(e.condition,t))return`${j.yellow}⊘ Condition not met - task would be skipped${j.reset}`;let n=e.paths.map(e=>c(e,t)).filter(e=>_.existsSync(g.join(v.cwd(),e)));return n.length===0?`${j.cyan}→ No files/directories to delete${j.reset}`:`${j.red}Would delete:${j.reset}\n${n.map(e=>`${j.red} - ${e}${j.reset}`).join(`
|
|
16
|
+
`)}`}function xe(e,t){if(e.condition!=null&&e.condition!==``&&!a(e.condition,t))return`${j.yellow}⊘ Condition not met - task would be skipped${j.reset}`;let n=c(e.from,t),r=c(e.to,t),i=g.join(v.cwd(),n),o=g.join(v.cwd(),r);return _.existsSync(i)?_.existsSync(o)?`${j.yellow}⚠ Destination already exists: ${r}${j.reset}\n${j.cyan}Would rename: ${n} → ${r}${j.reset}`:`${j.cyan}Would rename: ${n} → ${r}${j.reset}`:`${j.red}✗ Source not found: ${n}${j.reset}`}function Se(e){if(e.condition!=null&&e.condition!==``)return`${j.yellow}⊘ Condition check skipped in dry-run${j.reset}`;let t=g.join(v.cwd(),`.git`),n=_.existsSync(t),r=[];if(e.removeExisting&&n&&r.push(`${j.red}Would remove existing .git directory${j.reset}`),r.push(`${j.green}Would initialize git repository${j.reset}`),e.initialCommit){let t=e.message??`Initial commit`;r.push(`${j.green}Would create initial commit: "${t}"${j.reset}`)}return r.join(`
|
|
17
|
+
`)}function P(e,t){if(e.condition!=null&&e.condition!==``&&!a(e.condition,t))return`${j.yellow}⊘ Condition not met - task would be skipped${j.reset}`;let n=c(e.command,t),r=e.cwd==null?v.cwd():c(e.cwd,t);return`${j.yellow}Would execute:${j.reset}\n${j.cyan} Command: ${n}${j.reset}\n${j.cyan} Working directory: ${r}${j.reset}`}function Ce(e,t){if(e.condition!=null&&e.condition!==``&&!a(e.condition,t))return`${j.yellow}⊘ Condition not met - task would be skipped${j.reset}`;let n=c(e.from,t),r=c(e.to,t),i=g.join(v.cwd(),n),o=g.join(v.cwd(),r);return _.existsSync(i)?_.existsSync(o)?`${j.yellow}⚠ Destination already exists: ${r}${j.reset}\n${j.cyan}Would move: ${n} → ${r}${j.reset}`:`${j.cyan}Would move: ${n} → ${r}${j.reset}`:`${j.red}✗ Source not found: ${n}${j.reset}`}function we(e,t){if(e.condition!=null&&e.condition!==``&&!a(e.condition,t))return`${j.yellow}⊘ Condition not met - task would be skipped${j.reset}`;let n=c(e.from,t),r=c(e.to,t),i=g.join(v.cwd(),n),o=g.join(v.cwd(),r);if(!_.existsSync(i))return`${j.red}✗ Source not found: ${n}${j.reset}`;let s=_.statSync(i).isDirectory()?`directory`:`file`;return _.existsSync(o)?`${j.yellow}⚠ Destination already exists: ${r}${j.reset}\n${j.cyan}Would copy ${s}: ${n} → ${r}${j.reset}`:`${j.cyan}Would copy ${s}: ${n} → ${r}${j.reset}`}async function Te(e,t,n){if(e.condition!=null&&e.condition!==``&&!a(e.condition,t))return`${j.yellow}⊘ Condition not met - task would be skipped${j.reset}`;let r=g.join(v.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 k(i,t,n),o=a.split(`
|
|
18
|
+
`).slice(0,10).join(`
|
|
19
|
+
`),s=a.split(`
|
|
20
|
+
`).length>10;return _.existsSync(r)?`${j.blue}File: ${e.file}${j.reset}\n${j.green}+ Would append content${j.reset}\n${j.gray}Content preview:${j.reset}\n${o}${s?`
|
|
21
|
+
...`:``}`:`${j.blue}File: ${e.file}${j.reset}\n${j.green}+ New file would be created with content${j.reset}\n${j.gray}Content preview:${j.reset}\n${o}${s?`
|
|
22
|
+
...`:``}`}catch(e){return`${j.red}✗ Error: ${e instanceof Error?e.message:String(e)}${j.reset}`}}function Ee(e,t){if(e.condition!=null&&e.condition!==``&&!a(e.condition,t))return`${j.yellow}⊘ Condition not met - task would be skipped${j.reset}`;let n=c(e.path,t),r=g.join(v.cwd(),n);return _.existsSync(r)?`${j.cyan}→ Directory already exists: ${n}${j.reset}`:`${j.green}+ Would create directory: ${n}${j.reset}`}async function De(e,t){try{switch(e.type){case`update-json`:return await he(e.config,t);case`write`:return await ge(e.config,t);case`create`:return await _e(e.config,t,e);case`regex-replace`:return await ve(e.config,t);case`replace-in-file`:return await ye(e.config,t);case`delete`:return be(e.config,t);case`rename`:return xe(e.config,t);case`move`:return Ce(e.config,t);case`copy`:return we(e.config,t);case`append`:return await Te(e.config,t,e);case`mkdir`:return Ee(e.config,t);case`git-init`:return Se(e.config);case`exec`:return P(e.config,t);case`exec-file`:return P(e.config,t);default:{let t=e.type;return`${j.yellow}⚠ Diff not available for task type: ${t}${j.reset}`}}}catch(e){return`${j.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${j.reset}`}}async function F(e,t){console.log(`${j.blue}═══════════════════════════════════════════════════════${j.reset}`),console.log(`${j.blue} DRY RUN - Preview of changes${j.reset}`),console.log(`${j.blue}═══════════════════════════════════════════════════════${j.reset}`);for(let n of e){console.log(`${j.cyan}▶ Task: ${n.name}${j.reset}`),n.description!=null&&n.description!==``&&console.log(`${j.gray} ${n.description}${j.reset}`);let e=await De(n,t);console.log(e),console.log(`${j.gray}${`─`.repeat(55)}${j.reset}`)}console.log(`${j.blue}═══════════════════════════════════════════════════════${j.reset}`),console.log(`${j.yellow} No changes were applied (dry-run mode)${j.reset}`),console.log(`${j.blue}═══════════════════════════════════════════════════════${j.reset}`)}const I=new Map,L={},R=new Map;function z(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(I.has(e.name))throw TypeError(`Plugin ${e.name} is already registered`);for(let t of e.taskTypes)if(R.has(t)){let e=R.get(t);throw TypeError(`Task type "${t}" is already registered by plugin "${e}"`)}I.set(e.name,e);for(let t of e.taskTypes)R.set(t,e.name);p(`Registered plugin: ${e.name}${e.version==null?``:` v${e.version}`}`)}function Oe(e){let t=I.get(e);if(t!=null){for(let e of t.taskTypes)R.delete(e);I.delete(e)}}function ke(e){return I.get(e)}function B(e){let t=R.get(e);if(t!=null)return I.get(t)}function V(e){return R.has(e)}function Ae(){return Array.from(I.keys())}function je(){I.clear(),R.clear()}function Me(e){e.beforeAll!=null&&(L.beforeAll=e.beforeAll),e.afterAll!=null&&(L.afterAll=e.afterAll),e.beforeTask!=null&&(L.beforeTask=e.beforeTask),e.afterTask!=null&&(L.afterTask=e.afterTask),e.onError!=null&&(L.onError=e.onError)}async function H(e,...t){let n=L[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){f(`Error in ${e} hook: ${t instanceof Error?t.message:String(t)}`,`error`)}}async function Ne(e,t,n){let r=B(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}async function Pe(e,t){let n=B(e.type);if(!(n==null||n.getDiff==null))return n.getDiff(e,t)}function Fe(e){let t=B(e.type);return t==null?[`No plugin found for task type: ${e.type}`]:t.validate==null?[]:t.validate(e)}function Ie(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 U=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)&&f(`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 T.notFound(e);try{return await this.executeTransformer(r,t,n)}catch(t){throw t instanceof T?t:T.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 T.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 T.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 T.executionFailed(e.id,`Expression evaluation failed: ${t instanceof Error?t.message:String(t)}`)}}executeLowercase(e){return ce(String(e))}executeUppercase(e){return de(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 T.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 T.executionFailed(e.id,`Chain transformer must have at least one transformer`);return this.executeChain(r,t,n)}executeCapitalize(e){return ae(String(e))}executeTitlecase(e){return ae(String(e))}executeCamelcase(e){return ie(String(e))}executePascalcase(e){return le(String(e))}executeSnakecase(e){return ue(String(e))}executeKebabcase(e){return se(String(e))}executeConstantcase(e){return oe(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 se(String(e))}executeUnderscore(e){return ue(String(e))}clear(){this.transformers.clear()}getIds(){return Array.from(this.transformers.keys())}};function Le(e,t){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch{return!0}}function Re(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 W(e,t){let n=Re(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-Bj8gkhe3.js`);return e(r(n.value,t),{encoding:`utf-8`,stdio:`ignore`}),!0}catch(e){let{log:t}=await import(`./utils-Bj8gkhe3.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 Le(n.value,t)}return!0}async function G(e,t,n,r){if(e!==void 0)return d(e,{id:t,contextType:`Prompt`,...n!=null&&{context:n},...r?.$sourceUrl!=null&&{sourceUrl:r.$sourceUrl}})}async function K(e,t=new Map,n={}){let r={};if(e.length===0)return r;for(let a of e){if(a.$templateEnabled!=null&&!await i(a.$templateEnabled,{...n,...r}))continue;let e={...n,...r};if(await i(a.enabled,e))try{let n,i=t.get(a.id);switch(a.default!==void 0&&(i=await G(a.default,a.id,e,a)),a.type){case`input`:{let t={message:a.message};i!==void 0&&(t.default=String(i));let r=await W(a.required,e);if(r!==void 0&&(t.required=r),n=await te(t),r&&(n==null||typeof n==`string`&&n.trim()===``))throw f(`${a.message} is required`,`error`),C.required(a.id);break}case`password`:if(n=await ne({message:a.message,mask:`*`}),await W(a.required,e)&&(n==null||typeof n==`string`&&n.trim()===``))throw f(`${a.message} is required`,`error`),C.required(a.id);break;case`number`:{let t={message:a.message};i!==void 0&&(t.default=Number(i));let r=await W(a.required,e);if(r!==void 0&&(t.required=r),a.min!==void 0&&(t.min=a.min),a.max!==void 0&&(t.max=a.max),n=await S(t),r&&n==null)throw f(`${a.message} is required`,`error`),C.required(a.id);break}case`select`:{let e={message:a.message,choices:a.choices.map(e=>({name:e.name,value:e.value}))};i!==void 0&&(e.default=i),n=await re(e);break}case`confirm`:{let e=i===void 0?!1:!!i;n=await x({message:a.message,default:e});break}default:throw f(`Unknown prompt type: ${a.type}`,`error`),C.unknownType(a.type)}a.transformers!==void 0&&(n=await U.apply(a.transformers,n,{...e,...r})),r[a.id]=n}catch(e){throw e instanceof Error&&f(`Failed to collect prompt "${a.id}": ${e.message}`,`error`),e}}return r}async function q(e,t){let n=new Map,r=e.map(async e=>{if(e.default!==void 0){let r=await G(e.default,e.id,t,e);r!==void 0&&n.set(e.id,r)}});return await Promise.all(r),n}function J(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 ze=y(_.appendFile),Be=y(_.readFile),Ve=y(_.stat);async function He(e,t,n){if(e.condition!=null&&e.condition!==``&&!a(e.condition,t)){f(`Condition not met, skipping append task`,`info`);return}let r=g.join(v.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);let o=O(i);if(!o.isValid)throw o.error?.includes(`cannot have both`)?w.templateHasBothTemplateAndFile():w.templateMissingTemplateOrFile();let s=await k(i,t,n),c=!1,l=!1;try{await Ve(r),c=!0;let t=await Be(r,`utf-8`);t.length>0&&!t.endsWith(`
|
|
23
|
+
`)&&(l=e.newline!==!1)}catch{}c&&l?await ze(r,`\n${s}`):await ze(r,s),f(`Appended content to ${e.file}`,`success`)}const Ue={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await He(e.config,t,e)}},We=y(_.copyFile),Ge=y(_.stat),Ke=y(_.mkdir),qe=y(_.readdir);async function Je(e,t){await Ke(t,{recursive:!0});let n=await qe(e,{withFileTypes:!0});await Promise.all(n.map(async n=>{let r=g.join(e,n.name),i=g.join(t,n.name);n.isDirectory()?await Je(r,i):await We(r,i)}))}async function Ye(e,t){if(e.condition!=null&&e.condition!==``&&!a(e.condition,t)){f(`Condition not met, skipping copy task`,`info`);return}let n=g.join(v.cwd(),e.from),r=g.join(v.cwd(),e.to),i;try{i=await Ge(n)}catch{f(`Source path does not exist: ${n}`,`warn`);return}await Ke(g.dirname(r),{recursive:!0}),i.isDirectory()?(await Je(n,r),f(`Copied directory ${e.from} to ${e.to}`,`success`)):(await We(n,r),f(`Copied file ${e.from} to ${e.to}`,`success`))}const Xe={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await Ye(e.config,t)}},Ze=y(_.writeFile);async function Qe(e,t,n){if(e.condition!=null&&e.condition!==``&&!a(e.condition,t)){f(`Condition not met, skipping create task`,`info`);return}let r=g.join(v.cwd(),e.file);if(_.existsSync(r)){f(`File already exists, skipping: ${e.file}`,`info`);return}let i=O(e);if(!i.isValid)throw i.error?.includes(`cannot have both`)?w.createHasBothTemplateAndFile():w.createMissingTemplateOrFile();let o=await k(e,t,n),s=g.dirname(r);_.existsSync(s)||_.mkdirSync(s,{recursive:!0}),await Ze(r,o),f(`Created file: ${e.file}`,`success`)}const $e={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await Qe(e.config,t,e)}};async function et(e,t){let{paths:n,condition:r}=e;if(r!=null&&r!==``){if(!t){f(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!a(r,t)){f(`Condition not met, skipping deletion`,`info`);return}}for(let e of n){let t=g.join(v.cwd(),e);_.existsSync(t)&&_.rmSync(t,{recursive:!0,force:!0})}}const tt={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await et(e.config,t)}};async function nt(e,t,n){e.condition!=null&&e.condition!==``&&!a(e.condition,t)||await 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},...n?.$sourceUrl!=null&&n.$sourceUrl.trim()!==``&&{sourceUrl:n.$sourceUrl},captureOutput:!1},t)}const rt={name:`exec-file`,version:`1.0.0`,taskTypes:[`exec-file`],execute:async(e,t,n)=>{n.dryRun||await nt(e.config,t,e)}};async function it(e,t){if(e.condition!=null&&e.condition!==``){if(!t){f(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!a(e.condition,t)){f(`Condition not met, skipping exec task`,`info`);return}}let n=e.cwd==null?v.cwd():g.join(v.cwd(),e.cwd);b(e.command,{cwd:n,stdio:`inherit`})}const at={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await it(e.config,t)}};async function ot(e,t){if(e.condition!=null&&e.condition!==``){if(!t){f(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!a(e.condition,t)){f(`Condition not met, skipping git-init task`,`info`);return}}if(e.removeExisting){let e=g.join(v.cwd(),`.git`);_.existsSync(e)&&_.rmSync(e,{recursive:!0,force:!0})}if(b(`git init`,{stdio:`inherit`}),e.initialCommit){let t=e.message??`Initial commit`;b(`git add .`,{stdio:`inherit`}),b(`git commit -m "${t}"`,{stdio:`inherit`})}}const st={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await ot(e.config,t)}},ct=y(_.mkdir);async function lt(e,t){if(e.condition!=null&&e.condition!==``&&!a(e.condition,t)){f(`Condition not met, skipping mkdir task`,`info`);return}await ct(g.join(v.cwd(),e.path),{recursive:!0}),f(`Created directory: ${e.path}`,`success`)}const ut={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await lt(e.config,t)}},dt=y(_.rename),ft=y(_.stat),pt=y(_.mkdir);async function mt(e,t){if(e.condition!=null&&e.condition!==``&&!a(e.condition,t)){f(`Condition not met, skipping move task`,`info`);return}let n=g.join(v.cwd(),e.from),r=g.join(v.cwd(),e.to);try{await ft(n)}catch{f(`Source path does not exist: ${n}`,`warn`);return}await pt(g.dirname(r),{recursive:!0}),await dt(n,r),f(`Moved ${e.from} to ${e.to}`,`success`)}const ht={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await mt(e.config,t)}},gt=y(_.readFile),_t=y(_.writeFile);async function vt(e,t){if(e.condition!=null&&e.condition!==``&&!a(e.condition,t)){f(`Condition not met, skipping regex-replace task`,`info`);return}let n=g.join(v.cwd(),e.file),{pattern:r}=e,i=e.flags??``,o=e.replacement||``,s=await gt(n,`utf-8`),l=new RegExp(r,i);s=s.replace(l,c(o,t)),await _t(n,s)}const yt={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await vt(e.config,t)}},bt=y(_.rename);async function xt(e,t){if(e.condition!=null&&e.condition!==``&&!a(e.condition,t)){f(`Condition not met, skipping rename task`,`info`);return}let n=g.join(v.cwd(),c(e.from,t)),r=g.join(v.cwd(),c(e.to,t));if(!_.existsSync(n)){f(`Source path does not exist: ${n}`,`warn`);return}await bt(n,r)}const St={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await xt(e.config,t)}},Ct=y(_.readFile),wt=y(_.writeFile);async function Tt(e,t){if(e.condition!=null&&e.condition!==``&&!a(e.condition,t)){f(`Condition not met, skipping replace-in-file task`,`info`);return}let n=g.join(v.cwd(),e.file),{replacements:r}=e;if(!_.existsSync(n)){f(`File not found: ${n}, skipping`,`warn`);return}let i=await Ct(n,`utf-8`);for(let{find:e,replace:n}of r){let r=c(n,t);i=i.replace(new RegExp(e,`gu`),r)}await wt(n,i)}const Et={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await Tt(e.config,t)}},Dt=y(_.readFile),Ot=y(_.writeFile);async function kt(e,n){if(e.condition!=null&&e.condition!==``&&!a(e.condition,n)){f(`Condition not met, skipping update-json task`,`info`);return}let r=g.join(v.cwd(),e.file),{updates:i}=e,o=await Dt(r,`utf-8`),s=JSON.parse(o);function l(e){if(typeof e==`string`)return c(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(i)){let r=l(n);e.includes(`.`)?t(s,e,r):s[e]=r}await Ot(r,`${JSON.stringify(s,null,2)}\n`)}const At={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await kt(e.config,t)}},jt=y(_.writeFile);async function Mt(e,t,n){let{allowCreate:r=!0}=e;if(e.condition!=null&&e.condition!==``&&!a(e.condition,t)){f(`Condition not met, skipping write task`,`info`);return}let i=g.join(v.cwd(),e.file);if(!_.existsSync(i)){if(r===!1)throw Error(`Write task failed: file does not exist (${e.file})`);f(`File not found, creating new file: ${e.file}`,`info`)}let o=O(e);if(!o.isValid)throw o.error?.includes(`cannot have both`)?w.templateHasBothTemplateAndFile():w.templateMissingTemplateOrFile();let s=await k(e,t,n),c=g.dirname(i);_.existsSync(c)||_.mkdirSync(c,{recursive:!0}),await jt(i,s)}const Nt={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await Mt(e.config,t,e)}};function Y(){V(`update-json`)||(z(At),z(Nt),z($e),z(yt),z(Et),z(tt),z(St),z(st),z(at),z(rt),z(ht),z(Xe),z(Ue),z(ut))}async function Pt(e,t,n=!1){if(Y(),n){f(`[DRY RUN] Would execute: ${e.name}`,`info`);return}if(V(e.type)){await Ne(e,t,{dryRun:n});return}throw TypeError(`Unknown task type: ${e.type}`)}async function Ft(e,t,n,r,i=!1){try{return f(`[${n}/${r}] Running: ${e.name}...`,`info`),await Pt(e,t,i),f(`[${n}/${r}] Completed: ${e.name}...`,`success`),!0}catch(t){return f(`Failed: ${e.name}`,`error`),t instanceof Error&&(f(` Reason: ${t.message}`,`error`),t.stack!=null&&v.env.DEBUG!=null&&console.error(t.stack)),!1}}function X(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 m.forTaskDependency(e);r.add(e);let o=i.get(e);if(!o)throw fe.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 It(e){let t=[];for(let n of e)if(!V(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=Lt(n);t.push(...e)}return t}function Lt(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=O({...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 Rt(e){f(`❌ Template validation failed:`,`error`),f(``,`error`);for(let t of e)f(` • ${t}`,`error`);f(``,`error`),f(`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 U.apply(i.transformers,e,{...n,...r})),r[i.id]=e)}return r}async function Q(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.$templateEnabled!=null){let e={...t};for(let[t,n]of r.entries())e[t]=n;if(!await i(a.$templateEnabled,e))continue}let e={...t};for(let[t,n]of r.entries())e[t]=n;let o=await d(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}async function zt(e,t,n,r){if(e==null)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let i=e;if(i.type===`conditional`){if(!n){f(`Variable "${t}": conditional value requires context but none provided`,`warn`);return}if(typeof i.condition!=`string`){f(`Variable "${t}": conditional value must have a string condition`,`error`);return}try{let{evaluateCondition:e}=await import(`./utils-Bj8gkhe3.js`),a=e(i.condition,n)?i.ifTrue:i.ifFalse;return typeof a==`object`&&a?await zt(a,t,n,r):a}catch(e){f(`Variable "${t}": failed to evaluate conditional value: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(i.type===`exec`){let e=i.value;if(typeof e!=`string`){f(`Variable "${t}": exec value must have a string command`,`error`);return}try{let t=b(e,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(t.startsWith(`{`)||t.startsWith(`[`))try{return JSON.parse(t)}catch{return t}if(/^-?\d+(?:\.\d+)?$/u.test(t)){let e=Number.parseFloat(t);if(!Number.isNaN(e))return e}return t===`true`||t===`false`?t===`true`:t}catch(e){f(`Variable "${t}": failed to execute command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}else if(i.type===`static`)return i.value;else if(i.type===`interpolate`){let e=i.value;if(typeof e!=`string`){f(`Variable "${t}": interpolate value must be a string with {{variable}} placeholders`,`error`);return}if(!n)return f(`Variable "${t}": interpolate value requires context but none provided`,`warn`),e;try{return c(e,n)}catch(n){return f(`Variable "${t}": failed to interpolate interpolate value: ${n instanceof Error?n.message:`Unknown error`}`,`warn`),e}}else if(i.type===`exec-file`){if(!n){f(`Variable "${t}": exec-file value requires context but none provided`,`warn`);return}let e=i;if(typeof e.file!=`string`){f(`Variable "${t}": 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},...r!=null&&{sourceUrl:r},captureOutput:!0},n);if(t===void 0)return;let i=t.trim();if(i.startsWith(`{`)||i.startsWith(`[`))try{return JSON.parse(i)}catch{return i}if(/^-?\d+(?:\.\d+)?$/u.test(i)){let e=Number.parseFloat(i);if(!Number.isNaN(e))return e}return i===`true`||i===`false`?i===`true`:i}catch(e){f(`Variable "${t}": failed to execute script file: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}else if(i.type!==void 0){f(`Variable "${t}": unknown value type "${i.type}". Expected "static", "exec", "conditional", "interpolate", or "exec-file".`,`error`);return}return e}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 Bt(t,r){let a=e();if(!await i(r.templateEnabled,a,{lazy:!0})){h(`⊘ Template is disabled - skipping all execution`);return}r.transformers!==void 0&&r.transformers.length>0&&(p(`Registering ${r.transformers.length} transformer(s)...`),U.registerAll(r.transformers)),p(`Registering built-in plugins...`),Y(),p(`Validating task configurations...`);let s=It(t);s.length>0&&(Rt(s),v.exit(1)),p(`All tasks validated successfully`);let c=t.filter(t=>o(t.enabled,e(),{lazy:!0}));p(`Resolving task dependencies...`);let l=X(c);p(`Sorted ${l.length} task(s) by dependencies`),h(`Welcome! Let's execute your tasks.`),r.dryRun&&n(`🔍 DRY RUN MODE - No changes will be made`),h(`This will execute your project tasks based on the defined configuration.`);let u=a,d=[...r.variables??[]];if(d.length>0){let e=$(d);e.length>0&&(f(`❌ Variable validation errors:`,`error`),e.forEach(e=>f(` - ${e}`,`error`)),v.exit(1)),p(`Resolving variable values...`);let t=await Z(d,await Q(d,u,{skipConditional:!0}),u);Object.assign(u,t),Object.keys(t).length>0&&(p(`Resolved ${Object.keys(t).length} variable(s)`),p(`Variable values: ${JSON.stringify(t)}`))}let m=r.prompts??[],g=[...m];if(g.length>0){let e=J(g);e.length>0&&(f(`❌ Prompt validation errors:`,`error`),e.forEach(e=>f(` - ${e}`,`error`)),v.exit(1)),p(`Resolving prompt default values...`);let t=await q(g,u);if(m.length>0){h(`📋 Collecting prompts (available to all tasks):`);let e=await K(m,t,u);Object.assign(u,e)}}if(d.length>0){let e=d.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1);if(e.length>0){p(`Re-resolving conditional variables with prompt values...`);let t=await Z(e,await Q(e,u),u);Object.assign(u,t),Object.keys(t).length>0&&p(`Resolved ${Object.keys(t).length} conditional variable(s)`)}}if(!await i(r.templateEnabled,u)){h(`⊘ Template is disabled after variable resolution - skipping all execution`);return}let _=[];for(let e of l)e.$templateEnabled!=null&&!await i(e.$templateEnabled,u)||await i(e.enabled,u)&&_.push(e);if(f(`${_.length} of ${l.length} task(s) enabled for execution`,`info`),r.dryRun){await F(_,u),h(`🔍 Dry run completed - no changes were made`),h(`Run without --dry-run to apply changes`);return}p(`Calling beforeAll hook...`),await H(`beforeAll`,u);let y=_.length,b=0,x=0,te=[],S=[];for(let e=0;e<_.length;e++){let t=_[e];t!=null&&(p(`Calling beforeTask hook for task: ${t.name}`),await H(`beforeTask`,t,u),await Ft(t,u,e+1,y,r.dryRun)?(b++,te.push(t.id),p(`Calling afterTask hook for task: ${t.name}`),await H(`afterTask`,t,u)):(await W(t.required,u)&&(x++,S.push(t.name)),p(`Calling onError hook for task: ${t.name}`),await H(`onError`,Error(`Task ${t.name} failed`),t),n(`⚠️ Task "${t.name}" failed, continuing with remaining tasks...`)))}x>0&&(f(`\n❌ Task execution completed with ${x} error(s)`,`error`),f(`Completed: ${b}/${y} tasks`,`info`),f(`Failed tasks: ${S.join(`, `)}`,`error`),v.exit(1)),p(`Calling afterAll hook...`),await H(`afterAll`,u),ee(`✅ All tasks completed successfully!`),ee(` Completed: ${b}/${y} tasks`)}async function Vt(e,t,r={}){p(`Running templates with sequential variable/prompt resolution...`),p(`Total templates to process: ${e.length}`),p(`Registering built-in plugins...`),Y();let a=[];console.log(``),h(`📋 Collecting input...`),console.log(``);for(let t=0;t<e.length;t++){let n=e[t];if(n==null)continue;let o=`=`.repeat(60);if(p(`\n${o}`),p(`Processing template ${t+1}/${e.length}: "${n.name}"`),p(o),p(`Current config keys: ${Object.keys(r).join(`, `)}`),!await i(n.enabled,r)){h(`⊘ Template "${n.name}" is disabled - skipping`),p(` Enabled condition: ${JSON.stringify(n.enabled)}`);continue}let s=n.variables??[];if(s.length>0){p(`Processing ${s.length} variable(s) for template "${n.name}"...`);let e=$(s);e.length>0&&(f(`❌ Variable validation errors:`,`error`),e.forEach(e=>f(` - ${e}`,`error`)),v.exit(1));let t=await Z(s,await Q(s,r,{skipConditional:!0}),r);Object.assign(r,t);let i=s.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1),a=0;if(i.length>0){let e=await Z(i,await Q(i,r),r);if(a=Object.keys(e).length,Object.assign(r,e),a>0){p(`Resolved ${a} conditional variable(s)`);for(let[t,n]of Object.entries(e))p(` ${t} = ${JSON.stringify(n)}`)}}let o=Object.keys(t).length+a;if(o>0){p(`Total variables resolved for template: ${o}`);for(let[e,n]of Object.entries(t))p(` ${e} = ${JSON.stringify(n)}`)}}let c=n.prompts??[];if(c.length>0){p(`Processing ${c.length} prompt(s) for template "${n.name}"...`);let e=J(c);e.length>0&&(f(`❌ Prompt validation errors:`,`error`),e.forEach(e=>f(` - ${e}`,`error`)),v.exit(1));let t=await K(c,await q(c,r),r);Object.assign(r,t),p(`Collected ${Object.keys(t).length} prompt answer(s)`)}if(!await i(n.enabled,r)){h(`⊘ Template "${n.name}" became disabled after variable/prompt resolution - skipping tasks`);continue}let l=n.tasks??[];l.length>0&&(p(`Found ${l.length} task(s) in template "${n.name}" (will execute later)`),a.push(...l))}if(p(`
|
|
24
|
+
🔧 Validating and filtering all collected tasks...`),a.length===0){f(`No tasks found in any template`,`info`);return}let o=It(a);o.length>0&&(Rt(o),v.exit(1)),console.log(``),f(`🛠️ Preparing tasks...`,`info`);let s=[];for(let e of a)await i(e.enabled,r)&&s.push(e);if(console.log(``),f(`Found ${a.length} tasks (${s.length} enabled)`,`info`),f(`All tasks validated successfully`,`success`),s.length===0){f(`No enabled tasks to execute`,`info`);return}let c=X(s);if(t.dryRun){f(`
|
|
25
|
+
🔍 Dry run - showing task changes...`,`info`),await F(c,r),f(`
|
|
26
|
+
🔍 Dry run completed - no changes were made`,`info`),f(`Run without --dry-run to apply changes`,`info`);return}console.log(``),h(`⚙️ Executing tasks...`),console.log(``),await H(`beforeAll`,r);let l=0,u=0,d=[];for(let e=0;e<c.length;e++){let i=c[e];i!=null&&(await H(`beforeTask`,i,r),await Ft(i,r,e+1,c.length,t.dryRun)?(l++,await H(`afterTask`,i,r)):(await W(i.required,r)&&(u++,d.push(i.name)),await H(`onError`,Error(`Task ${i.name} failed`),i),n(`⚠️ Task "${i.name}" failed, continuing with remaining tasks...`)))}await H(`afterAll`,r),u>0&&(f(`\n❌ Task execution completed with ${u} error(s)`,`error`),f(`Completed: ${l}/${c.length} tasks`,`info`),f(`Failed tasks: ${d.join(`, `)}`,`error`),v.exit(1)),f(`Completed: ${l}/${c.length} tasks`,`success`)}export{be as A,E as B,Ae as C,Fe as D,Oe as E,ye as F,k as H,De as I,he as L,Se as M,ve as N,F as O,xe as P,ge as R,V as S,z as T,pe as U,D as V,O as W,Ie as _,Q as a,B as b,Pt as c,J as d,q as f,je as g,H as h,zt as i,P as j,_e as k,Y as l,G as m,Vt as n,Z as o,K as p,$ as r,X as s,Bt as t,Ft as u,Ne as v,Me as w,Pe as x,ke as y,me as z};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
const e=require(`./chunk-DjWAcSYV.cjs`),t=require(`./config-DlJs75hK.cjs`),n=require(`./template-inheritance-CwBAv1Q9.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 n.T{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.T{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 n.T{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 n.T{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,t,r,i={}){let{enableHandlebars:a=!0,sourceUrl:o=r?.$sourceUrl}=i,s=m(e),c=h(e);if(s)return n.l(e.template,t);if(c){let r=e.templateFile,i=a&&g(r),s=await n.n(n.h(r,o));return i?(await import(`handlebars`)).default.compile(s)(t):n.l(s,t)}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,t){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t))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 n.l(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[t,r]of Object.entries(e.updates)){let e=s(r);t.includes(`.`)?n.C(i,t,e):i[t]=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,t){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t))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=n.l(e.template,t);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 w(e,t,o){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t))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 n=await v(e,t,o),r=n.split(`
|
|
10
|
+
`).slice(0,10).join(`
|
|
11
|
+
`),i=n.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 n=ee(e);return`${b.blue}File: ${e.file}${b.reset}\n${b.green}+ New file would be created from ${n}${b.reset}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}async function T(e,t){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t))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=n.l(e.replacement,t),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 E(e,t){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t))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=n.l(i,t),o=n.l(a,t);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 D(e,t){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let o=e.paths.map(e=>n.l(e,t)).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 O(e,t){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let o=n.l(e.from,t),s=n.l(e.to,t),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 k(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 A(e,t){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let r=n.l(e.command,t),i=e.cwd==null?a.default.cwd():n.l(e.cwd,t);return`${b.yellow}Would execute:${b.reset}\n${b.cyan} Command: ${r}${b.reset}\n${b.cyan} Working directory: ${i}${b.reset}`}function ae(e,t){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let o=n.l(e.from,t),s=n.l(e.to,t),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 oe(e,t){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let o=n.l(e.from,t),s=n.l(e.to,t),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 se(e,t,o){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t))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 n=await v(c,t,o),i=n.split(`
|
|
18
|
+
`).slice(0,10).join(`
|
|
19
|
+
`),a=n.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 ce(e,t){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let o=n.l(e.path,t),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 le(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 w(e.config,t,e);case`regex-replace`:return await T(e.config,t);case`replace-in-file`:return await E(e.config,t);case`delete`:return D(e.config,t);case`rename`:return O(e.config,t);case`move`:return ae(e.config,t);case`copy`:return oe(e.config,t);case`append`:return await se(e.config,t,e);case`mkdir`:return ce(e.config,t);case`git-init`:return k(e.config);case`exec`:return A(e.config,t);case`exec-file`:return A(e.config,t);default:{let t=e.type;return`${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 j(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 le(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 M=new Map,N={},P=new Map;function F(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(M.has(e.name))throw TypeError(`Plugin ${e.name} is already registered`);for(let t of e.taskTypes)if(P.has(t)){let e=P.get(t);throw TypeError(`Task type "${t}" is already registered by plugin "${e}"`)}M.set(e.name,e);for(let t of e.taskTypes)P.set(t,e.name);n.v(`Registered plugin: ${e.name}${e.version==null?``:` v${e.version}`}`)}function ue(e){let t=M.get(e);if(t!=null){for(let e of t.taskTypes)P.delete(e);M.delete(e)}}function de(e){return M.get(e)}function I(e){let t=P.get(e);if(t!=null)return M.get(t)}function L(e){return P.has(e)}function fe(){return Array.from(M.keys())}function pe(){M.clear(),P.clear()}function me(e){e.beforeAll!=null&&(N.beforeAll=e.beforeAll),e.afterAll!=null&&(N.afterAll=e.afterAll),e.beforeTask!=null&&(N.beforeTask=e.beforeTask),e.afterTask!=null&&(N.afterTask=e.afterTask),e.onError!=null&&(N.onError=e.onError)}async function R(e,...t){let r=N[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.u(`Error in ${e} hook: ${t instanceof Error?t.message:String(t)}`,`error`)}}async function z(e,t,n){let r=I(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}async function he(e,t){let n=I(e.type);if(!(n==null||n.getDiff==null))return n.getDiff(e,t)}function ge(e){let t=I(e.type);return t==null?[`No plugin found for task type: ${e.type}`]:t.validate==null?[]:t.validate(e)}function _e(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 ve=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.u(`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 B=new ve;function ye(e,t){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch{return!0}}function be(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 V(e,t){let n=be(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-CRe7Fw3m.cjs`));return e(r(n.value,t),{encoding:`utf-8`,stdio:`ignore`}),!0}catch(e){let{log:t}=await Promise.resolve().then(()=>require(`./utils-CRe7Fw3m.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 ye(n.value,t)}return!0}async function H(e,t,r,i){if(e!==void 0)return n.p(e,{id:t,contextType:`Prompt`,...r!=null&&{context:r},...i?.$sourceUrl!=null&&{sourceUrl:i.$sourceUrl}})}async function U(e,t=new Map,r={}){let i={};if(e.length===0)return i;for(let a of e){if(a.$templateEnabled!=null&&!await n._(a.$templateEnabled,{...r,...i}))continue;let e={...r,...i};if(await n._(a.enabled,e))try{let r,o=t.get(a.id);switch(a.default!==void 0&&(o=await H(a.default,a.id,e,a)),a.type){case`input`:{let t={message:a.message};o!==void 0&&(t.default=String(o));let i=await V(a.required,e);if(i!==void 0&&(t.required=i),r=await(0,c.input)(t),i&&(r==null||typeof r==`string`&&r.trim()===``))throw n.u(`${a.message} is required`,`error`),d.required(a.id);break}case`password`:if(r=await(0,c.password)({message:a.message,mask:`*`}),await V(a.required,e)&&(r==null||typeof r==`string`&&r.trim()===``))throw n.u(`${a.message} is required`,`error`),d.required(a.id);break;case`number`:{let t={message:a.message};o!==void 0&&(t.default=Number(o));let i=await V(a.required,e);if(i!==void 0&&(t.required=i),a.min!==void 0&&(t.min=a.min),a.max!==void 0&&(t.max=a.max),r=await(0,c.number)(t),i&&r==null)throw n.u(`${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 n.u(`Unknown prompt type: ${a.type}`,`error`),d.unknownType(a.type)}a.transformers!==void 0&&(r=await B.apply(a.transformers,r,{...e,...i})),i[a.id]=r}catch(e){throw e instanceof Error&&n.u(`Failed to collect prompt "${a.id}": ${e.message}`,`error`),e}}return i}async function W(e,t){let n=new Map,r=e.map(async e=>{if(e.default!==void 0){let r=await H(e.default,e.id,t,e);r!==void 0&&n.set(e.id,r)}});return await Promise.all(r),n}function G(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 K=(0,o.promisify)(r.default.appendFile),xe=(0,o.promisify)(r.default.readFile),Se=(0,o.promisify)(r.default.stat);async function Ce(e,t,r){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t)){n.u(`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,t,r),u=!1,d=!1;try{await Se(o),u=!0;let t=await xe(o,`utf-8`);t.length>0&&!t.endsWith(`
|
|
23
|
+
`)&&(d=e.newline!==!1)}catch{}u&&d?await K(o,`\n${l}`):await K(o,l),n.u(`Appended content to ${e.file}`,`success`)}const we={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await Ce(e.config,t,e)}},Te=(0,o.promisify)(r.default.copyFile),Ee=(0,o.promisify)(r.default.stat),De=(0,o.promisify)(r.default.mkdir),Oe=(0,o.promisify)(r.default.readdir);async function ke(e,t){await De(t,{recursive:!0});let n=await Oe(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 ke(r,a):await Te(r,a)}))}async function Ae(e,t){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t)){n.u(`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 Ee(r)}catch{n.u(`Source path does not exist: ${r}`,`warn`);return}await De(i.default.dirname(o),{recursive:!0}),s.isDirectory()?(await ke(r,o),n.u(`Copied directory ${e.from} to ${e.to}`,`success`)):(await Te(r,o),n.u(`Copied file ${e.from} to ${e.to}`,`success`))}const je={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await Ae(e.config,t)}},Me=(0,o.promisify)(r.default.writeFile);async function Ne(e,t,o){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t)){n.u(`Condition not met, skipping create task`,`info`);return}let s=i.default.join(a.default.cwd(),e.file);if(r.default.existsSync(s)){n.u(`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,t,o),u=i.default.dirname(s);r.default.existsSync(u)||r.default.mkdirSync(u,{recursive:!0}),await Me(s,l),n.u(`Created file: ${e.file}`,`success`)}const Pe={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await Ne(e.config,t,e)}};async function Fe(e,t){let{paths:o,condition:s}=e;if(s!=null&&s!==``){if(!t){n.u(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!n.c(s,t)){n.u(`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 Ie={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await Fe(e.config,t)}};async function Le(e,t,r){e.condition!=null&&e.condition!==``&&!n.c(e.condition,t)||await n.m({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},t)}const Re={name:`exec-file`,version:`1.0.0`,taskTypes:[`exec-file`],execute:async(e,t,n)=>{n.dryRun||await Le(e.config,t,e)}};async function ze(e,t){if(e.condition!=null&&e.condition!==``){if(!t){n.u(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!n.c(e.condition,t)){n.u(`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 Be={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await ze(e.config,t)}};async function Ve(e,t){if(e.condition!=null&&e.condition!==``){if(!t){n.u(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!n.c(e.condition,t)){n.u(`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 He={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await Ve(e.config,t)}},Ue=(0,o.promisify)(r.default.mkdir);async function We(e,t){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t)){n.u(`Condition not met, skipping mkdir task`,`info`);return}await Ue(i.default.join(a.default.cwd(),e.path),{recursive:!0}),n.u(`Created directory: ${e.path}`,`success`)}const Ge={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await We(e.config,t)}},Ke=(0,o.promisify)(r.default.rename),qe=(0,o.promisify)(r.default.stat),Je=(0,o.promisify)(r.default.mkdir);async function Ye(e,t){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t)){n.u(`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 qe(r)}catch{n.u(`Source path does not exist: ${r}`,`warn`);return}await Je(i.default.dirname(o),{recursive:!0}),await Ke(r,o),n.u(`Moved ${e.from} to ${e.to}`,`success`)}const Xe={name:`move`,version:`1.0.0`,taskTypes:[`move`],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,t){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t)){n.u(`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 Ze(r,`utf-8`),u=new RegExp(o,s);l=l.replace(u,n.l(c,t)),await Qe(r,l)}const et={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await $e(e.config,t)}},tt=(0,o.promisify)(r.default.rename);async function nt(e,t){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t)){n.u(`Condition not met, skipping rename task`,`info`);return}let o=i.default.join(a.default.cwd(),n.l(e.from,t)),s=i.default.join(a.default.cwd(),n.l(e.to,t));if(!r.default.existsSync(o)){n.u(`Source path does not exist: ${o}`,`warn`);return}await tt(o,s)}const rt={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await nt(e.config,t)}},it=(0,o.promisify)(r.default.readFile),at=(0,o.promisify)(r.default.writeFile);async function ot(e,t){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t)){n.u(`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)){n.u(`File not found: ${o}, skipping`,`warn`);return}let c=await it(o,`utf-8`);for(let{find:e,replace:r}of s){let i=n.l(r,t);c=c.replace(new RegExp(e,`gu`),i)}await at(o,c)}const st={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await ot(e.config,t)}},ct=(0,o.promisify)(r.default.readFile),lt=(0,o.promisify)(r.default.writeFile),ut=2;async function dt(e,t){if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t)){n.u(`Condition not met, skipping update-json task`,`info`);return}let r=i.default.join(a.default.cwd(),e.file),{updates:o}=e,s=await ct(r,`utf-8`),c=JSON.parse(s);function l(e){if(typeof e==`string`)return n.l(e,t);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,t]of Object.entries(o)){let r=l(t);e.includes(`.`)?n.C(c,e,r):c[e]=r}await lt(r,`${JSON.stringify(c,null,2)}\n`)}const ft={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await dt(e.config,t)}},pt=(0,o.promisify)(r.default.writeFile);async function mt(e,t,o){let{allowCreate:s=!0}=e;if(e.condition!=null&&e.condition!==``&&!n.c(e.condition,t)){n.u(`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})`);n.u(`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,t,o),d=i.default.dirname(c);r.default.existsSync(d)||r.default.mkdirSync(d,{recursive:!0}),await pt(c,u)}const ht={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await mt(e.config,t,e)}};function q(){L(`update-json`)||(F(ft),F(ht),F(Pe),F(et),F(st),F(Ie),F(rt),F(He),F(Be),F(Re),F(Xe),F(je),F(we),F(Ge))}async function gt(e,t,r=!1){if(q(),r){n.u(`[DRY RUN] Would execute: ${e.name}`,`info`);return}if(L(e.type)){await z(e,t,{dryRun:r});return}throw TypeError(`Unknown task type: ${e.type}`)}async function J(e,t,r,i,o=!1){try{return n.u(`[${r}/${i}] Running: ${e.name}...`,`info`),await gt(e,t,o),n.u(`[${r}/${i}] Completed: ${e.name}...`,`success`),!0}catch(t){return n.u(`Failed: ${e.name}`,`error`),t instanceof Error&&(n.u(` Reason: ${t.message}`,`error`),t.stack!=null&&a.default.env.DEBUG!=null&&console.error(t.stack)),!1}}function Y(e){let t=[],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 n.w.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),t.push(s)}for(let t of e)r.has(t.id)||o(t.id);return t}function _t(e){let t=[];for(let n of e)if(!L(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=vt(n);t.push(...e)}return t}function vt(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 yt(e){n.u(`❌ Template validation failed:`,`error`),n.u(``,`error`);for(let t of e)n.u(` • ${t}`,`error`);n.u(``,`error`),n.u(`Please fix these errors before continuing.`,`error`)}async function X(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 B.apply(i.transformers,e,{...n,...r})),r[i.id]=e)}return r}async function Z(e,t,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.$templateEnabled!=null){let e={...t};for(let[t,n]of i.entries())e[t]=n;if(!await n._(a.$templateEnabled,e))continue}let e={...t};for(let[t,n]of i.entries())e[t]=n;let o=await n.p(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}async function Q(e,t,r,i){if(e==null)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let a=e;if(a.type===`conditional`){if(!r){n.u(`Variable "${t}": conditional value requires context but none provided`,`warn`);return}if(typeof a.condition!=`string`){n.u(`Variable "${t}": conditional value must have a string condition`,`error`);return}try{let{evaluateCondition:e}=await Promise.resolve().then(()=>require(`./utils-CRe7Fw3m.cjs`)),n=e(a.condition,r)?a.ifTrue:a.ifFalse;return typeof n==`object`&&n?await Q(n,t,r,i):n}catch(e){n.u(`Variable "${t}": failed to evaluate conditional value: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(a.type===`exec`){let e=a.value;if(typeof e!=`string`){n.u(`Variable "${t}": exec value must have a string command`,`error`);return}try{let t=(0,s.execSync)(e,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(t.startsWith(`{`)||t.startsWith(`[`))try{return JSON.parse(t)}catch{return t}if(/^-?\d+(?:\.\d+)?$/u.test(t)){let e=Number.parseFloat(t);if(!Number.isNaN(e))return e}return t===`true`||t===`false`?t===`true`:t}catch(e){n.u(`Variable "${t}": failed to execute command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}else if(a.type===`static`)return a.value;else if(a.type===`interpolate`){let e=a.value;if(typeof e!=`string`){n.u(`Variable "${t}": interpolate value must be a string with {{variable}} placeholders`,`error`);return}if(!r)return n.u(`Variable "${t}": interpolate value requires context but none provided`,`warn`),e;try{return n.l(e,r)}catch(r){return n.u(`Variable "${t}": failed to interpolate interpolate value: ${r instanceof Error?r.message:`Unknown error`}`,`warn`),e}}else if(a.type===`exec-file`){if(!r){n.u(`Variable "${t}": exec-file value requires context but none provided`,`warn`);return}let e=a;if(typeof e.file!=`string`){n.u(`Variable "${t}": exec-file value must have a file path`,`error`);return}try{let t=await n.m({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},...i!=null&&{sourceUrl:i},captureOutput:!0},r);if(t===void 0)return;let a=t.trim();if(a.startsWith(`{`)||a.startsWith(`[`))try{return JSON.parse(a)}catch{return a}if(/^-?\d+(?:\.\d+)?$/u.test(a)){let e=Number.parseFloat(a);if(!Number.isNaN(e))return e}return a===`true`||a===`false`?a===`true`:a}catch(e){n.u(`Variable "${t}": failed to execute script file: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}else if(a.type!==void 0){n.u(`Variable "${t}": unknown value type "${a.type}". Expected "static", "exec", "conditional", "interpolate", or "exec-file".`,`error`);return}return e}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 bt(e,r){let i=t.t();if(!await n._(r.templateEnabled,i,{lazy:!0})){n.y(`⊘ Template is disabled - skipping all execution`);return}r.transformers!==void 0&&r.transformers.length>0&&(n.v(`Registering ${r.transformers.length} transformer(s)...`),B.registerAll(r.transformers)),n.v(`Registering built-in plugins...`),q(),n.v(`Validating task configurations...`);let o=_t(e);o.length>0&&(yt(o),a.default.exit(1)),n.v(`All tasks validated successfully`);let s=e.filter(e=>n.g(e.enabled,t.t(),{lazy:!0}));n.v(`Resolving task dependencies...`);let c=Y(s);n.v(`Sorted ${c.length} task(s) by dependencies`),n.y(`Welcome! Let's execute your tasks.`),r.dryRun&&n.S(`🔍 DRY RUN MODE - No changes will be made`),n.y(`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&&(n.u(`❌ Variable validation errors:`,`error`),e.forEach(e=>n.u(` - ${e}`,`error`)),a.default.exit(1)),n.v(`Resolving variable values...`);let t=await X(u,await Z(u,l,{skipConditional:!0}),l);Object.assign(l,t),Object.keys(t).length>0&&(n.v(`Resolved ${Object.keys(t).length} variable(s)`),n.v(`Variable values: ${JSON.stringify(t)}`))}let d=r.prompts??[],f=[...d];if(f.length>0){let e=G(f);e.length>0&&(n.u(`❌ Prompt validation errors:`,`error`),e.forEach(e=>n.u(` - ${e}`,`error`)),a.default.exit(1)),n.v(`Resolving prompt default values...`);let t=await W(f,l);if(d.length>0){n.y(`📋 Collecting prompts (available to all tasks):`);let e=await U(d,t,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){n.v(`Re-resolving conditional variables with prompt values...`);let t=await X(e,await Z(e,l),l);Object.assign(l,t),Object.keys(t).length>0&&n.v(`Resolved ${Object.keys(t).length} conditional variable(s)`)}}if(!await n._(r.templateEnabled,l)){n.y(`⊘ Template is disabled after variable resolution - skipping all execution`);return}let p=[];for(let e of c)e.$templateEnabled!=null&&!await n._(e.$templateEnabled,l)||await n._(e.enabled,l)&&p.push(e);if(n.u(`${p.length} of ${c.length} task(s) enabled for execution`,`info`),r.dryRun){await j(p,l),n.y(`🔍 Dry run completed - no changes were made`),n.y(`Run without --dry-run to apply changes`);return}n.v(`Calling beforeAll hook...`),await R(`beforeAll`,l);let m=p.length,h=0,g=0,_=[],v=[];for(let e=0;e<p.length;e++){let t=p[e];t!=null&&(n.v(`Calling beforeTask hook for task: ${t.name}`),await R(`beforeTask`,t,l),await J(t,l,e+1,m,r.dryRun)?(h++,_.push(t.id),n.v(`Calling afterTask hook for task: ${t.name}`),await R(`afterTask`,t,l)):(await V(t.required,l)&&(g++,v.push(t.name)),n.v(`Calling onError hook for task: ${t.name}`),await R(`onError`,Error(`Task ${t.name} failed`),t),n.S(`⚠️ Task "${t.name}" failed, continuing with remaining tasks...`)))}g>0&&(n.u(`\n❌ Task execution completed with ${g} error(s)`,`error`),n.u(`Completed: ${h}/${m} tasks`,`info`),n.u(`Failed tasks: ${v.join(`, `)}`,`error`),a.default.exit(1)),n.v(`Calling afterAll hook...`),await R(`afterAll`,l),n.x(`✅ All tasks completed successfully!`),n.x(` Completed: ${h}/${m} tasks`)}async function xt(e,t,r={}){n.v(`Running templates with sequential variable/prompt resolution...`),n.v(`Total templates to process: ${e.length}`),n.v(`Registering built-in plugins...`),q();let i=[];console.log(``),n.y(`📋 Collecting input...`),console.log(``);for(let t=0;t<e.length;t++){let o=e[t];if(o==null)continue;let s=`=`.repeat(60);if(n.v(`\n${s}`),n.v(`Processing template ${t+1}/${e.length}: "${o.name}"`),n.v(s),n.v(`Current config keys: ${Object.keys(r).join(`, `)}`),!await n._(o.enabled,r)){n.y(`⊘ Template "${o.name}" is disabled - skipping`),n.v(` Enabled condition: ${JSON.stringify(o.enabled)}`);continue}let c=o.variables??[];if(c.length>0){n.v(`Processing ${c.length} variable(s) for template "${o.name}"...`);let e=$(c);e.length>0&&(n.u(`❌ Variable validation errors:`,`error`),e.forEach(e=>n.u(` - ${e}`,`error`)),a.default.exit(1));let t=await X(c,await Z(c,r,{skipConditional:!0}),r);Object.assign(r,t);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 X(i,await Z(i,r),r);if(s=Object.keys(e).length,Object.assign(r,e),s>0){n.v(`Resolved ${s} conditional variable(s)`);for(let[t,r]of Object.entries(e))n.v(` ${t} = ${JSON.stringify(r)}`)}}let l=Object.keys(t).length+s;if(l>0){n.v(`Total variables resolved for template: ${l}`);for(let[e,r]of Object.entries(t))n.v(` ${e} = ${JSON.stringify(r)}`)}}let l=o.prompts??[];if(l.length>0){n.v(`Processing ${l.length} prompt(s) for template "${o.name}"...`);let e=G(l);e.length>0&&(n.u(`❌ Prompt validation errors:`,`error`),e.forEach(e=>n.u(` - ${e}`,`error`)),a.default.exit(1));let t=await U(l,await W(l,r),r);Object.assign(r,t),n.v(`Collected ${Object.keys(t).length} prompt answer(s)`)}if(!await n._(o.enabled,r)){n.y(`⊘ Template "${o.name}" became disabled after variable/prompt resolution - skipping tasks`);continue}let u=o.tasks??[];u.length>0&&(n.v(`Found ${u.length} task(s) in template "${o.name}" (will execute later)`),i.push(...u))}if(n.v(`
|
|
24
|
+
🔧 Validating and filtering all collected tasks...`),i.length===0){n.u(`No tasks found in any template`,`info`);return}let o=_t(i);o.length>0&&(yt(o),a.default.exit(1)),console.log(``),n.u(`🛠️ Preparing tasks...`,`info`);let s=[];for(let e of i)await n._(e.enabled,r)&&s.push(e);if(console.log(``),n.u(`Found ${i.length} tasks (${s.length} enabled)`,`info`),n.u(`All tasks validated successfully`,`success`),s.length===0){n.u(`No enabled tasks to execute`,`info`);return}let c=Y(s);if(t.dryRun){n.u(`
|
|
25
|
+
🔍 Dry run - showing task changes...`,`info`),await j(c,r),n.u(`
|
|
26
|
+
🔍 Dry run completed - no changes were made`,`info`),n.u(`Run without --dry-run to apply changes`,`info`);return}console.log(``),n.y(`⚙️ Executing tasks...`),console.log(``),await R(`beforeAll`,r);let l=0,u=0,d=[];for(let e=0;e<c.length;e++){let i=c[e];i!=null&&(await R(`beforeTask`,i,r),await J(i,r,e+1,c.length,t.dryRun)?(l++,await R(`afterTask`,i,r)):(await V(i.required,r)&&(u++,d.push(i.name)),await R(`onError`,Error(`Task ${i.name} failed`),i),n.S(`⚠️ Task "${i.name}" failed, continuing with remaining tasks...`)))}await R(`afterAll`,r),u>0&&(n.u(`\n❌ Task execution completed with ${u} error(s)`,`error`),n.u(`Completed: ${l}/${c.length} tasks`,`info`),n.u(`Failed tasks: ${d.join(`, `)}`,`error`),a.default.exit(1)),n.u(`Completed: ${l}/${c.length} tasks`,`success`)}Object.defineProperty(exports,`A`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`B`,{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,`C`,{enumerable:!0,get:function(){return fe}}),Object.defineProperty(exports,`D`,{enumerable:!0,get:function(){return ge}}),Object.defineProperty(exports,`E`,{enumerable:!0,get:function(){return ue}}),Object.defineProperty(exports,`F`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`H`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`I`,{enumerable:!0,get:function(){return le}}),Object.defineProperty(exports,`L`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`M`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`N`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`O`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`P`,{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,`R`,{enumerable:!0,get:function(){return ie}}),Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`T`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`U`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`V`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`W`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return _e}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return Z}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return gt}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return G}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return pe}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return Q}}),Object.defineProperty(exports,`j`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`k`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return H}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return xt}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return U}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return $}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return Y}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return bt}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return z}}),Object.defineProperty(exports,`w`,{enumerable:!0,get:function(){return me}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return he}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return de}}),Object.defineProperty(exports,`z`,{enumerable:!0,get:function(){return ee}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./config-DfRbCqsT.js";import"./template-inheritance-bPw0ciBi.js";import{n as e,t}from"./run-tasks-Bj88BeF9.js";export{t as runTasks,e as runTemplatesSequentially};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require(`./config-DlJs75hK.cjs`),require(`./template-inheritance-CwBAv1Q9.cjs`);const e=require(`./run-tasks-Cgq9q7tb.cjs`);exports.runTasks=e.t,exports.runTemplatesSequentially=e.n;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require(`./chunk-DjWAcSYV.cjs`),t=require(`./template-inheritance-CwBAv1Q9.cjs`),n=require(`./run-tasks-Cgq9q7tb.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){try{let o=e||[];o.length===0&&(t.u(`⚠️ No tasks defined. Use --config to specify tasks or call runWithTasks() programmatically.`,`warn`),t.u(`Example: scaffoldfy --config ./tasks.json`,`info`),r.default.exit(1)),await n.t(o,{dryRun:i,force:a,tasksFilePath:void 0})}catch(e){t.u(`❌ Task execution failed`,`error`),e instanceof Error?(t.u(`Error: ${e.message}`,`error`),r.default.env.DEBUG!=null&&console.error(e.stack)):console.error(e),r.default.exit(1)}}async function s(e,o){try{await n.t(e,{dryRun:o?.dryRun??i,force:o?.force??a,tasksFilePath:o?.tasksFilePath??void 0,...o?.variables!=null&&{variables:o.variables},...o?.prompts!=null&&{prompts:o.prompts},...o?.templateEnabled!=null&&{templateEnabled:o.templateEnabled},...o?.transformers!=null&&{transformers:o.transformers}})}catch(e){t.u(`❌ Task execution failed`,`error`),e instanceof Error?(t.u(`Error: ${e.message}`,`error`),r.default.env.DEBUG!=null&&console.error(e.stack)):console.error(e),r.default.exit(1)}}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return o}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{u as e}from"./template-inheritance-bPw0ciBi.js";import{t}from"./run-tasks-Bj88BeF9.js";import n from"node:process";const r=n.argv.includes(`--dry-run`),i=n.argv.includes(`--force`);async function a(a){try{let o=a||[];o.length===0&&(e(`⚠️ No tasks defined. Use --config to specify tasks or call runWithTasks() programmatically.`,`warn`),e(`Example: scaffoldfy --config ./tasks.json`,`info`),n.exit(1)),await t(o,{dryRun:r,force:i,tasksFilePath:void 0})}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)}}async function o(a,o){try{await t(a,{dryRun:o?.dryRun??r,force:o?.force??i,tasksFilePath:o?.tasksFilePath??void 0,...o?.variables!=null&&{variables:o.variables},...o?.prompts!=null&&{prompts:o.prompts},...o?.templateEnabled!=null&&{templateEnabled:o.templateEnabled},...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{o as n,a as t};
|
|
@@ -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);let a=require(`node:readline`);a=e.t(a),require(`handlebars`);let o=require(`node:child_process`);o=e.t(o);let s=require(`node:os`);s=e.t(s);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 forTemplateInheritance(t,n){let r=Array.from(t);return new e(`Circular dependency detected: ${r.join(` -> `)} -> ${n}`,r,n)}static forTaskDependency(t){return new e(`Circular dependency detected involving task: ${t}`,[t])}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,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)}},d=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`)}},f=class e extends c{constructor(e,t){super(e,`TEMPLATE_FILE_NOT_FOUND`),this.filePath=t,this.name=`TemplateFileNotFoundError`}static forPath(t){return new e(`Template file not found: ${t}`,t)}},p=class e extends c{constructor(e,t,n){super(e,`TEMPLATE_FETCH_ERROR`),this.url=t,this.originalError=n,this.name=`TemplateFetchError`}static forUrl(t,n,r){return typeof n==`number`?new e(`Failed to fetch template from ${t}: ${n} ${r??``}`.trim(),t):new e(`Failed to fetch template from ${t}: ${n?.message??String(n??`Unknown error`)}`,t,n)}},m=class e extends c{constructor(e,t,n){super(e,`TEMPLATE_PARSE_ERROR`),this.filePath=t,this.originalError=n,this.name=`TemplateParseError`}static forFile(t,n){return new e(`Failed to parse template file ${t}: ${n.message}`,t,n)}},h=class e extends c{constructor(e,t){super(e,`INVALID_TEMPLATE`),this.filePath=t,this.name=`InvalidTemplateError`}static forFile(t,n){return new e(`Invalid template file ${t}: ${n}`,t)}static tasksNotArray(t){return new e(`Invalid template file ${t}: 'tasks' must be an array if provided`,t)}static missingName(t){return new e(`Invalid template file ${t}: 'name' field is required`,t)}static invalidNameFormat(t,n){return new e(`Invalid template file ${t}: 'name' field "${n}" must contain only lowercase letters, digits, and hyphens. It cannot start or end with a hyphen, and cannot contain consecutive hyphens.`,t)}};function g(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}function ee(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 te(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}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 ne(e){console.log(`${b.info}${y.info} ${e}${x}`)}function C(e){console.log(`${b.success}${y.success} ${e}${x}`)}function w(e){console.log(`${b.warn}${y.warn} ${e}${x}`)}function T(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 B(e.value,t,n?.lazy===!0?{lazy:!0}:void 0)}return!1}async function E(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-CRe7Fw3m.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-CRe7Fw3m.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 B(e.value,t,n?.lazy===!0?{lazy:!0}:void 0)}return!1}function D(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function O(e,t){if(D(e))return e;if(t==null||t===``)return n.default.isAbsolute(e)?e:n.default.resolve(r.default.cwd(),e);if(D(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)}function k(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 A(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 j(e){switch(e){case`node`:return`.js`;case`bash`:case`sh`:return`.sh`;case`pwsh`:case`powershell`:return`.ps1`;default:return`.js`}}function M(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}async function N(e,i){let a=z(e.file,i),c=e.args?.map(e=>z(e,i))??[],l={};if(e.parameters)for(let[t,n]of Object.entries(e.parameters))l[t]=z(n,i);let u=e.cwd!=null&&e.cwd!==``?n.default.join(r.default.cwd(),z(e.cwd,i)):r.default.cwd(),d,f,p=!1;if(M(a)){S(`Fetching remote script: ${a}`),f=await W(a),p=!0;let r=e.runtime??k(a)??`node`;!e.runtime&&!k(a)&&R(`Could not detect runtime from file extension, defaulting to 'node'`,`warn`);let i=s.default.tmpdir(),o=`scaffoldfy-exec-${Date.now()}${j(r)}`;d=n.default.join(i,o),t.default.writeFileSync(d,f,`utf-8`)}else{if(d=O(a,e.sourceUrl),!t.default.existsSync(d))throw Error(`Script file not found: ${d}`);S(`Using local script: ${d}`)}let m=e.runtime??k(d)??`node`;!e.runtime&&!k(d)&&R(`Could not detect runtime from file extension, defaulting to 'node'`,`warn`);try{let t=A(m,d),n=c.join(` `),i=n?`${t} ${n}`:t;S(`Executing: ${i}`);let a=(0,o.execSync)(i,{cwd:u,stdio:e.captureOutput?[`pipe`,`pipe`,`pipe`]:`inherit`,env:{...r.default.env,...l},encoding:e.captureOutput?`utf-8`:void 0});if(e.captureOutput)return S(`Script executed successfully with output`),typeof a==`string`?a:void 0;S(`Script executed successfully`);return}finally{if(p&&t.default.existsSync(d))try{t.default.unlinkSync(d)}catch(e){R(`Warning: Failed to clean up temporary file: ${e instanceof Error?e.message:String(e)}`,`warn`)}}}async function P(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){R(`${r} "${n}": conditional value requires context but none provided`,`warn`);return}if(typeof s.condition!=`string`){R(`${r} "${n}": conditional value must have a string condition`,`error`);return}try{let e=B(s.condition,i)?s.ifTrue:s.ifFalse;return typeof e==`object`&&e?await P(e,t):e}catch(e){R(`${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`){R(`${r} "${n}": exec value must have a string command`,`error`);return}try{return F((0,o.execSync)(e,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim())}catch(e){R(`${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`){R(`${r} "${n}": exec-file value must have a file path`,`error`);return}try{let t=await N({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:F(t.trim())}catch(e){R(`${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`){R(`${r} "${n}": interpolate value must be a string with {{variable}} placeholders`,`error`);return}if(!i)return R(`${r} "${n}": interpolate value requires context but none provided`,`warn`),e;try{return z(e,i)}catch(t){return R(`${r} "${n}": failed to interpolate value: ${t instanceof Error?t.message:`Unknown error`}`,`warn`),e}}if(s.type!==void 0){R(`${r} "${n}": unknown value type "${s.type}". Expected "static", "exec", "exec-file", "conditional", or "interpolate".`,`error`);return}return e}function F(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}async function I(e,t){let n=a.default.createInterface({input:r.default.stdin,output:r.default.stdout});return new Promise(r=>{let i;i=t==null?`${e}: `:`${e} (${t}): `,n.question(i,e=>{n.close(),r(e.trim()||(t??``))})})}async function L(e,t=!1){return I(`${e} (${t?`Y/n`:`y/N`})`,t?`y`:`n`).then(e=>e.toLowerCase()===`y`||e.toLowerCase()===`yes`)}function R(e,t=`info`){console.log(`${{info:`\x1B[36m`,success:`\x1B[32m`,error:`\x1B[31m`,warn:`\x1B[33m`}[t]}${{info:`ℹ`,success:`✓`,error:`✗`,warn:`⚠`}[t]} ${e}[0m`)}function z(e,t){return e.replace(/\{\{(?<key>[\w.]+)\}\}/gu,(e,n)=>te(t,n)?.toString()??``)}function B(e,t,n){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch(t){return n?.lazy===!0&&t instanceof ReferenceError?!0:(n?.silent!==!0&&(R(`Failed to evaluate condition: ${e}`,`warn`),t instanceof Error&&R(` Error: ${t.message}`,`warn`)),!1)}}const V=(0,i.promisify)(t.default.readFile),H={template:[[`template`,`templateFile`]]};function U(e){if(e==null||e===``)return`current template`;if(D(e))return e;let t=r.default.cwd();return e.startsWith(t)?n.default.relative(t,e):e}async function W(e){if(D(e))return G(e);if(!t.default.existsSync(e))throw f.forPath(e);return V(e,`utf-8`)}async function G(e){try{let t=await fetch(e);if(!t.ok)throw p.forUrl(e,t.status,t.statusText);return await t.text()}catch(t){throw t instanceof Error&&t.message.includes(`Failed to fetch`)?t:p.forUrl(e,t instanceof Error?t:void 0)}}const K=new Map;async function q(e,i=new Set){let a=D(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 l.forTemplateInheritance(i,o);i.add(o);let s;if(a)s=await G(o);else{if(!t.default.existsSync(o))throw f.forPath(o);s=await V(o,`utf-8`)}let c;try{c=JSON.parse(s)}catch(e){throw m.forFile(o,e instanceof Error?e:Error(String(e)))}if(c.name==null||c.name.trim()===``)throw h.missingName(o);if(!/^[a-z\d]+(?:-[a-z\d]+)*$/u.test(c.name))throw h.invalidNameFormat(o,c.name);if(c.tasks!==void 0&&!Array.isArray(c.tasks))throw h.tasksNotArray(o);c.tasks===void 0&&(c.tasks=[]);for(let e of c.tasks)e.$sourceUrl=o;if(c.variables!==void 0)for(let e of c.variables)e.$sourceUrl=o;if(c.prompts!==void 0)for(let e of c.prompts)e.$sourceUrl=o;return K.set(o,c),c}async function J(e,t,i,a,o){let s=D(e),c;if(c=s||n.default.isAbsolute(e)?e:t==null?n.default.resolve(r.default.cwd(),e):D(t)?new URL(e,t).href:n.default.resolve(t,e),i.has(c))return;if(a.has(c))throw l.forTemplateInheritance(a,c);a.add(c);let u=await q(c),d=D(c)?new URL(`.`,c).href:n.default.dirname(c);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(c),i.add(c),o.push(u)}async function Y(e,t,n=new Set){let r=[];return await J(e,t,n,new Set,r),g(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 u.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 u.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 u.forId(e.id,`prompt`,r.get(e.id));r.set(e.id,`prompt`)}}function re(e,t){if((t.override??`merge`)===`replace`){R(` → Variable "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}R(` → 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 Q(e,t){if((t.override??`merge`)===`replace`){R(` → Prompt "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}R(` → 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 Template`,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){R(`⊘ Skipping disabled template "${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 d.forPrompt(e.id);let t=Q(r.get(e.id),e);a.enabled!=null&&(t.$templateEnabled=a.enabled),r.set(e.id,t)}else{let t={...e};a.enabled!=null&&(t.$templateEnabled=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 d.forVariable(e.id);let t=re(n.get(e.id),e);a.enabled!=null&&(t.$templateEnabled=a.enabled),n.set(e.id,t)}else{let t={...e};a.enabled!=null&&(t.$templateEnabled=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 d.forTask(e.id,U(n.$sourceUrl),U(e.$sourceUrl))}let n=oe(t.get(e.id),e);a.enabled!=null&&(n.$templateEnabled=a.enabled),t.set(e.id,n)}else{let n={...e};a.enabled!=null&&(n.$templateEnabled=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 ie(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 ae(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 oe(e,t){if((t.override??`merge`)===`replace`){R(` → Task "${t.id}" using 'replace' strategy - completely replacing base task`,`info`),R(` Base: ${U(e.$sourceUrl)}`,`info`),R(` Override: ${U(t.$sourceUrl)}`,`info`);let{override:n,...r}=t;return r}R(` → Merging task "${t.id}"`,`info`),R(` Base: ${U(e.$sourceUrl)}`,`info`),R(` Override: ${U(t.$sourceUrl)}`,`info`);let n;if(typeof e.config==`object`&&e.config!==null&&typeof t.config==`object`&&t.config!==null){n=ae(e.config,t.config,t.type);let r=ie(t.type,n);r!==null&&r.length>0&&(R(` ⚠️ Warning: Conflicting config fields detected: ${r.join(`, `)}`,`warn`),R(` 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 se(){K.clear()}async function ce(e,t){if(S(`Loading tasks from ${e}...`),t?.sequential===!0){let t=await Y(e);return S(`Loaded ${t.length} template(s) for processing`),{tasks:[],templates:t}}let n=await X(e);R(`Loaded ${n.tasks?.length??0} task(s)`,`info`),n.extends!=null&&n.extends!==``&&R(`Extended from: ${(Array.isArray(n.extends)?n.extends:[n.extends]).join(`, `)}`,`info`),n.prompts!=null&&n.prompts.length>0&&R(`Found ${n.prompts.length} top-level prompt(s)`,`info`),n.variables!=null&&n.variables.length>0&&R(`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 ee}}),Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`T`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return ce}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return z}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return Y}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return $}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return se}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`w`,{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return ne}});
|
|
@@ -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 i from"node:readline";import"handlebars";import{execSync as a}from"node:child_process";import o from"node:os";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 forTemplateInheritance(t,n){let r=Array.from(t);return new e(`Circular dependency detected: ${r.join(` -> `)} -> ${n}`,r,n)}static forTaskDependency(t){return new e(`Circular dependency detected involving task: ${t}`,[t])}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,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)}},u=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`)}},d=class e extends s{constructor(e,t){super(e,`TEMPLATE_FILE_NOT_FOUND`),this.filePath=t,this.name=`TemplateFileNotFoundError`}static forPath(t){return new e(`Template file not found: ${t}`,t)}},f=class e extends s{constructor(e,t,n){super(e,`TEMPLATE_FETCH_ERROR`),this.url=t,this.originalError=n,this.name=`TemplateFetchError`}static forUrl(t,n,r){return typeof n==`number`?new e(`Failed to fetch template from ${t}: ${n} ${r??``}`.trim(),t):new e(`Failed to fetch template from ${t}: ${n?.message??String(n??`Unknown error`)}`,t,n)}},p=class e extends s{constructor(e,t,n){super(e,`TEMPLATE_PARSE_ERROR`),this.filePath=t,this.originalError=n,this.name=`TemplateParseError`}static forFile(t,n){return new e(`Failed to parse template file ${t}: ${n.message}`,t,n)}},m=class e extends s{constructor(e,t){super(e,`INVALID_TEMPLATE`),this.filePath=t,this.name=`InvalidTemplateError`}static forFile(t,n){return new e(`Invalid template file ${t}: ${n}`,t)}static tasksNotArray(t){return new e(`Invalid template file ${t}: 'tasks' must be an array if provided`,t)}static missingName(t){return new e(`Invalid template file ${t}: 'name' field is required`,t)}static invalidNameFormat(t,n){return new e(`Invalid template file ${t}: 'name' field "${n}" must contain only lowercase letters, digits, and hyphens. It cannot start or end with a hyphen, and cannot contain consecutive hyphens.`,t)}};function 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}function h(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 g(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}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,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 V(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-Bj8gkhe3.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-Bj8gkhe3.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 V(e.value,t,n?.lazy===!0?{lazy:!0}:void 0)}return!1}function O(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function k(t,r){if(O(t))return t;if(r==null||r===``)return e.isAbsolute(t)?t:e.resolve(n.cwd(),t);if(O(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)}function A(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 j(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 M(e){switch(e){case`node`:return`.js`;case`bash`:case`sh`:return`.sh`;case`pwsh`:case`powershell`:return`.ps1`;default:return`.js`}}function N(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}async function P(r,i){let s=B(r.file,i),c=r.args?.map(e=>B(e,i))??[],l={};if(r.parameters)for(let[e,t]of Object.entries(r.parameters))l[e]=B(t,i);let u=r.cwd!=null&&r.cwd!==``?e.join(n.cwd(),B(r.cwd,i)):n.cwd(),d,f,p=!1;if(N(s)){S(`Fetching remote script: ${s}`),f=await G(s),p=!0;let n=r.runtime??A(s)??`node`;!r.runtime&&!A(s)&&z(`Could not detect runtime from file extension, defaulting to 'node'`,`warn`);let i=o.tmpdir(),a=`scaffoldfy-exec-${Date.now()}${M(n)}`;d=e.join(i,a),t.writeFileSync(d,f,`utf-8`)}else{if(d=k(s,r.sourceUrl),!t.existsSync(d))throw Error(`Script file not found: ${d}`);S(`Using local script: ${d}`)}let m=r.runtime??A(d)??`node`;!r.runtime&&!A(d)&&z(`Could not detect runtime from file extension, defaulting to 'node'`,`warn`);try{let e=j(m,d),t=c.join(` `),i=t?`${e} ${t}`:e;S(`Executing: ${i}`);let o=a(i,{cwd:u,stdio:r.captureOutput?[`pipe`,`pipe`,`pipe`]:`inherit`,env:{...n.env,...l},encoding:r.captureOutput?`utf-8`:void 0});if(r.captureOutput)return S(`Script executed successfully with output`),typeof o==`string`?o:void 0;S(`Script executed successfully`);return}finally{if(p&&t.existsSync(d))try{t.unlinkSync(d)}catch(e){z(`Warning: Failed to clean up temporary file: ${e instanceof Error?e.message:String(e)}`,`warn`)}}}async function F(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){z(`${r} "${n}": conditional value requires context but none provided`,`warn`);return}if(typeof s.condition!=`string`){z(`${r} "${n}": conditional value must have a string condition`,`error`);return}try{let e=V(s.condition,i)?s.ifTrue:s.ifFalse;return typeof e==`object`&&e?await F(e,t):e}catch(e){z(`${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`){z(`${r} "${n}": exec value must have a string command`,`error`);return}try{return I(a(e,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim())}catch(e){z(`${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`){z(`${r} "${n}": exec-file value must have a file path`,`error`);return}try{let t=await P({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:I(t.trim())}catch(e){z(`${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`){z(`${r} "${n}": interpolate value must be a string with {{variable}} placeholders`,`error`);return}if(!i)return z(`${r} "${n}": interpolate value requires context but none provided`,`warn`),e;try{return B(e,i)}catch(t){return z(`${r} "${n}": failed to interpolate value: ${t instanceof Error?t.message:`Unknown error`}`,`warn`),e}}if(s.type!==void 0){z(`${r} "${n}": unknown value type "${s.type}". Expected "static", "exec", "exec-file", "conditional", or "interpolate".`,`error`);return}return e}function I(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}async function L(e,t){let r=i.createInterface({input:n.stdin,output:n.stdout});return new Promise(n=>{let i;i=t==null?`${e}: `:`${e} (${t}): `,r.question(i,e=>{r.close(),n(e.trim()||(t??``))})})}async function R(e,t=!1){return L(`${e} (${t?`Y/n`:`y/N`})`,t?`y`:`n`).then(e=>e.toLowerCase()===`y`||e.toLowerCase()===`yes`)}function z(e,t=`info`){console.log(`${{info:`\x1B[36m`,success:`\x1B[32m`,error:`\x1B[31m`,warn:`\x1B[33m`}[t]}${{info:`ℹ`,success:`✓`,error:`✗`,warn:`⚠`}[t]} ${e}[0m`)}function B(e,t){return e.replace(/\{\{(?<key>[\w.]+)\}\}/gu,(e,n)=>g(t,n)?.toString()??``)}function V(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&&(z(`Failed to evaluate condition: ${e}`,`warn`),t instanceof Error&&z(` Error: ${t.message}`,`warn`)),!1)}}const H=r(t.readFile),U={template:[[`template`,`templateFile`]]};function W(t){if(t==null||t===``)return`current template`;if(O(t))return t;let r=n.cwd();return t.startsWith(r)?e.relative(r,t):t}async function G(e){if(O(e))return K(e);if(!t.existsSync(e))throw d.forPath(e);return H(e,`utf-8`)}async function K(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 q=new Map;async function J(r,i=new Set){let a=O(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 c.forTemplateInheritance(i,o);i.add(o);let s;if(a)s=await K(o);else{if(!t.existsSync(o))throw d.forPath(o);s=await H(o,`utf-8`)}let l;try{l=JSON.parse(s)}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 q.set(o,l),l}async function Y(t,r,i,a,o){let s=O(t),l;if(l=s||e.isAbsolute(t)?t:r==null?e.resolve(n.cwd(),t):O(r)?new URL(t,r).href:e.resolve(r,t),i.has(l))return;if(a.has(l))throw c.forTemplateInheritance(a,l);a.add(l);let u=await J(l),d=O(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),ee(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 l.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 l.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 l.forId(e.id,`prompt`,r.get(e.id));r.set(e.id,`prompt`)}}function te(e,t){if((t.override??`merge`)===`replace`){z(` → Variable "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}z(` → 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 ne(e,t){if((t.override??`merge`)===`replace`){z(` → Prompt "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}z(` → 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 Template`,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){z(`⊘ Skipping disabled template "${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 u.forPrompt(e.id);let t=ne(r.get(e.id),e);a.enabled!=null&&(t.$templateEnabled=a.enabled),r.set(e.id,t)}else{let t={...e};a.enabled!=null&&(t.$templateEnabled=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 u.forVariable(e.id);let t=te(n.get(e.id),e);a.enabled!=null&&(t.$templateEnabled=a.enabled),n.set(e.id,t)}else{let t={...e};a.enabled!=null&&(t.$templateEnabled=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 u.forTask(e.id,W(n.$sourceUrl),W(e.$sourceUrl))}let n=ae(t.get(e.id),e);a.enabled!=null&&(n.$templateEnabled=a.enabled),t.set(e.id,n)}else{let n={...e};a.enabled!=null&&(n.$templateEnabled=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 re(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 ie(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 ae(e,t){if((t.override??`merge`)===`replace`){z(` → Task "${t.id}" using 'replace' strategy - completely replacing base task`,`info`),z(` Base: ${W(e.$sourceUrl)}`,`info`),z(` Override: ${W(t.$sourceUrl)}`,`info`);let{override:n,...r}=t;return r}z(` → Merging task "${t.id}"`,`info`),z(` Base: ${W(e.$sourceUrl)}`,`info`),z(` Override: ${W(t.$sourceUrl)}`,`info`);let n;if(typeof e.config==`object`&&e.config!==null&&typeof t.config==`object`&&t.config!==null){n=ie(e.config,t.config,t.type);let r=re(t.type,n);r!==null&&r.length>0&&(z(` ⚠️ Warning: Conflicting config fields detected: ${r.join(`, `)}`,`warn`),z(` 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 oe(){q.clear()}async function se(e,t){if(S(`Loading tasks from ${e}...`),t?.sequential===!0){let t=await X(e);return S(`Loaded ${t.length} template(s) for processing`),{tasks:[],templates:t}}let n=await Z(e);z(`Loaded ${n.tasks?.length??0} task(s)`,`info`),n.extends!=null&&n.extends!==``&&z(`Extended from: ${(Array.isArray(n.extends)?n.extends:[n.extends]).join(`, `)}`,`info`),n.prompts!=null&&n.prompts.length>0&&z(`Found ${n.prompts.length} top-level prompt(s)`,`info`),n.variables!=null&&n.variables.length>0&&z(`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{h as C,T as S,s as T,D as _,J as a,v as b,V as c,L as d,R as f,E as g,k as h,se as i,B as l,P as m,G as n,X as o,F as p,Z as r,$ as s,oe as t,z as u,S as v,c as w,w as x,C as y};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{S as e,_ as t,c as n,d as r,f as i,g as a,l as o,p as s,u as c,v as l,x as u,y as d}from"./template-inheritance-bPw0ciBi.js";export{l as debug,n as evaluateCondition,a as evaluateEnabled,t as evaluateEnabledAsync,o as interpolateTemplate,c as log,d as logInfo,u as logSuccess,e as logWarn,r as prompt,i as promptYesNo,s as resolveValue};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require(`./template-inheritance-CwBAv1Q9.cjs`);exports.debug=e.v,exports.evaluateCondition=e.c,exports.evaluateEnabled=e.g,exports.evaluateEnabledAsync=e._,exports.interpolateTemplate=e.l,exports.log=e.u,exports.logInfo=e.y,exports.logSuccess=e.x,exports.logWarn=e.S,exports.prompt=e.d,exports.promptYesNo=e.f,exports.resolveValue=e.p;
|
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.36.0",
|
|
5
5
|
"author": "PixPilot <m.doaie@hotmail.com>",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
@@ -49,10 +49,10 @@
|
|
|
49
49
|
"tsdown": "^0.15.10",
|
|
50
50
|
"typescript": "^5.9.3",
|
|
51
51
|
"@internal/eslint-config": "0.3.0",
|
|
52
|
-
"@internal/prettier-config": "0.0.1",
|
|
53
|
-
"@internal/vitest-config": "0.1.0",
|
|
54
52
|
"@internal/tsconfig": "0.1.0",
|
|
55
|
-
"@internal/
|
|
53
|
+
"@internal/prettier-config": "0.0.1",
|
|
54
|
+
"@internal/tsdown-config": "0.1.0",
|
|
55
|
+
"@internal/vitest-config": "0.1.0"
|
|
56
56
|
},
|
|
57
57
|
"prettier": "@internal/prettier-config",
|
|
58
58
|
"scripts": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
require(`./config-DlJs75hK.cjs`),require(`./utils-Bz23aLK_.cjs`);const e=require(`./run-tasks-BnqvtWj4.cjs`);exports.runTasks=e.t,exports.runTemplatesSequentially=e.n;
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
const e=require(`./chunk-DjWAcSYV.cjs`),t=require(`./config-DlJs75hK.cjs`),n=require(`./utils-Bz23aLK_.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);let u=require(`node:os`);u=e.t(u);var d=class e extends n.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)}},f=class e extends n.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`)}},p=class e extends n.S{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)}},m=class e extends n.S{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`)}},h=class e extends n.S{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`)}},g=class e extends n.S{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 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 r=new Map,i=new Map,a=new Map;for(let t of e)if(r.set(t.name,t),a.set(t.name,new Set),t.dependencies!=null&&t.dependencies.length>0)for(let e of t.dependencies)a.get(t.name).add(e),i.has(e)||i.set(e,new Set),i.get(e).add(t.name);let o=new Set,s=new Map;for(let t=0;t<e.length;t++){let n=e[t],r=a.get(n.name).size>0,c=i.has(n.name)&&i.get(n.name).size>0;!r&&!c&&(o.add(n.name),s.set(n.name,t))}let c=e.filter(e=>!o.has(e.name)),l=[],u=new Set,d=new Set;function f(e){if(u.has(e))return;if(d.has(e))throw n.x.forTemplateDependencies(Array.from(d),e);d.add(e);let t=r.get(e);if(t!=null){let t=a.get(e);if(t!=null&&t.size>0)for(let e of t)f(e)}d.delete(e),u.add(e),t!=null&&!o.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];o.has(n.name)?p.push(n):m<l.length&&(p.push(l[m]),m++)}return p}const _=(0,o.promisify)(r.default.readFile),te={template:[[`template`,`templateFile`]]};function v(e){if(e==null||e===``)return`current template`;if(y(e))return e;let t=a.default.cwd();return e.startsWith(t)?i.default.relative(t,e):e}function y(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function ne(e,t){if(y(e))return e;if(t==null||t===``)return i.default.isAbsolute(e)?e:i.default.resolve(a.default.cwd(),e);if(y(t))try{let n=new URL(`.`,t);return new URL(e,n).href}catch{throw n.b.forRemoteTemplate(e,t)}let r=i.default.dirname(t);return i.default.isAbsolute(e)?e:i.default.resolve(r,e)}async function re(e){if(y(e))return ie(e);if(!r.default.existsSync(e))throw n.v.forPath(e);return _(e,`utf-8`)}async function ie(e){try{let t=await fetch(e);if(!t.ok)throw n._.forUrl(e,t.status,t.statusText);return await t.text()}catch(t){throw t instanceof Error&&t.message.includes(`Failed to fetch`)?t:n._.forUrl(e,t instanceof Error?t:void 0)}}const b=new Map;async function ae(e,t=new Set){let o=y(e),s;if(s=o||i.default.isAbsolute(e)?e:i.default.resolve(a.default.cwd(),e),b.has(s))return b.get(s);if(t.has(s))throw n.x.forTemplateInheritance(t,s);t.add(s);let c;if(o)c=await ie(s);else{if(!r.default.existsSync(s))throw n.v.forPath(s);c=await _(s,`utf-8`)}let l;try{l=JSON.parse(c)}catch(e){throw n.y.forFile(s,e instanceof Error?e:Error(String(e)))}if(l.name==null||l.name.trim()===``)throw n.g.missingName(s);if(!/^[a-z\d]+(?:-[a-z\d]+)*$/u.test(l.name))throw n.g.invalidNameFormat(s,l.name);if(l.tasks!==void 0&&!Array.isArray(l.tasks))throw n.g.tasksNotArray(s);l.tasks===void 0&&(l.tasks=[]);for(let e of l.tasks)e.$sourceUrl=s;return b.set(s,l),l}async function oe(e,t,r,o,s){let c=y(e),l;if(l=c||i.default.isAbsolute(e)?e:t==null?i.default.resolve(a.default.cwd(),e):y(t)?new URL(e,t).href:i.default.resolve(t,e),r.has(l))return;if(o.has(l))throw n.x.forTemplateInheritance(o,l);o.add(l);let u=await ae(l),d=y(l)?new URL(`.`,l).href:i.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 oe(t,d,r,o,s)}o.delete(l),r.add(l),s.push(u)}async function x(e,t,n=new Set){let r=[];return await oe(e,t,n,new Set,r),ee(r)}async function se(e,t,n=new Set){return de(await x(e,t,n))}function ce(e,t,n){let r=new Map;for(let t of e){if(r.has(t.id))throw d.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 d.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 d.forId(e.id,`prompt`,r.get(e.id));r.set(e.id,`prompt`)}}function le(e,t){if((t.override??`merge`)===`replace`){n.a(` → Variable "${t.id}" using 'replace' strategy`,`info`);let{override:e,...r}=t;return r}n.a(` → Variable "${t.id}" merged (value replaced)`,`info`);let r={...e,...t};return delete r.override,r}function ue(e,t){if((t.override??`merge`)===`replace`){n.a(` → Prompt "${t.id}" using 'replace' strategy`,`info`);let{override:e,...r}=t;return r}n.a(` → Prompt "${t.id}" merged`,`info`);let r={...e,...t};return delete r.override,r}function de(e){if(e.length===0)return{name:`Empty Template`,tasks:[]};if(e.length===1){let t=e[0];return ce(t.tasks??[],t.variables,t.prompts),t}let t=new Map,r=new Map,i=new Map,a={};for(let o of e){if(o.enabled!=null&&(a[o.name]=o.enabled),o.enabled===!1){n.a(`⊘ Skipping disabled template "${o.name}" - its tasks, prompts, and variables will not be included`,`info`);continue}if(o.prompts!=null)for(let e of o.prompts)if(i.has(e.id)){if(e.override==null)throw f.forPrompt(e.id);let t=ue(i.get(e.id),e);o.enabled!=null&&(t.$templateEnabled=o.enabled),i.set(e.id,t)}else{let t={...e};o.enabled!=null&&(t.$templateEnabled=o.enabled),i.set(e.id,t)}if(o.variables!=null)for(let e of o.variables)if(r.has(e.id)){if(e.override==null)throw f.forVariable(e.id);let t=le(r.get(e.id),e);o.enabled!=null&&(t.$templateEnabled=o.enabled),r.set(e.id,t)}else{let t={...e};o.enabled!=null&&(t.$templateEnabled=o.enabled),r.set(e.id,t)}for(let e of o.tasks??[])if(t.has(e.id)){if(e.override==null){let n=t.get(e.id);throw f.forTask(e.id,v(n.$sourceUrl),v(e.$sourceUrl))}let n=me(t.get(e.id),e);o.enabled!=null&&(n.$templateEnabled=o.enabled),t.set(e.id,n)}else{let n={...e};o.enabled!=null&&(n.$templateEnabled=o.enabled),t.set(e.id,n)}}let o=Array.from(t.values()),s=i.size>0?Array.from(i.values()):void 0,c=r.size>0?Array.from(r.values()):void 0;ce(o,c,s);let l=e[e.length-1],u={name:l.name,tasks:o};return l.description!=null&&(u.description=l.description),l.dependencies!=null&&(u.dependencies=l.dependencies),l.enabled!=null&&(u.enabled=l.enabled),s!=null&&(u.prompts=s),c!=null&&(u.variables=c),u}function fe(e,t){let n=te[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=te[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`){n.a(` → Task "${t.id}" using 'replace' strategy - completely replacing base task`,`info`),n.a(` Base: ${v(e.$sourceUrl)}`,`info`),n.a(` Override: ${v(t.$sourceUrl)}`,`info`);let{override:r,...i}=t;return i}n.a(` → Merging task "${t.id}"`,`info`),n.a(` Base: ${v(e.$sourceUrl)}`,`info`),n.a(` Override: ${v(t.$sourceUrl)}`,`info`);let r;if(typeof e.config==`object`&&e.config!==null&&typeof t.config==`object`&&t.config!==null){r=pe(e.config,t.config,t.type);let i=fe(t.type,r);i!==null&&i.length>0&&(n.a(` ⚠️ Warning: Conflicting config fields detected: ${i.join(`, `)}`,`warn`),n.a(` Please use override: "replace" or specify only one of these fields`,`warn`))}else r=t.config??e.config;let i=[...e.dependencies??[],...t.dependencies??[]],a=i.length>0?[...new Set(i)]:void 0,o=t.$sourceUrl??e.$sourceUrl,s={...e,...t,config:r,...a!=null&&{dependencies:a},...o!=null&&{$sourceUrl:o}};return delete s.override,s}function he(){b.clear()}async function ge(e,t){if(n.d(`Loading tasks from ${e}...`),t?.sequential===!0){let t=await x(e);return n.d(`Loaded ${t.length} template(s) for processing`),{tasks:[],templates:t}}let r=await se(e);n.a(`Loaded ${r.tasks?.length??0} task(s)`,`info`),r.extends!=null&&r.extends!==``&&n.a(`Extended from: ${(Array.isArray(r.extends)?r.extends:[r.extends]).join(`, `)}`,`info`),r.prompts!=null&&r.prompts.length>0&&n.a(`Found ${r.prompts.length} top-level prompt(s)`,`info`),r.variables!=null&&r.variables.length>0&&n.a(`Found ${r.variables.length} top-level variable(s)`,`info`);let i={tasks:r.tasks??[]};return r.prompts!=null&&(i.prompts=r.prompts),r.variables!=null&&(i.variables=r.variables),r.enabled!=null&&(i.enabled=r.enabled),r.transformers!=null&&(i.transformers=r.transformers),i}function S(e){return e.template!=null&&e.template!==``}function C(e){return e.templateFile!=null&&e.templateFile!==``}function _e(e){return e.endsWith(`.hbs`)}function w(e){let t=S(e),n=C(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 T(e,t,r,i={}){let{enableHandlebars:a=!0,sourceUrl:o=r?.$sourceUrl}=i,s=S(e),c=C(e);if(s)return n.i(e.template,t);if(c){let r=e.templateFile,i=a&&_e(r),s=await re(ne(r,o));return i?(await import(`handlebars`)).default.compile(s)(t):n.i(s,t)}throw Error(`No template content available`)}function ve(e){return S(e)?`inline template`:C(e)?`template file: ${e.templateFile}`:`no template source`}const E=(0,o.promisify)(r.default.readFile),ye=2,be=10,xe=55,D={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function O(e,t){switch(t){case`add`:return`${D.green}+ ${e}${D.reset}`;case`remove`:return`${D.red}- ${e}${D.reset}`;case`context`:return`${D.gray} ${e}${D.reset}`;default:return e}}function k(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(O(t,`context`)):(t!==void 0&&i.push(O(t,`remove`)),a!==void 0&&i.push(O(a,`add`)))}return i}async function Se(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let o=i.default.join(a.default.cwd(),e.file);if(!r.default.existsSync(o))return`${D.red}✗ File not found: ${e.file}${D.reset}`;try{let r=await E(o,`utf-8`),i=JSON.parse(r),a={...i};function s(e){if(typeof e==`string`)return n.i(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[t,r]of Object.entries(e.updates)){let e=s(r);t.includes(`.`)?n.c(i,t,e):i[t]=e}let c=JSON.stringify(a,null,2),l=JSON.stringify(i,null,2);if(c===l)return`${D.cyan}→ No changes${D.reset}`;let u=k(c,l);return`${D.blue}File: ${e.file}${D.reset}\n${u.join(`
|
|
4
|
-
`)}`}catch(e){return`${D.red}✗ Error: ${e instanceof Error?e.message:String(e)}${D.reset}`}}async function Ce(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;if(e.template==null||e.template===``)return`${D.red}✗ No template content provided for file: ${e.file}${D.reset}`;let o=i.default.join(a.default.cwd(),e.file),s=n.i(e.template,t);if(!r.default.existsSync(o)){let t=s.split(`
|
|
5
|
-
`).slice(0,10).join(`
|
|
6
|
-
`),n=s.split(`
|
|
7
|
-
`).length>10;return`${D.blue}File: ${e.file}${D.reset}\n${D.green}+ New file would be created${D.reset}\n${D.gray}Content preview:${D.reset}\n${t}${n?`
|
|
8
|
-
...`:``}`}try{let t=await E(o,`utf-8`);if(t===s)return`${D.cyan}→ No changes${D.reset}`;let n=k(t,s);return`${D.blue}File: ${e.file}${D.reset}\n${n.join(`
|
|
9
|
-
`)}`}catch(e){return`${D.red}✗ Error: ${e instanceof Error?e.message:String(e)}${D.reset}`}}async function we(e,t,o){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let s=i.default.join(a.default.cwd(),e.file);if(r.default.existsSync(s))return`${D.cyan}→ File already exists, would be skipped: ${e.file}${D.reset}`;try{if(S(e)){let n=await T(e,t,o),r=n.split(`
|
|
10
|
-
`).slice(0,10).join(`
|
|
11
|
-
`),i=n.split(`
|
|
12
|
-
`).length>10;return`${D.blue}File: ${e.file}${D.reset}\n${D.green}+ New file would be created${D.reset}\n${D.gray}Content preview:${D.reset}\n${r}${i?`
|
|
13
|
-
...`:``}`}let n=ve(e);return`${D.blue}File: ${e.file}${D.reset}\n${D.green}+ New file would be created from ${n}${D.reset}`}catch(e){return`${D.red}✗ Error: ${e instanceof Error?e.message:String(e)}${D.reset}`}}async function Te(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let o=i.default.join(a.default.cwd(),e.file);if(!r.default.existsSync(o))return`${D.red}✗ File not found: ${e.file}${D.reset}`;try{let r=await E(o,`utf-8`),i=new RegExp(e.pattern,e.flags??`g`),a=n.i(e.replacement,t),s=r.replace(i,a);if(r===s)return`${D.cyan}→ No matches found${D.reset}`;let c=k(r,s);return`${D.blue}File: ${e.file}${D.reset}\n${c.join(`
|
|
14
|
-
`)}`}catch(e){return`${D.red}✗ Error: ${e instanceof Error?e.message:String(e)}${D.reset}`}}async function Ee(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let o=i.default.join(a.default.cwd(),e.file);if(!r.default.existsSync(o))return`${D.red}✗ File not found: ${e.file}${D.reset}`;try{let r=await E(o,`utf-8`),i=r;for(let{find:i,replace:a}of e.replacements){let e=n.i(i,t),o=n.i(a,t);r=r.replace(e,o)}if(i===r)return`${D.cyan}→ No changes${D.reset}`;let a=k(i,r);return`${D.blue}File: ${e.file}${D.reset}\n${a.join(`
|
|
15
|
-
`)}`}catch(e){return`${D.red}✗ Error: ${e instanceof Error?e.message:String(e)}${D.reset}`}}function De(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let o=e.paths.map(e=>n.i(e,t)).filter(e=>r.default.existsSync(i.default.join(a.default.cwd(),e)));return o.length===0?`${D.cyan}→ No files/directories to delete${D.reset}`:`${D.red}Would delete:${D.reset}\n${o.map(e=>`${D.red} - ${e}${D.reset}`).join(`
|
|
16
|
-
`)}`}function Oe(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let o=n.i(e.from,t),s=n.i(e.to,t),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)?`${D.yellow}⚠ Destination already exists: ${s}${D.reset}\n${D.cyan}Would rename: ${o} → ${s}${D.reset}`:`${D.cyan}Would rename: ${o} → ${s}${D.reset}`:`${D.red}✗ Source not found: ${o}${D.reset}`}function ke(e){if(e.condition!=null&&e.condition!==``)return`${D.yellow}⊘ Condition check skipped in dry-run${D.reset}`;let t=i.default.join(a.default.cwd(),`.git`),n=r.default.existsSync(t),o=[];if(e.removeExisting&&n&&o.push(`${D.red}Would remove existing .git directory${D.reset}`),o.push(`${D.green}Would initialize git repository${D.reset}`),e.initialCommit){let t=e.message??`Initial commit`;o.push(`${D.green}Would create initial commit: "${t}"${D.reset}`)}return o.join(`
|
|
17
|
-
`)}function A(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let r=n.i(e.command,t),i=e.cwd==null?a.default.cwd():n.i(e.cwd,t);return`${D.yellow}Would execute:${D.reset}\n${D.cyan} Command: ${r}${D.reset}\n${D.cyan} Working directory: ${i}${D.reset}`}function Ae(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let o=n.i(e.from,t),s=n.i(e.to,t),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)?`${D.yellow}⚠ Destination already exists: ${s}${D.reset}\n${D.cyan}Would move: ${o} → ${s}${D.reset}`:`${D.cyan}Would move: ${o} → ${s}${D.reset}`:`${D.red}✗ Source not found: ${o}${D.reset}`}function je(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let o=n.i(e.from,t),s=n.i(e.to,t),c=i.default.join(a.default.cwd(),o),l=i.default.join(a.default.cwd(),s);if(!r.default.existsSync(c))return`${D.red}✗ Source not found: ${o}${D.reset}`;let u=r.default.statSync(c).isDirectory()?`directory`:`file`;return r.default.existsSync(l)?`${D.yellow}⚠ Destination already exists: ${s}${D.reset}\n${D.cyan}Would copy ${u}: ${o} → ${s}${D.reset}`:`${D.cyan}Would copy ${u}: ${o} → ${s}${D.reset}`}async function Me(e,t,o){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${D.yellow}⊘ Condition not met - task would be skipped${D.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 n=await T(c,t,o),i=n.split(`
|
|
18
|
-
`).slice(0,10).join(`
|
|
19
|
-
`),a=n.split(`
|
|
20
|
-
`).length>10;return r.default.existsSync(s)?`${D.blue}File: ${e.file}${D.reset}\n${D.green}+ Would append content${D.reset}\n${D.gray}Content preview:${D.reset}\n${i}${a?`
|
|
21
|
-
...`:``}`:`${D.blue}File: ${e.file}${D.reset}\n${D.green}+ New file would be created with content${D.reset}\n${D.gray}Content preview:${D.reset}\n${i}${a?`
|
|
22
|
-
...`:``}`}catch(e){return`${D.red}✗ Error: ${e instanceof Error?e.message:String(e)}${D.reset}`}}function Ne(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t))return`${D.yellow}⊘ Condition not met - task would be skipped${D.reset}`;let o=n.i(e.path,t),s=i.default.join(a.default.cwd(),o);return r.default.existsSync(s)?`${D.cyan}→ Directory already exists: ${o}${D.reset}`:`${D.green}+ Would create directory: ${o}${D.reset}`}async function Pe(e,t){try{switch(e.type){case`update-json`:return await Se(e.config,t);case`write`:return await Ce(e.config,t);case`create`:return await we(e.config,t,e);case`regex-replace`:return await Te(e.config,t);case`replace-in-file`:return await Ee(e.config,t);case`delete`:return De(e.config,t);case`rename`:return Oe(e.config,t);case`move`:return Ae(e.config,t);case`copy`:return je(e.config,t);case`append`:return await Me(e.config,t,e);case`mkdir`:return Ne(e.config,t);case`git-init`:return ke(e.config);case`exec`:return A(e.config,t);case`exec-file`:return A(e.config,t);default:{let t=e.type;return`${D.yellow}⚠ Diff not available for task type: ${t}${D.reset}`}}}catch(e){return`${D.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${D.reset}`}}async function j(e,t){console.log(`${D.blue}═══════════════════════════════════════════════════════${D.reset}`),console.log(`${D.blue} DRY RUN - Preview of changes${D.reset}`),console.log(`${D.blue}═══════════════════════════════════════════════════════${D.reset}`);for(let n of e){console.log(`${D.cyan}▶ Task: ${n.name}${D.reset}`),n.description!=null&&n.description!==``&&console.log(`${D.gray} ${n.description}${D.reset}`);let e=await Pe(n,t);console.log(e),console.log(`${D.gray}${`─`.repeat(55)}${D.reset}`)}console.log(`${D.blue}═══════════════════════════════════════════════════════${D.reset}`),console.log(`${D.yellow} No changes were applied (dry-run mode)${D.reset}`),console.log(`${D.blue}═══════════════════════════════════════════════════════${D.reset}`)}const M=new Map,N={},P=new Map;function F(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(M.has(e.name))throw TypeError(`Plugin ${e.name} is already registered`);for(let t of e.taskTypes)if(P.has(t)){let e=P.get(t);throw TypeError(`Task type "${t}" is already registered by plugin "${e}"`)}M.set(e.name,e);for(let t of e.taskTypes)P.set(t,e.name);n.d(`Registered plugin: ${e.name}${e.version==null?``:` v${e.version}`}`)}function Fe(e){let t=M.get(e);if(t!=null){for(let e of t.taskTypes)P.delete(e);M.delete(e)}}function Ie(e){return M.get(e)}function I(e){let t=P.get(e);if(t!=null)return M.get(t)}function L(e){return P.has(e)}function Le(){return Array.from(M.keys())}function Re(){M.clear(),P.clear()}function ze(e){e.beforeAll!=null&&(N.beforeAll=e.beforeAll),e.afterAll!=null&&(N.afterAll=e.afterAll),e.beforeTask!=null&&(N.beforeTask=e.beforeTask),e.afterTask!=null&&(N.afterTask=e.afterTask),e.onError!=null&&(N.onError=e.onError)}async function R(e,...t){let r=N[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.a(`Error in ${e} hook: ${t instanceof Error?t.message:String(t)}`,`error`)}}async function Be(e,t,n){let r=I(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}async function Ve(e,t){let n=I(e.type);if(!(n==null||n.getDiff==null))return n.getDiff(e,t)}function He(e){let t=I(e.type);return t==null?[`No plugin found for task type: ${e.type}`]:t.validate==null?[]:t.validate(e)}function Ue(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 We=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.a(`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 g.notFound(e);try{return await this.executeTransformer(r,t,n)}catch(t){throw t instanceof g?t:g.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 g.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 g.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 g.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 g.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 g.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 We;function Ge(e,t){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch{return!0}}function Ke(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 B(e,t){let n=Ke(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-B6BwGcug.cjs`));return e(r(n.value,t),{encoding:`utf-8`,stdio:`ignore`}),!0}catch(e){let{log:t}=await Promise.resolve().then(()=>require(`./utils-B6BwGcug.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 Ge(n.value,t)}return!0}async function V(e,t,r){if(e===void 0)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let i=e;if(i.type===`conditional`){if(!r)return;if(typeof i.condition!=`string`){n.a(`Prompt "${t}": conditional default must have a string condition`,`error`);return}try{let{evaluateCondition:e}=await Promise.resolve().then(()=>require(`./utils-B6BwGcug.cjs`)),n=e(i.condition,r)?i.ifTrue:i.ifFalse;return typeof n==`object`&&n?await V(n,t,r):n}catch(e){n.a(`Prompt "${t}": failed to evaluate conditional default: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(i.type===`exec`){let e=i.value;if(typeof e!=`string`){n.a(`Prompt "${t}": exec default value must have a string command`,`error`);return}try{let t=(0,s.execSync)(e,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(t.startsWith(`{`)||t.startsWith(`[`))try{return JSON.parse(t)}catch{return t}if(/^-?\d+(?:\.\d+)?$/u.test(t)){let e=Number.parseFloat(t);if(!Number.isNaN(e))return e}return t===`true`||t===`false`?t===`true`:t}catch(e){n.d(`Prompt "${t}": failed to execute default value command: ${e instanceof Error?e.message:`Unknown error`}`);return}}else if(i.type===`static`)return i.value;else if(i.type===`interpolate`){let e=i.value;if(typeof e!=`string`){n.a(`Prompt "${t}": interpolate default value must be a string with {{variable}} placeholders`,`error`);return}if(!r)return n.a(`Prompt "${t}": interpolate default value requires context but none provided`,`warn`),e;try{return n.i(e,r)}catch(r){return n.a(`Prompt "${t}": failed to interpolate interpolate default value: ${r instanceof Error?r.message:`Unknown error`}`,`warn`),e}}else if(i.type!==void 0){n.a(`Prompt "${t}": unknown default value type "${i.type}". Expected "static", "exec", "conditional", or "interpolate".`,`error`);return}return e}async function H(e,t=new Map,r={}){let i={};if(e.length===0)return i;for(let a of e){if(a.$templateEnabled!=null&&!await n.u(a.$templateEnabled,{...r,...i}))continue;let e={...r,...i};if(await n.u(a.enabled,e))try{let r,o=t.get(a.id);switch(a.default!==void 0&&(o=await V(a.default,a.id,e)),a.type){case`input`:{let t={message:a.message};o!==void 0&&(t.default=String(o));let i=await B(a.required,e);if(i!==void 0&&(t.required=i),r=await(0,c.input)(t),i&&(r==null||typeof r==`string`&&r.trim()===``))throw n.a(`${a.message} is required`,`error`),m.required(a.id);break}case`password`:if(r=await(0,c.password)({message:a.message,mask:`*`}),await B(a.required,e)&&(r==null||typeof r==`string`&&r.trim()===``))throw n.a(`${a.message} is required`,`error`),m.required(a.id);break;case`number`:{let t={message:a.message};o!==void 0&&(t.default=Number(o));let i=await B(a.required,e);if(i!==void 0&&(t.required=i),a.min!==void 0&&(t.min=a.min),a.max!==void 0&&(t.max=a.max),r=await(0,c.number)(t),i&&r==null)throw n.a(`${a.message} is required`,`error`),m.required(a.id);break}case`select`:{let e={message:a.message,choices:a.choices.map(e=>({name:e.name,value:e.value}))};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 n.a(`Unknown prompt type: ${a.type}`,`error`),m.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&&n.a(`Failed to collect prompt "${a.id}": ${e.message}`,`error`),e}}return i}async function U(e,t){let n=new Map,r=e.map(async e=>{if(e.default!==void 0){let r=await V(e.default,e.id,t);r!==void 0&&n.set(e.id,r)}});return await Promise.all(r),n}function W(e){let t=[],n=new Set;for(let r of e){if(n.has(r.id)&&t.push(`Duplicate prompt ID: ${r.id}`),n.add(r.id),/^[a-zA-Z_$][a-zA-Z0-9_$]*$/u.test(r.id)||t.push(`Invalid prompt ID "${r.id}": must be a valid JavaScript identifier (start with letter, underscore, or $, followed by letters, digits, underscores, or $)`),(!r.message||r.message.trim()===``)&&t.push(`Prompt "${r.id}" must have a non-empty message`),r.type===`select`){r.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 qe=(0,o.promisify)(r.default.appendFile),Je=(0,o.promisify)(r.default.readFile),Ye=(0,o.promisify)(r.default.stat);async function Xe(e,t,r){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t)){n.a(`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=w(s);if(!c.isValid)throw c.error?.includes(`cannot have both`)?h.templateHasBothTemplateAndFile():h.templateMissingTemplateOrFile();let l=await T(s,t,r),u=!1,d=!1;try{await Ye(o),u=!0;let t=await Je(o,`utf-8`);t.length>0&&!t.endsWith(`
|
|
23
|
-
`)&&(d=e.newline!==!1)}catch{}u&&d?await qe(o,`\n${l}`):await qe(o,l),n.a(`Appended content to ${e.file}`,`success`)}const Ze={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await Xe(e.config,t,e)}},Qe=(0,o.promisify)(r.default.copyFile),$e=(0,o.promisify)(r.default.stat),et=(0,o.promisify)(r.default.mkdir),tt=(0,o.promisify)(r.default.readdir);async function nt(e,t){await et(t,{recursive:!0});let n=await tt(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 nt(r,a):await Qe(r,a)}))}async function rt(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t)){n.a(`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 $e(r)}catch{n.a(`Source path does not exist: ${r}`,`warn`);return}await et(i.default.dirname(o),{recursive:!0}),s.isDirectory()?(await nt(r,o),n.a(`Copied directory ${e.from} to ${e.to}`,`success`)):(await Qe(r,o),n.a(`Copied file ${e.from} to ${e.to}`,`success`))}const it={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await rt(e.config,t)}},at=(0,o.promisify)(r.default.writeFile);async function ot(e,t,o){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t)){n.a(`Condition not met, skipping create task`,`info`);return}let s=i.default.join(a.default.cwd(),e.file);if(r.default.existsSync(s)){n.a(`File already exists, skipping: ${e.file}`,`info`);return}let c=w(e);if(!c.isValid)throw c.error?.includes(`cannot have both`)?h.createHasBothTemplateAndFile():h.createMissingTemplateOrFile();let l=await T(e,t,o),u=i.default.dirname(s);r.default.existsSync(u)||r.default.mkdirSync(u,{recursive:!0}),await at(s,l),n.a(`Created file: ${e.file}`,`success`)}const st={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await ot(e.config,t,e)}};async function ct(e,t){let{paths:o,condition:s}=e;if(s!=null&&s!==``){if(!t){n.a(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!n.t(s,t)){n.a(`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 lt={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await ct(e.config,t)}};function G(e){switch(i.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 ut(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 dt(e){switch(e){case`node`:return`.js`;case`bash`:case`sh`:return`.sh`;case`pwsh`:case`powershell`:return`.ps1`;default:return`.js`}}function ft(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}async function pt(e,t){let o=n.i(e.file,t),c=e.args?.map(e=>n.i(e,t))??[],l={};if(e.parameters)for(let[r,i]of Object.entries(e.parameters))l[r]=n.i(i,t);let d=e.cwd!=null&&e.cwd!==``?i.default.join(a.default.cwd(),n.i(e.cwd,t)):a.default.cwd(),f,p,m=!1;if(ft(o)){n.a(`Fetching remote script: ${o}`,`info`),p=await re(o),m=!0;let t=e.runtime??G(o)??`node`;!e.runtime&&!G(o)&&n.a(`Could not detect runtime from file extension, defaulting to 'node'`,`warn`);let a=u.default.tmpdir(),s=`scaffoldfy-exec-${Date.now()}${dt(t)}`;f=i.default.join(a,s),r.default.writeFileSync(f,p,`utf-8`)}else{if(f=ne(o,e.sourceUrl),!r.default.existsSync(f))throw Error(`Script file not found: ${f}`);n.a(`Using local script: ${f}`,`info`)}let h=e.runtime??G(f)??`node`;!e.runtime&&!G(f)&&n.a(`Could not detect runtime from file extension, defaulting to 'node'`,`warn`);try{let t=ut(h,f),r=c.join(` `),i=r?`${t} ${r}`:t;n.a(`Executing: ${i}`,`info`);let o=(0,s.execSync)(i,{cwd:d,stdio:e.captureOutput?[`pipe`,`pipe`,`pipe`]:`inherit`,env:{...a.default.env,...l},encoding:e.captureOutput?`utf-8`:void 0});if(e.captureOutput)return n.a(`Script executed successfully with output`,`info`),typeof o==`string`?o:void 0;n.a(`Script executed successfully`,`info`);return}finally{if(m&&r.default.existsSync(f))try{r.default.unlinkSync(f)}catch(e){n.a(`Warning: Failed to clean up temporary file: ${e instanceof Error?e.message:String(e)}`,`warn`)}}}async function mt(e,t,r){e.condition!=null&&e.condition!==``&&!n.t(e.condition,t)||await pt({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},t)}const ht={name:`exec-file`,version:`1.0.0`,taskTypes:[`exec-file`],execute:async(e,t,n)=>{n.dryRun||await mt(e.config,t,e)}};async function gt(e,t){if(e.condition!=null&&e.condition!==``){if(!t){n.a(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!n.t(e.condition,t)){n.a(`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 _t={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await gt(e.config,t)}};async function vt(e,t){if(e.condition!=null&&e.condition!==``){if(!t){n.a(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!n.t(e.condition,t)){n.a(`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 yt={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await vt(e.config,t)}},bt=(0,o.promisify)(r.default.mkdir);async function xt(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t)){n.a(`Condition not met, skipping mkdir task`,`info`);return}await bt(i.default.join(a.default.cwd(),e.path),{recursive:!0}),n.a(`Created directory: ${e.path}`,`success`)}const St={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await xt(e.config,t)}},Ct=(0,o.promisify)(r.default.rename),wt=(0,o.promisify)(r.default.stat),Tt=(0,o.promisify)(r.default.mkdir);async function Et(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t)){n.a(`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 wt(r)}catch{n.a(`Source path does not exist: ${r}`,`warn`);return}await Tt(i.default.dirname(o),{recursive:!0}),await Ct(r,o),n.a(`Moved ${e.from} to ${e.to}`,`success`)}const Dt={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await Et(e.config,t)}},Ot=(0,o.promisify)(r.default.readFile),kt=(0,o.promisify)(r.default.writeFile);async function At(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t)){n.a(`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 Ot(r,`utf-8`),u=new RegExp(o,s);l=l.replace(u,n.i(c,t)),await kt(r,l)}const jt={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await At(e.config,t)}},Mt=(0,o.promisify)(r.default.rename);async function Nt(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t)){n.a(`Condition not met, skipping rename task`,`info`);return}let o=i.default.join(a.default.cwd(),n.i(e.from,t)),s=i.default.join(a.default.cwd(),n.i(e.to,t));if(!r.default.existsSync(o)){n.a(`Source path does not exist: ${o}`,`warn`);return}await Mt(o,s)}const Pt={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await Nt(e.config,t)}},Ft=(0,o.promisify)(r.default.readFile),It=(0,o.promisify)(r.default.writeFile);async function Lt(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t)){n.a(`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)){n.a(`File not found: ${o}, skipping`,`warn`);return}let c=await Ft(o,`utf-8`);for(let{find:e,replace:r}of s){let i=n.i(r,t);c=c.replace(new RegExp(e,`gu`),i)}await It(o,c)}const Rt={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await Lt(e.config,t)}},zt=(0,o.promisify)(r.default.readFile),Bt=(0,o.promisify)(r.default.writeFile),Vt=2;async function Ht(e,t){if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t)){n.a(`Condition not met, skipping update-json task`,`info`);return}let r=i.default.join(a.default.cwd(),e.file),{updates:o}=e,s=await zt(r,`utf-8`),c=JSON.parse(s);function l(e){if(typeof e==`string`)return n.i(e,t);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,t]of Object.entries(o)){let r=l(t);e.includes(`.`)?n.c(c,e,r):c[e]=r}await Bt(r,`${JSON.stringify(c,null,2)}\n`)}const Ut={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await Ht(e.config,t)}},Wt=(0,o.promisify)(r.default.writeFile);async function Gt(e,t,o){let{allowCreate:s=!0}=e;if(e.condition!=null&&e.condition!==``&&!n.t(e.condition,t)){n.a(`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})`);n.a(`File not found, creating new file: ${e.file}`,`info`)}let l=w(e);if(!l.isValid)throw l.error?.includes(`cannot have both`)?h.templateHasBothTemplateAndFile():h.templateMissingTemplateOrFile();let u=await T(e,t,o),d=i.default.dirname(c);r.default.existsSync(d)||r.default.mkdirSync(d,{recursive:!0}),await Wt(c,u)}const Kt={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await Gt(e.config,t,e)}};function K(){L(`update-json`)||(F(Ut),F(Kt),F(st),F(jt),F(Rt),F(lt),F(Pt),F(yt),F(_t),F(ht),F(Dt),F(it),F(Ze),F(St))}async function q(e,t,r=!1){if(K(),r){n.a(`[DRY RUN] Would execute: ${e.name}`,`info`);return}if(L(e.type)){await Be(e,t,{dryRun:r});return}throw TypeError(`Unknown task type: ${e.type}`)}async function J(e,t,r,i,o=!1){try{return n.a(`[${r}/${i}] Running: ${e.name}...`,`info`),await q(e,t,o),n.a(`[${r}/${i}] Completed: ${e.name}...`,`success`),!0}catch(t){return n.a(`Failed: ${e.name}`,`error`),t instanceof Error&&(n.a(` Reason: ${t.message}`,`error`),t.stack!=null&&a.default.env.DEBUG!=null&&console.error(t.stack)),!1}}function Y(e){let t=[],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 n.x.forTaskDependency(e);i.add(e);let s=a.get(e);if(!s)throw p.forId(e);if(s.dependencies)for(let e of s.dependencies)o(e);i.delete(e),r.add(e),t.push(s)}for(let t of e)r.has(t.id)||o(t.id);return t}function qt(e){let t=[];for(let n of e)if(!L(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=Jt(n);t.push(...e)}return t}function Jt(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=w({...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 Yt(e){n.a(`❌ Template validation failed:`,`error`),n.a(``,`error`);for(let t of e)n.a(` • ${t}`,`error`);n.a(``,`error`),n.a(`Please fix these errors before continuing.`,`error`)}async function X(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 Z(e,t,r){if(e==null)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let i=e;if(i.type===`conditional`){if(!r){n.a(`Variable "${t}": conditional value requires context but none provided`,`warn`);return}if(typeof i.condition!=`string`){n.a(`Variable "${t}": conditional value must have a string condition`,`error`);return}try{let{evaluateCondition:e}=await Promise.resolve().then(()=>require(`./utils-B6BwGcug.cjs`)),n=e(i.condition,r)?i.ifTrue:i.ifFalse;return typeof n==`object`&&n?await Z(n,t,r):n}catch(e){n.a(`Variable "${t}": failed to evaluate conditional value: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(i.type===`exec`){let e=i.value;if(typeof e!=`string`){n.a(`Variable "${t}": exec value must have a string command`,`error`);return}try{let t=(0,s.execSync)(e,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(t.startsWith(`{`)||t.startsWith(`[`))try{return JSON.parse(t)}catch{return t}if(/^-?\d+(?:\.\d+)?$/u.test(t)){let e=Number.parseFloat(t);if(!Number.isNaN(e))return e}return t===`true`||t===`false`?t===`true`:t}catch(e){n.a(`Variable "${t}": failed to execute command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}else if(i.type===`static`)return i.value;else if(i.type===`interpolate`){let e=i.value;if(typeof e!=`string`){n.a(`Variable "${t}": interpolate value must be a string with {{variable}} placeholders`,`error`);return}if(!r)return n.a(`Variable "${t}": interpolate value requires context but none provided`,`warn`),e;try{return n.i(e,r)}catch(r){return n.a(`Variable "${t}": failed to interpolate interpolate value: ${r instanceof Error?r.message:`Unknown error`}`,`warn`),e}}else if(i.type===`exec-file`){if(!r){n.a(`Variable "${t}": exec-file value requires context but none provided`,`warn`);return}let e=i;if(typeof e.file!=`string`){n.a(`Variable "${t}": exec-file value must have a file path`,`error`);return}try{let t=await pt({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},captureOutput:!0},r);if(t===void 0)return;let n=t.trim();if(n.startsWith(`{`)||n.startsWith(`[`))try{return JSON.parse(n)}catch{return n}if(/^-?\d+(?:\.\d+)?$/u.test(n)){let e=Number.parseFloat(n);if(!Number.isNaN(e))return e}return n===`true`||n===`false`?n===`true`:n}catch(e){n.a(`Variable "${t}": failed to execute script file: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}else if(i.type!==void 0){n.a(`Variable "${t}": unknown value type "${i.type}". Expected "static", "exec", "conditional", "interpolate", or "exec-file".`,`error`);return}return e}async function Q(e,t,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.$templateEnabled!=null){let e={...t};for(let[t,n]of i.entries())e[t]=n;if(!await n.u(a.$templateEnabled,e))continue}let e={...t};for(let[t,n]of i.entries())e[t]=n;let o=await Z(a.value,a.id,e);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 Xt(e,r){let i=t.t();if(!await n.u(r.templateEnabled,i,{lazy:!0})){n.f(`⊘ Template is disabled - skipping all execution`);return}r.transformers!==void 0&&r.transformers.length>0&&(n.d(`Registering ${r.transformers.length} transformer(s)...`),z.registerAll(r.transformers)),n.d(`Registering built-in plugins...`),K(),n.d(`Validating task configurations...`);let o=qt(e);o.length>0&&(Yt(o),a.default.exit(1)),n.d(`All tasks validated successfully`);let s=e.filter(e=>n.l(e.enabled,t.t(),{lazy:!0}));n.d(`Resolving task dependencies...`);let c=Y(s);n.d(`Sorted ${c.length} task(s) by dependencies`),n.f(`Welcome! Let's execute your tasks.`),r.dryRun&&n.h(`🔍 DRY RUN MODE - No changes will be made`),n.f(`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&&(n.a(`❌ Variable validation errors:`,`error`),e.forEach(e=>n.a(` - ${e}`,`error`)),a.default.exit(1)),n.d(`Resolving variable values...`);let t=await X(u,await Q(u,l,{skipConditional:!0}),l);Object.assign(l,t),Object.keys(t).length>0&&(n.d(`Resolved ${Object.keys(t).length} variable(s)`),n.d(`Variable values: ${JSON.stringify(t)}`))}let d=r.prompts??[],f=[...d];if(f.length>0){let e=W(f);e.length>0&&(n.a(`❌ Prompt validation errors:`,`error`),e.forEach(e=>n.a(` - ${e}`,`error`)),a.default.exit(1)),n.d(`Resolving prompt default values...`);let t=await U(f,l);if(d.length>0){n.f(`📋 Collecting prompts (available to all tasks):`);let e=await H(d,t,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){n.d(`Re-resolving conditional variables with prompt values...`);let t=await X(e,await Q(e,l),l);Object.assign(l,t),Object.keys(t).length>0&&n.d(`Resolved ${Object.keys(t).length} conditional variable(s)`)}}if(!await n.u(r.templateEnabled,l)){n.f(`⊘ Template is disabled after variable resolution - skipping all execution`);return}let p=[];for(let e of c)e.$templateEnabled!=null&&!await n.u(e.$templateEnabled,l)||await n.u(e.enabled,l)&&p.push(e);if(n.a(`${p.length} of ${c.length} task(s) enabled for execution`,`info`),r.dryRun){await j(p,l),n.f(`🔍 Dry run completed - no changes were made`),n.f(`Run without --dry-run to apply changes`);return}n.d(`Calling beforeAll hook...`),await R(`beforeAll`,l);let m=p.length,h=0,g=0,ee=[],_=[];for(let e=0;e<p.length;e++){let t=p[e];t!=null&&(n.d(`Calling beforeTask hook for task: ${t.name}`),await R(`beforeTask`,t,l),await J(t,l,e+1,m,r.dryRun)?(h++,ee.push(t.id),n.d(`Calling afterTask hook for task: ${t.name}`),await R(`afterTask`,t,l)):(await B(t.required,l)&&(g++,_.push(t.name)),n.d(`Calling onError hook for task: ${t.name}`),await R(`onError`,Error(`Task ${t.name} failed`),t),n.h(`⚠️ Task "${t.name}" failed, continuing with remaining tasks...`)))}g>0&&(n.a(`\n❌ Task execution completed with ${g} error(s)`,`error`),n.a(`Completed: ${h}/${m} tasks`,`info`),n.a(`Failed tasks: ${_.join(`, `)}`,`error`),a.default.exit(1)),n.d(`Calling afterAll hook...`),await R(`afterAll`,l),n.m(`✅ All tasks completed successfully!`),n.m(` Completed: ${h}/${m} tasks`)}async function Zt(e,t,r={}){n.d(`Running templates with sequential variable/prompt resolution...`),n.d(`Total templates to process: ${e.length}`),n.d(`Registering built-in plugins...`),K();let i=[];console.log(``),n.f(`📋 Collecting input...`),console.log(``);for(let t=0;t<e.length;t++){let o=e[t];if(o==null)continue;let s=`=`.repeat(60);if(n.d(`\n${s}`),n.d(`Processing template ${t+1}/${e.length}: "${o.name}"`),n.d(s),n.d(`Current config keys: ${Object.keys(r).join(`, `)}`),!await n.u(o.enabled,r)){n.f(`⊘ Template "${o.name}" is disabled - skipping`),n.d(` Enabled condition: ${JSON.stringify(o.enabled)}`);continue}let c=o.variables??[];if(c.length>0){n.d(`Processing ${c.length} variable(s) for template "${o.name}"...`);let e=$(c);e.length>0&&(n.a(`❌ Variable validation errors:`,`error`),e.forEach(e=>n.a(` - ${e}`,`error`)),a.default.exit(1));let t=await X(c,await Q(c,r,{skipConditional:!0}),r);Object.assign(r,t);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 X(i,await Q(i,r),r);if(s=Object.keys(e).length,Object.assign(r,e),s>0){n.d(`Resolved ${s} conditional variable(s)`);for(let[t,r]of Object.entries(e))n.d(` ${t} = ${JSON.stringify(r)}`)}}let l=Object.keys(t).length+s;if(l>0){n.d(`Total variables resolved for template: ${l}`);for(let[e,r]of Object.entries(t))n.d(` ${e} = ${JSON.stringify(r)}`)}}let l=o.prompts??[];if(l.length>0){n.d(`Processing ${l.length} prompt(s) for template "${o.name}"...`);let e=W(l);e.length>0&&(n.a(`❌ Prompt validation errors:`,`error`),e.forEach(e=>n.a(` - ${e}`,`error`)),a.default.exit(1));let t=await H(l,await U(l,r),r);Object.assign(r,t),n.d(`Collected ${Object.keys(t).length} prompt answer(s)`)}if(!await n.u(o.enabled,r)){n.f(`⊘ Template "${o.name}" became disabled after variable/prompt resolution - skipping tasks`);continue}let u=o.tasks??[];u.length>0&&(n.d(`Found ${u.length} task(s) in template "${o.name}" (will execute later)`),i.push(...u))}if(n.d(`
|
|
24
|
-
🔧 Validating and filtering all collected tasks...`),i.length===0){n.a(`No tasks found in any template`,`info`);return}let o=qt(i);o.length>0&&(Yt(o),a.default.exit(1)),console.log(``),n.a(`🛠️ Preparing tasks...`,`info`);let s=[];for(let e of i)await n.u(e.enabled,r)&&s.push(e);if(console.log(``),n.a(`Found ${i.length} tasks (${s.length} enabled)`,`info`),n.a(`All tasks validated successfully`,`success`),s.length===0){n.a(`No enabled tasks to execute`,`info`);return}let c=Y(s);if(t.dryRun){n.a(`
|
|
25
|
-
🔍 Dry run - showing task changes...`,`info`),await j(c,r),n.a(`
|
|
26
|
-
🔍 Dry run completed - no changes were made`,`info`),n.a(`Run without --dry-run to apply changes`,`info`);return}console.log(``),n.f(`⚙️ Executing tasks...`),console.log(``),await R(`beforeAll`,r);let l=0,u=0,d=[];for(let e=0;e<c.length;e++){let i=c[e];i!=null&&(await R(`beforeTask`,i,r),await J(i,r,e+1,c.length,t.dryRun)?(l++,await R(`afterTask`,i,r)):(await B(i.required,r)&&(u++,d.push(i.name)),await R(`onError`,Error(`Task ${i.name} failed`),i),n.h(`⚠️ Task "${i.name}" failed, continuing with remaining tasks...`)))}await R(`afterAll`,r),u>0&&(n.a(`\n❌ Task execution completed with ${u} error(s)`,`error`),n.a(`Completed: ${l}/${c.length} tasks`,`info`),n.a(`Failed tasks: ${d.join(`, `)}`,`error`),a.default.exit(1)),n.a(`Completed: ${l}/${c.length} tasks`,`success`)}Object.defineProperty(exports,`A`,{enumerable:!0,get:function(){return De}}),Object.defineProperty(exports,`B`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`C`,{enumerable:!0,get:function(){return Le}}),Object.defineProperty(exports,`D`,{enumerable:!0,get:function(){return He}}),Object.defineProperty(exports,`E`,{enumerable:!0,get:function(){return Fe}}),Object.defineProperty(exports,`F`,{enumerable:!0,get:function(){return Ee}}),Object.defineProperty(exports,`G`,{enumerable:!0,get:function(){return he}}),Object.defineProperty(exports,`H`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`I`,{enumerable:!0,get:function(){return Pe}}),Object.defineProperty(exports,`J`,{enumerable:!0,get:function(){return ae}}),Object.defineProperty(exports,`K`,{enumerable:!0,get:function(){return se}}),Object.defineProperty(exports,`L`,{enumerable:!0,get:function(){return Se}}),Object.defineProperty(exports,`M`,{enumerable:!0,get:function(){return ke}}),Object.defineProperty(exports,`N`,{enumerable:!0,get:function(){return Te}}),Object.defineProperty(exports,`O`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`P`,{enumerable:!0,get:function(){return Oe}}),Object.defineProperty(exports,`R`,{enumerable:!0,get:function(){return Ce}}),Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`T`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`U`,{enumerable:!0,get:function(){return _e}}),Object.defineProperty(exports,`V`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`W`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`X`,{enumerable:!0,get:function(){return de}}),Object.defineProperty(exports,`Y`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return Ue}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return Z}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return U}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return Re}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return Q}}),Object.defineProperty(exports,`j`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`k`,{enumerable:!0,get:function(){return we}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return K}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return V}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return Zt}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return H}}),Object.defineProperty(exports,`q`,{enumerable:!0,get:function(){return ge}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return $}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return Y}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return Xt}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return Be}}),Object.defineProperty(exports,`w`,{enumerable:!0,get:function(){return ze}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return Ve}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return Ie}}),Object.defineProperty(exports,`z`,{enumerable:!0,get:function(){return ve}});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./config-DfRbCqsT.js";import"./utils-CrJkuEEG.js";import{n as e,t}from"./run-tasks-CEs2FBaf.js";export{t as runTasks,e as runTemplatesSequentially};
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./config-DfRbCqsT.js";import{S as t,_ as n,a as r,b as i,c as a,d as o,f as s,g as c,h as l,i as u,l as d,m as f,t as p,u as m,v as h,x as g,y as _}from"./utils-CrJkuEEG.js";import v from"node:path";import y from"node:fs";import b from"node:process";import{promisify as x}from"node:util";import{execSync as S}from"node:child_process";import{confirm as ee,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 ce,lowerCase as le,pascalCase as ue,snakeCase as de,upperCase as fe}from"case-anything";import pe from"node:os";var me=class e extends t{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)}},C=class e extends t{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`)}},he=class e extends t{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)}},w=class e extends t{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`)}},T=class e extends t{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`)}},E=class e extends t{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 ge(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,u=new Set;function d(e){if(l.has(e))return;if(u.has(e))throw g.forTemplateDependencies(Array.from(u),e);u.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)d(e)}u.delete(e),l.add(e),t!=null&&!a.has(e)&&c.push(t)}for(let e of s)d(e.name);let f=[],p=0;for(let t=0;t<e.length;t++){let n=e[t];a.has(n.name)?f.push(n):p<c.length&&(f.push(c[p]),p++)}return f}const _e=x(y.readFile),ve={template:[[`template`,`templateFile`]]};function D(e){if(e==null||e===``)return`current template`;if(O(e))return e;let t=b.cwd();return e.startsWith(t)?v.relative(t,e):e}function O(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function ye(e,t){if(O(e))return e;if(t==null||t===``)return v.isAbsolute(e)?e:v.resolve(b.cwd(),e);if(O(t))try{let n=new URL(`.`,t);return new URL(e,n).href}catch{throw i.forRemoteTemplate(e,t)}let n=v.dirname(t);return v.isAbsolute(e)?e:v.resolve(n,e)}async function be(e){if(O(e))return xe(e);if(!y.existsSync(e))throw h.forPath(e);return _e(e,`utf-8`)}async function xe(e){try{let t=await fetch(e);if(!t.ok)throw n.forUrl(e,t.status,t.statusText);return await t.text()}catch(t){throw t instanceof Error&&t.message.includes(`Failed to fetch`)?t:n.forUrl(e,t instanceof Error?t:void 0)}}const k=new Map;async function Se(e,t=new Set){let n=O(e),r;if(r=n||v.isAbsolute(e)?e:v.resolve(b.cwd(),e),k.has(r))return k.get(r);if(t.has(r))throw g.forTemplateInheritance(t,r);t.add(r);let i;if(n)i=await xe(r);else{if(!y.existsSync(r))throw h.forPath(r);i=await _e(r,`utf-8`)}let a;try{a=JSON.parse(i)}catch(e){throw _.forFile(r,e instanceof Error?e:Error(String(e)))}if(a.name==null||a.name.trim()===``)throw c.missingName(r);if(!/^[a-z\d]+(?:-[a-z\d]+)*$/u.test(a.name))throw c.invalidNameFormat(r,a.name);if(a.tasks!==void 0&&!Array.isArray(a.tasks))throw c.tasksNotArray(r);a.tasks===void 0&&(a.tasks=[]);for(let e of a.tasks)e.$sourceUrl=r;return k.set(r,a),a}async function Ce(e,t,n,r,i){let a=O(e),o;if(o=a||v.isAbsolute(e)?e:t==null?v.resolve(b.cwd(),e):O(t)?new URL(e,t).href:v.resolve(t,e),n.has(o))return;if(r.has(o))throw g.forTemplateInheritance(r,o);r.add(o);let s=await Se(o),c=O(o)?new URL(`.`,o).href:v.dirname(o);if(s.extends!=null&&s.extends!==``){let e=Array.isArray(s.extends)?s.extends:[s.extends];for(let t of e)await Ce(t,c,n,r,i)}r.delete(o),n.add(o),i.push(s)}async function A(e,t,n=new Set){let r=[];return await Ce(e,t,n,new Set,r),ge(r)}async function we(e,t,n=new Set){return Oe(await A(e,t,n))}function Te(e,t,n){let r=new Map;for(let t of e){if(r.has(t.id))throw me.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 me.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 me.forId(e.id,`prompt`,r.get(e.id));r.set(e.id,`prompt`)}}function Ee(e,t){if((t.override??`merge`)===`replace`){r(` → Variable "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}r(` → Variable "${t.id}" merged (value replaced)`,`info`);let n={...e,...t};return delete n.override,n}function De(e,t){if((t.override??`merge`)===`replace`){r(` → Prompt "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}r(` → Prompt "${t.id}" merged`,`info`);let n={...e,...t};return delete n.override,n}function Oe(e){if(e.length===0)return{name:`Empty Template`,tasks:[]};if(e.length===1){let t=e[0];return Te(t.tasks??[],t.variables,t.prompts),t}let t=new Map,n=new Map,i=new Map,a={};for(let o of e){if(o.enabled!=null&&(a[o.name]=o.enabled),o.enabled===!1){r(`⊘ Skipping disabled template "${o.name}" - its tasks, prompts, and variables will not be included`,`info`);continue}if(o.prompts!=null)for(let e of o.prompts)if(i.has(e.id)){if(e.override==null)throw C.forPrompt(e.id);let t=De(i.get(e.id),e);o.enabled!=null&&(t.$templateEnabled=o.enabled),i.set(e.id,t)}else{let t={...e};o.enabled!=null&&(t.$templateEnabled=o.enabled),i.set(e.id,t)}if(o.variables!=null)for(let e of o.variables)if(n.has(e.id)){if(e.override==null)throw C.forVariable(e.id);let t=Ee(n.get(e.id),e);o.enabled!=null&&(t.$templateEnabled=o.enabled),n.set(e.id,t)}else{let t={...e};o.enabled!=null&&(t.$templateEnabled=o.enabled),n.set(e.id,t)}for(let e of o.tasks??[])if(t.has(e.id)){if(e.override==null){let n=t.get(e.id);throw C.forTask(e.id,D(n.$sourceUrl),D(e.$sourceUrl))}let n=je(t.get(e.id),e);o.enabled!=null&&(n.$templateEnabled=o.enabled),t.set(e.id,n)}else{let n={...e};o.enabled!=null&&(n.$templateEnabled=o.enabled),t.set(e.id,n)}}let o=Array.from(t.values()),s=i.size>0?Array.from(i.values()):void 0,c=n.size>0?Array.from(n.values()):void 0;Te(o,c,s);let l=e[e.length-1],u={name:l.name,tasks:o};return l.description!=null&&(u.description=l.description),l.dependencies!=null&&(u.dependencies=l.dependencies),l.enabled!=null&&(u.enabled=l.enabled),s!=null&&(u.prompts=s),c!=null&&(u.variables=c),u}function ke(e,t){let n=ve[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 Ae(e,t,n){let r={...e},i=ve[n]??[];for(let[e,n]of Object.entries(t)){for(let t of i)if(t.includes(e)){for(let n of t)n!==e&&delete r[n];break}r[e]=n}return r}function je(e,t){if((t.override??`merge`)===`replace`){r(` → Task "${t.id}" using 'replace' strategy - completely replacing base task`,`info`),r(` Base: ${D(e.$sourceUrl)}`,`info`),r(` Override: ${D(t.$sourceUrl)}`,`info`);let{override:n,...i}=t;return i}r(` → Merging task "${t.id}"`,`info`),r(` Base: ${D(e.$sourceUrl)}`,`info`),r(` Override: ${D(t.$sourceUrl)}`,`info`);let n;if(typeof e.config==`object`&&e.config!==null&&typeof t.config==`object`&&t.config!==null){n=Ae(e.config,t.config,t.type);let i=ke(t.type,n);i!==null&&i.length>0&&(r(` ⚠️ Warning: Conflicting config fields detected: ${i.join(`, `)}`,`warn`),r(` Please use override: "replace" or specify only one of these fields`,`warn`))}else n=t.config??e.config;let i=[...e.dependencies??[],...t.dependencies??[]],a=i.length>0?[...new Set(i)]:void 0,o=t.$sourceUrl??e.$sourceUrl,s={...e,...t,config:n,...a!=null&&{dependencies:a},...o!=null&&{$sourceUrl:o}};return delete s.override,s}function Me(){k.clear()}async function Ne(e,t){if(o(`Loading tasks from ${e}...`),t?.sequential===!0){let t=await A(e);return o(`Loaded ${t.length} template(s) for processing`),{tasks:[],templates:t}}let n=await we(e);r(`Loaded ${n.tasks?.length??0} task(s)`,`info`),n.extends!=null&&n.extends!==``&&r(`Extended from: ${(Array.isArray(n.extends)?n.extends:[n.extends]).join(`, `)}`,`info`),n.prompts!=null&&n.prompts.length>0&&r(`Found ${n.prompts.length} top-level prompt(s)`,`info`),n.variables!=null&&n.variables.length>0&&r(`Found ${n.variables.length} top-level variable(s)`,`info`);let i={tasks:n.tasks??[]};return n.prompts!=null&&(i.prompts=n.prompts),n.variables!=null&&(i.variables=n.variables),n.enabled!=null&&(i.enabled=n.enabled),n.transformers!=null&&(i.transformers=n.transformers),i}function j(e){return e.template!=null&&e.template!==``}function M(e){return e.templateFile!=null&&e.templateFile!==``}function Pe(e){return e.endsWith(`.hbs`)}function N(e){let t=j(e),n=M(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 P(e,t,n,r={}){let{enableHandlebars:i=!0,sourceUrl:a=n?.$sourceUrl}=r,o=j(e),s=M(e);if(o)return u(e.template,t);if(s){let n=e.templateFile,r=i&&Pe(n),o=await be(ye(n,a));return r?(await import(`handlebars`)).default.compile(o)(t):u(o,t)}throw Error(`No template content available`)}function Fe(e){return j(e)?`inline template`:M(e)?`template file: ${e.templateFile}`:`no template source`}const F=x(y.readFile),I={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function Ie(e,t){switch(t){case`add`:return`${I.green}+ ${e}${I.reset}`;case`remove`:return`${I.red}- ${e}${I.reset}`;case`context`:return`${I.gray} ${e}${I.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(Ie(t,`context`)):(t!==void 0&&i.push(Ie(t,`remove`)),a!==void 0&&i.push(Ie(a,`add`)))}return i}async function Le(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=v.join(b.cwd(),e.file);if(!y.existsSync(n))return`${I.red}✗ File not found: ${e.file}${I.reset}`;try{let r=await F(n,`utf-8`),i=JSON.parse(r),o={...i};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[t,n]of Object.entries(e.updates)){let e=s(n);t.includes(`.`)?a(i,t,e):i[t]=e}let c=JSON.stringify(o,null,2),l=JSON.stringify(i,null,2);if(c===l)return`${I.cyan}→ No changes${I.reset}`;let d=L(c,l);return`${I.blue}File: ${e.file}${I.reset}\n${d.join(`
|
|
4
|
-
`)}`}catch(e){return`${I.red}✗ Error: ${e instanceof Error?e.message:String(e)}${I.reset}`}}async function Re(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;if(e.template==null||e.template===``)return`${I.red}✗ No template content provided for file: ${e.file}${I.reset}`;let n=v.join(b.cwd(),e.file),r=u(e.template,t);if(!y.existsSync(n)){let t=r.split(`
|
|
5
|
-
`).slice(0,10).join(`
|
|
6
|
-
`),n=r.split(`
|
|
7
|
-
`).length>10;return`${I.blue}File: ${e.file}${I.reset}\n${I.green}+ New file would be created${I.reset}\n${I.gray}Content preview:${I.reset}\n${t}${n?`
|
|
8
|
-
...`:``}`}try{let t=await F(n,`utf-8`);if(t===r)return`${I.cyan}→ No changes${I.reset}`;let i=L(t,r);return`${I.blue}File: ${e.file}${I.reset}\n${i.join(`
|
|
9
|
-
`)}`}catch(e){return`${I.red}✗ Error: ${e instanceof Error?e.message:String(e)}${I.reset}`}}async function ze(e,t,n){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let r=v.join(b.cwd(),e.file);if(y.existsSync(r))return`${I.cyan}→ File already exists, would be skipped: ${e.file}${I.reset}`;try{if(j(e)){let r=await P(e,t,n),i=r.split(`
|
|
10
|
-
`).slice(0,10).join(`
|
|
11
|
-
`),a=r.split(`
|
|
12
|
-
`).length>10;return`${I.blue}File: ${e.file}${I.reset}\n${I.green}+ New file would be created${I.reset}\n${I.gray}Content preview:${I.reset}\n${i}${a?`
|
|
13
|
-
...`:``}`}let r=Fe(e);return`${I.blue}File: ${e.file}${I.reset}\n${I.green}+ New file would be created from ${r}${I.reset}`}catch(e){return`${I.red}✗ Error: ${e instanceof Error?e.message:String(e)}${I.reset}`}}async function Be(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=v.join(b.cwd(),e.file);if(!y.existsSync(n))return`${I.red}✗ File not found: ${e.file}${I.reset}`;try{let r=await F(n,`utf-8`),i=new RegExp(e.pattern,e.flags??`g`),a=u(e.replacement,t),o=r.replace(i,a);if(r===o)return`${I.cyan}→ No matches found${I.reset}`;let s=L(r,o);return`${I.blue}File: ${e.file}${I.reset}\n${s.join(`
|
|
14
|
-
`)}`}catch(e){return`${I.red}✗ Error: ${e instanceof Error?e.message:String(e)}${I.reset}`}}async function Ve(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=v.join(b.cwd(),e.file);if(!y.existsSync(n))return`${I.red}✗ File not found: ${e.file}${I.reset}`;try{let r=await F(n,`utf-8`),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`${I.cyan}→ No changes${I.reset}`;let a=L(i,r);return`${I.blue}File: ${e.file}${I.reset}\n${a.join(`
|
|
15
|
-
`)}`}catch(e){return`${I.red}✗ Error: ${e instanceof Error?e.message:String(e)}${I.reset}`}}function He(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=e.paths.map(e=>u(e,t)).filter(e=>y.existsSync(v.join(b.cwd(),e)));return n.length===0?`${I.cyan}→ No files/directories to delete${I.reset}`:`${I.red}Would delete:${I.reset}\n${n.map(e=>`${I.red} - ${e}${I.reset}`).join(`
|
|
16
|
-
`)}`}function Ue(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=u(e.from,t),r=u(e.to,t),i=v.join(b.cwd(),n),a=v.join(b.cwd(),r);return y.existsSync(i)?y.existsSync(a)?`${I.yellow}⚠ Destination already exists: ${r}${I.reset}\n${I.cyan}Would rename: ${n} → ${r}${I.reset}`:`${I.cyan}Would rename: ${n} → ${r}${I.reset}`:`${I.red}✗ Source not found: ${n}${I.reset}`}function We(e){if(e.condition!=null&&e.condition!==``)return`${I.yellow}⊘ Condition check skipped in dry-run${I.reset}`;let t=v.join(b.cwd(),`.git`),n=y.existsSync(t),r=[];if(e.removeExisting&&n&&r.push(`${I.red}Would remove existing .git directory${I.reset}`),r.push(`${I.green}Would initialize git repository${I.reset}`),e.initialCommit){let t=e.message??`Initial commit`;r.push(`${I.green}Would create initial commit: "${t}"${I.reset}`)}return r.join(`
|
|
17
|
-
`)}function R(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=u(e.command,t),r=e.cwd==null?b.cwd():u(e.cwd,t);return`${I.yellow}Would execute:${I.reset}\n${I.cyan} Command: ${n}${I.reset}\n${I.cyan} Working directory: ${r}${I.reset}`}function Ge(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=u(e.from,t),r=u(e.to,t),i=v.join(b.cwd(),n),a=v.join(b.cwd(),r);return y.existsSync(i)?y.existsSync(a)?`${I.yellow}⚠ Destination already exists: ${r}${I.reset}\n${I.cyan}Would move: ${n} → ${r}${I.reset}`:`${I.cyan}Would move: ${n} → ${r}${I.reset}`:`${I.red}✗ Source not found: ${n}${I.reset}`}function Ke(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=u(e.from,t),r=u(e.to,t),i=v.join(b.cwd(),n),a=v.join(b.cwd(),r);if(!y.existsSync(i))return`${I.red}✗ Source not found: ${n}${I.reset}`;let o=y.statSync(i).isDirectory()?`directory`:`file`;return y.existsSync(a)?`${I.yellow}⚠ Destination already exists: ${r}${I.reset}\n${I.cyan}Would copy ${o}: ${n} → ${r}${I.reset}`:`${I.cyan}Would copy ${o}: ${n} → ${r}${I.reset}`}async function qe(e,t,n){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let r=v.join(b.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 P(i,t,n),o=a.split(`
|
|
18
|
-
`).slice(0,10).join(`
|
|
19
|
-
`),s=a.split(`
|
|
20
|
-
`).length>10;return y.existsSync(r)?`${I.blue}File: ${e.file}${I.reset}\n${I.green}+ Would append content${I.reset}\n${I.gray}Content preview:${I.reset}\n${o}${s?`
|
|
21
|
-
...`:``}`:`${I.blue}File: ${e.file}${I.reset}\n${I.green}+ New file would be created with content${I.reset}\n${I.gray}Content preview:${I.reset}\n${o}${s?`
|
|
22
|
-
...`:``}`}catch(e){return`${I.red}✗ Error: ${e instanceof Error?e.message:String(e)}${I.reset}`}}function Je(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t))return`${I.yellow}⊘ Condition not met - task would be skipped${I.reset}`;let n=u(e.path,t),r=v.join(b.cwd(),n);return y.existsSync(r)?`${I.cyan}→ Directory already exists: ${n}${I.reset}`:`${I.green}+ Would create directory: ${n}${I.reset}`}async function Ye(e,t){try{switch(e.type){case`update-json`:return await Le(e.config,t);case`write`:return await Re(e.config,t);case`create`:return await ze(e.config,t,e);case`regex-replace`:return await Be(e.config,t);case`replace-in-file`:return await Ve(e.config,t);case`delete`:return He(e.config,t);case`rename`:return Ue(e.config,t);case`move`:return Ge(e.config,t);case`copy`:return Ke(e.config,t);case`append`:return await qe(e.config,t,e);case`mkdir`:return Je(e.config,t);case`git-init`:return We(e.config);case`exec`:return R(e.config,t);case`exec-file`:return R(e.config,t);default:{let t=e.type;return`${I.yellow}⚠ Diff not available for task type: ${t}${I.reset}`}}}catch(e){return`${I.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${I.reset}`}}async function z(e,t){console.log(`${I.blue}═══════════════════════════════════════════════════════${I.reset}`),console.log(`${I.blue} DRY RUN - Preview of changes${I.reset}`),console.log(`${I.blue}═══════════════════════════════════════════════════════${I.reset}`);for(let n of e){console.log(`${I.cyan}▶ Task: ${n.name}${I.reset}`),n.description!=null&&n.description!==``&&console.log(`${I.gray} ${n.description}${I.reset}`);let e=await Ye(n,t);console.log(e),console.log(`${I.gray}${`─`.repeat(55)}${I.reset}`)}console.log(`${I.blue}═══════════════════════════════════════════════════════${I.reset}`),console.log(`${I.yellow} No changes were applied (dry-run mode)${I.reset}`),console.log(`${I.blue}═══════════════════════════════════════════════════════${I.reset}`)}const B=new Map,V={},H=new Map;function U(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(B.has(e.name))throw TypeError(`Plugin ${e.name} is already registered`);for(let t of e.taskTypes)if(H.has(t)){let e=H.get(t);throw TypeError(`Task type "${t}" is already registered by plugin "${e}"`)}B.set(e.name,e);for(let t of e.taskTypes)H.set(t,e.name);o(`Registered plugin: ${e.name}${e.version==null?``:` v${e.version}`}`)}function Xe(e){let t=B.get(e);if(t!=null){for(let e of t.taskTypes)H.delete(e);B.delete(e)}}function Ze(e){return B.get(e)}function W(e){let t=H.get(e);if(t!=null)return B.get(t)}function G(e){return H.has(e)}function Qe(){return Array.from(B.keys())}function $e(){B.clear(),H.clear()}function et(e){e.beforeAll!=null&&(V.beforeAll=e.beforeAll),e.afterAll!=null&&(V.afterAll=e.afterAll),e.beforeTask!=null&&(V.beforeTask=e.beforeTask),e.afterTask!=null&&(V.afterTask=e.afterTask),e.onError!=null&&(V.onError=e.onError)}async function K(e,...t){let n=V[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 tt(e,t,n){let r=W(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}async function nt(e,t){let n=W(e.type);if(!(n==null||n.getDiff==null))return n.getDiff(e,t)}function rt(e){let t=W(e.type);return t==null?[`No plugin found for task type: ${e.type}`]:t.validate==null?[]:t.validate(e)}function it(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 q=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 E.notFound(e);try{return await this.executeTransformer(r,t,n)}catch(t){throw t instanceof E?t:E.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 E.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 E.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 E.executionFailed(e.id,`Expression evaluation failed: ${t instanceof Error?t.message:String(t)}`)}}executeLowercase(e){return le(String(e))}executeUppercase(e){return fe(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 E.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 E.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 ue(String(e))}executeSnakecase(e){return de(String(e))}executeKebabcase(e){return ce(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 ce(String(e))}executeUnderscore(e){return de(String(e))}clear(){this.transformers.clear()}getIds(){return Array.from(this.transformers.keys())}};function at(e,t){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch{return!0}}function ot(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=ot(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-B6WSsvMT.js`);return e(r(n.value,t),{encoding:`utf-8`,stdio:`ignore`}),!0}catch(e){let{log:t}=await import(`./utils-B6WSsvMT.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 at(n.value,t)}return!0}async function Y(e,t,n){if(e===void 0)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let i=e;if(i.type===`conditional`){if(!n)return;if(typeof i.condition!=`string`){r(`Prompt "${t}": conditional default must have a string condition`,`error`);return}try{let{evaluateCondition:e}=await import(`./utils-B6WSsvMT.js`),r=e(i.condition,n)?i.ifTrue:i.ifFalse;return typeof r==`object`&&r?await Y(r,t,n):r}catch(e){r(`Prompt "${t}": failed to evaluate conditional default: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(i.type===`exec`){let e=i.value;if(typeof e!=`string`){r(`Prompt "${t}": exec default value must have a string command`,`error`);return}try{let t=S(e,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(t.startsWith(`{`)||t.startsWith(`[`))try{return JSON.parse(t)}catch{return t}if(/^-?\d+(?:\.\d+)?$/u.test(t)){let e=Number.parseFloat(t);if(!Number.isNaN(e))return e}return t===`true`||t===`false`?t===`true`:t}catch(e){o(`Prompt "${t}": failed to execute default value command: ${e instanceof Error?e.message:`Unknown error`}`);return}}else if(i.type===`static`)return i.value;else if(i.type===`interpolate`){let e=i.value;if(typeof e!=`string`){r(`Prompt "${t}": interpolate default value must be a string with {{variable}} placeholders`,`error`);return}if(!n)return r(`Prompt "${t}": interpolate default value requires context but none provided`,`warn`),e;try{return u(e,n)}catch(n){return r(`Prompt "${t}": failed to interpolate interpolate default value: ${n instanceof Error?n.message:`Unknown error`}`,`warn`),e}}else if(i.type!==void 0){r(`Prompt "${t}": unknown default value type "${i.type}". Expected "static", "exec", "conditional", or "interpolate".`,`error`);return}return e}async function st(e,t=new Map,n={}){let i={};if(e.length===0)return i;for(let a of e){if(a.$templateEnabled!=null&&!await m(a.$templateEnabled,{...n,...i}))continue;let e={...n,...i};if(await m(a.enabled,e))try{let n,o=t.get(a.id);switch(a.default!==void 0&&(o=await Y(a.default,a.id,e)),a.type){case`input`:{let t={message:a.message};o!==void 0&&(t.default=String(o));let i=await J(a.required,e);if(i!==void 0&&(t.required=i),n=await te(t),i&&(n==null||typeof n==`string`&&n.trim()===``))throw r(`${a.message} is required`,`error`),w.required(a.id);break}case`password`:if(n=await re({message:a.message,mask:`*`}),await J(a.required,e)&&(n==null||typeof n==`string`&&n.trim()===``))throw r(`${a.message} is required`,`error`),w.required(a.id);break;case`number`:{let t={message:a.message};o!==void 0&&(t.default=Number(o));let i=await J(a.required,e);if(i!==void 0&&(t.required=i),a.min!==void 0&&(t.min=a.min),a.max!==void 0&&(t.max=a.max),n=await ne(t),i&&n==null)throw r(`${a.message} is required`,`error`),w.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),n=await ie(e);break}case`confirm`:{let e=o===void 0?!1:!!o;n=await ee({message:a.message,default:e});break}default:throw r(`Unknown prompt type: ${a.type}`,`error`),w.unknownType(a.type)}a.transformers!==void 0&&(n=await q.apply(a.transformers,n,{...e,...i})),i[a.id]=n}catch(e){throw e instanceof Error&&r(`Failed to collect prompt "${a.id}": ${e.message}`,`error`),e}}return i}async function ct(e,t){let n=new Map,r=e.map(async e=>{if(e.default!==void 0){let r=await Y(e.default,e.id,t);r!==void 0&&n.set(e.id,r)}});return await Promise.all(r),n}function lt(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 ut=x(y.appendFile),dt=x(y.readFile),ft=x(y.stat);async function pt(e,t,n){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping append task`,`info`);return}let i=v.join(b.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=N(a);if(!o.isValid)throw o.error?.includes(`cannot have both`)?T.templateHasBothTemplateAndFile():T.templateMissingTemplateOrFile();let s=await P(a,t,n),c=!1,l=!1;try{await ft(i),c=!0;let t=await dt(i,`utf-8`);t.length>0&&!t.endsWith(`
|
|
23
|
-
`)&&(l=e.newline!==!1)}catch{}c&&l?await ut(i,`\n${s}`):await ut(i,s),r(`Appended content to ${e.file}`,`success`)}const mt={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await pt(e.config,t,e)}},ht=x(y.copyFile),gt=x(y.stat),_t=x(y.mkdir),vt=x(y.readdir);async function yt(e,t){await _t(t,{recursive:!0});let n=await vt(e,{withFileTypes:!0});await Promise.all(n.map(async n=>{let r=v.join(e,n.name),i=v.join(t,n.name);n.isDirectory()?await yt(r,i):await ht(r,i)}))}async function bt(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping copy task`,`info`);return}let n=v.join(b.cwd(),e.from),i=v.join(b.cwd(),e.to),a;try{a=await gt(n)}catch{r(`Source path does not exist: ${n}`,`warn`);return}await _t(v.dirname(i),{recursive:!0}),a.isDirectory()?(await yt(n,i),r(`Copied directory ${e.from} to ${e.to}`,`success`)):(await ht(n,i),r(`Copied file ${e.from} to ${e.to}`,`success`))}const xt={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await bt(e.config,t)}},St=x(y.writeFile);async function Ct(e,t,n){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping create task`,`info`);return}let i=v.join(b.cwd(),e.file);if(y.existsSync(i)){r(`File already exists, skipping: ${e.file}`,`info`);return}let a=N(e);if(!a.isValid)throw a.error?.includes(`cannot have both`)?T.createHasBothTemplateAndFile():T.createMissingTemplateOrFile();let o=await P(e,t,n),s=v.dirname(i);y.existsSync(s)||y.mkdirSync(s,{recursive:!0}),await St(i,o),r(`Created file: ${e.file}`,`success`)}const wt={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await Ct(e.config,t,e)}};async function Tt(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(!p(i,t)){r(`Condition not met, skipping deletion`,`info`);return}}for(let e of n){let t=v.join(b.cwd(),e);y.existsSync(t)&&y.rmSync(t,{recursive:!0,force:!0})}}const Et={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await Tt(e.config,t)}};function X(e){switch(v.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 Dt(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 Ot(e){switch(e){case`node`:return`.js`;case`bash`:case`sh`:return`.sh`;case`pwsh`:case`powershell`:return`.ps1`;default:return`.js`}}function kt(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}async function At(e,t){let n=u(e.file,t),i=e.args?.map(e=>u(e,t))??[],a={};if(e.parameters)for(let[n,r]of Object.entries(e.parameters))a[n]=u(r,t);let o=e.cwd!=null&&e.cwd!==``?v.join(b.cwd(),u(e.cwd,t)):b.cwd(),s,c,l=!1;if(kt(n)){r(`Fetching remote script: ${n}`,`info`),c=await be(n),l=!0;let t=e.runtime??X(n)??`node`;!e.runtime&&!X(n)&&r(`Could not detect runtime from file extension, defaulting to 'node'`,`warn`);let i=pe.tmpdir(),a=`scaffoldfy-exec-${Date.now()}${Ot(t)}`;s=v.join(i,a),y.writeFileSync(s,c,`utf-8`)}else{if(s=ye(n,e.sourceUrl),!y.existsSync(s))throw Error(`Script file not found: ${s}`);r(`Using local script: ${s}`,`info`)}let d=e.runtime??X(s)??`node`;!e.runtime&&!X(s)&&r(`Could not detect runtime from file extension, defaulting to 'node'`,`warn`);try{let t=Dt(d,s),n=i.join(` `),c=n?`${t} ${n}`:t;r(`Executing: ${c}`,`info`);let l=S(c,{cwd:o,stdio:e.captureOutput?[`pipe`,`pipe`,`pipe`]:`inherit`,env:{...b.env,...a},encoding:e.captureOutput?`utf-8`:void 0});if(e.captureOutput)return r(`Script executed successfully with output`,`info`),typeof l==`string`?l:void 0;r(`Script executed successfully`,`info`);return}finally{if(l&&y.existsSync(s))try{y.unlinkSync(s)}catch(e){r(`Warning: Failed to clean up temporary file: ${e instanceof Error?e.message:String(e)}`,`warn`)}}}async function jt(e,t,n){e.condition!=null&&e.condition!==``&&!p(e.condition,t)||await At({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 Mt={name:`exec-file`,version:`1.0.0`,taskTypes:[`exec-file`],execute:async(e,t,n)=>{n.dryRun||await jt(e.config,t,e)}};async function Nt(e,t){if(e.condition!=null&&e.condition!==``){if(!t){r(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!p(e.condition,t)){r(`Condition not met, skipping exec task`,`info`);return}}let n=e.cwd==null?b.cwd():v.join(b.cwd(),e.cwd);S(e.command,{cwd:n,stdio:`inherit`})}const Pt={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await Nt(e.config,t)}};async function Ft(e,t){if(e.condition!=null&&e.condition!==``){if(!t){r(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!p(e.condition,t)){r(`Condition not met, skipping git-init task`,`info`);return}}if(e.removeExisting){let e=v.join(b.cwd(),`.git`);y.existsSync(e)&&y.rmSync(e,{recursive:!0,force:!0})}if(S(`git init`,{stdio:`inherit`}),e.initialCommit){let t=e.message??`Initial commit`;S(`git add .`,{stdio:`inherit`}),S(`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 Ft(e.config,t)}},Lt=x(y.mkdir);async function Rt(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping mkdir task`,`info`);return}await Lt(v.join(b.cwd(),e.path),{recursive:!0}),r(`Created directory: ${e.path}`,`success`)}const zt={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await Rt(e.config,t)}},Bt=x(y.rename),Vt=x(y.stat),Ht=x(y.mkdir);async function Ut(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping move task`,`info`);return}let n=v.join(b.cwd(),e.from),i=v.join(b.cwd(),e.to);try{await Vt(n)}catch{r(`Source path does not exist: ${n}`,`warn`);return}await Ht(v.dirname(i),{recursive:!0}),await Bt(n,i),r(`Moved ${e.from} to ${e.to}`,`success`)}const Wt={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await Ut(e.config,t)}},Gt=x(y.readFile),Kt=x(y.writeFile);async function qt(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping regex-replace task`,`info`);return}let n=v.join(b.cwd(),e.file),{pattern:i}=e,a=e.flags??``,o=e.replacement||``,s=await Gt(n,`utf-8`),c=new RegExp(i,a);s=s.replace(c,u(o,t)),await Kt(n,s)}const Jt={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await qt(e.config,t)}},Yt=x(y.rename);async function Xt(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping rename task`,`info`);return}let n=v.join(b.cwd(),u(e.from,t)),i=v.join(b.cwd(),u(e.to,t));if(!y.existsSync(n)){r(`Source path does not exist: ${n}`,`warn`);return}await Yt(n,i)}const Zt={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await Xt(e.config,t)}},Qt=x(y.readFile),$t=x(y.writeFile);async function en(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping replace-in-file task`,`info`);return}let n=v.join(b.cwd(),e.file),{replacements:i}=e;if(!y.existsSync(n)){r(`File not found: ${n}, skipping`,`warn`);return}let a=await Qt(n,`utf-8`);for(let{find:e,replace:n}of i){let r=u(n,t);a=a.replace(new RegExp(e,`gu`),r)}await $t(n,a)}const tn={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await en(e.config,t)}},nn=x(y.readFile),rn=x(y.writeFile);async function an(e,t){if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping update-json task`,`info`);return}let n=v.join(b.cwd(),e.file),{updates:i}=e,o=await nn(n,`utf-8`),s=JSON.parse(o);function c(e){if(typeof e==`string`)return u(e,t);if(Array.isArray(e))return e.map(e=>c(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=c(r);return t}return e}for(let[e,t]of Object.entries(i)){let n=c(t);e.includes(`.`)?a(s,e,n):s[e]=n}await rn(n,`${JSON.stringify(s,null,2)}\n`)}const on={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await an(e.config,t)}},sn=x(y.writeFile);async function cn(e,t,n){let{allowCreate:i=!0}=e;if(e.condition!=null&&e.condition!==``&&!p(e.condition,t)){r(`Condition not met, skipping write task`,`info`);return}let a=v.join(b.cwd(),e.file);if(!y.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=N(e);if(!o.isValid)throw o.error?.includes(`cannot have both`)?T.templateHasBothTemplateAndFile():T.templateMissingTemplateOrFile();let s=await P(e,t,n),c=v.dirname(a);y.existsSync(c)||y.mkdirSync(c,{recursive:!0}),await sn(a,s)}const ln={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await cn(e.config,t,e)}};function Z(){G(`update-json`)||(U(on),U(ln),U(wt),U(Jt),U(tn),U(Et),U(Zt),U(It),U(Pt),U(Mt),U(Wt),U(xt),U(mt),U(zt))}async function un(e,t,n=!1){if(Z(),n){r(`[DRY RUN] Would execute: ${e.name}`,`info`);return}if(G(e.type)){await tt(e,t,{dryRun:n});return}throw TypeError(`Unknown task type: ${e.type}`)}async function dn(e,t,n,i,a=!1){try{return r(`[${n}/${i}] Running: ${e.name}...`,`info`),await un(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&&b.env.DEBUG!=null&&console.error(t.stack)),!1}}function fn(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 g.forTaskDependency(e);r.add(e);let o=i.get(e);if(!o)throw he.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 pn(e){let t=[];for(let n of e)if(!G(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=mn(n);t.push(...e)}return t}function mn(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=N({...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 hn(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 q.apply(i.transformers,e,{...n,...r})),r[i.id]=e)}return r}async function gn(e,t,n){if(e==null)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let i=e;if(i.type===`conditional`){if(!n){r(`Variable "${t}": conditional value requires context but none provided`,`warn`);return}if(typeof i.condition!=`string`){r(`Variable "${t}": conditional value must have a string condition`,`error`);return}try{let{evaluateCondition:e}=await import(`./utils-B6WSsvMT.js`),r=e(i.condition,n)?i.ifTrue:i.ifFalse;return typeof r==`object`&&r?await gn(r,t,n):r}catch(e){r(`Variable "${t}": failed to evaluate conditional value: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(i.type===`exec`){let e=i.value;if(typeof e!=`string`){r(`Variable "${t}": exec value must have a string command`,`error`);return}try{let t=S(e,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim();if(t.startsWith(`{`)||t.startsWith(`[`))try{return JSON.parse(t)}catch{return t}if(/^-?\d+(?:\.\d+)?$/u.test(t)){let e=Number.parseFloat(t);if(!Number.isNaN(e))return e}return t===`true`||t===`false`?t===`true`:t}catch(e){r(`Variable "${t}": failed to execute command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}else if(i.type===`static`)return i.value;else if(i.type===`interpolate`){let e=i.value;if(typeof e!=`string`){r(`Variable "${t}": interpolate value must be a string with {{variable}} placeholders`,`error`);return}if(!n)return r(`Variable "${t}": interpolate value requires context but none provided`,`warn`),e;try{return u(e,n)}catch(n){return r(`Variable "${t}": failed to interpolate interpolate value: ${n instanceof Error?n.message:`Unknown error`}`,`warn`),e}}else if(i.type===`exec-file`){if(!n){r(`Variable "${t}": exec-file value requires context but none provided`,`warn`);return}let e=i;if(typeof e.file!=`string`){r(`Variable "${t}": exec-file value must have a file path`,`error`);return}try{let t=await At({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},captureOutput:!0},n);if(t===void 0)return;let r=t.trim();if(r.startsWith(`{`)||r.startsWith(`[`))try{return JSON.parse(r)}catch{return r}if(/^-?\d+(?:\.\d+)?$/u.test(r)){let e=Number.parseFloat(r);if(!Number.isNaN(e))return e}return r===`true`||r===`false`?r===`true`:r}catch(e){r(`Variable "${t}": failed to execute script file: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}else if(i.type!==void 0){r(`Variable "${t}": unknown value type "${i.type}". Expected "static", "exec", "conditional", "interpolate", or "exec-file".`,`error`);return}return e}async function $(e,t,n){let r=new Map;for(let i of e){if(n?.skipConditional===!0&&typeof i.value==`object`&&i.value!==null&&!Array.isArray(i.value)&&i.value.type===`conditional`)continue;if(i.$templateEnabled!=null){let e={...t};for(let[t,n]of r.entries())e[t]=n;if(!await m(i.$templateEnabled,e))continue}let e={...t};for(let[t,n]of r.entries())e[t]=n;let a=await gn(i.value,i.id,e);a!==void 0&&r.set(i.id,a)}return r}function _n(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 vn(t,n){let i=e();if(!await m(n.templateEnabled,i,{lazy:!0})){s(`⊘ Template is disabled - skipping all execution`);return}n.transformers!==void 0&&n.transformers.length>0&&(o(`Registering ${n.transformers.length} transformer(s)...`),q.registerAll(n.transformers)),o(`Registering built-in plugins...`),Z(),o(`Validating task configurations...`);let a=pn(t);a.length>0&&(hn(a),b.exit(1)),o(`All tasks validated successfully`);let c=t.filter(t=>d(t.enabled,e(),{lazy:!0}));o(`Resolving task dependencies...`);let u=fn(c);o(`Sorted ${u.length} task(s) by dependencies`),s(`Welcome! Let's execute your tasks.`),n.dryRun&&l(`🔍 DRY RUN MODE - No changes will be made`),s(`This will execute your project tasks based on the defined configuration.`);let p=i,h=[...n.variables??[]];if(h.length>0){let e=_n(h);e.length>0&&(r(`❌ Variable validation errors:`,`error`),e.forEach(e=>r(` - ${e}`,`error`)),b.exit(1)),o(`Resolving variable values...`);let t=await Q(h,await $(h,p,{skipConditional:!0}),p);Object.assign(p,t),Object.keys(t).length>0&&(o(`Resolved ${Object.keys(t).length} variable(s)`),o(`Variable values: ${JSON.stringify(t)}`))}let g=n.prompts??[],_=[...g];if(_.length>0){let e=lt(_);e.length>0&&(r(`❌ Prompt validation errors:`,`error`),e.forEach(e=>r(` - ${e}`,`error`)),b.exit(1)),o(`Resolving prompt default values...`);let t=await ct(_,p);if(g.length>0){s(`📋 Collecting prompts (available to all tasks):`);let e=await st(g,t,p);Object.assign(p,e)}}if(h.length>0){let e=h.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1);if(e.length>0){o(`Re-resolving conditional variables with prompt values...`);let t=await Q(e,await $(e,p),p);Object.assign(p,t),Object.keys(t).length>0&&o(`Resolved ${Object.keys(t).length} conditional variable(s)`)}}if(!await m(n.templateEnabled,p)){s(`⊘ Template is disabled after variable resolution - skipping all execution`);return}let v=[];for(let e of u)e.$templateEnabled!=null&&!await m(e.$templateEnabled,p)||await m(e.enabled,p)&&v.push(e);if(r(`${v.length} of ${u.length} task(s) enabled for execution`,`info`),n.dryRun){await z(v,p),s(`🔍 Dry run completed - no changes were made`),s(`Run without --dry-run to apply changes`);return}o(`Calling beforeAll hook...`),await K(`beforeAll`,p);let y=v.length,x=0,S=0,ee=[],te=[];for(let e=0;e<v.length;e++){let t=v[e];t!=null&&(o(`Calling beforeTask hook for task: ${t.name}`),await K(`beforeTask`,t,p),await dn(t,p,e+1,y,n.dryRun)?(x++,ee.push(t.id),o(`Calling afterTask hook for task: ${t.name}`),await K(`afterTask`,t,p)):(await J(t.required,p)&&(S++,te.push(t.name)),o(`Calling onError hook for task: ${t.name}`),await K(`onError`,Error(`Task ${t.name} failed`),t),l(`⚠️ Task "${t.name}" failed, continuing with remaining tasks...`)))}S>0&&(r(`\n❌ Task execution completed with ${S} error(s)`,`error`),r(`Completed: ${x}/${y} tasks`,`info`),r(`Failed tasks: ${te.join(`, `)}`,`error`),b.exit(1)),o(`Calling afterAll hook...`),await K(`afterAll`,p),f(`✅ All tasks completed successfully!`),f(` Completed: ${x}/${y} tasks`)}async function yn(e,t,n={}){o(`Running templates with sequential variable/prompt resolution...`),o(`Total templates to process: ${e.length}`),o(`Registering built-in plugins...`),Z();let i=[];console.log(``),s(`📋 Collecting input...`),console.log(``);for(let t=0;t<e.length;t++){let a=e[t];if(a==null)continue;let c=`=`.repeat(60);if(o(`\n${c}`),o(`Processing template ${t+1}/${e.length}: "${a.name}"`),o(c),o(`Current config keys: ${Object.keys(n).join(`, `)}`),!await m(a.enabled,n)){s(`⊘ Template "${a.name}" is disabled - skipping`),o(` Enabled condition: ${JSON.stringify(a.enabled)}`);continue}let l=a.variables??[];if(l.length>0){o(`Processing ${l.length} variable(s) for template "${a.name}"...`);let e=_n(l);e.length>0&&(r(`❌ Variable validation errors:`,`error`),e.forEach(e=>r(` - ${e}`,`error`)),b.exit(1));let t=await Q(l,await $(l,n,{skipConditional:!0}),n);Object.assign(n,t);let i=l.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,n),n);if(s=Object.keys(e).length,Object.assign(n,e),s>0){o(`Resolved ${s} conditional variable(s)`);for(let[t,n]of Object.entries(e))o(` ${t} = ${JSON.stringify(n)}`)}}let c=Object.keys(t).length+s;if(c>0){o(`Total variables resolved for template: ${c}`);for(let[e,n]of Object.entries(t))o(` ${e} = ${JSON.stringify(n)}`)}}let u=a.prompts??[];if(u.length>0){o(`Processing ${u.length} prompt(s) for template "${a.name}"...`);let e=lt(u);e.length>0&&(r(`❌ Prompt validation errors:`,`error`),e.forEach(e=>r(` - ${e}`,`error`)),b.exit(1));let t=await st(u,await ct(u,n),n);Object.assign(n,t),o(`Collected ${Object.keys(t).length} prompt answer(s)`)}if(!await m(a.enabled,n)){s(`⊘ Template "${a.name}" became disabled after variable/prompt resolution - skipping tasks`);continue}let d=a.tasks??[];d.length>0&&(o(`Found ${d.length} task(s) in template "${a.name}" (will execute later)`),i.push(...d))}if(o(`
|
|
24
|
-
🔧 Validating and filtering all collected tasks...`),i.length===0){r(`No tasks found in any template`,`info`);return}let a=pn(i);a.length>0&&(hn(a),b.exit(1)),console.log(``),r(`🛠️ Preparing tasks...`,`info`);let c=[];for(let e of i)await m(e.enabled,n)&&c.push(e);if(console.log(``),r(`Found ${i.length} tasks (${c.length} enabled)`,`info`),r(`All tasks validated successfully`,`success`),c.length===0){r(`No enabled tasks to execute`,`info`);return}let u=fn(c);if(t.dryRun){r(`
|
|
25
|
-
🔍 Dry run - showing task changes...`,`info`),await z(u,n),r(`
|
|
26
|
-
🔍 Dry run completed - no changes were made`,`info`),r(`Run without --dry-run to apply changes`,`info`);return}console.log(``),s(`⚙️ Executing tasks...`),console.log(``),await K(`beforeAll`,n);let d=0,f=0,p=[];for(let e=0;e<u.length;e++){let r=u[e];r!=null&&(await K(`beforeTask`,r,n),await dn(r,n,e+1,u.length,t.dryRun)?(d++,await K(`afterTask`,r,n)):(await J(r.required,n)&&(f++,p.push(r.name)),await K(`onError`,Error(`Task ${r.name} failed`),r),l(`⚠️ Task "${r.name}" failed, continuing with remaining tasks...`)))}await K(`afterAll`,n),f>0&&(r(`\n❌ Task execution completed with ${f} error(s)`,`error`),r(`Completed: ${d}/${u.length} tasks`,`info`),r(`Failed tasks: ${p.join(`, `)}`,`error`),b.exit(1)),r(`Completed: ${d}/${u.length} tasks`,`success`)}export{He as A,j as B,Qe as C,rt as D,Xe as E,Ve as F,Me as G,P as H,Ye as I,Se as J,we as K,Le as L,We as M,Be as N,z as O,Ue as P,Re as R,G as S,U as T,Pe as U,M as V,N as W,Oe as X,A as Y,it as _,gn as a,W as b,un as c,lt as d,ct as f,$e as g,K as h,$ as i,R as j,ze as k,Z as l,Y as m,yn as n,Q as o,st as p,Ne as q,_n as r,fn as s,vn as t,dn as u,tt as v,et as w,nt as x,Ze as y,Fe as z};
|
package/dist/src-CboZxzVI.cjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const e=require(`./chunk-DjWAcSYV.cjs`),t=require(`./utils-Bz23aLK_.cjs`),n=require(`./run-tasks-BnqvtWj4.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){try{let o=e||[];o.length===0&&(t.a(`⚠️ No tasks defined. Use --config to specify tasks or call runWithTasks() programmatically.`,`warn`),t.a(`Example: scaffoldfy --config ./tasks.json`,`info`),r.default.exit(1)),await n.t(o,{dryRun:i,force:a,tasksFilePath:void 0})}catch(e){t.a(`❌ Task execution failed`,`error`),e instanceof Error?(t.a(`Error: ${e.message}`,`error`),r.default.env.DEBUG!=null&&console.error(e.stack)):console.error(e),r.default.exit(1)}}async function s(e,o){try{await n.t(e,{dryRun:o?.dryRun??i,force:o?.force??a,tasksFilePath:o?.tasksFilePath??void 0,...o?.variables!=null&&{variables:o.variables},...o?.prompts!=null&&{prompts:o.prompts},...o?.templateEnabled!=null&&{templateEnabled:o.templateEnabled},...o?.transformers!=null&&{transformers:o.transformers}})}catch(e){t.a(`❌ Task execution failed`,`error`),e instanceof Error?(t.a(`Error: ${e.message}`,`error`),r.default.env.DEBUG!=null&&console.error(e.stack)):console.error(e),r.default.exit(1)}}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return o}});
|
package/dist/src-TOw75kLW.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./utils-CrJkuEEG.js";import{t}from"./run-tasks-CEs2FBaf.js";import n from"node:process";const r=n.argv.includes(`--dry-run`),i=n.argv.includes(`--force`);async function a(a){try{let o=a||[];o.length===0&&(e(`⚠️ No tasks defined. Use --config to specify tasks or call runWithTasks() programmatically.`,`warn`),e(`Example: scaffoldfy --config ./tasks.json`,`info`),n.exit(1)),await t(o,{dryRun:r,force:i,tasksFilePath:void 0})}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)}}async function o(a,o){try{await t(a,{dryRun:o?.dryRun??r,force:o?.force??i,tasksFilePath:o?.tasksFilePath??void 0,...o?.variables!=null&&{variables:o.variables},...o?.prompts!=null&&{prompts:o.prompts},...o?.templateEnabled!=null&&{templateEnabled:o.templateEnabled},...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{o as n,a as t};
|
package/dist/utils-B6BwGcug.cjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const e=require(`./utils-Bz23aLK_.cjs`);exports.debug=e.d,exports.evaluateCondition=e.t,exports.evaluateEnabled=e.l,exports.evaluateEnabledAsync=e.u,exports.getGitRepoInfo=e.n,exports.getNestedProperty=e.r,exports.interpolateTemplate=e.i,exports.log=e.a,exports.logInfo=e.f,exports.logSuccess=e.m,exports.logWarn=e.h,exports.prompt=e.o,exports.promptYesNo=e.s,exports.setNestedProperty=e.c;
|
package/dist/utils-B6WSsvMT.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e,c as t,d as n,f as r,h as i,i as a,l as o,m as s,n as c,o as l,r as u,s as d,t as f,u as p}from"./utils-CrJkuEEG.js";export{n as debug,f as evaluateCondition,o as evaluateEnabled,p as evaluateEnabledAsync,c as getGitRepoInfo,u as getNestedProperty,a as interpolateTemplate,e as log,r as logInfo,s as logSuccess,i as logWarn,l as prompt,d as promptYesNo,t as setNestedProperty};
|
package/dist/utils-Bz23aLK_.cjs
DELETED
|
@@ -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:child_process`);i=e.t(i);let a=require(`node:readline`);a=e.t(a),require(`handlebars`);var o=class extends Error{constructor(e,t){super(e),this.code=t,this.name=this.constructor.name}},s=class e extends o{constructor(e,t,n){super(e,`CIRCULAR_DEPENDENCY`),this.dependencyChain=t,this.resolvedPath=n,this.name=`CircularDependencyError`}static forTemplateInheritance(t,n){let r=Array.from(t);return new e(`Circular dependency detected: ${r.join(` -> `)} -> ${n}`,r,n)}static forTaskDependency(t){return new e(`Circular dependency detected involving task: ${t}`,[t])}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,`TEMPLATE_FILE_NOT_FOUND`),this.filePath=t,this.name=`TemplateFileNotFoundError`}static forPath(t){return new e(`Template file not found: ${t}`,t)}},l=class e extends o{constructor(e,t,n){super(e,`TEMPLATE_RESOLUTION_ERROR`),this.templateFilePath=t,this.sourceUrl=n,this.name=`TemplateResolutionError`}static forRemoteTemplate(t,n){return new e(`Failed to resolve templateFile "${t}" relative to remote template "${n}"`,t,n)}},u=class e extends o{constructor(e,t,n){super(e,`TEMPLATE_FETCH_ERROR`),this.url=t,this.originalError=n,this.name=`TemplateFetchError`}static forUrl(t,n,r){return typeof n==`number`?new e(`Failed to fetch template from ${t}: ${n} ${r??``}`.trim(),t):new e(`Failed to fetch template from ${t}: ${n?.message??String(n??`Unknown error`)}`,t,n)}},d=class e extends o{constructor(e,t,n){super(e,`TEMPLATE_PARSE_ERROR`),this.filePath=t,this.originalError=n,this.name=`TemplateParseError`}static forFile(t,n){return new e(`Failed to parse template file ${t}: ${n.message}`,t,n)}},f=class e extends o{constructor(e,t){super(e,`INVALID_TEMPLATE`),this.filePath=t,this.name=`InvalidTemplateError`}static forFile(t,n){return new e(`Invalid template file ${t}: ${n}`,t)}static tasksNotArray(t){return new e(`Invalid template file ${t}: 'tasks' must be an array if provided`,t)}static missingName(t){return new e(`Invalid template file ${t}: 'name' field is required`,t)}static invalidNameFormat(t,n){return new e(`Invalid template file ${t}: 'name' field "${n}" must contain only lowercase letters, digits, and hyphens. It cannot start or end with a hyphen, and cannot contain consecutive hyphens.`,t)}};let p=!1;function m(e){p=e}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){p&&console.log(`${g.debug}${h.debug} ${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,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 j(e.value,t,n?.lazy===!0?{lazy:!0}:void 0)}return!1}async function C(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-B6BwGcug.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-B6BwGcug.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 j(e.value,t,n?.lazy===!0?{lazy:!0}:void 0)}return!1}function w(){try{let e=(0,i.execSync)(`git remote get-url origin`,{encoding:`utf-8`}).trim(),t=e.match(/github\.com[:/](?<owner>[^/]+)\/(?<name>[^/]+)$/u);if(t?.groups){let{owner:n,name:r}=t.groups,i=r;return i.endsWith(`.git`)&&(i=i.slice(0,-4)),{owner:n,name:i,url:e}}return null}catch{return null}}async function T(e,t){let n=a.default.createInterface({input:r.default.stdin,output:r.default.stdout});return new Promise(r=>{let i;i=t==null?`${e}: `:`${e} (${t}): `,n.question(i,e=>{n.close(),r(e.trim()||(t??``))})})}async function E(e,t=!1){return T(`${e} (${t?`Y/n`:`y/N`})`,t?`y`:`n`).then(e=>e.toLowerCase()===`y`||e.toLowerCase()===`yes`)}function D(e,t=`info`){console.log(`${{info:`\x1B[36m`,success:`\x1B[32m`,error:`\x1B[31m`,warn:`\x1B[33m`}[t]}${{info:`ℹ`,success:`✓`,error:`✗`,warn:`⚠`}[t]} ${e}[0m`)}function O(e,t){return e.replace(/\{\{(?<key>[\w.]+)\}\}/gu,(e,n)=>A(t,n)?.toString()??``)}function k(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 A(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 j(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)}}Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return d}});
|
package/dist/utils-CrJkuEEG.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import e from"node:path";import t from"node:fs";import n from"node:process";import{execSync as r}from"node:child_process";import i from"node:readline";import"handlebars";var a=class extends Error{constructor(e,t){super(e),this.code=t,this.name=this.constructor.name}},o=class e extends a{constructor(e,t,n){super(e,`CIRCULAR_DEPENDENCY`),this.dependencyChain=t,this.resolvedPath=n,this.name=`CircularDependencyError`}static forTemplateInheritance(t,n){let r=Array.from(t);return new e(`Circular dependency detected: ${r.join(` -> `)} -> ${n}`,r,n)}static forTaskDependency(t){return new e(`Circular dependency detected involving task: ${t}`,[t])}static forTemplateDependencies(t,n){let r=[...t,n];return new e(`Circular dependency detected in template dependencies: ${r.join(` -> `)}`,r)}},s=class e extends a{constructor(e,t){super(e,`TEMPLATE_FILE_NOT_FOUND`),this.filePath=t,this.name=`TemplateFileNotFoundError`}static forPath(t){return new e(`Template file not found: ${t}`,t)}},c=class e extends a{constructor(e,t,n){super(e,`TEMPLATE_RESOLUTION_ERROR`),this.templateFilePath=t,this.sourceUrl=n,this.name=`TemplateResolutionError`}static forRemoteTemplate(t,n){return new e(`Failed to resolve templateFile "${t}" relative to remote template "${n}"`,t,n)}},l=class e extends a{constructor(e,t,n){super(e,`TEMPLATE_FETCH_ERROR`),this.url=t,this.originalError=n,this.name=`TemplateFetchError`}static forUrl(t,n,r){return typeof n==`number`?new e(`Failed to fetch template from ${t}: ${n} ${r??``}`.trim(),t):new e(`Failed to fetch template from ${t}: ${n?.message??String(n??`Unknown error`)}`,t,n)}},u=class e extends a{constructor(e,t,n){super(e,`TEMPLATE_PARSE_ERROR`),this.filePath=t,this.originalError=n,this.name=`TemplateParseError`}static forFile(t,n){return new e(`Failed to parse template file ${t}: ${n.message}`,t,n)}},d=class e extends a{constructor(e,t){super(e,`INVALID_TEMPLATE`),this.filePath=t,this.name=`InvalidTemplateError`}static forFile(t,n){return new e(`Invalid template file ${t}: ${n}`,t)}static tasksNotArray(t){return new e(`Invalid template file ${t}: 'tasks' must be an array if provided`,t)}static missingName(t){return new e(`Invalid template file ${t}: 'name' field is required`,t)}static invalidNameFormat(t,n){return new e(`Invalid template file ${t}: 'name' field "${n}" must contain only lowercase letters, digits, and hyphens. It cannot start or end with a hyphen, and cannot contain consecutive hyphens.`,t)}};let f=!1;function p(e){f=e}const m={debug:`🐛`,info:`ℹ`,success:`✓`,warn:`⚠`,error:`✗`},h={debug:`\x1B[35m`,info:`\x1B[36m`,success:`\x1B[32m`,warn:`\x1B[33m`,error:`\x1B[31m`},g=`\x1B[0m`;function _(e){f&&console.log(`${h.debug}${m.debug} ${e}${g}`)}function v(e){console.log(`${h.info}${m.info} ${e}${g}`)}function y(e){console.log(`${h.success}${m.success} ${e}${g}`)}function b(e){console.log(`${h.warn}${m.warn} ${e}${g}`)}function x(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 A(e.value,t,n?.lazy===!0?{lazy:!0}:void 0)}return!1}async function S(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-B6WSsvMT.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-B6WSsvMT.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 A(e.value,t,n?.lazy===!0?{lazy:!0}:void 0)}return!1}function C(){try{let e=r(`git remote get-url origin`,{encoding:`utf-8`}).trim(),t=e.match(/github\.com[:/](?<owner>[^/]+)\/(?<name>[^/]+)$/u);if(t?.groups){let{owner:n,name:r}=t.groups,i=r;return i.endsWith(`.git`)&&(i=i.slice(0,-4)),{owner:n,name:i,url:e}}return null}catch{return null}}async function w(e,t){let r=i.createInterface({input:n.stdin,output:n.stdout});return new Promise(n=>{let i;i=t==null?`${e}: `:`${e} (${t}): `,r.question(i,e=>{r.close(),n(e.trim()||(t??``))})})}async function T(e,t=!1){return w(`${e} (${t?`Y/n`:`y/N`})`,t?`y`:`n`).then(e=>e.toLowerCase()===`y`||e.toLowerCase()===`yes`)}function E(e,t=`info`){console.log(`${{info:`\x1B[36m`,success:`\x1B[32m`,error:`\x1B[31m`,warn:`\x1B[33m`}[t]}${{info:`ℹ`,success:`✓`,error:`✗`,warn:`⚠`}[t]} ${e}[0m`)}function D(e,t){return e.replace(/\{\{(?<key>[\w.]+)\}\}/gu,(e,n)=>k(t,n)?.toString()??``)}function O(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 k(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 A(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&&(E(`Failed to evaluate condition: ${e}`,`warn`),t instanceof Error&&E(` Error: ${t.message}`,`warn`)),!1)}}export{a as S,l as _,E as a,c as b,O as c,_ as d,v as f,d as g,b as h,D as i,x as l,y as m,C as n,w as o,p,k as r,T as s,A as t,S as u,s as v,o as x,u as y};
|