@kernlang/core 3.1.5 → 3.1.7

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 (112) hide show
  1. package/LICENSE +17 -0
  2. package/README.md +5 -2
  3. package/dist/codegen/data-layer.d.ts +12 -0
  4. package/dist/codegen/data-layer.js +291 -0
  5. package/dist/codegen/data-layer.js.map +1 -0
  6. package/dist/codegen/emitters.js +1 -4
  7. package/dist/codegen/emitters.js.map +1 -1
  8. package/dist/codegen/events.d.ts +9 -0
  9. package/dist/codegen/events.js +169 -0
  10. package/dist/codegen/events.js.map +1 -0
  11. package/dist/codegen/functions.d.ts +8 -0
  12. package/dist/codegen/functions.js +149 -0
  13. package/dist/codegen/functions.js.map +1 -0
  14. package/dist/codegen/ground-layer.d.ts +22 -0
  15. package/dist/codegen/ground-layer.js +321 -0
  16. package/dist/codegen/ground-layer.js.map +1 -0
  17. package/dist/codegen/helpers.d.ts +2 -0
  18. package/dist/codegen/helpers.js +19 -7
  19. package/dist/codegen/helpers.js.map +1 -1
  20. package/dist/codegen/machines.d.ts +9 -0
  21. package/dist/codegen/machines.js +129 -0
  22. package/dist/codegen/machines.js.map +1 -0
  23. package/dist/codegen/modules.d.ts +10 -0
  24. package/dist/codegen/modules.js +43 -0
  25. package/dist/codegen/modules.js.map +1 -0
  26. package/dist/codegen/screens.d.ts +29 -0
  27. package/dist/codegen/screens.js +202 -0
  28. package/dist/codegen/screens.js.map +1 -0
  29. package/dist/codegen/semantic-types.d.ts +14 -0
  30. package/dist/codegen/semantic-types.js +31 -0
  31. package/dist/codegen/semantic-types.js.map +1 -0
  32. package/dist/codegen/test-gen.d.ts +7 -0
  33. package/dist/codegen/test-gen.js +56 -0
  34. package/dist/codegen/test-gen.js.map +1 -0
  35. package/dist/codegen/type-system.d.ts +11 -0
  36. package/dist/codegen/type-system.js +171 -0
  37. package/dist/codegen/type-system.js.map +1 -0
  38. package/dist/codegen-core.d.ts +30 -36
  39. package/dist/codegen-core.js +258 -1459
  40. package/dist/codegen-core.js.map +1 -1
  41. package/dist/concepts.js.map +1 -1
  42. package/dist/config.d.ts +20 -1
  43. package/dist/config.js +36 -3
  44. package/dist/config.js.map +1 -1
  45. package/dist/coverage-gap.js +9 -5
  46. package/dist/coverage-gap.js.map +1 -1
  47. package/dist/decompiler.d.ts +10 -1
  48. package/dist/decompiler.js +21 -4
  49. package/dist/decompiler.js.map +1 -1
  50. package/dist/errors.d.ts +5 -0
  51. package/dist/errors.js +11 -1
  52. package/dist/errors.js.map +1 -1
  53. package/dist/index.d.ts +33 -28
  54. package/dist/index.js +40 -35
  55. package/dist/index.js.map +1 -1
  56. package/dist/node-props.d.ts +255 -0
  57. package/dist/node-props.js +35 -0
  58. package/dist/node-props.js.map +1 -0
  59. package/dist/parser-core.d.ts +5 -0
  60. package/dist/parser-core.js +364 -0
  61. package/dist/parser-core.js.map +1 -0
  62. package/dist/parser-diagnostics.d.ts +14 -0
  63. package/dist/parser-diagnostics.js +32 -0
  64. package/dist/parser-diagnostics.js.map +1 -0
  65. package/dist/parser-keywords.d.ts +5 -0
  66. package/dist/parser-keywords.js +203 -0
  67. package/dist/parser-keywords.js.map +1 -0
  68. package/dist/parser-style.d.ts +3 -0
  69. package/dist/parser-style.js +73 -0
  70. package/dist/parser-style.js.map +1 -0
  71. package/dist/parser-token-stream.d.ts +27 -0
  72. package/dist/parser-token-stream.js +81 -0
  73. package/dist/parser-token-stream.js.map +1 -0
  74. package/dist/parser-tokenizer.d.ts +11 -0
  75. package/dist/parser-tokenizer.js +188 -0
  76. package/dist/parser-tokenizer.js.map +1 -0
  77. package/dist/parser.d.ts +61 -14
  78. package/dist/parser.js +65 -865
  79. package/dist/parser.js.map +1 -1
  80. package/dist/scanner.js +85 -25
  81. package/dist/scanner.js.map +1 -1
  82. package/dist/schema.d.ts +7 -2
  83. package/dist/schema.js +7 -2
  84. package/dist/schema.js.map +1 -1
  85. package/dist/source-map.d.ts +27 -0
  86. package/dist/source-map.js +82 -0
  87. package/dist/source-map.js.map +1 -0
  88. package/dist/spec.d.ts +1 -1
  89. package/dist/spec.js +197 -55
  90. package/dist/spec.js.map +1 -1
  91. package/dist/styles-react.js +1 -1
  92. package/dist/styles-react.js.map +1 -1
  93. package/dist/styles-tailwind.d.ts +10 -0
  94. package/dist/styles-tailwind.js +62 -15
  95. package/dist/styles-tailwind.js.map +1 -1
  96. package/dist/template-catalog.js +1 -1
  97. package/dist/template-catalog.js.map +1 -1
  98. package/dist/template-engine.d.ts +11 -6
  99. package/dist/template-engine.js +20 -12
  100. package/dist/template-engine.js.map +1 -1
  101. package/dist/types.d.ts +8 -3
  102. package/dist/utils.d.ts +21 -1
  103. package/dist/utils.js +29 -5
  104. package/dist/utils.js.map +1 -1
  105. package/dist/version-adapters.js +1 -2
  106. package/dist/version-adapters.js.map +1 -1
  107. package/dist/version-detect.js +3 -3
  108. package/dist/version-detect.js.map +1 -1
  109. package/dist/walk.d.ts +40 -0
  110. package/dist/walk.js +111 -0
  111. package/dist/walk.js.map +1 -0
  112. package/package.json +2 -2
