@avora-labs/cli 1.1.20
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 +218 -0
- package/bin/avora.mjs +5 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +64 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/add.command.d.ts +3 -0
- package/dist/commands/add.command.d.ts.map +1 -0
- package/dist/commands/add.command.js +83 -0
- package/dist/commands/add.command.js.map +1 -0
- package/dist/commands/config.command.d.ts +3 -0
- package/dist/commands/config.command.d.ts.map +1 -0
- package/dist/commands/config.command.js +71 -0
- package/dist/commands/config.command.js.map +1 -0
- package/dist/commands/generate.command.d.ts +3 -0
- package/dist/commands/generate.command.d.ts.map +1 -0
- package/dist/commands/generate.command.js +258 -0
- package/dist/commands/generate.command.js.map +1 -0
- package/dist/commands/info.command.d.ts +3 -0
- package/dist/commands/info.command.d.ts.map +1 -0
- package/dist/commands/info.command.js +92 -0
- package/dist/commands/info.command.js.map +1 -0
- package/dist/commands/init.command.d.ts +3 -0
- package/dist/commands/init.command.d.ts.map +1 -0
- package/dist/commands/init.command.js +230 -0
- package/dist/commands/init.command.js.map +1 -0
- package/dist/commands/new.command.d.ts +3 -0
- package/dist/commands/new.command.d.ts.map +1 -0
- package/dist/commands/new.command.js +50 -0
- package/dist/commands/new.command.js.map +1 -0
- package/dist/commands/plugin.command.d.ts +3 -0
- package/dist/commands/plugin.command.d.ts.map +1 -0
- package/dist/commands/plugin.command.js +153 -0
- package/dist/commands/plugin.command.js.map +1 -0
- package/dist/commands/remove.command.d.ts +3 -0
- package/dist/commands/remove.command.d.ts.map +1 -0
- package/dist/commands/remove.command.js +89 -0
- package/dist/commands/remove.command.js.map +1 -0
- package/dist/registry/amf-config.d.ts +31 -0
- package/dist/registry/amf-config.d.ts.map +1 -0
- package/dist/registry/amf-config.js +97 -0
- package/dist/registry/amf-config.js.map +1 -0
- package/dist/registry/meta-registry.d.ts +105 -0
- package/dist/registry/meta-registry.d.ts.map +1 -0
- package/dist/registry/meta-registry.js +364 -0
- package/dist/registry/meta-registry.js.map +1 -0
- package/dist/schematics/app/app.schematic.d.ts +3 -0
- package/dist/schematics/app/app.schematic.d.ts.map +1 -0
- package/dist/schematics/app/app.schematic.js +149 -0
- package/dist/schematics/app/app.schematic.js.map +1 -0
- package/dist/schematics/form/form.schematic.d.ts +4 -0
- package/dist/schematics/form/form.schematic.d.ts.map +1 -0
- package/dist/schematics/form/form.schematic.js +100 -0
- package/dist/schematics/form/form.schematic.js.map +1 -0
- package/dist/schematics/page/page.schematic.d.ts +3 -0
- package/dist/schematics/page/page.schematic.d.ts.map +1 -0
- package/dist/schematics/page/page.schematic.js +147 -0
- package/dist/schematics/page/page.schematic.js.map +1 -0
- package/dist/schematics/table/table.schematic.d.ts +3 -0
- package/dist/schematics/table/table.schematic.d.ts.map +1 -0
- package/dist/schematics/table/table.schematic.js +58 -0
- package/dist/schematics/table/table.schematic.js.map +1 -0
- package/dist/types/cli.types.d.ts +104 -0
- package/dist/types/cli.types.d.ts.map +1 -0
- package/dist/types/cli.types.js +3 -0
- package/dist/types/cli.types.js.map +1 -0
- package/dist/utils/credentials.d.ts +19 -0
- package/dist/utils/credentials.d.ts.map +1 -0
- package/dist/utils/credentials.js +99 -0
- package/dist/utils/credentials.js.map +1 -0
- package/dist/utils/diff.d.ts +11 -0
- package/dist/utils/diff.d.ts.map +1 -0
- package/dist/utils/diff.js +45 -0
- package/dist/utils/diff.js.map +1 -0
- package/dist/utils/file-utils.d.ts +11 -0
- package/dist/utils/file-utils.d.ts.map +1 -0
- package/dist/utils/file-utils.js +30 -0
- package/dist/utils/file-utils.js.map +1 -0
- package/dist/utils/logger.d.ts +21 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +63 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/prompt.d.ts +8 -0
- package/dist/utils/prompt.d.ts.map +1 -0
- package/dist/utils/prompt.js +63 -0
- package/dist/utils/prompt.js.map +1 -0
- package/dist/utils/template-engine.d.ts +9 -0
- package/dist/utils/template-engine.d.ts.map +1 -0
- package/dist/utils/template-engine.js +23 -0
- package/dist/utils/template-engine.js.map +1 -0
- package/dist/utils/transaction.d.ts +37 -0
- package/dist/utils/transaction.d.ts.map +1 -0
- package/dist/utils/transaction.js +94 -0
- package/dist/utils/transaction.js.map +1 -0
- package/package.json +66 -0
- package/templates/app/app.component.ts.ejs +9 -0
- package/templates/app/app.config.ts.ejs +27 -0
- package/templates/app/app.meta.ts.ejs +58 -0
- package/templates/app/app.routes.ts.ejs +9 -0
- package/templates/app/dashboard.page.ts.ejs +61 -0
- package/templates/form/form.meta.ts.ejs +77 -0
- package/templates/page/page.meta.ts.ejs +112 -0
- package/templates/table/table.meta.ts.ejs +78 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form.schematic.js","sourceRoot":"","sources":["../../../src/schematics/form/form.schematic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,OAAO,MAAM,UAAU,CAAC;AAC/B,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAG5F,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,SAAS,UAAU;QACjB,MAAM,MAAM,GAAU,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjB,CAAC,EAAE,CAAC;gBACJ,SAAS;YACX,CAAC;YACD,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjC,IAAI,WAAW,EAAE,CAAC;oBAChB,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;oBACjF,WAAW,GAAG,EAAE,CAAC;gBACnB,CAAC;gBACD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;oBACjB,CAAC,EAAE,CAAC;oBACJ,OAAO,MAAM,CAAC;gBAChB,CAAC;gBACD,CAAC,EAAE,CAAC;gBACJ,SAAS;YACX,CAAC;YACD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjB,MAAM,GAAG,GAAG,WAAW,CAAC;gBACxB,WAAW,GAAG,EAAE,CAAC;gBACjB,CAAC,EAAE,CAAC;gBACJ,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAC;gBAC9B,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAC1E,SAAS;YACX,CAAC;YACD,WAAW,IAAI,IAAI,CAAC;YACpB,CAAC,EAAE,CAAC;QACN,CAAC;QACD,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,EAAiB,EACjB,OAA4B;IAE5B,MAAM,KAAK,GAAI,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAI,SAAS,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,GAAG,MAAM,CAAC;IACzF,MAAM,KAAK,GAAI,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3E,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,KAAK,UAAU,CAAC,CAAC;IAEpD,IAAI,MAAM,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,SAAS,KAAK,mCAAmC,QAAQ,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACxE,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;KAC7E,CAAC;IAEF,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,uBAAuB,EAAE;QAC5D,SAAS,EAAI,KAAK;QAClB,SAAS,EAAI,KAAK;QAClB,SAAS,EAAI,KAAK;QAClB,MAAM,EAAO,OAAO,CAAC,MAAM,IAAI,GAAG,KAAK,OAAO;QAC9C,MAAM,EAAO,OAAO,CAAC,MAAM;QAC3B,OAAO,EAAM,OAAO,CAAC,OAAO;QAC5B,OAAO,EAAM,OAAO,CAAC,OAAO;QAC5B,KAAK,EAAQ,OAAO,CAAC,KAAK;QAC1B,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE;QACtC,YAAY;KACb,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,CAAC,MAAM,CAAC,uCAAuC,CAAC,CAAC;QACvD,kBAAkB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;QAC7D,OAAO;IACT,CAAC;IAED,MAAM,EAAE,GAAG,IAAI,eAAe,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC1B,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC5B,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3C,EAAE,CAAC,MAAM,EAAE,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC;QACpB,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,MAAM,CAAC,EAAE,EAAE,CAAC;IACZ,MAAM,CAAC,OAAO,CAAC,SAAS,KAAK,2BAA2B,CAAC,CAAC;IAC1D,MAAM,CAAC,IAAI,CAAC,eAAe,QAAQ,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,IAAI,CAAC,6DAA6D,KAAK,IAAI,CAAC,CAAC;AACtF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page.schematic.d.ts","sourceRoot":"","sources":["../../../src/schematics/page/page.schematic.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAuBnF,wBAAsB,YAAY,CAChC,EAAE,EAAE,aAAa,EACjB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAqIf"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { join, resolve, relative, dirname } from 'node:path';
|
|
2
|
+
import fsExtra from 'fs-extra';
|
|
3
|
+
const { writeFile, pathExists, ensureDir } = fsExtra;
|
|
4
|
+
import { renderTemplate } from '../../utils/template-engine.js';
|
|
5
|
+
import { MetaRegistry } from '../../registry/meta-registry.js';
|
|
6
|
+
import { resolveMetaFile, resolvePagesMetaFile, resolveNavigationMetaFile, isSplitMetaMode, } from '../../registry/amf-config.js';
|
|
7
|
+
import { FileTransaction } from '../../utils/transaction.js';
|
|
8
|
+
import { logger } from '../../utils/logger.js';
|
|
9
|
+
import { printDiff, printCreateSummary } from '../../utils/diff.js';
|
|
10
|
+
import { toKebabCase, toCamelCase, toPascalCase, toTitleCase, byteSize } from '../../utils/file-utils.js';
|
|
11
|
+
// ─── Scaffold templates ───────────────────────────────────────────────────────
|
|
12
|
+
// Written to disk the first time avora generate page runs on a fresh app.
|
|
13
|
+
const PAGES_SCAFFOLD = `import type { AppMeta } from '@avora-labs/meta-forge';
|
|
14
|
+
|
|
15
|
+
type Pages = AppMeta['pages'];
|
|
16
|
+
|
|
17
|
+
export const PAGES: Pages = [];
|
|
18
|
+
`;
|
|
19
|
+
const NAV_SCAFFOLD = `import type { AppMeta } from '@avora-labs/meta-forge';
|
|
20
|
+
|
|
21
|
+
type NavGroups = AppMeta['navigation'];
|
|
22
|
+
|
|
23
|
+
export const NAVIGATION: NavGroups = [];
|
|
24
|
+
`;
|
|
25
|
+
// ─── Main ─────────────────────────────────────────────────────────────────────
|
|
26
|
+
export async function generatePage(ws, options) {
|
|
27
|
+
const kebab = toKebabCase(options.name);
|
|
28
|
+
const camel = toCamelCase(options.name) + 'Page';
|
|
29
|
+
const pascal = toPascalCase(options.name);
|
|
30
|
+
const title = toTitleCase(options.name);
|
|
31
|
+
const route = options.routePath ?? kebab;
|
|
32
|
+
const pagesDir = resolve(ws.root, ws.config.paths.pagesDir);
|
|
33
|
+
const pageFile = join(pagesDir, `${kebab}.page.ts`);
|
|
34
|
+
// ── Resolve target meta files ─────────────────────────────────────────────
|
|
35
|
+
const split = isSplitMetaMode(ws.config);
|
|
36
|
+
const pagesMetaFile = resolvePagesMetaFile(ws.root, ws.config);
|
|
37
|
+
const navMetaFile = resolveNavigationMetaFile(ws.root, ws.config);
|
|
38
|
+
const legacyFile = resolveMetaFile(ws.root, ws.config);
|
|
39
|
+
// Compute the import specifier relative to wherever the page registry lives
|
|
40
|
+
const importSpecifier = './' +
|
|
41
|
+
relative(dirname(pagesMetaFile), join(pagesDir, `${kebab}.page`)).replace(/\\/g, '/');
|
|
42
|
+
const pagesLabel = split ? 'meta/pages.meta.ts' : 'app.meta.ts';
|
|
43
|
+
const navLabel = split ? 'meta/navigation.meta.ts' : 'app.meta.ts';
|
|
44
|
+
// ── Guard: page file already exists ──────────────────────────────────────
|
|
45
|
+
if (await pathExists(pageFile)) {
|
|
46
|
+
throw new Error(`Page "${kebab}.page.ts" already exists at:\n ${pageFile}\n` +
|
|
47
|
+
`Use a different name or delete the existing file.`);
|
|
48
|
+
}
|
|
49
|
+
// ── Render template ───────────────────────────────────────────────────────
|
|
50
|
+
const content = await renderTemplate('page/page.meta.ts.ejs', {
|
|
51
|
+
camelName: camel,
|
|
52
|
+
kebabName: kebab,
|
|
53
|
+
pascalName: pascal,
|
|
54
|
+
titleName: title,
|
|
55
|
+
routePath: route,
|
|
56
|
+
layout: options.layout,
|
|
57
|
+
guard: options.guard,
|
|
58
|
+
sections: options.sections,
|
|
59
|
+
pagination: options.pagination,
|
|
60
|
+
});
|
|
61
|
+
// ── Dry-run mode ──────────────────────────────────────────────────────────
|
|
62
|
+
if (options.dryRun) {
|
|
63
|
+
logger.header('Dry-run Preview — avora generate page');
|
|
64
|
+
printCreateSummary(pageFile, content);
|
|
65
|
+
const pagesExists = await pathExists(pagesMetaFile);
|
|
66
|
+
if (!pagesExists) {
|
|
67
|
+
logger.info(`Will create: ${pagesLabel} (first page — scaffold)`);
|
|
68
|
+
console.log(` + ${PAGES_SCAFFOLD.trim()}\n + import { ${camel} } from '${importSpecifier}';\n + ${camel},`);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
const pagesReg = new MetaRegistry(pagesMetaFile);
|
|
72
|
+
const pagesBefore = pagesReg.getCurrentText();
|
|
73
|
+
pagesReg.addImport(camel, importSpecifier);
|
|
74
|
+
pagesReg.addPage(camel);
|
|
75
|
+
printDiff(pagesLabel, pagesBefore, pagesReg.getPendingText());
|
|
76
|
+
}
|
|
77
|
+
if (options.nav && options.navGroup) {
|
|
78
|
+
const navExists = await pathExists(navMetaFile);
|
|
79
|
+
if (split && !navExists) {
|
|
80
|
+
logger.info(`Will create: ${navLabel} (first nav — scaffold)`);
|
|
81
|
+
console.log(` + ${NAV_SCAFFOLD.trim()}\n + { label: '${title}', route: '/${route}', icon: '${options.navIcon ?? ''}' }`);
|
|
82
|
+
}
|
|
83
|
+
else if (split && navMetaFile !== legacyFile) {
|
|
84
|
+
const navReg = new MetaRegistry(navMetaFile);
|
|
85
|
+
const navBefore = navReg.getCurrentText();
|
|
86
|
+
navReg.addNavItem(options.navGroup, { label: title, route: `/${route}`, icon: options.navIcon });
|
|
87
|
+
printDiff(navLabel, navBefore, navReg.getPendingText());
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
logger.nl();
|
|
91
|
+
logger.info('Run without --dry-run to apply these changes.');
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
// ── Real write inside transaction ─────────────────────────────────────────
|
|
95
|
+
const tx = new FileTransaction();
|
|
96
|
+
try {
|
|
97
|
+
// 1. Ensure directories exist (first run on a fresh Angular app)
|
|
98
|
+
await ensureDir(pagesDir);
|
|
99
|
+
await ensureDir(dirname(pagesMetaFile));
|
|
100
|
+
// 2. Write page file
|
|
101
|
+
await tx.snapshot(pageFile);
|
|
102
|
+
await writeFile(pageFile, content, 'utf-8');
|
|
103
|
+
logger.create(pageFile, byteSize(content));
|
|
104
|
+
// 3. Scaffold pages.meta.ts if this is the first page ever
|
|
105
|
+
await tx.snapshot(pagesMetaFile);
|
|
106
|
+
if (!(await pathExists(pagesMetaFile))) {
|
|
107
|
+
await writeFile(pagesMetaFile, PAGES_SCAFFOLD, 'utf-8');
|
|
108
|
+
logger.create(pagesMetaFile, byteSize(PAGES_SCAFFOLD));
|
|
109
|
+
}
|
|
110
|
+
const pagesReg = new MetaRegistry(pagesMetaFile);
|
|
111
|
+
pagesReg.addImport(camel, importSpecifier);
|
|
112
|
+
pagesReg.addPage(camel);
|
|
113
|
+
// 4. Nav item — use separate registry in split mode
|
|
114
|
+
if (options.nav && options.navGroup) {
|
|
115
|
+
if (split && navMetaFile !== legacyFile) {
|
|
116
|
+
await ensureDir(dirname(navMetaFile));
|
|
117
|
+
await tx.snapshot(navMetaFile);
|
|
118
|
+
// Scaffold navigation.meta.ts if it doesn't exist yet
|
|
119
|
+
if (!(await pathExists(navMetaFile))) {
|
|
120
|
+
await writeFile(navMetaFile, NAV_SCAFFOLD, 'utf-8');
|
|
121
|
+
logger.create(navMetaFile, byteSize(NAV_SCAFFOLD));
|
|
122
|
+
}
|
|
123
|
+
const navReg = new MetaRegistry(navMetaFile);
|
|
124
|
+
navReg.addNavItem(options.navGroup, { label: title, route: `/${route}`, icon: options.navIcon });
|
|
125
|
+
await navReg.save();
|
|
126
|
+
logger.update(navLabel, `+nav item`);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
pagesReg.addNavItem(options.navGroup, { label: title, route: `/${route}`, icon: options.navIcon });
|
|
130
|
+
}
|
|
131
|
+
logger.update(pagesLabel, `+import, +page`);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
logger.update(pagesLabel, `+import, +page`);
|
|
135
|
+
}
|
|
136
|
+
await pagesReg.save();
|
|
137
|
+
tx.commit();
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
await tx.rollback();
|
|
141
|
+
throw err;
|
|
142
|
+
}
|
|
143
|
+
logger.nl();
|
|
144
|
+
logger.success(`Page "${pascal}" generated successfully!`);
|
|
145
|
+
logger.info(`Edit it at: ${pageFile}`);
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=page.schematic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page.schematic.js","sourceRoot":"","sources":["../../../src/schematics/page/page.schematic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.schematic.d.ts","sourceRoot":"","sources":["../../../src/schematics/table/table.schematic.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEpF,wBAAsB,aAAa,CACjC,EAAE,EAAE,aAAa,EACjB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAsDf"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { join, resolve } from 'node:path';
|
|
2
|
+
import fsExtra from 'fs-extra';
|
|
3
|
+
const { writeFile, pathExists, ensureDir } = fsExtra;
|
|
4
|
+
import { renderTemplate } from '../../utils/template-engine.js';
|
|
5
|
+
import { FileTransaction } from '../../utils/transaction.js';
|
|
6
|
+
import { logger } from '../../utils/logger.js';
|
|
7
|
+
import { printCreateSummary } from '../../utils/diff.js';
|
|
8
|
+
import { toKebabCase, toCamelCase, toTitleCase, byteSize } from '../../utils/file-utils.js';
|
|
9
|
+
export async function generateTable(ws, options) {
|
|
10
|
+
const kebab = toKebabCase(options.name);
|
|
11
|
+
const camel = toCamelCase(options.name) + 'Table';
|
|
12
|
+
const title = toTitleCase(options.name);
|
|
13
|
+
const tablesDir = resolve(ws.root, ws.config.paths.pagesDir, '..', 'tables');
|
|
14
|
+
const tableFile = join(tablesDir, `${kebab}.table.ts`);
|
|
15
|
+
if (await pathExists(tableFile)) {
|
|
16
|
+
throw new Error(`Table "${kebab}.table.ts" already exists at:\n ${tableFile}`);
|
|
17
|
+
}
|
|
18
|
+
// Parse --columns "name,price,status" into column definitions
|
|
19
|
+
const rawColumns = options.columns
|
|
20
|
+
? options.columns.split(',').map(c => c.trim()).filter(Boolean)
|
|
21
|
+
: ['id', 'name', 'status'];
|
|
22
|
+
const columns = rawColumns.map(key => ({
|
|
23
|
+
key,
|
|
24
|
+
label: toTitleCase(key),
|
|
25
|
+
sortable: ['name', 'date', 'createdAt', 'updatedAt'].includes(key),
|
|
26
|
+
type: key === 'status' ? 'badge' : key === 'actions' ? 'actions' : 'text',
|
|
27
|
+
}));
|
|
28
|
+
const content = await renderTemplate('table/table.meta.ts.ejs', {
|
|
29
|
+
camelName: camel,
|
|
30
|
+
kebabName: kebab,
|
|
31
|
+
titleName: title,
|
|
32
|
+
tableId: options.tableId ?? `${kebab}-table`,
|
|
33
|
+
apiEndpoint: options.api ?? '',
|
|
34
|
+
columns,
|
|
35
|
+
});
|
|
36
|
+
if (options.dryRun) {
|
|
37
|
+
logger.header('Dry-run Preview — avora generate table');
|
|
38
|
+
printCreateSummary(tableFile, content);
|
|
39
|
+
logger.info('Run without --dry-run to apply these changes.');
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const tx = new FileTransaction();
|
|
43
|
+
try {
|
|
44
|
+
await ensureDir(tablesDir);
|
|
45
|
+
await tx.snapshot(tableFile);
|
|
46
|
+
await writeFile(tableFile, content, 'utf-8');
|
|
47
|
+
logger.create(tableFile, byteSize(content));
|
|
48
|
+
tx.commit();
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
await tx.rollback();
|
|
52
|
+
throw err;
|
|
53
|
+
}
|
|
54
|
+
logger.nl();
|
|
55
|
+
logger.success(`Table "${camel}" generated successfully!`);
|
|
56
|
+
logger.info(`Edit it at: ${tableFile}`);
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=table.schematic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.schematic.js","sourceRoot":"","sources":["../../../src/schematics/table/table.schematic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
export interface AvoraConfig {
|
|
2
|
+
version: string;
|
|
3
|
+
projectType: 'application' | 'library';
|
|
4
|
+
library: string;
|
|
5
|
+
libraryVersion: string;
|
|
6
|
+
paths: {
|
|
7
|
+
metaFile: string;
|
|
8
|
+
pagesDir: string;
|
|
9
|
+
appConfig: string;
|
|
10
|
+
appRoutesFile?: string;
|
|
11
|
+
stylesDir?: string;
|
|
12
|
+
pagesMetaFile?: string;
|
|
13
|
+
navigationMetaFile?: string;
|
|
14
|
+
apisMetaFile?: string;
|
|
15
|
+
};
|
|
16
|
+
defaultLayout: LayoutType;
|
|
17
|
+
registry: RegistryConfig;
|
|
18
|
+
cliPlugins?: string[];
|
|
19
|
+
plugins?: string[];
|
|
20
|
+
}
|
|
21
|
+
export type LayoutType = 'vertical' | 'horizontal' | 'empty' | 'centered' | 'two-column' | 'dashboard-grid' | 'compact';
|
|
22
|
+
export type SectionType = 'form' | 'table' | 'card' | 'stats-grid' | 'page-header' | 'stepper-form' | 'accordion' | 'tabs' | 'timeline' | 'alert' | 'empty-state' | 'html';
|
|
23
|
+
export type AuthType = 'jwt' | 'session' | 'oauth2' | 'apiKey' | 'custom';
|
|
24
|
+
export interface RegistryConfig {
|
|
25
|
+
type: 'github' | 'npm' | 'verdaccio' | 'custom';
|
|
26
|
+
url?: string;
|
|
27
|
+
org?: string;
|
|
28
|
+
scope?: string;
|
|
29
|
+
privateRepo?: boolean;
|
|
30
|
+
}
|
|
31
|
+
export interface NewAppOptions {
|
|
32
|
+
name: string;
|
|
33
|
+
layout: LayoutType;
|
|
34
|
+
auth: boolean;
|
|
35
|
+
authType: AuthType;
|
|
36
|
+
builtInAuthUI: boolean;
|
|
37
|
+
skipInstall: boolean;
|
|
38
|
+
dryRun: boolean;
|
|
39
|
+
}
|
|
40
|
+
export interface GeneratePageOptions {
|
|
41
|
+
name: string;
|
|
42
|
+
layout: LayoutType;
|
|
43
|
+
sections: SectionType[];
|
|
44
|
+
guard: boolean;
|
|
45
|
+
nav: boolean;
|
|
46
|
+
navGroup?: string;
|
|
47
|
+
navIcon?: string;
|
|
48
|
+
routePath?: string;
|
|
49
|
+
pagination?: boolean;
|
|
50
|
+
dryRun: boolean;
|
|
51
|
+
}
|
|
52
|
+
export interface GenerateFormOptions {
|
|
53
|
+
name: string;
|
|
54
|
+
formId?: string;
|
|
55
|
+
layout: 'vertical' | 'horizontal' | 'grid' | 'inline';
|
|
56
|
+
columns: number;
|
|
57
|
+
stepper: boolean;
|
|
58
|
+
steps: number;
|
|
59
|
+
apiEndpoint?: string;
|
|
60
|
+
fields?: string;
|
|
61
|
+
dryRun: boolean;
|
|
62
|
+
}
|
|
63
|
+
export interface GenerateTableOptions {
|
|
64
|
+
name: string;
|
|
65
|
+
tableId?: string;
|
|
66
|
+
api?: string;
|
|
67
|
+
columns?: string;
|
|
68
|
+
dryRun: boolean;
|
|
69
|
+
}
|
|
70
|
+
export interface GenerateApiOptions {
|
|
71
|
+
id: string;
|
|
72
|
+
method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
73
|
+
path: string;
|
|
74
|
+
mock: boolean;
|
|
75
|
+
dryRun: boolean;
|
|
76
|
+
}
|
|
77
|
+
export interface GenerateNavItemOptions {
|
|
78
|
+
label: string;
|
|
79
|
+
route: string;
|
|
80
|
+
icon?: string;
|
|
81
|
+
group: string;
|
|
82
|
+
dryRun: boolean;
|
|
83
|
+
}
|
|
84
|
+
export type FileOperationType = 'create' | 'modify';
|
|
85
|
+
export interface FileSnapshot {
|
|
86
|
+
type: FileOperationType;
|
|
87
|
+
path: string;
|
|
88
|
+
originalContent: string | null;
|
|
89
|
+
}
|
|
90
|
+
export interface WorkspaceInfo {
|
|
91
|
+
root: string;
|
|
92
|
+
configPath: string;
|
|
93
|
+
config: AvoraConfig;
|
|
94
|
+
}
|
|
95
|
+
export interface AppMetaStats {
|
|
96
|
+
pages: number;
|
|
97
|
+
apis: number;
|
|
98
|
+
navItems: number;
|
|
99
|
+
plugins: number;
|
|
100
|
+
defaultLayout: string;
|
|
101
|
+
authType: string | null;
|
|
102
|
+
builtInAuthUI: boolean;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=cli.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.types.d.ts","sourceRoot":"","sources":["../../src/types/cli.types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.types.js","sourceRoot":"","sources":["../../src/types/cli.types.ts"],"names":[],"mappings":"AAAA,iFAAiF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Store a credential encrypted on disk under ~/.avora/credentials.json.
|
|
3
|
+
* service key example: 'github-registry'
|
|
4
|
+
*/
|
|
5
|
+
export declare function setCredential(service: string, value: string): Promise<void>;
|
|
6
|
+
/**
|
|
7
|
+
* Retrieve a stored credential. Returns null if not found.
|
|
8
|
+
*/
|
|
9
|
+
export declare function getCredential(service: string): Promise<string | null>;
|
|
10
|
+
/**
|
|
11
|
+
* Delete a stored credential.
|
|
12
|
+
*/
|
|
13
|
+
export declare function deleteCredential(service: string): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Resolve the registry token for a given scope.
|
|
16
|
+
* Priority: AVORA_REGISTRY_TOKEN env var → stored credential → null
|
|
17
|
+
*/
|
|
18
|
+
export declare function resolveRegistryToken(scope?: string): Promise<string | null>;
|
|
19
|
+
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/utils/credentials.ts"],"names":[],"mappings":"AAkEA;;;GAGG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKjF;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAU3E;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIrE;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,KAAK,SAAgB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOxF"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { createCipheriv, createDecipheriv, randomBytes, scryptSync } from 'node:crypto';
|
|
2
|
+
import fsExtra from 'fs-extra';
|
|
3
|
+
const { pathExists, readJson, writeJson, ensureDir } = fsExtra;
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { homedir } from 'node:os';
|
|
6
|
+
import { userInfo, hostname } from 'node:os';
|
|
7
|
+
const AVORA_DIR = join(homedir(), '.avora');
|
|
8
|
+
const CREDS_FILE = join(AVORA_DIR, 'credentials.json');
|
|
9
|
+
const ALGORITHM = 'aes-256-gcm';
|
|
10
|
+
const IV_LEN = 12;
|
|
11
|
+
/**
|
|
12
|
+
* Machine-derived key — not secret but unique per machine.
|
|
13
|
+
* Used as a convenience encryption key for stored credentials.
|
|
14
|
+
* For production secrets, prefer CI/CD environment variables.
|
|
15
|
+
*/
|
|
16
|
+
function deriveMachineKey() {
|
|
17
|
+
const machine = `avora-${hostname()}-${userInfo().username}`;
|
|
18
|
+
return scryptSync(machine, 'avora-salt-v1', 32);
|
|
19
|
+
}
|
|
20
|
+
function encrypt(plaintext, key) {
|
|
21
|
+
const iv = randomBytes(IV_LEN);
|
|
22
|
+
const cipher = createCipheriv(ALGORITHM, key, iv);
|
|
23
|
+
const encrypted = Buffer.concat([cipher.update(plaintext, 'utf-8'), cipher.final()]);
|
|
24
|
+
const tag = cipher.getAuthTag();
|
|
25
|
+
return {
|
|
26
|
+
iv: iv.toString('hex'),
|
|
27
|
+
tag: tag.toString('hex'),
|
|
28
|
+
ciphertext: encrypted.toString('hex'),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function decrypt(stored, key) {
|
|
32
|
+
const decipher = createDecipheriv(ALGORITHM, key, Buffer.from(stored.iv, 'hex'));
|
|
33
|
+
decipher.setAuthTag(Buffer.from(stored.tag, 'hex'));
|
|
34
|
+
const decrypted = Buffer.concat([
|
|
35
|
+
decipher.update(Buffer.from(stored.ciphertext, 'hex')),
|
|
36
|
+
decipher.final(),
|
|
37
|
+
]);
|
|
38
|
+
return decrypted.toString('utf-8');
|
|
39
|
+
}
|
|
40
|
+
async function loadStore() {
|
|
41
|
+
if (!(await pathExists(CREDS_FILE)))
|
|
42
|
+
return {};
|
|
43
|
+
try {
|
|
44
|
+
return (await readJson(CREDS_FILE));
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return {};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
async function saveStore(store) {
|
|
51
|
+
await ensureDir(AVORA_DIR);
|
|
52
|
+
await writeJson(CREDS_FILE, store, { spaces: 2, mode: 0o600 });
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Store a credential encrypted on disk under ~/.avora/credentials.json.
|
|
56
|
+
* service key example: 'github-registry'
|
|
57
|
+
*/
|
|
58
|
+
export async function setCredential(service, value) {
|
|
59
|
+
const key = deriveMachineKey();
|
|
60
|
+
const store = await loadStore();
|
|
61
|
+
store[service] = encrypt(value, key);
|
|
62
|
+
await saveStore(store);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Retrieve a stored credential. Returns null if not found.
|
|
66
|
+
*/
|
|
67
|
+
export async function getCredential(service) {
|
|
68
|
+
const store = await loadStore();
|
|
69
|
+
const entry = store[service];
|
|
70
|
+
if (!entry)
|
|
71
|
+
return null;
|
|
72
|
+
try {
|
|
73
|
+
return decrypt(entry, deriveMachineKey());
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return null; // corrupted or from different machine
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Delete a stored credential.
|
|
81
|
+
*/
|
|
82
|
+
export async function deleteCredential(service) {
|
|
83
|
+
const store = await loadStore();
|
|
84
|
+
delete store[service];
|
|
85
|
+
await saveStore(store);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Resolve the registry token for a given scope.
|
|
89
|
+
* Priority: AVORA_REGISTRY_TOKEN env var → stored credential → null
|
|
90
|
+
*/
|
|
91
|
+
export async function resolveRegistryToken(scope = '@avora-labs') {
|
|
92
|
+
// 1. Env var takes highest priority (CI/CD friendly)
|
|
93
|
+
const envToken = process.env['AVORA_REGISTRY_TOKEN'];
|
|
94
|
+
if (envToken)
|
|
95
|
+
return envToken;
|
|
96
|
+
// 2. Stored credential
|
|
97
|
+
return getCredential(`registry-token-${scope}`);
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/utils/credentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Print a colored unified diff between oldText and newText.
|
|
3
|
+
* Used by --dry-run mode to preview changes before writing.
|
|
4
|
+
*/
|
|
5
|
+
export declare function printDiff(filename: string, oldText: string, newText: string): void;
|
|
6
|
+
/**
|
|
7
|
+
* Summarise what would happen without the full diff.
|
|
8
|
+
* Used when a file is newly created (no "before" content).
|
|
9
|
+
*/
|
|
10
|
+
export declare function printCreateSummary(filename: string, content: string): void;
|
|
11
|
+
//# sourceMappingURL=diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/utils/diff.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CA0BlF;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAO1E"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { createPatch } from 'diff';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
/**
|
|
4
|
+
* Print a colored unified diff between oldText and newText.
|
|
5
|
+
* Used by --dry-run mode to preview changes before writing.
|
|
6
|
+
*/
|
|
7
|
+
export function printDiff(filename, oldText, newText) {
|
|
8
|
+
if (oldText === newText) {
|
|
9
|
+
console.log(chalk.dim(` (no changes to ${filename})`));
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
const patch = createPatch(filename, oldText, newText, 'before', 'after');
|
|
13
|
+
const lines = patch.split('\n');
|
|
14
|
+
console.log('');
|
|
15
|
+
console.log(chalk.bold.cyan(` ── diff: ${filename} ──`));
|
|
16
|
+
for (const line of lines) {
|
|
17
|
+
if (line.startsWith('+++') || line.startsWith('---') || line.startsWith('===')) {
|
|
18
|
+
console.log(chalk.bold(line));
|
|
19
|
+
}
|
|
20
|
+
else if (line.startsWith('+')) {
|
|
21
|
+
console.log(chalk.green(line));
|
|
22
|
+
}
|
|
23
|
+
else if (line.startsWith('-')) {
|
|
24
|
+
console.log(chalk.red(line));
|
|
25
|
+
}
|
|
26
|
+
else if (line.startsWith('@@')) {
|
|
27
|
+
console.log(chalk.cyan(line));
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
console.log(chalk.dim(line));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
console.log('');
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Summarise what would happen without the full diff.
|
|
37
|
+
* Used when a file is newly created (no "before" content).
|
|
38
|
+
*/
|
|
39
|
+
export function printCreateSummary(filename, content) {
|
|
40
|
+
const lines = content.split('\n').length;
|
|
41
|
+
const bytes = Buffer.byteLength(content, 'utf-8');
|
|
42
|
+
console.log(` ${chalk.magenta('DRY')} [CREATE] ${chalk.green(filename)} ` +
|
|
43
|
+
chalk.dim(`(${lines} lines, ${bytes} bytes)`));
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/utils/diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,QAAgB,EAAE,OAAe,EAAE,OAAe;IAC1E,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,QAAQ,GAAG,CAAC,CAAC,CAAC;QACxD,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACzE,MAAM,KAAK,GAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEjC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,QAAQ,KAAK,CAAC,CAAC,CAAC;IAE1D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAChC,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACjC,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/B,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB,EAAE,OAAe;IAClE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IACzC,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG;QAC9D,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,WAAW,KAAK,SAAS,CAAC,CAC9C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Convert 'myPage' or 'MyPage' → 'my-page' */
|
|
2
|
+
export declare function toKebabCase(str: string): string;
|
|
3
|
+
/** Convert 'my-page' or 'myPage' → 'myPage' */
|
|
4
|
+
export declare function toCamelCase(str: string): string;
|
|
5
|
+
/** Convert 'my-page' or 'myPage' → 'MyPage' */
|
|
6
|
+
export declare function toPascalCase(str: string): string;
|
|
7
|
+
/** Convert 'my-page' → 'My Page' */
|
|
8
|
+
export declare function toTitleCase(str: string): string;
|
|
9
|
+
/** Approximate byte size of a string */
|
|
10
|
+
export declare function byteSize(str: string): number;
|
|
11
|
+
//# sourceMappingURL=file-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-utils.d.ts","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAM/C;AAED,+CAA+C;AAC/C,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG/C;AAED,+CAA+C;AAC/C,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGhD;AAED,oCAAoC;AACpC,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK/C;AAED,wCAAwC;AACxC,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE5C"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/** Convert 'myPage' or 'MyPage' → 'my-page' */
|
|
2
|
+
export function toKebabCase(str) {
|
|
3
|
+
return str
|
|
4
|
+
.replace(/([a-z])([A-Z])/g, '$1-$2')
|
|
5
|
+
.replace(/[\s_]+/g, '-')
|
|
6
|
+
.toLowerCase()
|
|
7
|
+
.replace(/[^a-z0-9-]/g, '');
|
|
8
|
+
}
|
|
9
|
+
/** Convert 'my-page' or 'myPage' → 'myPage' */
|
|
10
|
+
export function toCamelCase(str) {
|
|
11
|
+
const kebab = toKebabCase(str);
|
|
12
|
+
return kebab.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
|
|
13
|
+
}
|
|
14
|
+
/** Convert 'my-page' or 'myPage' → 'MyPage' */
|
|
15
|
+
export function toPascalCase(str) {
|
|
16
|
+
const camel = toCamelCase(str);
|
|
17
|
+
return camel.charAt(0).toUpperCase() + camel.slice(1);
|
|
18
|
+
}
|
|
19
|
+
/** Convert 'my-page' → 'My Page' */
|
|
20
|
+
export function toTitleCase(str) {
|
|
21
|
+
return toKebabCase(str)
|
|
22
|
+
.split('-')
|
|
23
|
+
.map(w => w.charAt(0).toUpperCase() + w.slice(1))
|
|
24
|
+
.join(' ');
|
|
25
|
+
}
|
|
26
|
+
/** Approximate byte size of a string */
|
|
27
|
+
export function byteSize(str) {
|
|
28
|
+
return Buffer.byteLength(str, 'utf-8');
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=file-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,OAAO,GAAG;SACP,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC;SACnC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;AAChC,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC/B,OAAO,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AACvE,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC/B,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,OAAO,WAAW,CAAC,GAAG,CAAC;SACpB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAChD,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,OAAO,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC"}
|