@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.
Files changed (103) hide show
  1. package/README.md +218 -0
  2. package/bin/avora.mjs +5 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +64 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/add.command.d.ts +3 -0
  8. package/dist/commands/add.command.d.ts.map +1 -0
  9. package/dist/commands/add.command.js +83 -0
  10. package/dist/commands/add.command.js.map +1 -0
  11. package/dist/commands/config.command.d.ts +3 -0
  12. package/dist/commands/config.command.d.ts.map +1 -0
  13. package/dist/commands/config.command.js +71 -0
  14. package/dist/commands/config.command.js.map +1 -0
  15. package/dist/commands/generate.command.d.ts +3 -0
  16. package/dist/commands/generate.command.d.ts.map +1 -0
  17. package/dist/commands/generate.command.js +258 -0
  18. package/dist/commands/generate.command.js.map +1 -0
  19. package/dist/commands/info.command.d.ts +3 -0
  20. package/dist/commands/info.command.d.ts.map +1 -0
  21. package/dist/commands/info.command.js +92 -0
  22. package/dist/commands/info.command.js.map +1 -0
  23. package/dist/commands/init.command.d.ts +3 -0
  24. package/dist/commands/init.command.d.ts.map +1 -0
  25. package/dist/commands/init.command.js +230 -0
  26. package/dist/commands/init.command.js.map +1 -0
  27. package/dist/commands/new.command.d.ts +3 -0
  28. package/dist/commands/new.command.d.ts.map +1 -0
  29. package/dist/commands/new.command.js +50 -0
  30. package/dist/commands/new.command.js.map +1 -0
  31. package/dist/commands/plugin.command.d.ts +3 -0
  32. package/dist/commands/plugin.command.d.ts.map +1 -0
  33. package/dist/commands/plugin.command.js +153 -0
  34. package/dist/commands/plugin.command.js.map +1 -0
  35. package/dist/commands/remove.command.d.ts +3 -0
  36. package/dist/commands/remove.command.d.ts.map +1 -0
  37. package/dist/commands/remove.command.js +89 -0
  38. package/dist/commands/remove.command.js.map +1 -0
  39. package/dist/registry/amf-config.d.ts +31 -0
  40. package/dist/registry/amf-config.d.ts.map +1 -0
  41. package/dist/registry/amf-config.js +97 -0
  42. package/dist/registry/amf-config.js.map +1 -0
  43. package/dist/registry/meta-registry.d.ts +105 -0
  44. package/dist/registry/meta-registry.d.ts.map +1 -0
  45. package/dist/registry/meta-registry.js +364 -0
  46. package/dist/registry/meta-registry.js.map +1 -0
  47. package/dist/schematics/app/app.schematic.d.ts +3 -0
  48. package/dist/schematics/app/app.schematic.d.ts.map +1 -0
  49. package/dist/schematics/app/app.schematic.js +149 -0
  50. package/dist/schematics/app/app.schematic.js.map +1 -0
  51. package/dist/schematics/form/form.schematic.d.ts +4 -0
  52. package/dist/schematics/form/form.schematic.d.ts.map +1 -0
  53. package/dist/schematics/form/form.schematic.js +100 -0
  54. package/dist/schematics/form/form.schematic.js.map +1 -0
  55. package/dist/schematics/page/page.schematic.d.ts +3 -0
  56. package/dist/schematics/page/page.schematic.d.ts.map +1 -0
  57. package/dist/schematics/page/page.schematic.js +147 -0
  58. package/dist/schematics/page/page.schematic.js.map +1 -0
  59. package/dist/schematics/table/table.schematic.d.ts +3 -0
  60. package/dist/schematics/table/table.schematic.d.ts.map +1 -0
  61. package/dist/schematics/table/table.schematic.js +58 -0
  62. package/dist/schematics/table/table.schematic.js.map +1 -0
  63. package/dist/types/cli.types.d.ts +104 -0
  64. package/dist/types/cli.types.d.ts.map +1 -0
  65. package/dist/types/cli.types.js +3 -0
  66. package/dist/types/cli.types.js.map +1 -0
  67. package/dist/utils/credentials.d.ts +19 -0
  68. package/dist/utils/credentials.d.ts.map +1 -0
  69. package/dist/utils/credentials.js +99 -0
  70. package/dist/utils/credentials.js.map +1 -0
  71. package/dist/utils/diff.d.ts +11 -0
  72. package/dist/utils/diff.d.ts.map +1 -0
  73. package/dist/utils/diff.js +45 -0
  74. package/dist/utils/diff.js.map +1 -0
  75. package/dist/utils/file-utils.d.ts +11 -0
  76. package/dist/utils/file-utils.d.ts.map +1 -0
  77. package/dist/utils/file-utils.js +30 -0
  78. package/dist/utils/file-utils.js.map +1 -0
  79. package/dist/utils/logger.d.ts +21 -0
  80. package/dist/utils/logger.d.ts.map +1 -0
  81. package/dist/utils/logger.js +63 -0
  82. package/dist/utils/logger.js.map +1 -0
  83. package/dist/utils/prompt.d.ts +8 -0
  84. package/dist/utils/prompt.d.ts.map +1 -0
  85. package/dist/utils/prompt.js +63 -0
  86. package/dist/utils/prompt.js.map +1 -0
  87. package/dist/utils/template-engine.d.ts +9 -0
  88. package/dist/utils/template-engine.d.ts.map +1 -0
  89. package/dist/utils/template-engine.js +23 -0
  90. package/dist/utils/template-engine.js.map +1 -0
  91. package/dist/utils/transaction.d.ts +37 -0
  92. package/dist/utils/transaction.d.ts.map +1 -0
  93. package/dist/utils/transaction.js +94 -0
  94. package/dist/utils/transaction.js.map +1 -0
  95. package/package.json +66 -0
  96. package/templates/app/app.component.ts.ejs +9 -0
  97. package/templates/app/app.config.ts.ejs +27 -0
  98. package/templates/app/app.meta.ts.ejs +58 -0
  99. package/templates/app/app.routes.ts.ejs +9 -0
  100. package/templates/app/dashboard.page.ts.ejs +61 -0
  101. package/templates/form/form.meta.ts.ejs +77 -0
  102. package/templates/page/page.meta.ts.ejs +112 -0
  103. package/templates/table/table.meta.ts.ejs +78 -0
