kern-lang 1.0.0
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 +661 -0
- package/README.md +304 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +244 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +46 -0
- package/dist/config.js +54 -0
- package/dist/config.js.map +1 -0
- package/dist/context-export.d.ts +11 -0
- package/dist/context-export.js +121 -0
- package/dist/context-export.js.map +1 -0
- package/dist/decompiler.d.ts +2 -0
- package/dist/decompiler.js +44 -0
- package/dist/decompiler.js.map +1 -0
- package/dist/draft-protocol.d.ts +27 -0
- package/dist/draft-protocol.js +135 -0
- package/dist/draft-protocol.js.map +1 -0
- package/dist/errors.d.ts +12 -0
- package/dist/errors.js +40 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/metrics.d.ts +30 -0
- package/dist/metrics.js +182 -0
- package/dist/metrics.js.map +1 -0
- package/dist/parser.d.ts +4 -0
- package/dist/parser.js +361 -0
- package/dist/parser.js.map +1 -0
- package/dist/spec.d.ts +17 -0
- package/dist/spec.js +86 -0
- package/dist/spec.js.map +1 -0
- package/dist/styles-react.d.ts +3 -0
- package/dist/styles-react.js +20 -0
- package/dist/styles-react.js.map +1 -0
- package/dist/styles-tailwind.d.ts +8 -0
- package/dist/styles-tailwind.js +197 -0
- package/dist/styles-tailwind.js.map +1 -0
- package/dist/transpiler-cli.d.ts +3 -0
- package/dist/transpiler-cli.js +279 -0
- package/dist/transpiler-cli.js.map +1 -0
- package/dist/transpiler-express.d.ts +3 -0
- package/dist/transpiler-express.js +612 -0
- package/dist/transpiler-express.js.map +1 -0
- package/dist/transpiler-nextjs.d.ts +21 -0
- package/dist/transpiler-nextjs.js +400 -0
- package/dist/transpiler-nextjs.js.map +1 -0
- package/dist/transpiler-tailwind.d.ts +3 -0
- package/dist/transpiler-tailwind.js +594 -0
- package/dist/transpiler-tailwind.js.map +1 -0
- package/dist/transpiler-terminal.d.ts +3 -0
- package/dist/transpiler-terminal.js +522 -0
- package/dist/transpiler-terminal.js.map +1 -0
- package/dist/transpiler-web.d.ts +3 -0
- package/dist/transpiler-web.js +218 -0
- package/dist/transpiler-web.js.map +1 -0
- package/dist/transpiler.d.ts +3 -0
- package/dist/transpiler.js +218 -0
- package/dist/transpiler.js.map +1 -0
- package/dist/types.d.ts +76 -0
- package/dist/types.js +11 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +5 -0
- package/dist/utils.js +36 -0
- package/dist/utils.js.map +1 -0
- package/kern.config.ts +61 -0
- package/package.json +64 -0
|
@@ -0,0 +1,612 @@
|
|
|
1
|
+
import { camelKey, countTokens, serializeIR } from './utils.js';
|
|
2
|
+
const HTTP_METHODS = new Set(['get', 'post', 'put', 'delete']);
|
|
3
|
+
function analyzeRouteCapabilities(routeNode) {
|
|
4
|
+
const streamNode = getFirstChild(routeNode, 'stream');
|
|
5
|
+
// spawn must be inside stream (for SSE output), not standalone on route
|
|
6
|
+
const spawnNode = streamNode ? getFirstChild(streamNode, 'spawn') : undefined;
|
|
7
|
+
const timerNode = getFirstChild(routeNode, 'timer');
|
|
8
|
+
const hasStream = !!streamNode;
|
|
9
|
+
const hasSpawn = !!spawnNode;
|
|
10
|
+
const hasTimer = !!timerNode;
|
|
11
|
+
return {
|
|
12
|
+
hasStream,
|
|
13
|
+
hasSpawn,
|
|
14
|
+
hasTimer,
|
|
15
|
+
streamNode,
|
|
16
|
+
spawnNode,
|
|
17
|
+
timerNode,
|
|
18
|
+
needsAbortController: hasStream || hasSpawn || hasTimer,
|
|
19
|
+
needsChildProcess: hasSpawn,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
// ── SSE stream code generator ────────────────────────────────────────────
|
|
23
|
+
function generateStreamSetup(indent) {
|
|
24
|
+
return [
|
|
25
|
+
`${indent}res.writeHead(200, {`,
|
|
26
|
+
`${indent} 'Content-Type': 'text/event-stream',`,
|
|
27
|
+
`${indent} 'Cache-Control': 'no-cache',`,
|
|
28
|
+
`${indent} 'Connection': 'keep-alive',`,
|
|
29
|
+
`${indent}});`,
|
|
30
|
+
`${indent}res.flushHeaders();`,
|
|
31
|
+
`${indent}`,
|
|
32
|
+
`${indent}const emit = (data: unknown, event?: string) => {`,
|
|
33
|
+
`${indent} if (res.writableEnded) return;`,
|
|
34
|
+
`${indent} if (event) res.write(\`event: \${event}\\n\`);`,
|
|
35
|
+
`${indent} res.write(\`data: \${JSON.stringify(data)}\\n\\n\`);`,
|
|
36
|
+
`${indent}};`,
|
|
37
|
+
`${indent}`,
|
|
38
|
+
`${indent}// SSE heartbeat — keeps proxies/browsers from killing the connection`,
|
|
39
|
+
`${indent}const heartbeat = setInterval(() => {`,
|
|
40
|
+
`${indent} if (res.writableEnded) { clearInterval(heartbeat); return; }`,
|
|
41
|
+
`${indent} res.write(': keep-alive\\n\\n');`,
|
|
42
|
+
`${indent}}, 15000);`,
|
|
43
|
+
];
|
|
44
|
+
}
|
|
45
|
+
function generateStreamWrap(handlerLines, hasSpawn, indent) {
|
|
46
|
+
const lines = [];
|
|
47
|
+
// Await the async IIFE so Express doesn't return before stream completes
|
|
48
|
+
lines.push(`${indent}await (async () => {`);
|
|
49
|
+
lines.push(`${indent} try {`);
|
|
50
|
+
if (hasSpawn) {
|
|
51
|
+
// Wrap spawn in a Promise so we await child completion before closing stream
|
|
52
|
+
lines.push(`${indent} await new Promise<void>((resolveStream, rejectStream) => {`);
|
|
53
|
+
lines.push(...handlerLines.map(l => `${indent} ${l}`));
|
|
54
|
+
// The spawn's on('close') handler should call resolveStream()
|
|
55
|
+
lines.push(`${indent} });`);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
lines.push(...handlerLines.map(l => `${indent} ${l}`));
|
|
59
|
+
}
|
|
60
|
+
lines.push(`${indent} } catch (err) {`);
|
|
61
|
+
lines.push(`${indent} emit({ type: 'error', error: err instanceof Error ? err.message : String(err) });`);
|
|
62
|
+
lines.push(`${indent} } finally {`);
|
|
63
|
+
lines.push(`${indent} clearInterval(heartbeat);`);
|
|
64
|
+
lines.push(`${indent} if (!res.writableEnded) {`);
|
|
65
|
+
lines.push(`${indent} res.write(\`data: \${JSON.stringify('[DONE]')}\\n\\n\`);`);
|
|
66
|
+
lines.push(`${indent} res.end();`);
|
|
67
|
+
lines.push(`${indent} }`);
|
|
68
|
+
lines.push(`${indent} }`);
|
|
69
|
+
lines.push(`${indent}})();`);
|
|
70
|
+
return lines;
|
|
71
|
+
}
|
|
72
|
+
// ── Spawn code generator ─────────────────────────────────────────────────
|
|
73
|
+
function generateSpawnCode(spawnNode, indent) {
|
|
74
|
+
const p = getProps(spawnNode);
|
|
75
|
+
const binary = String(p.binary || 'echo');
|
|
76
|
+
const args = p.args;
|
|
77
|
+
const timeoutSec = Number(p.timeout) || 0;
|
|
78
|
+
const lines = [];
|
|
79
|
+
// Validate: binary must be static (security: no dynamic binary)
|
|
80
|
+
if (binary.includes('{{') || binary.includes('req.')) {
|
|
81
|
+
lines.push(`${indent}// ERROR: Dynamic binary is not allowed for security. Use a static binary name.`);
|
|
82
|
+
lines.push(`${indent}res.status(500).json({ error: 'Dynamic binary not allowed' });`);
|
|
83
|
+
return lines;
|
|
84
|
+
}
|
|
85
|
+
const argsExpr = args || '[]';
|
|
86
|
+
lines.push(`${indent}const child = spawn('${escapeSingleQuotes(binary)}', ${argsExpr}, {`);
|
|
87
|
+
lines.push(`${indent} stdio: ['pipe', 'pipe', 'pipe'],`);
|
|
88
|
+
lines.push(`${indent} shell: false,`);
|
|
89
|
+
// Env vars
|
|
90
|
+
const envNodes = getChildren(spawnNode, 'env');
|
|
91
|
+
if (envNodes.length > 0) {
|
|
92
|
+
const envPairs = envNodes.map(e => {
|
|
93
|
+
const ep = getProps(e);
|
|
94
|
+
const entries = Object.entries(ep).filter(([k]) => k !== 'styles' && k !== 'pseudoStyles' && k !== 'themeRefs');
|
|
95
|
+
return entries.map(([k, v]) => `${k}: '${String(v)}'`).join(', ');
|
|
96
|
+
}).join(', ');
|
|
97
|
+
lines.push(`${indent} env: { ...process.env, ${envPairs} },`);
|
|
98
|
+
}
|
|
99
|
+
lines.push(`${indent}});`);
|
|
100
|
+
// stdin handling — only end if no stdin prop
|
|
101
|
+
if (!p.stdin) {
|
|
102
|
+
lines.push(`${indent}child.stdin.end();`);
|
|
103
|
+
}
|
|
104
|
+
lines.push(`${indent}let errorText = '';`);
|
|
105
|
+
// Timeout with SIGTERM → SIGKILL escalation
|
|
106
|
+
lines.push(`${indent}let childExited = false;`);
|
|
107
|
+
lines.push(`${indent}child.on('exit', () => { childExited = true; });`);
|
|
108
|
+
if (timeoutSec > 0) {
|
|
109
|
+
lines.push(`${indent}const spawnTimer = setTimeout(() => {`);
|
|
110
|
+
lines.push(`${indent} child.kill('SIGTERM');`);
|
|
111
|
+
lines.push(`${indent} setTimeout(() => { if (!childExited) child.kill('SIGKILL'); }, 3000);`);
|
|
112
|
+
lines.push(`${indent}}, ${timeoutSec * 1000});`);
|
|
113
|
+
}
|
|
114
|
+
// Abort on request close — SIGTERM then force SIGKILL + resolve after 5s
|
|
115
|
+
lines.push(`${indent}ac.signal.addEventListener('abort', () => {`);
|
|
116
|
+
lines.push(`${indent} if (!childExited) {`);
|
|
117
|
+
lines.push(`${indent} child.kill('SIGTERM');`);
|
|
118
|
+
lines.push(`${indent} setTimeout(() => {`);
|
|
119
|
+
lines.push(`${indent} if (!childExited) child.kill('SIGKILL');`);
|
|
120
|
+
lines.push(`${indent} if (typeof resolveStream === 'function') resolveStream();`);
|
|
121
|
+
lines.push(`${indent} }, 5000);`);
|
|
122
|
+
lines.push(`${indent} }`);
|
|
123
|
+
lines.push(`${indent}});`);
|
|
124
|
+
// Event handlers from child nodes
|
|
125
|
+
const onNodes = getChildren(spawnNode, 'on');
|
|
126
|
+
let hasCloseHandler = false;
|
|
127
|
+
for (const onNode of onNodes) {
|
|
128
|
+
const onProps = getProps(onNode);
|
|
129
|
+
const event = String(onProps.name || onProps.event || '');
|
|
130
|
+
const handlerChild = getFirstChild(onNode, 'handler');
|
|
131
|
+
const code = handlerChild ? String(getProps(handlerChild).code || '') : '';
|
|
132
|
+
if (event === 'stdout') {
|
|
133
|
+
lines.push(`${indent}child.stdout.on('data', (chunk: Buffer) => {`);
|
|
134
|
+
lines.push(...code.split('\n').map(l => `${indent} ${l.trim()}`));
|
|
135
|
+
lines.push(`${indent}});`);
|
|
136
|
+
}
|
|
137
|
+
else if (event === 'stderr') {
|
|
138
|
+
lines.push(`${indent}child.stderr.on('data', (chunk: Buffer) => {`);
|
|
139
|
+
lines.push(...code.split('\n').map(l => `${indent} ${l.trim()}`));
|
|
140
|
+
lines.push(`${indent}});`);
|
|
141
|
+
}
|
|
142
|
+
else if (event === 'close') {
|
|
143
|
+
hasCloseHandler = true;
|
|
144
|
+
lines.push(`${indent}child.on('close', (code: number | null) => {`);
|
|
145
|
+
if (timeoutSec > 0)
|
|
146
|
+
lines.push(`${indent} clearTimeout(spawnTimer);`);
|
|
147
|
+
lines.push(...code.split('\n').map(l => `${indent} ${l.trim()}`));
|
|
148
|
+
// Resolve the stream promise so finally block runs AFTER child exits
|
|
149
|
+
lines.push(`${indent} if (typeof resolveStream === 'function') resolveStream();`);
|
|
150
|
+
lines.push(`${indent}});`);
|
|
151
|
+
}
|
|
152
|
+
else if (event === 'timeout') {
|
|
153
|
+
// Handled via the timer killed branch
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// Default close handler if none specified — ensures stream promise resolves
|
|
157
|
+
if (!hasCloseHandler) {
|
|
158
|
+
lines.push(`${indent}child.on('close', (code: number | null) => {`);
|
|
159
|
+
if (timeoutSec > 0)
|
|
160
|
+
lines.push(`${indent} clearTimeout(spawnTimer);`);
|
|
161
|
+
lines.push(`${indent} if (typeof resolveStream === 'function') resolveStream();`);
|
|
162
|
+
lines.push(`${indent}});`);
|
|
163
|
+
}
|
|
164
|
+
// Catch spawn errors (binary not found)
|
|
165
|
+
lines.push(`${indent}child.on('error', (err: Error) => {`);
|
|
166
|
+
lines.push(`${indent} emit({ type: 'error', error: err.message });`);
|
|
167
|
+
lines.push(`${indent} if (typeof resolveStream === 'function') resolveStream();`);
|
|
168
|
+
lines.push(`${indent}});`);
|
|
169
|
+
return lines;
|
|
170
|
+
}
|
|
171
|
+
// ── Timer code generator ─────────────────────────────────────────────────
|
|
172
|
+
function generateTimerCode(timerNode, handlerCode, indent) {
|
|
173
|
+
const p = getProps(timerNode);
|
|
174
|
+
const timeoutSec = Number(Object.values(p).find(v => typeof v === 'string' && !isNaN(Number(v))) || p.timeout || 15);
|
|
175
|
+
const handlerChild = getFirstChild(timerNode, 'handler');
|
|
176
|
+
const timerHandlerCode = handlerChild ? String(getProps(handlerChild).code || '') : '';
|
|
177
|
+
const onTimeoutNode = (timerNode.children || []).find(c => c.type === 'on' && (getProps(c).name === 'timeout' || getProps(c).event === 'timeout'));
|
|
178
|
+
const timeoutHandler = onTimeoutNode ? getFirstChild(onTimeoutNode, 'handler') : undefined;
|
|
179
|
+
const timeoutCode = timeoutHandler ? String(getProps(timeoutHandler).code || '') : `res.status(408).json({ error: 'Request timed out' });`;
|
|
180
|
+
const lines = [];
|
|
181
|
+
lines.push(`${indent}const timeoutMs = ${timeoutSec * 1000};`);
|
|
182
|
+
lines.push(`${indent}const timer = setTimeout(() => {`);
|
|
183
|
+
lines.push(`${indent} ac.abort();`);
|
|
184
|
+
lines.push(...timeoutCode.split('\n').map(l => `${indent} ${l.trim()}`));
|
|
185
|
+
lines.push(`${indent}}, timeoutMs);`);
|
|
186
|
+
lines.push(`${indent}`);
|
|
187
|
+
lines.push(`${indent}try {`);
|
|
188
|
+
// Timer handler code (the work to do)
|
|
189
|
+
if (timerHandlerCode) {
|
|
190
|
+
lines.push(...timerHandlerCode.split('\n').map(l => `${indent} ${l.trim()}`));
|
|
191
|
+
}
|
|
192
|
+
// Original route handler code
|
|
193
|
+
if (handlerCode) {
|
|
194
|
+
lines.push(...handlerCode.split('\n').map(l => `${indent} ${l.trim()}`));
|
|
195
|
+
}
|
|
196
|
+
lines.push(`${indent}} catch (err) {`);
|
|
197
|
+
lines.push(`${indent} if (!ac.signal.aborted) {`);
|
|
198
|
+
lines.push(`${indent} clearTimeout(timer);`);
|
|
199
|
+
lines.push(`${indent} throw err;`);
|
|
200
|
+
lines.push(`${indent} }`);
|
|
201
|
+
lines.push(`${indent}} finally {`);
|
|
202
|
+
lines.push(`${indent} clearTimeout(timer);`);
|
|
203
|
+
lines.push(`${indent}}`);
|
|
204
|
+
return lines;
|
|
205
|
+
}
|
|
206
|
+
function getProps(node) {
|
|
207
|
+
return node.props || {};
|
|
208
|
+
}
|
|
209
|
+
function getChildren(node, type) {
|
|
210
|
+
return (node.children || []).filter(child => child.type === type);
|
|
211
|
+
}
|
|
212
|
+
function getFirstChild(node, type) {
|
|
213
|
+
return (node.children || []).find(child => child.type === type);
|
|
214
|
+
}
|
|
215
|
+
function pascalCase(value) {
|
|
216
|
+
const camel = camelKey(value);
|
|
217
|
+
return camel ? camel.charAt(0).toUpperCase() + camel.slice(1) : 'Generated';
|
|
218
|
+
}
|
|
219
|
+
function slugify(value) {
|
|
220
|
+
return value
|
|
221
|
+
.toLowerCase()
|
|
222
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
223
|
+
.replace(/^-+|-+$/g, '') || 'generated';
|
|
224
|
+
}
|
|
225
|
+
function escapeSingleQuotes(value) {
|
|
226
|
+
return value.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
|
|
227
|
+
}
|
|
228
|
+
function indentBlock(code, indent) {
|
|
229
|
+
return code.split('\n').map(line => `${indent}${line}`);
|
|
230
|
+
}
|
|
231
|
+
function splitTopLevel(value) {
|
|
232
|
+
const parts = [];
|
|
233
|
+
let current = '';
|
|
234
|
+
let braceDepth = 0;
|
|
235
|
+
let bracketDepth = 0;
|
|
236
|
+
let parenDepth = 0;
|
|
237
|
+
let inQuote = false;
|
|
238
|
+
for (let i = 0; i < value.length; i++) {
|
|
239
|
+
const ch = value[i];
|
|
240
|
+
if (ch === '"' && value[i - 1] !== '\\') {
|
|
241
|
+
inQuote = !inQuote;
|
|
242
|
+
current += ch;
|
|
243
|
+
continue;
|
|
244
|
+
}
|
|
245
|
+
if (!inQuote) {
|
|
246
|
+
if (ch === '{')
|
|
247
|
+
braceDepth++;
|
|
248
|
+
if (ch === '}')
|
|
249
|
+
braceDepth--;
|
|
250
|
+
if (ch === '[')
|
|
251
|
+
bracketDepth++;
|
|
252
|
+
if (ch === ']')
|
|
253
|
+
bracketDepth--;
|
|
254
|
+
if (ch === '(')
|
|
255
|
+
parenDepth++;
|
|
256
|
+
if (ch === ')')
|
|
257
|
+
parenDepth--;
|
|
258
|
+
if (ch === ',' && braceDepth === 0 && bracketDepth === 0 && parenDepth === 0) {
|
|
259
|
+
if (current.trim())
|
|
260
|
+
parts.push(current.trim());
|
|
261
|
+
current = '';
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
current += ch;
|
|
266
|
+
}
|
|
267
|
+
if (current.trim())
|
|
268
|
+
parts.push(current.trim());
|
|
269
|
+
return parts;
|
|
270
|
+
}
|
|
271
|
+
function extractRequiredKeys(schemaType) {
|
|
272
|
+
const trimmed = schemaType.trim();
|
|
273
|
+
if (!trimmed.startsWith('{') || !trimmed.endsWith('}'))
|
|
274
|
+
return [];
|
|
275
|
+
const keys = [];
|
|
276
|
+
const inner = trimmed.slice(1, -1);
|
|
277
|
+
for (const part of splitTopLevel(inner)) {
|
|
278
|
+
const colonIdx = part.indexOf(':');
|
|
279
|
+
if (colonIdx === -1)
|
|
280
|
+
continue;
|
|
281
|
+
const rawKey = part.slice(0, colonIdx).trim();
|
|
282
|
+
if (!rawKey || rawKey.endsWith('?'))
|
|
283
|
+
continue;
|
|
284
|
+
keys.push(rawKey.replace(/^['"]|['"]$/g, ''));
|
|
285
|
+
}
|
|
286
|
+
return keys;
|
|
287
|
+
}
|
|
288
|
+
function derivePathParams(path) {
|
|
289
|
+
const matches = path.matchAll(/:([A-Za-z_][A-Za-z0-9_]*)/g);
|
|
290
|
+
return [...matches].map(match => match[1]);
|
|
291
|
+
}
|
|
292
|
+
function buildPathParamsType(path) {
|
|
293
|
+
const params = derivePathParams(path);
|
|
294
|
+
if (params.length === 0)
|
|
295
|
+
return undefined;
|
|
296
|
+
return `{ ${params.map(param => `${param}: string`).join('; ')} }`;
|
|
297
|
+
}
|
|
298
|
+
function findServerNode(root) {
|
|
299
|
+
if (root.type === 'server')
|
|
300
|
+
return root;
|
|
301
|
+
for (const child of root.children || []) {
|
|
302
|
+
const found = findServerNode(child);
|
|
303
|
+
if (found)
|
|
304
|
+
return found;
|
|
305
|
+
}
|
|
306
|
+
return undefined;
|
|
307
|
+
}
|
|
308
|
+
function routeFileBase(method, path, index) {
|
|
309
|
+
const base = slugify(`${method}-${path.replace(/[:/]/g, '-')}`);
|
|
310
|
+
return base === 'generated' ? `route-${index}` : base;
|
|
311
|
+
}
|
|
312
|
+
function routeRegisterName(method, path) {
|
|
313
|
+
return `register${pascalCase(`${method} ${path}`)}Route`;
|
|
314
|
+
}
|
|
315
|
+
function middlewareExportName(node) {
|
|
316
|
+
const props = getProps(node);
|
|
317
|
+
const handlerName = typeof props.handler === 'string' ? props.handler : undefined;
|
|
318
|
+
if (handlerName)
|
|
319
|
+
return handlerName;
|
|
320
|
+
const name = typeof props.name === 'string' ? props.name : 'middleware';
|
|
321
|
+
return camelKey(name) || 'middlewareHandler';
|
|
322
|
+
}
|
|
323
|
+
function buildSchema(node) {
|
|
324
|
+
if (!node)
|
|
325
|
+
return {};
|
|
326
|
+
const props = getProps(node);
|
|
327
|
+
const schema = {};
|
|
328
|
+
if (typeof props.body === 'string')
|
|
329
|
+
schema.body = props.body;
|
|
330
|
+
if (typeof props.params === 'string')
|
|
331
|
+
schema.params = props.params;
|
|
332
|
+
if (typeof props.query === 'string')
|
|
333
|
+
schema.query = props.query;
|
|
334
|
+
if (typeof props.response === 'string')
|
|
335
|
+
schema.response = props.response;
|
|
336
|
+
return schema;
|
|
337
|
+
}
|
|
338
|
+
function buildMiddlewareArtifact(node, exportName) {
|
|
339
|
+
const handlerNode = getFirstChild(node, 'handler');
|
|
340
|
+
const handlerProps = handlerNode ? getProps(handlerNode) : {};
|
|
341
|
+
const handlerCode = typeof handlerProps.code === 'string'
|
|
342
|
+
? String(handlerProps.code)
|
|
343
|
+
: '';
|
|
344
|
+
const lines = [];
|
|
345
|
+
lines.push(`import type { NextFunction, Request, Response } from 'express';`);
|
|
346
|
+
lines.push('');
|
|
347
|
+
lines.push(`export function ${exportName}(req: Request, res: Response, next: NextFunction): void {`);
|
|
348
|
+
if (handlerCode) {
|
|
349
|
+
lines.push(...indentBlock(handlerCode, ' '));
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
lines.push(' next();');
|
|
353
|
+
}
|
|
354
|
+
lines.push('}');
|
|
355
|
+
const name = String(getProps(node).name || exportName);
|
|
356
|
+
return {
|
|
357
|
+
path: `middleware/${slugify(name)}.ts`,
|
|
358
|
+
content: lines.join('\n'),
|
|
359
|
+
type: 'middleware',
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
function ensureCustomMiddlewareArtifact(node, middlewareArtifacts) {
|
|
363
|
+
const name = String(getProps(node).name || 'middleware');
|
|
364
|
+
const fileBase = slugify(name);
|
|
365
|
+
const existing = middlewareArtifacts.get(fileBase);
|
|
366
|
+
if (existing)
|
|
367
|
+
return existing;
|
|
368
|
+
const exportName = middlewareExportName(node);
|
|
369
|
+
const artifact = buildMiddlewareArtifact(node, exportName);
|
|
370
|
+
const created = { artifact, exportName, fileBase };
|
|
371
|
+
middlewareArtifacts.set(fileBase, created);
|
|
372
|
+
return created;
|
|
373
|
+
}
|
|
374
|
+
function resolveMiddlewareUsage(node, middlewareArtifacts, importPrefix) {
|
|
375
|
+
const props = getProps(node);
|
|
376
|
+
const name = String(props.name || 'middleware');
|
|
377
|
+
if (name === 'cors') {
|
|
378
|
+
return { importLine: `import cors from 'cors';`, invocation: 'cors()' };
|
|
379
|
+
}
|
|
380
|
+
if (name === 'json') {
|
|
381
|
+
return { invocation: 'express.json()' };
|
|
382
|
+
}
|
|
383
|
+
const artifact = ensureCustomMiddlewareArtifact(node, middlewareArtifacts);
|
|
384
|
+
return {
|
|
385
|
+
importLine: `import { ${artifact.exportName} } from '${importPrefix}middleware/${artifact.fileBase}.js';`,
|
|
386
|
+
invocation: artifact.exportName,
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
function buildRouteArtifact(routeNode, routeIndex, middlewareArtifacts, sourceMap) {
|
|
390
|
+
const props = getProps(routeNode);
|
|
391
|
+
const method = String(props.method || 'get').toLowerCase();
|
|
392
|
+
const normalizedMethod = HTTP_METHODS.has(method) ? method : 'get';
|
|
393
|
+
const path = String(props.path || '/');
|
|
394
|
+
const fileBase = routeFileBase(normalizedMethod, path, routeIndex);
|
|
395
|
+
const registerName = routeRegisterName(normalizedMethod, path);
|
|
396
|
+
const schema = buildSchema(getFirstChild(routeNode, 'schema'));
|
|
397
|
+
const caps = analyzeRouteCapabilities(routeNode);
|
|
398
|
+
// Get handler code — priority: stream handler > timer handler > route handler > 501
|
|
399
|
+
const handlerNode = caps.hasStream
|
|
400
|
+
? getFirstChild(caps.streamNode, 'handler')
|
|
401
|
+
: caps.hasTimer
|
|
402
|
+
? null // timer owns its own handler, don't look at route level
|
|
403
|
+
: getFirstChild(routeNode, 'handler');
|
|
404
|
+
const routeHandlerNode = getFirstChild(routeNode, 'handler');
|
|
405
|
+
const handlerProps = handlerNode ? getProps(handlerNode) : {};
|
|
406
|
+
const routeHandlerCode = routeHandlerNode ? String(getProps(routeHandlerNode).code || '') : '';
|
|
407
|
+
const handlerCode = typeof handlerProps.code === 'string'
|
|
408
|
+
? String(handlerProps.code)
|
|
409
|
+
: caps.hasStream || caps.hasTimer ? '' : `res.status(501).json({ error: 'Route handler not implemented' });`;
|
|
410
|
+
const routeMiddleware = getChildren(routeNode, 'middleware');
|
|
411
|
+
const routeImports = new Set();
|
|
412
|
+
const middlewareInvocations = [];
|
|
413
|
+
let needsExpressDefaultImport = false;
|
|
414
|
+
for (const middlewareNode of routeMiddleware) {
|
|
415
|
+
const usage = resolveMiddlewareUsage(middlewareNode, middlewareArtifacts, '../');
|
|
416
|
+
if (usage.importLine)
|
|
417
|
+
routeImports.add(usage.importLine);
|
|
418
|
+
if (usage.invocation === 'express.json()')
|
|
419
|
+
needsExpressDefaultImport = true;
|
|
420
|
+
middlewareInvocations.push(usage.invocation);
|
|
421
|
+
}
|
|
422
|
+
const paramsType = schema.params || buildPathParamsType(path) || 'Record<string, never>';
|
|
423
|
+
const queryType = schema.query || 'Record<string, never>';
|
|
424
|
+
const bodyType = schema.body || 'Record<string, never>';
|
|
425
|
+
const responseType = schema.response || 'unknown';
|
|
426
|
+
const requestType = `Request<RouteParams, ResponseBody, RequestBody, RequestQuery>`;
|
|
427
|
+
const validationLines = [];
|
|
428
|
+
const requiredParams = schema.params ? extractRequiredKeys(schema.params) : derivePathParams(path);
|
|
429
|
+
const requiredBody = schema.body ? extractRequiredKeys(schema.body) : [];
|
|
430
|
+
const requiredQuery = schema.query ? extractRequiredKeys(schema.query) : [];
|
|
431
|
+
if (requiredParams.length > 0) {
|
|
432
|
+
validationLines.push(`assertRequiredFields('params', req.params, [${requiredParams.map(key => `'${escapeSingleQuotes(key)}'`).join(', ')}]);`);
|
|
433
|
+
}
|
|
434
|
+
if (requiredBody.length > 0) {
|
|
435
|
+
validationLines.push(`assertRequiredFields('body', req.body, [${requiredBody.map(key => `'${escapeSingleQuotes(key)}'`).join(', ')}]);`);
|
|
436
|
+
}
|
|
437
|
+
if (requiredQuery.length > 0) {
|
|
438
|
+
validationLines.push(`assertRequiredFields('query', req.query, [${requiredQuery.map(key => `'${escapeSingleQuotes(key)}'`).join(', ')}]);`);
|
|
439
|
+
}
|
|
440
|
+
const lines = [];
|
|
441
|
+
if (needsExpressDefaultImport) {
|
|
442
|
+
lines.push(`import express, { type Express, type NextFunction, type Request, type Response } from 'express';`);
|
|
443
|
+
}
|
|
444
|
+
else {
|
|
445
|
+
lines.push(`import { type Express, type NextFunction, type Request, type Response } from 'express';`);
|
|
446
|
+
}
|
|
447
|
+
if (caps.needsChildProcess) {
|
|
448
|
+
lines.push(`import { spawn } from 'node:child_process';`);
|
|
449
|
+
}
|
|
450
|
+
for (const routeImport of [...routeImports].sort()) {
|
|
451
|
+
lines.push(routeImport);
|
|
452
|
+
}
|
|
453
|
+
lines.push('');
|
|
454
|
+
lines.push(`type RouteParams = ${paramsType};`);
|
|
455
|
+
lines.push(`type RequestQuery = ${queryType};`);
|
|
456
|
+
lines.push(`type RequestBody = ${bodyType};`);
|
|
457
|
+
lines.push(`type ResponseBody = ${responseType};`);
|
|
458
|
+
if (validationLines.length > 0) {
|
|
459
|
+
lines.push('');
|
|
460
|
+
lines.push(`function assertRequiredFields(label: string, value: unknown, requiredKeys: string[]): void {`);
|
|
461
|
+
lines.push(` if (typeof value !== 'object' || value === null) {`);
|
|
462
|
+
lines.push(` throw new Error(\`Invalid \${label}: expected object payload\`);`);
|
|
463
|
+
lines.push(' }');
|
|
464
|
+
lines.push(` for (const key of requiredKeys) {`);
|
|
465
|
+
lines.push(` if (!(key in value)) {`);
|
|
466
|
+
lines.push(` throw new Error(\`Invalid \${label}: missing \${key}\`);`);
|
|
467
|
+
lines.push(' }');
|
|
468
|
+
lines.push(' }');
|
|
469
|
+
lines.push('}');
|
|
470
|
+
}
|
|
471
|
+
lines.push('');
|
|
472
|
+
lines.push(`export function ${registerName}(app: Express): void {`);
|
|
473
|
+
lines.push(` app.${normalizedMethod}('${escapeSingleQuotes(path)}', ${middlewareInvocations.length > 0 ? `${middlewareInvocations.join(', ')}, ` : ''}async (req: ${requestType}, res: Response, next: NextFunction) => {`);
|
|
474
|
+
// Schema validation — always runs first, before stream/timer
|
|
475
|
+
if (validationLines.length > 0) {
|
|
476
|
+
lines.push(' try {');
|
|
477
|
+
for (const validationLine of validationLines) {
|
|
478
|
+
lines.push(` ${validationLine}`);
|
|
479
|
+
}
|
|
480
|
+
lines.push(' } catch (err) {');
|
|
481
|
+
lines.push(' return res.status(400).json({ error: err instanceof Error ? err.message : String(err) } as any);');
|
|
482
|
+
lines.push(' }');
|
|
483
|
+
lines.push('');
|
|
484
|
+
}
|
|
485
|
+
// Request-scoped AbortController (if any async capability)
|
|
486
|
+
if (caps.needsAbortController) {
|
|
487
|
+
lines.push(' const ac = new AbortController();');
|
|
488
|
+
lines.push(" req.on('close', () => ac.abort());");
|
|
489
|
+
lines.push('');
|
|
490
|
+
}
|
|
491
|
+
if (caps.hasStream) {
|
|
492
|
+
// SSE route — validate first, then stream
|
|
493
|
+
lines.push(...generateStreamSetup(' '));
|
|
494
|
+
lines.push('');
|
|
495
|
+
const streamHandlerLines = handlerCode.split('\n').map(l => l.trim()).filter(Boolean);
|
|
496
|
+
// If spawn inside stream, generate spawn code
|
|
497
|
+
if (caps.hasSpawn && caps.spawnNode) {
|
|
498
|
+
const spawnLines = generateSpawnCode(caps.spawnNode, '');
|
|
499
|
+
streamHandlerLines.push(...spawnLines);
|
|
500
|
+
}
|
|
501
|
+
lines.push(...generateStreamWrap(streamHandlerLines, caps.hasSpawn, ' '));
|
|
502
|
+
}
|
|
503
|
+
else if (caps.hasTimer && caps.timerNode) {
|
|
504
|
+
// Timer route — wrap handler in timeout
|
|
505
|
+
lines.push(...generateTimerCode(caps.timerNode, routeHandlerCode, ' '));
|
|
506
|
+
}
|
|
507
|
+
else {
|
|
508
|
+
// Standard route — try/catch → next(error)
|
|
509
|
+
lines.push(' try {');
|
|
510
|
+
lines.push(...indentBlock(handlerCode, ' '));
|
|
511
|
+
lines.push(' } catch (error) {');
|
|
512
|
+
lines.push(' next(error);');
|
|
513
|
+
lines.push(' }');
|
|
514
|
+
}
|
|
515
|
+
lines.push(' });');
|
|
516
|
+
lines.push('}');
|
|
517
|
+
sourceMap.push({
|
|
518
|
+
irLine: routeNode.loc?.line || 0,
|
|
519
|
+
irCol: routeNode.loc?.col || 1,
|
|
520
|
+
outLine: 1,
|
|
521
|
+
outCol: 1,
|
|
522
|
+
});
|
|
523
|
+
return {
|
|
524
|
+
registerName,
|
|
525
|
+
fileBase,
|
|
526
|
+
artifact: {
|
|
527
|
+
path: `routes/${fileBase}.ts`,
|
|
528
|
+
content: lines.join('\n'),
|
|
529
|
+
type: 'route',
|
|
530
|
+
},
|
|
531
|
+
};
|
|
532
|
+
}
|
|
533
|
+
export function transpileExpress(root, _config) {
|
|
534
|
+
const sourceMap = [];
|
|
535
|
+
const middlewareArtifacts = new Map();
|
|
536
|
+
const serverNode = findServerNode(root) || root;
|
|
537
|
+
const serverProps = getProps(serverNode);
|
|
538
|
+
const serverName = String(serverProps.name || 'KernExpressServer');
|
|
539
|
+
const port = String(serverProps.port || '3000');
|
|
540
|
+
const serverMiddlewares = getChildren(serverNode, 'middleware');
|
|
541
|
+
const routeNodes = getChildren(serverNode, 'route');
|
|
542
|
+
const serverImports = new Set();
|
|
543
|
+
const serverMiddlewareInvocations = [];
|
|
544
|
+
for (const middlewareNode of serverMiddlewares) {
|
|
545
|
+
const usage = resolveMiddlewareUsage(middlewareNode, middlewareArtifacts, './');
|
|
546
|
+
if (usage.importLine)
|
|
547
|
+
serverImports.add(usage.importLine);
|
|
548
|
+
serverMiddlewareInvocations.push(usage.invocation);
|
|
549
|
+
}
|
|
550
|
+
const routeArtifacts = routeNodes.map((routeNode, index) => buildRouteArtifact(routeNode, index, middlewareArtifacts, sourceMap));
|
|
551
|
+
const lines = [];
|
|
552
|
+
lines.push(`import express from 'express';`);
|
|
553
|
+
lines.push(`import type { NextFunction, Request, Response } from 'express';`);
|
|
554
|
+
for (const serverImport of [...serverImports].sort()) {
|
|
555
|
+
lines.push(serverImport);
|
|
556
|
+
}
|
|
557
|
+
for (const routeArtifact of routeArtifacts) {
|
|
558
|
+
lines.push(`import { ${routeArtifact.registerName} } from './routes/${routeArtifact.fileBase}.js';`);
|
|
559
|
+
}
|
|
560
|
+
lines.push('');
|
|
561
|
+
lines.push(`const app = express();`);
|
|
562
|
+
lines.push(`const port = ${port};`);
|
|
563
|
+
lines.push(`const serverName = '${escapeSingleQuotes(serverName)}';`);
|
|
564
|
+
lines.push('');
|
|
565
|
+
for (const invocation of serverMiddlewareInvocations) {
|
|
566
|
+
lines.push(`app.use(${invocation});`);
|
|
567
|
+
}
|
|
568
|
+
if (serverMiddlewareInvocations.length > 0 && routeArtifacts.length > 0) {
|
|
569
|
+
lines.push('');
|
|
570
|
+
}
|
|
571
|
+
for (const routeArtifact of routeArtifacts) {
|
|
572
|
+
lines.push(`${routeArtifact.registerName}(app);`);
|
|
573
|
+
}
|
|
574
|
+
if (routeArtifacts.length > 0) {
|
|
575
|
+
lines.push('');
|
|
576
|
+
}
|
|
577
|
+
lines.push(`app.use((error: unknown, _req: Request, res: Response, _next: NextFunction) => {`);
|
|
578
|
+
lines.push(` const message = error instanceof Error ? error.message : 'Internal Server Error';`);
|
|
579
|
+
lines.push(` res.status(500).json({ error: message });`);
|
|
580
|
+
lines.push('});');
|
|
581
|
+
lines.push('');
|
|
582
|
+
lines.push(`app.listen(port, () => {`);
|
|
583
|
+
lines.push(` console.log(\`\${serverName} listening on port \${port}\`);`);
|
|
584
|
+
lines.push('});');
|
|
585
|
+
lines.push('');
|
|
586
|
+
lines.push('export default app;');
|
|
587
|
+
sourceMap.unshift({
|
|
588
|
+
irLine: serverNode.loc?.line || root.loc?.line || 0,
|
|
589
|
+
irCol: serverNode.loc?.col || root.loc?.col || 1,
|
|
590
|
+
outLine: 1,
|
|
591
|
+
outCol: 1,
|
|
592
|
+
});
|
|
593
|
+
const artifacts = [
|
|
594
|
+
...routeArtifacts.map(route => route.artifact),
|
|
595
|
+
...[...middlewareArtifacts.values()].map(entry => entry.artifact),
|
|
596
|
+
];
|
|
597
|
+
const output = lines.join('\n');
|
|
598
|
+
const irText = serializeIR(root);
|
|
599
|
+
const tsText = [output, ...artifacts.map(artifact => artifact.content)].join('\n');
|
|
600
|
+
const irTokenCount = countTokens(irText);
|
|
601
|
+
const tsTokenCount = countTokens(tsText);
|
|
602
|
+
const tokenReduction = Math.round((1 - irTokenCount / tsTokenCount) * 100);
|
|
603
|
+
return {
|
|
604
|
+
code: output,
|
|
605
|
+
sourceMap,
|
|
606
|
+
irTokenCount,
|
|
607
|
+
tsTokenCount,
|
|
608
|
+
tokenReduction,
|
|
609
|
+
artifacts,
|
|
610
|
+
};
|
|
611
|
+
}
|
|
612
|
+
//# sourceMappingURL=transpiler-express.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transpiler-express.js","sourceRoot":"","sources":["../src/transpiler-express.ts"],"names":[],"mappings":"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"}
|