@allenhack638/templar 1.0.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.
Files changed (101) hide show
  1. package/dist/cli/index.d.ts +2 -0
  2. package/dist/cli/index.d.ts.map +1 -0
  3. package/dist/cli/index.js +130 -0
  4. package/dist/cli/index.js.map +1 -0
  5. package/dist/engine/context.d.ts +8 -0
  6. package/dist/engine/context.d.ts.map +1 -0
  7. package/dist/engine/context.js +10 -0
  8. package/dist/engine/context.js.map +1 -0
  9. package/dist/engine/stepRunner.d.ts +8 -0
  10. package/dist/engine/stepRunner.d.ts.map +1 -0
  11. package/dist/engine/stepRunner.js +35 -0
  12. package/dist/engine/stepRunner.js.map +1 -0
  13. package/dist/engine/templateLoader.d.ts +3 -0
  14. package/dist/engine/templateLoader.d.ts.map +1 -0
  15. package/dist/engine/templateLoader.js +16 -0
  16. package/dist/engine/templateLoader.js.map +1 -0
  17. package/dist/index.d.ts +3 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +3 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/steps/command/run.d.ts +8 -0
  22. package/dist/steps/command/run.d.ts.map +1 -0
  23. package/dist/steps/command/run.js +12 -0
  24. package/dist/steps/command/run.js.map +1 -0
  25. package/dist/steps/edit/append.d.ts +7 -0
  26. package/dist/steps/edit/append.d.ts.map +1 -0
  27. package/dist/steps/edit/append.js +11 -0
  28. package/dist/steps/edit/append.js.map +1 -0
  29. package/dist/steps/edit/insertAfter.d.ts +8 -0
  30. package/dist/steps/edit/insertAfter.d.ts.map +1 -0
  31. package/dist/steps/edit/insertAfter.js +11 -0
  32. package/dist/steps/edit/insertAfter.js.map +1 -0
  33. package/dist/steps/edit/insertBefore.d.ts +8 -0
  34. package/dist/steps/edit/insertBefore.d.ts.map +1 -0
  35. package/dist/steps/edit/insertBefore.js +11 -0
  36. package/dist/steps/edit/insertBefore.js.map +1 -0
  37. package/dist/steps/edit/jsonMerge.d.ts +7 -0
  38. package/dist/steps/edit/jsonMerge.d.ts.map +1 -0
  39. package/dist/steps/edit/jsonMerge.js +18 -0
  40. package/dist/steps/edit/jsonMerge.js.map +1 -0
  41. package/dist/steps/edit/prepend.d.ts +7 -0
  42. package/dist/steps/edit/prepend.d.ts.map +1 -0
  43. package/dist/steps/edit/prepend.js +11 -0
  44. package/dist/steps/edit/prepend.js.map +1 -0
  45. package/dist/steps/edit/replace.d.ts +8 -0
  46. package/dist/steps/edit/replace.d.ts.map +1 -0
  47. package/dist/steps/edit/replace.js +11 -0
  48. package/dist/steps/edit/replace.js.map +1 -0
  49. package/dist/steps/file/copy.d.ts +7 -0
  50. package/dist/steps/file/copy.d.ts.map +1 -0
  51. package/dist/steps/file/copy.js +15 -0
  52. package/dist/steps/file/copy.js.map +1 -0
  53. package/dist/steps/file/create.d.ts +7 -0
  54. package/dist/steps/file/create.d.ts.map +1 -0
  55. package/dist/steps/file/create.js +10 -0
  56. package/dist/steps/file/create.js.map +1 -0
  57. package/dist/steps/file/delete.d.ts +6 -0
  58. package/dist/steps/file/delete.d.ts.map +1 -0
  59. package/dist/steps/file/delete.js +14 -0
  60. package/dist/steps/file/delete.js.map +1 -0
  61. package/dist/steps/file/move.d.ts +7 -0
  62. package/dist/steps/file/move.d.ts.map +1 -0
  63. package/dist/steps/file/move.js +14 -0
  64. package/dist/steps/file/move.js.map +1 -0
  65. package/dist/steps/file/rename.d.ts +2 -0
  66. package/dist/steps/file/rename.d.ts.map +1 -0
  67. package/dist/steps/file/rename.js +3 -0
  68. package/dist/steps/file/rename.js.map +1 -0
  69. package/dist/steps/package/install.d.ts +6 -0
  70. package/dist/steps/package/install.d.ts.map +1 -0
  71. package/dist/steps/package/install.js +7 -0
  72. package/dist/steps/package/install.js.map +1 -0
  73. package/dist/steps/package/installDev.d.ts +6 -0
  74. package/dist/steps/package/installDev.d.ts.map +1 -0
  75. package/dist/steps/package/installDev.js +7 -0
  76. package/dist/steps/package/installDev.js.map +1 -0
  77. package/dist/steps/package/remove.d.ts +6 -0
  78. package/dist/steps/package/remove.d.ts.map +1 -0
  79. package/dist/steps/package/remove.js +10 -0
  80. package/dist/steps/package/remove.js.map +1 -0
  81. package/dist/steps/plugin/execute.d.ts +7 -0
  82. package/dist/steps/plugin/execute.d.ts.map +1 -0
  83. package/dist/steps/plugin/execute.js +28 -0
  84. package/dist/steps/plugin/execute.js.map +1 -0
  85. package/dist/types/step.d.ts +37 -0
  86. package/dist/types/step.d.ts.map +1 -0
  87. package/dist/types/step.js +2 -0
  88. package/dist/types/step.js.map +1 -0
  89. package/dist/utils/fileUtils.d.ts +9 -0
  90. package/dist/utils/fileUtils.d.ts.map +1 -0
  91. package/dist/utils/fileUtils.js +44 -0
  92. package/dist/utils/fileUtils.js.map +1 -0
  93. package/dist/utils/logger.d.ts +7 -0
  94. package/dist/utils/logger.d.ts.map +1 -0
  95. package/dist/utils/logger.js +8 -0
  96. package/dist/utils/logger.js.map +1 -0
  97. package/dist/utils/packageUtils.d.ts +2 -0
  98. package/dist/utils/packageUtils.d.ts.map +1 -0
  99. package/dist/utils/packageUtils.js +13 -0
  100. package/dist/utils/packageUtils.js.map +1 -0
  101. package/package.json +38 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,130 @@