@@ -0,0 +1,258 @@
1
+ import { findWorkspaceRoot, loadConfig, resolveApisMetaFile, resolveNavigationMetaFile, isSplitMetaMode, } from '../registry/amf-config.js';
2
+ import { MetaRegistry } from '../registry/meta-registry.js';
3
+ import { generatePage } from '../schematics/page/page.schematic.js';
4
+ import { generateForm } from '../schematics/form/form.schematic.js';
5
+ import { generateTable } from '../schematics/table/table.schematic.js';
6
+ import { logger } from '../utils/logger.js';
7
+ import { printDiff } from '../utils/diff.js';
8
+ import { input, confirm, promptLayout, promptSections, promptNavGroup, } from '../utils/prompt.js';
9
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
10
+ /** Collect repeated --section flags into an array */
11
+ function collect(val, acc) {
12
+ acc.push(val);
13
+ return acc;
14
+ }
15
+ async function requireWorkspace() {
16
+ const root = await findWorkspaceRoot();
17
+ if (!root) {
18
+ logger.error('Not inside an AvoraMetaForge workspace.');
19
+ logger.info('Run "avora new <name>" to scaffold a project first.');
20
+ process.exit(1);
21
+ }
22
+ const config = await loadConfig(root);
23
+ return { root, configPath: `${root}/avora.json`, config };
24
+ }
25
+ // ─── Register ────────────────────────────────────────────────────────────────
26
+ export function registerGenerateCommand(program) {
27
+ const gen = program
28
+ .command('generate')
29
+ .alias('g')
30
+ .description('Generate AMF schematics (page, form, table, api, nav-item)');
31
+ // ── avora generate page ─────────────────────────────────────────────────
32
+ gen
33
+ .command('page [name]')
34
+ .description('Generate a new meta-driven page')
35
+ .option('--layout <layout>', 'Layout type')
36
+ .option('--section <type>', 'Add a section type (repeatable)', collect, [])
37
+ .option('--guard', 'Add auth guard', false)
38
+ .option('--no-nav', 'Do not add to navigation')
39
+ .option('--nav-group <group>', 'Nav group label')
40
+ .option('--nav-icon <icon>', 'Nav icon name')
41
+ .option('--route <path>', 'Custom route path')
42
+ .option('--pagination', 'Enable pagination in table sections', false)
43
+ .option('--dry-run', 'Preview changes without writing')
44
+ .action(async (nameArg, opts) => {
45
+ const ws = await requireWorkspace();
46
+ try {
47
+ const options = await resolvePageOptions(nameArg, opts, ws);
48
+ await generatePage(ws, options);
49
+ }
50
+ catch (err) {
51
+ logger.error('Page generation failed.', err);
52
+ process.exit(1);
53
+ }
54
+ });
55
+ // ── avora generate form ─────────────────────────────────────────────────
56
+ gen
57
+ .command('form [name]')
58
+ .description('Generate a standalone FormMeta definition')
59
+ .option('--layout <layout>', 'Form layout (vertical|horizontal|grid|inline)', 'grid')
60
+ .option('--columns <n>', 'Grid columns', '2')
61
+ .option('--stepper', 'Multi-step wizard form', false)
62
+ .option('--steps <n>', 'Number of steps', '3')
63
+ .option('--api <endpointId>', 'Submit API endpoint ID')
64
+ .option('--fields <string>', 'Fields configuration string, e.g. "name, users[name, email]"')
65
+ .option('--form-id <id>', 'Custom form ID')
66
+ .option('--dry-run', 'Preview without writing')
67
+ .action(async (nameArg, opts) => {
68
+ const ws = await requireWorkspace();
69
+ try {
70
+ const options = await resolveFormOptions(nameArg, opts);
71
+ await generateForm(ws, options);
72
+ }
73
+ catch (err) {
74
+ logger.error('Form generation failed.', err);
75
+ process.exit(1);
76
+ }
77
+ });
78
+ // ── avora generate table ─────────────────────────────────────────────────
79
+ gen
80
+ .command('table [name]')
81
+ .description('Generate a standalone TableMeta definition')
82
+ .option('--api <endpointId>', 'Data API endpoint ID')
83
+ .option('--columns <list>', 'Comma-separated column keys, e.g. "name,email,status"')
84
+ .option('--table-id <id>', 'Custom table ID')
85
+ .option('--dry-run', 'Preview without writing')
86
+ .action(async (nameArg, opts) => {
87
+ const ws = await requireWorkspace();
88
+ try {
89
+ const options = await resolveTableOptions(nameArg, opts);
90
+ await generateTable(ws, options);
91
+ }
92
+ catch (err) {
93
+ logger.error('Table generation failed.', err);
94
+ process.exit(1);
95
+ }
96
+ });
97
+ // ── avora generate api ──────────────────────────────────────────────────
98
+ gen
99
+ .command('api [id]')
100
+ .description('Add an API endpoint to app.meta.ts apis[]')
101
+ .option('--method <method>', 'HTTP method (GET|POST|PUT|PATCH|DELETE)', 'GET')
102
+ .option('--path <path>', 'URL path, e.g. /api/products')
103
+ .option('--mock', 'Use mock data', false)
104
+ .option('--dry-run', 'Preview without writing')
105
+ .action(async (idArg, opts) => {
106
+ const ws = await requireWorkspace();
107
+ try {
108
+ const options = await resolveApiOptions(idArg, opts);
109
+ await generateApi(ws, options);
110
+ }
111
+ catch (err) {
112
+ logger.error('API generation failed.', err);
113
+ process.exit(1);
114
+ }
115
+ });
116
+ // ── avora generate nav-item ─────────────────────────────────────────────
117
+ gen
118
+ .command('nav-item')
119
+ .description('Add a navigation item to app.meta.ts navigation[]')
120
+ .option('--label <label>', 'Display label')
121
+ .option('--route <route>', 'Route path, e.g. /products')
122
+ .option('--icon <icon>', 'Icon name (lucide)')
123
+ .option('--group <group>', 'Nav group label', 'Main')
124
+ .option('--dry-run', 'Preview without writing')
125
+ .action(async (opts) => {
126
+ const ws = await requireWorkspace();
127
+ try {
128
+ const options = await resolveNavItemOptions(opts);
129
+ await generateNavItem(ws, options);
130
+ }
131
+ catch (err) {
132
+ logger.error('Nav item generation failed.', err);
133
+ process.exit(1);
134
+ }
135
+ });
136
+ }
137
+ // ─── Option resolvers (interactive fallbacks) ─────────────────────────────────
138
+ async function resolvePageOptions(nameArg, opts, ws) {
139
+ const name = nameArg ?? await input({ message: 'Page name (e.g. products):' });
140
+ const layout = opts['layout'] ?? await promptLayout(ws.config.defaultLayout);
141
+ const sections = opts['section'].length > 0
142
+ ? opts['section']
143
+ : await promptSections();
144
+ const guard = Boolean(opts['guard']);
145
+ // --nav-group implies nav without prompting; --no-nav is an explicit opt-out
146
+ const navFromFlag = Boolean(opts['navGroup']);
147
+ const nav = navFromFlag
148
+ ? true
149
+ : opts['nav'] !== false &&
150
+ await confirm({ message: 'Add to navigation?', default: true });
151
+ let navGroup;
152
+ let navIcon;
153
+ if (nav) {
154
+ navGroup = opts['navGroup'] ?? await promptNavGroup();
155
+ navIcon = opts['navIcon'] ??
156
+ await input({ message: 'Nav icon name (lucide, leave blank to skip):', default: '' });
157
+ }
158
+ return {
159
+ name,
160
+ layout: layout,
161
+ sections: sections,
162
+ guard,
163
+ nav,
164
+ navGroup,
165
+ navIcon: navIcon || undefined,
166
+ routePath: opts['route'],
167
+ pagination: Boolean(opts['pagination']),
168
+ dryRun: Boolean(opts['dryRun']),
169
+ };
170
+ }
171
+ async function resolveFormOptions(nameArg, opts) {
172
+ const name = nameArg ?? await input({ message: 'Form name (e.g. create-product):' });
173
+ return {
174
+ name,
175
+ formId: opts['formId'],
176
+ layout: opts['layout'] ?? 'grid',
177
+ columns: parseInt(String(opts['columns'] ?? '2'), 10),
178
+ stepper: Boolean(opts['stepper']),
179
+ steps: parseInt(String(opts['steps'] ?? '3'), 10),
180
+ apiEndpoint: opts['api'],
181
+ fields: opts['fields'],
182
+ dryRun: Boolean(opts['dryRun']),
183
+ };
184
+ }
185
+ async function resolveTableOptions(nameArg, opts) {
186
+ const name = nameArg ?? await input({ message: 'Table name (e.g. products):' });
187
+ return {
188
+ name,
189
+ tableId: opts['tableId'],
190
+ api: opts['api'],
191
+ columns: opts['columns'],
192
+ dryRun: Boolean(opts['dryRun']),
193
+ };
194
+ }
195
+ async function resolveApiOptions(idArg, opts) {
196
+ const id = idArg ?? await input({ message: 'API endpoint ID (e.g. list-products):' });
197
+ const apiPath = opts['path'] ??
198
+ await input({ message: 'URL path (e.g. /api/products):' });
199
+ return {
200
+ id,
201
+ method: opts['method'] ?? 'GET',
202
+ path: apiPath,
203
+ mock: Boolean(opts['mock']),
204
+ dryRun: Boolean(opts['dryRun']),
205
+ };
206
+ }
207
+ async function resolveNavItemOptions(opts) {
208
+ const label = opts['label'] ?? await input({ message: 'Nav item label:' });
209
+ const route = opts['route'] ?? await input({ message: 'Route path (e.g. /products):' });
210
+ return {
211
+ label,
212
+ route,
213
+ icon: opts['icon'],
214
+ group: opts['group'] ?? 'Main',
215
+ dryRun: Boolean(opts['dryRun']),
216
+ };
217
+ }
218
+ // ─── Inline generators (api, nav-item — no file creation) ────────────────────
219
+ async function generateApi(ws, options) {
220
+ const metaFile = resolveApisMetaFile(ws.root, ws.config);
221
+ const label = isSplitMetaMode(ws.config) ? 'meta/apis.meta.ts' : 'app.meta.ts';
222
+ const registry = new MetaRegistry(metaFile);
223
+ const before = registry.getCurrentText();
224
+ registry.addApi({
225
+ id: options.id,
226
+ method: options.method,
227
+ path: options.path,
228
+ mock: options.mock,
229
+ });
230
+ if (options.dryRun) {
231
+ logger.header('Dry-run Preview — avora generate api');
232
+ printDiff(label, before, registry.getPendingText());
233
+ logger.info('Run without --dry-run to apply.');
234
+ return;
235
+ }
236
+ await registry.save();
237
+ logger.success(`API endpoint "${options.id}" added to ${label}`);
238
+ }
239
+ async function generateNavItem(ws, options) {
240
+ const metaFile = resolveNavigationMetaFile(ws.root, ws.config);
241
+ const label = isSplitMetaMode(ws.config) ? 'meta/navigation.meta.ts' : 'app.meta.ts';
242
+ const registry = new MetaRegistry(metaFile);
243
+ const before = registry.getCurrentText();
244
+ registry.addNavItem(options.group, {
245
+ label: options.label,
246
+ route: options.route,
247
+ icon: options.icon,
248
+ });
249
+ if (options.dryRun) {
250
+ logger.header('Dry-run Preview — avora generate nav-item');
251
+ printDiff(label, before, registry.getPendingText());
252
+ logger.info('Run without --dry-run to apply.');
253
+ return;
254
+ }
255
+ await registry.save();
256
+ logger.success(`Nav item "${options.label}" added to group "${options.group}" in ${label}`);
257
+ }
258
+ //# sourceMappingURL=generate.command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.command.js","sourceRoot":"","sources":["../../src/commands/generate.command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerInfoCommand(program: Command, cliVersion: string): void;
3
+ //# sourceMappingURL=info.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.command.d.ts","sourceRoot":"","sources":["../../src/commands/info.command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CA4F9E"}
@@ -0,0 +1,92 @@
1
+ import chalk from 'chalk';
2
+ import { findWorkspaceRoot, loadConfig, resolvePagesMetaFile, resolveNavigationMetaFile, resolveApisMetaFile, isSplitMetaMode, } from '../registry/amf-config.js';
3
+ import { MetaRegistry } from '../registry/meta-registry.js';
4
+ import { logger } from '../utils/logger.js';
5
+ import { resolve } from 'node:path';
6
+ import fsExtra from 'fs-extra';
7
+ const { pathExists } = fsExtra;
8
+ export function registerInfoCommand(program, cliVersion) {
9
+ program
10
+ .command('info')
11
+ .description('Display AvoraMetaForge workspace diagnostics')
12
+ .action(async () => {
13
+ const root = await findWorkspaceRoot();
14
+ if (!root) {
15
+ logger.error('Not inside an AvoraMetaForge workspace.');
16
+ logger.info('Run "avora new <name>" to create a project.');
17
+ process.exit(1);
18
+ }
19
+ const config = await loadConfig(root);
20
+ const split = isSplitMetaMode(config);
21
+ const metaFile = resolve(root, config.paths.metaFile);
22
+ let stats;
23
+ try {
24
+ // Helper: load a registry only if its file exists on disk
25
+ const safeReg = async (filePath) => (await pathExists(filePath)) ? new MetaRegistry(filePath) : null;
26
+ if (split) {
27
+ // ── Split mode: count from each dedicated file ──────────────────────
28
+ const pagesReg = await safeReg(resolvePagesMetaFile(root, config));
29
+ const navReg = await safeReg(resolveNavigationMetaFile(root, config));
30
+ const apisReg = await safeReg(resolveApisMetaFile(root, config));
31
+ const rootReg = await safeReg(metaFile);
32
+ // Compute stats — use 0 for any file that doesn't exist yet
33
+ const splitStats = {
34
+ pages: pagesReg?.getTopLevelArrayLength() ?? 0,
35
+ navItems: navReg?.countNavItemsInTopLevel() ?? 0,
36
+ apis: apisReg?.getTopLevelArrayLength() ?? 0,
37
+ };
38
+ // rootReg may not exist on a fresh app (no app.meta.ts yet)
39
+ stats = rootReg
40
+ ? rootReg.getStats(splitStats)
41
+ : { ...splitStats, plugins: 0, defaultLayout: config.defaultLayout, authType: null, builtInAuthUI: false };
42
+ }
43
+ else {
44
+ // ── Legacy mode: everything inline in app.meta.ts ────────────────────
45
+ const registry = await safeReg(metaFile);
46
+ stats = registry ? registry.getStats() : null;
47
+ }
48
+ }
49
+ catch {
50
+ stats = null;
51
+ }
52
+ const w = 48;
53
+ const line = (label, value) => {
54
+ const padded = label.padEnd(26, ' ');
55
+ console.log(` │ ${chalk.dim(padded)}${chalk.white(value)}`);
56
+ };
57
+ logger.nl();
58
+ console.log(' ' + chalk.bold.cyan('┌' + '─'.repeat(w) + '┐'));
59
+ console.log(' ' + chalk.bold.cyan('│') + chalk.bold.whiteBright(' AvoraMetaForge Workspace Info'.padEnd(w)) + chalk.bold.cyan('│'));
60
+ console.log(' ' + chalk.bold.cyan('├' + '─'.repeat(w) + '┤'));
61
+ line('CLI Version:', cliVersion);
62
+ line('Library:', config.library);
63
+ line('Library Version:', config.libraryVersion);
64
+ line('Meta Mode:', split ? chalk.cyan('split (meta/)') : chalk.dim('legacy'));
65
+ line('Default Layout:', stats?.defaultLayout ?? config.defaultLayout);
66
+ line('Auth Type:', stats?.authType ?? '—');
67
+ line('Built-in Auth UI:', stats?.builtInAuthUI ? chalk.green('enabled') : chalk.dim('disabled'));
68
+ console.log(' ' + chalk.bold.cyan('├' + '─'.repeat(w) + '┤'));
69
+ if (stats) {
70
+ line('Pages registered:', String(stats.pages));
71
+ line('API endpoints:', String(stats.apis));
72
+ line('Navigation items:', String(stats.navItems));
73
+ line('Plugins:', String(stats.plugins));
74
+ }
75
+ else {
76
+ console.log(` │ ${chalk.yellow(' Could not read meta files'.padEnd(w - 2))} │`);
77
+ }
78
+ console.log(' ' + chalk.bold.cyan('├' + '─'.repeat(w) + '┤'));
79
+ line('Workspace Root:', root);
80
+ line('Meta File:', config.paths.metaFile);
81
+ if (split) {
82
+ line('Pages Meta:', config.paths.pagesMetaFile ?? '');
83
+ line('Nav Meta:', config.paths.navigationMetaFile ?? '');
84
+ line('APIs Meta:', config.paths.apisMetaFile ?? '');
85
+ }
86
+ line('Pages Dir:', config.paths.pagesDir);
87
+ line('Registry:', config.registry.url ?? config.registry.type);
88
+ console.log(' ' + chalk.bold.cyan('└' + '─'.repeat(w) + '┘'));
89
+ logger.nl();
90
+ });
91
+ }
92
+ //# sourceMappingURL=info.command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.command.js","sourceRoot":"","sources":["../../src/commands/info.command.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,iBAAiB,EACjB,UAAU,EACV,oBAAoB,EACpB,yBAAyB,EACzB,mBAAmB,EACnB,eAAe,GAChB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,OAAO,MAAM,UAAU,CAAC;AAC/B,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;AAE/B,MAAM,UAAU,mBAAmB,CAAC,OAAgB,EAAE,UAAkB;IACtE,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,8CAA8C,CAAC;SAC3D,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,IAAI,GAAG,MAAM,iBAAiB,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;YACxD,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAK,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,KAAK,GAAM,eAAe,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAEtD,IAAI,KAAK,CAAC;QACV,IAAI,CAAC;YACH,0DAA0D;YAC1D,MAAM,OAAO,GAAG,KAAK,EAAE,QAAgB,EAAgC,EAAE,CACvE,CAAC,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAEnE,IAAI,KAAK,EAAE,CAAC;gBACV,uEAAuE;gBACvE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;gBACnE,MAAM,MAAM,GAAK,MAAM,OAAO,CAAC,yBAAyB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;gBACxE,MAAM,OAAO,GAAI,MAAM,OAAO,CAAC,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;gBAClE,MAAM,OAAO,GAAI,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAEzC,4DAA4D;gBAC5D,MAAM,UAAU,GAAG;oBACjB,KAAK,EAAK,QAAQ,EAAE,sBAAsB,EAAE,IAAM,CAAC;oBACnD,QAAQ,EAAE,MAAM,EAAE,uBAAuB,EAAE,IAAO,CAAC;oBACnD,IAAI,EAAM,OAAO,EAAE,sBAAsB,EAAE,IAAO,CAAC;iBACpD,CAAC;gBACF,4DAA4D;gBAC5D,KAAK,GAAG,OAAO;oBACb,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;oBAC9B,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,OAAO,EAAE,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;YAC/G,CAAC;iBAAM,CAAC;gBACN,wEAAwE;gBACxE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACzC,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAChD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,KAAK,GAAG,IAAI,CAAC;QACf,CAAC;QAED,MAAM,CAAC,GAAM,EAAE,CAAC;QAChB,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,KAAa,EAAE,EAAE;YAC5C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAChE,CAAC,CAAC;QAEF,MAAM,CAAC,EAAE,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,iCAAiC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACtI,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAE/D,IAAI,CAAC,cAAc,EAAO,UAAU,CAAC,CAAC;QACtC,IAAI,CAAC,UAAU,EAAW,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,kBAAkB,EAAG,MAAM,CAAC,cAAc,CAAC,CAAC;QACjD,IAAI,CAAC,YAAY,EAAS,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrF,IAAI,CAAC,iBAAiB,EAAI,KAAK,EAAE,aAAa,IAAI,MAAM,CAAC,aAAa,CAAC,CAAC;QACxE,IAAI,CAAC,YAAY,EAAS,KAAK,EAAE,QAAQ,IAAI,GAAG,CAAC,CAAC;QAClD,IAAI,CAAC,mBAAmB,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;QAEjG,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAE/D,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,mBAAmB,EAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAChD,IAAI,CAAC,gBAAgB,EAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/C,IAAI,CAAC,mBAAmB,EAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;YACnD,IAAI,CAAC,UAAU,EAAY,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,CAAC,MAAM,CAAC,6BAA6B,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACtF,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAC/D,IAAI,CAAC,iBAAiB,EAAG,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,YAAY,EAAQ,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,aAAa,EAAO,MAAM,CAAC,KAAK,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;YAC3D,IAAI,CAAC,WAAW,EAAS,MAAM,CAAC,KAAK,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;YAChE,IAAI,CAAC,YAAY,EAAQ,MAAM,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,CAAC,YAAY,EAAQ,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,CAAC,WAAW,EAAS,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEtE,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAC/D,MAAM,CAAC,EAAE,EAAE,CAAC;IACd,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerInitCommand(program: Command): void;
3
+ //# sourceMappingURL=init.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.command.d.ts","sourceRoot":"","sources":["../../src/commands/init.command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAc1D"}
@@ -0,0 +1,230 @@
1
+ import { join, resolve, dirname } from 'node:path';
2
+ import fsExtra from 'fs-extra';
3
+ const { readJson, pathExists, writeFile, ensureDir } = fsExtra;
4
+ import { execSync } from 'node:child_process';
5
+ import { buildDefaultConfig } from '../registry/amf-config.js';
6
+ import { renderTemplate } from '../utils/template-engine.js';
7
+ import { logger } from '../utils/logger.js';
8
+ import { input, select, confirm } from '../utils/prompt.js';
9
+ export function registerInitCommand(program) {
10
+ program
11
+ .command('init')
12
+ .description('Initialize AvoraMetaForge in an existing Angular workspace')
13
+ .option('--project <name>', 'Angular project name inside angular.json')
14
+ .option('--dry-run', 'Preview avora.json without writing')
15
+ .action(async (opts) => {
16
+ try {
17
+ await initWorkspace(opts);
18
+ }
19
+ catch (err) {
20
+ logger.error('Initialization failed.', err);
21
+ process.exit(1);
22
+ }
23
+ });
24
+ }
25
+ async function initWorkspace(opts) {
26
+ logger.header('Initializing AvoraMetaForge Workspace');
27
+ // ── 1. Find workspace root ─────────────────────────────────────────────────
28
+ const root = process.cwd();
29
+ const angularJsonPath = join(root, 'angular.json');
30
+ if (!(await pathExists(angularJsonPath))) {
31
+ throw new Error('No angular.json found in current directory.\n' +
32
+ ' Run "avora init" from the root of an Angular workspace, or\n' +
33
+ ' run "avora new <name>" to scaffold a new project.');
34
+ }
35
+ // ── 2. Guard: already initialized ─────────────────────────────────────────
36
+ const avoraJsonPath = join(root, 'avora.json');
37
+ if (await pathExists(avoraJsonPath)) {
38
+ logger.warning('avora.json already exists at this workspace root.');
39
+ const overwrite = await confirm({ message: 'Overwrite it?', default: false });
40
+ if (!overwrite) {
41
+ logger.info('Aborted.');
42
+ return;
43
+ }
44
+ }
45
+ // ── 3. Detect Angular projects ─────────────────────────────────────────────
46
+ const angularJson = await readJson(angularJsonPath);
47
+ const projects = Object.keys((angularJson['projects'] ?? {}));
48
+ if (!projects.length) {
49
+ throw new Error('No projects found in angular.json.');
50
+ }
51
+ // Filter projects that look like apps (not libraries)
52
+ const appProjects = projects.filter(p => {
53
+ const proj = angularJson['projects'][p];
54
+ return proj['projectType'] === 'application';
55
+ });
56
+ let projectName = opts['project'] ?? '';
57
+ if (!projectName) {
58
+ if (appProjects.length === 1) {
59
+ projectName = appProjects[0];
60
+ logger.info(`Auto-detected project: ${projectName}`);
61
+ }
62
+ else {
63
+ projectName = await select({
64
+ message: 'Select the Angular project to configure:',
65
+ choices: (appProjects.length > 0 ? appProjects : projects).map(p => ({ name: p, value: p })),
66
+ });
67
+ }
68
+ }
69
+ // ── 4. Resolve project paths ───────────────────────────────────────────────
70
+ const projConf = angularJson['projects'][projectName];
71
+ const sourceRoot = String(projConf?.['sourceRoot'] ?? `projects/${projectName}/src`);
72
+ const appDir = `${sourceRoot}/app`;
73
+ const defaultMetaFile = `${appDir}/app.meta.ts`;
74
+ const defaultPagesDir = `${appDir}/pages`;
75
+ const defaultAppConfig = `${appDir}/app.config.ts`;
76
+ const defaultRoutes = `${appDir}/app.routes.ts`;
77
+ logger.nl();
78
+ logger.info('Configuring paths (press Enter to accept defaults):');
79
+ const metaFile = await input({ message: 'Path to app.meta.ts:', default: defaultMetaFile });
80
+ const pagesDir = await input({ message: 'Path to pages/ directory:', default: defaultPagesDir });
81
+ const appConfig = await input({ message: 'Path to app.config.ts:', default: defaultAppConfig });
82
+ // ── 5. Default layout ──────────────────────────────────────────────────────
83
+ const layout = await select({
84
+ message: 'Default layout:',
85
+ default: 'vertical',
86
+ choices: [
87
+ { name: 'vertical — sidebar left (most common)', value: 'vertical' },
88
+ { name: 'horizontal — top nav bar', value: 'horizontal' },
89
+ { name: 'centered — centered card', value: 'centered' },
90
+ { name: 'dashboard-grid — responsive grid', value: 'dashboard-grid' },
91
+ ],
92
+ });
93
+ // ── 5.5. Auth configuration ───────────────────────────────────
94
+ const enableAuth = await confirm({
95
+ message: 'Enable authentication? (adds login page, JWT guard, auth interceptor)',
96
+ default: false,
97
+ });
98
+ // ── 6. Check @avora-labs/meta-forge is installed ──────────────────────────
99
+ const pkgJsonPath = join(root, 'package.json');
100
+ let hasLibrary = false;
101
+ try {
102
+ const pkg = await readJson(pkgJsonPath);
103
+ const deps = { ...(pkg['dependencies'] ?? {}), ...(pkg['devDependencies'] ?? {}) };
104
+ hasLibrary = '@avora-labs/meta-forge' in deps;
105
+ }
106
+ catch { /* ignore */ }
107
+ if (!hasLibrary) {
108
+ const shouldInstall = await confirm({
109
+ message: '@avora-labs/meta-forge not found. Install it now?',
110
+ default: true
111
+ });
112
+ if (shouldInstall) {
113
+ logger.info('Installing @avora-labs/meta-forge...');
114
+ try {
115
+ execSync('npm install @avora-labs/meta-forge', { stdio: 'inherit', cwd: root });
116
+ hasLibrary = true;
117
+ }
118
+ catch (err) {
119
+ logger.error('Failed to install @avora-labs/meta-forge. Please install it manually.');
120
+ }
121
+ }
122
+ else {
123
+ logger.warning('@avora-labs/meta-forge not installed.');
124
+ logger.info(' Run: npm install @avora-labs/meta-forge to install it later.');
125
+ }
126
+ }
127
+ // ── 7. Build config ────────────────────────────────────────────────────────
128
+ const config = buildDefaultConfig({
129
+ appName: projectName,
130
+ projectDir: sourceRoot,
131
+ layout,
132
+ });
133
+ // Override with user-entered paths.
134
+ // Derive split meta paths from the metaFile location — avoids the
135
+ // projectDir double-prefix bug in buildDefaultConfig.
136
+ const metaDir = metaFile.replace(/\/app\.meta\.ts$/, '/meta');
137
+ config.paths = {
138
+ ...config.paths,
139
+ metaFile,
140
+ pagesDir,
141
+ appConfig,
142
+ appRoutesFile: defaultRoutes,
143
+ // Split paths are always relative to where app.meta.ts lives
144
+ pagesMetaFile: `${metaDir}/pages.meta.ts`,
145
+ navigationMetaFile: `${metaDir}/navigation.meta.ts`,
146
+ apisMetaFile: `${metaDir}/apis.meta.ts`,
147
+ };
148
+ // ── 8. Write or preview ────────────────────────────────────────────────────
149
+ if (opts['dryRun']) {
150
+ logger.header('Dry-run Preview — avora init');
151
+ logger.info('Would write avora.json:');
152
+ console.log(JSON.stringify(config, null, 2));
153
+ logger.info('Run without --dry-run to create.');
154
+ return;
155
+ }
156
+ await writeFile(avoraJsonPath, JSON.stringify(config, null, 2), 'utf-8');
157
+ logger.create(avoraJsonPath);
158
+ // ── 9. Auto-wire AMF into the Angular app ────────────────────────────
159
+ logger.nl();
160
+ const shouldWire = await confirm({
161
+ message: 'Scaffold AMF wiring files? (app.meta.ts, app.config.ts, app.routes.ts, app.component.ts, styles.scss)',
162
+ default: true,
163
+ });
164
+ if (shouldWire) {
165
+ const templateVars = {
166
+ appName: projectName,
167
+ layout,
168
+ enableAuth,
169
+ authType: 'jwt',
170
+ builtInAuthUI: enableAuth,
171
+ defaultRoute: 'dashboard',
172
+ };
173
+ const appDir = resolve(root, sourceRoot, 'app');
174
+ const stylesPath = resolve(root, sourceRoot, 'styles.scss');
175
+ // app.meta.ts — only create if missing (preserve existing)
176
+ const appMetaPath = resolve(appDir, 'app.meta.ts');
177
+ if (!(await pathExists(appMetaPath))) {
178
+ const metaContent = await renderTemplate('app/app.meta.ts.ejs', templateVars);
179
+ await ensureDir(dirname(appMetaPath));
180
+ await writeFile(appMetaPath, metaContent, 'utf-8');
181
+ logger.create(appMetaPath);
182
+ }
183
+ else {
184
+ logger.info(' app.meta.ts already exists — skipped.');
185
+ }
186
+ // app.config.ts, app.routes.ts, app.component.ts — overwrite with AMF wired versions
187
+ const configContent = await renderTemplate('app/app.config.ts.ejs', templateVars);
188
+ const routesContent = await renderTemplate('app/app.routes.ts.ejs', templateVars);
189
+ const componentContent = await renderTemplate('app/app.component.ts.ejs', templateVars);
190
+ // Find the root component file (app.component.ts or app.ts)
191
+ let rootComponentFile = 'app.component.ts';
192
+ if (await pathExists(resolve(appDir, 'app.ts')) && !(await pathExists(resolve(appDir, 'app.component.ts')))) {
193
+ rootComponentFile = 'app.ts';
194
+ }
195
+ await writeFile(resolve(appDir, 'app.config.ts'), configContent, 'utf-8');
196
+ logger.update('app.config.ts', '+provideAvoraMetaForge');
197
+ await writeFile(resolve(appDir, 'app.routes.ts'), routesContent, 'utf-8');
198
+ logger.update('app.routes.ts', '+getAmfAuthRoutes');
199
+ await writeFile(resolve(appDir, rootComponentFile), componentContent, 'utf-8');
200
+ logger.update(rootComponentFile, '→ Added LayoutComponent wrapper');
201
+ // If there is an HTML file, also update it so it works if they switch back to templateUrl
202
+ const htmlFiles = ['app.component.html', 'app.html'];
203
+ for (const htmlFile of htmlFiles) {
204
+ const htmlPath = resolve(appDir, htmlFile);
205
+ if (await pathExists(htmlPath)) {
206
+ await writeFile(htmlPath, '<app-layout></app-layout>\n', 'utf-8');
207
+ logger.update(htmlFile, '→ Replaced with <app-layout>');
208
+ }
209
+ }
210
+ // styles.scss — prepend AMF import if not already present
211
+ const amfStyleImport = `@use '@avora-labs/meta-forge/styles/styles' as *;\n`;
212
+ const existingStyles = (await pathExists(stylesPath))
213
+ ? await fsExtra.readFile(stylesPath, 'utf-8') : '';
214
+ if (!existingStyles.includes('@avora-labs/meta-forge')) {
215
+ await writeFile(stylesPath, amfStyleImport + existingStyles, 'utf-8');
216
+ logger.update('styles.scss', '+@avora-labs/meta-forge styles');
217
+ }
218
+ }
219
+ logger.nl();
220
+ logger.success('AvoraMetaForge workspace initialized!');
221
+ logger.nl();
222
+ logger.info('Next steps:');
223
+ if (!hasLibrary)
224
+ logger.info(' npm install @avora-labs/meta-forge');
225
+ if (!shouldWire)
226
+ logger.info(' Wire app.meta.ts, app.config.ts, app.routes.ts manually');
227
+ logger.info(' ng serve');
228
+ logger.info(' avora generate page dashboard \u2190 scaffold your first page');
229
+ }
230
+ //# sourceMappingURL=init.command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.command.js","sourceRoot":"","sources":["../../src/commands/init.command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,OAAO,MAAM,UAAU,CAAC;AAC/B,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAG5D,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,4DAA4D,CAAC;SACzE,MAAM,CAAC,kBAAkB,EAAE,0CAA0C,CAAC;SACtE,MAAM,CAAC,WAAW,EAAS,oCAAoC,CAAC;SAChE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAA6B;IACxD,MAAM,CAAC,MAAM,CAAC,uCAAuC,CAAC,CAAC;IAEvD,8EAA8E;IAC9E,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC3B,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAEnD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CACb,+CAA+C;YAC/C,gEAAgE;YAChE,qDAAqD,CACtD,CAAC;IACJ,CAAC;IAED,6EAA6E;IAC7E,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAC/C,IAAI,MAAM,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QACpC,MAAM,CAAC,OAAO,CAAC,mDAAmD,CAAC,CAAC;QACpE,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9E,IAAI,CAAC,SAAS,EAAE,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;IACtD,CAAC;IAED,8EAA8E;IAC9E,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,eAAe,CAA4B,CAAC;IAC/E,MAAM,QAAQ,GAAM,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,EAAE,CAAW,CAAC,CAAC;IAE3E,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IAED,sDAAsD;IACtD,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;QACtC,MAAM,IAAI,GAAI,WAAW,CAAC,UAAU,CAA6B,CAAC,CAAC,CAA4B,CAAC;QAChG,OAAQ,IAAI,CAAC,aAAa,CAAY,KAAK,aAAa,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,IAAI,WAAW,GAAY,IAAI,CAAC,SAAS,CAAY,IAAI,EAAE,CAAC;IAC5D,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,0BAA0B,WAAW,EAAE,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,WAAW,GAAG,MAAM,MAAM,CAAS;gBACjC,OAAO,EAAE,0CAA0C;gBACnD,OAAO,EAAE,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;aAC7F,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,MAAM,QAAQ,GAAK,WAAW,CAAC,UAAU,CAA6B,CAAC,WAAW,CAA4B,CAAC;IAC/G,MAAM,UAAU,GAAG,MAAM,CAAE,QAAQ,EAAE,CAAC,YAAY,CAAY,IAAI,YAAY,WAAW,MAAM,CAAC,CAAC;IACjG,MAAM,MAAM,GAAM,GAAG,UAAU,MAAM,CAAC;IAEtC,MAAM,eAAe,GAAI,GAAG,MAAM,cAAc,CAAC;IACjD,MAAM,eAAe,GAAI,GAAG,MAAM,QAAQ,CAAC;IAC3C,MAAM,gBAAgB,GAAG,GAAG,MAAM,gBAAgB,CAAC;IACnD,MAAM,aAAa,GAAM,GAAG,MAAM,gBAAgB,CAAC;IAEnD,MAAM,CAAC,EAAE,EAAE,CAAC;IACZ,MAAM,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IAEnE,MAAM,QAAQ,GAAI,MAAM,KAAK,CAAC,EAAE,OAAO,EAAE,sBAAsB,EAAK,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;IAChG,MAAM,QAAQ,GAAI,MAAM,KAAK,CAAC,EAAE,OAAO,EAAE,2BAA2B,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;IAClG,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,EAAE,OAAO,EAAE,wBAAwB,EAAG,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAEjG,8EAA8E;IAC9E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAa;QACtC,OAAO,EAAE,iBAAiB;QAC1B,OAAO,EAAE,UAAU;QACnB,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,yCAAyC,EAAE,KAAK,EAAE,UAAU,EAAE;YACtE,EAAE,IAAI,EAAE,0BAA0B,EAAiB,KAAK,EAAE,YAAY,EAAE;YACxE,EAAE,IAAI,EAAE,4BAA4B,EAAe,KAAK,EAAE,UAAU,EAAE;YACtE,EAAE,IAAI,EAAE,kCAAkC,EAAS,KAAK,EAAE,gBAAgB,EAAE;SAC7E;KACF,CAAC,CAAC;IAEH,iEAAiE;IACjE,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC;QAC/B,OAAO,EAAE,uEAAuE;QAChF,OAAO,EAAE,KAAK;KACf,CAAC,CAAC;IAEH,6EAA6E;IAC7E,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAC/C,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,WAAW,CAA4B,CAAC;QACnE,MAAM,IAAI,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,EAA4B,CAAC;QAC7G,UAAU,GAAG,wBAAwB,IAAI,IAAI,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAExB,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC;YAClC,OAAO,EAAE,mDAAmD;YAC5D,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QACH,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;YACpD,IAAI,CAAC;gBACH,QAAQ,CAAC,oCAAoC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;gBAChF,UAAU,GAAG,IAAI,CAAC;YACpB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAC;YACxF,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC;YACxD,MAAM,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,MAAM,MAAM,GAAG,kBAAkB,CAAC;QAChC,OAAO,EAAK,WAAW;QACvB,UAAU,EAAE,UAAU;QACtB,MAAM;KACP,CAAC,CAAC;IAEH,oCAAoC;IACpC,kEAAkE;IAClE,sDAAsD;IACtD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IAC9D,MAAM,CAAC,KAAK,GAAG;QACb,GAAG,MAAM,CAAC,KAAK;QACf,QAAQ;QACR,QAAQ;QACR,SAAS;QACT,aAAa,EAAO,aAAa;QACjC,6DAA6D;QAC7D,aAAa,EAAO,GAAG,OAAO,gBAAgB;QAC9C,kBAAkB,EAAE,GAAG,OAAO,qBAAqB;QACnD,YAAY,EAAQ,GAAG,OAAO,eAAe;KAC9C,CAAC;IAEF,8EAA8E;IAC9E,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnB,MAAM,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IAED,MAAM,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACzE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAE7B,wEAAwE;IACxE,MAAM,CAAC,EAAE,EAAE,CAAC;IACZ,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC;QAC/B,OAAO,EAAE,uGAAuG;QAChH,OAAO,EAAE,IAAI;KACd,CAAC,CAAC;IAEH,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,YAAY,GAAG;YACnB,OAAO,EAAQ,WAAW;YAC1B,MAAM;YACN,UAAU;YACV,QAAQ,EAAO,KAAK;YACpB,aAAa,EAAE,UAAU;YACzB,YAAY,EAAG,WAAW;SAC3B,CAAC;QAEF,MAAM,MAAM,GAAO,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QACpD,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;QAE5D,2DAA2D;QAC3D,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QACnD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;YACrC,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,qBAAqB,EAAE,YAAY,CAAC,CAAC;YAC9E,MAAM,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;YACtC,MAAM,SAAS,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QACzD,CAAC;QAED,qFAAqF;QACrF,MAAM,aAAa,GAAM,MAAM,cAAc,CAAC,uBAAuB,EAAK,YAAY,CAAC,CAAC;QACxF,MAAM,aAAa,GAAM,MAAM,cAAc,CAAC,uBAAuB,EAAK,YAAY,CAAC,CAAC;QACxF,MAAM,gBAAgB,GAAG,MAAM,cAAc,CAAC,0BAA0B,EAAE,YAAY,CAAC,CAAC;QAExF,4DAA4D;QAC5D,IAAI,iBAAiB,GAAG,kBAAkB,CAAC;QAC3C,IAAI,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5G,iBAAiB,GAAG,QAAQ,CAAC;QAC/B,CAAC;QAED,MAAM,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,EAAK,aAAa,EAAK,OAAO,CAAC,CAAC;QAChF,MAAM,CAAC,MAAM,CAAC,eAAe,EAAK,wBAAwB,CAAC,CAAC;QAC5D,MAAM,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,EAAK,aAAa,EAAK,OAAO,CAAC,CAAC;QAChF,MAAM,CAAC,MAAM,CAAC,eAAe,EAAK,mBAAmB,CAAC,CAAC;QACvD,MAAM,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC;QAC/E,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,iCAAiC,CAAC,CAAC;QAEpE,0FAA0F;QAC1F,MAAM,SAAS,GAAG,CAAC,oBAAoB,EAAE,UAAU,CAAC,CAAC;QACrD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC3C,IAAI,MAAM,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC/B,MAAM,SAAS,CAAC,QAAQ,EAAE,6BAA6B,EAAE,OAAO,CAAC,CAAC;gBAClE,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,8BAA8B,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QAED,0DAA0D;QAC1D,MAAM,cAAc,GAAG,qDAAqD,CAAC;QAC7E,MAAM,cAAc,GAAG,CAAC,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;YACnD,CAAC,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,CAAC;YACvD,MAAM,SAAS,CAAC,UAAU,EAAE,cAAc,GAAG,cAAc,EAAE,OAAO,CAAC,CAAC;YACtE,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,gCAAgC,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED,MAAM,CAAC,EAAE,EAAE,CAAC;IACZ,MAAM,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC;IACxD,MAAM,CAAC,EAAE,EAAE,CAAC;IACZ,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC3B,IAAI,CAAC,UAAU;QAAE,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACrE,IAAI,CAAC,UAAU;QAAG,MAAM,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;IAC3F,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC1B,MAAM,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;AACjF,CAAC"}