@pixpilot/scaffoldfy 0.7.0 → 0.8.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 +25 -14
- package/dist/index.d.ts +25 -14
- package/dist/index.js +1 -1
- package/dist/src-CFP-DJ0M.cjs +13 -0
- package/dist/src-RfAsa6ai.js +13 -0
- package/package.json +2 -2
- package/schema/tasks.schema.json +3 -3
- package/dist/src-BhknM6fX.cjs +0 -13
- package/dist/src-_h_NfVky.js +0 -13
package/dist/cli.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
const e=require(`./src-
|
|
2
|
+
const e=require(`./src-CFP-DJ0M.cjs`);let t=require(`node:fs`);t=e.q(t);let n=require(`node:path`);n=e.q(n);let r=require(`node:process`);r=e.q(r);let i=require(`commander`);i=e.q(i);const a=1,o=new i.Command,s=n.default.join(__dirname,`..`,`package.json`);let c=`0.0.0`;try{c=JSON.parse(t.default.readFileSync(s,`utf-8`)).version??`0.0.0`}catch{}o.name(`scaffoldfy`).description(`Initialize and configure project templates with customizable tasks`).version(c),o.option(`--dry-run`,`Run in dry mode without making any changes`).option(`--force`,`Force re-initialization even if already initialized`).option(`--tasks-file <path>`,`Path to JSON file containing task definitions`,`./template-tasks.json`).option(`--tasks-ts <path>`,`Path to TypeScript file exporting tasks`,`./template-tasks.ts`).action(async i=>{try{let a=[],o;if(i.tasksTs!=null&&i.tasksTs!==``){let s=n.default.resolve(r.default.cwd(),i.tasksTs);if(t.default.existsSync(s)){e.U(`Loading tasks from TypeScript file: ${i.tasksTs}`,`info`),o=s;try{let t=await import(s);a=t.default??t.tasks??[],(!Array.isArray(a)||a.length===0)&&(e.U(`⚠️ No tasks found in TypeScript file or invalid format`,`warn`),e.U(`Expected default export or named export "tasks" with TaskDefinition[]`,`info`))}catch(t){e.U(`Failed to load TypeScript tasks file: ${i.tasksTs}`,`error`),t instanceof Error&&e.U(` Error: ${t.message}`,`error`),r.default.exit(1)}}}if(a.length===0&&i.tasksFile!=null&&i.tasksFile!==``){let s=n.default.resolve(r.default.cwd(),i.tasksFile);if(t.default.existsSync(s)){o=s;try{a=await e.a(s),Array.isArray(a)||(e.U(`❌ Invalid tasks file format`,`error`),e.U(`Expected JSON with { "tasks": [...] } structure`,`info`),r.default.exit(1))}catch(t){e.U(`Failed to load JSON tasks file: ${i.tasksFile}`,`error`),t instanceof Error&&e.U(` Error: ${t.message}`,`error`),r.default.exit(1)}}else e.U(`Tasks file not found: ${i.tasksFile}`,`warn`)}a.length===0&&(e.U(`❌ No tasks defined`,`error`),console.log(``),e.U(`Please provide tasks using one of these methods:`,`info`),e.U(` 1. Create a template-tasks.json file in the current directory`,`info`),e.U(` 2. Create a template-tasks.ts file in the current directory`,`info`),e.U(` 3. Use --tasks-file option to specify a different JSON file`,`info`),e.U(` 4. Use --tasks-ts option to specify a different TypeScript file`,`info`),console.log(``),e.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)),console.log(``),r.default.exit(1)),console.log(``),e.U(`Loaded ${a.length} task(s)`,`success`),console.log(``),await e.n(a,{dryRun:i.dryRun,force:i.force,tasksFilePath:o})}catch(t){if(e.U(`❌ CLI execution failed`,`error`),t instanceof Error){e.U(`Error: ${t.message}`,`error`);let n=r.default.env.DEBUG;n!=null&&n!==``&&console.error(t.stack)}else console.error(t);r.default.exit(1)}}),o.parse(r.default.argv);
|
package/dist/cli.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{U as e,a as t,n}from"./src-
|
|
2
|
+
import{U as e,a as t,n}from"./src-RfAsa6ai.js";import r from"node:path";import{fileURLToPath as i}from"node:url";import a from"node:fs";import o from"node:process";import{Command as s}from"commander";const c=()=>i(import.meta.url),l=(()=>r.dirname(c()))(),u=new s,d=r.join(l,`..`,`package.json`);let f=`0.0.0`;try{f=JSON.parse(a.readFileSync(d,`utf-8`)).version??`0.0.0`}catch{}u.name(`scaffoldfy`).description(`Initialize and configure project templates with customizable tasks`).version(f),u.option(`--dry-run`,`Run in dry mode without making any changes`).option(`--force`,`Force re-initialization even if already initialized`).option(`--tasks-file <path>`,`Path to JSON file containing task definitions`,`./template-tasks.json`).option(`--tasks-ts <path>`,`Path to TypeScript file exporting tasks`,`./template-tasks.ts`).action(async i=>{try{let s=[],c;if(i.tasksTs!=null&&i.tasksTs!==``){let t=r.resolve(o.cwd(),i.tasksTs);if(a.existsSync(t)){e(`Loading tasks from TypeScript file: ${i.tasksTs}`,`info`),c=t;try{let n=await import(t);s=n.default??n.tasks??[],(!Array.isArray(s)||s.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 tasks file: ${i.tasksTs}`,`error`),t instanceof Error&&e(` Error: ${t.message}`,`error`),o.exit(1)}}}if(s.length===0&&i.tasksFile!=null&&i.tasksFile!==``){let n=r.resolve(o.cwd(),i.tasksFile);if(a.existsSync(n)){c=n;try{s=await t(n),Array.isArray(s)||(e(`❌ Invalid tasks file format`,`error`),e(`Expected JSON with { "tasks": [...] } structure`,`info`),o.exit(1))}catch(t){e(`Failed to load JSON tasks file: ${i.tasksFile}`,`error`),t instanceof Error&&e(` Error: ${t.message}`,`error`),o.exit(1)}}else e(`Tasks file not found: ${i.tasksFile}`,`warn`)}s.length===0&&(e(`❌ No tasks defined`,`error`),console.log(``),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 --tasks-file option to specify a different JSON file`,`info`),e(` 4. Use --tasks-ts option to specify a different TypeScript file`,`info`),console.log(``),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)),console.log(``),o.exit(1)),console.log(``),e(`Loaded ${s.length} task(s)`,`success`),console.log(``),await n(s,{dryRun:i.dryRun,force:i.force,tasksFilePath:c})}catch(t){if(e(`❌ CLI execution failed`,`error`),t instanceof Error){e(`Error: ${t.message}`,`error`);let n=o.env.DEBUG;n!=null&&n!==``&&console.error(t.stack)}else console.error(t);o.exit(1)}}),u.parse(o.argv);export{};
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const e=require(`./src-
|
|
1
|
+
const e=require(`./src-CFP-DJ0M.cjs`);exports.callHook=e._,exports.clearPlugins=e.v,exports.clearTemplateCache=e.r,exports.collectPrompts=e.g,exports.createPlugin=e.y,exports.displayTasksDiff=e.A,exports.evaluateCondition=e.B,exports.executePluginTask=e.b,exports.executeTask=e.l,exports.getDeleteDiff=e.j,exports.getExecDiff=e.M,exports.getGitInitDiff=e.N,exports.getGitRepoInfo=e.V,exports.getPlugin=e.x,exports.getPluginForTaskType=e.S,exports.getPluginTaskDiff=e.C,exports.getRegexReplaceDiff=e.P,exports.getRenameDiff=e.F,exports.getReplaceInFileDiff=e.I,exports.getTaskDiff=e.L,exports.getTemplateDiff=e.R,exports.getUpdateJsonDiff=e.z,exports.interpolateTemplate=e.H,exports.isPluginTaskType=e.w,exports.listPlugins=e.T,exports.loadAndMergeTemplate=e.i,exports.loadInitializationState=e.d,exports.loadTasksWithInheritance=e.a,exports.loadTemplate=e.o,exports.log=e.U,exports.main=e.t,exports.mergeTemplates=e.s,exports.prompt=e.W,exports.promptYesNo=e.G,exports.registerHooks=e.E,exports.registerPlugin=e.D,exports.resolveAllDefaultValues=e.m,exports.resolveDefaultValue=e.h,exports.runTask=e.u,exports.runWithTasks=e.n,exports.saveInitializationState=e.f,exports.setNestedProperty=e.K,exports.topologicalSort=e.c,exports.unregisterPlugin=e.O,exports.validatePluginTask=e.k,exports.validatePrompts=e.p;
|
package/dist/index.d.cts
CHANGED
|
@@ -11,10 +11,10 @@ interface InitConfig {
|
|
|
11
11
|
type PromptType = 'input' | 'select' | 'confirm' | 'password' | 'number';
|
|
12
12
|
/**
|
|
13
13
|
* Default value types for prompts
|
|
14
|
-
* - '
|
|
15
|
-
* - '
|
|
14
|
+
* - 'static': Static value provided directly
|
|
15
|
+
* - 'exec': Execute a command to get the value dynamically
|
|
16
16
|
*/
|
|
17
|
-
type DefaultValueType = '
|
|
17
|
+
type DefaultValueType = 'static' | 'exec';
|
|
18
18
|
/**
|
|
19
19
|
* Default value configuration for prompts
|
|
20
20
|
*/
|
|
@@ -23,7 +23,10 @@ interface DefaultValueConfig<T = string | number | boolean> {
|
|
|
23
23
|
value: T | string;
|
|
24
24
|
}
|
|
25
25
|
/**
|
|
26
|
-
* Type for default values that can be either static or executable
|
|
26
|
+
* Type for default values that can be either static or executable.
|
|
27
|
+
* - For simple static values, pass the value directly (e.g., "default-name", 42, true)
|
|
28
|
+
* - For executable defaults, use { type: 'exec', value: 'command' }
|
|
29
|
+
* - For explicit static values, use { type: 'static', value: yourValue }
|
|
27
30
|
*/
|
|
28
31
|
type DefaultValue<T = string | number | boolean> = T | DefaultValueConfig<T>;
|
|
29
32
|
interface BasePrompt {
|
|
@@ -57,6 +60,14 @@ interface ConfirmPrompt extends BasePrompt {
|
|
|
57
60
|
default?: DefaultValue<boolean>;
|
|
58
61
|
}
|
|
59
62
|
type PromptDefinition = InputPrompt | NumberPrompt | SelectPrompt | ConfirmPrompt;
|
|
63
|
+
/**
|
|
64
|
+
* JavaScript expression evaluated at runtime to determine if a task or operation should execute.
|
|
65
|
+
* Has access to all prompt values and config variables.
|
|
66
|
+
* @example "useTypeScript === true"
|
|
67
|
+
* @example "nodeVersion >= 16 && includeTests === true"
|
|
68
|
+
* @example "packageManager === 'pnpm'"
|
|
69
|
+
*/
|
|
70
|
+
type ConditionExpression = string;
|
|
60
71
|
type TaskType = 'update-json' | 'template' | 'regex-replace' | 'replace-in-file' | 'delete' | 'rename' | 'git-init' | 'exec';
|
|
61
72
|
interface RollbackConfig {
|
|
62
73
|
type: TaskType;
|
|
@@ -69,7 +80,7 @@ interface TaskDefinition {
|
|
|
69
80
|
required: boolean;
|
|
70
81
|
enabled: boolean;
|
|
71
82
|
type: TaskType;
|
|
72
|
-
config: unknown
|
|
83
|
+
config: UpdateJsonConfig | TemplateConfig | RegexReplaceConfig | ReplaceInFileConfig | DeleteConfig | RenameConfig | GitInitConfig | ExecConfig | Record<string, unknown>;
|
|
73
84
|
dependencies?: string[];
|
|
74
85
|
rollback?: RollbackConfig;
|
|
75
86
|
prompts?: PromptDefinition[];
|
|
@@ -77,20 +88,20 @@ interface TaskDefinition {
|
|
|
77
88
|
interface UpdateJsonConfig {
|
|
78
89
|
file: string;
|
|
79
90
|
updates: Record<string, unknown>;
|
|
80
|
-
condition?:
|
|
91
|
+
condition?: ConditionExpression;
|
|
81
92
|
}
|
|
82
93
|
interface TemplateConfig {
|
|
83
94
|
file: string;
|
|
84
95
|
template?: string;
|
|
85
96
|
templateFile?: string;
|
|
86
|
-
condition?:
|
|
97
|
+
condition?: ConditionExpression;
|
|
87
98
|
}
|
|
88
99
|
interface RegexReplaceConfig {
|
|
89
100
|
file: string;
|
|
90
101
|
pattern: string;
|
|
91
102
|
flags?: string;
|
|
92
103
|
replacement: string;
|
|
93
|
-
condition?:
|
|
104
|
+
condition?: ConditionExpression;
|
|
94
105
|
}
|
|
95
106
|
interface ReplaceInFileConfig {
|
|
96
107
|
file: string;
|
|
@@ -98,27 +109,27 @@ interface ReplaceInFileConfig {
|
|
|
98
109
|
find: string;
|
|
99
110
|
replace: string;
|
|
100
111
|
}>;
|
|
101
|
-
condition?:
|
|
112
|
+
condition?: ConditionExpression;
|
|
102
113
|
}
|
|
103
114
|
interface DeleteConfig {
|
|
104
115
|
paths: string[];
|
|
105
|
-
condition?:
|
|
116
|
+
condition?: ConditionExpression;
|
|
106
117
|
}
|
|
107
118
|
interface RenameConfig {
|
|
108
119
|
from: string;
|
|
109
120
|
to: string;
|
|
110
|
-
condition?:
|
|
121
|
+
condition?: ConditionExpression;
|
|
111
122
|
}
|
|
112
123
|
interface GitInitConfig {
|
|
113
124
|
removeExisting: boolean;
|
|
114
125
|
initialCommit: boolean;
|
|
115
126
|
message?: string;
|
|
116
|
-
condition?:
|
|
127
|
+
condition?: ConditionExpression;
|
|
117
128
|
}
|
|
118
129
|
interface ExecConfig {
|
|
119
130
|
command: string;
|
|
120
131
|
cwd?: string;
|
|
121
|
-
condition?:
|
|
132
|
+
condition?: ConditionExpression;
|
|
122
133
|
}
|
|
123
134
|
interface InitializationMetadata {
|
|
124
135
|
initializedAt: string;
|
|
@@ -453,4 +464,4 @@ declare function runWithTasks(customTasks: TaskDefinition[], options?: {
|
|
|
453
464
|
tasksFilePath?: string | undefined;
|
|
454
465
|
}): Promise<void>;
|
|
455
466
|
//#endregion
|
|
456
|
-
export { BasePrompt, ConfirmPrompt, DefaultValue, DefaultValueConfig, DefaultValueType, DeleteConfig, ExecConfig, GitInitConfig, InitConfig, InitializationMetadata, InputPrompt, NumberPrompt, PluginHooks, PromptDefinition, PromptType, RegexReplaceConfig, RenameConfig, ReplaceInFileConfig, RollbackConfig, SelectPrompt, TaskDefinition, TaskPlugin, TaskType, TasksConfiguration, TemplateConfig, UpdateJsonConfig, callHook, clearPlugins, clearTemplateCache, collectPrompts, createPlugin, displayTasksDiff, evaluateCondition, executePluginTask, executeTask, getDeleteDiff, getExecDiff, getGitInitDiff, getGitRepoInfo, getPlugin, getPluginForTaskType, getPluginTaskDiff, getRegexReplaceDiff, getRenameDiff, getReplaceInFileDiff, getTaskDiff, getTemplateDiff, getUpdateJsonDiff, interpolateTemplate, isPluginTaskType, listPlugins, loadAndMergeTemplate, loadInitializationState, loadTasksWithInheritance, loadTemplate, log, main, mergeTemplates, prompt, promptYesNo, registerHooks, registerPlugin, resolveAllDefaultValues, resolveDefaultValue, runTask, runWithTasks, saveInitializationState, setNestedProperty, topologicalSort, unregisterPlugin, validatePluginTask, validatePrompts };
|
|
467
|
+
export { BasePrompt, ConditionExpression, ConfirmPrompt, DefaultValue, DefaultValueConfig, DefaultValueType, DeleteConfig, ExecConfig, GitInitConfig, InitConfig, InitializationMetadata, InputPrompt, NumberPrompt, PluginHooks, PromptDefinition, PromptType, RegexReplaceConfig, RenameConfig, ReplaceInFileConfig, RollbackConfig, SelectPrompt, TaskDefinition, TaskPlugin, TaskType, TasksConfiguration, TemplateConfig, UpdateJsonConfig, callHook, clearPlugins, clearTemplateCache, collectPrompts, createPlugin, displayTasksDiff, evaluateCondition, executePluginTask, executeTask, getDeleteDiff, getExecDiff, getGitInitDiff, getGitRepoInfo, getPlugin, getPluginForTaskType, getPluginTaskDiff, getRegexReplaceDiff, getRenameDiff, getReplaceInFileDiff, getTaskDiff, getTemplateDiff, getUpdateJsonDiff, interpolateTemplate, isPluginTaskType, listPlugins, loadAndMergeTemplate, loadInitializationState, loadTasksWithInheritance, loadTemplate, log, main, mergeTemplates, prompt, promptYesNo, registerHooks, registerPlugin, resolveAllDefaultValues, resolveDefaultValue, runTask, runWithTasks, saveInitializationState, setNestedProperty, topologicalSort, unregisterPlugin, validatePluginTask, validatePrompts };
|
package/dist/index.d.ts
CHANGED
|
@@ -11,10 +11,10 @@ interface InitConfig {
|
|
|
11
11
|
type PromptType = 'input' | 'select' | 'confirm' | 'password' | 'number';
|
|
12
12
|
/**
|
|
13
13
|
* Default value types for prompts
|
|
14
|
-
* - '
|
|
15
|
-
* - '
|
|
14
|
+
* - 'static': Static value provided directly
|
|
15
|
+
* - 'exec': Execute a command to get the value dynamically
|
|
16
16
|
*/
|
|
17
|
-
type DefaultValueType = '
|
|
17
|
+
type DefaultValueType = 'static' | 'exec';
|
|
18
18
|
/**
|
|
19
19
|
* Default value configuration for prompts
|
|
20
20
|
*/
|
|
@@ -23,7 +23,10 @@ interface DefaultValueConfig<T = string | number | boolean> {
|
|
|
23
23
|
value: T | string;
|
|
24
24
|
}
|
|
25
25
|
/**
|
|
26
|
-
* Type for default values that can be either static or executable
|
|
26
|
+
* Type for default values that can be either static or executable.
|
|
27
|
+
* - For simple static values, pass the value directly (e.g., "default-name", 42, true)
|
|
28
|
+
* - For executable defaults, use { type: 'exec', value: 'command' }
|
|
29
|
+
* - For explicit static values, use { type: 'static', value: yourValue }
|
|
27
30
|
*/
|
|
28
31
|
type DefaultValue<T = string | number | boolean> = T | DefaultValueConfig<T>;
|
|
29
32
|
interface BasePrompt {
|
|
@@ -57,6 +60,14 @@ interface ConfirmPrompt extends BasePrompt {
|
|
|
57
60
|
default?: DefaultValue<boolean>;
|
|
58
61
|
}
|
|
59
62
|
type PromptDefinition = InputPrompt | NumberPrompt | SelectPrompt | ConfirmPrompt;
|
|
63
|
+
/**
|
|
64
|
+
* JavaScript expression evaluated at runtime to determine if a task or operation should execute.
|
|
65
|
+
* Has access to all prompt values and config variables.
|
|
66
|
+
* @example "useTypeScript === true"
|
|
67
|
+
* @example "nodeVersion >= 16 && includeTests === true"
|
|
68
|
+
* @example "packageManager === 'pnpm'"
|
|
69
|
+
*/
|
|
70
|
+
type ConditionExpression = string;
|
|
60
71
|
type TaskType = 'update-json' | 'template' | 'regex-replace' | 'replace-in-file' | 'delete' | 'rename' | 'git-init' | 'exec';
|
|
61
72
|
interface RollbackConfig {
|
|
62
73
|
type: TaskType;
|
|
@@ -69,7 +80,7 @@ interface TaskDefinition {
|
|
|
69
80
|
required: boolean;
|
|
70
81
|
enabled: boolean;
|
|
71
82
|
type: TaskType;
|
|
72
|
-
config: unknown
|
|
83
|
+
config: UpdateJsonConfig | TemplateConfig | RegexReplaceConfig | ReplaceInFileConfig | DeleteConfig | RenameConfig | GitInitConfig | ExecConfig | Record<string, unknown>;
|
|
73
84
|
dependencies?: string[];
|
|
74
85
|
rollback?: RollbackConfig;
|
|
75
86
|
prompts?: PromptDefinition[];
|
|
@@ -77,20 +88,20 @@ interface TaskDefinition {
|
|
|
77
88
|
interface UpdateJsonConfig {
|
|
78
89
|
file: string;
|
|
79
90
|
updates: Record<string, unknown>;
|
|
80
|
-
condition?:
|
|
91
|
+
condition?: ConditionExpression;
|
|
81
92
|
}
|
|
82
93
|
interface TemplateConfig {
|
|
83
94
|
file: string;
|
|
84
95
|
template?: string;
|
|
85
96
|
templateFile?: string;
|
|
86
|
-
condition?:
|
|
97
|
+
condition?: ConditionExpression;
|
|
87
98
|
}
|
|
88
99
|
interface RegexReplaceConfig {
|
|
89
100
|
file: string;
|
|
90
101
|
pattern: string;
|
|
91
102
|
flags?: string;
|
|
92
103
|
replacement: string;
|
|
93
|
-
condition?:
|
|
104
|
+
condition?: ConditionExpression;
|
|
94
105
|
}
|
|
95
106
|
interface ReplaceInFileConfig {
|
|
96
107
|
file: string;
|
|
@@ -98,27 +109,27 @@ interface ReplaceInFileConfig {
|
|
|
98
109
|
find: string;
|
|
99
110
|
replace: string;
|
|
100
111
|
}>;
|
|
101
|
-
condition?:
|
|
112
|
+
condition?: ConditionExpression;
|
|
102
113
|
}
|
|
103
114
|
interface DeleteConfig {
|
|
104
115
|
paths: string[];
|
|
105
|
-
condition?:
|
|
116
|
+
condition?: ConditionExpression;
|
|
106
117
|
}
|
|
107
118
|
interface RenameConfig {
|
|
108
119
|
from: string;
|
|
109
120
|
to: string;
|
|
110
|
-
condition?:
|
|
121
|
+
condition?: ConditionExpression;
|
|
111
122
|
}
|
|
112
123
|
interface GitInitConfig {
|
|
113
124
|
removeExisting: boolean;
|
|
114
125
|
initialCommit: boolean;
|
|
115
126
|
message?: string;
|
|
116
|
-
condition?:
|
|
127
|
+
condition?: ConditionExpression;
|
|
117
128
|
}
|
|
118
129
|
interface ExecConfig {
|
|
119
130
|
command: string;
|
|
120
131
|
cwd?: string;
|
|
121
|
-
condition?:
|
|
132
|
+
condition?: ConditionExpression;
|
|
122
133
|
}
|
|
123
134
|
interface InitializationMetadata {
|
|
124
135
|
initializedAt: string;
|
|
@@ -453,4 +464,4 @@ declare function runWithTasks(customTasks: TaskDefinition[], options?: {
|
|
|
453
464
|
tasksFilePath?: string | undefined;
|
|
454
465
|
}): Promise<void>;
|
|
455
466
|
//#endregion
|
|
456
|
-
export { BasePrompt, ConfirmPrompt, DefaultValue, DefaultValueConfig, DefaultValueType, DeleteConfig, ExecConfig, GitInitConfig, InitConfig, InitializationMetadata, InputPrompt, NumberPrompt, PluginHooks, PromptDefinition, PromptType, RegexReplaceConfig, RenameConfig, ReplaceInFileConfig, RollbackConfig, SelectPrompt, TaskDefinition, TaskPlugin, TaskType, TasksConfiguration, TemplateConfig, UpdateJsonConfig, callHook, clearPlugins, clearTemplateCache, collectPrompts, createPlugin, displayTasksDiff, evaluateCondition, executePluginTask, executeTask, getDeleteDiff, getExecDiff, getGitInitDiff, getGitRepoInfo, getPlugin, getPluginForTaskType, getPluginTaskDiff, getRegexReplaceDiff, getRenameDiff, getReplaceInFileDiff, getTaskDiff, getTemplateDiff, getUpdateJsonDiff, interpolateTemplate, isPluginTaskType, listPlugins, loadAndMergeTemplate, loadInitializationState, loadTasksWithInheritance, loadTemplate, log, main, mergeTemplates, prompt, promptYesNo, registerHooks, registerPlugin, resolveAllDefaultValues, resolveDefaultValue, runTask, runWithTasks, saveInitializationState, setNestedProperty, topologicalSort, unregisterPlugin, validatePluginTask, validatePrompts };
|
|
467
|
+
export { BasePrompt, ConditionExpression, ConfirmPrompt, DefaultValue, DefaultValueConfig, DefaultValueType, DeleteConfig, ExecConfig, GitInitConfig, InitConfig, InitializationMetadata, InputPrompt, NumberPrompt, PluginHooks, PromptDefinition, PromptType, RegexReplaceConfig, RenameConfig, ReplaceInFileConfig, RollbackConfig, SelectPrompt, TaskDefinition, TaskPlugin, TaskType, TasksConfiguration, TemplateConfig, UpdateJsonConfig, callHook, clearPlugins, clearTemplateCache, collectPrompts, createPlugin, displayTasksDiff, evaluateCondition, executePluginTask, executeTask, getDeleteDiff, getExecDiff, getGitInitDiff, getGitRepoInfo, getPlugin, getPluginForTaskType, getPluginTaskDiff, getRegexReplaceDiff, getRenameDiff, getReplaceInFileDiff, getTaskDiff, getTemplateDiff, getUpdateJsonDiff, interpolateTemplate, isPluginTaskType, listPlugins, loadAndMergeTemplate, loadInitializationState, loadTasksWithInheritance, loadTemplate, log, main, mergeTemplates, prompt, promptYesNo, registerHooks, registerPlugin, resolveAllDefaultValues, resolveDefaultValue, runTask, runWithTasks, saveInitializationState, setNestedProperty, topologicalSort, unregisterPlugin, validatePluginTask, validatePrompts };
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{A as e,B as t,C as n,D as r,E as i,F as a,G as o,H as s,I as c,K as l,L as u,M as d,N as f,O as p,P as m,R as h,S as g,T as _,U as v,V as y,W as b,_ as x,a as S,b as C,c as w,d as T,f as E,g as D,h as O,i as k,j as A,k as j,l as M,m as N,n as P,o as F,p as I,r as L,s as R,t as z,u as B,v as V,w as H,x as U,y as W,z as G}from"./src-
|
|
1
|
+
import{A as e,B as t,C as n,D as r,E as i,F as a,G as o,H as s,I as c,K as l,L as u,M as d,N as f,O as p,P as m,R as h,S as g,T as _,U as v,V as y,W as b,_ as x,a as S,b as C,c as w,d as T,f as E,g as D,h as O,i as k,j as A,k as j,l as M,m as N,n as P,o as F,p as I,r as L,s as R,t as z,u as B,v as V,w as H,x as U,y as W,z as G}from"./src-RfAsa6ai.js";export{x as callHook,V as clearPlugins,L as clearTemplateCache,D as collectPrompts,W as createPlugin,e as displayTasksDiff,t as evaluateCondition,C as executePluginTask,M as executeTask,A as getDeleteDiff,d as getExecDiff,f as getGitInitDiff,y as getGitRepoInfo,U as getPlugin,g as getPluginForTaskType,n as getPluginTaskDiff,m as getRegexReplaceDiff,a as getRenameDiff,c as getReplaceInFileDiff,u as getTaskDiff,h as getTemplateDiff,G as getUpdateJsonDiff,s as interpolateTemplate,H as isPluginTaskType,_ as listPlugins,k as loadAndMergeTemplate,T as loadInitializationState,S as loadTasksWithInheritance,F as loadTemplate,v as log,z as main,R as mergeTemplates,b as prompt,o as promptYesNo,i as registerHooks,r as registerPlugin,N as resolveAllDefaultValues,O as resolveDefaultValue,B as runTask,P as runWithTasks,E as saveInitializationState,l as setNestedProperty,w as topologicalSort,p as unregisterPlugin,j as validatePluginTask,I as validatePrompts};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`node:fs`);c=s(c);let l=require(`node:path`);l=s(l);let u=require(`node:process`);u=s(u);let d=require(`node:child_process`);d=s(d);let f=require(`node:util`);f=s(f);let p=require(`node:readline`);p=s(p);let m=require(`handlebars`);m=s(m);let h=require(`@inquirer/prompts`);h=s(h);function ee(){return{}}function g(){try{let e=(0,d.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 _(e,t){let n=p.default.createInterface({input:u.default.stdin,output:u.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 v(e,t=!1){return _(`${e} (${t?`Y/n`:`y/N`})`,t?`y`:`n`).then(e=>e.toLowerCase()===`y`||e.toLowerCase()===`yes`)}function y(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)=>t[n]?.toString()??``)}function x(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 S(e,t){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch(t){return y(`Failed to evaluate condition: ${e}`,`warn`),t instanceof Error&&y(` Error: ${t.message}`,`warn`),!1}}function te(e,t){try{let n=l.default.isAbsolute(e)?e:l.default.join(u.default.cwd(),e);if(!c.default.existsSync(n))throw Error(`Template file not found: ${e}`);return ne(c.default.readFileSync(n,`utf-8`),t)}catch(t){throw y(`Failed to read template file: ${e}`,`error`),t instanceof Error&&y(` Error: ${t.message}`,`error`),t}}function ne(e,t){try{return m.default.compile(e)(t)}catch(e){throw y(`Failed to compile Handlebars template`,`error`),e instanceof Error&&y(` Error: ${e.message}`,`error`),e}}const C=(0,f.promisify)(c.default.readFile),re=2,ie=10,ae=55,w={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function T(e,t){switch(t){case`add`:return`${w.green}+ ${e}${w.reset}`;case`remove`:return`${w.red}- ${e}${w.reset}`;case`context`:return`${w.gray} ${e}${w.reset}`;default:return e}}function E(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(T(t,`context`)):(t!==void 0&&i.push(T(t,`remove`)),a!==void 0&&i.push(T(a,`add`)))}return i}async function oe(e,t){if(e.condition!=null&&e.condition!==``&&!S(e.condition,t))return`${w.yellow}⊘ Condition not met - task would be skipped${w.reset}`;let n=l.default.join(u.default.cwd(),e.file);if(!c.default.existsSync(n))return`${w.red}✗ File not found: ${e.file}${w.reset}`;try{let r=await C(n,`utf-8`),i=JSON.parse(r),a={...i};function o(e){if(typeof e==`string`)return b(e,t);if(Array.isArray(e))return e.map(e=>o(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=o(r);return t}return e}for(let[t,n]of Object.entries(e.updates)){let e=o(n);t.includes(`.`)?x(i,t,e):i[t]=e}let s=JSON.stringify(a,null,2),c=JSON.stringify(i,null,2);if(s===c)return`${w.cyan}→ No changes${w.reset}`;let l=E(s,c);return`${w.blue}File: ${e.file}${w.reset}\n${l.join(`
|
|
4
|
+
`)}`}catch(e){return`${w.red}✗ Error: ${e instanceof Error?e.message:String(e)}${w.reset}`}}async function D(e,t){if(e.condition!=null&&e.condition!==``&&!S(e.condition,t))return`${w.yellow}⊘ Condition not met - task would be skipped${w.reset}`;if(e.template==null||e.template===``)return`${w.red}✗ No template content provided for file: ${e.file}${w.reset}`;let n=l.default.join(u.default.cwd(),e.file),r=b(e.template,t);if(!c.default.existsSync(n)){let t=r.split(`
|
|
5
|
+
`).slice(0,10).join(`
|
|
6
|
+
`),n=r.split(`
|
|
7
|
+
`).length>10;return`${w.blue}File: ${e.file}${w.reset}\n${w.green}+ New file would be created${w.reset}\n${w.gray}Content preview:${w.reset}\n${t}${n?`
|
|
8
|
+
...`:``}`}try{let t=await C(n,`utf-8`);if(t===r)return`${w.cyan}→ No changes${w.reset}`;let i=E(t,r);return`${w.blue}File: ${e.file}${w.reset}\n${i.join(`
|
|
9
|
+
`)}`}catch(e){return`${w.red}✗ Error: ${e instanceof Error?e.message:String(e)}${w.reset}`}}async function O(e,t){if(e.condition!=null&&e.condition!==``&&!S(e.condition,t))return`${w.yellow}⊘ Condition not met - task would be skipped${w.reset}`;let n=l.default.join(u.default.cwd(),e.file);if(!c.default.existsSync(n))return`${w.red}✗ File not found: ${e.file}${w.reset}`;try{let r=await C(n,`utf-8`),i=new RegExp(e.pattern,e.flags??`g`),a=b(e.replacement,t),o=r.replace(i,a);if(r===o)return`${w.cyan}→ No matches found${w.reset}`;let s=E(r,o);return`${w.blue}File: ${e.file}${w.reset}\n${s.join(`
|
|
10
|
+
`)}`}catch(e){return`${w.red}✗ Error: ${e instanceof Error?e.message:String(e)}${w.reset}`}}async function k(e,t){if(e.condition!=null&&e.condition!==``&&!S(e.condition,t))return`${w.yellow}⊘ Condition not met - task would be skipped${w.reset}`;let n=l.default.join(u.default.cwd(),e.file);if(!c.default.existsSync(n))return`${w.red}✗ File not found: ${e.file}${w.reset}`;try{let r=await C(n,`utf-8`),i=r;for(let{find:n,replace:i}of e.replacements){let e=b(n,t),a=b(i,t);r=r.replace(e,a)}if(i===r)return`${w.cyan}→ No changes${w.reset}`;let a=E(i,r);return`${w.blue}File: ${e.file}${w.reset}\n${a.join(`
|
|
11
|
+
`)}`}catch(e){return`${w.red}✗ Error: ${e instanceof Error?e.message:String(e)}${w.reset}`}}function se(e,t){if(e.condition!=null&&e.condition!==``&&!S(e.condition,t))return`${w.yellow}⊘ Condition not met - task would be skipped${w.reset}`;let n=e.paths.map(e=>b(e,t)).filter(e=>c.default.existsSync(l.default.join(u.default.cwd(),e)));return n.length===0?`${w.cyan}→ No files/directories to delete${w.reset}`:`${w.red}Would delete:${w.reset}\n${n.map(e=>`${w.red} - ${e}${w.reset}`).join(`
|
|
12
|
+
`)}`}function A(e,t){if(e.condition!=null&&e.condition!==``&&!S(e.condition,t))return`${w.yellow}⊘ Condition not met - task would be skipped${w.reset}`;let n=b(e.from,t),r=b(e.to,t),i=l.default.join(u.default.cwd(),n),a=l.default.join(u.default.cwd(),r);return c.default.existsSync(i)?c.default.existsSync(a)?`${w.yellow}⚠ Destination already exists: ${r}${w.reset}\n${w.cyan}Would rename: ${n} → ${r}${w.reset}`:`${w.cyan}Would rename: ${n} → ${r}${w.reset}`:`${w.red}✗ Source not found: ${n}${w.reset}`}function j(e){if(e.condition!=null&&e.condition!==``)return`${w.yellow}⊘ Condition check skipped in dry-run${w.reset}`;let t=l.default.join(u.default.cwd(),`.git`),n=c.default.existsSync(t),r=[];if(e.removeExisting&&n&&r.push(`${w.red}Would remove existing .git directory${w.reset}`),r.push(`${w.green}Would initialize git repository${w.reset}`),e.initialCommit){let t=e.message??`Initial commit`;r.push(`${w.green}Would create initial commit: "${t}"${w.reset}`)}return r.join(`
|
|
13
|
+
`)}function M(e,t){if(e.condition!=null&&e.condition!==``&&!S(e.condition,t))return`${w.yellow}⊘ Condition not met - task would be skipped${w.reset}`;let n=b(e.command,t),r=e.cwd==null?u.default.cwd():b(e.cwd,t);return`${w.yellow}Would execute:${w.reset}\n${w.cyan} Command: ${n}${w.reset}\n${w.cyan} Working directory: ${r}${w.reset}`}async function N(e,t){try{switch(e.type){case`update-json`:return await oe(e.config,t);case`template`:return await D(e.config,t);case`regex-replace`:return await O(e.config,t);case`replace-in-file`:return await k(e.config,t);case`delete`:return se(e.config,t);case`rename`:return A(e.config,t);case`git-init`:return j(e.config);case`exec`:return M(e.config,t);default:{let t=e.type;return`${w.yellow}⚠ Diff not available for task type: ${t}${w.reset}`}}}catch(e){return`${w.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${w.reset}`}}async function P(e,t){console.log(``),console.log(`${w.blue}═══════════════════════════════════════════════════════${w.reset}`),console.log(`${w.blue} DRY RUN - Preview of changes${w.reset}`),console.log(`${w.blue}═══════════════════════════════════════════════════════${w.reset}`),console.log(``);for(let n of e){console.log(`${w.cyan}▶ Task: ${n.name}${w.reset}`),console.log(`${w.gray} ${n.description}${w.reset}`),console.log(``);let e=await N(n,t);console.log(e),console.log(``),console.log(`${w.gray}${`─`.repeat(55)}${w.reset}`),console.log(``)}console.log(`${w.blue}═══════════════════════════════════════════════════════${w.reset}`),console.log(`${w.yellow} No changes were applied (dry-run mode)${w.reset}`),console.log(`${w.blue}═══════════════════════════════════════════════════════${w.reset}`),console.log(``)}const F=new Map,I={},L=new Map;function ce(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(F.has(e.name))throw TypeError(`Plugin ${e.name} is already registered`);for(let t of e.taskTypes)if(L.has(t)){let e=L.get(t);throw TypeError(`Task type "${t}" is already registered by plugin "${e}"`)}F.set(e.name,e);for(let t of e.taskTypes)L.set(t,e.name);y(`✓ Registered plugin: ${e.name}${e.version==null?``:` v${e.version}`}`,`info`)}function le(e){let t=F.get(e);if(t!=null){for(let e of t.taskTypes)L.delete(e);F.delete(e)}}function ue(e){return F.get(e)}function R(e){let t=L.get(e);if(t!=null)return F.get(t)}function z(e){return L.has(e)}function de(){return Array.from(F.keys())}function fe(){F.clear(),L.clear()}function pe(e){e.beforeAll!=null&&(I.beforeAll=e.beforeAll),e.afterAll!=null&&(I.afterAll=e.afterAll),e.beforeTask!=null&&(I.beforeTask=e.beforeTask),e.afterTask!=null&&(I.afterTask=e.afterTask),e.onError!=null&&(I.onError=e.onError)}async function B(e,...t){let n=I[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){y(`Error in ${e} hook: ${t instanceof Error?t.message:String(t)}`,`error`)}}async function V(e,t,n){let r=R(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}async function me(e,t){let n=R(e.type);if(!(n==null||n.getDiff==null))return n.getDiff(e,t)}function he(e){let t=R(e.type);return t==null?[`No plugin found for task type: ${e.type}`]:t.validate==null?[]:t.validate(e)}function ge(e,t,n,r){return{name:e,...r?.version!=null&&{version:r.version},taskTypes:[t],execute:n,...r?.getDiff!=null&&{getDiff:r.getDiff},...r?.validate!=null&&{validate:r.validate}}}async function H(e,t=new Map){let n={};if(e.length===0)return n;for(let r of e)try{let e,i=t.get(r.id);switch(r.type){case`input`:{let t={message:r.message};if(i!==void 0&&(t.default=String(i)),r.required!==void 0&&(t.required=r.required),e=await(0,h.input)(t),r.required&&(e==null||typeof e==`string`&&e.trim()===``))throw y(`${r.message} is required`,`error`),Error(`Prompt "${r.id}" is required`);break}case`password`:if(e=await(0,h.password)({message:r.message,mask:`*`}),r.required&&(e==null||typeof e==`string`&&e.trim()===``))throw y(`${r.message} is required`,`error`),Error(`Prompt "${r.id}" is required`);break;case`number`:{let t={message:r.message};if(i!==void 0&&(t.default=Number(i)),r.required!==void 0&&(t.required=r.required),r.min!==void 0&&(t.min=r.min),r.max!==void 0&&(t.max=r.max),e=await(0,h.number)(t),r.required&&e==null)throw y(`${r.message} is required`,`error`),Error(`Prompt "${r.id}" is required`);break}case`select`:{let t={message:r.message,choices:r.choices.map(e=>({name:e.name,value:e.value}))};i!==void 0&&(t.default=i),e=await(0,h.select)(t);break}case`confirm`:{let t=i===void 0?!1:!!i;e=await(0,h.confirm)({message:r.message,default:t});break}default:throw y(`Unknown prompt type: ${r.type}`,`error`),Error(`Unknown prompt type: ${r.type}`)}n[r.id]=e}catch(e){throw e instanceof Error&&y(`Failed to collect prompt "${r.id}": ${e.message}`,`error`),e}return console.log(``),n}async function U(e,t){if(e===void 0)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let n=e;if(n.type===`exec`){let e=n.value;if(typeof e!=`string`){y(`Prompt "${t}": exec default value must have a string command`,`error`);return}try{let t=(0,d.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){y(`Prompt "${t}": failed to execute default value command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}else if(n.type===`static`)return n.value;return e}async function W(e){let t=new Map,n=e.map(async e=>{if(e.default!==void 0){let n=await U(e.default,e.id);n!==void 0&&t.set(e.id,n)}});return await Promise.all(n),t}function G(e){let t=[],n=new Set,r=new Set,i=new Set;for(let a of e){if(n.has(a.id)&&t.push(`Duplicate prompt ID: ${a.id}`),n.add(a.id),a.global?r.add(a.id):(r.has(a.id)&&t.push(`Prompt ID "${a.id}" is used as both global and task-specific. Use unique IDs or mark all instances as global.`),i.add(a.id)),a.global&&i.has(a.id)&&t.push(`Prompt ID "${a.id}" is used as both global and task-specific. Use unique IDs or mark all instances as global.`),/^[\w-]+$/u.test(a.id)||t.push(`Invalid prompt ID "${a.id}": must contain only alphanumeric characters, underscores, and hyphens`),(!a.message||a.message.trim()===``)&&t.push(`Prompt "${a.id}" must have a non-empty message`),a.type===`select`){a.choices.length===0&&t.push(`Select prompt "${a.id}" must have at least one choice`);for(let e of a.choices)(!e.name||e.name.trim()===``)&&t.push(`Select prompt "${a.id}" has a choice with empty name`),e.value===void 0&&t.push(`Select prompt "${a.id}" has a choice with undefined value`)}a.type===`number`&&a.min!==void 0&&a.max!==void 0&&a.min>a.max&&t.push(`Number prompt "${a.id}" has min greater than max`)}return t}const K=`.scaffoldfyialized`;function q(){let e=l.default.join(u.default.cwd(),K);if(!c.default.existsSync(e))return null;try{let t=c.default.readFileSync(e,`utf-8`);return JSON.parse(t)}catch{return null}}function J(e,t,n=!1){if(n)return;let r=l.default.join(u.default.cwd(),`package.json`),i=`0.0.0`;try{i=JSON.parse(c.default.readFileSync(r,`utf-8`)).version??`0.0.0`}catch{}let a={initializedAt:new Date().toISOString(),config:e,completedTasks:t,version:i},o=l.default.join(u.default.cwd(),K);c.default.writeFileSync(o,JSON.stringify(a,null,2))}const Y=(0,f.promisify)(c.default.readFile),X=(0,f.promisify)(c.default.writeFile),_e=(0,f.promisify)(c.default.rename),ve=2;async function ye(e,t){if(e.condition!=null&&e.condition!==``&&!S(e.condition,t)){y(`Condition not met, skipping update-json task`,`info`);return}let n=l.default.join(u.default.cwd(),e.file),{updates:r}=e,i=await Y(n,`utf-8`),a=JSON.parse(i);function o(e){if(typeof e==`string`)return b(e,t);if(Array.isArray(e))return e.map(e=>o(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=o(r);return t}return e}for(let[e,t]of Object.entries(r)){let n=o(t);e.includes(`.`)?x(a,e,n):a[e]=n}await X(n,`${JSON.stringify(a,null,2)}\n`)}async function be(e,t){if(e.condition!=null&&e.condition!==``&&!S(e.condition,t)){y(`Condition not met, skipping template task`,`info`);return}let n=l.default.join(u.default.cwd(),e.file),r=e.template!=null&&e.template!==``,i=e.templateFile!=null&&e.templateFile!==``;if(!r&&!i)throw Error(`Template task requires either "template" (inline) or "templateFile" (file path) to be specified`);if(r&&i)throw Error(`Template task cannot have both "template" and "templateFile" specified. Use one or the other.`);let a;if(i&&e.templateFile.endsWith(`.hbs`))a=te(e.templateFile,t);else if(i){let n=e.templateFile,r=l.default.isAbsolute(n)?n:l.default.join(u.default.cwd(),n);if(!c.default.existsSync(r))throw Error(`Template file not found: ${n}`);a=b(c.default.readFileSync(r,`utf-8`),t)}else a=b(e.template,t);await X(n,a)}async function xe(e,t){if(e.condition!=null&&e.condition!==``&&!S(e.condition,t)){y(`Condition not met, skipping regex-replace task`,`info`);return}let n=l.default.join(u.default.cwd(),e.file),{pattern:r}=e,i=e.flags??``,a=e.replacement||``,o=await Y(n,`utf-8`),s=new RegExp(r,i);o=o.replace(s,b(a,t)),await X(n,o)}async function Se(e,t){if(e.condition!=null&&e.condition!==``&&!S(e.condition,t)){y(`Condition not met, skipping replace-in-file task`,`info`);return}let n=l.default.join(u.default.cwd(),e.file),{replacements:r}=e;if(!c.default.existsSync(n)){y(`File not found: ${n}, skipping`,`warn`);return}let i=await Y(n,`utf-8`);for(let{find:e,replace:n}of r){let r=b(n,t);i=i.replace(new RegExp(e,`gu`),r)}await X(n,i)}async function Ce(e,t){let{paths:n,condition:r}=e;if(r!=null&&r!==``){if(!t){y(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!S(r,t)){y(`Condition not met, skipping deletion`,`info`);return}}for(let e of n){let t=l.default.join(u.default.cwd(),e);c.default.existsSync(t)&&c.default.rmSync(t,{recursive:!0,force:!0})}}async function we(e,t){if(e.condition!=null&&e.condition!==``&&!S(e.condition,t)){y(`Condition not met, skipping rename task`,`info`);return}let n=l.default.join(u.default.cwd(),b(e.from,t)),r=l.default.join(u.default.cwd(),b(e.to,t));if(!c.default.existsSync(n)){y(`Source path does not exist: ${n}`,`warn`);return}await _e(n,r)}async function Te(e,t){if(e.condition!=null&&e.condition!==``){if(!t){y(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!S(e.condition,t)){y(`Condition not met, skipping git-init task`,`info`);return}}if(e.removeExisting){let e=l.default.join(u.default.cwd(),`.git`);c.default.existsSync(e)&&c.default.rmSync(e,{recursive:!0,force:!0})}if((0,d.execSync)(`git init`,{stdio:`inherit`}),e.initialCommit){let t=e.message??`Initial commit`;(0,d.execSync)(`git add .`,{stdio:`inherit`}),(0,d.execSync)(`git commit -m "${t}"`,{stdio:`inherit`})}}async function Ee(e,t){if(e.condition!=null&&e.condition!==``){if(!t){y(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!S(e.condition,t)){y(`Condition not met, skipping exec task`,`info`);return}}let n=e.cwd==null?u.default.cwd():l.default.join(u.default.cwd(),e.cwd);(0,d.execSync)(e.command,{cwd:n,stdio:`inherit`})}async function De(e,t,n=!1){if(n){y(`[DRY RUN] Would execute: ${e.name}`,`info`);return}if(z(e.type)){await V(e,t,{dryRun:n});return}switch(e.type){case`update-json`:await ye(e.config,t);break;case`template`:await be(e.config,t);break;case`regex-replace`:await xe(e.config,t);break;case`replace-in-file`:await Se(e.config,t);break;case`delete`:await Ce(e.config,t);break;case`rename`:await we(e.config,t);break;case`git-init`:await Te(e.config,t);break;case`exec`:await Ee(e.config,t);break;default:{let t=e.type;throw TypeError(`Unknown task type: ${t}`)}}}async function Oe(e,t,n,r,i=!1){try{return y(`[${n}/${r}] Running: ${e.name}...`,`info`),await De(e,t,i),y(`✓ ${e.name}`,`success`),!0}catch(t){return y(`✗ Failed: ${e.name}`,`error`),t instanceof Error&&(y(` Reason: ${t.message}`,`error`),t.stack!=null&&u.default.env.DEBUG!=null&&console.error(t.stack)),e.required&&y(` This is a required task. Initialization cannot continue.`,`error`),!1}}function ke(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 Error(`Circular dependency detected involving task: ${e}`);r.add(e);let o=i.get(e);if(!o)throw Error(`Task not found: ${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}const Ae=(0,f.promisify)(c.default.readFile);async function je(e,t){let n=q();n&&!t.force&&(console.log(``),y(`⚠️ This template has already been initialized!`,`warn`),console.log(``),y(` Initialized at: ${new Date(n.initializedAt).toLocaleString()}`,`info`),console.log(``),await v(`Do you want to re-initialize? This may cause issues`,!1)||(y(`Initialization cancelled`,`info`),u.default.exit(0)),console.log(``),y(`⚠️ Proceeding with re-initialization...`,`warn`),console.log(``));let r=e.filter(e=>e.enabled);y(`Resolving task dependencies...`,`info`);let i=ke(r);console.log(``),y(`Welcome to the template initialization script!`,`info`),console.log(``),t.dryRun&&(y(`🔍 DRY RUN MODE - No changes will be made`,`warn`),console.log(``)),y(`This will initialize your project based on the defined tasks.`,`info`),console.log(``);let a=ee(),o=[],s=[],f=[];for(let e of i)if(e.prompts&&e.prompts.length>0)for(let t of e.prompts)t.global?o.some(e=>e.id===t.id)||(o.push(t),f.push(t)):(s.push(t),f.push(t));if(f.length>0){let e=G(f);e.length>0&&(y(`❌ Prompt validation errors:`,`error`),e.forEach(e=>y(` - ${e}`,`error`)),console.log(``),u.default.exit(1)),y(`Resolving prompt default values...`,`info`);let t=await W(f);console.log(``);let n={};if(o.length>0&&(console.log(``),y(`📋 Global prompts (available to all tasks):`,`info`),console.log(``),n=await H(o,t),Object.assign(a,n)),s.length>0){o.length>0&&(y(`📋 Task-specific prompts:`,`info`),console.log(``));let e=await H(s,t);Object.assign(a,e)}}if(t.dryRun){await P(i,a),y(`🔍 Dry run completed - no changes were made`,`info`),y(`Run without --dry-run to apply changes`,`info`);return}console.log(``),y(`Starting initialization tasks...`,`info`),console.log(``),await B(`beforeAll`,a);let p=i.length,m=0,h=0,g=[];for(let e=0;e<i.length;e++){let n=i[e];if(n!=null){if(await B(`beforeTask`,n,a),await Oe(n,a,e+1,p,t.dryRun))m++,g.push(n.id),await B(`afterTask`,n,a);else if(n.required){h++,await B(`onError`,Error(`Task ${n.name} failed`),n);break}else y(`⚠️ Non-critical task failed, continuing...`,`warn`),await B(`onError`,Error(`Task ${n.name} failed`),n);console.log(``)}}if(h>0&&(y(`❌ Initialization failed with ${h} critical error(s)`,`error`),y(`✓ Completed: ${m}/${p} tasks`,`info`),u.default.exit(1)),await B(`afterAll`,a),J(a,g,t.dryRun),y(`✅ Initialization completed successfully!`,`success`),console.log(``),y(`✓ Completed: ${m}/${p} tasks`,`success`),console.log(``),!t.dryRun&&t.tasksFilePath!=null&&c.default.existsSync(t.tasksFilePath))try{c.default.unlinkSync(t.tasksFilePath),y(`🗑️ Removed tasks file: ${l.default.basename(t.tasksFilePath)}`,`info`),console.log(``)}catch(e){y(`⚠️ Failed to remove tasks file: ${e instanceof Error?e.message:`Unknown error`}`,`warn`)}if(!t.dryRun){y(`Next steps:`,`info`),y(`1. Review the changes made to your project`,`info`),y(`2. Commit the changes to git`,`info`);let e=l.default.join(u.default.cwd(),`package.json`);c.default.existsSync(e)&&JSON.parse(await Ae(e,`utf-8`)).scripts?.[`turbo:gen:init`]!=null&&(y(`3. Run "pnpm run turbo:gen:init" to create your first package`,`info`),console.log(``),await v(`Would you like to run turbo:gen:init now?`,!0)&&(console.log(``),y(`Running turbo:gen:init...`,`info`),(0,d.execSync)(`pnpm run turbo:gen:init`,{stdio:`inherit`})))}console.log(``)}const Me=(0,f.promisify)(c.default.readFile);function Z(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}async function Ne(e){try{let t=await fetch(e);if(!t.ok)throw Error(`Failed to fetch template from ${e}: ${t.status} ${t.statusText}`);return await t.text()}catch(t){throw t instanceof Error&&t.message.includes(`Failed to fetch`)?t:Error(`Failed to fetch template from ${e}: ${t instanceof Error?t.message:String(t)}`)}}const Q=new Map;async function Pe(e,t=new Set){let n=Z(e),r;if(r=n||l.default.isAbsolute(e)?e:l.default.resolve(u.default.cwd(),e),Q.has(r))return Q.get(r);if(t.has(r))throw Error(`Circular dependency detected: ${Array.from(t).join(` -> `)} -> ${r}`);t.add(r);let i;if(n)i=await Ne(r);else{if(!c.default.existsSync(r))throw Error(`Template file not found: ${r}`);i=await Me(r,`utf-8`)}let a;try{a=JSON.parse(i)}catch(e){throw Error(`Failed to parse template file ${r}: ${e instanceof Error?e.message:String(e)}`)}if(!Array.isArray(a.tasks))throw TypeError(`Invalid template file ${r}: 'tasks' array is required`);return Q.set(r,a),a}async function $(e,t,n=new Set){let r=Z(e),i;if(i=r||l.default.isAbsolute(e)?e:t==null?l.default.resolve(u.default.cwd(),e):Z(t)?new URL(e,t).href:l.default.resolve(t,e),n.has(i))throw Error(`Circular dependency detected: ${Array.from(n).join(` -> `)} -> ${i}`);n.add(i);let a=await Pe(i);if(a.extends==null||a.extends===``)return a;let o=Z(i)?new URL(`.`,i).href:l.default.dirname(i),s=Array.isArray(a.extends)?a.extends:[a.extends],c=[];for(let e of s){let t=await $(e,o,n);c.push(t)}return Fe([...c,a])}function Fe(e){if(e.length===0)return{tasks:[]};if(e.length===1)return e[0];let t=new Map;for(let n of e)for(let e of n.tasks)if(t.has(e.id)){let n=t.get(e.id);t.set(e.id,Ie(n,e))}else t.set(e.id,{...e});return{tasks:Array.from(t.values())}}function Ie(e,t){let n=typeof e.config==`object`&&e.config!==null&&typeof t.config==`object`&&t.config!==null?{...e.config,...t.config}:t.config,r=e.prompts?[...e.prompts]:void 0;if(t.prompts&&t.prompts.length>0)if(!r)r=[...t.prompts];else{let e=new Map(r.map(e=>[e.id,e]));for(let n of t.prompts)e.set(n.id,n);r=Array.from(e.values())}let i=[...e.dependencies??[],...t.dependencies??[]],a=i.length>0?[...new Set(i)]:void 0;return{...e,...t,config:n,...r!=null&&{prompts:r},...a!=null&&{dependencies:a}}}function Le(){Q.clear()}async function Re(e){y(`Loading tasks from ${e}...`,`info`);let t=await $(e);return y(`Loaded ${t.tasks.length} task(s)`,`info`),t.extends!=null&&t.extends!==``&&y(`Extended from: ${(Array.isArray(t.extends)?t.extends:[t.extends]).join(`, `)}`,`info`),t.tasks}const ze=u.default.argv.includes(`--dry-run`),Be=u.default.argv.includes(`--force`);async function Ve(e){try{let t=e||[];t.length===0&&(y(`⚠️ No tasks defined. Use --tasks-file to specify tasks or call runWithTasks() programmatically.`,`warn`),console.log(``),y(`Example: scaffoldfy --tasks-file ./tasks.json`,`info`),console.log(``),u.default.exit(1)),await je(t,{dryRun:ze,force:Be,tasksFilePath:void 0})}catch(e){y(`❌ Initialization failed`,`error`),e instanceof Error?(y(`Error: ${e.message}`,`error`),u.default.env.DEBUG!=null&&console.error(e.stack)):console.error(e),u.default.exit(1)}}async function He(e,t){try{await je(e,{dryRun:t?.dryRun??ze,force:t?.force??Be,tasksFilePath:t?.tasksFilePath??void 0})}catch(e){y(`❌ Initialization failed`,`error`),e instanceof Error?(y(`Error: ${e.message}`,`error`),u.default.env.DEBUG!=null&&console.error(e.stack)):console.error(e),u.default.exit(1)}}Object.defineProperty(exports,`A`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`B`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`C`,{enumerable:!0,get:function(){return me}}),Object.defineProperty(exports,`D`,{enumerable:!0,get:function(){return ce}}),Object.defineProperty(exports,`E`,{enumerable:!0,get:function(){return pe}}),Object.defineProperty(exports,`F`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`G`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`H`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`I`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`K`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`L`,{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,`M`,{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,`N`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`O`,{enumerable:!0,get:function(){return le}}),Object.defineProperty(exports,`P`,{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,`R`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`T`,{enumerable:!0,get:function(){return de}}),Object.defineProperty(exports,`U`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`V`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`W`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return Re}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return V}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return ke}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return H}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return U}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return $}}),Object.defineProperty(exports,`j`,{enumerable:!0,get:function(){return se}}),Object.defineProperty(exports,`k`,{enumerable:!0,get:function(){return he}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return De}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return He}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return Pe}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return G}}),Object.defineProperty(exports,`q`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return Le}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return Fe}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return Ve}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return Oe}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return fe}}),Object.defineProperty(exports,`w`,{enumerable:!0,get:function(){return z}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return ue}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return ge}}),Object.defineProperty(exports,`z`,{enumerable:!0,get:function(){return oe}});
|
|
@@ -0,0 +1,13 @@
|
|
|
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{promisify as i}from"node:util";import a from"node:readline";import o from"handlebars";import{confirm as s,input as c,number as l,password as u,select as d}from"@inquirer/prompts";function ee(){return{}}function f(){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 p(e,t){let r=a.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 m(e,t=!1){return p(`${e} (${t?`Y/n`:`y/N`})`,t?`y`:`n`).then(e=>e.toLowerCase()===`y`||e.toLowerCase()===`yes`)}function h(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 g(e,t){return e.replace(/\{\{(?<key>\w+)\}\}/gu,(e,n)=>t[n]?.toString()??``)}function _(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 v(e,t){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch(t){return h(`Failed to evaluate condition: ${e}`,`warn`),t instanceof Error&&h(` Error: ${t.message}`,`warn`),!1}}function te(r,i){try{let a=e.isAbsolute(r)?r:e.join(n.cwd(),r);if(!t.existsSync(a))throw Error(`Template file not found: ${r}`);return ne(t.readFileSync(a,`utf-8`),i)}catch(e){throw h(`Failed to read template file: ${r}`,`error`),e instanceof Error&&h(` Error: ${e.message}`,`error`),e}}function ne(e,t){try{return o.compile(e)(t)}catch(e){throw h(`Failed to compile Handlebars template`,`error`),e instanceof Error&&h(` Error: ${e.message}`,`error`),e}}const y=i(t.readFile),b={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function x(e,t){switch(t){case`add`:return`${b.green}+ ${e}${b.reset}`;case`remove`:return`${b.red}- ${e}${b.reset}`;case`context`:return`${b.gray} ${e}${b.reset}`;default:return e}}function S(e,t){let n=e.split(`
|
|
2
|
+
`),r=t.split(`
|
|
3
|
+
`),i=[],a=Math.max(n.length,r.length);for(let e=0;e<a;e++){let t=n[e],a=r[e];t===a?t!==void 0&&i.push(x(t,`context`)):(t!==void 0&&i.push(x(t,`remove`)),a!==void 0&&i.push(x(a,`add`)))}return i}async function C(r,i){if(r.condition!=null&&r.condition!==``&&!v(r.condition,i))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let a=e.join(n.cwd(),r.file);if(!t.existsSync(a))return`${b.red}✗ File not found: ${r.file}${b.reset}`;try{let e=await y(a,`utf-8`),t=JSON.parse(e),n={...t};function o(e){if(typeof e==`string`)return g(e,i);if(Array.isArray(e))return e.map(e=>o(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=o(r);return t}return e}for(let[e,n]of Object.entries(r.updates)){let r=o(n);e.includes(`.`)?_(t,e,r):t[e]=r}let s=JSON.stringify(n,null,2),c=JSON.stringify(t,null,2);if(s===c)return`${b.cyan}→ No changes${b.reset}`;let l=S(s,c);return`${b.blue}File: ${r.file}${b.reset}\n${l.join(`
|
|
4
|
+
`)}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}async function re(r,i){if(r.condition!=null&&r.condition!==``&&!v(r.condition,i))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;if(r.template==null||r.template===``)return`${b.red}✗ No template content provided for file: ${r.file}${b.reset}`;let a=e.join(n.cwd(),r.file),o=g(r.template,i);if(!t.existsSync(a)){let e=o.split(`
|
|
5
|
+
`).slice(0,10).join(`
|
|
6
|
+
`),t=o.split(`
|
|
7
|
+
`).length>10;return`${b.blue}File: ${r.file}${b.reset}\n${b.green}+ New file would be created${b.reset}\n${b.gray}Content preview:${b.reset}\n${e}${t?`
|
|
8
|
+
...`:``}`}try{let e=await y(a,`utf-8`);if(e===o)return`${b.cyan}→ No changes${b.reset}`;let t=S(e,o);return`${b.blue}File: ${r.file}${b.reset}\n${t.join(`
|
|
9
|
+
`)}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}async function ie(r,i){if(r.condition!=null&&r.condition!==``&&!v(r.condition,i))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let a=e.join(n.cwd(),r.file);if(!t.existsSync(a))return`${b.red}✗ File not found: ${r.file}${b.reset}`;try{let e=await y(a,`utf-8`),t=new RegExp(r.pattern,r.flags??`g`),n=g(r.replacement,i),o=e.replace(t,n);if(e===o)return`${b.cyan}→ No matches found${b.reset}`;let s=S(e,o);return`${b.blue}File: ${r.file}${b.reset}\n${s.join(`
|
|
10
|
+
`)}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}async function w(r,i){if(r.condition!=null&&r.condition!==``&&!v(r.condition,i))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let a=e.join(n.cwd(),r.file);if(!t.existsSync(a))return`${b.red}✗ File not found: ${r.file}${b.reset}`;try{let e=await y(a,`utf-8`),t=e;for(let{find:t,replace:n}of r.replacements){let r=g(t,i),a=g(n,i);e=e.replace(r,a)}if(t===e)return`${b.cyan}→ No changes${b.reset}`;let n=S(t,e);return`${b.blue}File: ${r.file}${b.reset}\n${n.join(`
|
|
11
|
+
`)}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}function T(r,i){if(r.condition!=null&&r.condition!==``&&!v(r.condition,i))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let a=r.paths.map(e=>g(e,i)).filter(r=>t.existsSync(e.join(n.cwd(),r)));return a.length===0?`${b.cyan}→ No files/directories to delete${b.reset}`:`${b.red}Would delete:${b.reset}\n${a.map(e=>`${b.red} - ${e}${b.reset}`).join(`
|
|
12
|
+
`)}`}function E(r,i){if(r.condition!=null&&r.condition!==``&&!v(r.condition,i))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let a=g(r.from,i),o=g(r.to,i),s=e.join(n.cwd(),a),c=e.join(n.cwd(),o);return t.existsSync(s)?t.existsSync(c)?`${b.yellow}⚠ Destination already exists: ${o}${b.reset}\n${b.cyan}Would rename: ${a} → ${o}${b.reset}`:`${b.cyan}Would rename: ${a} → ${o}${b.reset}`:`${b.red}✗ Source not found: ${a}${b.reset}`}function D(r){if(r.condition!=null&&r.condition!==``)return`${b.yellow}⊘ Condition check skipped in dry-run${b.reset}`;let i=e.join(n.cwd(),`.git`),a=t.existsSync(i),o=[];if(r.removeExisting&&a&&o.push(`${b.red}Would remove existing .git directory${b.reset}`),o.push(`${b.green}Would initialize git repository${b.reset}`),r.initialCommit){let e=r.message??`Initial commit`;o.push(`${b.green}Would create initial commit: "${e}"${b.reset}`)}return o.join(`
|
|
13
|
+
`)}function O(e,t){if(e.condition!=null&&e.condition!==``&&!v(e.condition,t))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let r=g(e.command,t),i=e.cwd==null?n.cwd():g(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}`}async function k(e,t){try{switch(e.type){case`update-json`:return await C(e.config,t);case`template`:return await re(e.config,t);case`regex-replace`:return await ie(e.config,t);case`replace-in-file`:return await w(e.config,t);case`delete`:return T(e.config,t);case`rename`:return E(e.config,t);case`git-init`:return D(e.config);case`exec`:return O(e.config,t);default:{let t=e.type;return`${b.yellow}⚠ Diff not available for task type: ${t}${b.reset}`}}}catch(e){return`${b.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${b.reset}`}}async function A(e,t){console.log(``),console.log(`${b.blue}═══════════════════════════════════════════════════════${b.reset}`),console.log(`${b.blue} DRY RUN - Preview of changes${b.reset}`),console.log(`${b.blue}═══════════════════════════════════════════════════════${b.reset}`),console.log(``);for(let n of e){console.log(`${b.cyan}▶ Task: ${n.name}${b.reset}`),console.log(`${b.gray} ${n.description}${b.reset}`),console.log(``);let e=await k(n,t);console.log(e),console.log(``),console.log(`${b.gray}${`─`.repeat(55)}${b.reset}`),console.log(``)}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}`),console.log(``)}const j=new Map,M={},N=new Map;function ae(e){if(e.name==null||e.name===``)throw TypeError(`Plugin name is required`);if(!Array.isArray(e.taskTypes)||e.taskTypes.length===0)throw TypeError(`Plugin ${e.name} must define at least one task type`);if(typeof e.execute!=`function`)throw TypeError(`Plugin ${e.name} must provide an execute function`);if(j.has(e.name))throw TypeError(`Plugin ${e.name} is already registered`);for(let t of e.taskTypes)if(N.has(t)){let e=N.get(t);throw TypeError(`Task type "${t}" is already registered by plugin "${e}"`)}j.set(e.name,e);for(let t of e.taskTypes)N.set(t,e.name);h(`✓ Registered plugin: ${e.name}${e.version==null?``:` v${e.version}`}`,`info`)}function oe(e){let t=j.get(e);if(t!=null){for(let e of t.taskTypes)N.delete(e);j.delete(e)}}function se(e){return j.get(e)}function P(e){let t=N.get(e);if(t!=null)return j.get(t)}function F(e){return N.has(e)}function ce(){return Array.from(j.keys())}function le(){j.clear(),N.clear()}function ue(e){e.beforeAll!=null&&(M.beforeAll=e.beforeAll),e.afterAll!=null&&(M.afterAll=e.afterAll),e.beforeTask!=null&&(M.beforeTask=e.beforeTask),e.afterTask!=null&&(M.afterTask=e.afterTask),e.onError!=null&&(M.onError=e.onError)}async function I(e,...t){let n=M[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){h(`Error in ${e} hook: ${t instanceof Error?t.message:String(t)}`,`error`)}}async function L(e,t,n){let r=P(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}async function de(e,t){let n=P(e.type);if(!(n==null||n.getDiff==null))return n.getDiff(e,t)}function fe(e){let t=P(e.type);return t==null?[`No plugin found for task type: ${e.type}`]:t.validate==null?[]:t.validate(e)}function pe(e,t,n,r){return{name:e,...r?.version!=null&&{version:r.version},taskTypes:[t],execute:n,...r?.getDiff!=null&&{getDiff:r.getDiff},...r?.validate!=null&&{validate:r.validate}}}async function R(e,t=new Map){let n={};if(e.length===0)return n;for(let r of e)try{let e,i=t.get(r.id);switch(r.type){case`input`:{let t={message:r.message};if(i!==void 0&&(t.default=String(i)),r.required!==void 0&&(t.required=r.required),e=await c(t),r.required&&(e==null||typeof e==`string`&&e.trim()===``))throw h(`${r.message} is required`,`error`),Error(`Prompt "${r.id}" is required`);break}case`password`:if(e=await u({message:r.message,mask:`*`}),r.required&&(e==null||typeof e==`string`&&e.trim()===``))throw h(`${r.message} is required`,`error`),Error(`Prompt "${r.id}" is required`);break;case`number`:{let t={message:r.message};if(i!==void 0&&(t.default=Number(i)),r.required!==void 0&&(t.required=r.required),r.min!==void 0&&(t.min=r.min),r.max!==void 0&&(t.max=r.max),e=await l(t),r.required&&e==null)throw h(`${r.message} is required`,`error`),Error(`Prompt "${r.id}" is required`);break}case`select`:{let t={message:r.message,choices:r.choices.map(e=>({name:e.name,value:e.value}))};i!==void 0&&(t.default=i),e=await d(t);break}case`confirm`:{let t=i===void 0?!1:!!i;e=await s({message:r.message,default:t});break}default:throw h(`Unknown prompt type: ${r.type}`,`error`),Error(`Unknown prompt type: ${r.type}`)}n[r.id]=e}catch(e){throw e instanceof Error&&h(`Failed to collect prompt "${r.id}": ${e.message}`,`error`),e}return console.log(``),n}async function z(e,t){if(e===void 0)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let n=e;if(n.type===`exec`){let e=n.value;if(typeof e!=`string`){h(`Prompt "${t}": exec default value must have a string command`,`error`);return}try{let t=r(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){h(`Prompt "${t}": failed to execute default value command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}else if(n.type===`static`)return n.value;return e}async function B(e){let t=new Map,n=e.map(async e=>{if(e.default!==void 0){let n=await z(e.default,e.id);n!==void 0&&t.set(e.id,n)}});return await Promise.all(n),t}function V(e){let t=[],n=new Set,r=new Set,i=new Set;for(let a of e){if(n.has(a.id)&&t.push(`Duplicate prompt ID: ${a.id}`),n.add(a.id),a.global?r.add(a.id):(r.has(a.id)&&t.push(`Prompt ID "${a.id}" is used as both global and task-specific. Use unique IDs or mark all instances as global.`),i.add(a.id)),a.global&&i.has(a.id)&&t.push(`Prompt ID "${a.id}" is used as both global and task-specific. Use unique IDs or mark all instances as global.`),/^[\w-]+$/u.test(a.id)||t.push(`Invalid prompt ID "${a.id}": must contain only alphanumeric characters, underscores, and hyphens`),(!a.message||a.message.trim()===``)&&t.push(`Prompt "${a.id}" must have a non-empty message`),a.type===`select`){a.choices.length===0&&t.push(`Select prompt "${a.id}" must have at least one choice`);for(let e of a.choices)(!e.name||e.name.trim()===``)&&t.push(`Select prompt "${a.id}" has a choice with empty name`),e.value===void 0&&t.push(`Select prompt "${a.id}" has a choice with undefined value`)}a.type===`number`&&a.min!==void 0&&a.max!==void 0&&a.min>a.max&&t.push(`Number prompt "${a.id}" has min greater than max`)}return t}const H=`.scaffoldfyialized`;function U(){let r=e.join(n.cwd(),H);if(!t.existsSync(r))return null;try{let e=t.readFileSync(r,`utf-8`);return JSON.parse(e)}catch{return null}}function W(r,i,a=!1){if(a)return;let o=e.join(n.cwd(),`package.json`),s=`0.0.0`;try{s=JSON.parse(t.readFileSync(o,`utf-8`)).version??`0.0.0`}catch{}let c={initializedAt:new Date().toISOString(),config:r,completedTasks:i,version:s},l=e.join(n.cwd(),H);t.writeFileSync(l,JSON.stringify(c,null,2))}const G=i(t.readFile),K=i(t.writeFile),me=i(t.rename);async function he(t,r){if(t.condition!=null&&t.condition!==``&&!v(t.condition,r)){h(`Condition not met, skipping update-json task`,`info`);return}let i=e.join(n.cwd(),t.file),{updates:a}=t,o=await G(i,`utf-8`),s=JSON.parse(o);function c(e){if(typeof e==`string`)return g(e,r);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(a)){let n=c(t);e.includes(`.`)?_(s,e,n):s[e]=n}await K(i,`${JSON.stringify(s,null,2)}\n`)}async function ge(r,i){if(r.condition!=null&&r.condition!==``&&!v(r.condition,i)){h(`Condition not met, skipping template task`,`info`);return}let a=e.join(n.cwd(),r.file),o=r.template!=null&&r.template!==``,s=r.templateFile!=null&&r.templateFile!==``;if(!o&&!s)throw Error(`Template task requires either "template" (inline) or "templateFile" (file path) to be specified`);if(o&&s)throw Error(`Template task cannot have both "template" and "templateFile" specified. Use one or the other.`);let c;if(s&&r.templateFile.endsWith(`.hbs`))c=te(r.templateFile,i);else if(s){let a=r.templateFile,o=e.isAbsolute(a)?a:e.join(n.cwd(),a);if(!t.existsSync(o))throw Error(`Template file not found: ${a}`);c=g(t.readFileSync(o,`utf-8`),i)}else c=g(r.template,i);await K(a,c)}async function _e(t,r){if(t.condition!=null&&t.condition!==``&&!v(t.condition,r)){h(`Condition not met, skipping regex-replace task`,`info`);return}let i=e.join(n.cwd(),t.file),{pattern:a}=t,o=t.flags??``,s=t.replacement||``,c=await G(i,`utf-8`),l=new RegExp(a,o);c=c.replace(l,g(s,r)),await K(i,c)}async function ve(r,i){if(r.condition!=null&&r.condition!==``&&!v(r.condition,i)){h(`Condition not met, skipping replace-in-file task`,`info`);return}let a=e.join(n.cwd(),r.file),{replacements:o}=r;if(!t.existsSync(a)){h(`File not found: ${a}, skipping`,`warn`);return}let s=await G(a,`utf-8`);for(let{find:e,replace:t}of o){let n=g(t,i);s=s.replace(new RegExp(e,`gu`),n)}await K(a,s)}async function ye(r,i){let{paths:a,condition:o}=r;if(o!=null&&o!==``){if(!i){h(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!v(o,i)){h(`Condition not met, skipping deletion`,`info`);return}}for(let r of a){let i=e.join(n.cwd(),r);t.existsSync(i)&&t.rmSync(i,{recursive:!0,force:!0})}}async function be(r,i){if(r.condition!=null&&r.condition!==``&&!v(r.condition,i)){h(`Condition not met, skipping rename task`,`info`);return}let a=e.join(n.cwd(),g(r.from,i)),o=e.join(n.cwd(),g(r.to,i));if(!t.existsSync(a)){h(`Source path does not exist: ${a}`,`warn`);return}await me(a,o)}async function xe(i,a){if(i.condition!=null&&i.condition!==``){if(!a){h(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!v(i.condition,a)){h(`Condition not met, skipping git-init task`,`info`);return}}if(i.removeExisting){let r=e.join(n.cwd(),`.git`);t.existsSync(r)&&t.rmSync(r,{recursive:!0,force:!0})}if(r(`git init`,{stdio:`inherit`}),i.initialCommit){let e=i.message??`Initial commit`;r(`git add .`,{stdio:`inherit`}),r(`git commit -m "${e}"`,{stdio:`inherit`})}}async function Se(t,i){if(t.condition!=null&&t.condition!==``){if(!i){h(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!v(t.condition,i)){h(`Condition not met, skipping exec task`,`info`);return}}let a=t.cwd==null?n.cwd():e.join(n.cwd(),t.cwd);r(t.command,{cwd:a,stdio:`inherit`})}async function q(e,t,n=!1){if(n){h(`[DRY RUN] Would execute: ${e.name}`,`info`);return}if(F(e.type)){await L(e,t,{dryRun:n});return}switch(e.type){case`update-json`:await he(e.config,t);break;case`template`:await ge(e.config,t);break;case`regex-replace`:await _e(e.config,t);break;case`replace-in-file`:await ve(e.config,t);break;case`delete`:await ye(e.config,t);break;case`rename`:await be(e.config,t);break;case`git-init`:await xe(e.config,t);break;case`exec`:await Se(e.config,t);break;default:{let t=e.type;throw TypeError(`Unknown task type: ${t}`)}}}async function J(e,t,r,i,a=!1){try{return h(`[${r}/${i}] Running: ${e.name}...`,`info`),await q(e,t,a),h(`✓ ${e.name}`,`success`),!0}catch(t){return h(`✗ Failed: ${e.name}`,`error`),t instanceof Error&&(h(` Reason: ${t.message}`,`error`),t.stack!=null&&n.env.DEBUG!=null&&console.error(t.stack)),e.required&&h(` This is a required task. Initialization cannot continue.`,`error`),!1}}function Y(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 Error(`Circular dependency detected involving task: ${e}`);r.add(e);let o=i.get(e);if(!o)throw Error(`Task not found: ${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}const Ce=i(t.readFile);async function X(i,a){let o=U();o&&!a.force&&(console.log(``),h(`⚠️ This template has already been initialized!`,`warn`),console.log(``),h(` Initialized at: ${new Date(o.initializedAt).toLocaleString()}`,`info`),console.log(``),await m(`Do you want to re-initialize? This may cause issues`,!1)||(h(`Initialization cancelled`,`info`),n.exit(0)),console.log(``),h(`⚠️ Proceeding with re-initialization...`,`warn`),console.log(``));let s=i.filter(e=>e.enabled);h(`Resolving task dependencies...`,`info`);let c=Y(s);console.log(``),h(`Welcome to the template initialization script!`,`info`),console.log(``),a.dryRun&&(h(`🔍 DRY RUN MODE - No changes will be made`,`warn`),console.log(``)),h(`This will initialize your project based on the defined tasks.`,`info`),console.log(``);let l=ee(),u=[],d=[],f=[];for(let e of c)if(e.prompts&&e.prompts.length>0)for(let t of e.prompts)t.global?u.some(e=>e.id===t.id)||(u.push(t),f.push(t)):(d.push(t),f.push(t));if(f.length>0){let e=V(f);e.length>0&&(h(`❌ Prompt validation errors:`,`error`),e.forEach(e=>h(` - ${e}`,`error`)),console.log(``),n.exit(1)),h(`Resolving prompt default values...`,`info`);let t=await B(f);console.log(``);let r={};if(u.length>0&&(console.log(``),h(`📋 Global prompts (available to all tasks):`,`info`),console.log(``),r=await R(u,t),Object.assign(l,r)),d.length>0){u.length>0&&(h(`📋 Task-specific prompts:`,`info`),console.log(``));let e=await R(d,t);Object.assign(l,e)}}if(a.dryRun){await A(c,l),h(`🔍 Dry run completed - no changes were made`,`info`),h(`Run without --dry-run to apply changes`,`info`);return}console.log(``),h(`Starting initialization tasks...`,`info`),console.log(``),await I(`beforeAll`,l);let p=c.length,g=0,_=0,v=[];for(let e=0;e<c.length;e++){let t=c[e];if(t!=null){if(await I(`beforeTask`,t,l),await J(t,l,e+1,p,a.dryRun))g++,v.push(t.id),await I(`afterTask`,t,l);else if(t.required){_++,await I(`onError`,Error(`Task ${t.name} failed`),t);break}else h(`⚠️ Non-critical task failed, continuing...`,`warn`),await I(`onError`,Error(`Task ${t.name} failed`),t);console.log(``)}}if(_>0&&(h(`❌ Initialization failed with ${_} critical error(s)`,`error`),h(`✓ Completed: ${g}/${p} tasks`,`info`),n.exit(1)),await I(`afterAll`,l),W(l,v,a.dryRun),h(`✅ Initialization completed successfully!`,`success`),console.log(``),h(`✓ Completed: ${g}/${p} tasks`,`success`),console.log(``),!a.dryRun&&a.tasksFilePath!=null&&t.existsSync(a.tasksFilePath))try{t.unlinkSync(a.tasksFilePath),h(`🗑️ Removed tasks file: ${e.basename(a.tasksFilePath)}`,`info`),console.log(``)}catch(e){h(`⚠️ Failed to remove tasks file: ${e instanceof Error?e.message:`Unknown error`}`,`warn`)}if(!a.dryRun){h(`Next steps:`,`info`),h(`1. Review the changes made to your project`,`info`),h(`2. Commit the changes to git`,`info`);let i=e.join(n.cwd(),`package.json`);t.existsSync(i)&&JSON.parse(await Ce(i,`utf-8`)).scripts?.[`turbo:gen:init`]!=null&&(h(`3. Run "pnpm run turbo:gen:init" to create your first package`,`info`),console.log(``),await m(`Would you like to run turbo:gen:init now?`,!0)&&(console.log(``),h(`Running turbo:gen:init...`,`info`),r(`pnpm run turbo:gen:init`,{stdio:`inherit`})))}console.log(``)}const we=i(t.readFile);function Z(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}async function Te(e){try{let t=await fetch(e);if(!t.ok)throw Error(`Failed to fetch template from ${e}: ${t.status} ${t.statusText}`);return await t.text()}catch(t){throw t instanceof Error&&t.message.includes(`Failed to fetch`)?t:Error(`Failed to fetch template from ${e}: ${t instanceof Error?t.message:String(t)}`)}}const Q=new Map;async function Ee(r,i=new Set){let a=Z(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 Error(`Circular dependency detected: ${Array.from(i).join(` -> `)} -> ${o}`);i.add(o);let s;if(a)s=await Te(o);else{if(!t.existsSync(o))throw Error(`Template file not found: ${o}`);s=await we(o,`utf-8`)}let c;try{c=JSON.parse(s)}catch(e){throw Error(`Failed to parse template file ${o}: ${e instanceof Error?e.message:String(e)}`)}if(!Array.isArray(c.tasks))throw TypeError(`Invalid template file ${o}: 'tasks' array is required`);return Q.set(o,c),c}async function $(t,r,i=new Set){let a=Z(t),o;if(o=a||e.isAbsolute(t)?t:r==null?e.resolve(n.cwd(),t):Z(r)?new URL(t,r).href:e.resolve(r,t),i.has(o))throw Error(`Circular dependency detected: ${Array.from(i).join(` -> `)} -> ${o}`);i.add(o);let s=await Ee(o);if(s.extends==null||s.extends===``)return s;let c=Z(o)?new URL(`.`,o).href:e.dirname(o),l=Array.isArray(s.extends)?s.extends:[s.extends],u=[];for(let e of l){let t=await $(e,c,i);u.push(t)}return De([...u,s])}function De(e){if(e.length===0)return{tasks:[]};if(e.length===1)return e[0];let t=new Map;for(let n of e)for(let e of n.tasks)if(t.has(e.id)){let n=t.get(e.id);t.set(e.id,Oe(n,e))}else t.set(e.id,{...e});return{tasks:Array.from(t.values())}}function Oe(e,t){let n=typeof e.config==`object`&&e.config!==null&&typeof t.config==`object`&&t.config!==null?{...e.config,...t.config}:t.config,r=e.prompts?[...e.prompts]:void 0;if(t.prompts&&t.prompts.length>0)if(!r)r=[...t.prompts];else{let e=new Map(r.map(e=>[e.id,e]));for(let n of t.prompts)e.set(n.id,n);r=Array.from(e.values())}let i=[...e.dependencies??[],...t.dependencies??[]],a=i.length>0?[...new Set(i)]:void 0;return{...e,...t,config:n,...r!=null&&{prompts:r},...a!=null&&{dependencies:a}}}function ke(){Q.clear()}async function Ae(e){h(`Loading tasks from ${e}...`,`info`);let t=await $(e);return h(`Loaded ${t.tasks.length} task(s)`,`info`),t.extends!=null&&t.extends!==``&&h(`Extended from: ${(Array.isArray(t.extends)?t.extends:[t.extends]).join(`, `)}`,`info`),t.tasks}const je=n.argv.includes(`--dry-run`),Me=n.argv.includes(`--force`);async function Ne(e){try{let t=e||[];t.length===0&&(h(`⚠️ No tasks defined. Use --tasks-file to specify tasks or call runWithTasks() programmatically.`,`warn`),console.log(``),h(`Example: scaffoldfy --tasks-file ./tasks.json`,`info`),console.log(``),n.exit(1)),await X(t,{dryRun:je,force:Me,tasksFilePath:void 0})}catch(e){h(`❌ Initialization failed`,`error`),e instanceof Error?(h(`Error: ${e.message}`,`error`),n.env.DEBUG!=null&&console.error(e.stack)):console.error(e),n.exit(1)}}async function Pe(e,t){try{await X(e,{dryRun:t?.dryRun??je,force:t?.force??Me,tasksFilePath:t?.tasksFilePath??void 0})}catch(e){h(`❌ Initialization failed`,`error`),e instanceof Error?(h(`Error: ${e.message}`,`error`),n.env.DEBUG!=null&&console.error(e.stack)):console.error(e),n.exit(1)}}export{A,v as B,de as C,ae as D,ue as E,E as F,m as G,g as H,w as I,_ as K,k as L,O as M,D as N,oe as O,ie as P,re as R,P as S,ce as T,h as U,f as V,p as W,I as _,Ae as a,L as b,Y as c,U as d,W as f,R as g,z as h,$ as i,T as j,fe as k,q as l,B as m,Pe as n,Ee as o,V as p,ke as r,De as s,Ne as t,J as u,le as v,F as w,se as x,pe as y,C as z};
|
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.8.0",
|
|
5
5
|
"author": "PixPilot <m.doaie@hotmail.com>",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
@@ -48,8 +48,8 @@
|
|
|
48
48
|
"typescript": "^5.9.3",
|
|
49
49
|
"@internal/eslint-config": "0.3.0",
|
|
50
50
|
"@internal/tsconfig": "0.1.0",
|
|
51
|
-
"@internal/tsdown-config": "0.1.0",
|
|
52
51
|
"@internal/vitest-config": "0.1.0",
|
|
52
|
+
"@internal/tsdown-config": "0.1.0",
|
|
53
53
|
"@internal/prettier-config": "0.0.1"
|
|
54
54
|
},
|
|
55
55
|
"prettier": "@internal/prettier-config",
|
package/schema/tasks.schema.json
CHANGED
|
@@ -79,11 +79,11 @@
|
|
|
79
79
|
"properties": {
|
|
80
80
|
"type": {
|
|
81
81
|
"type": "string",
|
|
82
|
-
"enum": ["
|
|
83
|
-
"description": "Type of default value. '
|
|
82
|
+
"enum": ["static", "exec"],
|
|
83
|
+
"description": "Type of default value. 'static' for explicit static values, 'exec' for command execution."
|
|
84
84
|
},
|
|
85
85
|
"value": {
|
|
86
|
-
"description": "For '
|
|
86
|
+
"description": "For 'static' type: the static value. For 'exec' type: the shell command to execute. Commands can be any shell command including git, npm, node, etc. The command output will be trimmed and auto-parsed as JSON, number, or boolean when applicable."
|
|
87
87
|
}
|
|
88
88
|
}
|
|
89
89
|
}
|
package/dist/src-BhknM6fX.cjs
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`node:fs`);c=s(c);let l=require(`node:path`);l=s(l);let u=require(`node:process`);u=s(u);let d=require(`node:child_process`);d=s(d);let f=require(`node:util`);f=s(f);let p=require(`node:readline`);p=s(p);let m=require(`handlebars`);m=s(m);let h=require(`@inquirer/prompts`);h=s(h);function ee(){return{}}function g(){try{let e=(0,d.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 _(e,t){let n=p.default.createInterface({input:u.default.stdin,output:u.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 v(e,t=!1){return _(`${e} (${t?`Y/n`:`y/N`})`,t?`y`:`n`).then(e=>e.toLowerCase()===`y`||e.toLowerCase()===`yes`)}function y(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)=>t[n]?.toString()??``)}function x(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 S(e,t){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch(t){return y(`Failed to evaluate condition: ${e}`,`warn`),t instanceof Error&&y(` Error: ${t.message}`,`warn`),!1}}function te(e,t){try{let n=l.default.isAbsolute(e)?e:l.default.join(u.default.cwd(),e);if(!c.default.existsSync(n))throw Error(`Template file not found: ${e}`);return ne(c.default.readFileSync(n,`utf-8`),t)}catch(t){throw y(`Failed to read template file: ${e}`,`error`),t instanceof Error&&y(` Error: ${t.message}`,`error`),t}}function ne(e,t){try{return m.default.compile(e)(t)}catch(e){throw y(`Failed to compile Handlebars template`,`error`),e instanceof Error&&y(` Error: ${e.message}`,`error`),e}}const C=(0,f.promisify)(c.default.readFile),re=2,ie=10,ae=55,w={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function T(e,t){switch(t){case`add`:return`${w.green}+ ${e}${w.reset}`;case`remove`:return`${w.red}- ${e}${w.reset}`;case`context`:return`${w.gray} ${e}${w.reset}`;default:return e}}function E(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(T(t,`context`)):(t!==void 0&&i.push(T(t,`remove`)),a!==void 0&&i.push(T(a,`add`)))}return i}async function oe(e,t){if(e.condition!=null&&e.condition!==``&&!S(e.condition,t))return`${w.yellow}⊘ Condition not met - task would be skipped${w.reset}`;let n=l.default.join(u.default.cwd(),e.file);if(!c.default.existsSync(n))return`${w.red}✗ File not found: ${e.file}${w.reset}`;try{let r=await C(n,`utf-8`),i=JSON.parse(r),a={...i};function o(e){if(typeof e==`string`)return b(e,t);if(Array.isArray(e))return e.map(e=>o(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=o(r);return t}return e}for(let[t,n]of Object.entries(e.updates)){let e=o(n);t.includes(`.`)?x(i,t,e):i[t]=e}let s=JSON.stringify(a,null,2),c=JSON.stringify(i,null,2);if(s===c)return`${w.cyan}→ No changes${w.reset}`;let l=E(s,c);return`${w.blue}File: ${e.file}${w.reset}\n${l.join(`
|
|
4
|
-
`)}`}catch(e){return`${w.red}✗ Error: ${e instanceof Error?e.message:String(e)}${w.reset}`}}async function D(e,t){if(e.condition!=null&&e.condition!==``&&!S(e.condition,t))return`${w.yellow}⊘ Condition not met - task would be skipped${w.reset}`;if(e.template==null||e.template===``)return`${w.red}✗ No template content provided for file: ${e.file}${w.reset}`;let n=l.default.join(u.default.cwd(),e.file),r=b(e.template,t);if(!c.default.existsSync(n)){let t=r.split(`
|
|
5
|
-
`).slice(0,10).join(`
|
|
6
|
-
`),n=r.split(`
|
|
7
|
-
`).length>10;return`${w.blue}File: ${e.file}${w.reset}\n${w.green}+ New file would be created${w.reset}\n${w.gray}Content preview:${w.reset}\n${t}${n?`
|
|
8
|
-
...`:``}`}try{let t=await C(n,`utf-8`);if(t===r)return`${w.cyan}→ No changes${w.reset}`;let i=E(t,r);return`${w.blue}File: ${e.file}${w.reset}\n${i.join(`
|
|
9
|
-
`)}`}catch(e){return`${w.red}✗ Error: ${e instanceof Error?e.message:String(e)}${w.reset}`}}async function O(e,t){if(e.condition!=null&&e.condition!==``&&!S(e.condition,t))return`${w.yellow}⊘ Condition not met - task would be skipped${w.reset}`;let n=l.default.join(u.default.cwd(),e.file);if(!c.default.existsSync(n))return`${w.red}✗ File not found: ${e.file}${w.reset}`;try{let r=await C(n,`utf-8`),i=new RegExp(e.pattern,e.flags??`g`),a=b(e.replacement,t),o=r.replace(i,a);if(r===o)return`${w.cyan}→ No matches found${w.reset}`;let s=E(r,o);return`${w.blue}File: ${e.file}${w.reset}\n${s.join(`
|
|
10
|
-
`)}`}catch(e){return`${w.red}✗ Error: ${e instanceof Error?e.message:String(e)}${w.reset}`}}async function k(e,t){if(e.condition!=null&&e.condition!==``&&!S(e.condition,t))return`${w.yellow}⊘ Condition not met - task would be skipped${w.reset}`;let n=l.default.join(u.default.cwd(),e.file);if(!c.default.existsSync(n))return`${w.red}✗ File not found: ${e.file}${w.reset}`;try{let r=await C(n,`utf-8`),i=r;for(let{find:n,replace:i}of e.replacements){let e=b(n,t),a=b(i,t);r=r.replace(e,a)}if(i===r)return`${w.cyan}→ No changes${w.reset}`;let a=E(i,r);return`${w.blue}File: ${e.file}${w.reset}\n${a.join(`
|
|
11
|
-
`)}`}catch(e){return`${w.red}✗ Error: ${e instanceof Error?e.message:String(e)}${w.reset}`}}function se(e,t){if(e.condition!=null&&e.condition!==``&&!S(e.condition,t))return`${w.yellow}⊘ Condition not met - task would be skipped${w.reset}`;let n=e.paths.map(e=>b(e,t)).filter(e=>c.default.existsSync(l.default.join(u.default.cwd(),e)));return n.length===0?`${w.cyan}→ No files/directories to delete${w.reset}`:`${w.red}Would delete:${w.reset}\n${n.map(e=>`${w.red} - ${e}${w.reset}`).join(`
|
|
12
|
-
`)}`}function A(e,t){if(e.condition!=null&&e.condition!==``&&!S(e.condition,t))return`${w.yellow}⊘ Condition not met - task would be skipped${w.reset}`;let n=b(e.from,t),r=b(e.to,t),i=l.default.join(u.default.cwd(),n),a=l.default.join(u.default.cwd(),r);return c.default.existsSync(i)?c.default.existsSync(a)?`${w.yellow}⚠ Destination already exists: ${r}${w.reset}\n${w.cyan}Would rename: ${n} → ${r}${w.reset}`:`${w.cyan}Would rename: ${n} → ${r}${w.reset}`:`${w.red}✗ Source not found: ${n}${w.reset}`}function j(e){if(e.condition!=null&&e.condition!==``)return`${w.yellow}⊘ Condition check skipped in dry-run${w.reset}`;let t=l.default.join(u.default.cwd(),`.git`),n=c.default.existsSync(t),r=[];if(e.removeExisting&&n&&r.push(`${w.red}Would remove existing .git directory${w.reset}`),r.push(`${w.green}Would initialize git repository${w.reset}`),e.initialCommit){let t=e.message??`Initial commit`;r.push(`${w.green}Would create initial commit: "${t}"${w.reset}`)}return r.join(`
|
|
13
|
-
`)}function M(e,t){if(e.condition!=null&&e.condition!==``&&!S(e.condition,t))return`${w.yellow}⊘ Condition not met - task would be skipped${w.reset}`;let n=b(e.command,t),r=e.cwd==null?u.default.cwd():b(e.cwd,t);return`${w.yellow}Would execute:${w.reset}\n${w.cyan} Command: ${n}${w.reset}\n${w.cyan} Working directory: ${r}${w.reset}`}async function N(e,t){try{switch(e.type){case`update-json`:return await oe(e.config,t);case`template`:return await D(e.config,t);case`regex-replace`:return await O(e.config,t);case`replace-in-file`:return await k(e.config,t);case`delete`:return se(e.config,t);case`rename`:return A(e.config,t);case`git-init`:return j(e.config);case`exec`:return M(e.config,t);default:{let t=e.type;return`${w.yellow}⚠ Diff not available for task type: ${t}${w.reset}`}}}catch(e){return`${w.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${w.reset}`}}async function P(e,t){console.log(``),console.log(`${w.blue}═══════════════════════════════════════════════════════${w.reset}`),console.log(`${w.blue} DRY RUN - Preview of changes${w.reset}`),console.log(`${w.blue}═══════════════════════════════════════════════════════${w.reset}`),console.log(``);for(let n of e){console.log(`${w.cyan}▶ Task: ${n.name}${w.reset}`),console.log(`${w.gray} ${n.description}${w.reset}`),console.log(``);let e=await N(n,t);console.log(e),console.log(``),console.log(`${w.gray}${`─`.repeat(55)}${w.reset}`),console.log(``)}console.log(`${w.blue}═══════════════════════════════════════════════════════${w.reset}`),console.log(`${w.yellow} No changes were applied (dry-run mode)${w.reset}`),console.log(`${w.blue}═══════════════════════════════════════════════════════${w.reset}`),console.log(``)}const F=new Map,I={},L=new Map;function ce(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(F.has(e.name))throw TypeError(`Plugin ${e.name} is already registered`);for(let t of e.taskTypes)if(L.has(t)){let e=L.get(t);throw TypeError(`Task type "${t}" is already registered by plugin "${e}"`)}F.set(e.name,e);for(let t of e.taskTypes)L.set(t,e.name);y(`✓ Registered plugin: ${e.name}${e.version==null?``:` v${e.version}`}`,`info`)}function le(e){let t=F.get(e);if(t!=null){for(let e of t.taskTypes)L.delete(e);F.delete(e)}}function ue(e){return F.get(e)}function R(e){let t=L.get(e);if(t!=null)return F.get(t)}function z(e){return L.has(e)}function de(){return Array.from(F.keys())}function fe(){F.clear(),L.clear()}function pe(e){e.beforeAll!=null&&(I.beforeAll=e.beforeAll),e.afterAll!=null&&(I.afterAll=e.afterAll),e.beforeTask!=null&&(I.beforeTask=e.beforeTask),e.afterTask!=null&&(I.afterTask=e.afterTask),e.onError!=null&&(I.onError=e.onError)}async function B(e,...t){let n=I[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){y(`Error in ${e} hook: ${t instanceof Error?t.message:String(t)}`,`error`)}}async function V(e,t,n){let r=R(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}async function me(e,t){let n=R(e.type);if(!(n==null||n.getDiff==null))return n.getDiff(e,t)}function he(e){let t=R(e.type);return t==null?[`No plugin found for task type: ${e.type}`]:t.validate==null?[]:t.validate(e)}function ge(e,t,n,r){return{name:e,...r?.version!=null&&{version:r.version},taskTypes:[t],execute:n,...r?.getDiff!=null&&{getDiff:r.getDiff},...r?.validate!=null&&{validate:r.validate}}}async function H(e,t=new Map){let n={};if(e.length===0)return n;for(let r of e)try{let e,i=t.get(r.id);switch(r.type){case`input`:{let t={message:r.message};if(i!==void 0&&(t.default=String(i)),r.required!==void 0&&(t.required=r.required),e=await(0,h.input)(t),r.required&&(e==null||typeof e==`string`&&e.trim()===``))throw y(`${r.message} is required`,`error`),Error(`Prompt "${r.id}" is required`);break}case`password`:if(e=await(0,h.password)({message:r.message,mask:`*`}),r.required&&(e==null||typeof e==`string`&&e.trim()===``))throw y(`${r.message} is required`,`error`),Error(`Prompt "${r.id}" is required`);break;case`number`:{let t={message:r.message};if(i!==void 0&&(t.default=Number(i)),r.required!==void 0&&(t.required=r.required),r.min!==void 0&&(t.min=r.min),r.max!==void 0&&(t.max=r.max),e=await(0,h.number)(t),r.required&&e==null)throw y(`${r.message} is required`,`error`),Error(`Prompt "${r.id}" is required`);break}case`select`:{let t={message:r.message,choices:r.choices.map(e=>({name:e.name,value:e.value}))};i!==void 0&&(t.default=i),e=await(0,h.select)(t);break}case`confirm`:{let t=i===void 0?!1:!!i;e=await(0,h.confirm)({message:r.message,default:t});break}default:throw y(`Unknown prompt type: ${r.type}`,`error`),Error(`Unknown prompt type: ${r.type}`)}n[r.id]=e}catch(e){throw e instanceof Error&&y(`Failed to collect prompt "${r.id}": ${e.message}`,`error`),e}return console.log(``),n}async function U(e,t){if(e===void 0)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let n=e;if(n.type===`execute`){let e=n.value;if(typeof e!=`string`){y(`Prompt "${t}": execute default value must have a string command`,`error`);return}try{let t=(0,d.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){y(`Prompt "${t}": failed to execute default value command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}else if(n.type===`value`)return n.value;return e}async function W(e){let t=new Map,n=e.map(async e=>{if(e.default!==void 0){let n=await U(e.default,e.id);n!==void 0&&t.set(e.id,n)}});return await Promise.all(n),t}function G(e){let t=[],n=new Set,r=new Set,i=new Set;for(let a of e){if(n.has(a.id)&&t.push(`Duplicate prompt ID: ${a.id}`),n.add(a.id),a.global?r.add(a.id):(r.has(a.id)&&t.push(`Prompt ID "${a.id}" is used as both global and task-specific. Use unique IDs or mark all instances as global.`),i.add(a.id)),a.global&&i.has(a.id)&&t.push(`Prompt ID "${a.id}" is used as both global and task-specific. Use unique IDs or mark all instances as global.`),/^[\w-]+$/u.test(a.id)||t.push(`Invalid prompt ID "${a.id}": must contain only alphanumeric characters, underscores, and hyphens`),(!a.message||a.message.trim()===``)&&t.push(`Prompt "${a.id}" must have a non-empty message`),a.type===`select`){a.choices.length===0&&t.push(`Select prompt "${a.id}" must have at least one choice`);for(let e of a.choices)(!e.name||e.name.trim()===``)&&t.push(`Select prompt "${a.id}" has a choice with empty name`),e.value===void 0&&t.push(`Select prompt "${a.id}" has a choice with undefined value`)}a.type===`number`&&a.min!==void 0&&a.max!==void 0&&a.min>a.max&&t.push(`Number prompt "${a.id}" has min greater than max`)}return t}const K=`.scaffoldfyialized`;function q(){let e=l.default.join(u.default.cwd(),K);if(!c.default.existsSync(e))return null;try{let t=c.default.readFileSync(e,`utf-8`);return JSON.parse(t)}catch{return null}}function J(e,t,n=!1){if(n)return;let r=l.default.join(u.default.cwd(),`package.json`),i=`0.0.0`;try{i=JSON.parse(c.default.readFileSync(r,`utf-8`)).version??`0.0.0`}catch{}let a={initializedAt:new Date().toISOString(),config:e,completedTasks:t,version:i},o=l.default.join(u.default.cwd(),K);c.default.writeFileSync(o,JSON.stringify(a,null,2))}const Y=(0,f.promisify)(c.default.readFile),X=(0,f.promisify)(c.default.writeFile),_e=(0,f.promisify)(c.default.rename),ve=2;async function ye(e,t){if(e.condition!=null&&e.condition!==``&&!S(e.condition,t)){y(`Condition not met, skipping update-json task`,`info`);return}let n=l.default.join(u.default.cwd(),e.file),{updates:r}=e,i=await Y(n,`utf-8`),a=JSON.parse(i);function o(e){if(typeof e==`string`)return b(e,t);if(Array.isArray(e))return e.map(e=>o(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=o(r);return t}return e}for(let[e,t]of Object.entries(r)){let n=o(t);e.includes(`.`)?x(a,e,n):a[e]=n}await X(n,`${JSON.stringify(a,null,2)}\n`)}async function be(e,t){if(e.condition!=null&&e.condition!==``&&!S(e.condition,t)){y(`Condition not met, skipping template task`,`info`);return}let n=l.default.join(u.default.cwd(),e.file),r=e.template!=null&&e.template!==``,i=e.templateFile!=null&&e.templateFile!==``;if(!r&&!i)throw Error(`Template task requires either "template" (inline) or "templateFile" (file path) to be specified`);if(r&&i)throw Error(`Template task cannot have both "template" and "templateFile" specified. Use one or the other.`);let a;if(i&&e.templateFile.endsWith(`.hbs`))a=te(e.templateFile,t);else if(i){let n=e.templateFile,r=l.default.isAbsolute(n)?n:l.default.join(u.default.cwd(),n);if(!c.default.existsSync(r))throw Error(`Template file not found: ${n}`);a=b(c.default.readFileSync(r,`utf-8`),t)}else a=b(e.template,t);await X(n,a)}async function xe(e,t){if(e.condition!=null&&e.condition!==``&&!S(e.condition,t)){y(`Condition not met, skipping regex-replace task`,`info`);return}let n=l.default.join(u.default.cwd(),e.file),{pattern:r}=e,i=e.flags??``,a=e.replacement||``,o=await Y(n,`utf-8`),s=new RegExp(r,i);o=o.replace(s,b(a,t)),await X(n,o)}async function Se(e,t){if(e.condition!=null&&e.condition!==``&&!S(e.condition,t)){y(`Condition not met, skipping replace-in-file task`,`info`);return}let n=l.default.join(u.default.cwd(),e.file),{replacements:r}=e;if(!c.default.existsSync(n)){y(`File not found: ${n}, skipping`,`warn`);return}let i=await Y(n,`utf-8`);for(let{find:e,replace:n}of r){let r=b(n,t);i=i.replace(new RegExp(e,`gu`),r)}await X(n,i)}async function Ce(e,t){let{paths:n,condition:r}=e;if(r!=null&&r!==``){if(!t){y(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!S(r,t)){y(`Condition not met, skipping deletion`,`info`);return}}for(let e of n){let t=l.default.join(u.default.cwd(),e);c.default.existsSync(t)&&c.default.rmSync(t,{recursive:!0,force:!0})}}async function we(e,t){if(e.condition!=null&&e.condition!==``&&!S(e.condition,t)){y(`Condition not met, skipping rename task`,`info`);return}let n=l.default.join(u.default.cwd(),b(e.from,t)),r=l.default.join(u.default.cwd(),b(e.to,t));if(!c.default.existsSync(n)){y(`Source path does not exist: ${n}`,`warn`);return}await _e(n,r)}async function Te(e,t){if(e.condition!=null&&e.condition!==``){if(!t){y(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!S(e.condition,t)){y(`Condition not met, skipping git-init task`,`info`);return}}if(e.removeExisting){let e=l.default.join(u.default.cwd(),`.git`);c.default.existsSync(e)&&c.default.rmSync(e,{recursive:!0,force:!0})}if((0,d.execSync)(`git init`,{stdio:`inherit`}),e.initialCommit){let t=e.message??`Initial commit`;(0,d.execSync)(`git add .`,{stdio:`inherit`}),(0,d.execSync)(`git commit -m "${t}"`,{stdio:`inherit`})}}async function Ee(e,t){if(e.condition!=null&&e.condition!==``){if(!t){y(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!S(e.condition,t)){y(`Condition not met, skipping exec task`,`info`);return}}let n=e.cwd==null?u.default.cwd():l.default.join(u.default.cwd(),e.cwd);(0,d.execSync)(e.command,{cwd:n,stdio:`inherit`})}async function De(e,t,n=!1){if(n){y(`[DRY RUN] Would execute: ${e.name}`,`info`);return}if(z(e.type)){await V(e,t,{dryRun:n});return}switch(e.type){case`update-json`:await ye(e.config,t);break;case`template`:await be(e.config,t);break;case`regex-replace`:await xe(e.config,t);break;case`replace-in-file`:await Se(e.config,t);break;case`delete`:await Ce(e.config,t);break;case`rename`:await we(e.config,t);break;case`git-init`:await Te(e.config,t);break;case`exec`:await Ee(e.config,t);break;default:{let t=e.type;throw TypeError(`Unknown task type: ${t}`)}}}async function Oe(e,t,n,r,i=!1){try{return y(`[${n}/${r}] Running: ${e.name}...`,`info`),await De(e,t,i),y(`✓ ${e.name}`,`success`),!0}catch(t){return y(`✗ Failed: ${e.name}`,`error`),t instanceof Error&&(y(` Reason: ${t.message}`,`error`),t.stack!=null&&u.default.env.DEBUG!=null&&console.error(t.stack)),e.required&&y(` This is a required task. Initialization cannot continue.`,`error`),!1}}function ke(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 Error(`Circular dependency detected involving task: ${e}`);r.add(e);let o=i.get(e);if(!o)throw Error(`Task not found: ${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}const Ae=(0,f.promisify)(c.default.readFile);async function je(e,t){let n=q();n&&!t.force&&(console.log(``),y(`⚠️ This template has already been initialized!`,`warn`),console.log(``),y(` Initialized at: ${new Date(n.initializedAt).toLocaleString()}`,`info`),console.log(``),await v(`Do you want to re-initialize? This may cause issues`,!1)||(y(`Initialization cancelled`,`info`),u.default.exit(0)),console.log(``),y(`⚠️ Proceeding with re-initialization...`,`warn`),console.log(``));let r=e.filter(e=>e.enabled);y(`Resolving task dependencies...`,`info`);let i=ke(r);console.log(``),y(`Welcome to the template initialization script!`,`info`),console.log(``),t.dryRun&&(y(`🔍 DRY RUN MODE - No changes will be made`,`warn`),console.log(``)),y(`This will initialize your project based on the defined tasks.`,`info`),console.log(``);let a=ee(),o=[],s=[],f=[];for(let e of i)if(e.prompts&&e.prompts.length>0)for(let t of e.prompts)t.global?o.some(e=>e.id===t.id)||(o.push(t),f.push(t)):(s.push(t),f.push(t));if(f.length>0){let e=G(f);e.length>0&&(y(`❌ Prompt validation errors:`,`error`),e.forEach(e=>y(` - ${e}`,`error`)),console.log(``),u.default.exit(1)),y(`Resolving prompt default values...`,`info`);let t=await W(f);console.log(``);let n={};if(o.length>0&&(console.log(``),y(`📋 Global prompts (available to all tasks):`,`info`),console.log(``),n=await H(o,t),Object.assign(a,n)),s.length>0){o.length>0&&(y(`📋 Task-specific prompts:`,`info`),console.log(``));let e=await H(s,t);Object.assign(a,e)}}if(t.dryRun){await P(i,a),y(`🔍 Dry run completed - no changes were made`,`info`),y(`Run without --dry-run to apply changes`,`info`);return}console.log(``),y(`Starting initialization tasks...`,`info`),console.log(``),await B(`beforeAll`,a);let p=i.length,m=0,h=0,g=[];for(let e=0;e<i.length;e++){let n=i[e];if(n!=null){if(await B(`beforeTask`,n,a),await Oe(n,a,e+1,p,t.dryRun))m++,g.push(n.id),await B(`afterTask`,n,a);else if(n.required){h++,await B(`onError`,Error(`Task ${n.name} failed`),n);break}else y(`⚠️ Non-critical task failed, continuing...`,`warn`),await B(`onError`,Error(`Task ${n.name} failed`),n);console.log(``)}}if(h>0&&(y(`❌ Initialization failed with ${h} critical error(s)`,`error`),y(`✓ Completed: ${m}/${p} tasks`,`info`),u.default.exit(1)),await B(`afterAll`,a),J(a,g,t.dryRun),y(`✅ Initialization completed successfully!`,`success`),console.log(``),y(`✓ Completed: ${m}/${p} tasks`,`success`),console.log(``),!t.dryRun&&t.tasksFilePath!=null&&c.default.existsSync(t.tasksFilePath))try{c.default.unlinkSync(t.tasksFilePath),y(`🗑️ Removed tasks file: ${l.default.basename(t.tasksFilePath)}`,`info`),console.log(``)}catch(e){y(`⚠️ Failed to remove tasks file: ${e instanceof Error?e.message:`Unknown error`}`,`warn`)}if(!t.dryRun){y(`Next steps:`,`info`),y(`1. Review the changes made to your project`,`info`),y(`2. Commit the changes to git`,`info`);let e=l.default.join(u.default.cwd(),`package.json`);c.default.existsSync(e)&&JSON.parse(await Ae(e,`utf-8`)).scripts?.[`turbo:gen:init`]!=null&&(y(`3. Run "pnpm run turbo:gen:init" to create your first package`,`info`),console.log(``),await v(`Would you like to run turbo:gen:init now?`,!0)&&(console.log(``),y(`Running turbo:gen:init...`,`info`),(0,d.execSync)(`pnpm run turbo:gen:init`,{stdio:`inherit`})))}console.log(``)}const Me=(0,f.promisify)(c.default.readFile);function Z(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}async function Ne(e){try{let t=await fetch(e);if(!t.ok)throw Error(`Failed to fetch template from ${e}: ${t.status} ${t.statusText}`);return await t.text()}catch(t){throw t instanceof Error&&t.message.includes(`Failed to fetch`)?t:Error(`Failed to fetch template from ${e}: ${t instanceof Error?t.message:String(t)}`)}}const Q=new Map;async function Pe(e,t=new Set){let n=Z(e),r;if(r=n||l.default.isAbsolute(e)?e:l.default.resolve(u.default.cwd(),e),Q.has(r))return Q.get(r);if(t.has(r))throw Error(`Circular dependency detected: ${Array.from(t).join(` -> `)} -> ${r}`);t.add(r);let i;if(n)i=await Ne(r);else{if(!c.default.existsSync(r))throw Error(`Template file not found: ${r}`);i=await Me(r,`utf-8`)}let a;try{a=JSON.parse(i)}catch(e){throw Error(`Failed to parse template file ${r}: ${e instanceof Error?e.message:String(e)}`)}if(!Array.isArray(a.tasks))throw TypeError(`Invalid template file ${r}: 'tasks' array is required`);return Q.set(r,a),a}async function $(e,t,n=new Set){let r=Z(e),i;if(i=r||l.default.isAbsolute(e)?e:t==null?l.default.resolve(u.default.cwd(),e):Z(t)?new URL(e,t).href:l.default.resolve(t,e),n.has(i))throw Error(`Circular dependency detected: ${Array.from(n).join(` -> `)} -> ${i}`);n.add(i);let a=await Pe(i);if(a.extends==null||a.extends===``)return a;let o=Z(i)?new URL(`.`,i).href:l.default.dirname(i),s=Array.isArray(a.extends)?a.extends:[a.extends],c=[];for(let e of s){let t=await $(e,o,n);c.push(t)}return Fe([...c,a])}function Fe(e){if(e.length===0)return{tasks:[]};if(e.length===1)return e[0];let t=new Map;for(let n of e)for(let e of n.tasks)if(t.has(e.id)){let n=t.get(e.id);t.set(e.id,Ie(n,e))}else t.set(e.id,{...e});return{tasks:Array.from(t.values())}}function Ie(e,t){let n=typeof e.config==`object`&&e.config!==null&&typeof t.config==`object`&&t.config!==null?{...e.config,...t.config}:t.config,r=e.prompts?[...e.prompts]:void 0;if(t.prompts&&t.prompts.length>0)if(!r)r=[...t.prompts];else{let e=new Map(r.map(e=>[e.id,e]));for(let n of t.prompts)e.set(n.id,n);r=Array.from(e.values())}let i=[...e.dependencies??[],...t.dependencies??[]],a=i.length>0?[...new Set(i)]:void 0;return{...e,...t,config:n,...r!=null&&{prompts:r},...a!=null&&{dependencies:a}}}function Le(){Q.clear()}async function Re(e){y(`Loading tasks from ${e}...`,`info`);let t=await $(e);return y(`Loaded ${t.tasks.length} task(s)`,`info`),t.extends!=null&&t.extends!==``&&y(`Extended from: ${(Array.isArray(t.extends)?t.extends:[t.extends]).join(`, `)}`,`info`),t.tasks}const ze=u.default.argv.includes(`--dry-run`),Be=u.default.argv.includes(`--force`);async function Ve(e){try{let t=e||[];t.length===0&&(y(`⚠️ No tasks defined. Use --tasks-file to specify tasks or call runWithTasks() programmatically.`,`warn`),console.log(``),y(`Example: scaffoldfy --tasks-file ./tasks.json`,`info`),console.log(``),u.default.exit(1)),await je(t,{dryRun:ze,force:Be,tasksFilePath:void 0})}catch(e){y(`❌ Initialization failed`,`error`),e instanceof Error?(y(`Error: ${e.message}`,`error`),u.default.env.DEBUG!=null&&console.error(e.stack)):console.error(e),u.default.exit(1)}}async function He(e,t){try{await je(e,{dryRun:t?.dryRun??ze,force:t?.force??Be,tasksFilePath:t?.tasksFilePath??void 0})}catch(e){y(`❌ Initialization failed`,`error`),e instanceof Error?(y(`Error: ${e.message}`,`error`),u.default.env.DEBUG!=null&&console.error(e.stack)):console.error(e),u.default.exit(1)}}Object.defineProperty(exports,`A`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`B`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`C`,{enumerable:!0,get:function(){return me}}),Object.defineProperty(exports,`D`,{enumerable:!0,get:function(){return ce}}),Object.defineProperty(exports,`E`,{enumerable:!0,get:function(){return pe}}),Object.defineProperty(exports,`F`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`G`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`H`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`I`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`K`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`L`,{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,`M`,{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,`N`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`O`,{enumerable:!0,get:function(){return le}}),Object.defineProperty(exports,`P`,{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,`R`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`S`,{enumerable:!0,get:function(){return R}}),Object.defineProperty(exports,`T`,{enumerable:!0,get:function(){return de}}),Object.defineProperty(exports,`U`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`V`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`W`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return Re}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return V}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return ke}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return H}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return U}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return $}}),Object.defineProperty(exports,`j`,{enumerable:!0,get:function(){return se}}),Object.defineProperty(exports,`k`,{enumerable:!0,get:function(){return he}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return De}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return He}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return Pe}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return G}}),Object.defineProperty(exports,`q`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return Le}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return Fe}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return Ve}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return Oe}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return fe}}),Object.defineProperty(exports,`w`,{enumerable:!0,get:function(){return z}}),Object.defineProperty(exports,`x`,{enumerable:!0,get:function(){return ue}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return ge}}),Object.defineProperty(exports,`z`,{enumerable:!0,get:function(){return oe}});
|
package/dist/src-_h_NfVky.js
DELETED
|
@@ -1,13 +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{promisify as i}from"node:util";import a from"node:readline";import o from"handlebars";import{confirm as s,input as c,number as l,password as u,select as d}from"@inquirer/prompts";function ee(){return{}}function f(){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 p(e,t){let r=a.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 m(e,t=!1){return p(`${e} (${t?`Y/n`:`y/N`})`,t?`y`:`n`).then(e=>e.toLowerCase()===`y`||e.toLowerCase()===`yes`)}function h(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 g(e,t){return e.replace(/\{\{(?<key>\w+)\}\}/gu,(e,n)=>t[n]?.toString()??``)}function _(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 v(e,t){try{let n={...t};return Function(...Object.keys(n),`'use strict'; return (${e})`)(...Object.values(n))}catch(t){return h(`Failed to evaluate condition: ${e}`,`warn`),t instanceof Error&&h(` Error: ${t.message}`,`warn`),!1}}function te(r,i){try{let a=e.isAbsolute(r)?r:e.join(n.cwd(),r);if(!t.existsSync(a))throw Error(`Template file not found: ${r}`);return ne(t.readFileSync(a,`utf-8`),i)}catch(e){throw h(`Failed to read template file: ${r}`,`error`),e instanceof Error&&h(` Error: ${e.message}`,`error`),e}}function ne(e,t){try{return o.compile(e)(t)}catch(e){throw h(`Failed to compile Handlebars template`,`error`),e instanceof Error&&h(` Error: ${e.message}`,`error`),e}}const y=i(t.readFile),b={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function x(e,t){switch(t){case`add`:return`${b.green}+ ${e}${b.reset}`;case`remove`:return`${b.red}- ${e}${b.reset}`;case`context`:return`${b.gray} ${e}${b.reset}`;default:return e}}function S(e,t){let n=e.split(`
|
|
2
|
-
`),r=t.split(`
|
|
3
|
-
`),i=[],a=Math.max(n.length,r.length);for(let e=0;e<a;e++){let t=n[e],a=r[e];t===a?t!==void 0&&i.push(x(t,`context`)):(t!==void 0&&i.push(x(t,`remove`)),a!==void 0&&i.push(x(a,`add`)))}return i}async function C(r,i){if(r.condition!=null&&r.condition!==``&&!v(r.condition,i))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let a=e.join(n.cwd(),r.file);if(!t.existsSync(a))return`${b.red}✗ File not found: ${r.file}${b.reset}`;try{let e=await y(a,`utf-8`),t=JSON.parse(e),n={...t};function o(e){if(typeof e==`string`)return g(e,i);if(Array.isArray(e))return e.map(e=>o(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=o(r);return t}return e}for(let[e,n]of Object.entries(r.updates)){let r=o(n);e.includes(`.`)?_(t,e,r):t[e]=r}let s=JSON.stringify(n,null,2),c=JSON.stringify(t,null,2);if(s===c)return`${b.cyan}→ No changes${b.reset}`;let l=S(s,c);return`${b.blue}File: ${r.file}${b.reset}\n${l.join(`
|
|
4
|
-
`)}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}async function re(r,i){if(r.condition!=null&&r.condition!==``&&!v(r.condition,i))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;if(r.template==null||r.template===``)return`${b.red}✗ No template content provided for file: ${r.file}${b.reset}`;let a=e.join(n.cwd(),r.file),o=g(r.template,i);if(!t.existsSync(a)){let e=o.split(`
|
|
5
|
-
`).slice(0,10).join(`
|
|
6
|
-
`),t=o.split(`
|
|
7
|
-
`).length>10;return`${b.blue}File: ${r.file}${b.reset}\n${b.green}+ New file would be created${b.reset}\n${b.gray}Content preview:${b.reset}\n${e}${t?`
|
|
8
|
-
...`:``}`}try{let e=await y(a,`utf-8`);if(e===o)return`${b.cyan}→ No changes${b.reset}`;let t=S(e,o);return`${b.blue}File: ${r.file}${b.reset}\n${t.join(`
|
|
9
|
-
`)}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}async function ie(r,i){if(r.condition!=null&&r.condition!==``&&!v(r.condition,i))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let a=e.join(n.cwd(),r.file);if(!t.existsSync(a))return`${b.red}✗ File not found: ${r.file}${b.reset}`;try{let e=await y(a,`utf-8`),t=new RegExp(r.pattern,r.flags??`g`),n=g(r.replacement,i),o=e.replace(t,n);if(e===o)return`${b.cyan}→ No matches found${b.reset}`;let s=S(e,o);return`${b.blue}File: ${r.file}${b.reset}\n${s.join(`
|
|
10
|
-
`)}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}async function w(r,i){if(r.condition!=null&&r.condition!==``&&!v(r.condition,i))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let a=e.join(n.cwd(),r.file);if(!t.existsSync(a))return`${b.red}✗ File not found: ${r.file}${b.reset}`;try{let e=await y(a,`utf-8`),t=e;for(let{find:t,replace:n}of r.replacements){let r=g(t,i),a=g(n,i);e=e.replace(r,a)}if(t===e)return`${b.cyan}→ No changes${b.reset}`;let n=S(t,e);return`${b.blue}File: ${r.file}${b.reset}\n${n.join(`
|
|
11
|
-
`)}`}catch(e){return`${b.red}✗ Error: ${e instanceof Error?e.message:String(e)}${b.reset}`}}function T(r,i){if(r.condition!=null&&r.condition!==``&&!v(r.condition,i))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let a=r.paths.map(e=>g(e,i)).filter(r=>t.existsSync(e.join(n.cwd(),r)));return a.length===0?`${b.cyan}→ No files/directories to delete${b.reset}`:`${b.red}Would delete:${b.reset}\n${a.map(e=>`${b.red} - ${e}${b.reset}`).join(`
|
|
12
|
-
`)}`}function E(r,i){if(r.condition!=null&&r.condition!==``&&!v(r.condition,i))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let a=g(r.from,i),o=g(r.to,i),s=e.join(n.cwd(),a),c=e.join(n.cwd(),o);return t.existsSync(s)?t.existsSync(c)?`${b.yellow}⚠ Destination already exists: ${o}${b.reset}\n${b.cyan}Would rename: ${a} → ${o}${b.reset}`:`${b.cyan}Would rename: ${a} → ${o}${b.reset}`:`${b.red}✗ Source not found: ${a}${b.reset}`}function D(r){if(r.condition!=null&&r.condition!==``)return`${b.yellow}⊘ Condition check skipped in dry-run${b.reset}`;let i=e.join(n.cwd(),`.git`),a=t.existsSync(i),o=[];if(r.removeExisting&&a&&o.push(`${b.red}Would remove existing .git directory${b.reset}`),o.push(`${b.green}Would initialize git repository${b.reset}`),r.initialCommit){let e=r.message??`Initial commit`;o.push(`${b.green}Would create initial commit: "${e}"${b.reset}`)}return o.join(`
|
|
13
|
-
`)}function O(e,t){if(e.condition!=null&&e.condition!==``&&!v(e.condition,t))return`${b.yellow}⊘ Condition not met - task would be skipped${b.reset}`;let r=g(e.command,t),i=e.cwd==null?n.cwd():g(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}`}async function k(e,t){try{switch(e.type){case`update-json`:return await C(e.config,t);case`template`:return await re(e.config,t);case`regex-replace`:return await ie(e.config,t);case`replace-in-file`:return await w(e.config,t);case`delete`:return T(e.config,t);case`rename`:return E(e.config,t);case`git-init`:return D(e.config);case`exec`:return O(e.config,t);default:{let t=e.type;return`${b.yellow}⚠ Diff not available for task type: ${t}${b.reset}`}}}catch(e){return`${b.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${b.reset}`}}async function A(e,t){console.log(``),console.log(`${b.blue}═══════════════════════════════════════════════════════${b.reset}`),console.log(`${b.blue} DRY RUN - Preview of changes${b.reset}`),console.log(`${b.blue}═══════════════════════════════════════════════════════${b.reset}`),console.log(``);for(let n of e){console.log(`${b.cyan}▶ Task: ${n.name}${b.reset}`),console.log(`${b.gray} ${n.description}${b.reset}`),console.log(``);let e=await k(n,t);console.log(e),console.log(``),console.log(`${b.gray}${`─`.repeat(55)}${b.reset}`),console.log(``)}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}`),console.log(``)}const j=new Map,M={},N=new Map;function ae(e){if(e.name==null||e.name===``)throw TypeError(`Plugin name is required`);if(!Array.isArray(e.taskTypes)||e.taskTypes.length===0)throw TypeError(`Plugin ${e.name} must define at least one task type`);if(typeof e.execute!=`function`)throw TypeError(`Plugin ${e.name} must provide an execute function`);if(j.has(e.name))throw TypeError(`Plugin ${e.name} is already registered`);for(let t of e.taskTypes)if(N.has(t)){let e=N.get(t);throw TypeError(`Task type "${t}" is already registered by plugin "${e}"`)}j.set(e.name,e);for(let t of e.taskTypes)N.set(t,e.name);h(`✓ Registered plugin: ${e.name}${e.version==null?``:` v${e.version}`}`,`info`)}function oe(e){let t=j.get(e);if(t!=null){for(let e of t.taskTypes)N.delete(e);j.delete(e)}}function se(e){return j.get(e)}function P(e){let t=N.get(e);if(t!=null)return j.get(t)}function F(e){return N.has(e)}function ce(){return Array.from(j.keys())}function le(){j.clear(),N.clear()}function ue(e){e.beforeAll!=null&&(M.beforeAll=e.beforeAll),e.afterAll!=null&&(M.afterAll=e.afterAll),e.beforeTask!=null&&(M.beforeTask=e.beforeTask),e.afterTask!=null&&(M.afterTask=e.afterTask),e.onError!=null&&(M.onError=e.onError)}async function I(e,...t){let n=M[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){h(`Error in ${e} hook: ${t instanceof Error?t.message:String(t)}`,`error`)}}async function L(e,t,n){let r=P(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}async function de(e,t){let n=P(e.type);if(!(n==null||n.getDiff==null))return n.getDiff(e,t)}function fe(e){let t=P(e.type);return t==null?[`No plugin found for task type: ${e.type}`]:t.validate==null?[]:t.validate(e)}function pe(e,t,n,r){return{name:e,...r?.version!=null&&{version:r.version},taskTypes:[t],execute:n,...r?.getDiff!=null&&{getDiff:r.getDiff},...r?.validate!=null&&{validate:r.validate}}}async function R(e,t=new Map){let n={};if(e.length===0)return n;for(let r of e)try{let e,i=t.get(r.id);switch(r.type){case`input`:{let t={message:r.message};if(i!==void 0&&(t.default=String(i)),r.required!==void 0&&(t.required=r.required),e=await c(t),r.required&&(e==null||typeof e==`string`&&e.trim()===``))throw h(`${r.message} is required`,`error`),Error(`Prompt "${r.id}" is required`);break}case`password`:if(e=await u({message:r.message,mask:`*`}),r.required&&(e==null||typeof e==`string`&&e.trim()===``))throw h(`${r.message} is required`,`error`),Error(`Prompt "${r.id}" is required`);break;case`number`:{let t={message:r.message};if(i!==void 0&&(t.default=Number(i)),r.required!==void 0&&(t.required=r.required),r.min!==void 0&&(t.min=r.min),r.max!==void 0&&(t.max=r.max),e=await l(t),r.required&&e==null)throw h(`${r.message} is required`,`error`),Error(`Prompt "${r.id}" is required`);break}case`select`:{let t={message:r.message,choices:r.choices.map(e=>({name:e.name,value:e.value}))};i!==void 0&&(t.default=i),e=await d(t);break}case`confirm`:{let t=i===void 0?!1:!!i;e=await s({message:r.message,default:t});break}default:throw h(`Unknown prompt type: ${r.type}`,`error`),Error(`Unknown prompt type: ${r.type}`)}n[r.id]=e}catch(e){throw e instanceof Error&&h(`Failed to collect prompt "${r.id}": ${e.message}`,`error`),e}return console.log(``),n}async function z(e,t){if(e===void 0)return;if(typeof e!=`object`||!e||Array.isArray(e))return e;let n=e;if(n.type===`execute`){let e=n.value;if(typeof e!=`string`){h(`Prompt "${t}": execute default value must have a string command`,`error`);return}try{let t=r(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){h(`Prompt "${t}": failed to execute default value command: ${e instanceof Error?e.message:`Unknown error`}`,`warn`);return}}else if(n.type===`value`)return n.value;return e}async function B(e){let t=new Map,n=e.map(async e=>{if(e.default!==void 0){let n=await z(e.default,e.id);n!==void 0&&t.set(e.id,n)}});return await Promise.all(n),t}function V(e){let t=[],n=new Set,r=new Set,i=new Set;for(let a of e){if(n.has(a.id)&&t.push(`Duplicate prompt ID: ${a.id}`),n.add(a.id),a.global?r.add(a.id):(r.has(a.id)&&t.push(`Prompt ID "${a.id}" is used as both global and task-specific. Use unique IDs or mark all instances as global.`),i.add(a.id)),a.global&&i.has(a.id)&&t.push(`Prompt ID "${a.id}" is used as both global and task-specific. Use unique IDs or mark all instances as global.`),/^[\w-]+$/u.test(a.id)||t.push(`Invalid prompt ID "${a.id}": must contain only alphanumeric characters, underscores, and hyphens`),(!a.message||a.message.trim()===``)&&t.push(`Prompt "${a.id}" must have a non-empty message`),a.type===`select`){a.choices.length===0&&t.push(`Select prompt "${a.id}" must have at least one choice`);for(let e of a.choices)(!e.name||e.name.trim()===``)&&t.push(`Select prompt "${a.id}" has a choice with empty name`),e.value===void 0&&t.push(`Select prompt "${a.id}" has a choice with undefined value`)}a.type===`number`&&a.min!==void 0&&a.max!==void 0&&a.min>a.max&&t.push(`Number prompt "${a.id}" has min greater than max`)}return t}const H=`.scaffoldfyialized`;function U(){let r=e.join(n.cwd(),H);if(!t.existsSync(r))return null;try{let e=t.readFileSync(r,`utf-8`);return JSON.parse(e)}catch{return null}}function W(r,i,a=!1){if(a)return;let o=e.join(n.cwd(),`package.json`),s=`0.0.0`;try{s=JSON.parse(t.readFileSync(o,`utf-8`)).version??`0.0.0`}catch{}let c={initializedAt:new Date().toISOString(),config:r,completedTasks:i,version:s},l=e.join(n.cwd(),H);t.writeFileSync(l,JSON.stringify(c,null,2))}const G=i(t.readFile),K=i(t.writeFile),me=i(t.rename);async function he(t,r){if(t.condition!=null&&t.condition!==``&&!v(t.condition,r)){h(`Condition not met, skipping update-json task`,`info`);return}let i=e.join(n.cwd(),t.file),{updates:a}=t,o=await G(i,`utf-8`),s=JSON.parse(o);function c(e){if(typeof e==`string`)return g(e,r);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(a)){let n=c(t);e.includes(`.`)?_(s,e,n):s[e]=n}await K(i,`${JSON.stringify(s,null,2)}\n`)}async function ge(r,i){if(r.condition!=null&&r.condition!==``&&!v(r.condition,i)){h(`Condition not met, skipping template task`,`info`);return}let a=e.join(n.cwd(),r.file),o=r.template!=null&&r.template!==``,s=r.templateFile!=null&&r.templateFile!==``;if(!o&&!s)throw Error(`Template task requires either "template" (inline) or "templateFile" (file path) to be specified`);if(o&&s)throw Error(`Template task cannot have both "template" and "templateFile" specified. Use one or the other.`);let c;if(s&&r.templateFile.endsWith(`.hbs`))c=te(r.templateFile,i);else if(s){let a=r.templateFile,o=e.isAbsolute(a)?a:e.join(n.cwd(),a);if(!t.existsSync(o))throw Error(`Template file not found: ${a}`);c=g(t.readFileSync(o,`utf-8`),i)}else c=g(r.template,i);await K(a,c)}async function _e(t,r){if(t.condition!=null&&t.condition!==``&&!v(t.condition,r)){h(`Condition not met, skipping regex-replace task`,`info`);return}let i=e.join(n.cwd(),t.file),{pattern:a}=t,o=t.flags??``,s=t.replacement||``,c=await G(i,`utf-8`),l=new RegExp(a,o);c=c.replace(l,g(s,r)),await K(i,c)}async function ve(r,i){if(r.condition!=null&&r.condition!==``&&!v(r.condition,i)){h(`Condition not met, skipping replace-in-file task`,`info`);return}let a=e.join(n.cwd(),r.file),{replacements:o}=r;if(!t.existsSync(a)){h(`File not found: ${a}, skipping`,`warn`);return}let s=await G(a,`utf-8`);for(let{find:e,replace:t}of o){let n=g(t,i);s=s.replace(new RegExp(e,`gu`),n)}await K(a,s)}async function ye(r,i){let{paths:a,condition:o}=r;if(o!=null&&o!==``){if(!i){h(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!v(o,i)){h(`Condition not met, skipping deletion`,`info`);return}}for(let r of a){let i=e.join(n.cwd(),r);t.existsSync(i)&&t.rmSync(i,{recursive:!0,force:!0})}}async function be(r,i){if(r.condition!=null&&r.condition!==``&&!v(r.condition,i)){h(`Condition not met, skipping rename task`,`info`);return}let a=e.join(n.cwd(),g(r.from,i)),o=e.join(n.cwd(),g(r.to,i));if(!t.existsSync(a)){h(`Source path does not exist: ${a}`,`warn`);return}await me(a,o)}async function xe(i,a){if(i.condition!=null&&i.condition!==``){if(!a){h(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!v(i.condition,a)){h(`Condition not met, skipping git-init task`,`info`);return}}if(i.removeExisting){let r=e.join(n.cwd(),`.git`);t.existsSync(r)&&t.rmSync(r,{recursive:!0,force:!0})}if(r(`git init`,{stdio:`inherit`}),i.initialCommit){let e=i.message??`Initial commit`;r(`git add .`,{stdio:`inherit`}),r(`git commit -m "${e}"`,{stdio:`inherit`})}}async function Se(t,i){if(t.condition!=null&&t.condition!==``){if(!i){h(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!v(t.condition,i)){h(`Condition not met, skipping exec task`,`info`);return}}let a=t.cwd==null?n.cwd():e.join(n.cwd(),t.cwd);r(t.command,{cwd:a,stdio:`inherit`})}async function q(e,t,n=!1){if(n){h(`[DRY RUN] Would execute: ${e.name}`,`info`);return}if(F(e.type)){await L(e,t,{dryRun:n});return}switch(e.type){case`update-json`:await he(e.config,t);break;case`template`:await ge(e.config,t);break;case`regex-replace`:await _e(e.config,t);break;case`replace-in-file`:await ve(e.config,t);break;case`delete`:await ye(e.config,t);break;case`rename`:await be(e.config,t);break;case`git-init`:await xe(e.config,t);break;case`exec`:await Se(e.config,t);break;default:{let t=e.type;throw TypeError(`Unknown task type: ${t}`)}}}async function J(e,t,r,i,a=!1){try{return h(`[${r}/${i}] Running: ${e.name}...`,`info`),await q(e,t,a),h(`✓ ${e.name}`,`success`),!0}catch(t){return h(`✗ Failed: ${e.name}`,`error`),t instanceof Error&&(h(` Reason: ${t.message}`,`error`),t.stack!=null&&n.env.DEBUG!=null&&console.error(t.stack)),e.required&&h(` This is a required task. Initialization cannot continue.`,`error`),!1}}function Y(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 Error(`Circular dependency detected involving task: ${e}`);r.add(e);let o=i.get(e);if(!o)throw Error(`Task not found: ${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}const Ce=i(t.readFile);async function X(i,a){let o=U();o&&!a.force&&(console.log(``),h(`⚠️ This template has already been initialized!`,`warn`),console.log(``),h(` Initialized at: ${new Date(o.initializedAt).toLocaleString()}`,`info`),console.log(``),await m(`Do you want to re-initialize? This may cause issues`,!1)||(h(`Initialization cancelled`,`info`),n.exit(0)),console.log(``),h(`⚠️ Proceeding with re-initialization...`,`warn`),console.log(``));let s=i.filter(e=>e.enabled);h(`Resolving task dependencies...`,`info`);let c=Y(s);console.log(``),h(`Welcome to the template initialization script!`,`info`),console.log(``),a.dryRun&&(h(`🔍 DRY RUN MODE - No changes will be made`,`warn`),console.log(``)),h(`This will initialize your project based on the defined tasks.`,`info`),console.log(``);let l=ee(),u=[],d=[],f=[];for(let e of c)if(e.prompts&&e.prompts.length>0)for(let t of e.prompts)t.global?u.some(e=>e.id===t.id)||(u.push(t),f.push(t)):(d.push(t),f.push(t));if(f.length>0){let e=V(f);e.length>0&&(h(`❌ Prompt validation errors:`,`error`),e.forEach(e=>h(` - ${e}`,`error`)),console.log(``),n.exit(1)),h(`Resolving prompt default values...`,`info`);let t=await B(f);console.log(``);let r={};if(u.length>0&&(console.log(``),h(`📋 Global prompts (available to all tasks):`,`info`),console.log(``),r=await R(u,t),Object.assign(l,r)),d.length>0){u.length>0&&(h(`📋 Task-specific prompts:`,`info`),console.log(``));let e=await R(d,t);Object.assign(l,e)}}if(a.dryRun){await A(c,l),h(`🔍 Dry run completed - no changes were made`,`info`),h(`Run without --dry-run to apply changes`,`info`);return}console.log(``),h(`Starting initialization tasks...`,`info`),console.log(``),await I(`beforeAll`,l);let p=c.length,g=0,_=0,v=[];for(let e=0;e<c.length;e++){let t=c[e];if(t!=null){if(await I(`beforeTask`,t,l),await J(t,l,e+1,p,a.dryRun))g++,v.push(t.id),await I(`afterTask`,t,l);else if(t.required){_++,await I(`onError`,Error(`Task ${t.name} failed`),t);break}else h(`⚠️ Non-critical task failed, continuing...`,`warn`),await I(`onError`,Error(`Task ${t.name} failed`),t);console.log(``)}}if(_>0&&(h(`❌ Initialization failed with ${_} critical error(s)`,`error`),h(`✓ Completed: ${g}/${p} tasks`,`info`),n.exit(1)),await I(`afterAll`,l),W(l,v,a.dryRun),h(`✅ Initialization completed successfully!`,`success`),console.log(``),h(`✓ Completed: ${g}/${p} tasks`,`success`),console.log(``),!a.dryRun&&a.tasksFilePath!=null&&t.existsSync(a.tasksFilePath))try{t.unlinkSync(a.tasksFilePath),h(`🗑️ Removed tasks file: ${e.basename(a.tasksFilePath)}`,`info`),console.log(``)}catch(e){h(`⚠️ Failed to remove tasks file: ${e instanceof Error?e.message:`Unknown error`}`,`warn`)}if(!a.dryRun){h(`Next steps:`,`info`),h(`1. Review the changes made to your project`,`info`),h(`2. Commit the changes to git`,`info`);let i=e.join(n.cwd(),`package.json`);t.existsSync(i)&&JSON.parse(await Ce(i,`utf-8`)).scripts?.[`turbo:gen:init`]!=null&&(h(`3. Run "pnpm run turbo:gen:init" to create your first package`,`info`),console.log(``),await m(`Would you like to run turbo:gen:init now?`,!0)&&(console.log(``),h(`Running turbo:gen:init...`,`info`),r(`pnpm run turbo:gen:init`,{stdio:`inherit`})))}console.log(``)}const we=i(t.readFile);function Z(e){try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`}catch{return!1}}async function Te(e){try{let t=await fetch(e);if(!t.ok)throw Error(`Failed to fetch template from ${e}: ${t.status} ${t.statusText}`);return await t.text()}catch(t){throw t instanceof Error&&t.message.includes(`Failed to fetch`)?t:Error(`Failed to fetch template from ${e}: ${t instanceof Error?t.message:String(t)}`)}}const Q=new Map;async function Ee(r,i=new Set){let a=Z(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 Error(`Circular dependency detected: ${Array.from(i).join(` -> `)} -> ${o}`);i.add(o);let s;if(a)s=await Te(o);else{if(!t.existsSync(o))throw Error(`Template file not found: ${o}`);s=await we(o,`utf-8`)}let c;try{c=JSON.parse(s)}catch(e){throw Error(`Failed to parse template file ${o}: ${e instanceof Error?e.message:String(e)}`)}if(!Array.isArray(c.tasks))throw TypeError(`Invalid template file ${o}: 'tasks' array is required`);return Q.set(o,c),c}async function $(t,r,i=new Set){let a=Z(t),o;if(o=a||e.isAbsolute(t)?t:r==null?e.resolve(n.cwd(),t):Z(r)?new URL(t,r).href:e.resolve(r,t),i.has(o))throw Error(`Circular dependency detected: ${Array.from(i).join(` -> `)} -> ${o}`);i.add(o);let s=await Ee(o);if(s.extends==null||s.extends===``)return s;let c=Z(o)?new URL(`.`,o).href:e.dirname(o),l=Array.isArray(s.extends)?s.extends:[s.extends],u=[];for(let e of l){let t=await $(e,c,i);u.push(t)}return De([...u,s])}function De(e){if(e.length===0)return{tasks:[]};if(e.length===1)return e[0];let t=new Map;for(let n of e)for(let e of n.tasks)if(t.has(e.id)){let n=t.get(e.id);t.set(e.id,Oe(n,e))}else t.set(e.id,{...e});return{tasks:Array.from(t.values())}}function Oe(e,t){let n=typeof e.config==`object`&&e.config!==null&&typeof t.config==`object`&&t.config!==null?{...e.config,...t.config}:t.config,r=e.prompts?[...e.prompts]:void 0;if(t.prompts&&t.prompts.length>0)if(!r)r=[...t.prompts];else{let e=new Map(r.map(e=>[e.id,e]));for(let n of t.prompts)e.set(n.id,n);r=Array.from(e.values())}let i=[...e.dependencies??[],...t.dependencies??[]],a=i.length>0?[...new Set(i)]:void 0;return{...e,...t,config:n,...r!=null&&{prompts:r},...a!=null&&{dependencies:a}}}function ke(){Q.clear()}async function Ae(e){h(`Loading tasks from ${e}...`,`info`);let t=await $(e);return h(`Loaded ${t.tasks.length} task(s)`,`info`),t.extends!=null&&t.extends!==``&&h(`Extended from: ${(Array.isArray(t.extends)?t.extends:[t.extends]).join(`, `)}`,`info`),t.tasks}const je=n.argv.includes(`--dry-run`),Me=n.argv.includes(`--force`);async function Ne(e){try{let t=e||[];t.length===0&&(h(`⚠️ No tasks defined. Use --tasks-file to specify tasks or call runWithTasks() programmatically.`,`warn`),console.log(``),h(`Example: scaffoldfy --tasks-file ./tasks.json`,`info`),console.log(``),n.exit(1)),await X(t,{dryRun:je,force:Me,tasksFilePath:void 0})}catch(e){h(`❌ Initialization failed`,`error`),e instanceof Error?(h(`Error: ${e.message}`,`error`),n.env.DEBUG!=null&&console.error(e.stack)):console.error(e),n.exit(1)}}async function Pe(e,t){try{await X(e,{dryRun:t?.dryRun??je,force:t?.force??Me,tasksFilePath:t?.tasksFilePath??void 0})}catch(e){h(`❌ Initialization failed`,`error`),e instanceof Error?(h(`Error: ${e.message}`,`error`),n.env.DEBUG!=null&&console.error(e.stack)):console.error(e),n.exit(1)}}export{A,v as B,de as C,ae as D,ue as E,E as F,m as G,g as H,w as I,_ as K,k as L,O as M,D as N,oe as O,ie as P,re as R,P as S,ce as T,h as U,f as V,p as W,I as _,Ae as a,L as b,Y as c,U as d,W as f,R as g,z as h,$ as i,T as j,fe as k,q as l,B as m,Pe as n,Ee as o,V as p,ke as r,De as s,Ne as t,J as u,le as v,F as w,se as x,pe as y,C as z};
|