@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.
- package/LICENSE +17 -0
- package/README.md +5 -2
- package/dist/codegen/data-layer.d.ts +12 -0
- package/dist/codegen/data-layer.js +291 -0
- package/dist/codegen/data-layer.js.map +1 -0
- package/dist/codegen/emitters.js +1 -4
- package/dist/codegen/emitters.js.map +1 -1
- package/dist/codegen/events.d.ts +9 -0
- package/dist/codegen/events.js +169 -0
- package/dist/codegen/events.js.map +1 -0
- package/dist/codegen/functions.d.ts +8 -0
- package/dist/codegen/functions.js +149 -0
- package/dist/codegen/functions.js.map +1 -0
- package/dist/codegen/ground-layer.d.ts +22 -0
- package/dist/codegen/ground-layer.js +321 -0
- package/dist/codegen/ground-layer.js.map +1 -0
- package/dist/codegen/helpers.d.ts +2 -0
- package/dist/codegen/helpers.js +19 -7
- package/dist/codegen/helpers.js.map +1 -1
- package/dist/codegen/machines.d.ts +9 -0
- package/dist/codegen/machines.js +129 -0
- package/dist/codegen/machines.js.map +1 -0
- package/dist/codegen/modules.d.ts +10 -0
- package/dist/codegen/modules.js +43 -0
- package/dist/codegen/modules.js.map +1 -0
- package/dist/codegen/screens.d.ts +29 -0
- package/dist/codegen/screens.js +202 -0
- package/dist/codegen/screens.js.map +1 -0
- package/dist/codegen/semantic-types.d.ts +14 -0
- package/dist/codegen/semantic-types.js +31 -0
- package/dist/codegen/semantic-types.js.map +1 -0
- package/dist/codegen/test-gen.d.ts +7 -0
- package/dist/codegen/test-gen.js +56 -0
- package/dist/codegen/test-gen.js.map +1 -0
- package/dist/codegen/type-system.d.ts +11 -0
- package/dist/codegen/type-system.js +171 -0
- package/dist/codegen/type-system.js.map +1 -0
- package/dist/codegen-core.d.ts +30 -36
- package/dist/codegen-core.js +258 -1459
- package/dist/codegen-core.js.map +1 -1
- package/dist/concepts.js.map +1 -1
- package/dist/config.d.ts +20 -1
- package/dist/config.js +36 -3
- package/dist/config.js.map +1 -1
- package/dist/coverage-gap.js +9 -5
- package/dist/coverage-gap.js.map +1 -1
- package/dist/decompiler.d.ts +10 -1
- package/dist/decompiler.js +21 -4
- package/dist/decompiler.js.map +1 -1
- package/dist/errors.d.ts +5 -0
- package/dist/errors.js +11 -1
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +33 -28
- package/dist/index.js +40 -35
- package/dist/index.js.map +1 -1
- package/dist/node-props.d.ts +255 -0
- package/dist/node-props.js +35 -0
- package/dist/node-props.js.map +1 -0
- package/dist/parser-core.d.ts +5 -0
- package/dist/parser-core.js +364 -0
- package/dist/parser-core.js.map +1 -0
- package/dist/parser-diagnostics.d.ts +14 -0
- package/dist/parser-diagnostics.js +32 -0
- package/dist/parser-diagnostics.js.map +1 -0
- package/dist/parser-keywords.d.ts +5 -0
- package/dist/parser-keywords.js +203 -0
- package/dist/parser-keywords.js.map +1 -0
- package/dist/parser-style.d.ts +3 -0
- package/dist/parser-style.js +73 -0
- package/dist/parser-style.js.map +1 -0
- package/dist/parser-token-stream.d.ts +27 -0
- package/dist/parser-token-stream.js +81 -0
- package/dist/parser-token-stream.js.map +1 -0
- package/dist/parser-tokenizer.d.ts +11 -0
- package/dist/parser-tokenizer.js +188 -0
- package/dist/parser-tokenizer.js.map +1 -0
- package/dist/parser.d.ts +61 -14
- package/dist/parser.js +65 -865
- package/dist/parser.js.map +1 -1
- package/dist/scanner.js +85 -25
- package/dist/scanner.js.map +1 -1
- package/dist/schema.d.ts +7 -2
- package/dist/schema.js +7 -2
- package/dist/schema.js.map +1 -1
- package/dist/source-map.d.ts +27 -0
- package/dist/source-map.js +82 -0
- package/dist/source-map.js.map +1 -0
- package/dist/spec.d.ts +1 -1
- package/dist/spec.js +197 -55
- package/dist/spec.js.map +1 -1
- package/dist/styles-react.js +1 -1
- package/dist/styles-react.js.map +1 -1
- package/dist/styles-tailwind.d.ts +10 -0
- package/dist/styles-tailwind.js +62 -15
- package/dist/styles-tailwind.js.map +1 -1
- package/dist/template-catalog.js +1 -1
- package/dist/template-catalog.js.map +1 -1
- package/dist/template-engine.d.ts +11 -6
- package/dist/template-engine.js +20 -12
- package/dist/template-engine.js.map +1 -1
- package/dist/types.d.ts +8 -3
- package/dist/utils.d.ts +21 -1
- package/dist/utils.js +29 -5
- package/dist/utils.js.map +1 -1
- package/dist/version-adapters.js +1 -2
- package/dist/version-adapters.js.map +1 -1
- package/dist/version-detect.js +3 -3
- package/dist/version-detect.js.map +1 -1
- package/dist/walk.d.ts +40 -0
- package/dist/walk.js +111 -0
- package/dist/walk.js.map +1 -0
- 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":"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"}
|
|
@@ -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,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[];
|