@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.
- package/README.md +37 -412
- package/bin/tacho.js +59 -7
- package/dist/commands/analyze-imports.d.ts +18 -0
- package/dist/commands/analyze-imports.d.ts.map +1 -0
- package/dist/commands/analyze-imports.js +152 -0
- package/dist/commands/analyze-imports.js.map +1 -0
- package/dist/commands/analyze.js +1 -1
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/dev.js +3 -3
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/generate.d.ts +1 -1
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +1 -22
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/init.d.ts +10 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +170 -680
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/migrate/remove-modifier-trigger.d.ts +3 -0
- package/dist/commands/migrate/remove-modifier-trigger.d.ts.map +1 -0
- package/dist/commands/migrate/remove-modifier-trigger.js +103 -0
- package/dist/commands/migrate/remove-modifier-trigger.js.map +1 -0
- package/dist/commands/migrate.d.ts.map +1 -1
- package/dist/commands/migrate.js +8 -6
- package/dist/commands/migrate.js.map +1 -1
- package/dist/commands/modifier-docs.d.ts +24 -0
- package/dist/commands/modifier-docs.d.ts.map +1 -0
- package/dist/commands/modifier-docs.js +375 -0
- package/dist/commands/modifier-docs.js.map +1 -0
- package/dist/import-optimizer.d.ts +50 -0
- package/dist/import-optimizer.d.ts.map +1 -0
- package/dist/import-optimizer.js +227 -0
- package/dist/import-optimizer.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -3
- package/dist/index.js.map +1 -1
- package/dist/migrations/remove-modifier-trigger.d.ts +7 -0
- package/dist/migrations/remove-modifier-trigger.d.ts.map +1 -0
- package/dist/migrations/remove-modifier-trigger.js +99 -0
- package/dist/migrations/remove-modifier-trigger.js.map +1 -0
- package/dist/scaffold/core-version-map.d.ts +2 -0
- package/dist/scaffold/core-version-map.d.ts.map +1 -0
- package/dist/scaffold/core-version-map.js +130 -0
- package/dist/scaffold/core-version-map.js.map +1 -0
- package/dist/scaffold/create-project.d.ts +15 -0
- package/dist/scaffold/create-project.d.ts.map +1 -0
- package/dist/scaffold/create-project.js +84 -0
- package/dist/scaffold/create-project.js.map +1 -0
- package/dist/scaffold/package-root.d.ts +2 -0
- package/dist/scaffold/package-root.d.ts.map +1 -0
- package/dist/scaffold/package-root.js +34 -0
- package/dist/scaffold/package-root.js.map +1 -0
- package/dist/scaffold/templates.d.ts +11 -0
- package/dist/scaffold/templates.d.ts.map +1 -0
- package/dist/scaffold/templates.js +26 -0
- package/dist/scaffold/templates.js.map +1 -0
- package/dist/scaffold/validators.d.ts +2 -0
- package/dist/scaffold/validators.d.ts.map +1 -0
- package/dist/scaffold/validators.js +32 -0
- package/dist/scaffold/validators.js.map +1 -0
- package/package.json +7 -3
- package/templates/advanced/README.md.template +23 -0
- package/templates/advanced/index.html.template +23 -0
- package/templates/advanced/package.json.template +20 -0
- package/templates/advanced/src/App.ts.template +54 -0
- package/templates/advanced/src/main.ts.template +4 -0
- package/templates/advanced/tsconfig.json.template +14 -0
- package/templates/advanced/vite.config.ts.template +11 -0
- package/templates/basic/README.md.template +17 -0
- package/templates/basic/index.html.template +22 -0
- package/templates/basic/package.json.template +20 -0
- package/templates/basic/src/App.ts.template +35 -0
- package/templates/basic/src/main.ts.template +4 -0
- package/templates/basic/tsconfig.json.template +14 -0
- package/templates/basic/vite.config.ts.template +11 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { readdirSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { basename, dirname, join, resolve } from 'node:path';
|
|
3
|
+
import { validateProjectName } from './validators.js';
|
|
4
|
+
const TEMPLATE_EXT = '.template';
|
|
5
|
+
function collectTemplateFiles(root) {
|
|
6
|
+
const output = [];
|
|
7
|
+
const entries = readdirSync(root, { withFileTypes: true });
|
|
8
|
+
for (const entry of entries) {
|
|
9
|
+
const entryPath = join(root, entry.name);
|
|
10
|
+
if (entry.isDirectory()) {
|
|
11
|
+
output.push(...collectTemplateFiles(entryPath));
|
|
12
|
+
continue;
|
|
13
|
+
}
|
|
14
|
+
if (entry.isFile()) {
|
|
15
|
+
output.push(entryPath);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return output;
|
|
19
|
+
}
|
|
20
|
+
function toOutputPath(absoluteTemplatePath, templateRoot) {
|
|
21
|
+
const relativePath = absoluteTemplatePath.slice(templateRoot.length + 1);
|
|
22
|
+
if (relativePath.endsWith(TEMPLATE_EXT)) {
|
|
23
|
+
return relativePath.slice(0, -TEMPLATE_EXT.length);
|
|
24
|
+
}
|
|
25
|
+
return relativePath;
|
|
26
|
+
}
|
|
27
|
+
function resolveTargetPath(cwd, target) {
|
|
28
|
+
if (target === '.') {
|
|
29
|
+
return cwd;
|
|
30
|
+
}
|
|
31
|
+
return resolve(cwd, target);
|
|
32
|
+
}
|
|
33
|
+
function ensureTargetIsWritable(targetPath, target) {
|
|
34
|
+
if (!existsSync(targetPath)) {
|
|
35
|
+
mkdirSync(targetPath, { recursive: true });
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const entries = readdirSync(targetPath);
|
|
39
|
+
if (entries.length > 0) {
|
|
40
|
+
if (target === '.') {
|
|
41
|
+
throw new Error('Current directory is not empty. Use an empty directory for "init ."');
|
|
42
|
+
}
|
|
43
|
+
throw new Error(`Directory "${target}" already exists and is not empty`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function resolveProjectName(targetPath) {
|
|
47
|
+
return basename(targetPath);
|
|
48
|
+
}
|
|
49
|
+
export function createProject(options) {
|
|
50
|
+
const targetPath = resolveTargetPath(options.cwd, options.target);
|
|
51
|
+
const projectName = resolveProjectName(targetPath);
|
|
52
|
+
const nameValidation = validateProjectName(projectName);
|
|
53
|
+
if (nameValidation) {
|
|
54
|
+
throw new Error(nameValidation);
|
|
55
|
+
}
|
|
56
|
+
ensureTargetIsWritable(targetPath, options.target);
|
|
57
|
+
const templateRoot = join(options.templatesRoot, options.template.directoryName);
|
|
58
|
+
if (!existsSync(templateRoot)) {
|
|
59
|
+
throw new Error(`Template "${options.template.id}" is missing from templates directory`);
|
|
60
|
+
}
|
|
61
|
+
const templateFiles = collectTemplateFiles(templateRoot);
|
|
62
|
+
const replacements = {
|
|
63
|
+
'{{PROJECT_NAME}}': projectName,
|
|
64
|
+
'{{TACHUI_VERSION}}': options.tachuiVersion,
|
|
65
|
+
};
|
|
66
|
+
let createdFiles = 0;
|
|
67
|
+
for (const templateFile of templateFiles) {
|
|
68
|
+
const outputRelativePath = toOutputPath(templateFile, templateRoot);
|
|
69
|
+
const outputPath = join(targetPath, outputRelativePath);
|
|
70
|
+
mkdirSync(dirname(outputPath), { recursive: true });
|
|
71
|
+
let content = readFileSync(templateFile, 'utf-8');
|
|
72
|
+
for (const [token, replacement] of Object.entries(replacements)) {
|
|
73
|
+
content = content.replaceAll(token, replacement);
|
|
74
|
+
}
|
|
75
|
+
writeFileSync(outputPath, content, 'utf-8');
|
|
76
|
+
createdFiles += 1;
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
projectName,
|
|
80
|
+
projectPath: targetPath,
|
|
81
|
+
createdFiles,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=create-project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-project.js","sourceRoot":"","sources":["../../src/scaffold/create-project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACzF,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAE5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAErD,MAAM,YAAY,GAAG,WAAW,CAAA;AAgBhC,SAAS,oBAAoB,CAAC,IAAY;IACxC,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;IAE1D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;QAExC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAA;YAC/C,SAAQ;QACV,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACxB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,YAAY,CAAC,oBAA4B,EAAE,YAAoB;IACtE,MAAM,YAAY,GAAG,oBAAoB,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACxE,IAAI,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACxC,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;IACpD,CAAC;IACD,OAAO,YAAY,CAAA;AACrB,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW,EAAE,MAAc;IACpD,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,OAAO,GAAG,CAAA;IACZ,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;AAC7B,CAAC;AAED,SAAS,sBAAsB,CAAC,UAAkB,EAAE,MAAc;IAChE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC1C,OAAM;IACR,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC,CAAA;IACvC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAA;QACxF,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,cAAc,MAAM,mCAAmC,CAAC,CAAA;IAC1E,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,UAAkB;IAC5C,OAAO,QAAQ,CAAC,UAAU,CAAC,CAAA;AAC7B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAA6B;IACzD,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IACjE,MAAM,WAAW,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAA;IAElD,MAAM,cAAc,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAA;IACvD,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAA;IACjC,CAAC;IAED,sBAAsB,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IAElD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAA;IAChF,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,aAAa,OAAO,CAAC,QAAQ,CAAC,EAAE,uCAAuC,CAAC,CAAA;IAC1F,CAAC;IAED,MAAM,aAAa,GAAG,oBAAoB,CAAC,YAAY,CAAC,CAAA;IACxD,MAAM,YAAY,GAA2B;QAC3C,kBAAkB,EAAE,WAAW;QAC/B,oBAAoB,EAAE,OAAO,CAAC,aAAa;KAC5C,CAAA;IAED,IAAI,YAAY,GAAG,CAAC,CAAA;IAEpB,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;QACzC,MAAM,kBAAkB,GAAG,YAAY,CAAC,YAAY,EAAE,YAAY,CAAC,CAAA;QACnE,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAA;QACvD,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAEnD,IAAI,OAAO,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;QACjD,KAAK,MAAM,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;YAChE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;QAClD,CAAC;QAED,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;QAC3C,YAAY,IAAI,CAAC,CAAA;IACnB,CAAC;IAED,OAAO;QACL,WAAW;QACX,WAAW,EAAE,UAAU;QACvB,YAAY;KACb,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-root.d.ts","sourceRoot":"","sources":["../../src/scaffold/package-root.ts"],"names":[],"mappings":"AAkBA,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAmB5D"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { dirname, resolve } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
function isPackageRoot(path) {
|
|
5
|
+
const packageJsonPath = resolve(path, 'package.json');
|
|
6
|
+
if (!existsSync(packageJsonPath) || !existsSync(resolve(path, 'templates'))) {
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
try {
|
|
10
|
+
const parsed = JSON.parse(readFileSync(packageJsonPath, 'utf8'));
|
|
11
|
+
return parsed.name === '@tachui/cli';
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export function resolvePackageRoot(moduleUrl) {
|
|
18
|
+
const modulePath = fileURLToPath(moduleUrl);
|
|
19
|
+
const startDir = dirname(modulePath);
|
|
20
|
+
const candidates = [
|
|
21
|
+
resolve(startDir, '..'),
|
|
22
|
+
resolve(startDir, '../..'),
|
|
23
|
+
resolve(startDir, '../../..'),
|
|
24
|
+
resolve(startDir, '../../../..'),
|
|
25
|
+
resolve(startDir, '../../../../..'),
|
|
26
|
+
];
|
|
27
|
+
for (const candidate of candidates) {
|
|
28
|
+
if (isPackageRoot(candidate)) {
|
|
29
|
+
return candidate;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
throw new Error('Unable to resolve @tachui/cli package root for template loading');
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=package-root.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-root.js","sourceRoot":"","sources":["../../src/scaffold/package-root.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC,CAAA;IACrD,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;QAC5E,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAuB,CAAA;QACtF,OAAO,MAAM,CAAC,IAAI,KAAK,aAAa,CAAA;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,MAAM,UAAU,GAAG,aAAa,CAAC,SAAS,CAAC,CAAA;IAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;IAEpC,MAAM,UAAU,GAAG;QACjB,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC;QACvB,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC;QAC1B,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC;QAC7B,OAAO,CAAC,QAAQ,EAAE,aAAa,CAAC;QAChC,OAAO,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KACpC,CAAA;IAED,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,OAAO,SAAS,CAAA;QAClB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAA;AACpF,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type TemplateId = 'basic' | 'advanced';
|
|
2
|
+
export interface TemplateDefinition {
|
|
3
|
+
id: TemplateId;
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
features: string[];
|
|
7
|
+
directoryName: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function getTemplateDefinition(templateId: string): TemplateDefinition | undefined;
|
|
10
|
+
export declare function listTemplateDefinitions(): TemplateDefinition[];
|
|
11
|
+
//# sourceMappingURL=templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,UAAU,CAAA;AAE7C,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,UAAU,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;CACtB;AAmBD,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAMxF;AAED,wBAAgB,uBAAuB,IAAI,kBAAkB,EAAE,CAE9D"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
const TEMPLATE_DEFINITIONS = {
|
|
2
|
+
basic: {
|
|
3
|
+
id: 'basic',
|
|
4
|
+
name: 'Basic TachUI App',
|
|
5
|
+
description: 'Minimal TachUI application with core components',
|
|
6
|
+
features: ['Core components', 'Single-page starter', 'Vite + TypeScript'],
|
|
7
|
+
directoryName: 'basic',
|
|
8
|
+
},
|
|
9
|
+
advanced: {
|
|
10
|
+
id: 'advanced',
|
|
11
|
+
name: 'Advanced TachUI App',
|
|
12
|
+
description: 'Starter with reactive state and richer component structure',
|
|
13
|
+
features: ['State management', 'Structured app layout', 'Extended starter patterns'],
|
|
14
|
+
directoryName: 'advanced',
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
export function getTemplateDefinition(templateId) {
|
|
18
|
+
if (templateId in TEMPLATE_DEFINITIONS) {
|
|
19
|
+
return TEMPLATE_DEFINITIONS[templateId];
|
|
20
|
+
}
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
export function listTemplateDefinitions() {
|
|
24
|
+
return Object.values(TEMPLATE_DEFINITIONS);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"AAUA,MAAM,oBAAoB,GAA2C;IACnE,KAAK,EAAE;QACL,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,iDAAiD;QAC9D,QAAQ,EAAE,CAAC,iBAAiB,EAAE,qBAAqB,EAAE,mBAAmB,CAAC;QACzE,aAAa,EAAE,OAAO;KACvB;IACD,QAAQ,EAAE;QACR,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EAAE,4DAA4D;QACzE,QAAQ,EAAE,CAAC,kBAAkB,EAAE,uBAAuB,EAAE,2BAA2B,CAAC;QACpF,aAAa,EAAE,UAAU;KAC1B;CACF,CAAA;AAED,MAAM,UAAU,qBAAqB,CAAC,UAAkB;IACtD,IAAI,UAAU,IAAI,oBAAoB,EAAE,CAAC;QACvC,OAAO,oBAAoB,CAAC,UAAwB,CAAC,CAAA;IACvD,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAA;AAC5C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/scaffold/validators.ts"],"names":[],"mappings":"AAYA,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA4BtE"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
const RESERVED_NAMES = new Set([
|
|
2
|
+
'node_modules',
|
|
3
|
+
'favicon.ico',
|
|
4
|
+
'con',
|
|
5
|
+
'prn',
|
|
6
|
+
'aux',
|
|
7
|
+
'nul',
|
|
8
|
+
]);
|
|
9
|
+
const PACKAGE_NAME_PATTERN = /^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*$/;
|
|
10
|
+
export function validateProjectName(projectName) {
|
|
11
|
+
const normalized = projectName.trim();
|
|
12
|
+
if (normalized.length === 0) {
|
|
13
|
+
return 'Project name is required';
|
|
14
|
+
}
|
|
15
|
+
if (normalized.length > 214) {
|
|
16
|
+
return 'Project name must be 214 characters or fewer';
|
|
17
|
+
}
|
|
18
|
+
if (normalized.startsWith('.') || normalized.startsWith('_')) {
|
|
19
|
+
return 'Project name cannot start with "." or "_"';
|
|
20
|
+
}
|
|
21
|
+
if (/[A-Z]/.test(normalized)) {
|
|
22
|
+
return 'Project name must be lowercase';
|
|
23
|
+
}
|
|
24
|
+
if (!PACKAGE_NAME_PATTERN.test(normalized)) {
|
|
25
|
+
return 'Project name must be a valid npm package name';
|
|
26
|
+
}
|
|
27
|
+
if (RESERVED_NAMES.has(normalized)) {
|
|
28
|
+
return `Project name "${normalized}" is reserved`;
|
|
29
|
+
}
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=validators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/scaffold/validators.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC7B,cAAc;IACd,aAAa;IACb,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;CACN,CAAC,CAAA;AAEF,MAAM,oBAAoB,GACxB,oDAAoD,CAAA;AAEtD,MAAM,UAAU,mBAAmB,CAAC,WAAmB;IACrD,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,EAAE,CAAA;IAErC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,0BAA0B,CAAA;IACnC,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QAC5B,OAAO,8CAA8C,CAAA;IACvD,CAAC;IAED,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7D,OAAO,2CAA2C,CAAA;IACpD,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7B,OAAO,gCAAgC,CAAA;IACzC,CAAC;IAED,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3C,OAAO,+CAA+C,CAAA;IACxD,CAAC;IAED,IAAI,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QACnC,OAAO,iBAAiB,UAAU,eAAe,CAAA;IACnD,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tachui/cli",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.8",
|
|
4
4
|
"description": "Tacho CLI - Comprehensive developer tooling for tachUI",
|
|
5
5
|
"homepage": "https://tachui.dev/",
|
|
6
6
|
"type": "module",
|
|
@@ -22,13 +22,17 @@
|
|
|
22
22
|
"prompts": "^2.4.0",
|
|
23
23
|
"fs-extra": "^11.0.0",
|
|
24
24
|
"glob": "^10.0.0",
|
|
25
|
-
"
|
|
25
|
+
"inquirer": "^9.0.0",
|
|
26
|
+
"cli-table3": "^0.6.0",
|
|
27
|
+
"typescript": "^5.8.0",
|
|
28
|
+
"@tachui/core": "0.8.8",
|
|
29
|
+
"@tachui/devtools": "0.8.8"
|
|
26
30
|
},
|
|
27
31
|
"devDependencies": {
|
|
28
32
|
"@types/fs-extra": "^11.0.0",
|
|
29
33
|
"@types/prompts": "^2.4.0",
|
|
30
34
|
"@types/node": "^20.0.0",
|
|
31
|
-
"
|
|
35
|
+
"@types/inquirer": "^9.0.0",
|
|
32
36
|
"vitest": "^3.2.4"
|
|
33
37
|
},
|
|
34
38
|
"keywords": [
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# {{PROJECT_NAME}}
|
|
2
|
+
|
|
3
|
+
Advanced TachUI starter generated by `@tachui/cli` with reactive state patterns.
|
|
4
|
+
|
|
5
|
+
## Getting Started
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install
|
|
9
|
+
npm run dev
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Included
|
|
13
|
+
|
|
14
|
+
- Reactive state via `@tachui/core/state`
|
|
15
|
+
- Structured starter app with interactive UI
|
|
16
|
+
- Vite + TypeScript setup
|
|
17
|
+
|
|
18
|
+
## Scripts
|
|
19
|
+
|
|
20
|
+
- `npm run dev` - Start development server
|
|
21
|
+
- `npm run build` - Build for production
|
|
22
|
+
- `npm run preview` - Preview production build
|
|
23
|
+
- `npm run typecheck` - TypeScript type-check
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>{{PROJECT_NAME}}</title>
|
|
7
|
+
<style>
|
|
8
|
+
* {
|
|
9
|
+
box-sizing: border-box;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
body {
|
|
13
|
+
margin: 0;
|
|
14
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
|
15
|
+
background: #f5f7fb;
|
|
16
|
+
}
|
|
17
|
+
</style>
|
|
18
|
+
</head>
|
|
19
|
+
<body>
|
|
20
|
+
<div id="app"></div>
|
|
21
|
+
<script type="module" src="/src/main.ts"></script>
|
|
22
|
+
</body>
|
|
23
|
+
</html>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "{{PROJECT_NAME}}",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"dev": "vite",
|
|
8
|
+
"build": "vite build",
|
|
9
|
+
"preview": "vite preview",
|
|
10
|
+
"typecheck": "tsc --noEmit"
|
|
11
|
+
},
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"@tachui/core": "{{TACHUI_VERSION}}"
|
|
14
|
+
},
|
|
15
|
+
"devDependencies": {
|
|
16
|
+
"@types/node": "^20.0.0",
|
|
17
|
+
"typescript": "^5.8.0",
|
|
18
|
+
"vite": "^7.1.1"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { Button, Layout, Text } from '@tachui/core'
|
|
2
|
+
import { State } from '@tachui/core/state'
|
|
3
|
+
|
|
4
|
+
export function App() {
|
|
5
|
+
const count = State(0)
|
|
6
|
+
|
|
7
|
+
return Layout.VStack({
|
|
8
|
+
children: [
|
|
9
|
+
Text('TachUI Advanced Starter')
|
|
10
|
+
.fontSize(30)
|
|
11
|
+
.fontWeight('bold')
|
|
12
|
+
.margin({ bottom: 12 })
|
|
13
|
+
.build(),
|
|
14
|
+
|
|
15
|
+
Text(() => `Counter: ${count.wrappedValue}`)
|
|
16
|
+
.fontSize(20)
|
|
17
|
+
.margin({ bottom: 20 })
|
|
18
|
+
.build(),
|
|
19
|
+
|
|
20
|
+
Layout.HStack({
|
|
21
|
+
children: [
|
|
22
|
+
Button({
|
|
23
|
+
title: '-',
|
|
24
|
+
onTap: () => {
|
|
25
|
+
count.wrappedValue -= 1
|
|
26
|
+
},
|
|
27
|
+
})
|
|
28
|
+
.padding(10, 14)
|
|
29
|
+
.cornerRadius(8)
|
|
30
|
+
.build(),
|
|
31
|
+
|
|
32
|
+
Button({
|
|
33
|
+
title: '+',
|
|
34
|
+
onTap: () => {
|
|
35
|
+
count.wrappedValue += 1
|
|
36
|
+
},
|
|
37
|
+
})
|
|
38
|
+
.padding(10, 14)
|
|
39
|
+
.cornerRadius(8)
|
|
40
|
+
.build(),
|
|
41
|
+
],
|
|
42
|
+
spacing: 12,
|
|
43
|
+
alignment: 'center',
|
|
44
|
+
})
|
|
45
|
+
.build(),
|
|
46
|
+
],
|
|
47
|
+
spacing: 0,
|
|
48
|
+
alignment: 'center',
|
|
49
|
+
})
|
|
50
|
+
.frame(undefined, '100vh')
|
|
51
|
+
.justifyContent('center')
|
|
52
|
+
.alignItems('center')
|
|
53
|
+
.build()
|
|
54
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"module": "ESNext",
|
|
5
|
+
"moduleResolution": "Bundler",
|
|
6
|
+
"strict": true,
|
|
7
|
+
"esModuleInterop": true,
|
|
8
|
+
"allowSyntheticDefaultImports": true,
|
|
9
|
+
"skipLibCheck": true,
|
|
10
|
+
"forceConsistentCasingInFileNames": true
|
|
11
|
+
},
|
|
12
|
+
"include": ["src/**/*"],
|
|
13
|
+
"exclude": ["node_modules", "dist"]
|
|
14
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# {{PROJECT_NAME}}
|
|
2
|
+
|
|
3
|
+
Minimal TachUI starter generated by `@tachui/cli`.
|
|
4
|
+
|
|
5
|
+
## Getting Started
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install
|
|
9
|
+
npm run dev
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Scripts
|
|
13
|
+
|
|
14
|
+
- `npm run dev` - Start development server
|
|
15
|
+
- `npm run build` - Build for production
|
|
16
|
+
- `npm run preview` - Preview production build
|
|
17
|
+
- `npm run typecheck` - TypeScript type-check
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>{{PROJECT_NAME}}</title>
|
|
7
|
+
<style>
|
|
8
|
+
* {
|
|
9
|
+
box-sizing: border-box;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
body {
|
|
13
|
+
margin: 0;
|
|
14
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
|
15
|
+
}
|
|
16
|
+
</style>
|
|
17
|
+
</head>
|
|
18
|
+
<body>
|
|
19
|
+
<div id="app"></div>
|
|
20
|
+
<script type="module" src="/src/main.ts"></script>
|
|
21
|
+
</body>
|
|
22
|
+
</html>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "{{PROJECT_NAME}}",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"dev": "vite",
|
|
8
|
+
"build": "vite build",
|
|
9
|
+
"preview": "vite preview",
|
|
10
|
+
"typecheck": "tsc --noEmit"
|
|
11
|
+
},
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"@tachui/core": "{{TACHUI_VERSION}}"
|
|
14
|
+
},
|
|
15
|
+
"devDependencies": {
|
|
16
|
+
"@types/node": "^20.0.0",
|
|
17
|
+
"typescript": "^5.8.0",
|
|
18
|
+
"vite": "^7.1.1"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Button, Layout, Text } from '@tachui/core'
|
|
2
|
+
|
|
3
|
+
export function App() {
|
|
4
|
+
return Layout.VStack({
|
|
5
|
+
children: [
|
|
6
|
+
Text('Welcome to TachUI')
|
|
7
|
+
.fontSize(30)
|
|
8
|
+
.fontWeight('bold')
|
|
9
|
+
.margin({ bottom: 12 })
|
|
10
|
+
.build(),
|
|
11
|
+
|
|
12
|
+
Text('Your starter app is ready.')
|
|
13
|
+
.fontSize(18)
|
|
14
|
+
.foregroundColor('#666')
|
|
15
|
+
.margin({ bottom: 24 })
|
|
16
|
+
.build(),
|
|
17
|
+
|
|
18
|
+
Button({
|
|
19
|
+
title: 'Get Started',
|
|
20
|
+
onTap: () => console.log('TachUI starter ready'),
|
|
21
|
+
})
|
|
22
|
+
.backgroundColor('#0a84ff')
|
|
23
|
+
.foregroundColor('#fff')
|
|
24
|
+
.padding(12, 20)
|
|
25
|
+
.cornerRadius(10)
|
|
26
|
+
.build(),
|
|
27
|
+
],
|
|
28
|
+
spacing: 0,
|
|
29
|
+
alignment: 'center',
|
|
30
|
+
})
|
|
31
|
+
.frame(undefined, '100vh')
|
|
32
|
+
.justifyContent('center')
|
|
33
|
+
.alignItems('center')
|
|
34
|
+
.build()
|
|
35
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"module": "ESNext",
|
|
5
|
+
"moduleResolution": "Bundler",
|
|
6
|
+
"strict": true,
|
|
7
|
+
"esModuleInterop": true,
|
|
8
|
+
"allowSyntheticDefaultImports": true,
|
|
9
|
+
"skipLibCheck": true,
|
|
10
|
+
"forceConsistentCasingInFileNames": true
|
|
11
|
+
},
|
|
12
|
+
"include": ["src/**/*"],
|
|
13
|
+
"exclude": ["node_modules", "dist"]
|
|
14
|
+
}
|