@tachui/cli 0.8.1-alpha → 0.8.8

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 (75) hide show
  1. package/README.md +37 -412
  2. package/bin/tacho.js +59 -7
  3. package/dist/commands/analyze-imports.d.ts +18 -0
  4. package/dist/commands/analyze-imports.d.ts.map +1 -0
  5. package/dist/commands/analyze-imports.js +152 -0
  6. package/dist/commands/analyze-imports.js.map +1 -0
  7. package/dist/commands/analyze.js +1 -1
  8. package/dist/commands/analyze.js.map +1 -1
  9. package/dist/commands/dev.js +3 -3
  10. package/dist/commands/dev.js.map +1 -1
  11. package/dist/commands/generate.d.ts +1 -1
  12. package/dist/commands/generate.d.ts.map +1 -1
  13. package/dist/commands/generate.js +1 -22
  14. package/dist/commands/generate.js.map +1 -1
  15. package/dist/commands/init.d.ts +10 -1
  16. package/dist/commands/init.d.ts.map +1 -1
  17. package/dist/commands/init.js +170 -680
  18. package/dist/commands/init.js.map +1 -1
  19. package/dist/commands/migrate/remove-modifier-trigger.d.ts +3 -0
  20. package/dist/commands/migrate/remove-modifier-trigger.d.ts.map +1 -0
  21. package/dist/commands/migrate/remove-modifier-trigger.js +103 -0
  22. package/dist/commands/migrate/remove-modifier-trigger.js.map +1 -0
  23. package/dist/commands/migrate.d.ts.map +1 -1
  24. package/dist/commands/migrate.js +8 -6
  25. package/dist/commands/migrate.js.map +1 -1
  26. package/dist/commands/modifier-docs.d.ts +24 -0
  27. package/dist/commands/modifier-docs.d.ts.map +1 -0
  28. package/dist/commands/modifier-docs.js +375 -0
  29. package/dist/commands/modifier-docs.js.map +1 -0
  30. package/dist/import-optimizer.d.ts +50 -0
  31. package/dist/import-optimizer.d.ts.map +1 -0
  32. package/dist/import-optimizer.js +227 -0
  33. package/dist/import-optimizer.js.map +1 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +14 -3
  36. package/dist/index.js.map +1 -1
  37. package/dist/migrations/remove-modifier-trigger.d.ts +7 -0
  38. package/dist/migrations/remove-modifier-trigger.d.ts.map +1 -0
  39. package/dist/migrations/remove-modifier-trigger.js +99 -0
  40. package/dist/migrations/remove-modifier-trigger.js.map +1 -0
  41. package/dist/scaffold/core-version-map.d.ts +2 -0
  42. package/dist/scaffold/core-version-map.d.ts.map +1 -0
  43. package/dist/scaffold/core-version-map.js +130 -0
  44. package/dist/scaffold/core-version-map.js.map +1 -0
  45. package/dist/scaffold/create-project.d.ts +15 -0
  46. package/dist/scaffold/create-project.d.ts.map +1 -0
  47. package/dist/scaffold/create-project.js +84 -0
  48. package/dist/scaffold/create-project.js.map +1 -0
  49. package/dist/scaffold/package-root.d.ts +2 -0
  50. package/dist/scaffold/package-root.d.ts.map +1 -0
  51. package/dist/scaffold/package-root.js +34 -0
  52. package/dist/scaffold/package-root.js.map +1 -0
  53. package/dist/scaffold/templates.d.ts +11 -0
  54. package/dist/scaffold/templates.d.ts.map +1 -0
  55. package/dist/scaffold/templates.js +26 -0
  56. package/dist/scaffold/templates.js.map +1 -0
  57. package/dist/scaffold/validators.d.ts +2 -0
  58. package/dist/scaffold/validators.d.ts.map +1 -0
  59. package/dist/scaffold/validators.js +32 -0
  60. package/dist/scaffold/validators.js.map +1 -0
  61. package/package.json +7 -3
  62. package/templates/advanced/README.md.template +23 -0
  63. package/templates/advanced/index.html.template +23 -0
  64. package/templates/advanced/package.json.template +20 -0
  65. package/templates/advanced/src/App.ts.template +54 -0
  66. package/templates/advanced/src/main.ts.template +4 -0
  67. package/templates/advanced/tsconfig.json.template +14 -0
  68. package/templates/advanced/vite.config.ts.template +11 -0
  69. package/templates/basic/README.md.template +17 -0
  70. package/templates/basic/index.html.template +22 -0
  71. package/templates/basic/package.json.template +20 -0
  72. package/templates/basic/src/App.ts.template +35 -0
  73. package/templates/basic/src/main.ts.template +4 -0
  74. package/templates/basic/tsconfig.json.template +14 -0
  75. package/templates/basic/vite.config.ts.template +11 -0
