@kernlang/vue 3.1.5 → 3.1.6

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.
@@ -0,0 +1,540 @@
1
+ /**
2
+ * KERN Structure Planner for Vue
3
+ *
4
+ * Adapts React's structure planner for Vue conventions:
5
+ * - .vue files instead of .tsx
6
+ * - composables/ instead of hooks/
7
+ * - ref() / computed() instead of useState / useMemo
8
+ * - Barrel exports use .ts (plain TS, not SFC)
9
+ *
10
+ * Supports: bulletproof, atomic, kern, flat patterns.
11
+ */
12
+ // ── Node Classification ──────────────────────────────────────────────────
13
+ const SURFACE_TYPES = new Set(['screen', 'page', 'modal']);
14
+ const BLOCK_TYPES = new Set(['card', 'section', 'form', 'list', 'grid', 'tabs']);
15
+ const CONTAINER_TYPES = new Set(['row', 'col']);
16
+ const ELEMENT_TYPES = new Set(['text', 'button', 'input', 'textarea', 'progress', 'separator', 'divider', 'image', 'icon', 'svg', 'link', 'slider', 'toggle', 'tab', 'item', 'component']);
17
+ const GROUND_LAYER_TYPES = new Set([
18
+ 'derive', 'transform', 'action', 'guard', 'assume', 'invariant',
19
+ 'each', 'collect', 'branch', 'resolve', 'expect', 'recover',
20
+ 'pattern', 'apply',
21
+ ]);
22
+ export function classifyNode(node) {
23
+ if (node.type === 'state')
24
+ return 'state';
25
+ if (node.type === 'logic' || node.type === 'handler')
26
+ return 'logic';
27
+ if (node.type === 'theme')
28
+ return 'theme';
29
+ if (node.type === 'metadata')
30
+ return 'meta';
31
+ if (GROUND_LAYER_TYPES.has(node.type))
32
+ return 'logic';
33
+ if (SURFACE_TYPES.has(node.type))
34
+ return 'surface';
35
+ if (BLOCK_TYPES.has(node.type))
36
+ return 'block';
37
+ if (CONTAINER_TYPES.has(node.type))
38
+ return 'container';
39
+ if (ELEMENT_TYPES.has(node.type))
40
+ return 'element';
41
+ return 'element';
42
+ }
43
+ // ── Component Name Helpers ───────────────────────────────────────────────
44
+ function getNodeName(node) {
45
+ const name = node.props?.name;
46
+ if (name)
47
+ return name;
48
+ return node.type.charAt(0).toUpperCase() + node.type.slice(1);
49
+ }
50
+ function getFeatureName(root) {
51
+ return root.props?.name || 'Component';
52
+ }
53
+ function toComponentName(base, featureName, hasExplicitName) {
54
+ if (hasExplicitName)
55
+ return base;
56
+ const generic = ['Card', 'Section', 'Form', 'List', 'Grid', 'Tabs', 'Modal'];
57
+ if (generic.includes(base)) {
58
+ return `${featureName}${base}`;
59
+ }
60
+ return base;
61
+ }
62
+ function toCamelCase(name) {
63
+ return name.charAt(0).toLowerCase() + name.slice(1);
64
+ }
65
+ // ── Deduplication ────────────────────────────────────────────────────────
66
+ function deduplicateName(name, usedNames) {
67
+ if (!usedNames.has(name)) {
68
+ usedNames.add(name);
69
+ return name;
70
+ }
71
+ let idx = 2;
72
+ while (usedNames.has(`${name}${idx}`))
73
+ idx++;
74
+ const deduped = `${name}${idx}`;
75
+ usedNames.add(deduped);
76
+ return deduped;
77
+ }
78
+ function collectExtractableNodes(root) {
79
+ const result = {
80
+ stateNodes: [],
81
+ logicNodes: [],
82
+ blockNodes: [],
83
+ themeNodes: [],
84
+ remainingChildren: [],
85
+ };
86
+ for (const child of root.children || []) {
87
+ const role = classifyNode(child);
88
+ switch (role) {
89
+ case 'state':
90
+ result.stateNodes.push(child);
91
+ break;
92
+ case 'logic':
93
+ result.logicNodes.push(child);
94
+ break;
95
+ case 'block':
96
+ result.blockNodes.push(child);
97
+ break;
98
+ case 'theme':
99
+ result.themeNodes.push(child);
100
+ break;
101
+ default:
102
+ result.remainingChildren.push(child);
103
+ break;
104
+ }
105
+ }
106
+ return result;
107
+ }
108
+ // ── Composable Extraction ────────────────────────────────────────────────
109
+ export function extractComposables(featureName, stateNodes, logicNodes, composablesDir) {
110
+ const composables = [];
111
+ if (stateNodes.length > 0) {
112
+ const stateDecls = stateNodes.map(n => ({
113
+ name: n.props?.name || 'value',
114
+ initial: String(n.props?.initial ?? ''),
115
+ }));
116
+ const returnedValues = [];
117
+ for (const s of stateDecls) {
118
+ returnedValues.push(s.name);
119
+ }
120
+ composables.push({
121
+ composableName: `use${featureName}State`,
122
+ path: `${composablesDir}/use${featureName}State.ts`,
123
+ stateDecls,
124
+ logicBlocks: [],
125
+ returnedValues,
126
+ importedBy: [],
127
+ });
128
+ }
129
+ if (logicNodes.length > 0) {
130
+ const logicBlocks = logicNodes.map(n => n.props?.code || '');
131
+ const returnedValues = [];
132
+ const allCode = logicBlocks.join('\n');
133
+ const fnMatches = allCode.match(/(?:const|function)\s+(\w+)/g);
134
+ if (fnMatches) {
135
+ for (const m of fnMatches) {
136
+ const name = m.replace(/^(?:const|function)\s+/, '');
137
+ returnedValues.push(name);
138
+ }
139
+ }
140
+ composables.push({
141
+ composableName: `use${featureName}Logic`,
142
+ path: `${composablesDir}/use${featureName}Logic.ts`,
143
+ stateDecls: [],
144
+ logicBlocks,
145
+ returnedValues,
146
+ importedBy: [],
147
+ });
148
+ }
149
+ return composables;
150
+ }
151
+ // ── Generate Composable File Content ─────────────────────────────────────
152
+ export function generateStateComposableCode(composable) {
153
+ const lines = [];
154
+ lines.push(`import { ref } from 'vue';`);
155
+ lines.push('');
156
+ lines.push(`export function ${composable.composableName}() {`);
157
+ for (const s of composable.stateDecls) {
158
+ const init = s.initial === 'true' ? 'true'
159
+ : s.initial === 'false' ? 'false'
160
+ : s.initial === '' ? "''"
161
+ : isNaN(Number(s.initial)) ? `'${s.initial}'`
162
+ : s.initial;
163
+ lines.push(` const ${s.name} = ref(${init});`);
164
+ }
165
+ lines.push('');
166
+ lines.push(` return { ${composable.returnedValues.join(', ')} };`);
167
+ lines.push('}');
168
+ return lines.join('\n');
169
+ }
170
+ export function generateLogicComposableCode(composable, stateComposableName) {
171
+ const lines = [];
172
+ // Detect needed Vue imports
173
+ const allCode = composable.logicBlocks.join('\n');
174
+ const vueImports = [];
175
+ if (allCode.includes('watch'))
176
+ vueImports.push('watch');
177
+ if (allCode.includes('computed'))
178
+ vueImports.push('computed');
179
+ if (allCode.includes('onMounted'))
180
+ vueImports.push('onMounted');
181
+ if (allCode.includes('ref'))
182
+ vueImports.push('ref');
183
+ if (vueImports.length > 0) {
184
+ lines.push(`import { ${vueImports.sort().join(', ')} } from 'vue';`);
185
+ }
186
+ if (stateComposableName) {
187
+ lines.push(`import { ${stateComposableName} } from './${stateComposableName}';`);
188
+ }
189
+ if (vueImports.length > 0 || stateComposableName) {
190
+ lines.push('');
191
+ }
192
+ lines.push(`export function ${composable.composableName}() {`);
193
+ if (stateComposableName) {
194
+ lines.push(` const state = ${stateComposableName}();`);
195
+ }
196
+ for (const block of composable.logicBlocks) {
197
+ for (const line of block.split('\n')) {
198
+ lines.push(` ${line}`);
199
+ }
200
+ lines.push('');
201
+ }
202
+ if (composable.returnedValues.length > 0) {
203
+ lines.push(` return { ${composable.returnedValues.join(', ')} };`);
204
+ }
205
+ lines.push('}');
206
+ return lines.join('\n');
207
+ }
208
+ // ── Generate Types File Content ──────────────────────────────────────────
209
+ export function generateTypesCode(featureName, stateDecls) {
210
+ const lines = [];
211
+ lines.push(`import type { Ref } from 'vue';`);
212
+ lines.push('');
213
+ lines.push(`export interface ${featureName}State {`);
214
+ for (const s of stateDecls) {
215
+ const tsType = s.initial === 'true' || s.initial === 'false' ? 'boolean'
216
+ : !isNaN(Number(s.initial)) && s.initial !== '' ? 'number'
217
+ : 'string';
218
+ lines.push(` ${s.name}: Ref<${tsType}>;`);
219
+ }
220
+ lines.push('}');
221
+ return lines.join('\n');
222
+ }
223
+ // ── Generate Barrel Export Content ────────────────────────────────────────
224
+ export function generateBarrelCode(barrel) {
225
+ return barrel.exports
226
+ .map(e => `export { ${e.name} } from '${e.from}';`)
227
+ .join('\n');
228
+ }
229
+ // ── Pattern Planners ─────────────────────────────────────────────────────
230
+ function planBulletproof(root) {
231
+ const featureName = getFeatureName(root);
232
+ const featureDir = `features/${toCamelCase(featureName)}`;
233
+ const { stateNodes, logicNodes, blockNodes, themeNodes } = collectExtractableNodes(root);
234
+ const usedNames = new Set();
235
+ const files = [];
236
+ // Entry component
237
+ files.push({
238
+ path: `${featureDir}/index.vue`,
239
+ artifactType: 'entry',
240
+ nodes: [root],
241
+ rootNode: root,
242
+ dependsOn: [],
243
+ isEntry: true,
244
+ });
245
+ // Block components → components/
246
+ for (const block of blockNodes) {
247
+ const rawName = getNodeName(block);
248
+ const hasExplicitName = !!(block.props?.name);
249
+ const compName = deduplicateName(toComponentName(rawName, featureName, hasExplicitName), usedNames);
250
+ files.push({
251
+ path: `${featureDir}/components/${compName}.vue`,
252
+ artifactType: 'component',
253
+ nodes: [block],
254
+ rootNode: block,
255
+ dependsOn: [`${featureDir}/index.vue`],
256
+ isEntry: false,
257
+ componentName: compName,
258
+ });
259
+ }
260
+ // Composables (Vue equivalent of hooks)
261
+ const composables = extractComposables(featureName, stateNodes, logicNodes, `${featureDir}/composables`);
262
+ for (const composable of composables) {
263
+ files.push({
264
+ path: composable.path,
265
+ artifactType: 'hook',
266
+ nodes: composable.stateDecls.length > 0 ? stateNodes : logicNodes,
267
+ rootNode: root,
268
+ dependsOn: [],
269
+ isEntry: false,
270
+ });
271
+ }
272
+ // Types
273
+ if (stateNodes.length > 0) {
274
+ files.push({
275
+ path: `${featureDir}/types/${toCamelCase(featureName)}.types.ts`,
276
+ artifactType: 'types',
277
+ nodes: stateNodes,
278
+ rootNode: root,
279
+ dependsOn: [],
280
+ isEntry: false,
281
+ });
282
+ }
283
+ // Theme
284
+ if (themeNodes.length > 0) {
285
+ files.push({
286
+ path: `${featureDir}/theme.ts`,
287
+ artifactType: 'theme',
288
+ nodes: themeNodes,
289
+ rootNode: root,
290
+ dependsOn: [],
291
+ isEntry: false,
292
+ });
293
+ }
294
+ // Barrel
295
+ const barrels = [{
296
+ path: `${featureDir}/barrel.ts`,
297
+ exports: [{ name: featureName, from: './index' }],
298
+ }];
299
+ // Wire up dependencies
300
+ const entryFile = files[0];
301
+ const componentPaths = files.filter(f => f.artifactType === 'component').map(f => f.path);
302
+ const composablePaths = files.filter(f => f.artifactType === 'hook').map(f => f.path);
303
+ entryFile.dependsOn = [...componentPaths, ...composablePaths];
304
+ return { files, barrels };
305
+ }
306
+ function planAtomic(root) {
307
+ const featureName = getFeatureName(root);
308
+ const { stateNodes, logicNodes, blockNodes, themeNodes, remainingChildren } = collectExtractableNodes(root);
309
+ const usedNames = new Set();
310
+ const files = [];
311
+ // Page → pages/
312
+ files.push({
313
+ path: `pages/${featureName}Page.vue`,
314
+ artifactType: 'page',
315
+ nodes: [root],
316
+ rootNode: root,
317
+ dependsOn: [],
318
+ isEntry: true,
319
+ });
320
+ // Template → templates/
321
+ files.push({
322
+ path: `templates/${featureName}Template.vue`,
323
+ artifactType: 'template',
324
+ nodes: [root],
325
+ rootNode: root,
326
+ dependsOn: [],
327
+ isEntry: false,
328
+ });
329
+ // Blocks → organisms/
330
+ for (const block of blockNodes) {
331
+ const rawName = getNodeName(block);
332
+ const hasExplicitName = !!(block.props?.name);
333
+ const compName = deduplicateName(toComponentName(rawName, featureName, hasExplicitName), usedNames);
334
+ files.push({
335
+ path: `organisms/${compName}.vue`,
336
+ artifactType: 'component',
337
+ nodes: [block],
338
+ rootNode: block,
339
+ dependsOn: [],
340
+ isEntry: false,
341
+ componentName: compName,
342
+ });
343
+ }
344
+ // Containers → molecules, elements → atoms
345
+ const molecules = [];
346
+ const atoms = [];
347
+ for (const child of remainingChildren) {
348
+ const role = classifyNode(child);
349
+ if (role === 'container' && child.children && child.children.length > 0) {
350
+ molecules.push(child);
351
+ }
352
+ else if (role === 'element') {
353
+ atoms.push(child);
354
+ }
355
+ }
356
+ for (const block of blockNodes) {
357
+ if (block.children) {
358
+ for (const child of block.children) {
359
+ const role = classifyNode(child);
360
+ if (role === 'element' && child.props?.name) {
361
+ atoms.push(child);
362
+ }
363
+ }
364
+ }
365
+ }
366
+ for (const mol of molecules) {
367
+ const rawName = getNodeName(mol);
368
+ const compName = deduplicateName(rawName, usedNames);
369
+ files.push({
370
+ path: `molecules/${compName}.vue`,
371
+ artifactType: 'component',
372
+ nodes: [mol],
373
+ rootNode: mol,
374
+ dependsOn: [],
375
+ isEntry: false,
376
+ componentName: compName,
377
+ });
378
+ }
379
+ for (const atom of atoms) {
380
+ if (!atom.props?.name)
381
+ continue;
382
+ const rawName = getNodeName(atom);
383
+ const compName = deduplicateName(rawName, usedNames);
384
+ files.push({
385
+ path: `atoms/${compName}.vue`,
386
+ artifactType: 'component',
387
+ nodes: [atom],
388
+ rootNode: atom,
389
+ dependsOn: [],
390
+ isEntry: false,
391
+ componentName: compName,
392
+ });
393
+ }
394
+ // Composables
395
+ const composables = extractComposables(featureName, stateNodes, logicNodes, 'composables');
396
+ for (const composable of composables) {
397
+ files.push({
398
+ path: composable.path,
399
+ artifactType: 'hook',
400
+ nodes: composable.stateDecls.length > 0 ? stateNodes : logicNodes,
401
+ rootNode: root,
402
+ dependsOn: [],
403
+ isEntry: false,
404
+ });
405
+ }
406
+ // Types
407
+ if (stateNodes.length > 0) {
408
+ files.push({
409
+ path: `types/${toCamelCase(featureName)}.types.ts`,
410
+ artifactType: 'types',
411
+ nodes: stateNodes,
412
+ rootNode: root,
413
+ dependsOn: [],
414
+ isEntry: false,
415
+ });
416
+ }
417
+ // Theme
418
+ if (themeNodes.length > 0) {
419
+ files.push({
420
+ path: `theme/${toCamelCase(featureName)}.theme.ts`,
421
+ artifactType: 'theme',
422
+ nodes: themeNodes,
423
+ rootNode: root,
424
+ dependsOn: [],
425
+ isEntry: false,
426
+ });
427
+ }
428
+ return { files, barrels: [] };
429
+ }
430
+ function planKern(root) {
431
+ const featureName = getFeatureName(root);
432
+ const { stateNodes, logicNodes, blockNodes, themeNodes } = collectExtractableNodes(root);
433
+ const usedNames = new Set();
434
+ const files = [];
435
+ // Surface
436
+ files.push({
437
+ path: `surfaces/${featureName}.surface.vue`,
438
+ artifactType: 'entry',
439
+ nodes: [root],
440
+ rootNode: root,
441
+ dependsOn: [],
442
+ isEntry: true,
443
+ });
444
+ // Blocks
445
+ for (const block of blockNodes) {
446
+ const rawName = getNodeName(block);
447
+ const hasExplicitName = !!(block.props?.name);
448
+ const compName = deduplicateName(toComponentName(rawName, featureName, hasExplicitName), usedNames);
449
+ files.push({
450
+ path: `blocks/${compName}.block.vue`,
451
+ artifactType: 'component',
452
+ nodes: [block],
453
+ rootNode: block,
454
+ dependsOn: [],
455
+ isEntry: false,
456
+ componentName: compName,
457
+ });
458
+ }
459
+ // Signals (composables for state + logic)
460
+ if (stateNodes.length > 0 || logicNodes.length > 0) {
461
+ const composables = extractComposables(featureName, stateNodes, logicNodes, 'signals');
462
+ for (const composable of composables) {
463
+ files.push({
464
+ path: composable.path,
465
+ artifactType: 'hook',
466
+ nodes: composable.stateDecls.length > 0 ? stateNodes : logicNodes,
467
+ rootNode: root,
468
+ dependsOn: [],
469
+ isEntry: false,
470
+ });
471
+ }
472
+ }
473
+ // Tokens (theme)
474
+ if (themeNodes.length > 0) {
475
+ files.push({
476
+ path: `tokens/${toCamelCase(featureName)}.tokens.ts`,
477
+ artifactType: 'theme',
478
+ nodes: themeNodes,
479
+ rootNode: root,
480
+ dependsOn: [],
481
+ isEntry: false,
482
+ });
483
+ }
484
+ // Models (types)
485
+ if (stateNodes.length > 0) {
486
+ files.push({
487
+ path: `models/${toCamelCase(featureName)}.model.ts`,
488
+ artifactType: 'types',
489
+ nodes: stateNodes,
490
+ rootNode: root,
491
+ dependsOn: [],
492
+ isEntry: false,
493
+ });
494
+ }
495
+ return { files, barrels: [] };
496
+ }
497
+ // ── Nuxt Adapter ─────────────────────────────────────────────────────────
498
+ export function adaptPlanForNuxt(plan, root) {
499
+ const isLayout = root.type === 'layout';
500
+ const isError = root.type === 'error';
501
+ for (const file of plan.files) {
502
+ if (file.isEntry) {
503
+ if (isLayout)
504
+ file.path = file.path.replace(/index\.vue$|[^/]+\.surface\.vue$|[^/]+Page\.vue$/, 'layout.vue');
505
+ else if (isError)
506
+ file.path = file.path.replace(/index\.vue$|[^/]+\.surface\.vue$|[^/]+Page\.vue$/, 'error.vue');
507
+ else {
508
+ if (!file.path.includes('index.vue')) {
509
+ file.path = file.path.replace(/[^/]+\.surface\.vue$|[^/]+Page\.vue$/, 'page.vue');
510
+ }
511
+ }
512
+ }
513
+ }
514
+ return plan;
515
+ }
516
+ // ── Main Planner ─────────────────────────────────────────────────────────
517
+ export function planVueStructure(root, config) {
518
+ const structure = config.structure;
519
+ if (structure === 'flat')
520
+ return null;
521
+ let plan;
522
+ switch (structure) {
523
+ case 'bulletproof':
524
+ plan = planBulletproof(root);
525
+ break;
526
+ case 'atomic':
527
+ plan = planAtomic(root);
528
+ break;
529
+ case 'kern':
530
+ plan = planKern(root);
531
+ break;
532
+ default:
533
+ return null;
534
+ }
535
+ if (config.target === 'nuxt') {
536
+ plan = adaptPlanForNuxt(plan, root);
537
+ }
538
+ return plan;
539
+ }
540
+ //# sourceMappingURL=structure-vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structure-vue.js","sourceRoot":"","sources":["../src/structure-vue.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,7 @@
9
9
  * - Auto-imports assumed (no explicit 'import { ref } from "vue"')
