@rcrsr/rill 0.1.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 +21 -0
- package/README.md +187 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +69 -0
- package/dist/cli.js.map +1 -0
- package/dist/demo.d.ts +6 -0
- package/dist/demo.d.ts.map +1 -0
- package/dist/demo.js +121 -0
- package/dist/demo.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/lexer/errors.d.ts +9 -0
- package/dist/lexer/errors.d.ts.map +1 -0
- package/dist/lexer/errors.js +12 -0
- package/dist/lexer/errors.js.map +1 -0
- package/dist/lexer/helpers.d.ts +14 -0
- package/dist/lexer/helpers.d.ts.map +1 -0
- package/dist/lexer/helpers.js +30 -0
- package/dist/lexer/helpers.js.map +1 -0
- package/dist/lexer/index.d.ts +8 -0
- package/dist/lexer/index.d.ts.map +1 -0
- package/dist/lexer/index.js +8 -0
- package/dist/lexer/index.js.map +1 -0
- package/dist/lexer/operators.d.ts +11 -0
- package/dist/lexer/operators.d.ts.map +1 -0
- package/dist/lexer/operators.js +58 -0
- package/dist/lexer/operators.js.map +1 -0
- package/dist/lexer/readers.d.ts +12 -0
- package/dist/lexer/readers.d.ts.map +1 -0
- package/dist/lexer/readers.js +144 -0
- package/dist/lexer/readers.js.map +1 -0
- package/dist/lexer/state.d.ts +18 -0
- package/dist/lexer/state.d.ts.map +1 -0
- package/dist/lexer/state.js +37 -0
- package/dist/lexer/state.js.map +1 -0
- package/dist/lexer/tokenizer.d.ts +9 -0
- package/dist/lexer/tokenizer.d.ts.map +1 -0
- package/dist/lexer/tokenizer.js +100 -0
- package/dist/lexer/tokenizer.js.map +1 -0
- package/dist/lexer.d.ts +19 -0
- package/dist/lexer.d.ts.map +1 -0
- package/dist/lexer.js +344 -0
- package/dist/lexer.js.map +1 -0
- package/dist/parser/arithmetic.d.ts +16 -0
- package/dist/parser/arithmetic.d.ts.map +1 -0
- package/dist/parser/arithmetic.js +128 -0
- package/dist/parser/arithmetic.js.map +1 -0
- package/dist/parser/boolean.d.ts +15 -0
- package/dist/parser/boolean.d.ts.map +1 -0
- package/dist/parser/boolean.js +20 -0
- package/dist/parser/boolean.js.map +1 -0
- package/dist/parser/control-flow.d.ts +56 -0
- package/dist/parser/control-flow.d.ts.map +1 -0
- package/dist/parser/control-flow.js +167 -0
- package/dist/parser/control-flow.js.map +1 -0
- package/dist/parser/expressions.d.ts +23 -0
- package/dist/parser/expressions.d.ts.map +1 -0
- package/dist/parser/expressions.js +950 -0
- package/dist/parser/expressions.js.map +1 -0
- package/dist/parser/extraction.d.ts +48 -0
- package/dist/parser/extraction.d.ts.map +1 -0
- package/dist/parser/extraction.js +279 -0
- package/dist/parser/extraction.js.map +1 -0
- package/dist/parser/functions.d.ts +20 -0
- package/dist/parser/functions.d.ts.map +1 -0
- package/dist/parser/functions.js +96 -0
- package/dist/parser/functions.js.map +1 -0
- package/dist/parser/helpers.d.ts +94 -0
- package/dist/parser/helpers.d.ts.map +1 -0
- package/dist/parser/helpers.js +225 -0
- package/dist/parser/helpers.js.map +1 -0
- package/dist/parser/index.d.ts +49 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +73 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/literals.d.ts +37 -0
- package/dist/parser/literals.d.ts.map +1 -0
- package/dist/parser/literals.js +373 -0
- package/dist/parser/literals.js.map +1 -0
- package/dist/parser/parser-collect.d.ts +16 -0
- package/dist/parser/parser-collect.d.ts.map +1 -0
- package/dist/parser/parser-collect.js +125 -0
- package/dist/parser/parser-collect.js.map +1 -0
- package/dist/parser/parser-control.d.ts +20 -0
- package/dist/parser/parser-control.d.ts.map +1 -0
- package/dist/parser/parser-control.js +120 -0
- package/dist/parser/parser-control.js.map +1 -0
- package/dist/parser/parser-expr.d.ts +37 -0
- package/dist/parser/parser-expr.d.ts.map +1 -0
- package/dist/parser/parser-expr.js +639 -0
- package/dist/parser/parser-expr.js.map +1 -0
- package/dist/parser/parser-extract.d.ts +17 -0
- package/dist/parser/parser-extract.d.ts.map +1 -0
- package/dist/parser/parser-extract.js +222 -0
- package/dist/parser/parser-extract.js.map +1 -0
- package/dist/parser/parser-functions.d.ts +21 -0
- package/dist/parser/parser-functions.d.ts.map +1 -0
- package/dist/parser/parser-functions.js +155 -0
- package/dist/parser/parser-functions.js.map +1 -0
- package/dist/parser/parser-literals.d.ts +22 -0
- package/dist/parser/parser-literals.d.ts.map +1 -0
- package/dist/parser/parser-literals.js +288 -0
- package/dist/parser/parser-literals.js.map +1 -0
- package/dist/parser/parser-script.d.ts +21 -0
- package/dist/parser/parser-script.d.ts.map +1 -0
- package/dist/parser/parser-script.js +174 -0
- package/dist/parser/parser-script.js.map +1 -0
- package/dist/parser/parser-variables.d.ts +20 -0
- package/dist/parser/parser-variables.d.ts.map +1 -0
- package/dist/parser/parser-variables.js +146 -0
- package/dist/parser/parser-variables.js.map +1 -0
- package/dist/parser/parser.d.ts +49 -0
- package/dist/parser/parser.d.ts.map +1 -0
- package/dist/parser/parser.js +54 -0
- package/dist/parser/parser.js.map +1 -0
- package/dist/parser/script.d.ts +14 -0
- package/dist/parser/script.d.ts.map +1 -0
- package/dist/parser/script.js +196 -0
- package/dist/parser/script.js.map +1 -0
- package/dist/parser/state.d.ts +40 -0
- package/dist/parser/state.d.ts.map +1 -0
- package/dist/parser/state.js +129 -0
- package/dist/parser/state.js.map +1 -0
- package/dist/parser/variables.d.ts +10 -0
- package/dist/parser/variables.d.ts.map +1 -0
- package/dist/parser/variables.js +215 -0
- package/dist/parser/variables.js.map +1 -0
- package/dist/runtime/ast-equals.d.ts +13 -0
- package/dist/runtime/ast-equals.d.ts.map +1 -0
- package/dist/runtime/ast-equals.js +447 -0
- package/dist/runtime/ast-equals.js.map +1 -0
- package/dist/runtime/builtins.d.ts +13 -0
- package/dist/runtime/builtins.d.ts.map +1 -0
- package/dist/runtime/builtins.js +180 -0
- package/dist/runtime/builtins.js.map +1 -0
- package/dist/runtime/callable.d.ts +88 -0
- package/dist/runtime/callable.d.ts.map +1 -0
- package/dist/runtime/callable.js +98 -0
- package/dist/runtime/callable.js.map +1 -0
- package/dist/runtime/context.d.ts +13 -0
- package/dist/runtime/context.d.ts.map +1 -0
- package/dist/runtime/context.js +73 -0
- package/dist/runtime/context.js.map +1 -0
- package/dist/runtime/core/callable.d.ts +171 -0
- package/dist/runtime/core/callable.d.ts.map +1 -0
- package/dist/runtime/core/callable.js +246 -0
- package/dist/runtime/core/callable.js.map +1 -0
- package/dist/runtime/core/context.d.ts +29 -0
- package/dist/runtime/core/context.d.ts.map +1 -0
- package/dist/runtime/core/context.js +154 -0
- package/dist/runtime/core/context.js.map +1 -0
- package/dist/runtime/core/equals.d.ts +9 -0
- package/dist/runtime/core/equals.d.ts.map +1 -0
- package/dist/runtime/core/equals.js +381 -0
- package/dist/runtime/core/equals.js.map +1 -0
- package/dist/runtime/core/eval/base.d.ts +65 -0
- package/dist/runtime/core/eval/base.d.ts.map +1 -0
- package/dist/runtime/core/eval/base.js +112 -0
- package/dist/runtime/core/eval/base.js.map +1 -0
- package/dist/runtime/core/eval/evaluator.d.ts +47 -0
- package/dist/runtime/core/eval/evaluator.d.ts.map +1 -0
- package/dist/runtime/core/eval/evaluator.js +73 -0
- package/dist/runtime/core/eval/evaluator.js.map +1 -0
- package/dist/runtime/core/eval/index.d.ts +57 -0
- package/dist/runtime/core/eval/index.d.ts.map +1 -0
- package/dist/runtime/core/eval/index.js +95 -0
- package/dist/runtime/core/eval/index.js.map +1 -0
- package/dist/runtime/core/eval/mixins/annotations.d.ts +19 -0
- package/dist/runtime/core/eval/mixins/annotations.d.ts.map +1 -0
- package/dist/runtime/core/eval/mixins/annotations.js +146 -0
- package/dist/runtime/core/eval/mixins/annotations.js.map +1 -0
- package/dist/runtime/core/eval/mixins/closures.d.ts +49 -0
- package/dist/runtime/core/eval/mixins/closures.d.ts.map +1 -0
- package/dist/runtime/core/eval/mixins/closures.js +479 -0
- package/dist/runtime/core/eval/mixins/closures.js.map +1 -0
- package/dist/runtime/core/eval/mixins/collections.d.ts +24 -0
- package/dist/runtime/core/eval/mixins/collections.d.ts.map +1 -0
- package/dist/runtime/core/eval/mixins/collections.js +466 -0
- package/dist/runtime/core/eval/mixins/collections.js.map +1 -0
- package/dist/runtime/core/eval/mixins/control-flow.d.ts +27 -0
- package/dist/runtime/core/eval/mixins/control-flow.d.ts.map +1 -0
- package/dist/runtime/core/eval/mixins/control-flow.js +369 -0
- package/dist/runtime/core/eval/mixins/control-flow.js.map +1 -0
- package/dist/runtime/core/eval/mixins/core.d.ts +24 -0
- package/dist/runtime/core/eval/mixins/core.d.ts.map +1 -0
- package/dist/runtime/core/eval/mixins/core.js +335 -0
- package/dist/runtime/core/eval/mixins/core.js.map +1 -0
- package/dist/runtime/core/eval/mixins/expressions.d.ts +19 -0
- package/dist/runtime/core/eval/mixins/expressions.d.ts.map +1 -0
- package/dist/runtime/core/eval/mixins/expressions.js +202 -0
- package/dist/runtime/core/eval/mixins/expressions.js.map +1 -0
- package/dist/runtime/core/eval/mixins/extraction.d.ts +10 -0
- package/dist/runtime/core/eval/mixins/extraction.d.ts.map +1 -0
- package/dist/runtime/core/eval/mixins/extraction.js +250 -0
- package/dist/runtime/core/eval/mixins/extraction.js.map +1 -0
- package/dist/runtime/core/eval/mixins/literals.d.ts +23 -0
- package/dist/runtime/core/eval/mixins/literals.d.ts.map +1 -0
- package/dist/runtime/core/eval/mixins/literals.js +180 -0
- package/dist/runtime/core/eval/mixins/literals.js.map +1 -0
- package/dist/runtime/core/eval/mixins/types.d.ts +20 -0
- package/dist/runtime/core/eval/mixins/types.d.ts.map +1 -0
- package/dist/runtime/core/eval/mixins/types.js +109 -0
- package/dist/runtime/core/eval/mixins/types.js.map +1 -0
- package/dist/runtime/core/eval/mixins/variables.d.ts +34 -0
- package/dist/runtime/core/eval/mixins/variables.d.ts.map +1 -0
- package/dist/runtime/core/eval/mixins/variables.js +247 -0
- package/dist/runtime/core/eval/mixins/variables.js.map +1 -0
- package/dist/runtime/core/eval/types.d.ts +41 -0
- package/dist/runtime/core/eval/types.d.ts.map +1 -0
- package/dist/runtime/core/eval/types.js +10 -0
- package/dist/runtime/core/eval/types.js.map +1 -0
- package/dist/runtime/core/evaluate.d.ts +42 -0
- package/dist/runtime/core/evaluate.d.ts.map +1 -0
- package/dist/runtime/core/evaluate.debug.js +1251 -0
- package/dist/runtime/core/evaluate.js +1913 -0
- package/dist/runtime/core/evaluate.js.map +1 -0
- package/dist/runtime/core/execute.d.ts +26 -0
- package/dist/runtime/core/execute.d.ts.map +1 -0
- package/dist/runtime/core/execute.js +177 -0
- package/dist/runtime/core/execute.js.map +1 -0
- package/dist/runtime/core/signals.d.ts +19 -0
- package/dist/runtime/core/signals.d.ts.map +1 -0
- package/dist/runtime/core/signals.js +26 -0
- package/dist/runtime/core/signals.js.map +1 -0
- package/dist/runtime/core/types.d.ts +177 -0
- package/dist/runtime/core/types.d.ts.map +1 -0
- package/dist/runtime/core/types.js +50 -0
- package/dist/runtime/core/types.js.map +1 -0
- package/dist/runtime/core/values.d.ts +66 -0
- package/dist/runtime/core/values.d.ts.map +1 -0
- package/dist/runtime/core/values.js +240 -0
- package/dist/runtime/core/values.js.map +1 -0
- package/dist/runtime/evaluate.d.ts +32 -0
- package/dist/runtime/evaluate.d.ts.map +1 -0
- package/dist/runtime/evaluate.js +1111 -0
- package/dist/runtime/evaluate.js.map +1 -0
- package/dist/runtime/execute.d.ts +26 -0
- package/dist/runtime/execute.d.ts.map +1 -0
- package/dist/runtime/execute.js +121 -0
- package/dist/runtime/execute.js.map +1 -0
- package/dist/runtime/ext/builtins.d.ts +16 -0
- package/dist/runtime/ext/builtins.d.ts.map +1 -0
- package/dist/runtime/ext/builtins.js +528 -0
- package/dist/runtime/ext/builtins.js.map +1 -0
- package/dist/runtime/ext/content-parser.d.ts +83 -0
- package/dist/runtime/ext/content-parser.d.ts.map +1 -0
- package/dist/runtime/ext/content-parser.js +536 -0
- package/dist/runtime/ext/content-parser.js.map +1 -0
- package/dist/runtime/index.d.ts +28 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +34 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/signals.d.ts +19 -0
- package/dist/runtime/signals.d.ts.map +1 -0
- package/dist/runtime/signals.js +26 -0
- package/dist/runtime/signals.js.map +1 -0
- package/dist/runtime/types.d.ts +169 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +50 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/runtime/values.d.ts +50 -0
- package/dist/runtime/values.d.ts.map +1 -0
- package/dist/runtime/values.js +209 -0
- package/dist/runtime/values.js.map +1 -0
- package/dist/runtime.d.ts +254 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +2014 -0
- package/dist/runtime.js.map +1 -0
- package/dist/types.d.ts +752 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +189 -0
- package/dist/types.js.map +1 -0
- package/docs/00_INDEX.md +65 -0
- package/docs/01_guide.md +390 -0
- package/docs/02_types.md +399 -0
- package/docs/03_variables.md +314 -0
- package/docs/04_operators.md +551 -0
- package/docs/05_control-flow.md +350 -0
- package/docs/06_closures.md +353 -0
- package/docs/07_collections.md +686 -0
- package/docs/08_iterators.md +330 -0
- package/docs/09_strings.md +205 -0
- package/docs/10_parsing.md +366 -0
- package/docs/11_reference.md +350 -0
- package/docs/12_examples.md +771 -0
- package/docs/13_modules.md +519 -0
- package/docs/14_host-integration.md +826 -0
- package/docs/15_grammar.ebnf +693 -0
- package/docs/16_conventions.md +696 -0
- package/docs/99_llm-reference.txt +300 -0
- package/docs/assets/logo.png +0 -0
- package/package.json +70 -0
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Callable Types
|
|
3
|
+
*
|
|
4
|
+
* Unified representation for all callable values in Rill:
|
|
5
|
+
* - ScriptCallable: Closures parsed from Rill source code
|
|
6
|
+
* - RuntimeCallable: Rill's built-in functions (type, log, json, identity)
|
|
7
|
+
* - ApplicationCallable: Host application-provided functions
|
|
8
|
+
*
|
|
9
|
+
* Public API for host applications.
|
|
10
|
+
*
|
|
11
|
+
* ## Implementation Notes
|
|
12
|
+
*
|
|
13
|
+
* [DEVIATION] EC-1 Error Context Fields
|
|
14
|
+
* - Spec defines error context as { functionName, paramName, expectedType, actualType }
|
|
15
|
+
* - EC-1 (excess arguments) uses { functionName, expectedCount, actualCount }
|
|
16
|
+
* - Rationale: Excess arguments is an arity check, not a type check
|
|
17
|
+
*
|
|
18
|
+
* [ASSUMPTION] validateDefaultValueType _functionName Parameter
|
|
19
|
+
* - Parameter accepted but unused (prefixed with _ to satisfy eslint)
|
|
20
|
+
* - Kept for API consistency with validateHostFunctionArgs signature
|
|
21
|
+
*
|
|
22
|
+
* [ASSUMPTION] validateHostFunctionArgs Args Array Mutation
|
|
23
|
+
* - args array mutated in-place when substituting default values
|
|
24
|
+
* - Per spec algorithm: "Apply default values for missing arguments before validation"
|
|
25
|
+
* - Mutation occurs before host function receives args, maintaining immutability contract
|
|
26
|
+
*/
|
|
27
|
+
import { RILL_ERROR_CODES, RuntimeError } from '../../types.js';
|
|
28
|
+
import { astEquals } from './equals.js';
|
|
29
|
+
import { formatValue, inferType, isTuple } from './values.js';
|
|
30
|
+
/** Type guard for any callable */
|
|
31
|
+
export function isCallable(value) {
|
|
32
|
+
return (typeof value === 'object' &&
|
|
33
|
+
value !== null &&
|
|
34
|
+
'__type' in value &&
|
|
35
|
+
value.__type === 'callable');
|
|
36
|
+
}
|
|
37
|
+
/** Type guard for script callable */
|
|
38
|
+
export function isScriptCallable(value) {
|
|
39
|
+
return isCallable(value) && value.kind === 'script';
|
|
40
|
+
}
|
|
41
|
+
/** Type guard for runtime callable */
|
|
42
|
+
export function isRuntimeCallable(value) {
|
|
43
|
+
return isCallable(value) && value.kind === 'runtime';
|
|
44
|
+
}
|
|
45
|
+
/** Type guard for application callable */
|
|
46
|
+
export function isApplicationCallable(value) {
|
|
47
|
+
return isCallable(value) && value.kind === 'application';
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Create an application callable from a host function.
|
|
51
|
+
* Creates an untyped callable (params: undefined) that skips validation.
|
|
52
|
+
* @param fn The function to wrap
|
|
53
|
+
* @param isProperty If true, auto-invokes when accessed from dict (property-style)
|
|
54
|
+
*/
|
|
55
|
+
export function callable(fn, isProperty = false) {
|
|
56
|
+
return {
|
|
57
|
+
__type: 'callable',
|
|
58
|
+
kind: 'application',
|
|
59
|
+
params: undefined,
|
|
60
|
+
fn,
|
|
61
|
+
isProperty,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/** Type guard for dict (plain object, not array, not callable, not tuple) */
|
|
65
|
+
export function isDict(value) {
|
|
66
|
+
return (typeof value === 'object' &&
|
|
67
|
+
value !== null &&
|
|
68
|
+
!Array.isArray(value) &&
|
|
69
|
+
!isCallable(value) &&
|
|
70
|
+
!isTuple(value));
|
|
71
|
+
}
|
|
72
|
+
/** Format a callable for display */
|
|
73
|
+
export function formatCallable(callable) {
|
|
74
|
+
if (callable.kind === 'script') {
|
|
75
|
+
const paramStr = callable.params.map((p) => p.name).join(', ');
|
|
76
|
+
return `(${paramStr}) { ... }`;
|
|
77
|
+
}
|
|
78
|
+
return '(...) { [native] }';
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Deep equality for script callables.
|
|
82
|
+
* Compares params, body AST structure, and defining scope.
|
|
83
|
+
*
|
|
84
|
+
* Two closures are equal if:
|
|
85
|
+
* 1. Same parameter names, types, and default values
|
|
86
|
+
* 2. Structurally identical body AST (ignoring source locations)
|
|
87
|
+
* 3. Same defining scope (reference equality)
|
|
88
|
+
*/
|
|
89
|
+
export function callableEquals(a, b, valueEquals = (x, y) => formatValue(x) === formatValue(y)) {
|
|
90
|
+
// Compare params (name, type, default)
|
|
91
|
+
if (a.params.length !== b.params.length)
|
|
92
|
+
return false;
|
|
93
|
+
for (let i = 0; i < a.params.length; i++) {
|
|
94
|
+
const ap = a.params[i];
|
|
95
|
+
const bp = b.params[i];
|
|
96
|
+
if (ap === undefined || bp === undefined)
|
|
97
|
+
return false;
|
|
98
|
+
if (ap.name !== bp.name)
|
|
99
|
+
return false;
|
|
100
|
+
if (ap.typeName !== bp.typeName)
|
|
101
|
+
return false;
|
|
102
|
+
if (!valueEquals(ap.defaultValue ?? null, bp.defaultValue ?? null)) {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// Compare body by AST structure (ignoring source locations)
|
|
107
|
+
if (!astEquals(a.body, b.body)) {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
// Compare defining scope by reference (same scope = same closure context)
|
|
111
|
+
if (a.definingScope !== b.definingScope)
|
|
112
|
+
return false;
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Validate defaultValue type matches declared parameter type.
|
|
117
|
+
*
|
|
118
|
+
* Called at registration time to catch configuration errors early.
|
|
119
|
+
* Throws Error (not RuntimeError) to indicate registration failure.
|
|
120
|
+
*
|
|
121
|
+
* @param param - Parameter with defaultValue to validate
|
|
122
|
+
* @param _functionName - Function name (unused, kept for API consistency)
|
|
123
|
+
* @throws Error if defaultValue type doesn't match param.type
|
|
124
|
+
*/
|
|
125
|
+
export function validateDefaultValueType(param, _functionName) {
|
|
126
|
+
if (param.defaultValue === undefined)
|
|
127
|
+
return;
|
|
128
|
+
const actualType = inferType(param.defaultValue);
|
|
129
|
+
const expectedType = param.type;
|
|
130
|
+
if (actualType !== expectedType) {
|
|
131
|
+
throw new Error(`Invalid defaultValue for parameter '${param.name}': expected ${expectedType}, got ${actualType}`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Validate host function arguments against parameter declarations.
|
|
136
|
+
*
|
|
137
|
+
* Called before function invocation to enforce type contracts.
|
|
138
|
+
* Throws RuntimeError on validation failure.
|
|
139
|
+
*
|
|
140
|
+
* @param args - Evaluated arguments from call site
|
|
141
|
+
* @param params - Parameter declarations from function definition
|
|
142
|
+
* @param functionName - Function name for error messages
|
|
143
|
+
* @param location - Source location for error reporting
|
|
144
|
+
* @throws RuntimeError with RUNTIME_TYPE_ERROR on validation failure
|
|
145
|
+
*/
|
|
146
|
+
export function validateHostFunctionArgs(args, params, functionName, location) {
|
|
147
|
+
// Check for excess arguments
|
|
148
|
+
if (args.length > params.length) {
|
|
149
|
+
throw new RuntimeError(RILL_ERROR_CODES.RUNTIME_TYPE_ERROR, `Function '${functionName}' expects ${params.length} arguments, got ${args.length}`, location, {
|
|
150
|
+
functionName,
|
|
151
|
+
expectedCount: params.length,
|
|
152
|
+
actualCount: args.length,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
// Validate each parameter
|
|
156
|
+
for (let i = 0; i < params.length; i++) {
|
|
157
|
+
const param = params[i];
|
|
158
|
+
if (param === undefined)
|
|
159
|
+
continue;
|
|
160
|
+
let arg = args[i];
|
|
161
|
+
// Handle missing argument
|
|
162
|
+
if (arg === undefined) {
|
|
163
|
+
if (param.defaultValue !== undefined) {
|
|
164
|
+
// Substitute default value (already validated at registration)
|
|
165
|
+
arg = param.defaultValue;
|
|
166
|
+
args[i] = arg;
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
// Missing required argument
|
|
170
|
+
throw new RuntimeError(RILL_ERROR_CODES.RUNTIME_TYPE_ERROR, `Missing required argument '${param.name}' for function '${functionName}'`, location, {
|
|
171
|
+
functionName,
|
|
172
|
+
paramName: param.name,
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// Validate argument type
|
|
177
|
+
const actualType = inferType(arg);
|
|
178
|
+
const expectedType = param.type;
|
|
179
|
+
if (actualType !== expectedType) {
|
|
180
|
+
throw new RuntimeError(RILL_ERROR_CODES.RUNTIME_TYPE_ERROR, `Type mismatch in ${functionName}: parameter '${param.name}' expects ${expectedType}, got ${actualType}`, location, {
|
|
181
|
+
functionName,
|
|
182
|
+
paramName: param.name,
|
|
183
|
+
expectedType,
|
|
184
|
+
actualType,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Validate arguments against CallableParam[] for ApplicationCallable.
|
|
191
|
+
*
|
|
192
|
+
* Similar to validateHostFunctionArgs but works with CallableParam[] (used in ApplicationCallable).
|
|
193
|
+
* Validates argument count, applies defaults, and checks types for primitive parameters.
|
|
194
|
+
*
|
|
195
|
+
* @param args - Arguments array (mutated in-place when defaults applied)
|
|
196
|
+
* @param params - Parameter definitions
|
|
197
|
+
* @param functionName - Function name for error messages
|
|
198
|
+
* @param location - Source location for error reporting
|
|
199
|
+
* @throws RuntimeError with RUNTIME_TYPE_ERROR on validation failure
|
|
200
|
+
*/
|
|
201
|
+
export function validateCallableArgs(args, params, functionName, location) {
|
|
202
|
+
// Check for excess arguments
|
|
203
|
+
if (args.length > params.length) {
|
|
204
|
+
throw new RuntimeError(RILL_ERROR_CODES.RUNTIME_TYPE_ERROR, `Function '${functionName}' expects ${params.length} arguments, got ${args.length}`, location, {
|
|
205
|
+
functionName,
|
|
206
|
+
expectedCount: params.length,
|
|
207
|
+
actualCount: args.length,
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
// Validate each parameter
|
|
211
|
+
for (let i = 0; i < params.length; i++) {
|
|
212
|
+
const param = params[i];
|
|
213
|
+
if (param === undefined)
|
|
214
|
+
continue;
|
|
215
|
+
let arg = args[i];
|
|
216
|
+
// Handle missing argument
|
|
217
|
+
if (arg === undefined) {
|
|
218
|
+
if (param.defaultValue !== null) {
|
|
219
|
+
// Substitute default value
|
|
220
|
+
arg = param.defaultValue;
|
|
221
|
+
args[i] = arg;
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
// Missing required argument
|
|
225
|
+
throw new RuntimeError(RILL_ERROR_CODES.RUNTIME_TYPE_ERROR, `Missing required argument '${param.name}' for function '${functionName}'`, location, {
|
|
226
|
+
functionName,
|
|
227
|
+
paramName: param.name,
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
// Validate argument type (only for typed parameters)
|
|
232
|
+
if (param.typeName !== null) {
|
|
233
|
+
const actualType = inferType(arg);
|
|
234
|
+
const expectedType = param.typeName;
|
|
235
|
+
if (actualType !== expectedType) {
|
|
236
|
+
throw new RuntimeError(RILL_ERROR_CODES.RUNTIME_TYPE_ERROR, `Type mismatch in ${functionName}: parameter '${param.name}' expects ${expectedType}, got ${actualType}`, location, {
|
|
237
|
+
functionName,
|
|
238
|
+
paramName: param.name,
|
|
239
|
+
expectedType,
|
|
240
|
+
actualType,
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=callable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"callable.js","sourceRoot":"","sources":["../../../src/runtime/core/callable.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAGH,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAmG9D,kCAAkC;AAClC,MAAM,UAAU,UAAU,CAAC,KAAgB;IACzC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,QAAQ,IAAI,KAAK;QACjB,KAAK,CAAC,MAAM,KAAK,UAAU,CAC5B,CAAC;AACJ,CAAC;AAED,qCAAqC;AACrC,MAAM,UAAU,gBAAgB,CAAC,KAAgB;IAC/C,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;AACtD,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,iBAAiB,CAAC,KAAgB;IAChD,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC;AACvD,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,qBAAqB,CACnC,KAAgB;IAEhB,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC;AAC3D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CACtB,EAAc,EACd,UAAU,GAAG,KAAK;IAElB,OAAO;QACL,MAAM,EAAE,UAAU;QAClB,IAAI,EAAE,aAAa;QACnB,MAAM,EAAE,SAAS;QACjB,EAAE;QACF,UAAU;KACX,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,MAAM,CAAC,KAAgB;IACrC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACrB,CAAC,UAAU,CAAC,KAAK,CAAC;QAClB,CAAC,OAAO,CAAC,KAAK,CAAC,CAChB,CAAC;AACJ,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,cAAc,CAAC,QAAsB;IACnD,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/D,OAAO,IAAI,QAAQ,WAAW,CAAC;IACjC,CAAC;IACD,OAAO,oBAAoB,CAAC;AAC9B,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAC5B,CAAiB,EACjB,CAAiB,EACjB,cAAuD,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC9D,WAAW,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC;IAEnC,uCAAuC;IACvC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QACvD,IAAI,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QACtC,IAAI,EAAE,CAAC,QAAQ,KAAK,EAAE,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC9C,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,YAAY,IAAI,IAAI,EAAE,EAAE,CAAC,YAAY,IAAI,IAAI,CAAC,EAAE,CAAC;YACnE,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,4DAA4D;IAC5D,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,0EAA0E;IAC1E,IAAI,CAAC,CAAC,aAAa,KAAK,CAAC,CAAC,aAAa;QAAE,OAAO,KAAK,CAAC;IAEtD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,wBAAwB,CACtC,KAAwB,EACxB,aAAqB;IAErB,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS;QAAE,OAAO;IAE7C,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACjD,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC;IAEhC,IAAI,UAAU,KAAK,YAAY,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,uCAAuC,KAAK,CAAC,IAAI,eAAe,YAAY,SAAS,UAAU,EAAE,CAClG,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,wBAAwB,CACtC,IAAiB,EACjB,MAAoC,EACpC,YAAoB,EACpB,QAAyB;IAEzB,6BAA6B;IAC7B,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QAChC,MAAM,IAAI,YAAY,CACpB,gBAAgB,CAAC,kBAAkB,EACnC,aAAa,YAAY,aAAa,MAAM,CAAC,MAAM,mBAAmB,IAAI,CAAC,MAAM,EAAE,EACnF,QAAQ,EACR;YACE,YAAY;YACZ,aAAa,EAAE,MAAM,CAAC,MAAM;YAC5B,WAAW,EAAE,IAAI,CAAC,MAAM;SACzB,CACF,CAAC;IACJ,CAAC;IAED,0BAA0B;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAElC,IAAI,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAElB,0BAA0B;QAC1B,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;gBACrC,+DAA+D;gBAC/D,GAAG,GAAG,KAAK,CAAC,YAAY,CAAC;gBACzB,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,4BAA4B;gBAC5B,MAAM,IAAI,YAAY,CACpB,gBAAgB,CAAC,kBAAkB,EACnC,8BAA8B,KAAK,CAAC,IAAI,mBAAmB,YAAY,GAAG,EAC1E,QAAQ,EACR;oBACE,YAAY;oBACZ,SAAS,EAAE,KAAK,CAAC,IAAI;iBACtB,CACF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,yBAAyB;QACzB,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC;QAEhC,IAAI,UAAU,KAAK,YAAY,EAAE,CAAC;YAChC,MAAM,IAAI,YAAY,CACpB,gBAAgB,CAAC,kBAAkB,EACnC,oBAAoB,YAAY,gBAAgB,KAAK,CAAC,IAAI,aAAa,YAAY,SAAS,UAAU,EAAE,EACxG,QAAQ,EACR;gBACE,YAAY;gBACZ,SAAS,EAAE,KAAK,CAAC,IAAI;gBACrB,YAAY;gBACZ,UAAU;aACX,CACF,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAiB,EACjB,MAAgC,EAChC,YAAoB,EACpB,QAAyB;IAEzB,6BAA6B;IAC7B,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QAChC,MAAM,IAAI,YAAY,CACpB,gBAAgB,CAAC,kBAAkB,EACnC,aAAa,YAAY,aAAa,MAAM,CAAC,MAAM,mBAAmB,IAAI,CAAC,MAAM,EAAE,EACnF,QAAQ,EACR;YACE,YAAY;YACZ,aAAa,EAAE,MAAM,CAAC,MAAM;YAC5B,WAAW,EAAE,IAAI,CAAC,MAAM;SACzB,CACF,CAAC;IACJ,CAAC;IAED,0BAA0B;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAElC,IAAI,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAElB,0BAA0B;QAC1B,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;gBAChC,2BAA2B;gBAC3B,GAAG,GAAG,KAAK,CAAC,YAAY,CAAC;gBACzB,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,4BAA4B;gBAC5B,MAAM,IAAI,YAAY,CACpB,gBAAgB,CAAC,kBAAkB,EACnC,8BAA8B,KAAK,CAAC,IAAI,mBAAmB,YAAY,GAAG,EAC1E,QAAQ,EACR;oBACE,YAAY;oBACZ,SAAS,EAAE,KAAK,CAAC,IAAI;iBACtB,CACF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,qDAAqD;QACrD,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YAC5B,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YAClC,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC;YAEpC,IAAI,UAAU,KAAK,YAAY,EAAE,CAAC;gBAChC,MAAM,IAAI,YAAY,CACpB,gBAAgB,CAAC,kBAAkB,EACnC,oBAAoB,YAAY,gBAAgB,KAAK,CAAC,IAAI,aAAa,YAAY,SAAS,UAAU,EAAE,EACxG,QAAQ,EACR;oBACE,YAAY;oBACZ,SAAS,EAAE,KAAK,CAAC,IAAI;oBACrB,YAAY;oBACZ,UAAU;iBACX,CACF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime Context Factory
|
|
3
|
+
*
|
|
4
|
+
* Creates and configures the runtime context for script execution.
|
|
5
|
+
* Public API for host applications.
|
|
6
|
+
*/
|
|
7
|
+
import type { RuntimeContext, RuntimeOptions } from './types.js';
|
|
8
|
+
import { type RillValue } from './values.js';
|
|
9
|
+
/**
|
|
10
|
+
* Create a runtime context for script execution.
|
|
11
|
+
* This is the main entry point for configuring the Rill runtime.
|
|
12
|
+
*/
|
|
13
|
+
export declare function createRuntimeContext(options?: RuntimeOptions): RuntimeContext;
|
|
14
|
+
/**
|
|
15
|
+
* Create a child context for block scoping.
|
|
16
|
+
* Child inherits parent's functions, methods, callbacks, etc.
|
|
17
|
+
* but has its own variables map. Variable lookups walk the parent chain.
|
|
18
|
+
*/
|
|
19
|
+
export declare function createChildContext(parent: RuntimeContext): RuntimeContext;
|
|
20
|
+
/**
|
|
21
|
+
* Get a variable value, walking the parent chain.
|
|
22
|
+
* Returns undefined if not found in any scope.
|
|
23
|
+
*/
|
|
24
|
+
export declare function getVariable(ctx: RuntimeContext, name: string): RillValue | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Check if a variable exists in any scope.
|
|
27
|
+
*/
|
|
28
|
+
export declare function hasVariable(ctx: RuntimeContext, name: string): boolean;
|
|
29
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/runtime/core/context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAGV,cAAc,EACd,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EAA0B,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAarE;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,GAAE,cAAmB,GAC3B,cAAc,CAyGhB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CAezE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,MAAM,GACX,SAAS,GAAG,SAAS,CAQvB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAQtE"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime Context Factory
|
|
3
|
+
*
|
|
4
|
+
* Creates and configures the runtime context for script execution.
|
|
5
|
+
* Public API for host applications.
|
|
6
|
+
*/
|
|
7
|
+
import { RILL_ERROR_CODES, RuntimeError } from '../../types.js';
|
|
8
|
+
import { BUILTIN_FUNCTIONS, BUILTIN_METHODS } from '../ext/builtins.js';
|
|
9
|
+
import { bindDictCallables } from './types.js';
|
|
10
|
+
import { formatValue, inferType } from './values.js';
|
|
11
|
+
import { callable, validateDefaultValueType, } from './callable.js';
|
|
12
|
+
const defaultCallbacks = {
|
|
13
|
+
onLog: (value) => {
|
|
14
|
+
console.log(formatValue(value));
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Create a runtime context for script execution.
|
|
19
|
+
* This is the main entry point for configuring the Rill runtime.
|
|
20
|
+
*/
|
|
21
|
+
export function createRuntimeContext(options = {}) {
|
|
22
|
+
const variables = new Map();
|
|
23
|
+
const variableTypes = new Map();
|
|
24
|
+
const functions = new Map();
|
|
25
|
+
const methods = new Map();
|
|
26
|
+
// Set initial variables (and infer their types)
|
|
27
|
+
if (options.variables) {
|
|
28
|
+
for (const [name, value] of Object.entries(options.variables)) {
|
|
29
|
+
// Bind callables in dicts to their containing dict
|
|
30
|
+
const boundValue = bindDictCallables(value);
|
|
31
|
+
variables.set(name, boundValue);
|
|
32
|
+
variableTypes.set(name, inferType(boundValue));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// Set built-in functions
|
|
36
|
+
for (const [name, fn] of Object.entries(BUILTIN_FUNCTIONS)) {
|
|
37
|
+
functions.set(name, fn);
|
|
38
|
+
}
|
|
39
|
+
// Set custom functions (can override built-ins)
|
|
40
|
+
if (options.functions) {
|
|
41
|
+
for (const [name, definition] of Object.entries(options.functions)) {
|
|
42
|
+
// Type-discriminate CallableFn vs HostFunctionDefinition
|
|
43
|
+
if ('fn' in definition) {
|
|
44
|
+
// It's HostFunctionDefinition with typed parameters
|
|
45
|
+
const { params, fn } = definition;
|
|
46
|
+
// Validate default values at registration time (EC-4)
|
|
47
|
+
if (params) {
|
|
48
|
+
for (const param of params) {
|
|
49
|
+
validateDefaultValueType(param, name);
|
|
50
|
+
}
|
|
51
|
+
// Convert HostFunctionParam[] to CallableParam[]
|
|
52
|
+
const callableParams = params.map((p) => ({
|
|
53
|
+
name: p.name,
|
|
54
|
+
typeName: p.type ?? null,
|
|
55
|
+
defaultValue: p.defaultValue ?? null,
|
|
56
|
+
}));
|
|
57
|
+
// Create ApplicationCallable with params field populated
|
|
58
|
+
const appCallable = callable(fn, false);
|
|
59
|
+
const typedCallable = {
|
|
60
|
+
...appCallable,
|
|
61
|
+
params: callableParams,
|
|
62
|
+
};
|
|
63
|
+
// Store ApplicationCallable for runtime validation in task 1.5
|
|
64
|
+
functions.set(name, typedCallable);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
// HostFunctionDefinition without params (backward compat)
|
|
68
|
+
functions.set(name, fn);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
// It's CallableFn (backward compat)
|
|
73
|
+
functions.set(name, definition);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Set built-in methods
|
|
78
|
+
for (const [name, impl] of Object.entries(BUILTIN_METHODS)) {
|
|
79
|
+
methods.set(name, impl);
|
|
80
|
+
}
|
|
81
|
+
// Compile autoException patterns into RegExp objects
|
|
82
|
+
const autoExceptions = [];
|
|
83
|
+
if (options.autoExceptions) {
|
|
84
|
+
for (const pattern of options.autoExceptions) {
|
|
85
|
+
try {
|
|
86
|
+
autoExceptions.push(new RegExp(pattern));
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
throw new RuntimeError(RILL_ERROR_CODES.RUNTIME_INVALID_PATTERN, `Invalid autoException pattern: ${pattern}`, undefined, { pattern });
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
parent: undefined,
|
|
95
|
+
variables,
|
|
96
|
+
variableTypes,
|
|
97
|
+
functions,
|
|
98
|
+
methods,
|
|
99
|
+
callbacks: { ...defaultCallbacks, ...options.callbacks },
|
|
100
|
+
observability: options.observability ?? {},
|
|
101
|
+
pipeValue: null,
|
|
102
|
+
timeout: options.timeout,
|
|
103
|
+
autoExceptions,
|
|
104
|
+
signal: options.signal,
|
|
105
|
+
annotationStack: [],
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Create a child context for block scoping.
|
|
110
|
+
* Child inherits parent's functions, methods, callbacks, etc.
|
|
111
|
+
* but has its own variables map. Variable lookups walk the parent chain.
|
|
112
|
+
*/
|
|
113
|
+
export function createChildContext(parent) {
|
|
114
|
+
return {
|
|
115
|
+
parent,
|
|
116
|
+
variables: new Map(),
|
|
117
|
+
variableTypes: new Map(),
|
|
118
|
+
functions: parent.functions,
|
|
119
|
+
methods: parent.methods,
|
|
120
|
+
callbacks: parent.callbacks,
|
|
121
|
+
observability: parent.observability,
|
|
122
|
+
pipeValue: parent.pipeValue,
|
|
123
|
+
timeout: parent.timeout,
|
|
124
|
+
autoExceptions: parent.autoExceptions,
|
|
125
|
+
signal: parent.signal,
|
|
126
|
+
annotationStack: parent.annotationStack,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Get a variable value, walking the parent chain.
|
|
131
|
+
* Returns undefined if not found in any scope.
|
|
132
|
+
*/
|
|
133
|
+
export function getVariable(ctx, name) {
|
|
134
|
+
if (ctx.variables.has(name)) {
|
|
135
|
+
return ctx.variables.get(name);
|
|
136
|
+
}
|
|
137
|
+
if (ctx.parent) {
|
|
138
|
+
return getVariable(ctx.parent, name);
|
|
139
|
+
}
|
|
140
|
+
return undefined;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Check if a variable exists in any scope.
|
|
144
|
+
*/
|
|
145
|
+
export function hasVariable(ctx, name) {
|
|
146
|
+
if (ctx.variables.has(name)) {
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
if (ctx.parent) {
|
|
150
|
+
return hasVariable(ctx.parent, name);
|
|
151
|
+
}
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/runtime/core/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AST Structural Equality
|
|
3
|
+
*
|
|
4
|
+
* Compares AST nodes for structural equality, ignoring source locations.
|
|
5
|
+
* Used for closure equality: two closures with identical structure are equal.
|
|
6
|
+
*/
|
|
7
|
+
import type { ASTNode } from '../../types.js';
|
|
8
|
+
export declare function astEquals(a: ASTNode, b: ASTNode): boolean;
|
|
9
|
+
//# sourceMappingURL=equals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"equals.d.ts","sourceRoot":"","sources":["../../../src/runtime/core/equals.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAGV,OAAO,EAmCR,MAAM,gBAAgB,CAAC;AAiBxB,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAmHzD"}
|