@pixpilot/scaffoldfy 0.37.0 → 0.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -11
- package/dist/cli.cjs +1 -1
- package/dist/cli.js +1 -1
- package/dist/config-DFR0mwj6.js +1 -0
- package/dist/config-DZmWkoaW.cjs +1 -0
- package/dist/config-inheritance-CtSb5haE.cjs +1 -0
- package/dist/config-inheritance-DLd3amMI.js +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +52 -301
- package/dist/index.d.ts +52 -301
- package/dist/index.js +1 -1
- package/dist/run-tasks-BOQ90AJk.cjs +1 -0
- package/dist/run-tasks-C0IZQ4SX.js +26 -0
- package/dist/run-tasks-CgFJyU4i.cjs +26 -0
- package/dist/run-tasks-i1yaGln9.js +1 -0
- package/dist/src-B0yHfPGS.cjs +1 -0
- package/dist/src-CfaEuN4Q.js +1 -0
- package/dist/utils-Cs2XFh4Z.cjs +1 -0
- package/dist/utils-DO-s6Uy8.js +1 -0
- package/package.json +4 -4
- package/schema/scaffoldfy.schema.json +3 -3
- package/dist/config-C8hh88Lc.js +0 -1
- package/dist/config-DmK0Erv2.cjs +0 -1
- package/dist/run-tasks-Br8zYcP5.js +0 -1
- package/dist/run-tasks-DMTj-u4M.cjs +0 -1
- package/dist/run-tasks-JGU1NDnc.js +0 -26
- package/dist/run-tasks-bN0ievNj.cjs +0 -26
- package/dist/src-D4brxyaM.js +0 -1
- package/dist/src-DbmnAuCC.cjs +0 -1
- package/dist/template-inheritance-BVct9RJf.js +0 -1
- package/dist/template-inheritance-Ds-FkR_6.cjs +0 -1
- package/dist/utils-1Uvvc2xc.cjs +0 -1
- package/dist/utils-413ckp1r.js +0 -1
- /package/dist/{config-DlJs75hK.cjs → config-CQ-mWBG5.cjs} +0 -0
- /package/dist/{config-DfRbCqsT.js → config-nfiOxhDM.js} +0 -0
package/dist/index.d.ts
CHANGED
|
@@ -267,7 +267,7 @@ interface BasePrompt {
|
|
|
267
267
|
required?: DynamicBooleanValue;
|
|
268
268
|
enabled?: DynamicBooleanValue;
|
|
269
269
|
override?: MergeStrategy;
|
|
270
|
-
$
|
|
270
|
+
$configEnabled?: DynamicBooleanValue;
|
|
271
271
|
$sourceUrl?: string;
|
|
272
272
|
transformers?: string[];
|
|
273
273
|
}
|
|
@@ -307,7 +307,7 @@ interface VariableDefinition {
|
|
|
307
307
|
enabled?: DynamicBooleanValue;
|
|
308
308
|
required?: DynamicBooleanValue;
|
|
309
309
|
override?: MergeStrategy;
|
|
310
|
-
$
|
|
310
|
+
$configEnabled?: DynamicBooleanValue;
|
|
311
311
|
$sourceUrl?: string;
|
|
312
312
|
transformers?: string[];
|
|
313
313
|
}
|
|
@@ -342,7 +342,7 @@ interface TaskDefinition {
|
|
|
342
342
|
rollback?: RollbackConfig;
|
|
343
343
|
override?: MergeStrategy;
|
|
344
344
|
$sourceUrl?: string;
|
|
345
|
-
$
|
|
345
|
+
$configEnabled?: DynamicBooleanValue;
|
|
346
346
|
}
|
|
347
347
|
/**
|
|
348
348
|
* Configuration file structure for template tasks
|
|
@@ -382,19 +382,56 @@ interface PluginHooks {
|
|
|
382
382
|
onError?: (error: Error, task?: TaskDefinition) => Promise<void>;
|
|
383
383
|
}
|
|
384
384
|
//#endregion
|
|
385
|
-
//#region src/
|
|
385
|
+
//#region src/config-inheritance.d.ts
|
|
386
386
|
/**
|
|
387
|
-
*
|
|
387
|
+
* Load a configuration file from local path or remote URL
|
|
388
|
+
* @param configPath - Path or URL to the configuration file
|
|
389
|
+
* @param visitedPaths - Set of already visited paths to detect circular dependencies
|
|
390
|
+
* @returns The loaded configuration
|
|
388
391
|
*/
|
|
389
|
-
declare function
|
|
392
|
+
declare function loadConfiguration(configPath: string, visitedPaths?: Set<string>): Promise<TasksConfiguration>;
|
|
390
393
|
/**
|
|
391
|
-
*
|
|
394
|
+
* Recursively load and merge configurations
|
|
395
|
+
* @param configPath - Path or URL to the configuration file
|
|
396
|
+
* @param baseDir - Base directory or URL for resolving relative paths in extends
|
|
397
|
+
* @param visitedPaths - Set of already visited paths
|
|
398
|
+
* @returns Merged configuration
|
|
399
|
+
*/
|
|
400
|
+
declare function loadAndMergeConfiguration(configPath: string, baseDir?: string, visitedPaths?: Set<string>): Promise<TasksConfiguration>;
|
|
401
|
+
/**
|
|
402
|
+
* Merge multiple configurations
|
|
403
|
+
* Later configurations override earlier ones for conflicting task IDs
|
|
404
|
+
* @param configurations - Array of configurations to merge (in priority order)
|
|
405
|
+
* @returns Merged configuration
|
|
392
406
|
*/
|
|
393
|
-
declare function
|
|
407
|
+
declare function mergeConfigurations(configurations: TasksConfiguration[]): TasksConfiguration;
|
|
394
408
|
/**
|
|
395
|
-
*
|
|
409
|
+
* Clear the configuration cache (useful for testing)
|
|
396
410
|
*/
|
|
397
|
-
declare function
|
|
411
|
+
declare function clearConfigurationCache(): void;
|
|
412
|
+
/**
|
|
413
|
+
* Load tasks from a configuration file with configuration inheritance support
|
|
414
|
+
* @param tasksFilePath - Path to the tasks configuration file
|
|
415
|
+
* @param options - Optional configuration
|
|
416
|
+
* @param options.sequential - If true, return configurations as separate items for sequential processing
|
|
417
|
+
* @returns Task configuration with tasks, optional variables, and optional prompts
|
|
418
|
+
*/
|
|
419
|
+
declare function loadTasksWithInheritance(tasksFilePath: string, options?: {
|
|
420
|
+
sequential?: boolean;
|
|
421
|
+
}): Promise<{
|
|
422
|
+
tasks: TaskDefinition[];
|
|
423
|
+
variables?: VariableDefinition[];
|
|
424
|
+
prompts?: PromptDefinition[];
|
|
425
|
+
enabled?: EnabledValue;
|
|
426
|
+
templates?: TasksConfiguration[];
|
|
427
|
+
transformers?: Transformer[];
|
|
428
|
+
}>;
|
|
429
|
+
//#endregion
|
|
430
|
+
//#region src/dry-run.d.ts
|
|
431
|
+
/**
|
|
432
|
+
* Get diff for update-json task
|
|
433
|
+
*/
|
|
434
|
+
declare function getUpdateJsonDiff(config: UpdateJsonConfig, initConfig: InitConfig): Promise<string>;
|
|
398
435
|
/**
|
|
399
436
|
* Get diff for regex-replace task
|
|
400
437
|
*/
|
|
@@ -471,26 +508,6 @@ declare function clearPlugins(): void;
|
|
|
471
508
|
* @param hooks - Hook functions to register
|
|
472
509
|
*/
|
|
473
510
|
declare function registerHooks(hooks: Partial<PluginHooks>): void;
|
|
474
|
-
/**
|
|
475
|
-
* Call a lifecycle hook
|
|
476
|
-
* @param hookName - Name of the hook
|
|
477
|
-
* @param config - Initialization config for beforeAll/afterAll
|
|
478
|
-
*/
|
|
479
|
-
declare function callHook(hookName: 'beforeAll' | 'afterAll', config: InitConfig): Promise<void>;
|
|
480
|
-
/**
|
|
481
|
-
* Call a lifecycle hook
|
|
482
|
-
* @param hookName - Name of the hook
|
|
483
|
-
* @param task - Task definition for beforeTask/afterTask
|
|
484
|
-
* @param config - Initialization config
|
|
485
|
-
*/
|
|
486
|
-
declare function callHook(hookName: 'beforeTask' | 'afterTask', task: TaskDefinition, config: InitConfig): Promise<void>;
|
|
487
|
-
/**
|
|
488
|
-
* Call a lifecycle hook
|
|
489
|
-
* @param hookName - Name of the hook
|
|
490
|
-
* @param error - Error that occurred
|
|
491
|
-
* @param task - Optional task definition
|
|
492
|
-
*/
|
|
493
|
-
declare function callHook(hookName: 'onError', error: Error, task?: TaskDefinition): Promise<void>;
|
|
494
511
|
/**
|
|
495
512
|
* Execute a plugin task
|
|
496
513
|
* @param task - The task to execute
|
|
@@ -502,19 +519,6 @@ declare function callHook(hookName: 'onError', error: Error, task?: TaskDefiniti
|
|
|
502
519
|
declare function executePluginTask(task: TaskDefinition, config: InitConfig, options: {
|
|
503
520
|
dryRun: boolean;
|
|
504
521
|
}): Promise<void>;
|
|
505
|
-
/**
|
|
506
|
-
* Get diff for a plugin task
|
|
507
|
-
* @param task - The task to generate diff for
|
|
508
|
-
* @param config - The initialization config
|
|
509
|
-
* @returns Diff string or undefined if not supported
|
|
510
|
-
*/
|
|
511
|
-
declare function getPluginTaskDiff(task: TaskDefinition, config: InitConfig): Promise<string | undefined>;
|
|
512
|
-
/**
|
|
513
|
-
* Validate a plugin task
|
|
514
|
-
* @param task - The task to validate
|
|
515
|
-
* @returns Array of validation errors
|
|
516
|
-
*/
|
|
517
|
-
declare function validatePluginTask(task: TaskDefinition): string[];
|
|
518
522
|
/**
|
|
519
523
|
* Create a simple task plugin
|
|
520
524
|
* @param name - Plugin name
|
|
@@ -534,280 +538,27 @@ declare function createTaskPlugin(name: string, taskType: string, execute: (task
|
|
|
534
538
|
validate?: (task: TaskDefinition) => string[];
|
|
535
539
|
}): TaskPlugin;
|
|
536
540
|
//#endregion
|
|
537
|
-
//#region src/prompts/collect-prompts.d.ts
|
|
538
|
-
/**
|
|
539
|
-
* Collect prompt answers from task-defined prompts
|
|
540
|
-
* Only prompts with enabled=true (or enabled condition that evaluates to true) will be shown
|
|
541
|
-
* @param prompts - Array of prompt definitions from tasks
|
|
542
|
-
* @param resolvedDefaults - Map of pre-resolved default values
|
|
543
|
-
* @param config - Current configuration context (for evaluating enabled conditions)
|
|
544
|
-
* @returns Object mapping prompt IDs to their values
|
|
545
|
-
*/
|
|
546
|
-
declare function collectPrompts(prompts: PromptDefinition[], resolvedDefaults?: Map<string, unknown>, config?: InitConfig): Promise<Record<string, unknown>>;
|
|
547
|
-
//#endregion
|
|
548
|
-
//#region src/prompts/resolve-all-default-values.d.ts
|
|
549
|
-
/**
|
|
550
|
-
* Pre-resolve all executable default values in parallel
|
|
551
|
-
* @param prompts - Array of prompt definitions
|
|
552
|
-
* @param context - Optional context for interpolating template variables
|
|
553
|
-
* @returns Map of prompt IDs to their resolved default values
|
|
554
|
-
*/
|
|
555
|
-
declare function resolveAllDefaultValues(prompts: PromptDefinition[], context?: InitConfig): Promise<Map<string, unknown>>;
|
|
556
|
-
//#endregion
|
|
557
|
-
//#region src/prompts/resolve-default-value.d.ts
|
|
558
|
-
/**
|
|
559
|
-
* Resolve a default value that may be static or executable
|
|
560
|
-
* @param defaultValue - The default value configuration
|
|
561
|
-
* @param promptId - The prompt ID for error reporting
|
|
562
|
-
* @param context - Optional context for interpolating template variables in string defaults
|
|
563
|
-
* @param prompt - Optional prompt definition for accessing $sourceUrl
|
|
564
|
-
* @returns The resolved default value
|
|
565
|
-
*/
|
|
566
|
-
declare function resolveDefaultValue<T = string | number | boolean>(defaultValue: DefaultValue<T> | undefined, promptId: string, context?: InitConfig, prompt?: PromptDefinition): Promise<T | undefined>;
|
|
567
|
-
//#endregion
|
|
568
|
-
//#region src/prompts/validate-prompts.d.ts
|
|
569
|
-
/**
|
|
570
|
-
* Validate prompt definitions
|
|
571
|
-
* @param prompts - Array of prompt definitions to validate
|
|
572
|
-
* @returns Array of validation error messages
|
|
573
|
-
*/
|
|
574
|
-
declare function validatePrompts(prompts: PromptDefinition[]): string[];
|
|
575
|
-
//#endregion
|
|
576
|
-
//#region src/run-tasks.d.ts
|
|
577
|
-
/**
|
|
578
|
-
* Core task execution logic shared by both main() and runWithTasks()
|
|
579
|
-
*/
|
|
580
|
-
declare function runTasks(tasks: TaskDefinition[], options: {
|
|
581
|
-
dryRun: boolean;
|
|
582
|
-
force: boolean;
|
|
583
|
-
tasksFilePath: string | undefined;
|
|
584
|
-
variables?: VariableDefinition[];
|
|
585
|
-
prompts?: PromptDefinition[];
|
|
586
|
-
templateEnabled?: EnabledValue;
|
|
587
|
-
transformers?: Transformer[];
|
|
588
|
-
}): Promise<void>;
|
|
589
|
-
/**
|
|
590
|
-
* Run templates sequentially for variables/prompts, then all tasks together
|
|
591
|
-
* Phase 1: Process variables and prompts sequentially from each template
|
|
592
|
-
* Phase 2: Collect all tasks from all enabled templates
|
|
593
|
-
* Phase 3: Execute all tasks together at the end
|
|
594
|
-
* This allows later templates to use values from earlier templates in their conditions,
|
|
595
|
-
* while still executing all tasks together after all variables/prompts are resolved
|
|
596
|
-
*/
|
|
597
|
-
declare function runTemplatesSequentially(templates: TasksConfiguration[], options: {
|
|
598
|
-
dryRun: boolean;
|
|
599
|
-
force: boolean;
|
|
600
|
-
tasksFilePath: string | undefined;
|
|
601
|
-
}, config?: InitConfig): Promise<void>;
|
|
602
|
-
//#endregion
|
|
603
|
-
//#region src/task-executors.d.ts
|
|
604
|
-
declare function registerBuiltInPlugins(): void;
|
|
605
|
-
/**
|
|
606
|
-
* Execute a task based on its type
|
|
607
|
-
*/
|
|
608
|
-
declare function executeTask(task: TaskDefinition, config: InitConfig, dryRun?: boolean): Promise<void>;
|
|
609
|
-
/**
|
|
610
|
-
* Run a single task with error handling
|
|
611
|
-
*/
|
|
612
|
-
declare function runTask(task: TaskDefinition, config: InitConfig, taskNumber: number, totalTasks: number, dryRun?: boolean): Promise<boolean>;
|
|
613
|
-
//#endregion
|
|
614
|
-
//#region src/task-resolver.d.ts
|
|
615
|
-
/**
|
|
616
|
-
* Sort tasks by dependencies using topological sort
|
|
617
|
-
*/
|
|
618
|
-
declare function topologicalSort(tasks: TaskDefinition[]): TaskDefinition[];
|
|
619
|
-
//#endregion
|
|
620
|
-
//#region src/template-inheritance.d.ts
|
|
621
|
-
/**
|
|
622
|
-
* Load a template configuration file from local path or remote URL
|
|
623
|
-
* @param templatePath - Path or URL to the template file
|
|
624
|
-
* @param visitedPaths - Set of already visited paths to detect circular dependencies
|
|
625
|
-
* @returns The loaded template configuration
|
|
626
|
-
*/
|
|
627
|
-
declare function loadTemplate(templatePath: string, visitedPaths?: Set<string>): Promise<TasksConfiguration>;
|
|
628
|
-
/**
|
|
629
|
-
* Load all templates in dependency order without merging
|
|
630
|
-
* @param templatePath - Path or URL to the template file
|
|
631
|
-
* @param baseDir - Base directory or URL for resolving relative paths in extends
|
|
632
|
-
* @param visitedPaths - Set of already visited paths
|
|
633
|
-
* @returns Array of sorted templates (in dependency order, ready for sequential processing)
|
|
634
|
-
*/
|
|
635
|
-
declare function loadTemplatesInOrder(templatePath: string, baseDir?: string, visitedPaths?: Set<string>): Promise<TasksConfiguration[]>;
|
|
636
|
-
/**
|
|
637
|
-
* Recursively load and merge templates
|
|
638
|
-
* @param templatePath - Path or URL to the template file
|
|
639
|
-
* @param baseDir - Base directory or URL for resolving relative paths in extends
|
|
640
|
-
* @param visitedPaths - Set of already visited paths
|
|
641
|
-
* @returns Merged template configuration
|
|
642
|
-
*/
|
|
643
|
-
declare function loadAndMergeTemplate(templatePath: string, baseDir?: string, visitedPaths?: Set<string>): Promise<TasksConfiguration>;
|
|
644
|
-
/**
|
|
645
|
-
* Merge multiple template configurations
|
|
646
|
-
* Later templates override earlier ones for conflicting task IDs
|
|
647
|
-
* @param templates - Array of templates to merge (in priority order)
|
|
648
|
-
* @returns Merged template configuration
|
|
649
|
-
*/
|
|
650
|
-
declare function mergeTemplates(templates: TasksConfiguration[]): TasksConfiguration;
|
|
651
|
-
/**
|
|
652
|
-
* Clear the template cache (useful for testing)
|
|
653
|
-
*/
|
|
654
|
-
declare function clearTemplateCache(): void;
|
|
655
|
-
/**
|
|
656
|
-
* Load tasks from a configuration file with template inheritance support
|
|
657
|
-
* @param tasksFilePath - Path to the tasks configuration file
|
|
658
|
-
* @param options - Optional configuration
|
|
659
|
-
* @param options.sequential - If true, return templates as separate items for sequential processing
|
|
660
|
-
* @returns Task configuration with tasks, optional variables, and optional prompts
|
|
661
|
-
*/
|
|
662
|
-
declare function loadTasksWithInheritance(tasksFilePath: string, options?: {
|
|
663
|
-
sequential?: boolean;
|
|
664
|
-
}): Promise<{
|
|
665
|
-
tasks: TaskDefinition[];
|
|
666
|
-
variables?: VariableDefinition[];
|
|
667
|
-
prompts?: PromptDefinition[];
|
|
668
|
-
enabled?: EnabledValue;
|
|
669
|
-
templates?: TasksConfiguration[];
|
|
670
|
-
transformers?: Transformer[];
|
|
671
|
-
}>;
|
|
672
|
-
//#endregion
|
|
673
|
-
//#region src/template-utils.d.ts
|
|
674
|
-
/**
|
|
675
|
-
* Configuration for template/templateFile properties
|
|
676
|
-
*/
|
|
677
|
-
interface TemplateSource {
|
|
678
|
-
template?: string;
|
|
679
|
-
templateFile?: string;
|
|
680
|
-
}
|
|
681
|
-
/**
|
|
682
|
-
* Result of template validation
|
|
683
|
-
*/
|
|
684
|
-
interface TemplateValidationResult {
|
|
685
|
-
isValid: boolean;
|
|
686
|
-
hasInlineTemplate: boolean;
|
|
687
|
-
hasTemplateFile: boolean;
|
|
688
|
-
error?: string;
|
|
689
|
-
}
|
|
690
|
-
/**
|
|
691
|
-
* Options for processing templates
|
|
692
|
-
*/
|
|
693
|
-
interface ProcessTemplateOptions {
|
|
694
|
-
/** Enable Handlebars compilation for .hbs files */
|
|
695
|
-
enableHandlebars?: boolean;
|
|
696
|
-
/** Source URL for resolving relative template paths */
|
|
697
|
-
sourceUrl?: string;
|
|
698
|
-
}
|
|
699
|
-
/**
|
|
700
|
-
* Check if a config has an inline template
|
|
701
|
-
* @param config - Configuration object with potential template property
|
|
702
|
-
* @returns True if inline template is present and non-empty
|
|
703
|
-
*/
|
|
704
|
-
declare function hasInlineTemplate(config: TemplateSource): boolean;
|
|
705
|
-
/**
|
|
706
|
-
* Check if a config has a template file reference
|
|
707
|
-
* @param config - Configuration object with potential templateFile property
|
|
708
|
-
* @returns True if templateFile is present and non-empty
|
|
709
|
-
*/
|
|
710
|
-
declare function hasTemplateFile(config: TemplateSource): boolean;
|
|
711
|
-
/**
|
|
712
|
-
* Check if a template file should be processed with Handlebars
|
|
713
|
-
* @param templateFile - Path to the template file
|
|
714
|
-
* @returns True if the file has .hbs extension
|
|
715
|
-
*/
|
|
716
|
-
declare function shouldUseHandlebars(templateFile: string): boolean;
|
|
717
|
-
/**
|
|
718
|
-
* Validate template configuration
|
|
719
|
-
* @param config - Configuration object to validate
|
|
720
|
-
* @returns Validation result with details
|
|
721
|
-
*/
|
|
722
|
-
declare function validateTemplateConfig(config: TemplateSource): TemplateValidationResult;
|
|
723
|
-
/**
|
|
724
|
-
* Process a template and return the rendered content
|
|
725
|
-
* @param config - Template configuration
|
|
726
|
-
* @param initConfig - Initialization config with variable values
|
|
727
|
-
* @param task - Optional task definition for $sourceUrl resolution
|
|
728
|
-
* @param options - Processing options
|
|
729
|
-
* @returns Processed template content
|
|
730
|
-
*/
|
|
731
|
-
declare function processTemplate(config: TemplateSource, initConfig: InitConfig, task?: TaskDefinition, options?: ProcessTemplateOptions): Promise<string>;
|
|
732
|
-
/**
|
|
733
|
-
* Get a description of the template source for display purposes
|
|
734
|
-
* @param config - Template configuration
|
|
735
|
-
* @returns Human-readable description of the template source
|
|
736
|
-
*/
|
|
737
|
-
declare function getTemplateSourceDescription(config: TemplateSource): string;
|
|
738
|
-
//#endregion
|
|
739
|
-
//#region src/variables/collect-variables.d.ts
|
|
740
|
-
/**
|
|
741
|
-
* Collect variable values from resolved variables
|
|
742
|
-
* Variables don't require user interaction - they're just resolved from static
|
|
743
|
-
* values or executable commands
|
|
744
|
-
*
|
|
745
|
-
* @param variables - Array of variable definitions
|
|
746
|
-
* @param resolvedValues - Map of pre-resolved variable values
|
|
747
|
-
* @param context - Current configuration context (for transformer evaluation)
|
|
748
|
-
* @returns Object mapping variable IDs to their values
|
|
749
|
-
*/
|
|
750
|
-
declare function collectVariables(variables: VariableDefinition[], resolvedValues?: Map<string, unknown>, context?: InitConfig): Promise<Record<string, unknown>>;
|
|
751
|
-
//#endregion
|
|
752
|
-
//#region src/variables/resolve-all-variable-values.d.ts
|
|
753
|
-
/**
|
|
754
|
-
* Resolve all variable values sequentially to allow lazy evaluation of template enabled conditions
|
|
755
|
-
* Each variable can access values from previous variables and prompts
|
|
756
|
-
* @param variables - Array of variable definitions
|
|
757
|
-
* @param context - Optional context for evaluating conditional variables
|
|
758
|
-
* @param options - Optional resolution options
|
|
759
|
-
* @param options.skipConditional - If true, skip conditional variables (they will be resolved later)
|
|
760
|
-
* @returns Map of variable IDs to their resolved values
|
|
761
|
-
*/
|
|
762
|
-
declare function resolveAllVariableValues(variables: VariableDefinition[], context?: InitConfig, options?: {
|
|
763
|
-
skipConditional?: boolean;
|
|
764
|
-
}): Promise<Map<string, unknown>>;
|
|
765
|
-
//#endregion
|
|
766
|
-
//#region src/variables/resolve-variable-value.d.ts
|
|
767
|
-
/**
|
|
768
|
-
* Resolve a variable value that may be static, executable, or conditional
|
|
769
|
-
* @param value - The variable value configuration
|
|
770
|
-
* @param variableId - The variable ID for error reporting
|
|
771
|
-
* @param context - Optional context for evaluating conditional values
|
|
772
|
-
* @param sourceUrl - Optional source URL for resolving relative file paths in exec-file
|
|
773
|
-
* @returns The resolved variable value
|
|
774
|
-
*/
|
|
775
|
-
declare function resolveVariableValue<T = string | number | boolean>(value: DefaultValue<T>, variableId: string, context?: InitConfig, sourceUrl?: string): Promise<T | undefined>;
|
|
776
|
-
//#endregion
|
|
777
|
-
//#region src/variables/validate-variables.d.ts
|
|
778
|
-
/**
|
|
779
|
-
* Validate variable definitions for duplicate IDs
|
|
780
|
-
* @param variables - Array of variable definitions to validate
|
|
781
|
-
* @returns Array of error messages (empty if no errors)
|
|
782
|
-
*/
|
|
783
|
-
declare function validateVariables(variables: VariableDefinition[]): string[];
|
|
784
|
-
//#endregion
|
|
785
541
|
//#region src/index.d.ts
|
|
786
|
-
/**
|
|
787
|
-
* Main function for executing tasks with default/empty tasks array
|
|
788
|
-
* For most use cases, you should use runWithTasks() with your custom tasks
|
|
789
|
-
*/
|
|
790
|
-
declare function main(customTasks?: TaskDefinition[]): Promise<void>;
|
|
791
542
|
/**
|
|
792
543
|
* Execute tasks with custom task definitions
|
|
793
544
|
* @param customTasks - Array of task definitions to execute
|
|
794
545
|
* @param options - Optional configuration
|
|
795
546
|
* @param options.dryRun - Preview changes without applying them
|
|
796
547
|
* @param options.force - Force execution even if checks fail
|
|
797
|
-
* @param options.
|
|
548
|
+
* @param options.configFilePath - Path to the tasks file
|
|
798
549
|
* @param options.variables - Optional top-level global variables
|
|
799
550
|
* @param options.prompts - Optional top-level global prompts
|
|
800
|
-
* @param options.
|
|
551
|
+
* @param options.configEnabled - Optional config-level enabled condition
|
|
801
552
|
* @param options.transformers - Optional transformer definitions
|
|
802
553
|
*/
|
|
803
554
|
declare function runWithTasks(customTasks: TaskDefinition[], options?: {
|
|
804
555
|
dryRun?: boolean | undefined;
|
|
805
556
|
force?: boolean | undefined;
|
|
806
|
-
|
|
557
|
+
configFilePath?: string | undefined;
|
|
807
558
|
variables?: VariableDefinition[] | undefined;
|
|
808
559
|
prompts?: PromptDefinition[] | undefined;
|
|
809
|
-
|
|
560
|
+
configEnabled?: EnabledValue | undefined;
|
|
810
561
|
transformers?: Transformer[] | undefined;
|
|
811
562
|
}): Promise<void>;
|
|
812
563
|
//#endregion
|
|
813
|
-
export { type AppendConfig, BasePrompt, ConditionExpression, ConditionalConfig, ConditionalDefaultConfig, ConfirmPrompt, type CopyConfig, type CreateConfig, DefaultValue, DefaultValueConfig, DefaultValueType, type DeleteConfig, DynamicBooleanValue, EnabledValue, type ExecConfig, ExecFileRuntime, ExecFileValueConfig, ExecutableConfig, type GitInitConfig, InitConfig, InputPrompt, MergeStrategy, type MkdirConfig, type MoveConfig, NumberPrompt, PluginHooks, PromptDefinition, PromptType, type RegexReplaceConfig, type RenameConfig, type ReplaceInFileConfig, RollbackConfig, SelectPrompt, TaskDefinition, TaskPlugin, TaskType, TasksConfiguration, type UpdateJsonConfig, VariableDefinition, type WriteConfig,
|
|
564
|
+
export { type AppendConfig, BasePrompt, ConditionExpression, ConditionalConfig, ConditionalDefaultConfig, ConfirmPrompt, type CopyConfig, type CreateConfig, DefaultValue, DefaultValueConfig, DefaultValueType, type DeleteConfig, DynamicBooleanValue, EnabledValue, type ExecConfig, ExecFileRuntime, ExecFileValueConfig, ExecutableConfig, type GitInitConfig, InitConfig, InputPrompt, MergeStrategy, type MkdirConfig, type MoveConfig, NumberPrompt, PluginHooks, PromptDefinition, PromptType, type RegexReplaceConfig, type RenameConfig, type ReplaceInFileConfig, RollbackConfig, SelectPrompt, TaskDefinition, TaskPlugin, TaskType, TasksConfiguration, type UpdateJsonConfig, VariableDefinition, type WriteConfig, clearConfigurationCache, clearPlugins, createTaskPlugin, displayTasksDiff, executePluginTask, getDeleteDiff, getExecDiff, getGitInitDiff, getPlugin, getPluginForTaskType, getRegexReplaceDiff, getRenameDiff, getReplaceInFileDiff, getTaskDiff, getUpdateJsonDiff, isPluginTaskType, listPlugins, loadAndMergeConfiguration, loadConfiguration, loadTasksWithInheritance, mergeConfigurations, registerHooks, registerPlugin, runWithTasks, unregisterPlugin, validateScaffoldfyJsonFile };
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import{a as e,i as t,o as n,r,t as i}from"./config-inheritance-DLd3amMI.js";import{_ as a,a as o,b as s,c,d as l,f as u,g as d,h as f,i as p,l as m,m as h,o as g,p as _,r as v,s as y,u as b,v as x,x as S,y as C}from"./run-tasks-C0IZQ4SX.js";import"./config-nfiOxhDM.js";import{t as w}from"./validate-scaffoldfy-json-Cfq-nQjy.js";import"./scaffoldfy-config-json-validator-DP8-e4Yy.js";import{t as T}from"./src-CfaEuN4Q.js";export{i as clearConfigurationCache,v as clearPlugins,p as createTaskPlugin,_ as displayTasksDiff,o as executePluginTask,h as getDeleteDiff,f as getExecDiff,d as getGitInitDiff,g as getPlugin,y as getPluginForTaskType,a as getRegexReplaceDiff,x as getRenameDiff,C as getReplaceInFileDiff,s as getTaskDiff,S as getUpdateJsonDiff,c as isPluginTaskType,m as listPlugins,r as loadAndMergeConfiguration,t as loadConfiguration,e as loadTasksWithInheritance,n as mergeConfigurations,b as registerHooks,l as registerPlugin,T as runWithTasks,u as unregisterPlugin,w as validateScaffoldfyJsonFile};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require(`./config-inheritance-CtSb5haE.cjs`);const e=require(`./run-tasks-CgFJyU4i.cjs`);require(`./config-CQ-mWBG5.cjs`),exports.runTasks=e.t,exports.runTemplatesSequentially=e.n;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import{C as e,D as t,M as n,O as r,S as i,T as a,_ as o,b as s,c,f as l,g as u,j as d,l as f,m as p,n as m,s as h,w as g,x as _,y as v}from"./config-inheritance-DLd3amMI.js";import{t as ee}from"./config-nfiOxhDM.js";import y from"node:path";import b from"node:fs";import x from"node:process";import{promisify as S}from"node:util";import{execSync as C}from"node:child_process";import{confirm as w,input as te,number as ne,password as re,select as ie}from"@inquirer/prompts";import{camelCase as ae,capitalCase as oe,constantCase as se,kebabCase as T,lowerCase as ce,pascalCase as le,snakeCase as E,upperCase as ue}from"case-anything";var de=class e extends n{constructor(e,t){super(e,`TASK_NOT_FOUND`),this.taskId=t,this.name=`TaskNotFoundError`}static forId(t){return new e(`Task not found: ${t}`,t)}},D=class e extends n{constructor(e,t,n){super(e,`PROMPT_VALIDATION_ERROR`),this.promptId=t,this.reason=n,this.name=`PromptValidationError`}static required(t){return new e(`Prompt "${t}" is required`,t,`required`)}static unknownType(t){return new e(`Unknown prompt type: ${t}`,t,`unknown_type`)}},O=class e extends n{constructor(e,t,n){super(e,`PLUGIN_CONFIGURATION_ERROR`),this.pluginType=t,this.configIssue=n,this.name=`PluginConfigurationError`}static templateMissingTemplateOrFile(){return new e(`Template task requires either "template" (inline) or "templateFile" (file path) to be specified`,`template`,`missing_template_or_file`)}static templateHasBothTemplateAndFile(){return new e(`Template task cannot have both "template" and "templateFile" specified. Use one or the other.`,`template`,`both_template_and_file`)}static createMissingTemplateOrFile(){return new e(`Create task requires either "template" (inline) or "templateFile" (file path) to be specified`,`create`,`missing_template_or_file`)}static createHasBothTemplateAndFile(){return new e(`Create task cannot have both "template" and "templateFile" specified. Use one or the other.`,`create`,`both_template_and_file`)}},k=class e extends n{constructor(e,t,n){super(e,`TRANSFORMER_ERROR`),this.transformerId=t,this.reason=n,this.name=`TransformerError`}static notFound(t){return new e(`Transformer "${t}" not found`,t,`not_found`)}static executionFailed(t,n){return new e(`Transformer "${t}" execution failed: ${n}`,t,`execution_failed`)}static invalidType(t,n){return new e(`Invalid transformer type "${n}" for transformer "${t}"`,t,`invalid_type`)}};function A(e){return e.template!=null&&e.template!==``}function j(e){return e.templateFile!=null&&e.templateFile!==``}function fe(e){return e.endsWith(`.hbs`)}function M(e){let t=A(e),n=j(e);return!t&&!n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration requires either "template" (inline) or "templateFile" (file path) to be specified`}:t&&n?{isValid:!1,hasInlineTemplate:t,hasTemplateFile:n,error:`Template configuration cannot have both "template" and "templateFile" specified. Use one or the other.`}:{isValid:!0,hasInlineTemplate:t,hasTemplateFile:n}}async function N(e,t,n,r={}){let{enableHandlebars:i=!0,sourceUrl:a=n?.$sourceUrl}=r,o=A(e),s=j(e);if(o)return h(e.template,t);if(s){let n=e.templateFile,r=i&&fe(n),o=await m(l(n,a));return r?(await import(`handlebars`)).default.compile(o)(t):h(o,t)}throw Error(`No template content available`)}function pe(e){return A(e)?`inline template`:j(e)?`template file: ${e.templateFile}`:`no template source`}const P=S(b.readFile),F={reset:`\x1B[0m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,cyan:`\x1B[36m`,gray:`\x1B[90m`};function I(e,t){switch(t){case`add`:return`${F.green}+ ${e}${F.reset}`;case`remove`:return`${F.red}- ${e}${F.reset}`;case`context`:return`${F.gray} ${e}${F.reset}`;default:return e}}function L(e,t){let n=e.split(`
|
|
2
|
+
`),r=t.split(`
|
|
3
|
+
`),i=[],a=Math.max(n.length,r.length);for(let e=0;e<a;e++){let t=n[e],a=r[e];t===a?t!==void 0&&i.push(I(t,`context`)):(t!==void 0&&i.push(I(t,`remove`)),a!==void 0&&i.push(I(a,`add`)))}return i}async function R(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;let n=y.join(x.cwd(),e.file);if(!b.existsSync(n))return`${F.red}✗ File not found: ${e.file}${F.reset}`;try{let r=await P(n,`utf-8`),i=JSON.parse(r),a={...i};function o(e){if(typeof e==`string`)return h(e,t);if(Array.isArray(e))return e.map(e=>o(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=o(r);return t}return e}for(let[t,n]of Object.entries(e.updates)){let e=o(n);t.includes(`.`)?p(i,t,e):i[t]=e}let s=JSON.stringify(a,null,2),c=JSON.stringify(i,null,2);if(s===c)return`${F.cyan}→ No changes${F.reset}`;let l=L(s,c);return`${F.blue}File: ${e.file}${F.reset}\n${l.join(`
|
|
4
|
+
`)}`}catch(e){return`${F.red}✗ Error: ${e instanceof Error?e.message:String(e)}${F.reset}`}}async function me(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;if(e.template==null||e.template===``)return`${F.red}✗ No template content provided for file: ${e.file}${F.reset}`;let n=y.join(x.cwd(),e.file),r=h(e.template,t);if(!b.existsSync(n)){let t=r.split(`
|
|
5
|
+
`).slice(0,10).join(`
|
|
6
|
+
`),n=r.split(`
|
|
7
|
+
`).length>10;return`${F.blue}File: ${e.file}${F.reset}\n${F.green}+ New file would be created${F.reset}\n${F.gray}Content preview:${F.reset}\n${t}${n?`
|
|
8
|
+
...`:``}`}try{let t=await P(n,`utf-8`);if(t===r)return`${F.cyan}→ No changes${F.reset}`;let i=L(t,r);return`${F.blue}File: ${e.file}${F.reset}\n${i.join(`
|
|
9
|
+
`)}`}catch(e){return`${F.red}✗ Error: ${e instanceof Error?e.message:String(e)}${F.reset}`}}async function he(e,t,n){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;let r=y.join(x.cwd(),e.file);if(b.existsSync(r))return`${F.cyan}→ File already exists, would be skipped: ${e.file}${F.reset}`;try{if(A(e)){let r=await N(e,t,n),i=r.split(`
|
|
10
|
+
`).slice(0,10).join(`
|
|
11
|
+
`),a=r.split(`
|
|
12
|
+
`).length>10;return`${F.blue}File: ${e.file}${F.reset}\n${F.green}+ New file would be created${F.reset}\n${F.gray}Content preview:${F.reset}\n${i}${a?`
|
|
13
|
+
...`:``}`}let r=pe(e);return`${F.blue}File: ${e.file}${F.reset}\n${F.green}+ New file would be created from ${r}${F.reset}`}catch(e){return`${F.red}✗ Error: ${e instanceof Error?e.message:String(e)}${F.reset}`}}async function z(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;let n=y.join(x.cwd(),e.file);if(!b.existsSync(n))return`${F.red}✗ File not found: ${e.file}${F.reset}`;try{let r=await P(n,`utf-8`),i=new RegExp(e.pattern,e.flags??`g`),a=h(e.replacement,t),o=r.replace(i,a);if(r===o)return`${F.cyan}→ No matches found${F.reset}`;let s=L(r,o);return`${F.blue}File: ${e.file}${F.reset}\n${s.join(`
|
|
14
|
+
`)}`}catch(e){return`${F.red}✗ Error: ${e instanceof Error?e.message:String(e)}${F.reset}`}}async function ge(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;let n=y.join(x.cwd(),e.file);if(!b.existsSync(n))return`${F.red}✗ File not found: ${e.file}${F.reset}`;try{let r=await P(n,`utf-8`),i=r;for(let{find:n,replace:i}of e.replacements){let e=h(n,t),a=h(i,t);r=r.replace(e,a)}if(i===r)return`${F.cyan}→ No changes${F.reset}`;let a=L(i,r);return`${F.blue}File: ${e.file}${F.reset}\n${a.join(`
|
|
15
|
+
`)}`}catch(e){return`${F.red}✗ Error: ${e instanceof Error?e.message:String(e)}${F.reset}`}}function _e(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;let n=e.paths.map(e=>h(e,t)).filter(e=>b.existsSync(y.join(x.cwd(),e)));return n.length===0?`${F.cyan}→ No files/directories to delete${F.reset}`:`${F.red}Would delete:${F.reset}\n${n.map(e=>`${F.red} - ${e}${F.reset}`).join(`
|
|
16
|
+
`)}`}function ve(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;let n=h(e.from,t),r=h(e.to,t),i=y.join(x.cwd(),n),a=y.join(x.cwd(),r);return b.existsSync(i)?b.existsSync(a)?`${F.yellow}⚠ Destination already exists: ${r}${F.reset}\n${F.cyan}Would rename: ${n} → ${r}${F.reset}`:`${F.cyan}Would rename: ${n} → ${r}${F.reset}`:`${F.red}✗ Source not found: ${n}${F.reset}`}function ye(e){if(e.condition!=null&&e.condition!==``)return`${F.yellow}⊘ Condition check skipped in dry-run${F.reset}`;let t=y.join(x.cwd(),`.git`),n=b.existsSync(t),r=[];if(e.removeExisting&&n&&r.push(`${F.red}Would remove existing .git directory${F.reset}`),r.push(`${F.green}Would initialize git repository${F.reset}`),e.initialCommit){let t=e.message??`Initial commit`;r.push(`${F.green}Would create initial commit: "${t}"${F.reset}`)}return r.join(`
|
|
17
|
+
`)}function B(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;let n=h(e.command,t),r=e.cwd==null?x.cwd():h(e.cwd,t);return`${F.yellow}Would execute:${F.reset}\n${F.cyan} Command: ${n}${F.reset}\n${F.cyan} Working directory: ${r}${F.reset}`}function be(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;let n=h(e.from,t),r=h(e.to,t),i=y.join(x.cwd(),n),a=y.join(x.cwd(),r);return b.existsSync(i)?b.existsSync(a)?`${F.yellow}⚠ Destination already exists: ${r}${F.reset}\n${F.cyan}Would move: ${n} → ${r}${F.reset}`:`${F.cyan}Would move: ${n} → ${r}${F.reset}`:`${F.red}✗ Source not found: ${n}${F.reset}`}function xe(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;let n=h(e.from,t),r=h(e.to,t),i=y.join(x.cwd(),n),a=y.join(x.cwd(),r);if(!b.existsSync(i))return`${F.red}✗ Source not found: ${n}${F.reset}`;let o=b.statSync(i).isDirectory()?`directory`:`file`;return b.existsSync(a)?`${F.yellow}⚠ Destination already exists: ${r}${F.reset}\n${F.cyan}Would copy ${o}: ${n} → ${r}${F.reset}`:`${F.cyan}Would copy ${o}: ${n} → ${r}${F.reset}`}async function Se(e,t,n){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;let r=y.join(x.cwd(),e.file),i={};e.content==null?e.template!=null&&(i.template=e.template):i.template=e.content,e.templateFile!=null&&(i.templateFile=e.templateFile);try{let a=await N(i,t,n),o=a.split(`
|
|
18
|
+
`).slice(0,10).join(`
|
|
19
|
+
`),s=a.split(`
|
|
20
|
+
`).length>10;return b.existsSync(r)?`${F.blue}File: ${e.file}${F.reset}\n${F.green}+ Would append content${F.reset}\n${F.gray}Content preview:${F.reset}\n${o}${s?`
|
|
21
|
+
...`:``}`:`${F.blue}File: ${e.file}${F.reset}\n${F.green}+ New file would be created with content${F.reset}\n${F.gray}Content preview:${F.reset}\n${o}${s?`
|
|
22
|
+
...`:``}`}catch(e){return`${F.red}✗ Error: ${e instanceof Error?e.message:String(e)}${F.reset}`}}function Ce(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t))return`${F.yellow}⊘ Condition not met - task would be skipped${F.reset}`;let n=h(e.path,t),r=y.join(x.cwd(),n);return b.existsSync(r)?`${F.cyan}→ Directory already exists: ${n}${F.reset}`:`${F.green}+ Would create directory: ${n}${F.reset}`}async function we(e,t){try{switch(e.type){case`update-json`:return await R(e.config,t);case`write`:return await me(e.config,t);case`create`:return await he(e.config,t,e);case`regex-replace`:return await z(e.config,t);case`replace-in-file`:return await ge(e.config,t);case`delete`:return _e(e.config,t);case`rename`:return ve(e.config,t);case`move`:return be(e.config,t);case`copy`:return xe(e.config,t);case`append`:return await Se(e.config,t,e);case`mkdir`:return Ce(e.config,t);case`git-init`:return ye(e.config);case`exec`:return B(e.config,t);case`exec-file`:return B(e.config,t);default:{let t=e.type;return`${F.yellow}⚠ Diff not available for task type: ${t}${F.reset}`}}}catch(e){return`${F.red}✗ Error generating diff: ${e instanceof Error?e.message:String(e)}${F.reset}`}}async function V(e,t){console.log(`${F.blue}═══════════════════════════════════════════════════════${F.reset}`),console.log(`${F.blue} DRY RUN - Preview of changes${F.reset}`),console.log(`${F.blue}═══════════════════════════════════════════════════════${F.reset}`);for(let n of e){console.log(`${F.cyan}▶ Task: ${n.name}${F.reset}`),n.description!=null&&n.description!==``&&console.log(`${F.gray} ${n.description}${F.reset}`);let e=await we(n,t);console.log(e),console.log(`${F.gray}${`─`.repeat(55)}${F.reset}`)}console.log(`${F.blue}═══════════════════════════════════════════════════════${F.reset}`),console.log(`${F.yellow} No changes were applied (dry-run mode)${F.reset}`),console.log(`${F.blue}═══════════════════════════════════════════════════════${F.reset}`)}const H=new Map,U={},W=new Map;function G(e){if(e.name==null||e.name===``)throw TypeError(`Plugin name is required`);if(!Array.isArray(e.taskTypes)||e.taskTypes.length===0)throw TypeError(`Plugin ${e.name} must define at least one task type`);if(typeof e.execute!=`function`)throw TypeError(`Plugin ${e.name} must provide an execute function`);if(H.has(e.name))throw TypeError(`Plugin ${e.name} is already registered`);for(let t of e.taskTypes)if(W.has(t)){let e=W.get(t);throw TypeError(`Task type "${t}" is already registered by plugin "${e}"`)}H.set(e.name,e);for(let t of e.taskTypes)W.set(t,e.name);a(`Registered plugin: ${e.name}${e.version==null?``:` v${e.version}`}`)}function Te(e){let t=H.get(e);if(t!=null){for(let e of t.taskTypes)W.delete(e);H.delete(e)}}function Ee(e){return H.get(e)}function K(e){let t=W.get(e);if(t!=null)return H.get(t)}function q(e){return W.has(e)}function De(){return Array.from(H.keys())}function Oe(){H.clear(),W.clear()}function ke(e){e.beforeAll!=null&&(U.beforeAll=e.beforeAll),e.afterAll!=null&&(U.afterAll=e.afterAll),e.beforeTask!=null&&(U.beforeTask=e.beforeTask),e.afterTask!=null&&(U.afterTask=e.afterTask),e.onError!=null&&(U.onError=e.onError)}async function J(e,...t){let n=U[e];if(n!=null)try{e===`beforeAll`||e===`afterAll`?await n(t[0]):(e===`beforeTask`||e===`afterTask`||e===`onError`)&&await n(t[0],t[1])}catch(t){r(`Error in ${e} hook: ${t instanceof Error?t.message:String(t)}`,`error`)}}async function Ae(e,t,n){let r=K(e.type);if(r==null)throw TypeError(`No plugin found for task type: ${e.type}`);await r.execute(e,t,n)}function je(e,t,n,r){return{name:e,...r?.version!=null&&{version:r.version},taskTypes:[t],execute:n,...r?.getDiff!=null&&{getDiff:r.getDiff},...r?.validate!=null&&{validate:r.validate}}}const Y=new class{transformers=new Map;constructor(){this.registerBuiltInTransformers()}registerBuiltInTransformers(){for(let e of[{id:`lowercase`,type:`lowercase`},{id:`uppercase`,type:`uppercase`},{id:`trim`,type:`trim`},{id:`slugify`,type:`slugify`},{id:`capitalize`,type:`capitalize`},{id:`titlecase`,type:`titlecase`},{id:`camelcase`,type:`camelcase`},{id:`pascalcase`,type:`pascalcase`},{id:`snakecase`,type:`snakecase`},{id:`kebabcase`,type:`kebabcase`},{id:`constantcase`,type:`constantcase`},{id:`alphanumeric`,type:`alphanumeric`},{id:`collapse-spaces`,type:`collapse-spaces`},{id:`remove-spaces`,type:`remove-spaces`},{id:`urlencode`,type:`urlencode`},{id:`dasherize`,type:`dasherize`},{id:`underscore`,type:`underscore`}])this.transformers.set(e.id,e)}register(e){this.transformers.has(e.id)&&r(`Transformer with id "${e.id}" is already registered. Overwriting.`,`warn`),this.transformers.set(e.id,e)}registerAll(e){for(let t of e)this.register(t)}get(e){return this.transformers.get(e)}has(e){return this.transformers.has(e)}async execute(e,t,n={}){let r=this.transformers.get(e);if(!r)throw k.notFound(e);try{return await this.executeTransformer(r,t,n)}catch(t){throw t instanceof k?t:k.executionFailed(e,t instanceof Error?t.message:String(t))}}async executeChain(e,t,n={}){let r=t;for(let t of e)r=await this.execute(t,r,n);return r}async apply(e,t,n={}){return e===void 0?t:this.executeChain(e,t,n)}validate(e){if(e===void 0)return[];let t=e,n=[];for(let e of t)this.has(e)||n.push(`Transformer "${e}" not found`);return n}async executeTransformer(e,t,n){switch(e.type){case`regex`:return this.executeRegex(e,t);case`computed`:return this.executeComputed(e,t,n);case`lowercase`:return this.executeLowercase(t);case`uppercase`:return this.executeUppercase(t);case`trim`:return this.executeTrim(t);case`slugify`:return this.executeSlugify(t);case`capitalize`:return this.executeCapitalize(t);case`titlecase`:return this.executeTitlecase(t);case`camelcase`:return this.executeCamelcase(t);case`pascalcase`:return this.executePascalcase(t);case`snakecase`:return this.executeSnakecase(t);case`kebabcase`:return this.executeKebabcase(t);case`constantcase`:return this.executeConstantcase(t);case`alphanumeric`:return this.executeAlphanumeric(t);case`collapse-spaces`:return this.executeCollapseSpaces(t);case`remove-spaces`:return this.executeRemoveSpaces(t);case`urlencode`:return this.executeUrlencode(t);case`dasherize`:return this.executeDasherize(t);case`underscore`:return this.executeUnderscore(t);case`custom`:return this.executeCustom(e,t,n);case`chain`:return this.executeChainTransformer(e,t,n);default:{let t=e;throw k.invalidType(t.id,t.type)}}}executeRegex(e,t){let n=String(t),{pattern:r,flags:i,replacement:a}=e.config;try{let e=new RegExp(r,i);return n.replace(e,a)}catch(t){throw k.executionFailed(e.id,`Invalid regex pattern: ${t instanceof Error?t.message:String(t)}`)}}executeComputed(e,t,n){let{expression:r}=e.config;try{return Function(`value`,`context`,...Object.keys(n),`return ${r}`)(t,n,...Object.values(n))}catch(t){throw k.executionFailed(e.id,`Expression evaluation failed: ${t instanceof Error?t.message:String(t)}`)}}executeLowercase(e){return ce(String(e))}executeUppercase(e){return ue(String(e))}executeTrim(e){return String(e).trim()}executeSlugify(e){return String(e).toLowerCase().trim().replace(/[\s_]+/gu,`-`).replace(/[^\w-]+/gu,``).replace(/-{2,}/gu,`-`).replace(/^-+/u,``).replace(/-+$/u,``)}async executeCustom(e,t,n){let{handler:r}=e.config;if(typeof r==`function`)return r(t,n);throw k.executionFailed(e.id,`String-based custom handlers are not yet supported. Please use function handlers.`)}async executeChainTransformer(e,t,n){let{transformers:r}=e.config;if(r.length===0)throw k.executionFailed(e.id,`Chain transformer must have at least one transformer`);return this.executeChain(r,t,n)}executeCapitalize(e){return oe(String(e))}executeTitlecase(e){return oe(String(e))}executeCamelcase(e){return ae(String(e))}executePascalcase(e){return le(String(e))}executeSnakecase(e){return E(String(e))}executeKebabcase(e){return T(String(e))}executeConstantcase(e){return se(String(e))}executeAlphanumeric(e){return String(e).replace(/[^a-zA-Z0-9]/gu,``)}executeCollapseSpaces(e){return String(e).replace(/\s+/gu,` `)}executeRemoveSpaces(e){return String(e).replace(/\s/gu,``)}executeUrlencode(e){return encodeURIComponent(String(e))}executeDasherize(e){return T(String(e))}executeUnderscore(e){return E(String(e))}clear(){this.transformers.clear()}getIds(){return Array.from(this.transformers.keys())}};async function Me(e,t,n,r){if(e!==void 0)return c(e,{id:t,contextType:`Prompt`,...n!=null&&{context:n},...r?.$sourceUrl!=null&&{sourceUrl:r.$sourceUrl}})}async function Ne(t,n=new Map,i={}){let a={};if(t.length===0)return a;for(let o of t){if(o.$configEnabled!=null&&!await e(o.$configEnabled,{...i,...a}))continue;let t={...i,...a};if(await e(o.enabled,t))try{let e,i=n.get(o.id);switch(o.default!==void 0&&(i=await Me(o.default,o.id,t,o)),o.type){case`input`:{let n={message:o.message};i!==void 0&&(n.default=String(i));let a=await _(o.required,t);if(a!==void 0&&(n.required=a),e=await te(n),a&&(e==null||typeof e==`string`&&e.trim()===``))throw r(`${o.message} is required`,`error`),D.required(o.id);break}case`password`:if(e=await re({message:o.message,mask:`*`}),await _(o.required,t)&&(e==null||typeof e==`string`&&e.trim()===``))throw r(`${o.message} is required`,`error`),D.required(o.id);break;case`number`:{let n={message:o.message};i!==void 0&&(n.default=Number(i));let a=await _(o.required,t);if(a!==void 0&&(n.required=a),o.min!==void 0&&(n.min=o.min),o.max!==void 0&&(n.max=o.max),e=await ne(n),a&&e==null)throw r(`${o.message} is required`,`error`),D.required(o.id);break}case`select`:{let t={message:o.message,choices:o.choices.map(e=>({name:e.name,value:e.value}))};i!==void 0&&(t.default=i),e=await ie(t);break}case`confirm`:{let t=i===void 0?!1:!!i;e=await w({message:o.message,default:t});break}default:throw r(`Unknown prompt type: ${o.type}`,`error`),D.unknownType(o.type)}o.transformers!==void 0&&(e=await Y.apply(o.transformers,e,{...t,...a})),a[o.id]=e}catch(e){throw e instanceof Error&&r(`Failed to collect prompt "${o.id}": ${e.message}`,`error`),e}}return a}async function Pe(e,t){let n=new Map,r=e.map(async e=>{if(e.default!==void 0){let r=await Me(e.default,e.id,t,e);r!==void 0&&n.set(e.id,r)}});return await Promise.all(r),n}function Fe(e){let t=[],n=new Set;for(let r of e){if(n.has(r.id)&&t.push(`Duplicate prompt ID: ${r.id}`),n.add(r.id),/^[a-zA-Z_$][a-zA-Z0-9_$]*$/u.test(r.id)||t.push(`Invalid prompt ID "${r.id}": must be a valid JavaScript identifier (start with letter, underscore, or $, followed by letters, digits, underscores, or $)`),(!r.message||r.message.trim()===``)&&t.push(`Prompt "${r.id}" must have a non-empty message`),r.type===`select`){r.choices.length===0&&t.push(`Select prompt "${r.id}" must have at least one choice`);for(let e of r.choices)(!e.name||e.name.trim()===``)&&t.push(`Select prompt "${r.id}" has a choice with empty name`),e.value===void 0&&t.push(`Select prompt "${r.id}" has a choice with undefined value`)}r.type===`number`&&r.min!==void 0&&r.max!==void 0&&r.min>r.max&&t.push(`Number prompt "${r.id}" has min greater than max`)}return t}const Ie=S(b.appendFile),Le=S(b.readFile),Re=S(b.stat);async function ze(e,t,n){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t)){r(`Condition not met, skipping append task`,`info`);return}let i=y.join(x.cwd(),e.file),a={};e.content==null?e.template!=null&&(a.template=e.template):a.template=e.content,e.templateFile!=null&&(a.templateFile=e.templateFile);let o=M(a);if(!o.isValid)throw o.error?.includes(`cannot have both`)?O.templateHasBothTemplateAndFile():O.templateMissingTemplateOrFile();let s=await N(a,t,n),c=!1,l=!1;try{await Re(i),c=!0;let t=await Le(i,`utf-8`);t.length>0&&!t.endsWith(`
|
|
23
|
+
`)&&(l=e.newline!==!1)}catch{}c&&l?await Ie(i,`\n${s}`):await Ie(i,s),r(`Appended content to ${e.file}`,`success`)}const Be={name:`append`,version:`1.0.0`,taskTypes:[`append`],execute:async(e,t,n)=>{n.dryRun||await ze(e.config,t,e)}},Ve=S(b.copyFile),He=S(b.stat),Ue=S(b.mkdir),We=S(b.readdir);async function Ge(e,t){await Ue(t,{recursive:!0});let n=await We(e,{withFileTypes:!0});await Promise.all(n.map(async n=>{let r=y.join(e,n.name),i=y.join(t,n.name);n.isDirectory()?await Ge(r,i):await Ve(r,i)}))}async function Ke(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t)){r(`Condition not met, skipping copy task`,`info`);return}let n=y.join(x.cwd(),e.from),i=y.join(x.cwd(),e.to),a;try{a=await He(n)}catch{r(`Source path does not exist: ${n}`,`warn`);return}await Ue(y.dirname(i),{recursive:!0}),a.isDirectory()?(await Ge(n,i),r(`Copied directory ${e.from} to ${e.to}`,`success`)):(await Ve(n,i),r(`Copied file ${e.from} to ${e.to}`,`success`))}const qe={name:`copy`,version:`1.0.0`,taskTypes:[`copy`],execute:async(e,t,n)=>{n.dryRun||await Ke(e.config,t)}},Je=S(b.writeFile);async function Ye(e,t,n){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t)){r(`Condition not met, skipping create task`,`info`);return}let i=y.join(x.cwd(),e.file);if(b.existsSync(i)){r(`File already exists, skipping: ${e.file}`,`info`);return}let a=M(e);if(!a.isValid)throw a.error?.includes(`cannot have both`)?O.createHasBothTemplateAndFile():O.createMissingTemplateOrFile();let o=await N(e,t,n),s=y.dirname(i);b.existsSync(s)||b.mkdirSync(s,{recursive:!0}),await Je(i,o),r(`Created file: ${e.file}`,`success`)}const Xe={name:`create`,version:`1.0.0`,taskTypes:[`create`],execute:async(e,t,n)=>{n.dryRun||await Ye(e.config,t,e)}};async function Ze(e,t){let{paths:n,condition:i}=e;if(i!=null&&i!==``){if(!t){r(`Condition specified but no config provided, skipping deletion`,`warn`);return}if(!g(i,t)){r(`Condition not met, skipping deletion`,`info`);return}}for(let e of n){let t=y.join(x.cwd(),e);b.existsSync(t)&&b.rmSync(t,{recursive:!0,force:!0})}}const Qe={name:`delete`,version:`1.0.0`,taskTypes:[`delete`],execute:async(e,t,n)=>{n.dryRun||await Ze(e.config,t)}};async function $e(e,t,n){e.condition!=null&&e.condition!==``&&!g(e.condition,t)||await f({file:e.file,...e.runtime&&{runtime:e.runtime},...e.args&&{args:e.args},...e.parameters&&{parameters:e.parameters},...e.cwd!=null&&e.cwd.trim()!==``&&{cwd:e.cwd},...n?.$sourceUrl!=null&&n.$sourceUrl.trim()!==``&&{sourceUrl:n.$sourceUrl},captureOutput:!1},t)}const et={name:`exec-file`,version:`1.0.0`,taskTypes:[`exec-file`],execute:async(e,t,n)=>{n.dryRun||await $e(e.config,t,e)}};async function tt(e,t){if(e.condition!=null&&e.condition!==``){if(!t){r(`Condition specified but no config provided, skipping exec`,`warn`);return}if(!g(e.condition,t)){r(`Condition not met, skipping exec task`,`info`);return}}let n=e.cwd==null?x.cwd():y.join(x.cwd(),e.cwd);C(e.command,{cwd:n,stdio:`inherit`})}const nt={name:`exec`,version:`1.0.0`,taskTypes:[`exec`],execute:async(e,t,n)=>{n.dryRun||await tt(e.config,t)}};async function rt(e,t){if(e.condition!=null&&e.condition!==``){if(!t){r(`Condition specified but no config provided, skipping git-init`,`warn`);return}if(!g(e.condition,t)){r(`Condition not met, skipping git-init task`,`info`);return}}if(e.removeExisting){let e=y.join(x.cwd(),`.git`);b.existsSync(e)&&b.rmSync(e,{recursive:!0,force:!0})}if(C(`git init`,{stdio:`inherit`}),e.initialCommit){let t=e.message??`Initial commit`;C(`git add .`,{stdio:`inherit`}),C(`git commit -m "${t}"`,{stdio:`inherit`})}}const it={name:`git-init`,version:`1.0.0`,taskTypes:[`git-init`],execute:async(e,t,n)=>{n.dryRun||await rt(e.config,t)}},at=S(b.mkdir);async function ot(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t)){r(`Condition not met, skipping mkdir task`,`info`);return}await at(y.join(x.cwd(),e.path),{recursive:!0}),r(`Created directory: ${e.path}`,`success`)}const st={name:`mkdir`,version:`1.0.0`,taskTypes:[`mkdir`],execute:async(e,t,n)=>{n.dryRun||await ot(e.config,t)}},ct=S(b.rename),lt=S(b.stat),ut=S(b.mkdir);async function dt(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t)){r(`Condition not met, skipping move task`,`info`);return}let n=y.join(x.cwd(),e.from),i=y.join(x.cwd(),e.to);try{await lt(n)}catch{r(`Source path does not exist: ${n}`,`warn`);return}await ut(y.dirname(i),{recursive:!0}),await ct(n,i),r(`Moved ${e.from} to ${e.to}`,`success`)}const ft={name:`move`,version:`1.0.0`,taskTypes:[`move`],execute:async(e,t,n)=>{n.dryRun||await dt(e.config,t)}},pt=S(b.readFile),mt=S(b.writeFile);async function ht(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t)){r(`Condition not met, skipping regex-replace task`,`info`);return}let n=y.join(x.cwd(),e.file),{pattern:i}=e,a=e.flags??``,o=e.replacement||``,s=await pt(n,`utf-8`),c=new RegExp(i,a);s=s.replace(c,h(o,t)),await mt(n,s)}const gt={name:`regex-replace`,version:`1.0.0`,taskTypes:[`regex-replace`],execute:async(e,t,n)=>{n.dryRun||await ht(e.config,t)}},_t=S(b.rename);async function vt(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t)){r(`Condition not met, skipping rename task`,`info`);return}let n=y.join(x.cwd(),h(e.from,t)),i=y.join(x.cwd(),h(e.to,t));if(!b.existsSync(n)){r(`Source path does not exist: ${n}`,`warn`);return}await _t(n,i)}const yt={name:`rename`,version:`1.0.0`,taskTypes:[`rename`],execute:async(e,t,n)=>{n.dryRun||await vt(e.config,t)}},bt=S(b.readFile),xt=S(b.writeFile);async function St(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t)){r(`Condition not met, skipping replace-in-file task`,`info`);return}let n=y.join(x.cwd(),e.file),{replacements:i}=e;if(!b.existsSync(n)){r(`File not found: ${n}, skipping`,`warn`);return}let a=await bt(n,`utf-8`);for(let{find:e,replace:n}of i){let r=h(n,t);a=a.replace(new RegExp(e,`gu`),r)}await xt(n,a)}const Ct={name:`replace-in-file`,version:`1.0.0`,taskTypes:[`replace-in-file`],execute:async(e,t,n)=>{n.dryRun||await St(e.config,t)}},wt=S(b.readFile),Tt=S(b.writeFile);async function Et(e,t){if(e.condition!=null&&e.condition!==``&&!g(e.condition,t)){r(`Condition not met, skipping update-json task`,`info`);return}let n=y.join(x.cwd(),e.file),{updates:i}=e,a=await wt(n,`utf-8`),o=JSON.parse(a);function s(e){if(typeof e==`string`)return h(e,t);if(Array.isArray(e))return e.map(e=>s(e));if(typeof e==`object`&&e){let t={};for(let[n,r]of Object.entries(e))t[n]=s(r);return t}return e}for(let[e,t]of Object.entries(i)){let n=s(t);e.includes(`.`)?p(o,e,n):o[e]=n}await Tt(n,`${JSON.stringify(o,null,2)}\n`)}const Dt={name:`update-json`,version:`1.0.0`,taskTypes:[`update-json`],execute:async(e,t,n)=>{n.dryRun||await Et(e.config,t)}},Ot=S(b.writeFile);async function kt(e,t,n){let{allowCreate:i=!0}=e;if(e.condition!=null&&e.condition!==``&&!g(e.condition,t)){r(`Condition not met, skipping write task`,`info`);return}let a=y.join(x.cwd(),e.file);if(!b.existsSync(a)){if(i===!1)throw Error(`Write task failed: file does not exist (${e.file})`);r(`File not found, creating new file: ${e.file}`,`info`)}let o=M(e);if(!o.isValid)throw o.error?.includes(`cannot have both`)?O.templateHasBothTemplateAndFile():O.templateMissingTemplateOrFile();let s=await N(e,t,n),c=y.dirname(a);b.existsSync(c)||b.mkdirSync(c,{recursive:!0}),await Ot(a,s)}const At={name:`write`,version:`1.0.0`,taskTypes:[`write`],execute:async(e,t,n)=>{n.dryRun||await kt(e.config,t,e)}};function X(){q(`update-json`)||(G(Dt),G(At),G(Xe),G(gt),G(Ct),G(Qe),G(yt),G(it),G(nt),G(et),G(ft),G(qe),G(Be),G(st))}async function jt(e,t,n=!1){if(X(),n){r(`[DRY RUN] Would execute: ${e.name}`,`info`);return}if(q(e.type)){await Ae(e,t,{dryRun:n});return}throw TypeError(`Unknown task type: ${e.type}`)}async function Z(e,t,n,i,a=!1){try{return r(`[${n}/${i}] Running: ${e.name}...`,`info`),await jt(e,t,a),r(`[${n}/${i}] Completed: ${e.name}...`,`success`),!0}catch(t){return r(`Failed: ${e.name}`,`error`),t instanceof Error&&(r(` Reason: ${t.message}`,`error`),t.stack!=null&&x.env.DEBUG!=null&&console.error(t.stack)),!1}}function Mt(e){let t=[],n=new Set,r=new Set,i=new Map(e.map(e=>[e.id,e]));function a(e){if(n.has(e))return;if(r.has(e))throw d.forTaskDependency(e);r.add(e);let o=i.get(e);if(!o)throw de.forId(e);if(o.dependencies)for(let e of o.dependencies)a(e);r.delete(e),n.add(e),t.push(o)}for(let t of e)n.has(t.id)||a(t.id);return t}function Nt(e){let t=[];for(let n of e)if(!q(n.type))t.push(`Task "${n.id}" (${n.name}): Unknown task type "${n.type}"`);else if(n.type===`write`){let e=Pt(n);t.push(...e)}return t}function Pt(e){let t=[],n=e.config,r=typeof n.template==`string`?n.template:void 0,i=typeof n.templateFile==`string`?n.templateFile:void 0,a=M({...r!==void 0&&{template:r},...i!==void 0&&{templateFile:i}});return!a.isValid&&a.error!=null&&a.error!==``&&t.push(`Task "${e.id}" (${e.name}): ${a.error}`),(n.file==null||n.file===``)&&t.push(`Task "${e.id}" (${e.name}): Write task requires "file" property to specify the output file path`),t}function Ft(e){r(`❌ Template validation failed:`,`error`),r(``,`error`);for(let t of e)r(` • ${t}`,`error`);r(``,`error`),r(`Please fix these errors before continuing.`,`error`)}async function Q(e,t=new Map,n={}){let r={};for(let i of e){let e=t.get(i.id);e!==void 0&&(i.transformers!==void 0&&(e=await Y.apply(i.transformers,e,{...n,...r})),r[i.id]=e)}return r}async function $(t,n,r){let i=new Map;for(let a of t){if(r?.skipConditional===!0&&typeof a.value==`object`&&a.value!==null&&!Array.isArray(a.value)&&a.value.type===`conditional`)continue;if(a.$configEnabled!=null){let t={...n};for(let[e,n]of i.entries())t[e]=n;if(!await e(a.$configEnabled,t))continue}let t={...n};for(let[e,n]of i.entries())t[e]=n;let o=await c(a.value,{id:a.id,contextType:`Variable`,context:t,...a.$sourceUrl!=null&&{sourceUrl:a.$sourceUrl}});o!==void 0&&i.set(a.id,o)}return i}function It(e){let t=[],n=new Set;for(let r of e)n.has(r.id)&&t.push(`Duplicate variable ID: "${r.id}"`),n.add(r.id);return t}async function Lt(t,n){let a=ee();if(!await e(n.configEnabled,a,{lazy:!0})){o(`⊘ Template is disabled - skipping all execution`);return}n.transformers!==void 0&&n.transformers.length>0&&(u(`Registering ${n.transformers.length} transformer(s)...`),Y.registerAll(n.transformers)),u(`Registering built-in plugins...`),X(),u(`Validating task configurations...`);let c=Nt(t);c.length>0&&(Ft(c),x.exit(1)),u(`All tasks validated successfully`);let l=t.filter(e=>i(e.enabled,ee(),{lazy:!0}));u(`Resolving task dependencies...`);let d=Mt(l);u(`Sorted ${d.length} task(s) by dependencies`),o(`Welcome! Let's execute your tasks.`),n.dryRun&&s(`🔍 DRY RUN MODE - No changes will be made`),o(`This will execute your project tasks based on the defined configuration.`);let f=a,p=[...n.variables??[]];if(p.length>0){let e=It(p);e.length>0&&(r(`❌ Variable validation errors:`,`error`),e.forEach(e=>r(` - ${e}`,`error`)),x.exit(1)),u(`Resolving variable values...`);let t=await Q(p,await $(p,f,{skipConditional:!0}),f);Object.assign(f,t),Object.keys(t).length>0&&(u(`Resolved ${Object.keys(t).length} variable(s)`),u(`Variable values: ${JSON.stringify(t)}`))}let m=n.prompts??[],h=[...m];if(h.length>0){let e=Fe(h);e.length>0&&(r(`❌ Prompt validation errors:`,`error`),e.forEach(e=>r(` - ${e}`,`error`)),x.exit(1)),u(`Resolving prompt default values...`);let t=await Pe(h,f);if(m.length>0){o(`📋 Collecting prompts (available to all tasks):`);let e=await Ne(m,t,f);Object.assign(f,e)}}if(p.length>0){let e=p.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1);if(e.length>0){u(`Re-resolving conditional variables with prompt values...`);let t=await Q(e,await $(e,f),f);Object.assign(f,t),Object.keys(t).length>0&&u(`Resolved ${Object.keys(t).length} conditional variable(s)`)}}if(!await e(n.configEnabled,f)){o(`⊘ Template is disabled after variable resolution - skipping all execution`);return}let g=[];for(let t of d)t.$configEnabled!=null&&!await e(t.$configEnabled,f)||await e(t.enabled,f)&&g.push(t);if(r(`${g.length} of ${d.length} task(s) enabled for execution`,`info`),n.dryRun){await V(g,f),o(`🔍 Dry run completed - no changes were made`),o(`Run without --dry-run to apply changes`);return}u(`Calling beforeAll hook...`),await J(`beforeAll`,f);let y=g.length,b=0,S=0,C=[],w=[];for(let e=0;e<g.length;e++){let t=g[e];t!=null&&(u(`Calling beforeTask hook for task: ${t.name}`),await J(`beforeTask`,t,f),await Z(t,f,e+1,y,n.dryRun)?(b++,C.push(t.id),u(`Calling afterTask hook for task: ${t.name}`),await J(`afterTask`,t,f)):(await _(t.required,f)&&(S++,w.push(t.name)),u(`Calling onError hook for task: ${t.name}`),await J(`onError`,Error(`Task ${t.name} failed`),t),s(`⚠️ Task "${t.name}" failed, continuing with remaining tasks...`)))}S>0&&(r(`\n❌ Task execution completed with ${S} error(s)`,`error`),r(`Completed: ${b}/${y} tasks`,`info`),r(`Failed tasks: ${w.join(`, `)}`,`error`),x.exit(1)),u(`Calling afterAll hook...`),await J(`afterAll`,f),v(`✅ All tasks completed successfully!`),v(` Completed: ${b}/${y} tasks`)}async function Rt(n,i,a={}){u(`Running templates with sequential variable/prompt resolution...`),u(`Total templates to process: ${n.length}`),u(`Registering built-in plugins...`),X();let c=[];console.log(``),o(`📋 Collecting input...`),console.log(``);for(let t=0;t<n.length;t++){let i=n[t];if(i==null)continue;let s=`=`.repeat(60);if(u(`\n${s}`),u(`Processing template ${t+1}/${n.length}: "${i.name}"`),u(s),u(`Current config keys: ${Object.keys(a).join(`, `)}`),!await e(i.enabled,a)){o(`⊘ Template "${i.name}" is disabled - skipping`),u(` Enabled condition: ${JSON.stringify(i.enabled)}`);continue}let l=i.variables??[];if(l.length>0){u(`Processing ${l.length} variable(s) for template "${i.name}"...`);let e=It(l);e.length>0&&(r(`❌ Variable validation errors:`,`error`),e.forEach(e=>r(` - ${e}`,`error`)),x.exit(1));let t=await Q(l,await $(l,a,{skipConditional:!0}),a);Object.assign(a,t);let n=l.filter(e=>typeof e.value==`object`&&e.value!==null&&!Array.isArray(e.value)?e.value.type===`conditional`:!1),o=0;if(n.length>0){let e=await Q(n,await $(n,a),a);if(o=Object.keys(e).length,Object.assign(a,e),o>0){u(`Resolved ${o} conditional variable(s)`);for(let[t,n]of Object.entries(e))u(` ${t} = ${JSON.stringify(n)}`)}}let s=Object.keys(t).length+o;if(s>0){u(`Total variables resolved for template: ${s}`);for(let[e,n]of Object.entries(t))u(` ${e} = ${JSON.stringify(n)}`)}}let d=i.prompts??[];if(d.length>0){u(`Processing ${d.length} prompt(s) for template "${i.name}"...`);let e=Fe(d);e.length>0&&(r(`❌ Prompt validation errors:`,`error`),e.forEach(e=>r(` - ${e}`,`error`)),x.exit(1));let t=await Ne(d,await Pe(d,a),a);Object.assign(a,t),u(`Collected ${Object.keys(t).length} prompt answer(s)`)}if(!await e(i.enabled,a)){o(`⊘ Template "${i.name}" became disabled after variable/prompt resolution - skipping tasks`);continue}let f=i.tasks??[];f.length>0&&(u(`Found ${f.length} task(s) in template "${i.name}" (will execute later)`),c.push(...f))}if(u(`
|
|
24
|
+
🔧 Validating and filtering all collected tasks...`),c.length===0){r(`No tasks found in any template`,`info`);return}let l=Nt(c);l.length>0&&(Ft(l),x.exit(1)),console.log(``),r(`🛠️ Preparing tasks...`,`info`);let d=[];for(let t of c)await e(t.enabled,a)&&d.push(t);if(console.log(``),r(`Found ${c.length} tasks (${d.length} enabled)`,`info`),r(`All tasks validated successfully`,`success`),d.length===0){r(`No enabled tasks to execute`,`info`);return}let f=Mt(d);if(i.dryRun){r(`
|
|
25
|
+
🔍 Dry run - showing task changes...`,`info`),await V(f,a),r(`
|
|
26
|
+
🔍 Dry run completed - no changes were made`,`info`),r(`Run without --dry-run to apply changes`,`info`);return}console.log(``),t(`⚙️ Executing tasks...`),console.log(``),await J(`beforeAll`,a);let p=0,m=0,h=[];for(let e=0;e<f.length;e++){let t=f[e];t!=null&&(await J(`beforeTask`,t,a),await Z(t,a,e+1,f.length,i.dryRun)?(p++,await J(`afterTask`,t,a)):(await _(t.required,a)&&(m++,h.push(t.name)),await J(`onError`,Error(`Task ${t.name} failed`),t),s(`⚠️ Task "${t.name}" failed, continuing with remaining tasks...`)))}await J(`afterAll`,a),m>0&&(r(`\n❌ Task execution completed with ${m} error(s)`,`error`),r(`Completed: ${p}/${f.length} tasks`,`info`),r(`Failed tasks: ${h.join(`, `)}`,`error`),x.exit(1)),r(`Completed: ${p}/${f.length} tasks`,`success`)}export{z as _,Ae as a,we as b,q as c,G as d,Te as f,ye as g,B as h,je as i,De as l,_e as m,Rt as n,Ee as o,V as p,Oe as r,K as s,Lt as t,ke as u,ve as v,R as x,ge as y};
|