@@ -0,0 +1,227 @@
1
+ /**
2
+ * Auto-sensing Build-Time Import Optimizer
3
+ *
4
+ * Analyzes usage patterns and suggests optimal import paths for bundle size
5
+ */
6
+ import * as ts from 'typescript';
7
+ import { readFileSync, writeFileSync } from 'fs';
8
+ import { glob } from 'glob';
9
+ export class ImportOptimizer {
10
+ packageMap = new Map();
11
+ constructor() {
12
+ this.buildPackageMap();
13
+ }
14
+ buildPackageMap() {
15
+ // Map tachUI packages and their optimal import paths
16
+ this.packageMap.set('@tachui/core', {
17
+ path: '@tachui/core',
18
+ exports: ['createSignal', 'createEffect', 'createComputed'],
19
+ bundleSize: 45, // KB
20
+ });
21
+ this.packageMap.set('@tachui/core/reactive', {
22
+ path: '@tachui/core/reactive',
23
+ exports: ['createSignal', 'createEffect', 'createComputed', 'onCleanup'],
24
+ bundleSize: 12, // KB
25
+ });
26
+ this.packageMap.set('@tachui/primitives', {
27
+ path: '@tachui/primitives',
28
+ exports: ['VStack', 'HStack', 'Text', 'Button'],
29
+ bundleSize: 35, // KB
30
+ });
31
+ this.packageMap.set('@tachui/primitives/layout', {
32
+ path: '@tachui/primitives/layout',
33
+ exports: ['VStack', 'HStack', 'Spacer'],
34
+ bundleSize: 8, // KB
35
+ });
36
+ this.packageMap.set('@tachui/primitives/display', {
37
+ path: '@tachui/primitives/display',
38
+ exports: ['Text', 'Image', 'ScrollView'],
39
+ bundleSize: 12, // KB
40
+ });
41
+ this.packageMap.set('@tachui/primitives/controls', {
42
+ path: '@tachui/primitives/controls',
43
+ exports: ['Button', 'TextField', 'Toggle'],
44
+ bundleSize: 15, // KB
45
+ });
46
+ }
47
+ /**
48
+ * Analyze imports in a TypeScript/JavaScript file
49
+ */
50
+ analyzeFile(filePath) {
51
+ const sourceCode = readFileSync(filePath, 'utf-8');
52
+ const sourceFile = ts.createSourceFile(filePath, sourceCode, ts.ScriptTarget.Latest, true);
53
+ const imports = [];
54
+ const visit = (node) => {
55
+ if (ts.isImportDeclaration(node) &&
56
+ ts.isStringLiteral(node.moduleSpecifier)) {
57
+ const source = node.moduleSpecifier.text;
58
+ if (source.startsWith('@tachui/')) {
59
+ const namedImports = this.extractNamedImports(node);
60
+ const optimization = this.findOptimalImport(source, namedImports);
61
+ imports.push({
62
+ specifier: namedImports.join(', '),
63
+ source,
64
+ suggestedSource: optimization.to,
65
+ bundleImpact: this.calculateBundleImpact(source, optimization.to),
66
+ reasoning: optimization.reasoning,
67
+ });
68
+ }
69
+ }
70
+ ts.forEachChild(node, visit);
71
+ };
72
+ visit(sourceFile);
73
+ return { file: filePath, imports };
74
+ }
75
+ /**
76
+ * Analyze entire project and suggest optimizations
77
+ */
78
+ async analyzeProject(projectRoot) {
79
+ const files = await glob('**/*.{ts,tsx,js,jsx}', {
80
+ cwd: projectRoot,
81
+ ignore: ['node_modules/**', 'dist/**', '**/*.d.ts'],
82
+ });
83
+ const optimizations = [];
84
+ for (const file of files) {
85
+ const analysis = this.analyzeFile(`${projectRoot}/${file}`);
86
+ for (const imp of analysis.imports) {
87
+ if (imp.suggestedSource && imp.suggestedSource !== imp.source) {
88
+ optimizations.push({
89
+ from: imp.source,
90
+ to: imp.suggestedSource,
91
+ savings: this.calculateSavings(imp.source, imp.suggestedSource),
92
+ risk: this.assessRisk(imp.source, imp.suggestedSource),
93
+ });
94
+ }
95
+ }
96
+ }
97
+ return this.dedupeOptimizations(optimizations);
98
+ }
99
+ extractNamedImports(node) {
100
+ const imports = [];
101
+ if (node.importClause?.namedBindings) {
102
+ if (ts.isNamedImports(node.importClause.namedBindings)) {
103
+ for (const element of node.importClause.namedBindings.elements) {
104
+ imports.push(element.name.text);
105
+ }
106
+ }
107
+ }
108
+ return imports;
109
+ }
110
+ findOptimalImport(source, namedImports) {
111
+ // Check if imports can be optimized to more specific packages
112
+ const layoutImports = ['VStack', 'HStack', 'Spacer'];
113
+ const displayImports = ['Text', 'Image', 'ScrollView'];
114
+ const controlImports = ['Button', 'TextField', 'Toggle'];
115
+ const reactiveImports = [
116
+ 'createSignal',
117
+ 'createEffect',
118
+ 'createComputed',
119
+ 'onCleanup',
120
+ ];
121
+ if (source === '@tachui/core') {
122
+ if (namedImports.every(imp => reactiveImports.includes(imp))) {
123
+ return {
124
+ to: '@tachui/core/reactive',
125
+ reasoning: `Only reactive imports detected, can reduce bundle by ~33KB`,
126
+ };
127
+ }
128
+ }
129
+ if (source === '@tachui/primitives') {
130
+ if (namedImports.every(imp => layoutImports.includes(imp))) {
131
+ return {
132
+ to: '@tachui/primitives/layout',
133
+ reasoning: `Only layout components used, saves ~27KB by avoiding display/controls`,
134
+ };
135
+ }
136
+ if (namedImports.every(imp => displayImports.includes(imp))) {
137
+ return {
138
+ to: '@tachui/primitives/display',
139
+ reasoning: `Only display components used, saves ~23KB by avoiding layout/controls`,
140
+ };
141
+ }
142
+ if (namedImports.every(imp => controlImports.includes(imp))) {
143
+ return {
144
+ to: '@tachui/primitives/controls',
145
+ reasoning: `Only control components used, saves ~20KB by avoiding layout/display`,
146
+ };
147
+ }
148
+ }
149
+ return { to: source, reasoning: 'Already optimal' };
150
+ }
151
+ calculateBundleImpact(current, suggested) {
152
+ const currentSize = this.packageMap.get(current)?.bundleSize || 0;
153
+ const suggestedSize = this.packageMap.get(suggested)?.bundleSize || 0;
154
+ const savings = currentSize - suggestedSize;
155
+ if (savings > 20)
156
+ return 'significant';
157
+ if (savings > 10)
158
+ return 'moderate';
159
+ return 'minimal';
160
+ }
161
+ calculateSavings(from, to) {
162
+ const fromSize = this.packageMap.get(from)?.bundleSize || 0;
163
+ const toSize = this.packageMap.get(to)?.bundleSize || 0;
164
+ return `~${fromSize - toSize}KB`;
165
+ }
166
+ assessRisk(from, to) {
167
+ // Risk assessment based on import specificity
168
+ if (from.includes('/') && !to.includes('/'))
169
+ return 'high';
170
+ if (!from.includes('/') && to.includes('/'))
171
+ return 'low';
172
+ return 'medium';
173
+ }
174
+ dedupeOptimizations(optimizations) {
175
+ const seen = new Set();
176
+ return optimizations.filter(opt => {
177
+ const key = `${opt.from}->${opt.to}`;
178
+ if (seen.has(key))
179
+ return false;
180
+ seen.add(key);
181
+ return true;
182
+ });
183
+ }
184
+ /**
185
+ * Generate import optimization report
186
+ */
187
+ generateReport(optimizations) {
188
+ let report = `# TachUI Import Optimization Report\n\n`;
189
+ const significantSavings = optimizations.filter(opt => parseInt(opt.savings.replace(/[^\d]/g, '')) > 20);
190
+ const moderateSavings = optimizations.filter(opt => parseInt(opt.savings.replace(/[^\d]/g, '')) > 10 &&
191
+ parseInt(opt.savings.replace(/[^\d]/g, '')) <= 20);
192
+ if (significantSavings.length > 0) {
193
+ report += `## 🚀 High Impact Optimizations (${significantSavings.length})\n\n`;
194
+ for (const opt of significantSavings) {
195
+ report += `- \`${opt.from}\` → \`${opt.to}\` (saves ${opt.savings})\n`;
196
+ }
197
+ report += `\n`;
198
+ }
199
+ if (moderateSavings.length > 0) {
200
+ report += `## 📈 Moderate Impact Optimizations (${moderateSavings.length})\n\n`;
201
+ for (const opt of moderateSavings) {
202
+ report += `- \`${opt.from}\` → \`${opt.to}\` (saves ${opt.savings})\n`;
203
+ }
204
+ report += `\n`;
205
+ }
206
+ const totalSavings = optimizations.reduce((sum, opt) => sum + parseInt(opt.savings.replace(/[^\d]/g, '')), 0);
207
+ report += `## 📊 Summary\n\n`;
208
+ report += `- **Total Potential Savings**: ~${totalSavings}KB\n`;
209
+ report += `- **Optimizations Found**: ${optimizations.length}\n`;
210
+ report += `- **Low Risk Changes**: ${optimizations.filter(o => o.risk === 'low').length}\n`;
211
+ return report;
212
+ }
213
+ }
214
+ /**
215
+ * CLI command for running import optimization
216
+ */
217
+ export async function runImportOptimizer(projectRoot = process.cwd()) {
218
+ const optimizer = new ImportOptimizer();
219
+ console.log('🔍 Analyzing TachUI imports...');
220
+ const optimizations = await optimizer.analyzeProject(projectRoot);
221
+ const report = optimizer.generateReport(optimizations);
222
+ console.log(report);
223
+ // Save report to file
224
+ writeFileSync(`${projectRoot}/tachui-import-report.md`, report);
225
+ console.log(`\n📄 Report saved to: tachui-import-report.md`);
226
+ }
227
+ //# sourceMappingURL=import-optimizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-optimizer.js","sourceRoot":"","sources":["../src/import-optimizer.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAsBH,wBAAsB,IAAI,kBAmCzB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAmCH,wBAAsB,IAAI,kBAmCzB"}
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Tacho CLI - Comprehensive developer tooling for TachUI
3
3
  */
