@pixpilot/scaffoldfy 0.37.0 → 0.38.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/README.md +11 -11
- package/dist/cli.cjs +1 -1
- package/dist/cli.js +1 -1
- package/dist/config-DFR0mwj6.js +1 -0
- package/dist/config-DZmWkoaW.cjs +1 -0
- package/dist/config-inheritance-CtSb5haE.cjs +1 -0
- package/dist/config-inheritance-DLd3amMI.js +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +52 -301
- package/dist/index.d.ts +52 -301
- package/dist/index.js +1 -1
- package/dist/run-tasks-BOQ90AJk.cjs +1 -0
- package/dist/run-tasks-C0IZQ4SX.js +26 -0
- package/dist/run-tasks-CgFJyU4i.cjs +26 -0
- package/dist/run-tasks-i1yaGln9.js +1 -0
- package/dist/src-B0yHfPGS.cjs +1 -0
- package/dist/src-CfaEuN4Q.js +1 -0
- package/dist/utils-Cs2XFh4Z.cjs +1 -0
- package/dist/utils-DO-s6Uy8.js +1 -0
- package/package.json +4 -4
- package/schema/scaffoldfy.schema.json +3 -3
- package/dist/config-C8hh88Lc.js +0 -1
- package/dist/config-DmK0Erv2.cjs +0 -1
- package/dist/run-tasks-Br8zYcP5.js +0 -1
- package/dist/run-tasks-DMTj-u4M.cjs +0 -1
- package/dist/run-tasks-JGU1NDnc.js +0 -26
- package/dist/run-tasks-bN0ievNj.cjs +0 -26
- package/dist/src-D4brxyaM.js +0 -1
- package/dist/src-DbmnAuCC.cjs +0 -1
- package/dist/template-inheritance-BVct9RJf.js +0 -1
- package/dist/template-inheritance-Ds-FkR_6.cjs +0 -1
- package/dist/utils-1Uvvc2xc.cjs +0 -1
- package/dist/utils-413ckp1r.js +0 -1
- /package/dist/{config-DlJs75hK.cjs → config-CQ-mWBG5.cjs} +0 -0
- /package/dist/{config-DfRbCqsT.js → config-nfiOxhDM.js} +0 -0
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@ A flexible and powerful task automation utility for project setup, cleanup, and
|
|
|
6
6
|
|
|
7
7
|
## Features
|
|
8
8
|
|
|
9
|
-
- 🧩 **
|
|
9
|
+
- 🧩 **Configuration Inheritance** - Extend base configurations for code reuse
|
|
10
10
|
- 🔍 **Dry-Run Mode with Diff** - Preview exact changes before applying
|
|
11
11
|
- 🔌 **Plugin System** - Create custom task types and lifecycle hooks
|
|
12
12
|
- 💬 **Interactive Prompts** - Collect user input with input, select, confirm, number, and password prompts
|
|
@@ -33,7 +33,7 @@ pnpm add @pixpilot/scaffoldfy
|
|
|
33
33
|
scaffoldfy
|
|
34
34
|
|
|
35
35
|
# With custom tasks file
|
|
36
|
-
scaffoldfy --config ./
|
|
36
|
+
scaffoldfy --config ./config.json
|
|
37
37
|
|
|
38
38
|
# Preview changes (dry run)
|
|
39
39
|
scaffoldfy --dry-run
|
|
@@ -46,7 +46,7 @@ Or run without installing using npx:
|
|
|
46
46
|
npx @pixpilot/scaffoldfy
|
|
47
47
|
|
|
48
48
|
# With custom tasks file
|
|
49
|
-
npx @pixpilot/scaffoldfy --config ./
|
|
49
|
+
npx @pixpilot/scaffoldfy --config ./config.json
|
|
50
50
|
|
|
51
51
|
# Preview changes (dry run)
|
|
52
52
|
npx @pixpilot/scaffoldfy --dry-run
|
|
@@ -56,7 +56,7 @@ npx @pixpilot/scaffoldfy --dry-run
|
|
|
56
56
|
|
|
57
57
|
| Option | Description |
|
|
58
58
|
| ----------------- | ------------------------------------------------------------------------------- |
|
|
59
|
-
| `--config <path>` | Path to config file (JSON or TypeScript, default: `./
|
|
59
|
+
| `--config <path>` | Path to config file (JSON or TypeScript, default: `./scaffoldfy.json`) |
|
|
60
60
|
| `--dry-run` | Preview changes without applying them |
|
|
61
61
|
| `--no-validate` | Skip schema validation of task configuration (validation is enabled by default) |
|
|
62
62
|
| `-h, --help` | Show help message |
|
|
@@ -70,7 +70,7 @@ import { runWithTasks } from '@pixpilot/scaffoldfy';
|
|
|
70
70
|
await runWithTasks(tasks, {
|
|
71
71
|
dryRun: false,
|
|
72
72
|
force: false,
|
|
73
|
-
|
|
73
|
+
configFilePath: './config.json',
|
|
74
74
|
});
|
|
75
75
|
```
|
|
76
76
|
|
|
@@ -238,13 +238,13 @@ Create powerful file templates with Handlebars support. Files with `.hbs` extens
|
|
|
238
238
|
|
|
239
239
|
📝 **[Complete Handlebars Guide →](https://pixpilot.github.io/scaffoldfy/HANDLEBARS_TEMPLATES.html)**
|
|
240
240
|
|
|
241
|
-
###
|
|
241
|
+
### Config Inheritance
|
|
242
242
|
|
|
243
|
-
Extend base
|
|
243
|
+
Extend base configs to promote code reuse:
|
|
244
244
|
|
|
245
245
|
```json
|
|
246
246
|
{
|
|
247
|
-
"extends": "./base-
|
|
247
|
+
"extends": "./base-config.json",
|
|
248
248
|
"tasks": [
|
|
249
249
|
{
|
|
250
250
|
"id": "custom-task",
|
|
@@ -259,9 +259,9 @@ Extend base templates to promote code reuse:
|
|
|
259
259
|
}
|
|
260
260
|
```
|
|
261
261
|
|
|
262
|
-
You can extend multiple
|
|
262
|
+
You can extend multiple configs, override tasks by ID, and merge dependencies automatically.
|
|
263
263
|
|
|
264
|
-
🧬 **[Complete Inheritance Guide →](https://pixpilot.github.io/scaffoldfy/
|
|
264
|
+
🧬 **[Complete Inheritance Guide →](https://pixpilot.github.io/scaffoldfy/CONFIG_INHERITANCE.html)**
|
|
265
265
|
|
|
266
266
|
### Dry-Run Mode with Diff Preview
|
|
267
267
|
|
|
@@ -425,7 +425,7 @@ Control execution order:
|
|
|
425
425
|
- **[Interactive Prompts](https://pixpilot.github.io/scaffoldfy/PROMPTS.html)** - Collect user input
|
|
426
426
|
- **[Variables](https://pixpilot.github.io/scaffoldfy/VARIABLES.html)** - Reusable values without user interaction
|
|
427
427
|
- **[Advanced Features](https://pixpilot.github.io/scaffoldfy/FEATURES.html)** - Conditional execution, global prompts, Handlebars
|
|
428
|
-
- **[
|
|
428
|
+
- **[Configuration Inheritance](https://pixpilot.github.io/scaffoldfy/CONFIG_INHERITANCE.html)** - Extend and compose configurations
|
|
429
429
|
- **[Plugin System](https://pixpilot.github.io/scaffoldfy/PLUGINS.html)** - Create custom task types
|
|
430
430
|
- **[Dry-Run Mode](https://pixpilot.github.io/scaffoldfy/DRY_RUN.html)** - Preview changes safely
|
|
431
431
|
|
package/dist/cli.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
const e=require(`./chunk-DjWAcSYV.cjs`)
|
|
2
|
+
const e=require(`./chunk-DjWAcSYV.cjs`),t=require(`./config-inheritance-CtSb5haE.cjs`);require(`./run-tasks-CgFJyU4i.cjs`),require(`./config-CQ-mWBG5.cjs`),require(`./validate-scaffoldfy-json-Dkaz9ueq.cjs`),require(`./scaffoldfy-config-json-validator-CpEXHRsI.cjs`);const n=require(`./src-B0yHfPGS.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.O(`❌ Schema validation error:`,`error`),t.O(` ${r}`,`error`)),{valid:!1,errors:[r]}}}function g(e){t.O(`❌ Schema validation failed:`,`error`),t.O(``,`error`),t.O(`The following validation errors were found:`,`error`),t.O(``,`error`);for(let n of e)t.O(` • ${n}`,`error`);t.O(``,`error`),t.O(`Please fix these errors in your template configuration file.`,`error`),t.O(``,`error`),t.O(`For schema documentation, see: https://github.com/pixpilot/scaffoldfy/tree/main/packages/scaffoldfy/schema`,`info`)}const _=new o.Command,v=i.default.join(__dirname,`..`,`package.json`);let y=`0.0.0`;try{y=JSON.parse(r.default.readFileSync(v,`utf-8`)).version??`0.0.0`}catch{}_.name(`scaffoldfy`).description(`Automate project setup and configuration with customizable tasks`).version(y),_.option(`--dry-run`,`Run in dry mode without making any changes`).option(`--force`,`Force execution even if checks fail`).option(`--config <path>`,`Path to task configuration file (JSON or TypeScript)`,`./scaffoldfy.json`).option(`--no-validate`,`Skip schema validation of task configuration (validation is enabled by default)`).option(`--debug`,`Enable debug logging for verbose output`).action(async e=>{e.debug===!0&&t.v(!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.O(`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.O(`⚠️ No tasks found in TypeScript file or invalid format`,`warn`),t.O(`Expected default export or named export "tasks" with TaskDefinition[]`,`info`))}catch(n){t.O(`Failed to load TypeScript config file: ${e.config}`,`error`),n instanceof Error&&t.O(` Error: ${n.message}`,`error`),a.default.exit(1)}}else try{if(e.validate!==!1){t.g(`Validating task configuration against schema...`);let e=r.default.readFileSync(n,`utf-8`);h(JSON.parse(e),{silent:!1}).valid||(t.O(``,`error`),t.O(`💡 You can skip validation with --no-validate flag, but this is not recommended.`,`info`),a.default.exit(1)),t.O(`Configuration validated`,`success`)}let i=await t.a(n,{sequential:!0});if(i.templates!=null&&i.templates.length>0){let{runTemplatesSequentially:t}=await Promise.resolve().then(()=>require(`./run-tasks-BOQ90AJk.cjs`)),{createInitialConfig:r}=await Promise.resolve().then(()=>require(`./config-DZmWkoaW.cjs`));await t(i.templates,{dryRun:e.dryRun??!1,force:e.force??!1,configFilePath:n},r()),a.default.exit(0)}o=i.tasks,s=i.variables,c=i.prompts,l=i.enabled,u=i.transformers,Array.isArray(o)||(t.O(`❌ Invalid config file format`,`error`),t.O(`Expected JSON with { "tasks": [...] } structure`,`info`),a.default.exit(1))}catch(n){t.O(`Failed to load JSON config file: ${e.config}`,`error`),n instanceof Error&&t.O(` Error: ${n.message}`,`error`),a.default.exit(1)}else t.O(`Config file not found: ${e.config}`,`warn`)}let f=c!=null&&c.length>0||s!=null&&s.length>0;o.length===0&&!f&&(t.O(`❌ No tasks defined`,`error`),t.O(`Please provide tasks using one of these methods:`,`info`),t.O(` 1. Create a template-tasks.json file in the current directory`,`info`),t.O(` 2. Create a template-tasks.ts file in the current directory`,`info`),t.O(` 3. Use --config option to specify a different config file`,`info`),t.O(`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.O(`Loaded template with 0 tasks (template may only provide prompts/variables for extending)`,`info`):t.O(`Loaded ${o.length} task(s)`,`success`),await n.t(o,{dryRun:e.dryRun,force:e.force,configFilePath:d,variables:s,prompts:c,configEnabled:l,transformers:u})}catch(e){if(t.O(`❌ CLI execution failed`,`error`),e instanceof Error){t.O(`Error: ${e.message}`,`error`);let n=a.default.env.DEBUG;n!=null&&n!==``&&console.error(e.stack)}else console.error(e);a.default.exit(1)}}),_.parse(a.default.argv);
|
package/dist/cli.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import
|
|
2
|
+
import{O as e,a as t,g as n,v as r}from"./config-inheritance-DLd3amMI.js";import"./run-tasks-C0IZQ4SX.js";import"./config-nfiOxhDM.js";import"./validate-scaffoldfy-json-Cfq-nQjy.js";import"./scaffoldfy-config-json-validator-DP8-e4Yy.js";import{t as i}from"./src-CfaEuN4Q.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(t,n={}){try{let e=h(),r=g(),i=e.compile(r);if(!i(t)&&i.errors){let e=_(i.errors);return e.length===0?{valid:!0,errors:[]}:(n.silent||y(e),{valid:!1,errors:e})}return{valid:!0,errors:[]}}catch(t){let r=t instanceof Error?t.message:`Unknown error occurred during schema validation`;return n.silent||(e(`❌ Schema validation error:`,`error`),e(` ${r}`,`error`)),{valid:!1,errors:[r]}}}function y(t){e(`❌ Schema validation failed:`,`error`),e(``,`error`),e(`The following validation errors were found:`,`error`),e(``,`error`);for(let n of t)e(` • ${n}`,`error`);e(``,`error`),e(`Please fix these errors in your template configuration file.`,`error`),e(``,`error`),e(`For schema documentation, see: https://github.com/pixpilot/scaffoldfy/tree/main/packages/scaffoldfy/schema`,`info`)}const b=new l,x=a.join(f,`..`,`package.json`);let S=`0.0.0`;try{S=JSON.parse(s.readFileSync(x,`utf-8`)).version??`0.0.0`}catch{}b.name(`scaffoldfy`).description(`Automate project setup and configuration with customizable tasks`).version(S),b.option(`--dry-run`,`Run in dry mode without making any changes`).option(`--force`,`Force execution even if checks fail`).option(`--config <path>`,`Path to task configuration file (JSON or TypeScript)`,`./scaffoldfy.json`).option(`--no-validate`,`Skip schema validation of task configuration (validation is enabled by default)`).option(`--debug`,`Enable debug logging for verbose output`).action(async o=>{o.debug===!0&&r(!0);try{let r=[],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`)){e(`Loading tasks from TypeScript file: ${o.config}`,`info`);try{let t=await import(i);r=t.default??t.tasks??[],(!Array.isArray(r)||r.length===0)&&(e(`⚠️ No tasks found in TypeScript file or invalid format`,`warn`),e(`Expected default export or named export "tasks" with TaskDefinition[]`,`info`))}catch(t){e(`Failed to load TypeScript config file: ${o.config}`,`error`),t instanceof Error&&e(` Error: ${t.message}`,`error`),c.exit(1)}}else try{if(o.validate!==!1){n(`Validating task configuration against schema...`);let t=s.readFileSync(i,`utf-8`);v(JSON.parse(t),{silent:!1}).valid||(e(``,`error`),e(`💡 You can skip validation with --no-validate flag, but this is not recommended.`,`info`),c.exit(1)),e(`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-i1yaGln9.js`),{createInitialConfig:t}=await import(`./config-DFR0mwj6.js`);await e(a.templates,{dryRun:o.dryRun??!1,force:o.force??!1,configFilePath:i},t()),c.exit(0)}r=a.tasks,l=a.variables,u=a.prompts,d=a.enabled,f=a.transformers,Array.isArray(r)||(e(`❌ Invalid config file format`,`error`),e(`Expected JSON with { "tasks": [...] } structure`,`info`),c.exit(1))}catch(t){e(`Failed to load JSON config file: ${o.config}`,`error`),t instanceof Error&&e(` Error: ${t.message}`,`error`),c.exit(1)}else e(`Config file not found: ${o.config}`,`warn`)}let m=u!=null&&u.length>0||l!=null&&l.length>0;r.length===0&&!m&&(e(`❌ No tasks defined`,`error`),e(`Please provide tasks using one of these methods:`,`info`),e(` 1. Create a template-tasks.json file in the current directory`,`info`),e(` 2. Create a template-tasks.ts file in the current directory`,`info`),e(` 3. Use --config option to specify a different config file`,`info`),e(`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)),r.length===0?e(`Loaded template with 0 tasks (template may only provide prompts/variables for extending)`,`info`):e(`Loaded ${r.length} task(s)`,`success`),await i(r,{dryRun:o.dryRun,force:o.force,configFilePath:p,variables:l,prompts:u,configEnabled:d,transformers:f})}catch(t){if(e(`❌ CLI execution failed`,`error`),t instanceof Error){e(`Error: ${t.message}`,`error`);let n=c.env.DEBUG;n!=null&&n!==``&&console.error(t.stack)}else console.error(t);c.exit(1)}}),b.parse(c.argv);export{};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./config-nfiOxhDM.js";export{e as createInitialConfig};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require(`./config-CQ-mWBG5.cjs`);exports.createInitialConfig=e.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),require(`handlebars`);let a=require(`node:os`);a=e.t(a);let o=require(`node:child_process`);o=e.t(o);var s=class extends Error{constructor(e,t){super(e),this.code=t,this.name=this.constructor.name}},c=class e extends s{constructor(e,t,n){super(e,`CIRCULAR_DEPENDENCY`),this.dependencyChain=t,this.resolvedPath=n,this.name=`CircularDependencyError`}static forConfigurationInheritance(t,n){let r=Array.from(t);return new e(`Circular dependency detected: ${r.join(` -> `)} -> ${n}`,r,n)}static forTemplateInheritance(t,n){return e.forConfigurationInheritance(t,n)}static forTaskDependency(t){return new e(`Circular dependency detected involving task: ${t}`,[t])}static forTemplateDependencies(t,n){let r=[...t,n];return new e(`Circular dependency detected in template dependencies: ${r.join(` -> `)}`,r)}},l=class e extends s{constructor(e,t){super(e,`CONFIG_FILE_NOT_FOUND`),this.filePath=t,this.name=`ConfigFileNotFoundError`}static forPath(t){return new e(`Configuration file not found: ${t}`,t)}},u=class e extends s{constructor(e,t,n){super(e,`CONFIG_FETCH_ERROR`),this.url=t,this.originalError=n,this.name=`ConfigFetchError`}static forUrl(t,n,r){return typeof n==`number`?new e(`Failed to fetch configuration from ${t}: ${n} ${r??``}`.trim(),t):new e(`Failed to fetch configuration from ${t}: ${n?.message??String(n??`Unknown error`)}`,t,n)}},d=class e extends s{constructor(e,t,n){super(e,`CONFIG_PARSE_ERROR`),this.filePath=t,this.originalError=n,this.name=`ConfigParseError`}static forFile(t,n){return new e(`Failed to parse configuration file ${t}: ${n.message}`,t,n)}},f=class e extends s{constructor(e,t){super(e,`INVALID_CONFIG`),this.filePath=t,this.name=`InvalidConfigError`}static forFile(t,n){return new e(`Invalid configuration file ${t}: ${n}`,t)}static tasksNotArray(t){return new e(`Invalid configuration file ${t}: 'tasks' must be an array if provided`,t)}static missingName(t){return new e(`Invalid configuration file ${t}: 'name' field is required`,t)}static invalidNameFormat(t,n){return new e(`Invalid configuration file ${t}: 'name' field "${n}" must contain only lowercase letters, digits, and hyphens. It cannot start or end with a hyphen, and cannot contain consecutive hyphens.`,t)}},p=class e extends s{constructor(e,t,n,r){super(e,`DUPLICATE_ID`),this.id=t,this.type=n,this.existingType=r,this.name=`DuplicateIdError`}static forId(t,n,r){return new e(`Duplicate ID "${t}" found in ${n}. This ID is already used in ${r??`unknown`}`,t,n,r)}},m=class e extends s{constructor(e,t,n,r,i){super(e,`ID_CONFLICT`),this.id=t,this.type=n,this.baseSource=r,this.overrideSource=i,this.name=`IdConflictError`}static forTask(t,n,r){return new e(`Task ID conflict: "${t}" is defined in multiple templates.\n Base task from: ${n??`unknown`}\n Override task from: ${r??`unknown`}\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the task.\n Task is being extended/overridden but no override strategy was specified.`,t,`task`,n,r)}static forVariable(t){return new e(`Variable ID conflict: "${t}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the variable.\n Variable is being extended/overridden but no override strategy was specified.`,t,`variable`)}static forPrompt(t){return new e(`Prompt ID conflict: "${t}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the prompt.\n Prompt is being extended/overridden but no override strategy was specified.`,t,`prompt`)}};function ee(e){let t=new Map;for(let n of e){let e=t.get(n.name)||[];e.push(n),t.set(n.name,e)}if(Array.from(t.values()).some(e=>e.length>1))return e;let n=new Map,r=new Map,i=new Map;for(let t of e)if(n.set(t.name,t),i.set(t.name,new Set),t.dependencies!=null&&t.dependencies.length>0)for(let e of t.dependencies)i.get(t.name).add(e),r.has(e)||r.set(e,new Set),r.get(e).add(t.name);let a=new Set,o=new Map;for(let t=0;t<e.length;t++){let n=e[t],s=i.get(n.name).size>0,c=r.has(n.name)&&r.get(n.name).size>0;!s&&!c&&(a.add(n.name),o.set(n.name,t))}let s=e.filter(e=>!a.has(e.name)),l=[],u=new Set,d=new Set;function f(e){if(u.has(e))return;if(d.has(e))throw c.forTemplateDependencies(Array.from(d),e);d.add(e);let t=n.get(e);if(t!=null){let t=i.get(e);if(t!=null&&t.size>0)for(let e of t)f(e)}d.delete(e),u.add(e),t!=null&&!a.has(e)&&l.push(t)}for(let e of s)f(e.name);let p=[],m=0;for(let t=0;t<e.length;t++){let n=e[t];a.has(n.name)?p.push(n):m<l.length&&(p.push(l[m]),m++)}return p}let te=!1;const h={debug:`🐛`,info:`ℹ`,success:`✓`,warn:`⚠`,error:`✗`},g={debug:`\x1B[35m`,info:`\x1B[36m`,success:`\x1B[32m`,warn:`\x1B[33m`,error:`\x1B[31m`},_=`\x1B[0m`;function v(e){}function y(e){console.log(`${g.info}${h.info} ${e}${_}`)}function b(e){console.log(`${g.success}${h.success} ${e}${_}`)}function x(e){console.log(`${g.warn}${h.warn} ${e}${_}`)}function S(e){console.log(`${g.error}${h.error} ${e}${_}`)}function C(e,t=`info`){switch(t){case`debug`:break;case`info`:y(e);break;case`success`:b(e);break;case`warn`:x(e);break;case`error`:S(e);break}}function w(e,t,n){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch(t){return n?.lazy===!0&&t instanceof ReferenceError?!0:(n?.silent!==!0&&(C(`Failed to evaluate condition: ${e}`,`warn`),t instanceof Error&&C(` Error: ${t.message}`,`warn`)),!1)}}function ne(e,t,n){if(e===void 0)return!0;if(typeof e==`boolean`)return e;if(typeof e==`object`&&`type`in e){if(e.type===`exec`)return n?.lazy===!0;if(e.type===`condition`)return w(e.value,t,n?.lazy===!0?{lazy:!0}:void 0)}return!1}async function re(e,t,n){if(e===void 0)return!0;if(typeof e==`boolean`)return e;if(typeof e==`object`&&`type`in e){if(e.type===`exec`)try{let{execSync:n}=await import(`node:child_process`),{interpolateTemplate:r}=await Promise.resolve().then(()=>require(`./utils-Cs2XFh4Z.cjs`)),i=n(r(e.value,t),{encoding:`utf-8`}).trim();if(i===``||i===`0`)return!1;let a=i.toLowerCase();return!(a===`false`||a===`no`)}catch(t){let{log:n}=await Promise.resolve().then(()=>require(`./utils-Cs2XFh4Z.cjs`));return n(`Failed to execute enabled command: ${e.value}`,`warn`),t instanceof Error&&n(` Error: ${t.message}`,`warn`),!1}if(e.type===`condition`)return w(e.value,t,n?.lazy===!0?{lazy:!0}:void 0)}return!1}function ie(e,t){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch{return!0}}function ae(e){return e===void 0||typeof e==`boolean`?e:typeof e==`string`?{type:`condition`,value:e}:typeof e==`object`&&e&&`condition`in e&&!(`type`in e)?{type:`condition`,value:e.condition}:e}async function T(e,t){let n=ae(e);if(n===void 0)return!0;if(typeof n==`boolean`)return n;if(typeof n==`object`&&n&&`type`in n){if(n.type===`exec`)try{let{execSync:e}=await import(`node:child_process`),{interpolateTemplate:r}=await Promise.resolve().then(()=>require(`./utils-Cs2XFh4Z.cjs`));return e(r(n.value,t),{encoding:`utf-8`,stdio:`ignore`}),!0}catch(e){let{log:t}=await Promise.resolve().then(()=>require(`./utils-Cs2XFh4Z.cjs`));if(typeof e==`object`&&e&&`status`in e&&typeof e.status==`number`){let{status:r}=e;if(r>=1&&r<=255)return t(`Failed to execute required command: ${n.value}`,`warn`),e instanceof Error&&t(` Error: ${e.message}`,`warn`),!1}return t(`Failed to execute required command: ${n.value}`,`warn`),e instanceof Error&&t(` Error: ${e.message}`,`warn`),!1}if(n.type===`condition`)return ie(n.value,t)}return!0}let E=!1;function oe(e){E=e}const D={debug:`🐛`,info:`ℹ`,success:`✓`,warn:`⚠`,error:`✗`},O={debug:`\x1B[35m`,info:`\x1B[36m`,success:`\x1B[32m`,warn:`\x1B[33m`,error:`\x1B[31m`},k=`\x1B[0m`;function A(e){E&&console.log(`${O.debug}${D.debug} ${e}${k}`)}function se(e){console.log(`${O.info}${D.info} ${e}${k}`)}function ce(e){console.log(`${O.success}${D.success} ${e}${k}`)}function le(e){console.log(`${O.warn}${D.warn} ${e}${k}`)}function j(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function ue(e,t,n){let r=t.split(`.`),i=e;for(let e=0;e<r.length-1;e++){let t=r[e];t!=null&&t!==``&&((!(t in i)||typeof i[t]!=`object`||i[t]===null)&&(i[t]={}),i=i[t])}let a=r[r.length-1];a!=null&&a!==``&&(i[a]=n)}function M(e,t){let n=t.split(`.`),r=e;for(let e of n)if(e!==``&&typeof r==`object`&&r)r=r[e];else return;return r}function N(e,t){if(j(e))return e;if(t==null||t===``)return n.default.isAbsolute(e)?e:n.default.resolve(r.default.cwd(),e);if(j(t))try{let n=new URL(`.`,t);return new URL(e,n).href}catch{throw Error(`Failed to resolve file path '${e}' relative to source URL '${t}'`)}let i=n.default.dirname(t);return n.default.isAbsolute(e)?e:n.default.resolve(i,e)}async function P(e){let{file:r,sourceUrl:i,tempFileExtension:o=`.tmp`,tempFilePrefix:s=`scaffoldfy`}=e,c=r,l,u,d=!1;if(j(r)){l=r,`${l}`;let e=await W(l);d=!0;let i=a.default.tmpdir(),c=`${s}-${Date.now()}${o}`;u=n.default.join(i,c),t.default.writeFileSync(u,e,`utf-8`),`${u}`}else if(l=N(r,i),j(l)){`${l}`;let e=await W(l);d=!0;let r=a.default.tmpdir(),i=`${s}-${Date.now()}${o}`;u=n.default.join(r,i),t.default.writeFileSync(u,e,`utf-8`),`${u}`}else{if(!t.default.existsSync(l))throw Error(`File not found: ${l}`);u=l,`${u}`}return{localFilePath:u,isRemote:d,originalPath:c,resolvedPath:l}}function F(e){if(e.isRemote&&t.default.existsSync(e.localFilePath))try{t.default.unlinkSync(e.localFilePath),`${e.localFilePath}`}catch(e){`${e instanceof Error?e.message:String(e)}`}}function I(e){switch(n.default.extname(e).toLowerCase()){case`.js`:case`.cjs`:case`.mjs`:return`node`;case`.sh`:return`bash`;case`.bash`:return`bash`;case`.ps1`:return`pwsh`;default:return}}function de(e,t){switch(e){case`node`:return`node "${t}"`;case`bash`:return`bash "${t}"`;case`sh`:return`sh "${t}"`;case`pwsh`:return`pwsh -File "${t}"`;case`powershell`:return`powershell -File "${t}"`;default:return`node "${t}"`}}function fe(e){switch(e){case`node`:return`.js`;case`bash`:case`sh`:return`.sh`;case`pwsh`:case`powershell`:return`.ps1`;default:return`.js`}}async function L(e,t){let i=B(e.file,t),a=e.args?.map(e=>B(e,t))??[],s={};if(e.parameters)for(let[n,r]of Object.entries(e.parameters))s[n]=B(r,t);let c=e.cwd!=null&&e.cwd!==``?n.default.join(r.default.cwd(),B(e.cwd,t)):r.default.cwd(),l=await P({file:i,...e.sourceUrl!=null&&e.sourceUrl!==``&&{sourceUrl:e.sourceUrl},tempFileExtension:fe(e.runtime??I(i)??`node`),tempFilePrefix:`scaffoldfy-exec`}),{localFilePath:u}=l,d=e.runtime??I(u)??`node`;!e.runtime&&!I(u)&&C(`Could not detect runtime from file extension, defaulting to 'node'`,`warn`);try{let t=de(d,u),n=a.join(` `),i=n?`${t} ${n}`:t;`${i}`;let l=(0,o.execSync)(i,{cwd:c,stdio:e.captureOutput?[`pipe`,`pipe`,`pipe`]:`inherit`,env:{...r.default.env,...s},encoding:e.captureOutput?`utf-8`:void 0});return e.captureOutput&&typeof l==`string`?l:void 0}finally{F(l)}}async function R(e,t){let{id:n,contextType:r,context:i,sourceUrl:a}=t;if(e==null)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let s=e;if(s.type===`conditional`){if(!i){C(`${r} "${n}": conditional value requires context but none provided`,`warn`);return}if(typeof s.condition!=`string`){C(`${r} "${n}": conditional value must have a string condition`,`error`);return}try{let e=w(s.condition,i)?s.ifTrue:s.ifFalse;return typeof e==`object`&&e?await R(e,t):e}catch(e){C(`${r} "${n}": failed to evaluate conditional value: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(s.type===`exec`){let e=s.value;if(typeof e!=`string`){C(`${r} "${n}": exec value must have a string command`,`error`);return}try{return z((0,o.execSync)(e,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim())}catch(e){C(`${r} "${n}": failed to execute command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(s.type===`exec-file`){let e=s;if(typeof e.file!=`string`){C(`${r} "${n}": exec-file value must have a file path`,`error`);return}try{let t=await L({file:e.file,...e.runtime!=null&&e.runtime.trim()!==``&&{runtime:e.runtime},...e.args&&{args:e.args},...e.parameters&&{parameters:e.parameters},...e.cwd!==void 0&&e.cwd.trim()!==``&&{cwd:e.cwd},...a!=null&&{sourceUrl:a},captureOutput:!0},i??{});return t===void 0?void 0:z(t.trim())}catch(e){C(`${r} "${n}": failed to execute script file: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(s.type===`static`)return s.value;if(s.type===`interpolate`){let e=s.value;if(typeof e!=`string`){C(`${r} "${n}": interpolate value must be a string with {{variable}} placeholders`,`error`);return}if(!i)return C(`${r} "${n}": interpolate value requires context but none provided`,`warn`),e;try{return B(e,i)}catch(t){return C(`${r} "${n}": failed to interpolate value: ${t instanceof Error?t.message:`Unknown error`}`,`warn`),e}}if(s.type!==void 0){C(`${r} "${n}": unknown value type "${s.type}". Expected "static", "exec", "exec-file", "conditional", or "interpolate".`,`error`);return}return e}function z(e){if(e.startsWith(`{`)||e.startsWith(`[`))try{return JSON.parse(e)}catch{return e}if(/^-?\d+(?:\.\d+)?$/u.test(e)){let t=Number.parseFloat(e);if(!Number.isNaN(t))return t}return e===`true`||e===`false`?e===`true`:e}function B(e,t){return e.replace(/\{\{(?<key>[\w.]+)\}\}/gu,(e,n)=>M(t,n)?.toString()??``)}const V=(0,i.promisify)(t.default.readFile),H={template:[[`template`,`templateFile`]]};function U(e){if(e==null||e===``)return`current configuration`;if(j(e))return e;let t=r.default.cwd();return e.startsWith(t)?n.default.relative(t,e):e}async function W(e){if(j(e))return G(e);if(!t.default.existsSync(e))throw l.forPath(e);return V(e,`utf-8`)}async function G(e){try{let t=await fetch(e);if(!t.ok)throw u.forUrl(e,t.status,t.statusText);return await t.text()}catch(t){throw t instanceof Error&&t.message.includes(`Failed to fetch`)?t:u.forUrl(e,t instanceof Error?t:void 0)}}const K=new Map;async function q(e,i=new Set){let a=j(e),o;if(o=a||n.default.isAbsolute(e)?e:n.default.resolve(r.default.cwd(),e),K.has(o))return K.get(o);if(i.has(o))throw c.forConfigurationInheritance(i,o);i.add(o);let s;if(a)s=await G(o);else{if(!t.default.existsSync(o))throw l.forPath(o);s=await V(o,`utf-8`)}let u;try{u=JSON.parse(s)}catch(e){throw d.forFile(o,e instanceof Error?e:Error(String(e)))}if(u.name==null||u.name.trim()===``)throw f.missingName(o);if(!/^[a-z\d]+(?:-[a-z\d]+)*$/u.test(u.name))throw f.invalidNameFormat(o,u.name);if(u.tasks!==void 0&&!Array.isArray(u.tasks))throw f.tasksNotArray(o);u.tasks===void 0&&(u.tasks=[]);for(let e of u.tasks)e.$sourceUrl=o;if(u.variables!==void 0)for(let e of u.variables)e.$sourceUrl=o;if(u.prompts!==void 0)for(let e of u.prompts)e.$sourceUrl=o;return K.set(o,u),u}async function J(e,t,i,a,o){let s=j(e),l;if(l=s||n.default.isAbsolute(e)?e:t==null?n.default.resolve(r.default.cwd(),e):j(t)?new URL(e,t).href:n.default.resolve(t,e),i.has(l))return;if(a.has(l))throw c.forConfigurationInheritance(a,l);a.add(l);let u=await q(l),d=j(l)?new URL(`.`,l).href:n.default.dirname(l);if(u.extends!=null&&u.extends!==``){let e=Array.isArray(u.extends)?u.extends:[u.extends];for(let t of e)await J(t,d,i,a,o)}a.delete(l),i.add(l),o.push(u)}async function Y(e,t,n=new Set){let r=[];return await J(e,t,n,new Set,r),ee(r)}async function X(e,t,n=new Set){return $(await Y(e,t,n))}function Z(e,t,n){let r=new Map;for(let t of e){if(r.has(t.id))throw p.forId(t.id,`task`,r.get(t.id));r.set(t.id,`task`)}if(t!=null)for(let e of t){if(r.has(e.id))throw p.forId(e.id,`variable`,r.get(e.id));r.set(e.id,`variable`)}if(n!=null)for(let e of n){if(r.has(e.id))throw p.forId(e.id,`prompt`,r.get(e.id));r.set(e.id,`prompt`)}}function Q(e,t){if((t.override??`merge`)===`replace`){C(` → Variable "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}C(` → Variable "${t.id}" merged (value replaced)`,`info`);let n=t.$sourceUrl??e.$sourceUrl,r={...e,...t,...n!=null&&{$sourceUrl:n}};return delete r.override,r}function pe(e,t){if((t.override??`merge`)===`replace`){C(` → Prompt "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}C(` → Prompt "${t.id}" merged`,`info`);let n=t.$sourceUrl??e.$sourceUrl,r={...e,...t,...n!=null&&{$sourceUrl:n}};return delete r.override,r}function $(e){if(e.length===0)return{name:`Empty Configuration`,tasks:[]};if(e.length===1){let t=e[0];return Z(t.tasks??[],t.variables,t.prompts),t}let t=new Map,n=new Map,r=new Map,i={};for(let a of e){if(a.enabled!=null&&(i[a.name]=a.enabled),a.enabled===!1){C(`⊘ Skipping disabled configuration "${a.name}" - its tasks, prompts, and variables will not be included`,`info`);continue}if(a.prompts!=null)for(let e of a.prompts)if(r.has(e.id)){if(e.override==null)throw m.forPrompt(e.id);let t=pe(r.get(e.id),e);a.enabled!=null&&(t.$configEnabled=a.enabled),r.set(e.id,t)}else{let t={...e};a.enabled!=null&&(t.$configEnabled=a.enabled),r.set(e.id,t)}if(a.variables!=null)for(let e of a.variables)if(n.has(e.id)){if(e.override==null)throw m.forVariable(e.id);let t=Q(n.get(e.id),e);a.enabled!=null&&(t.$configEnabled=a.enabled),n.set(e.id,t)}else{let t={...e};a.enabled!=null&&(t.$configEnabled=a.enabled),n.set(e.id,t)}for(let e of a.tasks??[])if(t.has(e.id)){if(e.override==null){let n=t.get(e.id);throw m.forTask(e.id,U(n.$sourceUrl),U(e.$sourceUrl))}let n=ge(t.get(e.id),e);a.enabled!=null&&(n.$configEnabled=a.enabled),t.set(e.id,n)}else{let n={...e};a.enabled!=null&&(n.$configEnabled=a.enabled),t.set(e.id,n)}}let a=Array.from(t.values()),o=r.size>0?Array.from(r.values()):void 0,s=n.size>0?Array.from(n.values()):void 0;Z(a,s,o);let c=e[e.length-1],l={name:c.name,tasks:a};return c.description!=null&&(l.description=c.description),c.dependencies!=null&&(l.dependencies=c.dependencies),c.enabled!=null&&(l.enabled=c.enabled),o!=null&&(l.prompts=o),s!=null&&(l.variables=s),l}function me(e,t){let n=H[e];if(!n)return null;for(let e of n){let n=e.filter(e=>e in t&&t[e]!=null);if(n.length>1)return n}return null}function he(e,t,n){let r={...e},i=H[n]??[];for(let[e,n]of Object.entries(t)){for(let t of i)if(t.includes(e)){for(let n of t)n!==e&&delete r[n];break}r[e]=n}return r}function ge(e,t){if((t.override??`merge`)===`replace`){C(` → Task "${t.id}" using 'replace' strategy - completely replacing base task`,`info`),C(` Base: ${U(e.$sourceUrl)}`,`info`),C(` Override: ${U(t.$sourceUrl)}`,`info`);let{override:n,...r}=t;return r}C(` → Merging task "${t.id}"`,`info`),C(` Base: ${U(e.$sourceUrl)}`,`info`),C(` Override: ${U(t.$sourceUrl)}`,`info`);let n;if(typeof e.config==`object`&&e.config!==null&&typeof t.config==`object`&&t.config!==null){n=he(e.config,t.config,t.type);let r=me(t.type,n);r!==null&&r.length>0&&(C(` ⚠️ Warning: Conflicting config fields detected: ${r.join(`, `)}`,`warn`),C(` Please use override: "replace" or specify only one of these fields`,`warn`))}else n=t.config??e.config;let r=[...e.dependencies??[],...t.dependencies??[]],i=r.length>0?[...new Set(r)]:void 0,a=t.$sourceUrl??e.$sourceUrl,o={...e,...t,config:n,...i!=null&&{dependencies:i},...a!=null&&{$sourceUrl:a}};return delete o.override,o}function _e(){K.clear()}async function ve(e,t){if(`${e}`,t?.sequential===!0){let t=await Y(e);return`${t.length}`,{tasks:[],templates:t}}let n=await X(e);C(`Loaded ${n.tasks?.length??0} task(s)`,`info`),n.extends!=null&&n.extends!==``&&C(`Extended from: ${(Array.isArray(n.extends)?n.extends:[n.extends]).join(`, `)}`,`info`),n.prompts!=null&&n.prompts.length>0&&C(`Found ${n.prompts.length} top-level prompt(s)`,`info`),n.variables!=null&&n.variables.length>0&&C(`Found ${n.variables.length} top-level variable(s)`,`info`);let r={tasks:n.tasks??[]};return n.prompts!=null&&(r.prompts=n.prompts),n.variables!=null&&(r.variables=n.variables),n.enabled!=null&&(r.enabled=n.enabled),n.transformers!=null&&(r.transformers=n.transformers),r}Object.defineProperty(exports,`A`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`C`,{enumerable:!0,get:function(){return re}}),Object.defineProperty(exports,`D`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`E`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`M`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`O`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return ne}}),Object.defineProperty(exports,`T`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return se}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return ve}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return le}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`j`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`k`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return ue}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return $}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return _e}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return oe}}),Object.defineProperty(exports,`w`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return ce}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import e from"node:path";import t from"node:fs";import n from"node:process";import{promisify as r}from"node:util";import"handlebars";import i from"node:os";import{execSync as a}from"node:child_process";var o=class extends Error{constructor(e,t){super(e),this.code=t,this.name=this.constructor.name}},s=class e extends o{constructor(e,t,n){super(e,`CIRCULAR_DEPENDENCY`),this.dependencyChain=t,this.resolvedPath=n,this.name=`CircularDependencyError`}static forConfigurationInheritance(t,n){let r=Array.from(t);return new e(`Circular dependency detected: ${r.join(` -> `)} -> ${n}`,r,n)}static forTemplateInheritance(t,n){return e.forConfigurationInheritance(t,n)}static forTaskDependency(t){return new e(`Circular dependency detected involving task: ${t}`,[t])}static forTemplateDependencies(t,n){let r=[...t,n];return new e(`Circular dependency detected in template dependencies: ${r.join(` -> `)}`,r)}},c=class e extends o{constructor(e,t){super(e,`CONFIG_FILE_NOT_FOUND`),this.filePath=t,this.name=`ConfigFileNotFoundError`}static forPath(t){return new e(`Configuration file not found: ${t}`,t)}},l=class e extends o{constructor(e,t,n){super(e,`CONFIG_FETCH_ERROR`),this.url=t,this.originalError=n,this.name=`ConfigFetchError`}static forUrl(t,n,r){return typeof n==`number`?new e(`Failed to fetch configuration from ${t}: ${n} ${r??``}`.trim(),t):new e(`Failed to fetch configuration from ${t}: ${n?.message??String(n??`Unknown error`)}`,t,n)}},u=class e extends o{constructor(e,t,n){super(e,`CONFIG_PARSE_ERROR`),this.filePath=t,this.originalError=n,this.name=`ConfigParseError`}static forFile(t,n){return new e(`Failed to parse configuration file ${t}: ${n.message}`,t,n)}},d=class e extends o{constructor(e,t){super(e,`INVALID_CONFIG`),this.filePath=t,this.name=`InvalidConfigError`}static forFile(t,n){return new e(`Invalid configuration file ${t}: ${n}`,t)}static tasksNotArray(t){return new e(`Invalid configuration file ${t}: 'tasks' must be an array if provided`,t)}static missingName(t){return new e(`Invalid configuration file ${t}: 'name' field is required`,t)}static invalidNameFormat(t,n){return new e(`Invalid configuration file ${t}: 'name' field "${n}" must contain only lowercase letters, digits, and hyphens. It cannot start or end with a hyphen, and cannot contain consecutive hyphens.`,t)}},f=class e extends o{constructor(e,t,n,r){super(e,`DUPLICATE_ID`),this.id=t,this.type=n,this.existingType=r,this.name=`DuplicateIdError`}static forId(t,n,r){return new e(`Duplicate ID "${t}" found in ${n}. This ID is already used in ${r??`unknown`}`,t,n,r)}},p=class e extends o{constructor(e,t,n,r,i){super(e,`ID_CONFLICT`),this.id=t,this.type=n,this.baseSource=r,this.overrideSource=i,this.name=`IdConflictError`}static forTask(t,n,r){return new e(`Task ID conflict: "${t}" is defined in multiple templates.\n Base task from: ${n??`unknown`}\n Override task from: ${r??`unknown`}\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the task.\n Task is being extended/overridden but no override strategy was specified.`,t,`task`,n,r)}static forVariable(t){return new e(`Variable ID conflict: "${t}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the variable.\n Variable is being extended/overridden but no override strategy was specified.`,t,`variable`)}static forPrompt(t){return new e(`Prompt ID conflict: "${t}" is defined in multiple templates.\n You must specify an override strategy: add "override": "merge" or "override": "replace" to the prompt.\n Prompt is being extended/overridden but no override strategy was specified.`,t,`prompt`)}};function m(e){let t=new Map;for(let n of e){let e=t.get(n.name)||[];e.push(n),t.set(n.name,e)}if(Array.from(t.values()).some(e=>e.length>1))return e;let n=new Map,r=new Map,i=new Map;for(let t of e)if(n.set(t.name,t),i.set(t.name,new Set),t.dependencies!=null&&t.dependencies.length>0)for(let e of t.dependencies)i.get(t.name).add(e),r.has(e)||r.set(e,new Set),r.get(e).add(t.name);let a=new Set,o=new Map;for(let t=0;t<e.length;t++){let n=e[t],s=i.get(n.name).size>0,c=r.has(n.name)&&r.get(n.name).size>0;!s&&!c&&(a.add(n.name),o.set(n.name,t))}let c=e.filter(e=>!a.has(e.name)),l=[],u=new Set,d=new Set;function f(e){if(u.has(e))return;if(d.has(e))throw s.forTemplateDependencies(Array.from(d),e);d.add(e);let t=n.get(e);if(t!=null){let t=i.get(e);if(t!=null&&t.size>0)for(let e of t)f(e)}d.delete(e),u.add(e),t!=null&&!a.has(e)&&l.push(t)}for(let e of c)f(e.name);let p=[],m=0;for(let t=0;t<e.length;t++){let n=e[t];a.has(n.name)?p.push(n):m<l.length&&(p.push(l[m]),m++)}return p}const h={debug:`🐛`,info:`ℹ`,success:`✓`,warn:`⚠`,error:`✗`},g={debug:`\x1B[35m`,info:`\x1B[36m`,success:`\x1B[32m`,warn:`\x1B[33m`,error:`\x1B[31m`},_=`\x1B[0m`;function ee(e){}function v(e){console.log(`${g.info}${h.info} ${e}${_}`)}function y(e){console.log(`${g.success}${h.success} ${e}${_}`)}function b(e){console.log(`${g.warn}${h.warn} ${e}${_}`)}function x(e){console.log(`${g.error}${h.error} ${e}${_}`)}function S(e,t=`info`){switch(t){case`debug`:break;case`info`:v(e);break;case`success`:y(e);break;case`warn`:b(e);break;case`error`:x(e);break}}function C(e,t,n){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch(t){return n?.lazy===!0&&t instanceof ReferenceError?!0:(n?.silent!==!0&&(S(`Failed to evaluate condition: ${e}`,`warn`),t instanceof Error&&S(` Error: ${t.message}`,`warn`)),!1)}}function w(e,t,n){if(e===void 0)return!0;if(typeof e==`boolean`)return e;if(typeof e==`object`&&`type`in e){if(e.type===`exec`)return n?.lazy===!0;if(e.type===`condition`)return C(e.value,t,n?.lazy===!0?{lazy:!0}:void 0)}return!1}async function te(e,t,n){if(e===void 0)return!0;if(typeof e==`boolean`)return e;if(typeof e==`object`&&`type`in e){if(e.type===`exec`)try{let{execSync:n}=await import(`node:child_process`),{interpolateTemplate:r}=await import(`./utils-DO-s6Uy8.js`),i=n(r(e.value,t),{encoding:`utf-8`}).trim();if(i===``||i===`0`)return!1;let a=i.toLowerCase();return!(a===`false`||a===`no`)}catch(t){let{log:n}=await import(`./utils-DO-s6Uy8.js`);return n(`Failed to execute enabled command: ${e.value}`,`warn`),t instanceof Error&&n(` Error: ${t.message}`,`warn`),!1}if(e.type===`condition`)return C(e.value,t,n?.lazy===!0?{lazy:!0}:void 0)}return!1}function ne(e,t){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch{return!0}}function T(e){return e===void 0||typeof e==`boolean`?e:typeof e==`string`?{type:`condition`,value:e}:typeof e==`object`&&e&&`condition`in e&&!(`type`in e)?{type:`condition`,value:e.condition}:e}async function re(e,t){let n=T(e);if(n===void 0)return!0;if(typeof n==`boolean`)return n;if(typeof n==`object`&&n&&`type`in n){if(n.type===`exec`)try{let{execSync:e}=await import(`node:child_process`),{interpolateTemplate:r}=await import(`./utils-DO-s6Uy8.js`);return e(r(n.value,t),{encoding:`utf-8`,stdio:`ignore`}),!0}catch(e){let{log:t}=await import(`./utils-DO-s6Uy8.js`);if(typeof e==`object`&&e&&`status`in e&&typeof e.status==`number`){let{status:r}=e;if(r>=1&&r<=255)return t(`Failed to execute required command: ${n.value}`,`warn`),e instanceof Error&&t(` Error: ${e.message}`,`warn`),!1}return t(`Failed to execute required command: ${n.value}`,`warn`),e instanceof Error&&t(` Error: ${e.message}`,`warn`),!1}if(n.type===`condition`)return ne(n.value,t)}return!0}let E=!1;function D(e){E=e}const O={debug:`🐛`,info:`ℹ`,success:`✓`,warn:`⚠`,error:`✗`},k={debug:`\x1B[35m`,info:`\x1B[36m`,success:`\x1B[32m`,warn:`\x1B[33m`,error:`\x1B[31m`},A=`\x1B[0m`;function j(e){E&&console.log(`${k.debug}${O.debug} ${e}${A}`)}function ie(e){console.log(`${k.info}${O.info} ${e}${A}`)}function ae(e){console.log(`${k.success}${O.success} ${e}${A}`)}function oe(e){console.log(`${k.warn}${O.warn} ${e}${A}`)}function M(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}function se(e,t,n){let r=t.split(`.`),i=e;for(let e=0;e<r.length-1;e++){let t=r[e];t!=null&&t!==``&&((!(t in i)||typeof i[t]!=`object`||i[t]===null)&&(i[t]={}),i=i[t])}let a=r[r.length-1];a!=null&&a!==``&&(i[a]=n)}function N(e,t){let n=t.split(`.`),r=e;for(let e of n)if(e!==``&&typeof r==`object`&&r)r=r[e];else return;return r}function P(t,r){if(M(t))return t;if(r==null||r===``)return e.isAbsolute(t)?t:e.resolve(n.cwd(),t);if(M(r))try{let e=new URL(`.`,r);return new URL(t,e).href}catch{throw Error(`Failed to resolve file path '${t}' relative to source URL '${r}'`)}let i=e.dirname(r);return e.isAbsolute(t)?t:e.resolve(i,t)}async function F(n){let{file:r,sourceUrl:a,tempFileExtension:o=`.tmp`,tempFilePrefix:s=`scaffoldfy`}=n,c=r,l,u,d=!1;if(M(r)){l=r,`${l}`;let n=await G(l);d=!0;let a=i.tmpdir(),c=`${s}-${Date.now()}${o}`;u=e.join(a,c),t.writeFileSync(u,n,`utf-8`),`${u}`}else if(l=P(r,a),M(l)){`${l}`;let n=await G(l);d=!0;let r=i.tmpdir(),a=`${s}-${Date.now()}${o}`;u=e.join(r,a),t.writeFileSync(u,n,`utf-8`),`${u}`}else{if(!t.existsSync(l))throw Error(`File not found: ${l}`);u=l,`${u}`}return{localFilePath:u,isRemote:d,originalPath:c,resolvedPath:l}}function I(e){if(e.isRemote&&t.existsSync(e.localFilePath))try{t.unlinkSync(e.localFilePath),`${e.localFilePath}`}catch(e){`${e instanceof Error?e.message:String(e)}`}}function L(t){switch(e.extname(t).toLowerCase()){case`.js`:case`.cjs`:case`.mjs`:return`node`;case`.sh`:return`bash`;case`.bash`:return`bash`;case`.ps1`:return`pwsh`;default:return}}function ce(e,t){switch(e){case`node`:return`node "${t}"`;case`bash`:return`bash "${t}"`;case`sh`:return`sh "${t}"`;case`pwsh`:return`pwsh -File "${t}"`;case`powershell`:return`powershell -File "${t}"`;default:return`node "${t}"`}}function le(e){switch(e){case`node`:return`.js`;case`bash`:case`sh`:return`.sh`;case`pwsh`:case`powershell`:return`.ps1`;default:return`.js`}}async function R(t,r){let i=V(t.file,r),o=t.args?.map(e=>V(e,r))??[],s={};if(t.parameters)for(let[e,n]of Object.entries(t.parameters))s[e]=V(n,r);let c=t.cwd!=null&&t.cwd!==``?e.join(n.cwd(),V(t.cwd,r)):n.cwd(),l=await F({file:i,...t.sourceUrl!=null&&t.sourceUrl!==``&&{sourceUrl:t.sourceUrl},tempFileExtension:le(t.runtime??L(i)??`node`),tempFilePrefix:`scaffoldfy-exec`}),{localFilePath:u}=l,d=t.runtime??L(u)??`node`;!t.runtime&&!L(u)&&S(`Could not detect runtime from file extension, defaulting to 'node'`,`warn`);try{let e=ce(d,u),r=o.join(` `),i=r?`${e} ${r}`:e;`${i}`;let l=a(i,{cwd:c,stdio:t.captureOutput?[`pipe`,`pipe`,`pipe`]:`inherit`,env:{...n.env,...s},encoding:t.captureOutput?`utf-8`:void 0});return t.captureOutput&&typeof l==`string`?l:void 0}finally{I(l)}}async function z(e,t){let{id:n,contextType:r,context:i,sourceUrl:o}=t;if(e==null)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let s=e;if(s.type===`conditional`){if(!i){S(`${r} "${n}": conditional value requires context but none provided`,`warn`);return}if(typeof s.condition!=`string`){S(`${r} "${n}": conditional value must have a string condition`,`error`);return}try{let e=C(s.condition,i)?s.ifTrue:s.ifFalse;return typeof e==`object`&&e?await z(e,t):e}catch(e){S(`${r} "${n}": failed to evaluate conditional value: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(s.type===`exec`){let e=s.value;if(typeof e!=`string`){S(`${r} "${n}": exec value must have a string command`,`error`);return}try{return B(a(e,{encoding:`utf-8`,stdio:[`pipe`,`pipe`,`pipe`],timeout:1e4}).trim())}catch(e){S(`${r} "${n}": failed to execute command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(s.type===`exec-file`){let e=s;if(typeof e.file!=`string`){S(`${r} "${n}": exec-file value must have a file path`,`error`);return}try{let t=await R({file:e.file,...e.runtime!=null&&e.runtime.trim()!==``&&{runtime:e.runtime},...e.args&&{args:e.args},...e.parameters&&{parameters:e.parameters},...e.cwd!==void 0&&e.cwd.trim()!==``&&{cwd:e.cwd},...o!=null&&{sourceUrl:o},captureOutput:!0},i??{});return t===void 0?void 0:B(t.trim())}catch(e){S(`${r} "${n}": failed to execute script file: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}if(s.type===`static`)return s.value;if(s.type===`interpolate`){let e=s.value;if(typeof e!=`string`){S(`${r} "${n}": interpolate value must be a string with {{variable}} placeholders`,`error`);return}if(!i)return S(`${r} "${n}": interpolate value requires context but none provided`,`warn`),e;try{return V(e,i)}catch(t){return S(`${r} "${n}": failed to interpolate value: ${t instanceof Error?t.message:`Unknown error`}`,`warn`),e}}if(s.type!==void 0){S(`${r} "${n}": unknown value type "${s.type}". Expected "static", "exec", "exec-file", "conditional", or "interpolate".`,`error`);return}return e}function B(e){if(e.startsWith(`{`)||e.startsWith(`[`))try{return JSON.parse(e)}catch{return e}if(/^-?\d+(?:\.\d+)?$/u.test(e)){let t=Number.parseFloat(e);if(!Number.isNaN(t))return t}return e===`true`||e===`false`?e===`true`:e}function V(e,t){return e.replace(/\{\{(?<key>[\w.]+)\}\}/gu,(e,n)=>N(t,n)?.toString()??``)}const H=r(t.readFile),U={template:[[`template`,`templateFile`]]};function W(t){if(t==null||t===``)return`current configuration`;if(M(t))return t;let r=n.cwd();return t.startsWith(r)?e.relative(r,t):t}async function G(e){if(M(e))return K(e);if(!t.existsSync(e))throw c.forPath(e);return H(e,`utf-8`)}async function K(e){try{let t=await fetch(e);if(!t.ok)throw l.forUrl(e,t.status,t.statusText);return await t.text()}catch(t){throw t instanceof Error&&t.message.includes(`Failed to fetch`)?t:l.forUrl(e,t instanceof Error?t:void 0)}}const q=new Map;async function J(r,i=new Set){let a=M(r),o;if(o=a||e.isAbsolute(r)?r:e.resolve(n.cwd(),r),q.has(o))return q.get(o);if(i.has(o))throw s.forConfigurationInheritance(i,o);i.add(o);let l;if(a)l=await K(o);else{if(!t.existsSync(o))throw c.forPath(o);l=await H(o,`utf-8`)}let f;try{f=JSON.parse(l)}catch(e){throw u.forFile(o,e instanceof Error?e:Error(String(e)))}if(f.name==null||f.name.trim()===``)throw d.missingName(o);if(!/^[a-z\d]+(?:-[a-z\d]+)*$/u.test(f.name))throw d.invalidNameFormat(o,f.name);if(f.tasks!==void 0&&!Array.isArray(f.tasks))throw d.tasksNotArray(o);f.tasks===void 0&&(f.tasks=[]);for(let e of f.tasks)e.$sourceUrl=o;if(f.variables!==void 0)for(let e of f.variables)e.$sourceUrl=o;if(f.prompts!==void 0)for(let e of f.prompts)e.$sourceUrl=o;return q.set(o,f),f}async function Y(t,r,i,a,o){let c=M(t),l;if(l=c||e.isAbsolute(t)?t:r==null?e.resolve(n.cwd(),t):M(r)?new URL(t,r).href:e.resolve(r,t),i.has(l))return;if(a.has(l))throw s.forConfigurationInheritance(a,l);a.add(l);let u=await J(l),d=M(l)?new URL(`.`,l).href:e.dirname(l);if(u.extends!=null&&u.extends!==``){let e=Array.isArray(u.extends)?u.extends:[u.extends];for(let t of e)await Y(t,d,i,a,o)}a.delete(l),i.add(l),o.push(u)}async function X(e,t,n=new Set){let r=[];return await Y(e,t,n,new Set,r),m(r)}async function Z(e,t,n=new Set){return $(await X(e,t,n))}function Q(e,t,n){let r=new Map;for(let t of e){if(r.has(t.id))throw f.forId(t.id,`task`,r.get(t.id));r.set(t.id,`task`)}if(t!=null)for(let e of t){if(r.has(e.id))throw f.forId(e.id,`variable`,r.get(e.id));r.set(e.id,`variable`)}if(n!=null)for(let e of n){if(r.has(e.id))throw f.forId(e.id,`prompt`,r.get(e.id));r.set(e.id,`prompt`)}}function ue(e,t){if((t.override??`merge`)===`replace`){S(` → Variable "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}S(` → Variable "${t.id}" merged (value replaced)`,`info`);let n=t.$sourceUrl??e.$sourceUrl,r={...e,...t,...n!=null&&{$sourceUrl:n}};return delete r.override,r}function de(e,t){if((t.override??`merge`)===`replace`){S(` → Prompt "${t.id}" using 'replace' strategy`,`info`);let{override:e,...n}=t;return n}S(` → Prompt "${t.id}" merged`,`info`);let n=t.$sourceUrl??e.$sourceUrl,r={...e,...t,...n!=null&&{$sourceUrl:n}};return delete r.override,r}function $(e){if(e.length===0)return{name:`Empty Configuration`,tasks:[]};if(e.length===1){let t=e[0];return Q(t.tasks??[],t.variables,t.prompts),t}let t=new Map,n=new Map,r=new Map,i={};for(let a of e){if(a.enabled!=null&&(i[a.name]=a.enabled),a.enabled===!1){S(`⊘ Skipping disabled configuration "${a.name}" - its tasks, prompts, and variables will not be included`,`info`);continue}if(a.prompts!=null)for(let e of a.prompts)if(r.has(e.id)){if(e.override==null)throw p.forPrompt(e.id);let t=de(r.get(e.id),e);a.enabled!=null&&(t.$configEnabled=a.enabled),r.set(e.id,t)}else{let t={...e};a.enabled!=null&&(t.$configEnabled=a.enabled),r.set(e.id,t)}if(a.variables!=null)for(let e of a.variables)if(n.has(e.id)){if(e.override==null)throw p.forVariable(e.id);let t=ue(n.get(e.id),e);a.enabled!=null&&(t.$configEnabled=a.enabled),n.set(e.id,t)}else{let t={...e};a.enabled!=null&&(t.$configEnabled=a.enabled),n.set(e.id,t)}for(let e of a.tasks??[])if(t.has(e.id)){if(e.override==null){let n=t.get(e.id);throw p.forTask(e.id,W(n.$sourceUrl),W(e.$sourceUrl))}let n=me(t.get(e.id),e);a.enabled!=null&&(n.$configEnabled=a.enabled),t.set(e.id,n)}else{let n={...e};a.enabled!=null&&(n.$configEnabled=a.enabled),t.set(e.id,n)}}let a=Array.from(t.values()),o=r.size>0?Array.from(r.values()):void 0,s=n.size>0?Array.from(n.values()):void 0;Q(a,s,o);let c=e[e.length-1],l={name:c.name,tasks:a};return c.description!=null&&(l.description=c.description),c.dependencies!=null&&(l.dependencies=c.dependencies),c.enabled!=null&&(l.enabled=c.enabled),o!=null&&(l.prompts=o),s!=null&&(l.variables=s),l}function fe(e,t){let n=U[e];if(!n)return null;for(let e of n){let n=e.filter(e=>e in t&&t[e]!=null);if(n.length>1)return n}return null}function pe(e,t,n){let r={...e},i=U[n]??[];for(let[e,n]of Object.entries(t)){for(let t of i)if(t.includes(e)){for(let n of t)n!==e&&delete r[n];break}r[e]=n}return r}function me(e,t){if((t.override??`merge`)===`replace`){S(` → Task "${t.id}" using 'replace' strategy - completely replacing base task`,`info`),S(` Base: ${W(e.$sourceUrl)}`,`info`),S(` Override: ${W(t.$sourceUrl)}`,`info`);let{override:n,...r}=t;return r}S(` → Merging task "${t.id}"`,`info`),S(` Base: ${W(e.$sourceUrl)}`,`info`),S(` Override: ${W(t.$sourceUrl)}`,`info`);let n;if(typeof e.config==`object`&&e.config!==null&&typeof t.config==`object`&&t.config!==null){n=pe(e.config,t.config,t.type);let r=fe(t.type,n);r!==null&&r.length>0&&(S(` ⚠️ Warning: Conflicting config fields detected: ${r.join(`, `)}`,`warn`),S(` Please use override: "replace" or specify only one of these fields`,`warn`))}else n=t.config??e.config;let r=[...e.dependencies??[],...t.dependencies??[]],i=r.length>0?[...new Set(r)]:void 0,a=t.$sourceUrl??e.$sourceUrl,o={...e,...t,config:n,...i!=null&&{dependencies:i},...a!=null&&{$sourceUrl:a}};return delete o.override,o}function he(){q.clear()}async function ge(e,t){if(`${e}`,t?.sequential===!0){let t=await X(e);return`${t.length}`,{tasks:[],templates:t}}let n=await Z(e);S(`Loaded ${n.tasks?.length??0} task(s)`,`info`),n.extends!=null&&n.extends!==``&&S(`Extended from: ${(Array.isArray(n.extends)?n.extends:[n.extends]).join(`, `)}`,`info`),n.prompts!=null&&n.prompts.length>0&&S(`Found ${n.prompts.length} top-level prompt(s)`,`info`),n.variables!=null&&n.variables.length>0&&S(`Found ${n.variables.length} top-level variable(s)`,`info`);let r={tasks:n.tasks??[]};return n.prompts!=null&&(r.prompts=n.prompts),n.variables!=null&&(r.variables=n.variables),n.enabled!=null&&(r.enabled=n.enabled),n.transformers!=null&&(r.transformers=n.transformers),r}export{b as A,te as C,v as D,x as E,o as M,S as O,w as S,ee as T,ie as _,ge as a,oe as b,z as c,F as d,P as f,j as g,M as h,J as i,s as j,y as k,R as l,se as m,G as n,$ as o,N as p,Z as r,V as s,he as t,I as u,D as v,C as w,re as x,ae as y};
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
const e=require(`./config-inheritance-CtSb5haE.cjs`),t=require(`./run-tasks-CgFJyU4i.cjs`);require(`./config-CQ-mWBG5.cjs`);const n=require(`./validate-scaffoldfy-json-Dkaz9ueq.cjs`);require(`./scaffoldfy-config-json-validator-CpEXHRsI.cjs`);const r=require(`./src-B0yHfPGS.cjs`);exports.clearConfigurationCache=e.t,exports.clearPlugins=t.r,exports.createTaskPlugin=t.i,exports.displayTasksDiff=t.p,exports.executePluginTask=t.a,exports.getDeleteDiff=t.m,exports.getExecDiff=t.h,exports.getGitInitDiff=t.g,exports.getPlugin=t.o,exports.getPluginForTaskType=t.s,exports.getRegexReplaceDiff=t._,exports.getRenameDiff=t.v,exports.getReplaceInFileDiff=t.y,exports.getTaskDiff=t.b,exports.getUpdateJsonDiff=t.x,exports.isPluginTaskType=t.c,exports.listPlugins=t.l,exports.loadAndMergeConfiguration=e.r,exports.loadConfiguration=e.i,exports.loadTasksWithInheritance=e.a,exports.mergeConfigurations=e.o,exports.registerHooks=t.u,exports.registerPlugin=t.d,exports.runWithTasks=r.t,exports.unregisterPlugin=t.f,exports.validateScaffoldfyJsonFile=n.t;
|