10
10
  * - Uses Nuxt composables: useHead, useRoute, navigateTo
11
11
  */
12
- import { expandStyles, countTokens, serializeIR, cssPropertyName, getProps, getStyles, getThemeRefs, buildDiagnostics, accountNode } from '@kernlang/core';
12
+ import { expandStyles, countTokens, serializeIR, cssPropertyName, camelKey, escapeJsString, getProps, getStyles, getThemeRefs, buildDiagnostics, accountNode } from '@kernlang/core';
13
13
  // ── Node → HTML Element Mapping (same as Vue) ───────────────────────────
14
14
  const NODE_TO_ELEMENT = {
15
15
  screen: 'div',
@@ -85,8 +85,13 @@ function createBuilder(config) {
85
85
  hasHead: false,
86
86
  headMeta: {},
87
87
  config,
88
+ i18nEnabled: config?.i18n?.enabled ?? false,
88
89
  };
89
90
  }
91
+ // ── i18n helper ──────────────────────────────────────────────────────────
92
+ function tText(ctx, key, value) {
93
+ return ctx.i18nEnabled ? `{{ $t('${escapeJsString(key)}', '${escapeJsString(value)}') }}` : value;
94
+ }
90
95
  // ── Theme Collection ─────────────────────────────────────────────────────