4
- import { readFileSync } from 'node:fs';
4
+ import { readFileSync, existsSync } from 'node:fs';
5
5
  import { dirname, join } from 'node:path';
6
6
  import { fileURLToPath } from 'node:url';
7
7
  import chalk from 'chalk';
@@ -16,8 +16,19 @@ import { optimizeCommand } from './commands/optimize.js';
16
16
  const __filename = fileURLToPath(import.meta.url);
17
17
  const __dirname = dirname(__filename);
18
18
  // Get package version
19
- const packagePath = join(__dirname, '../package.json');
20
- const packageJson = JSON.parse(readFileSync(packagePath, 'utf-8'));
19
+ const packageJson = (() => {
20
+ const candidates = [
21
+ join(__dirname, '../package.json'),
22
+ join(__dirname, '../../package.json'),
23
+ join(__dirname, '../../../package.json'),
24
+ ];
25
+ for (const candidate of candidates) {
26
+ if (existsSync(candidate)) {
27
+ return JSON.parse(readFileSync(candidate, 'utf-8'));
28
+ }
29
+ }
30
+ return { version: '0.0.0' };
31
+ })();
21
32
  export async function main() {
22
33
  const program = new Command();
23
34
  program
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,kBAAkB;AAClB,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAExD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACjD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;AAErC,sBAAsB;AACtB,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAA;AACtD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAA;AAElE,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;IAE7B,OAAO;SACJ,IAAI,CAAC,OAAO,CAAC;SACb,WAAW,CAAC,4CAA4C,CAAC;SACzD,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;IAE/B,kBAAkB;IAClB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC;;mBAEI,WAAW,CAAC,OAAO;;;CAGrC,CAAC,CACC,CAAA;IAED,oBAAoB;IACpB,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAA;IAC/B,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAA;IAC9B,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAA;IACnC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;IAClC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;IAClC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAA;IAEnC,wBAAwB;IACxB,OAAO,CAAC,YAAY,EAAE,CAAA;IAEtB,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,UAAU,EAAE,CAAA;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAG,KAAe,CAAC,OAAO,CAAC,CAAA;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,kBAAkB;AAClB,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAExD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACjD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;AAErC,sBAAsB;AACtB,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE;IACxB,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC;QAClC,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC;QACrC,IAAI,CAAC,SAAS,EAAE,uBAAuB,CAAC;KACzC,CAAA;IAED,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAA;QACrD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAA;AAC7B,CAAC,CAAC,EAAE,CAAA;AAEJ,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;IAE7B,OAAO;SACJ,IAAI,CAAC,OAAO,CAAC;SACb,WAAW,CAAC,4CAA4C,CAAC;SACzD,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;IAE/B,kBAAkB;IAClB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC;;mBAEI,WAAW,CAAC,OAAO;;;CAGrC,CAAC,CACC,CAAA;IAED,oBAAoB;IACpB,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAA;IAC/B,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAA;IAC9B,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAA;IACnC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;IAClC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;IAClC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAA;IAEnC,wBAAwB;IACxB,OAAO,CAAC,YAAY,EAAE,CAAA;IAEtB,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,UAAU,EAAE,CAAA;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAG,KAAe,CAAC,OAAO,CAAC,CAAA;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface ModifierRemovalResult {
2
+ code: string;
3
+ modified: boolean;
4
+ occurrences: number;
5
+ }
6
+ export declare function transformRemoveModifierTrigger(sourceText: string, filePath: string): ModifierRemovalResult;
7
+ //# sourceMappingURL=remove-modifier-trigger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove-modifier-trigger.d.ts","sourceRoot":"","sources":["../../src/migrations/remove-modifier-trigger.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,OAAO,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;CACpB;AA0DD,wBAAgB,8BAA8B,CAC5C,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,qBAAqB,CA+EvB"}
@@ -0,0 +1,99 @@
1
+ import path from 'node:path';
2
+ import ts from 'typescript';
3
+ function getScriptKind(filePath) {
4
+ const ext = path.extname(filePath).toLowerCase();
5
+ switch (ext) {
6
+ case '.ts':
7
+ return ts.ScriptKind.TS;
8
+ case '.tsx':
9
+ return ts.ScriptKind.TSX;
10
+ case '.jsx':
11
+ return ts.ScriptKind.JSX;
12
+ case '.cjs':
13
+ return ts.ScriptKind.JS;
14
+ case '.mjs':
15
+ return ts.ScriptKind.JS;
16
+ case '.cts':
17
+ return ts.ScriptKind.TS;
18
+ case '.mts':
19
+ return ts.ScriptKind.TS;
20
+ default:
21
+ return ts.ScriptKind.JS;
22
+ }
23
+ }
24
+ function shouldStripModifier(node) {
25
+ if (!ts.isIdentifier(node.name) || node.name.text !== 'modifier') {
26
+ return false;
27
+ }
28
+ let parent = node.parent;
29
+ while (parent) {
30
+ if (ts.isNonNullExpression(parent) ||
31
+ ts.isParenthesizedExpression(parent) ||
32
+ ts.isTypeAssertionExpression(parent) ||
33
+ ts.isAsExpression(parent) ||
34
+ ts.isSatisfiesExpression?.(parent)) {
35
+ parent = parent.parent;
36
+ continue;
37
+ }
38
+ break;
39
+ }
40
+ if (!parent) {
41
+ return false;
42
+ }
43
+ if (ts.isPropertyAccessExpression(parent) || ts.isPropertyAccessChain(parent)) {
44
+ return parent.expression === node;
45
+ }
46
+ return false;
47
+ }
48
+ export function transformRemoveModifierTrigger(sourceText, filePath) {
49
+ const sourceFile = ts.createSourceFile(filePath, sourceText, ts.ScriptTarget.Latest, true, getScriptKind(filePath));
50
+ let changes = 0;
51
+ const transformer = (context) => {
52
+ const visit = (node) => {
53
+ if (ts.isPropertyAccessExpression(node)) {
54
+ const visitedExpression = ts.visitNode(node.expression, visit);
55
+ if (shouldStripModifier(node)) {
56
+ changes++;
57
+ return visitedExpression ?? node.expression;
58
+ }
59
+ if (visitedExpression !== node.expression) {
60
+ return context.factory.updatePropertyAccessExpression(node, visitedExpression, node.name);
61
+ }
62
+ return node;
63
+ }
64
+ if (ts.isPropertyAccessChain(node)) {
65
+ const visitedExpression = ts.visitNode(node.expression, visit);
66
+ if (shouldStripModifier(node)) {
67
+ changes++;
68
+ return visitedExpression ?? node.expression;
69
+ }
70
+ if (visitedExpression !== node.expression) {
71
+ return context.factory.updatePropertyAccessChain(node, visitedExpression, node.questionDotToken, node.name);
72
+ }
73
+ return node;
74
+ }
75
+ return ts.visitEachChild(node, visit, context);
76
+ };
77
+ return (node) => ts.visitNode(node, visit);
78
+ };
79
+ const result = ts.transform(sourceFile, [transformer]);
80
+ const transformed = result.transformed[0];
81
+ result.dispose();
82
+ if (changes === 0) {
83
+ return {
84
+ code: sourceText,
85
+ modified: false,
86
+ occurrences: 0,
87
+ };
88
+ }
89
+ const printer = ts.createPrinter({
90
+ newLine: ts.NewLineKind.LineFeed,
91
+ });
92
+ const code = printer.printFile(transformed);
93
+ return {
94
+ code,
95
+ modified: true,
96
+ occurrences: changes,
97
+ };
98
+ }
99
+ //# sourceMappingURL=remove-modifier-trigger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove-modifier-trigger.js","sourceRoot":"","sources":["../../src/migrations/remove-modifier-trigger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function resolveCoreVersionFromMap(cliVersion: string | null): string | null;
2
+ //# sourceMappingURL=core-version-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-version-map.d.ts","sourceRoot":"","sources":["../../src/scaffold/core-version-map.ts"],"names":[],"mappings":"AAyIA,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAclF"}
@@ -0,0 +1,130 @@
1
+ const CORE_VERSION_COMPATIBILITY = [
2
+ {
3
+ cliRange: '>=0.8.8-alpha <0.9.0',
4
+ coreVersion: '0.8.8-alpha',
5
+ },
6
+ {
7
+ cliRange: '>=0.8.6-alpha <0.8.8-alpha',
8
+ coreVersion: '0.8.6-alpha',
9
+ },
10
+ ];
11
+ function parseSemver(value) {
12
+ const match = value.trim().match(/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/);
13
+ if (!match) {
14
+ return null;
15
+ }
16
+ const major = Number(match[1]);
17
+ const minor = Number(match[2]);
18
+ const patch = Number(match[3]);
19
+ const preRelease = match[4] ?? null;
20
+ return { major, minor, patch, preRelease };
21
+ }
22
+ function comparePreReleaseIdentifier(left, right) {
23
+ const leftNumeric = /^\d+$/.test(left);
24
+ const rightNumeric = /^\d+$/.test(right);
25
+ if (leftNumeric && rightNumeric) {
26
+ return Number(left) - Number(right);
27
+ }
28
+ if (leftNumeric && !rightNumeric) {
29
+ return -1;
30
+ }
31
+ if (!leftNumeric && rightNumeric) {
32
+ return 1;
33
+ }
34
+ if (left < right)
35
+ return -1;
36
+ if (left > right)
37
+ return 1;
38
+ return 0;
39
+ }
40
+ function comparePreRelease(left, right) {
41
+ if (left === right)
42
+ return 0;
43
+ if (left === null)
44
+ return 1;
45
+ if (right === null)
46
+ return -1;
47
+ const leftIdentifiers = left.split('.');
48
+ const rightIdentifiers = right.split('.');
49
+ const maxLength = Math.max(leftIdentifiers.length, rightIdentifiers.length);
50
+ for (let index = 0; index < maxLength; index += 1) {
51
+ const leftPart = leftIdentifiers[index];
52
+ const rightPart = rightIdentifiers[index];
53
+ if (leftPart === undefined)
54
+ return -1;
55
+ if (rightPart === undefined)
56
+ return 1;
57
+ const comparison = comparePreReleaseIdentifier(leftPart, rightPart);
58
+ if (comparison !== 0) {
59
+ return comparison;
60
+ }
61
+ }
62
+ return 0;
63
+ }
64
+ function compareSemver(left, right) {
65
+ if (left.major !== right.major)
66
+ return left.major - right.major;
67
+ if (left.minor !== right.minor)
68
+ return left.minor - right.minor;
69
+ if (left.patch !== right.patch)
70
+ return left.patch - right.patch;
71
+ return comparePreRelease(left.preRelease, right.preRelease);
72
+ }
73
+ function matchesRange(version, range) {
74
+ const constraints = range.split(' ').filter(Boolean);
75
+ for (const constraint of constraints) {
76
+ let operator = '';
77
+ let rawVersion = '';
78
+ if (constraint.startsWith('>=')) {
79
+ operator = '>=';
80
+ rawVersion = constraint.slice(2);
81
+ }
82
+ else if (constraint.startsWith('>')) {
83
+ operator = '>';
84
+ rawVersion = constraint.slice(1);
85
+ }
86
+ else if (constraint.startsWith('<=')) {
87
+ operator = '<=';
88
+ rawVersion = constraint.slice(2);
89
+ }
90
+ else if (constraint.startsWith('<')) {
91
+ operator = '<';
92
+ rawVersion = constraint.slice(1);
93
+ }
94
+ else if (constraint.startsWith('=')) {
95
+ operator = '=';
96
+ rawVersion = constraint.slice(1);
97
+ }
98
+ else {
99
+ return false;
100
+ }
101
+ const constraintVersion = parseSemver(rawVersion);
102
+ if (!constraintVersion) {
103
+ return false;
104
+ }
105
+ const comparison = compareSemver(version, constraintVersion);
106
+ const passes = (operator === '>=' && comparison >= 0) ||
107
+ (operator === '>' && comparison > 0) ||
108
+ (operator === '<=' && comparison <= 0) ||
109
+ (operator === '<' && comparison < 0) ||
110
+ (operator === '=' && comparison === 0);
111
+ if (!passes) {
112
+ return false;
113
+ }
114
+ }
115
+ return true;
116
+ }
117
+ export function resolveCoreVersionFromMap(cliVersion) {
118
+ if (!cliVersion) {
119
+ return null;
120
+ }
121
+ const parsed = parseSemver(cliVersion);
122
+ if (!parsed || parsed.preRelease === null) {
123
+ // Compatibility map entries are explicitly maintained for prerelease CLI versions.
124
+ // Stable CLI builds should use registry resolution or an explicit --tachui-version.
125
+ return null;
126
+ }
127
+ const match = CORE_VERSION_COMPATIBILITY.find(entry => matchesRange(parsed, entry.cliRange));
128
+ return match?.coreVersion ?? null;
129
+ }
130
+ //# sourceMappingURL=core-version-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-version-map.js","sourceRoot":"","sources":["../../src/scaffold/core-version-map.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { TemplateDefinition } from './templates.js';
2
+ export interface CreateProjectOptions {
3
+ cwd: string;
4
+ target: string;
5
+ tachuiVersion: string;
6
+ template: TemplateDefinition;
7
+ templatesRoot: string;
8
+ }
9
+ export interface CreateProjectResult {
10
+ projectName: string;
11
+ projectPath: string;
12
+ createdFiles: number;
13
+ }
14
+ export declare function createProject(options: CreateProjectOptions): CreateProjectResult;
15
+ //# sourceMappingURL=create-project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-project.d.ts","sourceRoot":"","sources":["../../src/scaffold/create-project.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAKxD,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,aAAa,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;CACrB;AAwDD,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,mBAAmB,CA2ChF"}