@@ -0,0 +1,129 @@
1
+ /**
2
+ * State Machine Generators — machine, machineReducer.
3
+ *
4
+ * KERN's killer feature: 12 lines of KERN → 140+ lines of TypeScript.
5
+ * Extracted from codegen-core.ts for modular codegen architecture.
6
+ */
7
+ import { propsOf } from '../node-props.js';
8
+ import { emitIdentifier, emitTemplateSafe } from './emitters.js';
9
+ import { exportPrefix, getChildren, getProps, handlerCode } from './helpers.js';
10
+ const _p = getProps;
11
+ const kids = getChildren;
12
+ // ── State Machine ────────────────────────────────────────────────────────
13
+ export function generateMachine(node) {
14
+ const props = propsOf(node);
15
+ const name = emitIdentifier(props.name, 'UnknownMachine', node);
16
+ const exp = exportPrefix(node);
17
+ const lines = [];
18
+ // Collect states
19
+ const states = kids(node, 'state');
20
+ const stateNames = states.map((s) => {
21
+ const sp = propsOf(s);
22
+ return emitIdentifier(sp.name || sp.value, 'state', s);
23
+ });
24
+ // State type
25
+ const stateType = `${name}State`;
26
+ lines.push(`${exp}type ${stateType} = ${stateNames.map((s) => `'${emitTemplateSafe(s)}'`).join(' | ')};`);
27
+ lines.push('');
28
+ // Error class
29
+ const errorName = `${name}StateError`;
30
+ lines.push(`${exp}class ${errorName} extends Error {`);
31
+ lines.push(` constructor(`);
32
+ lines.push(` public readonly expected: string | string[],`);
33
+ lines.push(` public readonly actual: string,`);
34
+ lines.push(` ) {`);
35
+ lines.push(` const expectedStr = Array.isArray(expected) ? expected.join(' | ') : expected;`);
36
+ lines.push(` super(\`Invalid ${name.toLowerCase()} state: expected \${expectedStr}, got \${actual}\`);`);
37
+ lines.push(` this.name = '${errorName}';`);
38
+ lines.push(` }`);
39
+ lines.push('}');
40
+ lines.push('');
41
+ // Transition functions
42
+ const transitions = kids(node, 'transition');
43
+ for (const t of transitions) {
44
+ const tp = propsOf(t);
45
+ const tname = emitIdentifier(tp.name, 'transition', t);
46
+ const from = tp.from || '';
47
+ const to = tp.to || '';
48
+ const fromStates = from.split('|').map((s) => s.trim());
49
+ const isMultiFrom = fromStates.length > 1;
50
+ const fnName = `${tname}${name}`;
51
+ const code = handlerCode(t);
52
+ lines.push(`/** ${from} → ${to} */`);
53
+ lines.push(`${exp}function ${fnName}<T extends { state: ${stateType} }>(entity: T): T {`);
54
+ if (isMultiFrom) {
55
+ lines.push(` const validStates: ${stateType}[] = [${fromStates.map((s) => `'${s}'`).join(', ')}];`);
56
+ lines.push(` if (!validStates.includes(entity.state)) {`);
57
+ lines.push(` throw new ${errorName}(validStates, entity.state);`);
58
+ lines.push(` }`);
59
+ }
60
+ else {
61
+ lines.push(` if (entity.state !== '${fromStates[0]}') {`);
62
+ lines.push(` throw new ${errorName}('${fromStates[0]}', entity.state);`);
63
+ lines.push(` }`);
64
+ }
65
+ if (code) {
66
+ for (const line of code.split('\n')) {
67
+ lines.push(` ${line}`);
68
+ }
69
+ }
70
+ else {
71
+ lines.push(` return { ...entity, state: '${to}' as ${stateType} };`);
72
+ }
73
+ lines.push('}');
74
+ lines.push('');
75
+ }
76
+ return lines;
77
+ }
78
+ // ── Machine → useReducer (Ink target) ────────────────────────────────────
79
+ export function generateMachineReducer(node) {
80
+ const props = propsOf(node);
81
+ const name = emitIdentifier(props.name, 'UnknownMachine', node);
82
+ const exp = exportPrefix(node);
83
+ const lines = [];
84
+ lines.push(`import { useReducer } from 'react';`);
85
+ lines.push('');
86
+ // First emit the standard machine output
87
+ lines.push(...generateMachine(node));
88
+ // Collect states + transitions
89
+ const states = kids(node, 'state');
90
+ const stateNames = states.map((s) => {
91
+ const sp = propsOf(s);
92
+ return sp.name || sp.value || '';
93
+ });
94
+ const initialState = states.find((s) => {
95
+ const sp = propsOf(s);
96
+ return sp.initial === 'true' || sp.initial === true;
97
+ });
98
+ const initialName = initialState
99
+ ? propsOf(initialState).name || propsOf(initialState).value || ''
100
+ : stateNames[0];
101
+ const transitions = kids(node, 'transition');
102
+ const stateType = `${name}State`;
103
+ // Action type union
104
+ const actionNames = transitions.map((t) => emitIdentifier(propsOf(t).name, 'action', t));
105
+ lines.push(`${exp}type ${name}Action = ${actionNames.map((a) => `'${a}'`).join(' | ')};`);
106
+ lines.push('');
107
+ // Reducer function
108
+ lines.push(`${exp}function ${name.charAt(0).toLowerCase() + name.slice(1)}Reducer(state: ${stateType}, action: ${name}Action): ${stateType} {`);
109
+ lines.push(` const entity = { state };`);
110
+ lines.push(` switch (action) {`);
111
+ for (const t of transitions) {
112
+ const tp = propsOf(t);
113
+ const tname = emitIdentifier(tp.name, 'action', t);
114
+ const fnName = `${tname}${name}`;
115
+ lines.push(` case '${emitTemplateSafe(tname)}': return ${fnName}(entity).state;`);
116
+ }
117
+ lines.push(` default: return state;`);
118
+ lines.push(` }`);
119
+ lines.push('}');
120
+ lines.push('');
121
+ // useReducer hook
122
+ lines.push(`${exp}function use${name}Reducer() {`);
123
+ lines.push(` const [state, dispatch] = useReducer(${name.charAt(0).toLowerCase() + name.slice(1)}Reducer, '${initialName}' as ${stateType});`);
124
+ lines.push(` return { state, dispatch } as const;`);
125
+ lines.push('}');
126
+ lines.push('');
127
+ return lines;
128
+ }
129
+ //# sourceMappingURL=machines.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"machines.js","sourceRoot":"","sources":["../../src/codegen/machines.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhF,MAAM,EAAE,GAAG,QAAQ,CAAC;AACpB,MAAM,IAAI,GAAG,WAAW,CAAC;AAEzB,4EAA4E;AAE5E,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,KAAK,GAAG,OAAO,CAAY,IAAI,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,gBAAgB,EAAE,IAAI,CAAC,CAAC;IAChE,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,iBAAiB;IACjB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAClC,MAAM,EAAE,GAAG,OAAO,CAAU,CAAC,CAAC,CAAC;QAC/B,OAAO,cAAc,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,aAAa;IACb,MAAM,SAAS,GAAG,GAAG,IAAI,OAAO,CAAC;IACjC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,QAAQ,SAAS,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1G,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,cAAc;IACd,MAAM,SAAS,GAAG,GAAG,IAAI,YAAY,CAAC;IACtC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,SAAS,SAAS,kBAAkB,CAAC,CAAC;IACvD,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC7B,KAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;IAC/D,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IAClD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpB,KAAK,CAAC,IAAI,CAAC,oFAAoF,CAAC,CAAC;IACjG,KAAK,CAAC,IAAI,CAAC,uBAAuB,IAAI,CAAC,WAAW,EAAE,sDAAsD,CAAC,CAAC;IAC5G,KAAK,CAAC,IAAI,CAAC,oBAAoB,SAAS,IAAI,CAAC,CAAC;IAC9C,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,uBAAuB;IACvB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAC7C,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,MAAM,EAAE,GAAG,OAAO,CAAe,CAAC,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;QAC3B,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;QAEvB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,GAAG,KAAK,GAAG,IAAI,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAE5B,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,MAAM,EAAE,KAAK,CAAC,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,YAAY,MAAM,uBAAuB,SAAS,qBAAqB,CAAC,CAAC;QAE1F,IAAI,WAAW,EAAE,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,wBAAwB,SAAS,SAAS,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrG,KAAK,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;YAC3D,KAAK,CAAC,IAAI,CAAC,iBAAiB,SAAS,8BAA8B,CAAC,CAAC;YACrE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,2BAA2B,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAC3D,KAAK,CAAC,IAAI,CAAC,iBAAiB,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;YAC5E,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;QAED,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,iCAAiC,EAAE,QAAQ,SAAS,KAAK,CAAC,CAAC;QACxE,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,4EAA4E;AAE5E,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,MAAM,KAAK,GAAG,OAAO,CAAY,IAAI,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,gBAAgB,EAAE,IAAI,CAAC,CAAC;IAChE,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IAClD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,yCAAyC;IACzC,KAAK,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;IAErC,+BAA+B;IAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAClC,MAAM,EAAE,GAAG,OAAO,CAAU,CAAC,CAAC,CAAC;QAC/B,OAAO,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IACH,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;QACrC,MAAM,EAAE,GAAG,OAAO,CAAU,CAAC,CAAC,CAAC;QAC/B,OAAO,EAAE,CAAC,OAAO,KAAK,MAAM,IAAI,EAAE,CAAC,OAAO,KAAK,IAAI,CAAC;IACtD,CAAC,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,YAAY;QAC9B,CAAC,CAAC,OAAO,CAAU,YAAY,CAAC,CAAC,IAAI,IAAI,OAAO,CAAU,YAAY,CAAC,CAAC,KAAK,IAAI,EAAE;QACnF,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAElB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,GAAG,IAAI,OAAO,CAAC;IAEjC,oBAAoB;IACpB,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,OAAO,CAAe,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;IACvG,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,QAAQ,IAAI,YAAY,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1F,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,mBAAmB;IACnB,KAAK,CAAC,IAAI,CACR,GAAG,GAAG,YAAY,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,kBAAkB,SAAS,aAAa,IAAI,YAAY,SAAS,IAAI,CACpI,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAC1C,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,MAAM,EAAE,GAAG,OAAO,CAAe,CAAC,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,GAAG,KAAK,GAAG,IAAI,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,aAAa,gBAAgB,CAAC,KAAK,CAAC,aAAa,MAAM,iBAAiB,CAAC,CAAC;IACvF,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IACzC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,kBAAkB;IAClB,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,eAAe,IAAI,aAAa,CAAC,CAAC;IACnD,KAAK,CAAC,IAAI,CACR,0CAA0C,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,WAAW,QAAQ,SAAS,IAAI,CACpI,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IACrD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Module Generators — import.
3
+ *
4
+ * NOTE: generateModule remains in codegen-core.ts because it calls
5
+ * generateCoreNode recursively for inline child definitions.
6
+ *
7
+ * Extracted from codegen-core.ts for modular codegen architecture.
8
+ */
9
+ import type { IRNode } from '../types.js';
10
+ export declare function generateImport(node: IRNode): string[];
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Module Generators — import.
3
+ *
4
+ * NOTE: generateModule remains in codegen-core.ts because it calls
5
+ * generateCoreNode recursively for inline child definitions.
6
+ *
7
+ * Extracted from codegen-core.ts for modular codegen architecture.
8
+ */
9
+ import { propsOf } from '../node-props.js';
10
+ import { emitIdentifier, emitImportSpecifier } from './emitters.js';
11
+ import { getProps } from './helpers.js';
12
+ const _p = getProps;
13
+ // ── Import ──────────────────────────────────────────────────────────────
14
+ export function generateImport(node) {
15
+ const props = propsOf(node);
16
+ const from = props.from;
17
+ const names = props.names;
18
+ const defaultImport = props.default;
19
+ const isTypeOnly = props.types === 'true' || props.types === true;
20
+ if (!from)
21
+ return [];
22
+ const safePath = emitImportSpecifier(from, node);
23
+ const typeKw = isTypeOnly ? 'type ' : '';
24
+ const safeDefault = defaultImport ? emitIdentifier(defaultImport, 'default', node) : '';
25
+ const namedList = names
26
+ ? names
27
+ .split(',')
28
+ .map((s) => emitIdentifier(s.trim(), 'import', node))
29
+ .join(', ')
30
+ : '';
31
+ if (safeDefault && namedList) {
32
+ return [`import ${typeKw}${safeDefault}, { ${namedList} } from '${safePath}';`];
33
+ }
34
+ if (safeDefault) {
35
+ return [`import ${typeKw}${safeDefault} from '${safePath}';`];
36
+ }
37
+ if (namedList) {
38
+ return [`import ${typeKw}{ ${namedList} } from '${safePath}';`];
39
+ }
40
+ // Side-effect import
41
+ return [`import '${safePath}';`];
42
+ }
43
+ //# sourceMappingURL=modules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modules.js","sourceRoot":"","sources":["../../src/codegen/modules.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,MAAM,EAAE,GAAG,QAAQ,CAAC;AAEpB,2EAA2E;AAE3E,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,KAAK,GAAG,OAAO,CAAW,IAAI,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC;IACpC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,KAAK,MAAM,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC;IAElE,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IAErB,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACzC,MAAM,WAAW,GAAG,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC,aAAa,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACxF,MAAM,SAAS,GAAG,KAAK;QACrB,CAAC,CAAC,KAAK;aACF,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;aACpD,IAAI,CAAC,IAAI,CAAC;QACf,CAAC,CAAC,EAAE,CAAC;IAEP,IAAI,WAAW,IAAI,SAAS,EAAE,CAAC;QAC7B,OAAO,CAAC,UAAU,MAAM,GAAG,WAAW,OAAO,SAAS,YAAY,QAAQ,IAAI,CAAC,CAAC;IAClF,CAAC;IACD,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CAAC,UAAU,MAAM,GAAG,WAAW,UAAU,QAAQ,IAAI,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CAAC,UAAU,MAAM,KAAK,SAAS,YAAY,QAAQ,IAAI,CAAC,CAAC;IAClE,CAAC;IACD,qBAAqB;IACrB,OAAO,CAAC,WAAW,QAAQ,IAAI,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Screen codegen — generates React/Ink components from KERN `screen` nodes.
3
+ *
4
+ * KERN syntax:
5
+ * screen name=MyComponent target=ink
6
+ * prop name=title type=string
7
+ * prop name=count type=number optional=true
8
+ * state name=value type=string initial="''"
9
+ * state name=open type=boolean initial="false"
10
+ * effect <<<
11
+ * // useEffect body
12
+ * >>>
13
+ * render <<<
14
+ * <Box><Text>{title}</Text></Box>
15
+ * >>>
16
+ *
17
+ * Generates:
18
+ * import React, { useState, useEffect, useCallback, useRef } from 'react';
19
+ * import { Box, Text, useInput, useApp } from 'ink';
20
+ *
21
+ * export function MyComponent({ title, count }: { title: string; count?: number }) {
22
+ * const [value, setValue] = useState('');
23
+ * const [open, setOpen] = useState(false);
24
+ * useEffect(() => { ... }, []);
25
+ * return (<Box><Text>{title}</Text></Box>);
26
+ * }
27
+ */
28
+ import type { IRNode } from '../types.js';
29
+ export declare function generateScreen(node: IRNode): string[];
@@ -0,0 +1,202 @@
1
+ /**
2
+ * Screen codegen — generates React/Ink components from KERN `screen` nodes.
3
+ *
4
+ * KERN syntax:
5
+ * screen name=MyComponent target=ink
6
+ * prop name=title type=string
7
+ * prop name=count type=number optional=true
8
+ * state name=value type=string initial="''"
9
+ * state name=open type=boolean initial="false"
10
+ * effect <<<
11
+ * // useEffect body
12
+ * >>>
13
+ * render <<<
14
+ * <Box><Text>{title}</Text></Box>
15
+ * >>>
16
+ *
17
+ * Generates:
18
+ * import React, { useState, useEffect, useCallback, useRef } from 'react';
19
+ * import { Box, Text, useInput, useApp } from 'ink';
20
+ *
21
+ * export function MyComponent({ title, count }: { title: string; count?: number }) {
22
+ * const [value, setValue] = useState('');
23
+ * const [open, setOpen] = useState(false);
24
+ * useEffect(() => { ... }, []);
25
+ * return (<Box><Text>{title}</Text></Box>);
26
+ * }
27
+ */
28
+ import { emitIdentifier } from './emitters.js';
29
+ import { exportPrefix, getChildren, getFirstChild, getProps } from './helpers.js';
30
+ function propsOf(node) {
31
+ return node.props || {};
32
+ }
33
+ function handlerContent(node) {
34
+ const handler = getChildren(node, 'handler')[0];
35
+ if (handler) {
36
+ const hp = propsOf(handler);
37
+ return hp.code || hp.body || '';
38
+ }
39
+ // Check for inline body/code prop
40
+ const p = propsOf(node);
41
+ return p.code || p.body || '';
42
+ }
43
+ export function generateScreen(node) {
44
+ const props = getProps(node);
45
+ const name = emitIdentifier(props.name, 'UnnamedScreen', node);
46
+ const _target = props.target || 'ink';
47
+ const exp = exportPrefix(node);
48
+ const lines = [];
49
+ // Collect children
50
+ const propNodes = getChildren(node, 'prop');
51
+ const stateNodes = getChildren(node, 'state');
52
+ const effectNodes = getChildren(node, 'effect');
53
+ const renderNode = getFirstChild(node, 'render');
54
+ const callbackNodes = getChildren(node, 'callback');
55
+ const memoNodes = getChildren(node, 'memo');
56
+ const refNodes = getChildren(node, 'ref');
57
+ const onInputNodes = getChildren(node, 'on').filter((n) => {
58
+ const p = propsOf(n);
59
+ return p.event === 'input';
60
+ });
61
+ // Determine which React hooks are needed
62
+ const needsState = stateNodes.length > 0;
63
+ const needsEffect = effectNodes.length > 0;
64
+ const needsCallback = callbackNodes.length > 0;
65
+ const needsMemo = memoNodes.length > 0;
66
+ const needsRef = refNodes.length > 0 || onInputNodes.length > 0;
67
+ // Imports
68
+ const reactImports = ['React'];
69
+ if (needsState)
70
+ reactImports.push('useState');
71
+ if (needsEffect)
72
+ reactImports.push('useEffect');
73
+ if (needsCallback)
74
+ reactImports.push('useCallback');
75
+ if (needsMemo)
76
+ reactImports.push('useMemo');
77
+ if (needsRef)
78
+ reactImports.push('useRef');
79
+ // Don't emit imports here — KERN import nodes at file level handle React/Ink imports.
80
+ // Screen codegen only emits the component function. This avoids duplicate imports
81
+ // when multiple screens are in one file.
82
+ //
83
+ // Files MUST have: import from="ink" names="Box,Text"
84
+ // If hooks are used, the file needs: import from="react" names="React,useState,useEffect,..."
85
+ lines.push('');
86
+ // Parse props
87
+ const componentProps = propNodes.map((n) => {
88
+ const p = propsOf(n);
89
+ return {
90
+ name: emitIdentifier(p.name, 'unknown', n),
91
+ type: p.type || 'any',
92
+ optional: p.optional === true || p.optional === 'true',
93
+ default: p.default,
94
+ };
95
+ });
96
+ // Props type
97
+ const propsTypeEntries = componentProps.map((p) => `${p.name}${p.optional ? '?' : ''}: ${p.type}`).join('; ');
98
+ // Destructure with defaults
99
+ const destructure = componentProps.map((p) => (p.default ? `${p.name} = ${p.default}` : p.name)).join(', ');
100
+ // Function signature
101
+ lines.push(`${exp}function ${name}({ ${destructure} }: { ${propsTypeEntries} }) {`);
102
+ // State declarations
103
+ for (const sn of stateNodes) {
104
+ const sp = propsOf(sn);
105
+ const sName = emitIdentifier(sp.name, 'state', sn);
106
+ const sType = sp.type || 'any';
107
+ const sInitial = sp.initial || 'undefined';
108
+ const setter = `set${sName.charAt(0).toUpperCase()}${sName.slice(1)}`;
109
+ lines.push(` const [${sName}, ${setter}] = useState<${sType}>(${sInitial});`);
110
+ }
111
+ // Ref declarations
112
+ for (const rn of refNodes) {
113
+ const rp = propsOf(rn);
114
+ const rName = emitIdentifier(rp.name, 'ref', rn);
115
+ const rType = rp.type || 'any';
116
+ const rInitial = rp.initial || 'null';
117
+ lines.push(` const ${rName} = useRef<${rType}>(${rInitial});`);
118
+ }
119
+ if (stateNodes.length > 0 || refNodes.length > 0)
120
+ lines.push('');
121
+ // Memos
122
+ for (const mn of memoNodes) {
123
+ const mp = propsOf(mn);
124
+ const mName = emitIdentifier(mp.name, 'memo', mn);
125
+ const mDeps = mp.deps || '';
126
+ const mDepsArr = mDeps && mDeps !== '[]' ? `[${mDeps}]` : '[]';
127
+ const body = handlerContent(mn);
128
+ lines.push(` const ${mName} = useMemo(() => {`);
129
+ for (const line of body.split('\n')) {
130
+ lines.push(` ${line}`);
131
+ }
132
+ lines.push(` }, ${mDepsArr});`);
133
+ lines.push('');
134
+ }
135
+ // Callbacks
136
+ for (const cn of callbackNodes) {
137
+ const cp = propsOf(cn);
138
+ const cName = emitIdentifier(cp.name, 'handler', cn);
139
+ const cParams = cp.params || '';
140
+ const cDeps = cp.deps || '';
141
+ const cDepsArr = cDeps && cDeps !== '[]' ? `[${cDeps}]` : '[]';
142
+ const isAsync = cp.async === true || cp.async === 'true';
143
+ const body = handlerContent(cn);
144
+ lines.push(` const ${cName} = useCallback(${isAsync ? 'async ' : ''}${cParams ? `(${cParams})` : '()'} => {`);
145
+ for (const line of body.split('\n')) {
146
+ lines.push(` ${line}`);
147
+ }
148
+ lines.push(` }, ${cDepsArr});`);
149
+ lines.push('');
150
+ }
151
+ // Effects
152
+ for (const en of effectNodes) {
153
+ const ep = propsOf(en);
154
+ const eDeps = ep.deps || '';
155
+ const eDepsArr = eDeps && eDeps !== '[]' ? `[${eDeps}]` : '[]';
156
+ const body = handlerContent(en);
157
+ lines.push(` useEffect(() => {`);
158
+ for (const line of body.split('\n')) {
159
+ lines.push(` ${line}`);
160
+ }
161
+ lines.push(` }, ${eDepsArr});`);
162
+ lines.push('');
163
+ }
164
+ // useInput handlers (on event=input) — uses ref pattern for fresh closures
165
+ for (const onNode of onInputNodes) {
166
+ const body = handlerContent(onNode);
167
+ lines.push(` const _inputHandlerRef = useRef<(input: string, key: any) => void>(() => {});`);
168
+ lines.push(` _inputHandlerRef.current = (input: string, key: any) => {`);
169
+ for (const line of body.split('\n')) {
170
+ lines.push(` ${line}`);
171
+ }
172
+ lines.push(` };`);
173
+ lines.push(` useInput((input: string, key: any) => _inputHandlerRef.current(input, key));`);
174
+ lines.push('');
175
+ }
176
+ // Render
177
+ if (renderNode) {
178
+ const body = handlerContent(renderNode);
179
+ const trimmed = body.trim();
180
+ // If handler body contains `return`, emit as-is (it manages its own return)
181
+ // Otherwise, wrap in return(...)
182
+ if (trimmed.includes('return ') || trimmed.includes('return(')) {
183
+ for (const line of body.split('\n')) {
184
+ lines.push(` ${line}`);
185
+ }
186
+ }
187
+ else {
188
+ lines.push(` return (`);
189
+ for (const line of body.split('\n')) {
190
+ lines.push(` ${line}`);
191
+ }
192
+ lines.push(` );`);
193
+ }
194
+ }
195
+ else {
196
+ lines.push(` return null;`);
197
+ }
198
+ lines.push('}');
199
+ lines.push('');
200
+ return lines;
201
+ }
202
+ //# sourceMappingURL=screens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screens.js","sourceRoot":"","sources":["../../src/codegen/screens.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Semantic Type Map — cross-target type mappings for KERN's semantic types.
3
+ *
4
+ * Maps KERN column/field types to target-specific output types:
5
+ * Prisma schema, SQLAlchemy/SQLModel, Pydantic, TypeScript.
6
+ */
7
+ export interface SemanticTypeMapping {
8
+ prisma: string;
9
+ sqlalchemy: string;
10
+ pydantic: string;
11
+ typescript: string;
12
+ }
13
+ export declare const SEMANTIC_TYPE_MAP: Record<string, SemanticTypeMapping>;
14
+ export declare function mapSemanticType(kernType: string, target: keyof SemanticTypeMapping): string;
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Semantic Type Map — cross-target type mappings for KERN's semantic types.
3
+ *
4
+ * Maps KERN column/field types to target-specific output types:
5
+ * Prisma schema, SQLAlchemy/SQLModel, Pydantic, TypeScript.
6
+ */
7
+ export const SEMANTIC_TYPE_MAP = {
8
+ uuid: { prisma: 'String @db.Uuid', sqlalchemy: 'UUID', pydantic: 'UUID', typescript: 'string' },
9
+ string: { prisma: 'String', sqlalchemy: 'String', pydantic: 'str', typescript: 'string' },
10
+ text: { prisma: 'String', sqlalchemy: 'Text', pydantic: 'str', typescript: 'string' },
11
+ Email: { prisma: 'String', sqlalchemy: 'String(254)', pydantic: 'EmailStr', typescript: 'string' },
12
+ URL: { prisma: 'String', sqlalchemy: 'String(2048)', pydantic: 'AnyHttpUrl', typescript: 'string' },
13
+ PhoneNumber: { prisma: 'String', sqlalchemy: 'String(20)', pydantic: 'str', typescript: 'string' },
14
+ PersonName: { prisma: 'String', sqlalchemy: 'String(255)', pydantic: 'str', typescript: 'string' },
15
+ int: { prisma: 'Int', sqlalchemy: 'Integer', pydantic: 'int', typescript: 'number' },
16
+ integer: { prisma: 'Int', sqlalchemy: 'Integer', pydantic: 'int', typescript: 'number' },
17
+ float: { prisma: 'Float', sqlalchemy: 'Float', pydantic: 'float', typescript: 'number' },
18
+ decimal: { prisma: 'Decimal', sqlalchemy: 'Numeric(19, 4)', pydantic: 'Decimal', typescript: 'number' },
19
+ Money: { prisma: 'Decimal', sqlalchemy: 'Numeric(19, 4)', pydantic: 'Decimal', typescript: 'number' },
20
+ boolean: { prisma: 'Boolean', sqlalchemy: 'Boolean', pydantic: 'bool', typescript: 'boolean' },
21
+ bool: { prisma: 'Boolean', sqlalchemy: 'Boolean', pydantic: 'bool', typescript: 'boolean' },
22
+ date: { prisma: 'DateTime', sqlalchemy: 'Date', pydantic: 'date', typescript: 'Date' },
23
+ datetime: { prisma: 'DateTime', sqlalchemy: 'DateTime', pydantic: 'datetime', typescript: 'Date' },
24
+ timestamp: { prisma: 'DateTime', sqlalchemy: 'DateTime', pydantic: 'datetime', typescript: 'Date' },
25
+ Timestamp: { prisma: 'DateTime', sqlalchemy: 'DateTime', pydantic: 'datetime', typescript: 'Date' },
26
+ json: { prisma: 'Json', sqlalchemy: 'JSON', pydantic: 'dict[str, Any]', typescript: 'Record<string, unknown>' },
27
+ };
28
+ export function mapSemanticType(kernType, target) {
29
+ return SEMANTIC_TYPE_MAP[kernType]?.[target] ?? kernType;
30
+ }
31
+ //# sourceMappingURL=semantic-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-types.js","sourceRoot":"","sources":["../../src/codegen/semantic-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Test Generator — test.
3
+ *
4
+ * Extracted from codegen-core.ts for modular codegen architecture.
5
+ */
6
+ import type { IRNode } from '../types.js';
7
+ export declare function generateTest(node: IRNode): string[];
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Test Generator — test.
3
+ *
4
+ * Extracted from codegen-core.ts for modular codegen architecture.
5
+ */
6
+ import { propsOf } from '../node-props.js';
7
+ import { emitTemplateSafe } from './emitters.js';
8
+ import { getChildren, getProps, handlerCode } from './helpers.js';
9
+ const p = getProps;
10
+ const kids = getChildren;
11
+ // ── Test ─────────────────────────────────────────────────────────────────
12
+ export function generateTest(node) {
13
+ const props = propsOf(node);
14
+ const name = emitTemplateSafe(props.name || 'UnknownTest');
15
+ const lines = [];
16
+ lines.push(`import { describe, it, expect } from 'vitest';`);
17
+ lines.push('');
18
+ // Top-level setup handler
19
+ const setup = handlerCode(node);
20
+ if (setup) {
21
+ for (const line of setup.split('\n'))
22
+ lines.push(line);
23
+ lines.push('');
24
+ }
25
+ lines.push(`describe('${name}', () => {`);
26
+ // 'describe' and 'it' children don't have typed interfaces in NodePropsMap
27
+ for (const desc of kids(node, 'describe')) {
28
+ const dname = emitTemplateSafe(p(desc).name || 'describe');
29
+ lines.push(` describe('${dname}', () => {`);
30
+ for (const test of kids(desc, 'it')) {
31
+ const tname = emitTemplateSafe(p(test).name || 'test');
32
+ const code = handlerCode(test);
33
+ lines.push(` it('${tname}', () => {`);
34
+ if (code) {
35
+ for (const line of code.split('\n'))
36
+ lines.push(` ${line}`);
37
+ }
38
+ lines.push(` });`);
39
+ }
40
+ lines.push(` });`);
41
+ }
42
+ // Top-level it blocks
43
+ for (const test of kids(node, 'it')) {
44
+ const tname = emitTemplateSafe(p(test).name || 'test');
45
+ const code = handlerCode(test);
46
+ lines.push(` it('${tname}', () => {`);
47
+ if (code) {
48
+ for (const line of code.split('\n'))
49
+ lines.push(` ${line}`);
50
+ }
51
+ lines.push(` });`);
52
+ }
53
+ lines.push('});');
54
+ return lines;
55
+ }
56
+ //# sourceMappingURL=test-gen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-gen.js","sourceRoot":"","sources":["../../src/codegen/test-gen.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Type System Generators — type, interface, union, service, const.
3
+ *
4
+ * Extracted from codegen-core.ts for modular codegen architecture.
5
+ */
6
+ import type { IRNode } from '../types.js';
7
+ export declare function generateType(node: IRNode): string[];
8
+ export declare function generateInterface(node: IRNode): string[];
9
+ export declare function generateUnion(node: IRNode): string[];
10
+ export declare function generateService(node: IRNode): string[];
11
+ export declare function generateConst(node: IRNode): string[];