91
96
  function collectThemes(node, ctx) {
92
97
  if (node.type === 'theme' && node.props?.styles) {
@@ -207,12 +212,21 @@ function addProgressAttrs(props, attrs) {
207
212
  function renderTextContent(props, ctx, indent) {
208
213
  if (!props.value)
209
214
  return;
210
- const val = props.value;
211
- if (typeof val === 'string' && val.startsWith('{{') && val.endsWith('}}')) {
215
+ const rawVal = props.value;
216
+ // Expression object: { __expr: true, code: "count" } → {{ count }}
217
+ if (typeof rawVal === 'object' && rawVal !== null && '__expr' in rawVal) {
218
+ ctx.templateLines.push(`${indent} {{ ${rawVal.code} }}`);
219
+ return;
220
+ }
221
+ const val = rawVal;
222
+ if (typeof val !== 'string')
223
+ return;
224
+ if (val.startsWith('{{') && val.endsWith('}}')) {
212
225
  ctx.templateLines.push(`${indent} {{ ${val.slice(2, -2).trim()} }}`);
213
226
  }
214
227
  else {
215
- ctx.templateLines.push(`${indent} ${val}`);
228
+ const key = props.key || camelKey(val);
229
+ ctx.templateLines.push(`${indent} ${tText(ctx, key, val)}`);
216
230
  }
217
231
  }
218
232
  function renderTabs(node, ctx, indent, el) {