@kernlang/core 3.1.2 → 3.1.4
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/dist/codegen/emitters.d.ts +25 -0
- package/dist/codegen/emitters.js +124 -0
- package/dist/codegen/emitters.js.map +1 -0
- package/dist/codegen/helpers.d.ts +22 -0
- package/dist/codegen/helpers.js +159 -0
- package/dist/codegen/helpers.js.map +1 -0
- package/dist/codegen-core.d.ts +5 -28
- package/dist/codegen-core.js +166 -305
- package/dist/codegen-core.js.map +1 -1
- package/dist/concepts.d.ts +12 -2
- package/dist/concepts.js.map +1 -1
- package/dist/config.js +2 -2
- package/dist/config.js.map +1 -1
- package/dist/errors.d.ts +2 -0
- package/dist/errors.js +1 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +8 -4
- package/dist/index.js +12 -10
- package/dist/index.js.map +1 -1
- package/dist/parser.d.ts +15 -10
- package/dist/parser.js +234 -57
- package/dist/parser.js.map +1 -1
- package/dist/runtime.d.ts +57 -0
- package/dist/runtime.js +121 -0
- package/dist/runtime.js.map +1 -0
- package/dist/schema.d.ts +39 -0
- package/dist/schema.js +481 -0
- package/dist/schema.js.map +1 -0
- package/dist/spec.d.ts +5 -4
- package/dist/spec.js +30 -19
- package/dist/spec.js.map +1 -1
- package/dist/styles-tailwind.js +29 -0
- package/dist/styles-tailwind.js.map +1 -1
- package/dist/template-engine.d.ts +3 -2
- package/dist/template-engine.js +24 -18
- package/dist/template-engine.js.map +1 -1
- package/dist/types.d.ts +15 -0
- package/dist/utils.js +7 -1
- package/dist/utils.js.map +1 -1
- package/package.json +30 -1
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KernRuntime — instance-based state for KERN's parser, codegen, and template engine.
|
|
3
|
+
*
|
|
4
|
+
* Centralizes 6 module-level global registries into a single owning instance.
|
|
5
|
+
* All public APIs (parse, parseDocument, generateCoreNode, isTemplateNode,
|
|
6
|
+
* expandTemplateNode, isKnownNodeType) accept an optional `runtime` parameter
|
|
7
|
+
* for true instance isolation (LSP, serverless, worker threads, parallel tests).
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* const runtime = new KernRuntime();
|
|
11
|
+
* runtime.registerEvolvedType('custom');
|
|
12
|
+
* runtime.registerParserHints('custom', { positionalArgs: ['name'] });
|
|
13
|
+
* runtime.registerEvolvedGenerator('custom', node => [...]);
|
|
14
|
+
*
|
|
15
|
+
* A `defaultRuntime` singleton is provided for backward compatibility.
|
|
16
|
+
* All existing module-level functions (registerEvolvedType, clearParserHints, etc.)
|
|
17
|
+
* delegate to `defaultRuntime` so existing code continues to work unchanged.
|
|
18
|
+
*/
|
|
19
|
+
import type { IRNode, ParseDiagnostic, TemplateDefinition } from './types.js';
|
|
20
|
+
export interface ParserHintsConfig {
|
|
21
|
+
positionalArgs?: string[];
|
|
22
|
+
bareWord?: string;
|
|
23
|
+
multilineBlock?: string;
|
|
24
|
+
}
|
|
25
|
+
export declare class KernRuntime {
|
|
26
|
+
readonly parserHints: Map<string, ParserHintsConfig>;
|
|
27
|
+
readonly multilineBlockTypes: Set<string>;
|
|
28
|
+
lastParseDiagnostics: ParseDiagnostic[];
|
|
29
|
+
readonly dynamicNodeTypes: Set<string>;
|
|
30
|
+
readonly evolvedGenerators: Map<string, (node: IRNode) => string[]>;
|
|
31
|
+
readonly evolvedTargetGenerators: Map<string, Map<string, (node: IRNode) => string[]>>;
|
|
32
|
+
readonly templateRegistry: Map<string, TemplateDefinition>;
|
|
33
|
+
registerParserHints(keyword: string, hints: ParserHintsConfig): void;
|
|
34
|
+
unregisterParserHints(keyword: string): void;
|
|
35
|
+
clearParserHints(): void;
|
|
36
|
+
registerEvolvedType(keyword: string): void;
|
|
37
|
+
unregisterEvolvedType(keyword: string): void;
|
|
38
|
+
getEvolvedTypes(): ReadonlySet<string>;
|
|
39
|
+
clearEvolvedTypes(): void;
|
|
40
|
+
registerEvolvedGenerator(keyword: string, fn: (node: IRNode) => string[]): void;
|
|
41
|
+
registerEvolvedTargetGenerator(keyword: string, target: string, fn: (node: IRNode) => string[]): void;
|
|
42
|
+
unregisterEvolvedGenerator(keyword: string): void;
|
|
43
|
+
hasEvolvedGenerator(keyword: string): boolean;
|
|
44
|
+
clearEvolvedGenerators(): void;
|
|
45
|
+
registerTemplate(name: string, def: TemplateDefinition): void;
|
|
46
|
+
isTemplateNode(type: string): boolean;
|
|
47
|
+
getTemplate(name: string): TemplateDefinition | undefined;
|
|
48
|
+
templateCount(): number;
|
|
49
|
+
clearTemplates(): void;
|
|
50
|
+
/** Reset all runtime state. Useful for test isolation. */
|
|
51
|
+
reset(): void;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Default runtime singleton. All existing module-level registration functions
|
|
55
|
+
* delegate to this instance for backward compatibility.
|
|
56
|
+
*/
|
|
57
|
+
export declare const defaultRuntime: KernRuntime;
|
package/dist/runtime.js
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KernRuntime — instance-based state for KERN's parser, codegen, and template engine.
|
|
3
|
+
*
|
|
4
|
+
* Centralizes 6 module-level global registries into a single owning instance.
|
|
5
|
+
* All public APIs (parse, parseDocument, generateCoreNode, isTemplateNode,
|
|
6
|
+
* expandTemplateNode, isKnownNodeType) accept an optional `runtime` parameter
|
|
7
|
+
* for true instance isolation (LSP, serverless, worker threads, parallel tests).
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* const runtime = new KernRuntime();
|
|
11
|
+
* runtime.registerEvolvedType('custom');
|
|
12
|
+
* runtime.registerParserHints('custom', { positionalArgs: ['name'] });
|
|
13
|
+
* runtime.registerEvolvedGenerator('custom', node => [...]);
|
|
14
|
+
*
|
|
15
|
+
* A `defaultRuntime` singleton is provided for backward compatibility.
|
|
16
|
+
* All existing module-level functions (registerEvolvedType, clearParserHints, etc.)
|
|
17
|
+
* delegate to `defaultRuntime` so existing code continues to work unchanged.
|
|
18
|
+
*/
|
|
19
|
+
// ── KernRuntime ──────────────────────────────────────────────────────────
|
|
20
|
+
export class KernRuntime {
|
|
21
|
+
// Parser state
|
|
22
|
+
parserHints = new Map();
|
|
23
|
+
multilineBlockTypes = new Set(['logic', 'handler', 'cleanup', 'body']);
|
|
24
|
+
lastParseDiagnostics = [];
|
|
25
|
+
// Spec state
|
|
26
|
+
dynamicNodeTypes = new Set();
|
|
27
|
+
// Codegen state
|
|
28
|
+
evolvedGenerators = new Map();
|
|
29
|
+
evolvedTargetGenerators = new Map();
|
|
30
|
+
// Template state
|
|
31
|
+
templateRegistry = new Map();
|
|
32
|
+
// ── Parser Hints ─────────────────────────────────────────────────────
|
|
33
|
+
registerParserHints(keyword, hints) {
|
|
34
|
+
this.parserHints.set(keyword, hints);
|
|
35
|
+
if (hints.multilineBlock) {
|
|
36
|
+
this.multilineBlockTypes.add(keyword);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
unregisterParserHints(keyword) {
|
|
40
|
+
const hints = this.parserHints.get(keyword);
|
|
41
|
+
if (hints?.multilineBlock) {
|
|
42
|
+
this.multilineBlockTypes.delete(keyword);
|
|
43
|
+
}
|
|
44
|
+
this.parserHints.delete(keyword);
|
|
45
|
+
}
|
|
46
|
+
clearParserHints() {
|
|
47
|
+
for (const [keyword, hints] of this.parserHints) {
|
|
48
|
+
if (hints.multilineBlock)
|
|
49
|
+
this.multilineBlockTypes.delete(keyword);
|
|
50
|
+
}
|
|
51
|
+
this.parserHints.clear();
|
|
52
|
+
}
|
|
53
|
+
// ── Evolved Types (spec) ─────────────────────────────────────────────
|
|
54
|
+
registerEvolvedType(keyword) {
|
|
55
|
+
this.dynamicNodeTypes.add(keyword);
|
|
56
|
+
}
|
|
57
|
+
unregisterEvolvedType(keyword) {
|
|
58
|
+
this.dynamicNodeTypes.delete(keyword);
|
|
59
|
+
}
|
|
60
|
+
getEvolvedTypes() {
|
|
61
|
+
return new Set(this.dynamicNodeTypes);
|
|
62
|
+
}
|
|
63
|
+
clearEvolvedTypes() {
|
|
64
|
+
this.dynamicNodeTypes.clear();
|
|
65
|
+
}
|
|
66
|
+
// ── Evolved Generators (codegen) ─────────────────────────────────────
|
|
67
|
+
registerEvolvedGenerator(keyword, fn) {
|
|
68
|
+
this.evolvedGenerators.set(keyword, fn);
|
|
69
|
+
}
|
|
70
|
+
registerEvolvedTargetGenerator(keyword, target, fn) {
|
|
71
|
+
let targetMap = this.evolvedTargetGenerators.get(keyword);
|
|
72
|
+
if (!targetMap) {
|
|
73
|
+
targetMap = new Map();
|
|
74
|
+
this.evolvedTargetGenerators.set(keyword, targetMap);
|
|
75
|
+
}
|
|
76
|
+
targetMap.set(target, fn);
|
|
77
|
+
}
|
|
78
|
+
unregisterEvolvedGenerator(keyword) {
|
|
79
|
+
this.evolvedGenerators.delete(keyword);
|
|
80
|
+
this.evolvedTargetGenerators.delete(keyword);
|
|
81
|
+
}
|
|
82
|
+
hasEvolvedGenerator(keyword) {
|
|
83
|
+
return this.evolvedGenerators.has(keyword);
|
|
84
|
+
}
|
|
85
|
+
clearEvolvedGenerators() {
|
|
86
|
+
this.evolvedGenerators.clear();
|
|
87
|
+
this.evolvedTargetGenerators.clear();
|
|
88
|
+
}
|
|
89
|
+
// ── Templates ────────────────────────────────────────────────────────
|
|
90
|
+
registerTemplate(name, def) {
|
|
91
|
+
this.templateRegistry.set(name, def);
|
|
92
|
+
}
|
|
93
|
+
isTemplateNode(type) {
|
|
94
|
+
return this.templateRegistry.has(type);
|
|
95
|
+
}
|
|
96
|
+
getTemplate(name) {
|
|
97
|
+
return this.templateRegistry.get(name);
|
|
98
|
+
}
|
|
99
|
+
templateCount() {
|
|
100
|
+
return this.templateRegistry.size;
|
|
101
|
+
}
|
|
102
|
+
clearTemplates() {
|
|
103
|
+
this.templateRegistry.clear();
|
|
104
|
+
}
|
|
105
|
+
// ── Full Reset ───────────────────────────────────────────────────────
|
|
106
|
+
/** Reset all runtime state. Useful for test isolation. */
|
|
107
|
+
reset() {
|
|
108
|
+
this.clearParserHints();
|
|
109
|
+
this.clearEvolvedTypes();
|
|
110
|
+
this.clearEvolvedGenerators();
|
|
111
|
+
this.clearTemplates();
|
|
112
|
+
this.lastParseDiagnostics = [];
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// ── Default Runtime ──────────────────────────────────────────────────────
|
|
116
|
+
/**
|
|
117
|
+
* Default runtime singleton. All existing module-level registration functions
|
|
118
|
+
* delegate to this instance for backward compatibility.
|
|
119
|
+
*/
|
|
120
|
+
export const defaultRuntime = new KernRuntime();
|
|
121
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/schema.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AST Schema Validation — validates IRNode shape after parsing, before codegen.
|
|
3
|
+
*
|
|
4
|
+
* Defines required/optional props and allowed child types per node type.
|
|
5
|
+
* Catches malformed ASTs (missing required props, wrong children) at the
|
|
6
|
+
* parse boundary instead of scattering validation across 76 codegen functions.
|
|
7
|
+
*
|
|
8
|
+
* Props are classified by kind:
|
|
9
|
+
* - 'identifier' → validated by emitIdentifier
|
|
10
|
+
* - 'typeAnnotation' → validated by emitTypeAnnotation
|
|
11
|
+
* - 'importPath' → validated by emitImportSpecifier
|
|
12
|
+
* - 'rawExpr' → intentional escape hatch (handler code, expressions)
|
|
13
|
+
* - 'rawBlock' → intentional escape hatch (<<<...>>> blocks)
|
|
14
|
+
* - 'string' → free-form string value
|
|
15
|
+
* - 'boolean' → 'true'/'false'
|
|
16
|
+
* - 'number' → numeric value
|
|
17
|
+
*/
|
|
18
|
+
import type { IRNode } from './types.js';
|
|
19
|
+
export type PropKind = 'identifier' | 'typeAnnotation' | 'importPath' | 'rawExpr' | 'rawBlock' | 'string' | 'boolean' | 'number';
|
|
20
|
+
export interface PropSchema {
|
|
21
|
+
required?: boolean;
|
|
22
|
+
kind: PropKind;
|
|
23
|
+
}
|
|
24
|
+
export interface NodeSchema {
|
|
25
|
+
props: Record<string, PropSchema>;
|
|
26
|
+
allowedChildren?: string[];
|
|
27
|
+
}
|
|
28
|
+
export declare const NODE_SCHEMAS: Record<string, NodeSchema>;
|
|
29
|
+
export interface SchemaViolation {
|
|
30
|
+
nodeType: string;
|
|
31
|
+
message: string;
|
|
32
|
+
line?: number;
|
|
33
|
+
col?: number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Validate an IRNode tree against the schema definitions.
|
|
37
|
+
* Returns violations found. Empty array = valid.
|
|
38
|
+
*/
|
|
39
|
+
export declare function validateSchema(root: IRNode): SchemaViolation[];
|