1
+ import { Command } from 'commander';
2
+ import inquirer from 'inquirer';
3
+ import fs from 'fs-extra';
4
+ import path from 'path';
5
+ import { logger } from '../utils/logger.js';
6
+ import { loadTemplateSteps } from '../engine/templateLoader.js';
7
+ import { createContext } from '../engine/context.js';
8
+ import { runSteps } from '../engine/stepRunner.js';
9
+ const program = new Command();
10
+ const getTemplates = async () => {
11
+ const templatesJsonPath = path.resolve(process.cwd(), 'templates', 'templates.json');
12
+ if (!(await fs.pathExists(templatesJsonPath))) {
13
+ throw new Error(`Templates registry is missing or corrupted.`);
14
+ }
15
+ const metadata = await fs.readJson(templatesJsonPath);
16
+ // Filter to only existing template folders
17
+ const validTemplates = [];
18
+ for (const item of metadata) {
19
+ const itemPath = path.resolve(process.cwd(), 'templates', item.name);
20
+ if (await fs.pathExists(itemPath)) {
21
+ validTemplates.push(item);
22
+ }
23
+ }
24
+ return validTemplates;
25
+ };
26
+ const sanitizeProjectName = (name) => {
27
+ return name
28
+ .trim()
29
+ .toLowerCase()
30
+ .replace(/\s+/g, '-')
31
+ .replace(/[^a-z0-9-_]/g, '')
32
+ .replace(/-+/g, '-');
33
+ };
34
+ const validateTemplateExists = async (templateName) => {
35
+ const templates = await getTemplates();
36
+ const existsInMeta = templates.some(t => t.name === templateName);
37
+ if (!existsInMeta)
38
+ return false;
39
+ const templatePath = path.resolve(process.cwd(), 'templates', templateName);
40
+ return await fs.pathExists(templatePath);
41
+ };
42
+ program
43
+ .name('templar')
44
+ .description('A step-driven project scaffolding CLI')
45
+ .version('1.0.0')
46
+ .argument('[template]', 'Template name')
47
+ .argument('[project-name]', 'Project folder name')
48
+ .action(async (templateArg, projectNameArg) => {
49
+ try {
50
+ const templates = await getTemplates();
51
+ if (templates.length === 0) {
52
+ throw new Error('No valid templates found in the registry. Please check your "templates" directory.');
53
+ }
54
+ let template = '';
55
+ let projectName = '';
56
+ if (templateArg && projectNameArg) {
57
+ // Both provided: template project-name
58
+ if (!(await validateTemplateExists(templateArg))) {
59
+ throw new Error(`Invalid template: "${templateArg}". Please select from the list.`);
60
+ }
61
+ template = templateArg;
62
+ projectName = projectNameArg;
63
+ }
64
+ else if (templateArg) {
65
+ // One arg: could be template OR project name
66
+ if (await validateTemplateExists(templateArg)) {
67
+ template = templateArg;
68
+ const answers = await inquirer.prompt([
69
+ {
70
+ type: 'input',
71
+ name: 'projectName',
72
+ message: 'Project name:',
73
+ validate: (input) => (input ? true : 'Project name is required'),
74
+ },
75
+ ]);
76
+ projectName = answers.projectName;
77
+ }
78
+ else {
79
+ // Not a template, assume it's the project name
80
+ projectName = templateArg;
81
+ const answers = await inquirer.prompt([
82
+ {
83
+ type: 'list',
84
+ name: 'template',
85
+ message: 'Select a template:',
86
+ choices: templates.map(t => ({
87
+ name: `${t.displayName} - ${t.description}`,
88
+ value: t.name
89
+ })),
90
+ },
91
+ ]);
92
+ template = answers.template;
93
+ }
94
+ }
95
+ else {
96
+ // No args: prompt for both
97
+ const answers = await inquirer.prompt([
98
+ {
99
+ type: 'list',
100
+ name: 'template',
101
+ message: 'Select a template:',
102
+ choices: templates.map(t => ({
103
+ name: `${t.displayName} - ${t.description}`,
104
+ value: t.name
105
+ })),
106
+ },
107
+ {
108
+ type: 'input',
109
+ name: 'projectName',
110
+ message: 'Project name:',
111
+ validate: (input) => (input ? true : 'Project name is required'),
112
+ },
113
+ ]);
114
+ template = answers.template;
115
+ projectName = answers.projectName;
116
+ }
117
+ projectName = sanitizeProjectName(projectName);
118
+ logger.info(`Generating ${template} project: ${projectName}...`);
119
+ const context = createContext(projectName, template);
120
+ const stepsJson = await loadTemplateSteps(context.templatePath);
121
+ await runSteps(stepsJson, context);
122
+ logger.success('Project generated successfully!');
123
+ }
124
+ catch (error) {
125
+ logger.error(error.message);
126
+ process.exit(1);
127
+ }
128
+ });
129
+ program.parse(process.argv);
130
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface TemplarContext {
2
+ projectName: string;
3
+ projectPath: string;
4
+ templateName: string;
5
+ templatePath: string;
6
+ }
7
+ export declare const createContext: (projectName: string, templateName: string, cwd?: string) => TemplarContext;
8
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/engine/context.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,aAAa,GACtB,aAAa,MAAM,EACnB,cAAc,MAAM,EACpB,MAAK,MAAsB,KAC5B,cAOF,CAAC"}
@@ -0,0 +1,10 @@
1
+ import path from 'path';
2
+ export const createContext = (projectName, templateName, cwd = process.cwd()) => {
3
+ return {
4
+ projectName,
5
+ projectPath: path.resolve(cwd, projectName),
6
+ templateName,
7
+ templatePath: path.resolve(cwd, 'templates', templateName),
8
+ };
9
+ };
10
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/engine/context.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AASxB,MAAM,CAAC,MAAM,aAAa,GAAG,CACzB,WAAmB,EACnB,YAAoB,EACpB,MAAc,OAAO,CAAC,GAAG,EAAE,EACb,EAAE;IAChB,OAAO;QACH,WAAW;QACX,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC;QAC3C,YAAY;QACZ,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE,YAAY,CAAC;KAC7D,CAAC;AACN,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { Step, StepsJSON } from '../types/step.js';
2
+ import type { TemplarContext } from './context.js';
3
+ export interface StepHandler {
4
+ execute(options: any, context: TemplarContext): Promise<void>;
5
+ }
6
+ export declare const runSteps: (stepsJSON: StepsJSON, context: TemplarContext) => Promise<void>;
7
+ export declare const runStep: (step: Step, context: TemplarContext) => Promise<void>;
8
+ //# sourceMappingURL=stepRunner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stepRunner.d.ts","sourceRoot":"","sources":["../../src/engine/stepRunner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAMnD,MAAM,WAAW,WAAW;IACxB,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjE;AAED,eAAO,MAAM,QAAQ,GAAU,WAAW,SAAS,EAAE,SAAS,cAAc,kBAI3E,CAAC;AAEF,eAAO,MAAM,OAAO,GAAU,MAAM,IAAI,EAAE,SAAS,cAAc,kBAkChE,CAAC"}
@@ -0,0 +1,35 @@
1
+ import path from 'path';
2
+ import { fileURLToPath, pathToFileURL } from 'url';
3
+ import { logger } from '../utils/logger.js';
4
+ const __filename = fileURLToPath(import.meta.url);
5
+ const __dirname = path.dirname(__filename);
6
+ export const runSteps = async (stepsJSON, context) => {
7
+ for (const step of stepsJSON.steps) {
8
+ await runStep(step, context);
9
+ }
10
+ };
11
+ export const runStep = async (step, context) => {
12
+ const { type, action, options } = step;
13
+ try {
14
+ // Dynamic import based on project structure
15
+ const handlerPath = path.resolve(__dirname, '..', 'steps', type, `${action}.ts`);
16
+ // In a real build environment, these will be transpiled .js files
17
+ // But since we use tsx or similar, we should handle extensions or just use import()
18
+ // However, for modularity, a simple switch or mapping is safer if dynamic imports are tricky.
19
+ // Let's use dynamic import but handle missing handlers.
20
+ // Note: When running with tsx, this should work.
21
+ const handlerModule = await import(pathToFileURL(handlerPath).href);
22
+ const handler = handlerModule.default || handlerModule;
23
+ if (typeof handler.execute !== 'function') {
24
+ throw new Error(`Handler for ${type}:${action} does not implement execute()`);
25
+ }
26
+ await handler.execute(options, context);
27
+ }
28
+ catch (err) {
29
+ if (err.code === 'MODULE_NOT_FOUND') {
30
+ throw new Error(`No handler found for step type: "${type}" action: "${action}"`);
31
+ }
32
+ throw err;
33
+ }
34
+ };
35
+ //# sourceMappingURL=stepRunner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stepRunner.js","sourceRoot":"","sources":["../../src/engine/stepRunner.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAGnD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAM3C,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAAE,SAAoB,EAAE,OAAuB,EAAE,EAAE;IAC5E,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;QACjC,MAAM,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACjC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAAE,IAAU,EAAE,OAAuB,EAAE,EAAE;IACjE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAGvC,IAAI,CAAC;QACD,4CAA4C;QAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAC5B,SAAS,EACT,IAAI,EACJ,OAAO,EACP,IAAI,EACJ,GAAG,MAAM,KAAK,CACjB,CAAC;QAEF,kEAAkE;QAClE,oFAAoF;QACpF,8FAA8F;QAC9F,wDAAwD;QAExD,iDAAiD;QACjD,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC;QACpE,MAAM,OAAO,GAAgB,aAAa,CAAC,OAAO,IAAI,aAAa,CAAC;QAEpE,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,IAAI,MAAM,+BAA+B,CAAC,CAAC;QAClF,CAAC;QAED,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAChB,IAAI,GAAG,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,oCAAoC,IAAI,cAAc,MAAM,GAAG,CAAC,CAAC;QACrF,CAAC;QACD,MAAM,GAAG,CAAC;IACd,CAAC;AACL,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { StepsJSON } from '../types/step.js';
2
+ export declare const loadTemplateSteps: (templatePath: string) => Promise<StepsJSON>;
3
+ //# sourceMappingURL=templateLoader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templateLoader.d.ts","sourceRoot":"","sources":["../../src/engine/templateLoader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,eAAO,MAAM,iBAAiB,GAAU,cAAc,MAAM,KAAG,OAAO,CAAC,SAAS,CAa/E,CAAC"}
@@ -0,0 +1,16 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+ export const loadTemplateSteps = async (templatePath) => {
4
+ const stepsPath = path.join(templatePath, 'steps.json');
5
+ if (!(await fs.pathExists(stepsPath))) {
6
+ throw new Error(`Template definition (steps.json) is missing. This template might be corrupted.`);
7
+ }
8
+ try {
9
+ const stepsJson = await fs.readJson(stepsPath);
10
+ return stepsJson;
11
+ }
12
+ catch (err) {
13
+ throw new Error(`Invalid template definition. The steps.json file is malformed.`);
14
+ }
15
+ };
16
+ //# sourceMappingURL=templateLoader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templateLoader.js","sourceRoot":"","sources":["../../src/engine/templateLoader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,YAAoB,EAAsB,EAAE;IAChF,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IAExD,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,gFAAgF,CAAC,CAAC;IACtG,CAAC;IAED,IAAI,CAAC;QACD,MAAM,SAAS,GAAc,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC1D,OAAO,SAAS,CAAC;IACrB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;IACtF,CAAC;AACL,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import './cli/index.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,gBAAgB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import './cli/index.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,gBAAgB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { TemplarContext } from '../../engine/context.js';
2
+ export interface CommandOptions {
3
+ command: string;
4
+ args?: string[];
5
+ cwd?: string;
6
+ }
7
+ export declare const execute: (options: CommandOptions, context: TemplarContext) => Promise<void>;
8
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/steps/command/run.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAG9D,MAAM,WAAW,cAAc;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,OAAO,GAChB,SAAS,cAAc,EACvB,SAAS,cAAc,kBAW1B,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { execa } from 'execa';
2
+ import { logger } from '../../utils/logger.js';
3
+ export const execute = async (options, context) => {
4
+ const cwd = options.cwd ? options.cwd : context.projectPath;
5
+ logger.info(`Running command: ${options.command} ${(options.args || []).join(' ')}...`);
6
+ await execa(options.command, options.args || [], {
7
+ cwd,
8
+ stdio: 'inherit',
9
+ shell: true,
10
+ });
11
+ };
12
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/steps/command/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAE9B,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAQ/C,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EACxB,OAAuB,EACvB,OAAuB,EACzB,EAAE;IACA,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IAE5D,MAAM,CAAC,IAAI,CAAC,oBAAoB,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAExF,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE,EAAE;QAC7C,GAAG;QACH,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,IAAI;KACd,CAAC,CAAC;AACP,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { TemplarContext } from '../../engine/context.js';
2
+ export interface EditOptions {
3
+ file: string;
4
+ content: string;
5
+ }
6
+ export declare const execute: (options: EditOptions, context: TemplarContext) => Promise<void>;
7
+ //# sourceMappingURL=append.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"append.d.ts","sourceRoot":"","sources":["../../../src/steps/edit/append.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAI9D,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,OAAO,GAChB,SAAS,WAAW,EACpB,SAAS,cAAc,kBAS1B,CAAC"}
@@ -0,0 +1,11 @@
1
+ import path from 'path';
2
+ import { readFile, writeFile, appendToFile } from '../../utils/fileUtils.js';
3
+ import { logger } from '../../utils/logger.js';
4
+ export const execute = async (options, context) => {
5
+ const filePath = path.resolve(context.projectPath, options.file);
6
+ const content = await readFile(filePath);
7
+ const updated = appendToFile(content, options.content);
8
+ logger.info(`Appending content to ${options.file}...`);
9
+ await writeFile(filePath, updated);
10
+ };
11
+ //# sourceMappingURL=append.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"append.js","sourceRoot":"","sources":["../../../src/steps/edit/append.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAO/C,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EACxB,OAAoB,EACpB,OAAuB,EACzB,EAAE;IACA,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjE,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAEvD,MAAM,CAAC,IAAI,CAAC,wBAAwB,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC;IACvD,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { TemplarContext } from '../../engine/context.js';
2
+ export interface EditOptions {
3
+ file: string;
4
+ match: string;
5
+ content: string;
6
+ }
7
+ export declare const execute: (options: EditOptions, context: TemplarContext) => Promise<void>;
8
+ //# sourceMappingURL=insertAfter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insertAfter.d.ts","sourceRoot":"","sources":["../../../src/steps/edit/insertAfter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAI9D,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,OAAO,GAChB,SAAS,WAAW,EACpB,SAAS,cAAc,kBAS1B,CAAC"}
@@ -0,0 +1,11 @@
1
+ import path from 'path';
2
+ import { readFile, writeFile, insertAfter } from '../../utils/fileUtils.js';
3
+ import { logger } from '../../utils/logger.js';
4
+ export const execute = async (options, context) => {
5
+ const filePath = path.resolve(context.projectPath, options.file);
6
+ const content = await readFile(filePath);
7
+ const updated = insertAfter(content, options.match, options.content);
8
+ logger.info(`Inserting content after "${options.match}" in ${options.file}...`);
9
+ await writeFile(filePath, updated);
10
+ };
11
+ //# sourceMappingURL=insertAfter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insertAfter.js","sourceRoot":"","sources":["../../../src/steps/edit/insertAfter.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAQ/C,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EACxB,OAAoB,EACpB,OAAuB,EACzB,EAAE;IACA,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjE,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAErE,MAAM,CAAC,IAAI,CAAC,4BAA4B,OAAO,CAAC,KAAK,QAAQ,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC;IAChF,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { TemplarContext } from '../../engine/context.js';
2
+ export interface EditOptions {
3
+ file: string;
4
+ match: string;
5
+ content: string;
6
+ }
7
+ export declare const execute: (options: EditOptions, context: TemplarContext) => Promise<void>;
8
+ //# sourceMappingURL=insertBefore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insertBefore.d.ts","sourceRoot":"","sources":["../../../src/steps/edit/insertBefore.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAI9D,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,OAAO,GAChB,SAAS,WAAW,EACpB,SAAS,cAAc,kBAS1B,CAAC"}
@@ -0,0 +1,11 @@
1
+ import path from 'path';
2
+ import { readFile, writeFile, insertBefore } from '../../utils/fileUtils.js';
3
+ import { logger } from '../../utils/logger.js';
4
+ export const execute = async (options, context) => {
5
+ const filePath = path.resolve(context.projectPath, options.file);
6
+ const content = await readFile(filePath);
7
+ const updated = insertBefore(content, options.match, options.content);
8
+ logger.info(`Inserting content before "${options.match}" in ${options.file}...`);
9
+ await writeFile(filePath, updated);
10
+ };
11
+ //# sourceMappingURL=insertBefore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insertBefore.js","sourceRoot":"","sources":["../../../src/steps/edit/insertBefore.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAQ/C,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EACxB,OAAoB,EACpB,OAAuB,EACzB,EAAE;IACA,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjE,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAEtE,MAAM,CAAC,IAAI,CAAC,6BAA6B,OAAO,CAAC,KAAK,QAAQ,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC;IACjF,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { TemplarContext } from '../../engine/context.js';
2
+ export interface JsonMergeOptions {
3
+ file: string;
4
+ data: any;
5
+ }
6
+ export declare const execute: (options: JsonMergeOptions, context: TemplarContext) => Promise<void>;
7
+ //# sourceMappingURL=jsonMerge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonMerge.d.ts","sourceRoot":"","sources":["../../../src/steps/edit/jsonMerge.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAI9D,MAAM,WAAW,gBAAgB;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,GAAG,CAAC;CACb;AAED,eAAO,MAAM,OAAO,GAChB,SAAS,gBAAgB,EACzB,SAAS,cAAc,kBAgB1B,CAAC"}
@@ -0,0 +1,18 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+ import { mergeJson } from '../../utils/fileUtils.js';
4
+ import { logger } from '../../utils/logger.js';
5
+ export const execute = async (options, context) => {
6
+ const filePath = path.resolve(context.projectPath, options.file);
7
+ if (!(await fs.pathExists(filePath))) {
8
+ logger.warn(`File to merge JSON not found: ${options.file}. Creating new file.`);
9
+ await fs.ensureDir(path.dirname(filePath));
10
+ await fs.writeJson(filePath, options.data, { spaces: 2 });
11
+ return;
12
+ }
13
+ const originalData = await fs.readJson(filePath);
14
+ const newData = mergeJson(originalData, options.data);
15
+ logger.info(`Merging JSON data into ${options.file}...`);
16
+ await fs.writeJson(filePath, newData, { spaces: 2 });
17
+ };
18
+ //# sourceMappingURL=jsonMerge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonMerge.js","sourceRoot":"","sources":["../../../src/steps/edit/jsonMerge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAO/C,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EACxB,OAAyB,EACzB,OAAuB,EACzB,EAAE;IACA,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjE,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,iCAAiC,OAAO,CAAC,IAAI,sBAAsB,CAAC,CAAC;QACjF,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC3C,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1D,OAAO;IACX,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtD,MAAM,CAAC,IAAI,CAAC,0BAA0B,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC;IACzD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;AACzD,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { TemplarContext } from '../../engine/context.js';
2
+ export interface EditOptions {
3
+ file: string;
4
+ content: string;
5
+ }
6
+ export declare const execute: (options: EditOptions, context: TemplarContext) => Promise<void>;
7
+ //# sourceMappingURL=prepend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepend.d.ts","sourceRoot":"","sources":["../../../src/steps/edit/prepend.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAI9D,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,OAAO,GAChB,SAAS,WAAW,EACpB,SAAS,cAAc,kBAS1B,CAAC"}
@@ -0,0 +1,11 @@
1
+ import path from 'path';
2
+ import { readFile, writeFile, prependToFile } from '../../utils/fileUtils.js';
3
+ import { logger } from '../../utils/logger.js';
4
+ export const execute = async (options, context) => {
5
+ const filePath = path.resolve(context.projectPath, options.file);
6
+ const content = await readFile(filePath);
7
+ const updated = prependToFile(content, options.content);
8
+ logger.info(`Prepending content to ${options.file}...`);
9
+ await writeFile(filePath, updated);
10
+ };
11
+ //# sourceMappingURL=prepend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepend.js","sourceRoot":"","sources":["../../../src/steps/edit/prepend.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAO/C,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EACxB,OAAoB,EACpB,OAAuB,EACzB,EAAE;IACA,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjE,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAExD,MAAM,CAAC,IAAI,CAAC,yBAAyB,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC;IACxD,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { TemplarContext } from '../../engine/context.js';
2
+ export interface EditOptions {
3
+ file: string;
4
+ match: string;
5
+ content: string;
6
+ }
7
+ export declare const execute: (options: EditOptions, context: TemplarContext) => Promise<void>;
8
+ //# sourceMappingURL=replace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replace.d.ts","sourceRoot":"","sources":["../../../src/steps/edit/replace.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAI9D,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,OAAO,GAChB,SAAS,WAAW,EACpB,SAAS,cAAc,kBAS1B,CAAC"}
@@ -0,0 +1,11 @@
1
+ import path from 'path';
2
+ import { readFile, writeFile, replaceInFile } from '../../utils/fileUtils.js';
3
+ import { logger } from '../../utils/logger.js';
4
+ export const execute = async (options, context) => {
5
+ const filePath = path.resolve(context.projectPath, options.file);
6
+ const content = await readFile(filePath);
7
+ const updated = replaceInFile(content, options.match, options.content);
8
+ logger.info(`Replacing content in ${options.file}...`);
9
+ await writeFile(filePath, updated);
10
+ };
11
+ //# sourceMappingURL=replace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replace.js","sourceRoot":"","sources":["../../../src/steps/edit/replace.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAQ/C,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EACxB,OAAoB,EACpB,OAAuB,EACzB,EAAE;IACA,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjE,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAEvE,MAAM,CAAC,IAAI,CAAC,wBAAwB,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC;IACvD,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { TemplarContext } from '../../engine/context.js';
2
+ export interface FileCopyOptions {
3
+ from: string;
4
+ to: string;
5
+ }
6
+ export declare const execute: (options: FileCopyOptions, context: TemplarContext) => Promise<void>;
7
+ //# sourceMappingURL=copy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy.d.ts","sourceRoot":"","sources":["../../../src/steps/file/copy.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAG9D,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,OAAO,GAChB,SAAS,eAAe,EACxB,SAAS,cAAc,kBAc1B,CAAC"}
@@ -0,0 +1,15 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+ import { logger } from '../../utils/logger.js';
4
+ export const execute = async (options, context) => {
5
+ const sourcePath = path.resolve(context.templatePath, options.from);
6
+ const targetPath = path.resolve(context.projectPath, options.to);
7
+ if (!(await fs.pathExists(sourcePath))) {
8
+ throw new Error(`Source path for file:copy not found: ${sourcePath}`);
9
+ }
10
+ // Ensure target folder exists
11
+ await fs.ensureDir(path.dirname(targetPath));
12
+ logger.info(`Copying ${options.from} to ${options.to}...`);
13
+ await fs.copy(sourcePath, targetPath);
14
+ };
15
+ //# sourceMappingURL=copy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy.js","sourceRoot":"","sources":["../../../src/steps/file/copy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAO/C,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EACxB,OAAwB,EACxB,OAAuB,EACzB,EAAE;IACA,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IAEjE,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,wCAAwC,UAAU,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,8BAA8B;IAC9B,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAE7C,MAAM,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,IAAI,OAAO,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;IAC3D,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAC1C,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { TemplarContext } from '../../engine/context.js';
2
+ export interface FileCreateOptions {
3
+ file: string;
4
+ content: string;
5
+ }
6
+ export declare const execute: (options: FileCreateOptions, context: TemplarContext) => Promise<void>;
7
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/steps/file/create.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAG9D,MAAM,WAAW,iBAAiB;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,OAAO,GAChB,SAAS,iBAAiB,EAC1B,SAAS,cAAc,kBAQ1B,CAAC"}
@@ -0,0 +1,10 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+ import { logger } from '../../utils/logger.js';
4
+ export const execute = async (options, context) => {
5
+ const targetPath = path.resolve(context.projectPath, options.file);
6
+ await fs.ensureDir(path.dirname(targetPath));
7
+ logger.info(`Creating file ${options.file}...`);
8
+ await fs.writeFile(targetPath, options.content);
9
+ };
10
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/steps/file/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAO/C,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EACxB,OAA0B,EAC1B,OAAuB,EACzB,EAAE;IACA,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAE7C,MAAM,CAAC,IAAI,CAAC,iBAAiB,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC;IAChD,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;AACpD,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { TemplarContext } from '../../engine/context.js';
2
+ export interface FileDeleteOptions {
3
+ file: string;
4
+ }
5
+ export declare const execute: (options: FileDeleteOptions, context: TemplarContext) => Promise<void>;
6
+ //# sourceMappingURL=delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/steps/file/delete.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAG9D,MAAM,WAAW,iBAAiB;IAC9B,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,OAAO,GAChB,SAAS,iBAAiB,EAC1B,SAAS,cAAc,kBAU1B,CAAC"}
@@ -0,0 +1,14 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+ import { logger } from '../../utils/logger.js';
4
+ export const execute = async (options, context) => {
5
+ const targetPath = path.resolve(context.projectPath, options.file);
6
+ if (await fs.pathExists(targetPath)) {
7
+ logger.info(`Deleting ${options.file}...`);
8
+ await fs.remove(targetPath);
9
+ }
10
+ else {
11
+ logger.warn(`File to delete not found: ${options.file}`);
12
+ }
13
+ };
14
+ //# sourceMappingURL=delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../src/steps/file/delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAM/C,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EACxB,OAA0B,EAC1B,OAAuB,EACzB,EAAE;IACA,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnE,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC;QAC3C,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAChC,CAAC;SAAM,CAAC;QACJ,MAAM,CAAC,IAAI,CAAC,6BAA6B,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;AACL,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { TemplarContext } from '../../engine/context.js';
2
+ export interface FileMoveOptions {
3
+ from: string;
4
+ to: string;
5
+ }
6
+ export declare const execute: (options: FileMoveOptions, context: TemplarContext) => Promise<void>;
7
+ //# sourceMappingURL=move.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"move.d.ts","sourceRoot":"","sources":["../../../src/steps/file/move.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAG9D,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,OAAO,GAChB,SAAS,eAAe,EACxB,SAAS,cAAc,kBAa1B,CAAC"}
@@ -0,0 +1,14 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+ import { logger } from '../../utils/logger.js';
4
+ export const execute = async (options, context) => {
5
+ const sourcePath = path.resolve(context.projectPath, options.from);
6
+ const targetPath = path.resolve(context.projectPath, options.to);
7
+ if (!(await fs.pathExists(sourcePath))) {
8
+ throw new Error(`Source path for file:move not found: ${sourcePath}`);
9
+ }
10
+ await fs.ensureDir(path.dirname(targetPath));
11
+ logger.info(`Moving ${options.from} to ${options.to}...`);
12
+ await fs.move(sourcePath, targetPath);
13
+ };
14
+ //# sourceMappingURL=move.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"move.js","sourceRoot":"","sources":["../../../src/steps/file/move.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAO/C,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EACxB,OAAwB,EACxB,OAAuB,EACzB,EAAE;IACA,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IAEjE,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,wCAAwC,UAAU,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAE7C,MAAM,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,IAAI,OAAO,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;IAC1D,MAAM,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAC1C,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const execute: (options: import("./move.js").FileMoveOptions, context: import("../../engine/context.js").TemplarContext) => Promise<void>;
2
+ //# sourceMappingURL=rename.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rename.d.ts","sourceRoot":"","sources":["../../../src/steps/file/rename.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,OAAO,4HAAc,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { execute as moveExecute } from './move.js';
2
+ export const execute = moveExecute;
3
+ //# sourceMappingURL=rename.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rename.js","sourceRoot":"","sources":["../../../src/steps/file/rename.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,WAAW,CAAC;AACnD,MAAM,CAAC,MAAM,OAAO,GAAG,WAAW,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { TemplarContext } from '../../engine/context.js';
2
+ export interface PackageInstallOptions {
3
+ packages: Record<string, string>;
4
+ }
5
+ export declare const execute: (options: PackageInstallOptions, context: TemplarContext) => Promise<void>;
6
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/steps/package/install.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAI9D,MAAM,WAAW,qBAAqB;IAClC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC;AAED,eAAO,MAAM,OAAO,GAChB,SAAS,qBAAqB,EAC9B,SAAS,cAAc,kBAK1B,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { installPackages } from '../../utils/packageUtils.js';
2
+ import { logger } from '../../utils/logger.js';
3
+ export const execute = async (options, context) => {
4
+ logger.info(`Installing packages: ${Object.keys(options.packages).join(', ')}...`);
5
+ await installPackages(context.projectPath, options.packages, false);
6
+ };
7
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/steps/package/install.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAM/C,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EACxB,OAA8B,EAC9B,OAAuB,EACzB,EAAE;IACA,MAAM,CAAC,IAAI,CAAC,wBAAwB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEnF,MAAM,eAAe,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AACxE,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { TemplarContext } from '../../engine/context.js';
2
+ export interface PackageInstallOptions {
3
+ packages: Record<string, string>;
4
+ }
5
+ export declare const execute: (options: PackageInstallOptions, context: TemplarContext) => Promise<void>;
6
+ //# sourceMappingURL=installDev.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installDev.d.ts","sourceRoot":"","sources":["../../../src/steps/package/installDev.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAI9D,MAAM,WAAW,qBAAqB;IAClC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC;AAED,eAAO,MAAM,OAAO,GAChB,SAAS,qBAAqB,EAC9B,SAAS,cAAc,kBAK1B,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { installPackages } from '../../utils/packageUtils.js';
2
+ import { logger } from '../../utils/logger.js';
3
+ export const execute = async (options, context) => {
4
+ logger.info(`Installing dev packages: ${Object.keys(options.packages).join(', ')}...`);
5
+ await installPackages(context.projectPath, options.packages, true);
6
+ };
7
+ //# sourceMappingURL=installDev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installDev.js","sourceRoot":"","sources":["../../../src/steps/package/installDev.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAM/C,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EACxB,OAA8B,EAC9B,OAAuB,EACzB,EAAE;IACA,MAAM,CAAC,IAAI,CAAC,4BAA4B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEvF,MAAM,eAAe,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACvE,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { TemplarContext } from '../../engine/context.js';
2
+ export interface PackageRemoveOptions {
3
+ packages: string[];
4
+ }
5
+ export declare const execute: (options: PackageRemoveOptions, context: TemplarContext) => Promise<void>;
6
+ //# sourceMappingURL=remove.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.d.ts","sourceRoot":"","sources":["../../../src/steps/package/remove.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAG9D,MAAM,WAAW,oBAAoB;IACjC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,eAAO,MAAM,OAAO,GAChB,SAAS,oBAAoB,EAC7B,SAAS,cAAc,kBAQ1B,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { execa } from 'execa';
2
+ import { logger } from '../../utils/logger.js';
3
+ export const execute = async (options, context) => {
4
+ logger.info(`Removing packages: ${options.packages.join(', ')}...`);
5
+ await execa('pnpm', ['remove', ...options.packages], {
6
+ cwd: context.projectPath,
7
+ stdio: 'inherit',
8
+ });
9
+ };
10
+ //# sourceMappingURL=remove.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.js","sourceRoot":"","sources":["../../../src/steps/package/remove.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAE9B,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAM/C,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EACxB,OAA6B,EAC7B,OAAuB,EACzB,EAAE;IACA,MAAM,CAAC,IAAI,CAAC,sBAAsB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEpE,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,EAAE;QACjD,GAAG,EAAE,OAAO,CAAC,WAAW;QACxB,KAAK,EAAE,SAAS;KACnB,CAAC,CAAC;AACP,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { TemplarContext } from '../../engine/context.js';
2
+ export interface PluginOptions {
3
+ script: string;
4
+ options?: any;
5
+ }
6
+ export declare const execute: (options: PluginOptions, context: TemplarContext) => Promise<void>;
7
+ //# sourceMappingURL=execute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../../src/steps/plugin/execute.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAG9D,MAAM,WAAW,aAAa;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,GAAG,CAAC;CACjB;AAED,eAAO,MAAM,OAAO,GAChB,SAAS,aAAa,EACtB,SAAS,cAAc,kBA0B1B,CAAC"}
@@ -0,0 +1,28 @@
1
+ import path from 'path';
2
+ import { pathToFileURL } from 'url';
3
+ import { logger } from '../../utils/logger.js';
4
+ export const execute = async (options, context) => {
5
+ const pluginPath = path.resolve(context.templatePath, 'plugins', `${options.script}.ts`);
6
+ logger.info(`Executing plugin: ${options.script}...`);
7
+ try {
8
+ const pluginModule = await import(pathToFileURL(pluginPath).href);
9
+ const plugin = pluginModule.default || pluginModule;
10
+ if (typeof plugin.execute !== 'function') {
11
+ throw new Error(`Plugin ${options.script} does not implement execute(context)`);
12
+ }
13
+ await plugin.execute(context, options.options);
14
+ }
15
+ catch (err) {
16
+ if (err.code === 'ERR_MODULE_NOT_FOUND') {
17
+ // Try .js if .ts not found (for production etc)
18
+ const jsPluginPath = path.resolve(context.templatePath, 'plugins', `${options.script}.js`);
19
+ const pluginModule = await import(pathToFileURL(jsPluginPath).href);
20
+ const plugin = pluginModule.default || pluginModule;
21
+ await plugin.execute(context, options.options);
22
+ }
23
+ else {
24
+ throw err;
25
+ }
26
+ }
27
+ };
28
+ //# sourceMappingURL=execute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute.js","sourceRoot":"","sources":["../../../src/steps/plugin/execute.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAO/C,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EACxB,OAAsB,EACtB,OAAuB,EACzB,EAAE;IACA,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC;IAEzF,MAAM,CAAC,IAAI,CAAC,qBAAqB,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC;IAEtD,IAAI,CAAC;QACD,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC;QAClE,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,IAAI,YAAY,CAAC;QAEpD,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,UAAU,OAAO,CAAC,MAAM,sCAAsC,CAAC,CAAC;QACpF,CAAC;QAED,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAChB,IAAI,GAAG,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;YACtC,gDAAgD;YAChD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC;YAC3F,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC;YACpE,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,IAAI,YAAY,CAAC;YACpD,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACJ,MAAM,GAAG,CAAC;QACd,CAAC;IACL,CAAC;AACL,CAAC,CAAC"}
@@ -0,0 +1,37 @@
1
+ export type StepType = 'file' | 'edit' | 'package' | 'command' | 'plugin';
2
+ export interface StepOptions {
3
+ [key: string]: any;
4
+ }
5
+ export interface FileStepOptions extends StepOptions {
6
+ from?: string;
7
+ to?: string;
8
+ file?: string;
9
+ newName?: string;
10
+ }
11
+ export interface EditStepOptions extends StepOptions {
12
+ file: string;
13
+ content?: string;
14
+ match?: string;
15
+ data?: any;
16
+ }
17
+ export interface PackageStepOptions extends StepOptions {
18
+ packages?: Record<string, string>;
19
+ isDev?: boolean;
20
+ }
21
+ export interface CommandStepOptions extends StepOptions {
22
+ command: string;
23
+ args?: string[];
24
+ cwd?: string;
25
+ }
26
+ export interface PluginStepOptions extends StepOptions {
27
+ script: string;
28
+ }
29
+ export interface Step {
30
+ type: StepType;
31
+ action: string;
32
+ options: StepOptions;
33
+ }
34
+ export interface StepsJSON {
35
+ steps: Step[];
36
+ }
37
+ //# sourceMappingURL=step.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step.d.ts","sourceRoot":"","sources":["../../src/types/step.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE1E,MAAM,WAAW,WAAW;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AAED,MAAM,WAAW,eAAgB,SAAQ,WAAW;IAChD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAgB,SAAQ,WAAW;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,GAAG,CAAC;CACd;AAED,MAAM,WAAW,kBAAmB,SAAQ,WAAW;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,kBAAmB,SAAQ,WAAW;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAkB,SAAQ,WAAW;IAClD,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,IAAI;IACjB,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,WAAW,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACtB,KAAK,EAAE,IAAI,EAAE,CAAC;CACjB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=step.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step.js","sourceRoot":"","sources":["../../src/types/step.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ export declare const readFile: (filePath: string) => Promise<string>;
2
+ export declare const writeFile: (filePath: string, content: string) => Promise<void>;
3
+ export declare const appendToFile: (original: string, content: string) => string;
4
+ export declare const prependToFile: (original: string, content: string) => string;
5
+ export declare const insertAfter: (original: string, match: string, content: string) => string;
6
+ export declare const insertBefore: (original: string, match: string, content: string) => string;
7
+ export declare const replaceInFile: (original: string, match: string, content: string) => string;
8
+ export declare const mergeJson: (original: any, merge: any) => any;
9
+ //# sourceMappingURL=fileUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileUtils.d.ts","sourceRoot":"","sources":["../../src/utils/fileUtils.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,QAAQ,GAAU,UAAU,MAAM,oBAE9C,CAAC;AAEF,eAAO,MAAM,SAAS,GAAU,UAAU,MAAM,EAAE,SAAS,MAAM,kBAGhE,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,UAAU,MAAM,EAAE,SAAS,MAAM,WAE7D,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,UAAU,MAAM,EAAE,SAAS,MAAM,WAE9D,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,UAAU,MAAM,EAAE,OAAO,MAAM,EAAE,SAAS,MAAM,WAI3E,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,UAAU,MAAM,EAAE,OAAO,MAAM,EAAE,SAAS,MAAM,WAI5E,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,UAAU,MAAM,EAAE,OAAO,MAAM,EAAE,SAAS,MAAM,WAE7E,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,UAAU,GAAG,EAAE,OAAO,GAAG,QAWlD,CAAC"}
@@ -0,0 +1,44 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+ export const readFile = async (filePath) => {
4
+ return fs.readFile(filePath, 'utf-8');
5
+ };
6
+ export const writeFile = async (filePath, content) => {
7
+ await fs.ensureDir(path.dirname(filePath));
8
+ await fs.writeFile(filePath, content, 'utf-8');
9
+ };
10
+ export const appendToFile = (original, content) => {
11
+ return original + '\n' + content;
12
+ };
13
+ export const prependToFile = (original, content) => {
14
+ return content + '\n' + original;
15
+ };
16
+ export const insertAfter = (original, match, content) => {
17
+ const index = original.indexOf(match);
18
+ if (index === -1)
19
+ return original;
20
+ return original.slice(0, index + match.length) + '\n' + content + original.slice(index + match.length);
21
+ };
22
+ export const insertBefore = (original, match, content) => {
23
+ const index = original.indexOf(match);
24
+ if (index === -1)
25
+ return original;
26
+ return original.slice(0, index) + content + '\n' + original.slice(index);
27
+ };
28
+ export const replaceInFile = (original, match, content) => {
29
+ return original.split(match).join(content);
30
+ };
31
+ export const mergeJson = (original, merge) => {
32
+ // Simple recursive merge
33
+ const result = { ...original };
34
+ for (const key in merge) {
35
+ if (merge[key] && typeof merge[key] === 'object' && !Array.isArray(merge[key])) {
36
+ result[key] = mergeJson(result[key] || {}, merge[key]);
37
+ }
38
+ else {
39
+ result[key] = merge[key];
40
+ }
41
+ }
42
+ return result;
43
+ };
44
+ //# sourceMappingURL=fileUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileUtils.js","sourceRoot":"","sources":["../../src/utils/fileUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAAE,QAAgB,EAAE,EAAE;IAC/C,OAAO,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC1C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAAE,QAAgB,EAAE,OAAe,EAAE,EAAE;IACjE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3C,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACnD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,QAAgB,EAAE,OAAe,EAAE,EAAE;IAC9D,OAAO,QAAQ,GAAG,IAAI,GAAG,OAAO,CAAC;AACrC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAAgB,EAAE,OAAe,EAAE,EAAE;IAC/D,OAAO,OAAO,GAAG,IAAI,GAAG,QAAQ,CAAC;AACrC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,QAAgB,EAAE,KAAa,EAAE,OAAe,EAAE,EAAE;IAC5E,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,QAAQ,CAAC;IAClC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;AAC3G,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,QAAgB,EAAE,KAAa,EAAE,OAAe,EAAE,EAAE;IAC7E,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,QAAQ,CAAC;IAClC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,OAAO,GAAG,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAAgB,EAAE,KAAa,EAAE,OAAe,EAAE,EAAE;IAC9E,OAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC/C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,QAAa,EAAE,KAAU,EAAE,EAAE;IACnD,yBAAyB;IACzB,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC7E,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3D,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare const logger: {
2
+ info: (msg: string) => void;
3
+ success: (msg: string) => void;
4
+ warn: (msg: string) => void;
5
+ error: (msg: string) => void;
6
+ };
7
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM;gBACH,MAAM;mBACH,MAAM;gBACT,MAAM;iBACL,MAAM;CACtB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import chalk from 'chalk';
2
+ export const logger = {
3
+ info: (msg) => console.log(chalk.blue('ℹ'), msg),
4
+ success: (msg) => console.log(chalk.green('✔'), msg),
5
+ warn: (msg) => console.log(chalk.yellow('⚠'), msg),
6
+ error: (msg) => console.log(chalk.red('✖'), msg),
7
+ };
8
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG;IAClB,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;IACxD,OAAO,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;IAC5D,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;IAC1D,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;CAC3D,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const installPackages: (projectPath: string, packages: Record<string, string>, isDev?: boolean) => Promise<void>;
2
+ //# sourceMappingURL=packageUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packageUtils.d.ts","sourceRoot":"","sources":["../../src/utils/packageUtils.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,eAAe,GACxB,aAAa,MAAM,EACnB,UAAU,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAChC,QAAO,OAAe,kBAczB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { execa } from 'execa';
2
+ export const installPackages = async (projectPath, packages, isDev = false) => {
3
+ const pkgList = Object.entries(packages).map(([name, version]) => version === 'latest' ? name : `${name}@${version}`);
4
+ const command = 'pnpm';
5
+ const args = ['add', ...pkgList];
6
+ if (isDev)
7
+ args.push('-D');
8
+ await execa(command, args, {
9
+ cwd: projectPath,
10
+ stdio: 'inherit',
11
+ });
12
+ };
13
+ //# sourceMappingURL=packageUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packageUtils.js","sourceRoot":"","sources":["../../src/utils/packageUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAE9B,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAChC,WAAmB,EACnB,QAAgC,EAChC,QAAiB,KAAK,EACxB,EAAE;IACA,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,CAC7D,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,OAAO,EAAE,CACrD,CAAC;IAEF,MAAM,OAAO,GAAG,MAAM,CAAC;IACvB,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,GAAG,OAAO,CAAC,CAAC;IACjC,IAAI,KAAK;QAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE3B,MAAM,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;QACvB,GAAG,EAAE,WAAW;QAChB,KAAK,EAAE,SAAS;KACnB,CAAC,CAAC;AACP,CAAC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@allenhack638/templar",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "description": "A step-driven project scaffolding CLI",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "templar": "./dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "keywords": [
14
+ "cli",
15
+ "scaffolding",
16
+ "templates"
17
+ ],
18
+ "author": "allenhack638",
19
+ "license": "ISC",
20
+ "devDependencies": {
21
+ "@types/fs-extra": "^11.0.4",
22
+ "@types/inquirer": "^9.0.9",
23
+ "@types/node": "^25.3.5",
24
+ "tsx": "^4.21.0",
25
+ "typescript": "^5.9.3"
26
+ },
27
+ "dependencies": {
28
+ "chalk": "4.1.2",
29
+ "commander": "^14.0.3",
30
+ "execa": "^9.6.1",
31
+ "fs-extra": "^11.3.4",
32
+ "inquirer": "^13.3.0"
33
+ },
34
+ "scripts": {
35
+ "build": "tsc",
36
+ "dev": "tsx watch src/index.ts"
37
+ }
38
+ }