@rezless/vm 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.
Files changed (175) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +32 -0
  3. package/dist/builtins/base64.d.ts +25 -0
  4. package/dist/builtins/base64.d.ts.map +1 -0
  5. package/dist/builtins/base64.js +43 -0
  6. package/dist/builtins/base64.js.map +1 -0
  7. package/dist/builtins/chat.d.ts +10 -0
  8. package/dist/builtins/chat.d.ts.map +1 -0
  9. package/dist/builtins/chat.js +36 -0
  10. package/dist/builtins/chat.js.map +1 -0
  11. package/dist/builtins/dataserver.d.ts +26 -0
  12. package/dist/builtins/dataserver.d.ts.map +1 -0
  13. package/dist/builtins/dataserver.js +20 -0
  14. package/dist/builtins/dataserver.js.map +1 -0
  15. package/dist/builtins/detected.d.ts +40 -0
  16. package/dist/builtins/detected.d.ts.map +1 -0
  17. package/dist/builtins/detected.js +23 -0
  18. package/dist/builtins/detected.js.map +1 -0
  19. package/dist/builtins/hash.d.ts +6 -0
  20. package/dist/builtins/hash.d.ts.map +1 -0
  21. package/dist/builtins/hash.js +34 -0
  22. package/dist/builtins/hash.js.map +1 -0
  23. package/dist/builtins/http.d.ts +40 -0
  24. package/dist/builtins/http.d.ts.map +1 -0
  25. package/dist/builtins/http.js +87 -0
  26. package/dist/builtins/http.js.map +1 -0
  27. package/dist/builtins/identity.d.ts +14 -0
  28. package/dist/builtins/identity.d.ts.map +1 -0
  29. package/dist/builtins/identity.js +17 -0
  30. package/dist/builtins/identity.js.map +1 -0
  31. package/dist/builtins/index.d.ts +8 -0
  32. package/dist/builtins/index.d.ts.map +1 -0
  33. package/dist/builtins/index.js +232 -0
  34. package/dist/builtins/index.js.map +1 -0
  35. package/dist/builtins/inventory.d.ts +33 -0
  36. package/dist/builtins/inventory.d.ts.map +1 -0
  37. package/dist/builtins/inventory.js +134 -0
  38. package/dist/builtins/inventory.js.map +1 -0
  39. package/dist/builtins/json.d.ts +7 -0
  40. package/dist/builtins/json.d.ts.map +1 -0
  41. package/dist/builtins/json.js +690 -0
  42. package/dist/builtins/json.js.map +1 -0
  43. package/dist/builtins/link-info.d.ts +10 -0
  44. package/dist/builtins/link-info.d.ts.map +1 -0
  45. package/dist/builtins/link-info.js +26 -0
  46. package/dist/builtins/link-info.js.map +1 -0
  47. package/dist/builtins/linked.d.ts +23 -0
  48. package/dist/builtins/linked.d.ts.map +1 -0
  49. package/dist/builtins/linked.js +20 -0
  50. package/dist/builtins/linked.js.map +1 -0
  51. package/dist/builtins/linksetdata.d.ts +20 -0
  52. package/dist/builtins/linksetdata.d.ts.map +1 -0
  53. package/dist/builtins/linksetdata.js +196 -0
  54. package/dist/builtins/linksetdata.js.map +1 -0
  55. package/dist/builtins/listen.d.ts +33 -0
  56. package/dist/builtins/listen.d.ts.map +1 -0
  57. package/dist/builtins/listen.js +45 -0
  58. package/dist/builtins/listen.js.map +1 -0
  59. package/dist/builtins/lists.d.ts +37 -0
  60. package/dist/builtins/lists.d.ts.map +1 -0
  61. package/dist/builtins/lists.js +275 -0
  62. package/dist/builtins/lists.js.map +1 -0
  63. package/dist/builtins/math.d.ts +32 -0
  64. package/dist/builtins/math.d.ts.map +1 -0
  65. package/dist/builtins/math.js +104 -0
  66. package/dist/builtins/math.js.map +1 -0
  67. package/dist/builtins/object.d.ts +29 -0
  68. package/dist/builtins/object.d.ts.map +1 -0
  69. package/dist/builtins/object.js +50 -0
  70. package/dist/builtins/object.js.map +1 -0
  71. package/dist/builtins/prim-accessors.d.ts +56 -0
  72. package/dist/builtins/prim-accessors.d.ts.map +1 -0
  73. package/dist/builtins/prim-accessors.js +353 -0
  74. package/dist/builtins/prim-accessors.js.map +1 -0
  75. package/dist/builtins/prim-params.d.ts +12 -0
  76. package/dist/builtins/prim-params.d.ts.map +1 -0
  77. package/dist/builtins/prim-params.js +124 -0
  78. package/dist/builtins/prim-params.js.map +1 -0
  79. package/dist/builtins/script-control.d.ts +13 -0
  80. package/dist/builtins/script-control.d.ts.map +1 -0
  81. package/dist/builtins/script-control.js +41 -0
  82. package/dist/builtins/script-control.js.map +1 -0
  83. package/dist/builtins/strings.d.ts +23 -0
  84. package/dist/builtins/strings.d.ts.map +1 -0
  85. package/dist/builtins/strings.js +130 -0
  86. package/dist/builtins/strings.js.map +1 -0
  87. package/dist/builtins/time.d.ts +28 -0
  88. package/dist/builtins/time.d.ts.map +1 -0
  89. package/dist/builtins/time.js +54 -0
  90. package/dist/builtins/time.js.map +1 -0
  91. package/dist/clock.d.ts +75 -0
  92. package/dist/clock.d.ts.map +1 -0
  93. package/dist/clock.js +125 -0
  94. package/dist/clock.js.map +1 -0
  95. package/dist/coverage.d.ts +110 -0
  96. package/dist/coverage.d.ts.map +1 -0
  97. package/dist/coverage.js +221 -0
  98. package/dist/coverage.js.map +1 -0
  99. package/dist/dispatch.d.ts +19 -0
  100. package/dist/dispatch.d.ts.map +1 -0
  101. package/dist/dispatch.js +42 -0
  102. package/dist/dispatch.js.map +1 -0
  103. package/dist/env.d.ts +33 -0
  104. package/dist/env.d.ts.map +1 -0
  105. package/dist/env.js +76 -0
  106. package/dist/env.js.map +1 -0
  107. package/dist/generated/constants.d.ts +967 -0
  108. package/dist/generated/constants.d.ts.map +1 -0
  109. package/dist/generated/constants.js +969 -0
  110. package/dist/generated/constants.js.map +1 -0
  111. package/dist/generated/constants_table.d.ts +11 -0
  112. package/dist/generated/constants_table.d.ts.map +1 -0
  113. package/dist/generated/constants_table.js +978 -0
  114. package/dist/generated/constants_table.js.map +1 -0
  115. package/dist/generated/events.d.ts +545 -0
  116. package/dist/generated/events.d.ts.map +1 -0
  117. package/dist/generated/events.js +49 -0
  118. package/dist/generated/events.js.map +1 -0
  119. package/dist/generated/functions.d.ts +6051 -0
  120. package/dist/generated/functions.d.ts.map +1 -0
  121. package/dist/generated/functions.js +526 -0
  122. package/dist/generated/functions.js.map +1 -0
  123. package/dist/index.d.ts +21 -0
  124. package/dist/index.d.ts.map +1 -0
  125. package/dist/index.js +11 -0
  126. package/dist/index.js.map +1 -0
  127. package/dist/interpreter.d.ts +39 -0
  128. package/dist/interpreter.d.ts.map +1 -0
  129. package/dist/interpreter.js +381 -0
  130. package/dist/interpreter.js.map +1 -0
  131. package/dist/inventory.d.ts +52 -0
  132. package/dist/inventory.d.ts.map +1 -0
  133. package/dist/inventory.js +45 -0
  134. package/dist/inventory.js.map +1 -0
  135. package/dist/linkset.d.ts +89 -0
  136. package/dist/linkset.d.ts.map +1 -0
  137. package/dist/linkset.js +179 -0
  138. package/dist/linkset.js.map +1 -0
  139. package/dist/prim-params.d.ts +221 -0
  140. package/dist/prim-params.d.ts.map +1 -0
  141. package/dist/prim-params.js +852 -0
  142. package/dist/prim-params.js.map +1 -0
  143. package/dist/prim.d.ts +79 -0
  144. package/dist/prim.d.ts.map +1 -0
  145. package/dist/prim.js +96 -0
  146. package/dist/prim.js.map +1 -0
  147. package/dist/random.d.ts +16 -0
  148. package/dist/random.d.ts.map +1 -0
  149. package/dist/random.js +29 -0
  150. package/dist/random.js.map +1 -0
  151. package/dist/runtime.d.ts +108 -0
  152. package/dist/runtime.d.ts.map +1 -0
  153. package/dist/runtime.js +2 -0
  154. package/dist/runtime.js.map +1 -0
  155. package/dist/script.d.ts +248 -0
  156. package/dist/script.d.ts.map +1 -0
  157. package/dist/script.js +667 -0
  158. package/dist/script.js.map +1 -0
  159. package/dist/values/coerce.d.ts +22 -0
  160. package/dist/values/coerce.d.ts.map +1 -0
  161. package/dist/values/coerce.js +184 -0
  162. package/dist/values/coerce.js.map +1 -0
  163. package/dist/values/format.d.ts +20 -0
  164. package/dist/values/format.d.ts.map +1 -0
  165. package/dist/values/format.js +47 -0
  166. package/dist/values/format.js.map +1 -0
  167. package/dist/values/ops.d.ts +19 -0
  168. package/dist/values/ops.d.ts.map +1 -0
  169. package/dist/values/ops.js +345 -0
  170. package/dist/values/ops.js.map +1 -0
  171. package/dist/values/types.d.ts +39 -0
  172. package/dist/values/types.d.ts.map +1 -0
  173. package/dist/values/types.js +68 -0
  174. package/dist/values/types.js.map +1 -0
  175. package/package.json +52 -0
@@ -0,0 +1,221 @@
1
+ /**
2
+ * Walks an AST and enumerates every coverable item.
3
+ * Coverage IDs are `loc.offset` — stable across the lifetime of a single
4
+ * parse, unique within a file, and cheap to use as Map keys.
5
+ */
6
+ export function buildCoveragePlan(ast, filename, source) {
7
+ const statements = [];
8
+ const branches = [];
9
+ const functions = [];
10
+ const states = [];
11
+ const walkStatement = (s) => {
12
+ statements.push({
13
+ id: s.loc.offset,
14
+ line: s.loc.line,
15
+ col: s.loc.col,
16
+ kind: s.kind,
17
+ });
18
+ switch (s.kind) {
19
+ case 'BlockStatement':
20
+ for (const inner of s.body)
21
+ walkStatement(inner);
22
+ return;
23
+ case 'IfStatement':
24
+ branches.push({
25
+ id: s.loc.offset,
26
+ line: s.loc.line,
27
+ col: s.loc.col,
28
+ kind: 'if',
29
+ hasElse: s.alternate !== null,
30
+ });
31
+ walkStatement(s.consequent);
32
+ if (s.alternate)
33
+ walkStatement(s.alternate);
34
+ return;
35
+ case 'WhileStatement':
36
+ branches.push({
37
+ id: s.loc.offset,
38
+ line: s.loc.line,
39
+ col: s.loc.col,
40
+ kind: 'while',
41
+ hasElse: false,
42
+ });
43
+ walkStatement(s.body);
44
+ return;
45
+ case 'DoWhileStatement':
46
+ branches.push({
47
+ id: s.loc.offset,
48
+ line: s.loc.line,
49
+ col: s.loc.col,
50
+ kind: 'do-while',
51
+ hasElse: false,
52
+ });
53
+ walkStatement(s.body);
54
+ return;
55
+ case 'ForStatement':
56
+ branches.push({
57
+ id: s.loc.offset,
58
+ line: s.loc.line,
59
+ col: s.loc.col,
60
+ kind: 'for',
61
+ hasElse: false,
62
+ });
63
+ walkStatement(s.body);
64
+ return;
65
+ default:
66
+ return;
67
+ }
68
+ };
69
+ for (const fn of ast.functions) {
70
+ functions.push({
71
+ id: fn.loc.offset,
72
+ name: fn.name,
73
+ line: fn.loc.line,
74
+ col: fn.loc.col,
75
+ kind: 'function',
76
+ });
77
+ walkStatement(fn.body);
78
+ }
79
+ for (const state of ast.states) {
80
+ states.push({
81
+ id: state.loc.offset,
82
+ name: state.name,
83
+ line: state.loc.line,
84
+ col: state.loc.col,
85
+ });
86
+ for (const handler of state.handlers) {
87
+ functions.push({
88
+ id: handler.loc.offset,
89
+ name: handler.name,
90
+ line: handler.loc.line,
91
+ col: handler.loc.col,
92
+ kind: 'event',
93
+ state: state.name,
94
+ });
95
+ walkStatement(handler.body);
96
+ }
97
+ }
98
+ return { filename, source, statements, branches, functions, states };
99
+ }
100
+ /**
101
+ * Per-script hit counter. Lives on `ScriptState.coverage` when coverage is
102
+ * enabled; otherwise the field is null and hooks short-circuit.
103
+ *
104
+ * Counts are kept in plain Maps keyed by `loc.offset`. State coverage is
105
+ * keyed by state name — state changes name targets, not offsets.
106
+ */
107
+ export class CoverageCollector {
108
+ plan;
109
+ statementHits = new Map();
110
+ branchHits = new Map();
111
+ functionHits = new Map();
112
+ stateHits = new Map();
113
+ constructor(plan) {
114
+ this.plan = plan;
115
+ for (const b of plan.branches) {
116
+ this.branchHits.set(b.id, [0, 0]);
117
+ }
118
+ }
119
+ hitStatement(loc) {
120
+ const id = loc.offset;
121
+ this.statementHits.set(id, (this.statementHits.get(id) ?? 0) + 1);
122
+ }
123
+ hitBranch(loc, taken) {
124
+ const pair = this.branchHits.get(loc.offset);
125
+ if (!pair)
126
+ return;
127
+ if (taken)
128
+ pair[0]++;
129
+ else
130
+ pair[1]++;
131
+ }
132
+ hitFunction(loc) {
133
+ const id = loc.offset;
134
+ this.functionHits.set(id, (this.functionHits.get(id) ?? 0) + 1);
135
+ }
136
+ hitState(name) {
137
+ this.stateHits.set(name, (this.stateHits.get(name) ?? 0) + 1);
138
+ }
139
+ /** Frozen snapshot suitable for serialization or assertions. */
140
+ snapshot() {
141
+ const statements = this.plan.statements.map((s) => ({
142
+ ...s,
143
+ hits: this.statementHits.get(s.id) ?? 0,
144
+ }));
145
+ const branches = this.plan.branches.map((b) => {
146
+ const pair = this.branchHits.get(b.id) ?? [0, 0];
147
+ return { ...b, hits: [pair[0], pair[1]] };
148
+ });
149
+ const functions = this.plan.functions.map((f) => ({
150
+ ...f,
151
+ hits: this.functionHits.get(f.id) ?? 0,
152
+ }));
153
+ const states = this.plan.states.map((s) => ({
154
+ ...s,
155
+ hits: this.stateHits.get(s.name) ?? 0,
156
+ }));
157
+ return {
158
+ filename: this.plan.filename,
159
+ source: this.plan.source,
160
+ statements,
161
+ branches,
162
+ functions,
163
+ states,
164
+ };
165
+ }
166
+ }
167
+ /**
168
+ * Merge multiple reports for the same filename into one. Used by the Vitest
169
+ * reporter when the same script is loaded across multiple tests in a run:
170
+ * planes match, hit counts union (sum).
171
+ *
172
+ * Throws if reports disagree on filename or plan shape — that signals a
173
+ * source change mid-run, which should fail loudly rather than be glossed.
174
+ */
175
+ export function mergeReports(reports) {
176
+ if (reports.length === 0) {
177
+ throw new Error('mergeReports: empty input');
178
+ }
179
+ const head = reports[0];
180
+ for (const r of reports) {
181
+ if (r.filename !== head.filename) {
182
+ throw new Error(`mergeReports: filename mismatch ${head.filename} vs ${r.filename}`);
183
+ }
184
+ if (r.statements.length !== head.statements.length ||
185
+ r.branches.length !== head.branches.length ||
186
+ r.functions.length !== head.functions.length ||
187
+ r.states.length !== head.states.length) {
188
+ throw new Error(`mergeReports: plan size mismatch for ${head.filename}`);
189
+ }
190
+ }
191
+ const statements = head.statements.map((s, i) => ({
192
+ ...s,
193
+ hits: reports.reduce((acc, r) => acc + r.statements[i].hits, 0),
194
+ }));
195
+ const branches = head.branches.map((b, i) => {
196
+ let t = 0;
197
+ let f = 0;
198
+ for (const r of reports) {
199
+ t += r.branches[i].hits[0];
200
+ f += r.branches[i].hits[1];
201
+ }
202
+ return { ...b, hits: [t, f] };
203
+ });
204
+ const functions = head.functions.map((fn, i) => ({
205
+ ...fn,
206
+ hits: reports.reduce((acc, r) => acc + r.functions[i].hits, 0),
207
+ }));
208
+ const states = head.states.map((s, i) => ({
209
+ ...s,
210
+ hits: reports.reduce((acc, r) => acc + r.states[i].hits, 0),
211
+ }));
212
+ return {
213
+ filename: head.filename,
214
+ source: head.source,
215
+ statements,
216
+ branches,
217
+ functions,
218
+ states,
219
+ };
220
+ }
221
+ //# sourceMappingURL=coverage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage.js","sourceRoot":"","sources":["../src/coverage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { BuiltinImpl, ScriptState } from './runtime.js';
2
+ import type { LslValue } from './values/types.js';
3
+ import type { BuiltinSpec } from './generated/functions.js';
4
+ import type { Script } from './script.js';
5
+ /** Look up the kwdb-derived spec for a function name, if any. */
6
+ export declare function specFor(name: string): BuiltinSpec | undefined;
7
+ export interface DispatchContext {
8
+ readonly state: ScriptState;
9
+ readonly mocks: Readonly<Record<string, BuiltinImpl>>;
10
+ readonly script: Script;
11
+ }
12
+ /**
13
+ * Resolve and invoke an `ll*` function call.
14
+ *
15
+ * Resolution order: user mock > real built-in > generated stub > error.
16
+ * Every successful call (including stubs) is appended to ScriptState.calls.
17
+ */
18
+ export declare function callBuiltin(dctx: DispatchContext, name: string, args: ReadonlyArray<LslValue>): LslValue | undefined;
19
+ //# sourceMappingURL=dispatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../src/dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAe,WAAW,EAAE,MAAM,cAAc,CAAA;AACzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAGjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAE3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC,iEAAiE;AACjE,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAE7D;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;IAC3B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAA;IACrD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,eAAe,EACrB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,aAAa,CAAC,QAAQ,CAAC,GAC5B,QAAQ,GAAG,SAAS,CAkBtB"}
@@ -0,0 +1,42 @@
1
+ import { defaultValueFor } from './values/types.js';
2
+ import { BUILTIN_SPECS } from './generated/functions.js';
3
+ import { REAL_BUILTINS } from './builtins/index.js';
4
+ /** Look up the kwdb-derived spec for a function name, if any. */
5
+ export function specFor(name) {
6
+ return BUILTIN_SPECS[name];
7
+ }
8
+ /**
9
+ * Resolve and invoke an `ll*` function call.
10
+ *
11
+ * Resolution order: user mock > real built-in > generated stub > error.
12
+ * Every successful call (including stubs) is appended to ScriptState.calls.
13
+ */
14
+ export function callBuiltin(dctx, name, args) {
15
+ const spec = specFor(name);
16
+ const impl = dctx.mocks[name] ?? REAL_BUILTINS[name] ?? makeStub(name);
17
+ const ctx = {
18
+ state: dctx.state,
19
+ spec,
20
+ script: dctx.script,
21
+ prim: dctx.script.host,
22
+ linkset: dctx.script.linkset,
23
+ };
24
+ const result = impl(ctx, args);
25
+ dctx.state.calls.push({ name, args, returned: result });
26
+ // Call log timestamps when the script invoked the function (pre-delay);
27
+ // advance the clock after the push so subsequent calls see the throttle.
28
+ if (spec && spec.delay > 0) {
29
+ dctx.state.clock.advance(spec.delay * 1000);
30
+ }
31
+ return result;
32
+ }
33
+ function makeStub(name) {
34
+ const spec = specFor(name);
35
+ if (!spec) {
36
+ return () => {
37
+ throw new Error(`unknown LSL function '${name}' (not in kwdb; use script.mock to provide it)`);
38
+ };
39
+ }
40
+ return () => defaultValueFor(spec.returnType);
41
+ }
42
+ //# sourceMappingURL=dispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../src/dispatch.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAExD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAGnD,iEAAiE;AACjE,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAQ,aAA6C,CAAC,IAAI,CAAC,CAAA;AAC7D,CAAC;AAQD;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CACzB,IAAqB,EACrB,IAAY,EACZ,IAA6B;IAE7B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAA;IACtE,MAAM,GAAG,GAAgB;QACvB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI;QACJ,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;QACtB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;KAC7B,CAAA;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IAC9B,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAA;IACvD,wEAAwE;IACxE,yEAAyE;IACzE,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAA;IAC7C,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,GAAG,EAAE;YACV,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,gDAAgD,CAAC,CAAA;QAChG,CAAC,CAAA;IACH,CAAC;IACD,OAAO,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;AAC/C,CAAC"}
package/dist/env.d.ts ADDED
@@ -0,0 +1,33 @@
1
+ import type { EvalResult, LslType } from './values/types.js';
2
+ /**
3
+ * Lexical environment with a single parent pointer. The interpreter pushes
4
+ * a new env when entering a block / handler and discards on exit. Globals
5
+ * live at the bottom of the chain and persist for the lifetime of the script.
6
+ */
7
+ export declare class Env {
8
+ private readonly parent;
9
+ private readonly slots;
10
+ constructor(parent?: Env | null);
11
+ /** Declare a new variable in the current scope. Coerces init to declared type. */
12
+ declare(name: string, type: LslType, init?: EvalResult): void;
13
+ /**
14
+ * Declare-or-reset: like `declare`, but if `name` already exists in this
15
+ * scope, overwrite its value (and type) instead of throwing. Used by the
16
+ * interpreter when a backward `jump` re-executes a VariableDeclaration —
17
+ * the slot already exists from the first pass and the declaration is
18
+ * effectively a re-initialization. The execBlock pre-scan still catches
19
+ * real source-level duplicate declarations.
20
+ */
21
+ declareOrReset(name: string, type: LslType, init?: EvalResult): void;
22
+ /** Get a variable's current value. Walks up the parent chain. */
23
+ get(name: string): EvalResult;
24
+ /** Assign to an existing variable. Coerces to declared type. */
25
+ set(name: string, value: EvalResult): EvalResult;
26
+ hasOwn(name: string): boolean;
27
+ /** Drop every slot in *this* scope; doesn't touch the parent chain. */
28
+ clear(): void;
29
+ /** Open a child scope. */
30
+ push(): Env;
31
+ private findSlot;
32
+ }
33
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAS5D;;;;GAIG;AACH,qBAAa,GAAG;IAGF,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0B;gBAEnB,MAAM,GAAE,GAAG,GAAG,IAAW;IAEtD,kFAAkF;IAClF,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,IAAI;IAQ7D;;;;;;;OAOG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,IAAI;IAUpE,iEAAiE;IACjE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU;IAM7B,gEAAgE;IAChE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,UAAU;IAOhD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI7B,uEAAuE;IACvE,KAAK,IAAI,IAAI;IAIb,0BAA0B;IAC1B,IAAI,IAAI,GAAG;IAIX,OAAO,CAAC,QAAQ;CASjB"}
package/dist/env.js ADDED
@@ -0,0 +1,76 @@
1
+ import { defaultEvalFor } from './values/types.js';
2
+ import { coerce } from './values/coerce.js';
3
+ /**
4
+ * Lexical environment with a single parent pointer. The interpreter pushes
5
+ * a new env when entering a block / handler and discards on exit. Globals
6
+ * live at the bottom of the chain and persist for the lifetime of the script.
7
+ */
8
+ export class Env {
9
+ parent;
10
+ slots = new Map();
11
+ constructor(parent = null) {
12
+ this.parent = parent;
13
+ }
14
+ /** Declare a new variable in the current scope. Coerces init to declared type. */
15
+ declare(name, type, init) {
16
+ if (this.slots.has(name)) {
17
+ throw new Error(`variable '${name}' already declared in this scope`);
18
+ }
19
+ const value = init ? coerce(init, type) : defaultEvalFor(type);
20
+ this.slots.set(name, { type, value });
21
+ }
22
+ /**
23
+ * Declare-or-reset: like `declare`, but if `name` already exists in this
24
+ * scope, overwrite its value (and type) instead of throwing. Used by the
25
+ * interpreter when a backward `jump` re-executes a VariableDeclaration —
26
+ * the slot already exists from the first pass and the declaration is
27
+ * effectively a re-initialization. The execBlock pre-scan still catches
28
+ * real source-level duplicate declarations.
29
+ */
30
+ declareOrReset(name, type, init) {
31
+ const slot = this.slots.get(name);
32
+ if (slot) {
33
+ slot.type = type;
34
+ slot.value = init ? coerce(init, type) : defaultEvalFor(type);
35
+ return;
36
+ }
37
+ this.declare(name, type, init);
38
+ }
39
+ /** Get a variable's current value. Walks up the parent chain. */
40
+ get(name) {
41
+ const slot = this.findSlot(name);
42
+ if (!slot)
43
+ throw new Error(`undefined variable '${name}'`);
44
+ return slot.value;
45
+ }
46
+ /** Assign to an existing variable. Coerces to declared type. */
47
+ set(name, value) {
48
+ const slot = this.findSlot(name);
49
+ if (!slot)
50
+ throw new Error(`undefined variable '${name}'`);
51
+ slot.value = coerce(value, slot.type);
52
+ return slot.value;
53
+ }
54
+ hasOwn(name) {
55
+ return this.slots.has(name);
56
+ }
57
+ /** Drop every slot in *this* scope; doesn't touch the parent chain. */
58
+ clear() {
59
+ this.slots.clear();
60
+ }
61
+ /** Open a child scope. */
62
+ push() {
63
+ return new Env(this);
64
+ }
65
+ findSlot(name) {
66
+ let env = this;
67
+ while (env) {
68
+ const s = env.slots.get(name);
69
+ if (s)
70
+ return s;
71
+ env = env.parent;
72
+ }
73
+ return null;
74
+ }
75
+ }
76
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAO3C;;;;GAIG;AACH,MAAM,OAAO,GAAG;IAGe;IAFZ,KAAK,GAAG,IAAI,GAAG,EAAgB,CAAA;IAEhD,YAA6B,SAAqB,IAAI;QAAzB,WAAM,GAAN,MAAM,CAAmB;IAAG,CAAC;IAE1D,kFAAkF;IAClF,OAAO,CAAC,IAAY,EAAE,IAAa,EAAE,IAAiB;QACpD,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,aAAa,IAAI,kCAAkC,CAAC,CAAA;QACtE,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;QAC9D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IACvC,CAAC;IAED;;;;;;;OAOG;IACH,cAAc,CAAC,IAAY,EAAE,IAAa,EAAE,IAAiB;QAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACjC,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;YAChB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;YAC7D,OAAM;QACR,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;IAChC,CAAC;IAED,iEAAiE;IACjE,GAAG,CAAC,IAAY;QACd,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QAChC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,GAAG,CAAC,CAAA;QAC1D,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,gEAAgE;IAChE,GAAG,CAAC,IAAY,EAAE,KAAiB;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QAChC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,GAAG,CAAC,CAAA;QAC1D,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;QACrC,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAC7B,CAAC;IAED,uEAAuE;IACvE,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;IACpB,CAAC;IAED,0BAA0B;IAC1B,IAAI;QACF,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,CAAA;IACtB,CAAC;IAEO,QAAQ,CAAC,IAAY;QAC3B,IAAI,GAAG,GAAe,IAAI,CAAA;QAC1B,OAAO,GAAG,EAAE,CAAC;YACX,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YAC7B,IAAI,CAAC;gBAAE,OAAO,CAAC,CAAA;YACf,GAAG,GAAG,GAAG,CAAC,MAAM,CAAA;QAClB,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;CACF"}