@rcrsr/rill 0.4.5 → 0.5.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 (137) hide show
  1. package/dist/check/config.d.ts.map +1 -1
  2. package/dist/check/config.js +9 -9
  3. package/dist/check/config.js.map +1 -1
  4. package/dist/check/visitor.d.ts.map +1 -1
  5. package/dist/check/visitor.js +1 -0
  6. package/dist/check/visitor.js.map +1 -1
  7. package/dist/cli-check.js +8 -9
  8. package/dist/cli-check.js.map +1 -1
  9. package/dist/cli-eval.js +4 -5
  10. package/dist/cli-eval.js.map +1 -1
  11. package/dist/cli-exec.d.ts.map +1 -1
  12. package/dist/cli-exec.js +2 -3
  13. package/dist/cli-exec.js.map +1 -1
  14. package/dist/cli-shared.d.ts +5 -3
  15. package/dist/cli-shared.d.ts.map +1 -1
  16. package/dist/cli-shared.js +5 -9
  17. package/dist/cli-shared.js.map +1 -1
  18. package/dist/generated/introspection-data.d.ts +2 -0
  19. package/dist/generated/introspection-data.d.ts.map +1 -0
  20. package/dist/generated/introspection-data.js +618 -0
  21. package/dist/generated/introspection-data.js.map +1 -0
  22. package/dist/generated/version-data.d.ts +18 -0
  23. package/dist/generated/version-data.d.ts.map +1 -0
  24. package/dist/generated/version-data.js +16 -0
  25. package/dist/generated/version-data.js.map +1 -0
  26. package/dist/index.d.ts +2 -1
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +5 -1
  29. package/dist/index.js.map +1 -1
  30. package/dist/lexer/errors.d.ts +3 -2
  31. package/dist/lexer/errors.d.ts.map +1 -1
  32. package/dist/lexer/errors.js +19 -4
  33. package/dist/lexer/errors.js.map +1 -1
  34. package/dist/lexer/operators.d.ts.map +1 -1
  35. package/dist/lexer/operators.js +1 -0
  36. package/dist/lexer/operators.js.map +1 -1
  37. package/dist/lexer/readers.d.ts.map +1 -1
  38. package/dist/lexer/readers.js +4 -4
  39. package/dist/lexer/readers.js.map +1 -1
  40. package/dist/lexer/tokenizer.js +1 -1
  41. package/dist/lexer/tokenizer.js.map +1 -1
  42. package/dist/parser/helpers.d.ts.map +1 -1
  43. package/dist/parser/helpers.js +5 -3
  44. package/dist/parser/helpers.js.map +1 -1
  45. package/dist/parser/parser-collect.js +1 -1
  46. package/dist/parser/parser-collect.js.map +1 -1
  47. package/dist/parser/parser-control.js +6 -4
  48. package/dist/parser/parser-control.js.map +1 -1
  49. package/dist/parser/parser-expr.d.ts.map +1 -1
  50. package/dist/parser/parser-expr.js +24 -4
  51. package/dist/parser/parser-expr.js.map +1 -1
  52. package/dist/parser/parser-extract.js +1 -1
  53. package/dist/parser/parser-extract.js.map +1 -1
  54. package/dist/parser/parser-functions.js +2 -1
  55. package/dist/parser/parser-functions.js.map +1 -1
  56. package/dist/parser/parser-literals.js +11 -11
  57. package/dist/parser/parser-literals.js.map +1 -1
  58. package/dist/parser/parser-script.js +2 -0
  59. package/dist/parser/parser-script.js.map +1 -1
  60. package/dist/parser/parser-variables.js +7 -3
  61. package/dist/parser/parser-variables.js.map +1 -1
  62. package/dist/parser/state.js +1 -1
  63. package/dist/parser/state.js.map +1 -1
  64. package/dist/runtime/core/callable.d.ts +8 -0
  65. package/dist/runtime/core/callable.d.ts.map +1 -1
  66. package/dist/runtime/core/callable.js +6 -6
  67. package/dist/runtime/core/callable.js.map +1 -1
  68. package/dist/runtime/core/context.d.ts.map +1 -1
  69. package/dist/runtime/core/context.js +17 -8
  70. package/dist/runtime/core/context.js.map +1 -1
  71. package/dist/runtime/core/equals.d.ts.map +1 -1
  72. package/dist/runtime/core/equals.js +2 -1
  73. package/dist/runtime/core/equals.js.map +1 -1
  74. package/dist/runtime/core/eval/base.js +2 -2
  75. package/dist/runtime/core/eval/base.js.map +1 -1
  76. package/dist/runtime/core/eval/mixins/annotations.js +2 -2
  77. package/dist/runtime/core/eval/mixins/annotations.js.map +1 -1
  78. package/dist/runtime/core/eval/mixins/closures.d.ts.map +1 -1
  79. package/dist/runtime/core/eval/mixins/closures.js +32 -26
  80. package/dist/runtime/core/eval/mixins/closures.js.map +1 -1
  81. package/dist/runtime/core/eval/mixins/collections.js +13 -13
  82. package/dist/runtime/core/eval/mixins/collections.js.map +1 -1
  83. package/dist/runtime/core/eval/mixins/control-flow.js +1 -1
  84. package/dist/runtime/core/eval/mixins/control-flow.js.map +1 -1
  85. package/dist/runtime/core/eval/mixins/core.d.ts.map +1 -1
  86. package/dist/runtime/core/eval/mixins/core.js +37 -14
  87. package/dist/runtime/core/eval/mixins/core.js.map +1 -1
  88. package/dist/runtime/core/eval/mixins/expressions.d.ts +2 -0
  89. package/dist/runtime/core/eval/mixins/expressions.d.ts.map +1 -1
  90. package/dist/runtime/core/eval/mixins/expressions.js +80 -27
  91. package/dist/runtime/core/eval/mixins/expressions.js.map +1 -1
  92. package/dist/runtime/core/eval/mixins/extraction.js +14 -14
  93. package/dist/runtime/core/eval/mixins/extraction.js.map +1 -1
  94. package/dist/runtime/core/eval/mixins/literals.d.ts +4 -1
  95. package/dist/runtime/core/eval/mixins/literals.d.ts.map +1 -1
  96. package/dist/runtime/core/eval/mixins/literals.js +40 -20
  97. package/dist/runtime/core/eval/mixins/literals.js.map +1 -1
  98. package/dist/runtime/core/eval/mixins/types.js +3 -3
  99. package/dist/runtime/core/eval/mixins/types.js.map +1 -1
  100. package/dist/runtime/core/eval/mixins/variables.js +32 -32
  101. package/dist/runtime/core/eval/mixins/variables.js.map +1 -1
  102. package/dist/runtime/core/execute.js +2 -2
  103. package/dist/runtime/core/execute.js.map +1 -1
  104. package/dist/runtime/core/introspection-data.d.ts +2 -0
  105. package/dist/runtime/core/introspection-data.d.ts.map +1 -0
  106. package/dist/runtime/core/introspection-data.js +618 -0
  107. package/dist/runtime/core/introspection-data.js.map +1 -0
  108. package/dist/runtime/core/introspection.d.ts +59 -0
  109. package/dist/runtime/core/introspection.d.ts.map +1 -0
  110. package/dist/runtime/core/introspection.js +120 -0
  111. package/dist/runtime/core/introspection.js.map +1 -0
  112. package/dist/runtime/core/version-data.d.ts +18 -0
  113. package/dist/runtime/core/version-data.d.ts.map +1 -0
  114. package/dist/runtime/core/version-data.js +16 -0
  115. package/dist/runtime/core/version-data.js.map +1 -0
  116. package/dist/runtime/ext/builtins.js +21 -21
  117. package/dist/runtime/ext/builtins.js.map +1 -1
  118. package/dist/runtime/ext/extensions.js +1 -1
  119. package/dist/runtime/ext/extensions.js.map +1 -1
  120. package/dist/runtime/index.d.ts +4 -0
  121. package/dist/runtime/index.d.ts.map +1 -1
  122. package/dist/runtime/index.js +2 -0
  123. package/dist/runtime/index.js.map +1 -1
  124. package/dist/types.d.ts +116 -6
  125. package/dist/types.d.ts.map +1 -1
  126. package/dist/types.js +457 -11
  127. package/dist/types.js.map +1 -1
  128. package/docs/02_types.md +22 -0
  129. package/docs/04_operators.md +22 -1
  130. package/docs/05_control-flow.md +62 -0
  131. package/docs/11_reference.md +3 -2
  132. package/docs/12_examples.md +4 -4
  133. package/docs/14_host-integration.md +152 -0
  134. package/docs/15_grammar.ebnf +19 -1
  135. package/docs/88_errors.md +902 -0
  136. package/docs/99_llm-reference.txt +13 -0
  137. package/package.json +4 -2
package/dist/types.js CHANGED
@@ -2,6 +2,7 @@
2
2
  * Rill AST Types
3
3
  * Based on docs/grammar.ebnf
4
4
  */
5
+ import { VERSION } from './generated/version-data.js';
5
6
  // ============================================================
6
7
  // ERROR HIERARCHY
7
8
  // ============================================================
@@ -31,12 +32,418 @@ export const RILL_ERROR_CODES = {
31
32
  CHECK_INVALID_CONFIG: 'CHECK_INVALID_CONFIG',
32
33
  CHECK_FIX_COLLISION: 'CHECK_FIX_COLLISION',
33
34
  };
35
+ class ErrorRegistryImpl {
36
+ byId;
37
+ byLegacyCode;
38
+ constructor(definitions) {
39
+ const idMap = new Map();
40
+ const codeMap = new Map();
41
+ for (const def of definitions) {
42
+ idMap.set(def.errorId, def);
43
+ const existing = codeMap.get(def.legacyCode) ?? [];
44
+ codeMap.set(def.legacyCode, [...existing, def]);
45
+ }
46
+ this.byId = idMap;
47
+ this.byLegacyCode = codeMap;
48
+ }
49
+ get(errorId) {
50
+ return this.byId.get(errorId);
51
+ }
52
+ getByLegacyCode(code) {
53
+ return this.byLegacyCode.get(code) ?? [];
54
+ }
55
+ has(errorId) {
56
+ return this.byId.has(errorId);
57
+ }
58
+ get size() {
59
+ return this.byId.size;
60
+ }
61
+ entries() {
62
+ return this.byId.entries();
63
+ }
64
+ }
65
+ /** All error definitions indexed by error ID */
66
+ const ERROR_DEFINITIONS = [
67
+ // Lexer Errors (RILL-L0xx)
68
+ {
69
+ errorId: 'RILL-L001',
70
+ legacyCode: RILL_ERROR_CODES.PARSE_INVALID_SYNTAX,
71
+ category: 'lexer',
72
+ description: 'Unterminated string literal',
73
+ messageTemplate: 'Unterminated string literal at {location}',
74
+ },
75
+ {
76
+ errorId: 'RILL-L002',
77
+ legacyCode: RILL_ERROR_CODES.PARSE_INVALID_SYNTAX,
78
+ category: 'lexer',
79
+ description: 'Invalid character',
80
+ messageTemplate: 'Invalid character {char} at {location}',
81
+ },
82
+ {
83
+ errorId: 'RILL-L003',
84
+ legacyCode: RILL_ERROR_CODES.PARSE_INVALID_SYNTAX,
85
+ category: 'lexer',
86
+ description: 'Invalid number format',
87
+ messageTemplate: 'Invalid number format: {value}',
88
+ },
89
+ {
90
+ errorId: 'RILL-L004',
91
+ legacyCode: RILL_ERROR_CODES.PARSE_INVALID_SYNTAX,
92
+ category: 'lexer',
93
+ description: 'Unterminated multiline string',
94
+ messageTemplate: 'Unterminated multiline string starting at {location}',
95
+ },
96
+ {
97
+ errorId: 'RILL-L005',
98
+ legacyCode: RILL_ERROR_CODES.PARSE_INVALID_SYNTAX,
99
+ category: 'lexer',
100
+ description: 'Invalid escape sequence',
101
+ messageTemplate: 'Invalid escape sequence {sequence} at {location}',
102
+ },
103
+ // Parse Errors (RILL-P0xx)
104
+ {
105
+ errorId: 'RILL-P001',
106
+ legacyCode: RILL_ERROR_CODES.PARSE_UNEXPECTED_TOKEN,
107
+ category: 'parse',
108
+ description: 'Unexpected token',
109
+ messageTemplate: 'Unexpected token {token}, expected {expected}',
110
+ },
111
+ {
112
+ errorId: 'RILL-P002',
113
+ legacyCode: RILL_ERROR_CODES.PARSE_INVALID_SYNTAX,
114
+ category: 'parse',
115
+ description: 'Unexpected end of input',
116
+ messageTemplate: 'Unexpected end of input, expected {expected}',
117
+ },
118
+ {
119
+ errorId: 'RILL-P003',
120
+ legacyCode: RILL_ERROR_CODES.PARSE_INVALID_TYPE,
121
+ category: 'parse',
122
+ description: 'Invalid type annotation',
123
+ messageTemplate: 'Invalid type annotation: {type}',
124
+ },
125
+ {
126
+ errorId: 'RILL-P004',
127
+ legacyCode: RILL_ERROR_CODES.PARSE_INVALID_SYNTAX,
128
+ category: 'parse',
129
+ description: 'Invalid expression',
130
+ messageTemplate: 'Invalid expression: {details}',
131
+ },
132
+ {
133
+ errorId: 'RILL-P005',
134
+ legacyCode: RILL_ERROR_CODES.PARSE_INVALID_SYNTAX,
135
+ category: 'parse',
136
+ description: 'Missing delimiter',
137
+ messageTemplate: 'Missing {delimiter}, found {found}',
138
+ },
139
+ // Runtime Errors (RILL-R0xx)
140
+ {
141
+ errorId: 'RILL-R001',
142
+ legacyCode: RILL_ERROR_CODES.RUNTIME_TYPE_ERROR,
143
+ category: 'runtime',
144
+ description: 'Parameter type mismatch',
145
+ messageTemplate: 'Function {function} expects parameter {param} (position {position}) to be {expected}, got {actual}',
146
+ },
147
+ {
148
+ errorId: 'RILL-R002',
149
+ legacyCode: RILL_ERROR_CODES.RUNTIME_TYPE_ERROR,
150
+ category: 'runtime',
151
+ description: 'Operator type mismatch',
152
+ messageTemplate: 'Operator {operator} cannot be applied to {leftType} and {rightType}',
153
+ },
154
+ {
155
+ errorId: 'RILL-R003',
156
+ legacyCode: RILL_ERROR_CODES.RUNTIME_TYPE_ERROR,
157
+ category: 'runtime',
158
+ description: 'Method receiver type mismatch',
159
+ messageTemplate: 'Method {method} cannot be called on {type}',
160
+ },
161
+ {
162
+ errorId: 'RILL-R004',
163
+ legacyCode: RILL_ERROR_CODES.RUNTIME_TYPE_ERROR,
164
+ category: 'runtime',
165
+ description: 'Type conversion failure',
166
+ messageTemplate: 'Cannot convert {value} to {targetType}',
167
+ },
168
+ {
169
+ errorId: 'RILL-R005',
170
+ legacyCode: RILL_ERROR_CODES.RUNTIME_UNDEFINED_VARIABLE,
171
+ category: 'runtime',
172
+ description: 'Undefined variable',
173
+ messageTemplate: 'Variable {name} is not defined',
174
+ },
175
+ {
176
+ errorId: 'RILL-R006',
177
+ legacyCode: RILL_ERROR_CODES.RUNTIME_UNDEFINED_FUNCTION,
178
+ category: 'runtime',
179
+ description: 'Undefined function',
180
+ messageTemplate: 'Function {name} is not defined',
181
+ },
182
+ {
183
+ errorId: 'RILL-R007',
184
+ legacyCode: RILL_ERROR_CODES.RUNTIME_UNDEFINED_METHOD,
185
+ category: 'runtime',
186
+ description: 'Undefined method',
187
+ messageTemplate: 'Method {method} is not defined on {type}',
188
+ },
189
+ {
190
+ errorId: 'RILL-R008',
191
+ legacyCode: RILL_ERROR_CODES.RUNTIME_UNDEFINED_ANNOTATION,
192
+ category: 'runtime',
193
+ description: 'Undefined annotation',
194
+ messageTemplate: 'Annotation {key} is not defined',
195
+ },
196
+ {
197
+ errorId: 'RILL-R009',
198
+ legacyCode: RILL_ERROR_CODES.RUNTIME_PROPERTY_NOT_FOUND,
199
+ category: 'runtime',
200
+ description: 'Property not found',
201
+ messageTemplate: 'Property {property} not found on {type}',
202
+ },
203
+ {
204
+ errorId: 'RILL-R010',
205
+ legacyCode: RILL_ERROR_CODES.RUNTIME_LIMIT_EXCEEDED,
206
+ category: 'runtime',
207
+ description: 'Iteration limit exceeded',
208
+ messageTemplate: 'Iteration limit of {limit} exceeded',
209
+ },
210
+ {
211
+ errorId: 'RILL-R011',
212
+ legacyCode: RILL_ERROR_CODES.RUNTIME_INVALID_PATTERN,
213
+ category: 'runtime',
214
+ description: 'Invalid regex pattern',
215
+ messageTemplate: 'Invalid regex pattern: {pattern}',
216
+ },
217
+ {
218
+ errorId: 'RILL-R012',
219
+ legacyCode: RILL_ERROR_CODES.RUNTIME_TIMEOUT,
220
+ category: 'runtime',
221
+ description: 'Operation timeout',
222
+ messageTemplate: 'Operation timed out after {timeout}ms',
223
+ },
224
+ {
225
+ errorId: 'RILL-R013',
226
+ legacyCode: RILL_ERROR_CODES.RUNTIME_ABORTED,
227
+ category: 'runtime',
228
+ description: 'Execution aborted',
229
+ messageTemplate: 'Execution aborted by signal',
230
+ },
231
+ {
232
+ errorId: 'RILL-R014',
233
+ legacyCode: RILL_ERROR_CODES.RUNTIME_AUTO_EXCEPTION,
234
+ category: 'runtime',
235
+ description: 'Auto-exception triggered',
236
+ messageTemplate: 'Auto-exception triggered: pattern {pattern} matched',
237
+ },
238
+ {
239
+ errorId: 'RILL-R015',
240
+ legacyCode: RILL_ERROR_CODES.RUNTIME_ASSERTION_FAILED,
241
+ category: 'runtime',
242
+ description: 'Assertion failed',
243
+ messageTemplate: 'Assertion failed: {condition}',
244
+ },
245
+ {
246
+ errorId: 'RILL-R016',
247
+ legacyCode: RILL_ERROR_CODES.RUNTIME_ERROR_RAISED,
248
+ category: 'runtime',
249
+ description: 'Error statement executed',
250
+ messageTemplate: 'Error raised: {message}',
251
+ },
252
+ // Check Errors (RILL-C0xx)
253
+ {
254
+ errorId: 'RILL-C001',
255
+ legacyCode: RILL_ERROR_CODES.CHECK_FILE_NOT_FOUND,
256
+ category: 'check',
257
+ description: 'File not found',
258
+ messageTemplate: 'File not found: {path}',
259
+ },
260
+ {
261
+ errorId: 'RILL-C002',
262
+ legacyCode: RILL_ERROR_CODES.CHECK_FILE_UNREADABLE,
263
+ category: 'check',
264
+ description: 'File unreadable',
265
+ messageTemplate: 'File unreadable: {path}',
266
+ },
267
+ {
268
+ errorId: 'RILL-C003',
269
+ legacyCode: RILL_ERROR_CODES.CHECK_INVALID_CONFIG,
270
+ category: 'check',
271
+ description: 'Invalid configuration',
272
+ messageTemplate: 'Invalid configuration: {details}',
273
+ },
274
+ {
275
+ errorId: 'RILL-C004',
276
+ legacyCode: RILL_ERROR_CODES.CHECK_FIX_COLLISION,
277
+ category: 'check',
278
+ description: 'Fix collision detected',
279
+ messageTemplate: 'Fix collision detected for {location}',
280
+ },
281
+ ];
282
+ /**
283
+ * Global error registry instance.
284
+ * Read-only singleton initialized at module load.
285
+ */
286
+ export const ERROR_REGISTRY = new ErrorRegistryImpl(ERROR_DEFINITIONS);
287
+ // ============================================================
288
+ // TEMPLATE RENDERING
289
+ // ============================================================
290
+ /**
291
+ * Renders a message template by replacing placeholders with context values.
292
+ *
293
+ * Placeholder format: {varName}
294
+ * Missing context values render as empty string.
295
+ * Non-string values are coerced via String().
296
+ * Invalid templates (unclosed braces) return template unchanged.
297
+ *
298
+ * @param template - Template string with {placeholder} syntax
299
+ * @param context - Key-value pairs for placeholder replacement
300
+ * @returns Rendered message with placeholders replaced
301
+ *
302
+ * @example
303
+ * renderMessage("Expected {expected}, got {actual}", {expected: "string", actual: "number"})
304
+ * // Returns: "Expected string, got number"
305
+ *
306
+ * @example
307
+ * renderMessage("Hello {name}", {})
308
+ * // Returns: "Hello "
309
+ */
310
+ export function renderMessage(template, context) {
311
+ let result = '';
312
+ let i = 0;
313
+ while (i < template.length) {
314
+ const char = template[i];
315
+ if (char === '{') {
316
+ // Check if this is the start of a placeholder
317
+ const nextChar = template[i + 1];
318
+ if (nextChar !== '{') {
319
+ // Find the closing brace
320
+ let j = i + 1;
321
+ while (j < template.length && template[j] !== '}') {
322
+ j++;
323
+ }
324
+ // Check if we found a closing brace
325
+ if (j >= template.length) {
326
+ // Unclosed brace - return template unchanged
327
+ return template;
328
+ }
329
+ // Extract placeholder name and render value
330
+ const placeholderName = template.slice(i + 1, j);
331
+ const value = context[placeholderName];
332
+ // Render value: missing = empty string, non-string coerced via String()
333
+ if (value === undefined) {
334
+ result += '';
335
+ }
336
+ else {
337
+ try {
338
+ result += String(value);
339
+ }
340
+ catch {
341
+ // String() coercion failed - use default toString behavior
342
+ result += Object.prototype.toString.call(value);
343
+ }
344
+ }
345
+ // Move past closing brace. Each character is visited once (O(n) performance).
346
+ i = j + 1;
347
+ continue;
348
+ }
349
+ }
350
+ // Regular character - append to result
351
+ result += char;
352
+ i++;
353
+ }
354
+ return result;
355
+ }
356
+ /**
357
+ * Generates documentation URL for an error ID.
358
+ *
359
+ * Format: https://github.com/rcrsr/rill/blob/v{version}/docs/88_errors.md#{errorId}
360
+ * Error ID is lowercased in anchor.
361
+ *
362
+ * @param errorId - Error identifier (format: RILL-{category}{3-digit}, e.g., RILL-R001)
363
+ * @param version - Semver version (format: X.Y.Z)
364
+ * @returns Documentation URL, or empty string if inputs are invalid
365
+ *
366
+ * @example
367
+ * getHelpUrl("RILL-R001", "0.4.1")
368
+ * // Returns: "https://github.com/rcrsr/rill/blob/v0.4.1/docs/88_errors.md#rill-r001"
369
+ *
370
+ * @example
371
+ * getHelpUrl("invalid", "0.4.1")
372
+ * // Returns: ""
373
+ */
374
+ export function getHelpUrl(errorId, version) {
375
+ // Validate errorId format: RILL-{category}{3-digit}
376
+ // Category is single letter (L=lexer, P=parse, R=runtime, C=check)
377
+ const errorIdPattern = /^RILL-[LPRC]\d{3}$/;
378
+ if (!errorIdPattern.test(errorId)) {
379
+ return '';
380
+ }
381
+ // Validate version format: X.Y.Z (semver)
382
+ const versionPattern = /^\d+\.\d+\.\d+$/;
383
+ if (!versionPattern.test(version)) {
384
+ return '';
385
+ }
386
+ // Build URL with lowercased errorId in anchor
387
+ const anchor = errorId.toLowerCase();
388
+ return `https://github.com/rcrsr/rill/blob/v${version}/docs/88_errors.md#${anchor}`;
389
+ }
390
+ // ============================================================
391
+ // ERROR FACTORY
392
+ // ============================================================
393
+ /**
394
+ * Factory function for creating errors from registry.
395
+ *
396
+ * Looks up error definition from registry, renders message template with context,
397
+ * and creates RillError with structured metadata.
398
+ *
399
+ * @param errorId - Error identifier (format: RILL-{category}{3-digit})
400
+ * @param context - Key-value pairs for template placeholder replacement
401
+ * @param location - Source location where error occurred (optional)
402
+ * @returns RillError instance with rendered message
403
+ * @throws TypeError if errorId is not found in registry
404
+ *
405
+ * @example
406
+ * createError("RILL-R005", { name: "foo" }, location)
407
+ * // Creates RuntimeError: "Variable foo is not defined at 1:5"
408
+ *
409
+ * @example
410
+ * createError("RILL-X999", {})
411
+ * // Throws: TypeError("Unknown error ID: RILL-X999")
412
+ */
413
+ export function createError(errorId, context, location) {
414
+ // Lookup error definition from registry (O(1))
415
+ const definition = ERROR_REGISTRY.get(errorId);
416
+ // EC-9: Unknown errorId -> Throws TypeError
417
+ if (!definition) {
418
+ throw new TypeError(`Unknown error ID: ${errorId}`);
419
+ }
420
+ // Render message from template + context (O(n) where n = template length)
421
+ // EC-10: Context value fails String() coercion -> Uses fallback "[object Object]"
422
+ // This is handled inside renderMessage via try-catch
423
+ const message = renderMessage(definition.messageTemplate, context);
424
+ // EC-11: Malformed location (missing line/column) -> Error created without location metadata
425
+ // We accept the location as-is; if it's malformed, the error won't have proper location data
426
+ // This is acceptable per spec - the error is still created, just without complete location info
427
+ // Compute helpUrl from errorId using VERSION constant
428
+ const helpUrl = getHelpUrl(errorId, VERSION);
429
+ // Create RillError with errorId, helpUrl, legacy code, and rendered message
430
+ return new RillError({
431
+ code: definition.legacyCode,
432
+ errorId,
433
+ helpUrl: helpUrl || undefined, // Convert empty string to undefined
434
+ message,
435
+ location,
436
+ context,
437
+ });
438
+ }
34
439
  /**
35
440
  * Base error class for all Rill errors.
36
441
  * Provides structured data for host applications to format as needed.
37
442
  */
38
443
  export class RillError extends Error {
39
444
  code;
445
+ errorId;
446
+ helpUrl;
40
447
  location;
41
448
  context;
42
449
  constructor(data) {
@@ -46,6 +453,8 @@ export class RillError extends Error {
46
453
  super(`${data.message}${locationStr}`);
47
454
  this.name = 'RillError';
48
455
  this.code = data.code;
456
+ this.errorId = data.errorId;
457
+ this.helpUrl = data.helpUrl;
49
458
  this.location = data.location;
50
459
  this.context = data.context;
51
460
  }
@@ -53,6 +462,8 @@ export class RillError extends Error {
53
462
  toData() {
54
463
  return {
55
464
  code: this.code,
465
+ errorId: this.errorId,
466
+ helpUrl: this.helpUrl,
56
467
  message: this.message.replace(/ at \d+:\d+$/, ''), // Strip location suffix
57
468
  location: this.location,
58
469
  context: this.context,
@@ -67,25 +478,59 @@ export class RillError extends Error {
67
478
  }
68
479
  /** Parse-time errors */
69
480
  export class ParseError extends RillError {
70
- constructor(message, location, context) {
71
- super({
72
- code: RILL_ERROR_CODES.PARSE_INVALID_SYNTAX,
73
- message,
74
- location,
75
- context,
76
- });
481
+ constructor(message, location, context, errorId) {
482
+ // When errorId provided, look up definition and derive legacyCode
483
+ if (errorId) {
484
+ const definition = ERROR_REGISTRY.get(errorId);
485
+ if (!definition) {
486
+ throw new TypeError(`Unknown error ID: ${errorId}`);
487
+ }
488
+ super({
489
+ code: definition.legacyCode,
490
+ errorId,
491
+ message,
492
+ location,
493
+ context,
494
+ });
495
+ }
496
+ else {
497
+ // Backward compatible: use default PARSE_INVALID_SYNTAX code
498
+ super({
499
+ code: RILL_ERROR_CODES.PARSE_INVALID_SYNTAX,
500
+ message,
501
+ location,
502
+ context,
503
+ });
504
+ }
77
505
  this.name = 'ParseError';
78
506
  }
79
507
  }
80
508
  /** Runtime execution errors */
81
509
  export class RuntimeError extends RillError {
82
- constructor(code, message, location, context) {
83
- super({ code, message, location, context });
510
+ constructor(code, message, location, context, errorId) {
511
+ // When errorId provided, look up definition and derive legacyCode
512
+ if (errorId) {
513
+ const definition = ERROR_REGISTRY.get(errorId);
514
+ if (!definition) {
515
+ throw new TypeError(`Unknown error ID: ${errorId}`);
516
+ }
517
+ super({
518
+ code: definition.legacyCode,
519
+ errorId,
520
+ message,
521
+ location,
522
+ context,
523
+ });
524
+ }
525
+ else {
526
+ // Backward compatible: use provided code directly
527
+ super({ code, message, location, context });
528
+ }
84
529
  this.name = 'RuntimeError';
85
530
  }
86
531
  /** Create from an AST node */
87
- static fromNode(code, message, node, context) {
88
- return new RuntimeError(code, message, node?.span.start, context);
532
+ static fromNode(code, message, node, context, errorId) {
533
+ return new RuntimeError(code, message, node?.span.start, context, errorId);
89
534
  }
90
535
  }
91
536
  /** Timeout errors */
@@ -181,6 +626,7 @@ export const TOKEN_TYPES = {
181
626
  // Keywords
182
627
  BREAK: 'BREAK',
183
628
  RETURN: 'RETURN',
629
+ PASS: 'PASS',
184
630
  ASSERT: 'ASSERT',
185
631
  ERROR: 'ERROR',
186
632
  EACH: 'EACH',
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/docs/02_types.md CHANGED
@@ -109,6 +109,28 @@ false ? "yes" ! "no" # "no"
109
109
  0 -> ($ == 0) ? "zero" ! "nonzero" # Use comparison
110
110
  ```
111
111
 
112
+ ### Type-Safe Negation
113
+
114
+ The negation operator (`!`) requires a boolean operand. There is no truthiness coercion:
115
+
116
+ ```rill
117
+ !true # false
118
+ !false # true
119
+ "hello" -> .empty -> (!$) # true (negates boolean from .empty)
120
+ ```
121
+
122
+ ```text
123
+ !"hello" # ERROR: Negation requires boolean, got string
124
+ !0 # ERROR: Negation requires boolean, got number
125
+ ```
126
+
127
+ Use explicit boolean checks when needed:
128
+
129
+ ```rill
130
+ "" -> .empty -> (!$) ? "has content" ! "empty" # Negate boolean result
131
+ [1,2,3] -> .empty -> (!$) ? "has items" ! "none" # Check non-empty
132
+ ```
133
+
112
134
  ---
113
135
 
114
136
  ## Lists
@@ -507,7 +507,7 @@ See [Reference](11_reference.md) for full dispatch semantics including dict disp
507
507
 
508
508
  ## Default Operator `??`
509
509
 
510
- Provide a default value if field is missing:
510
+ Provide a default value if field is missing or access fails:
511
511
 
512
512
  ```rill
513
513
  [:] :> $empty
@@ -518,6 +518,27 @@ $user.name ?? "unknown" # "alice"
518
518
  $user.age ?? 0 # 0
519
519
  ```
520
520
 
521
+ ### With Function Calls
522
+
523
+ The default operator works with any expression, including function and method calls:
524
+
525
+ ```text
526
+ get_data().status ?? "default" # "default" if status field missing
527
+ fetch_value() ?? "fallback" # "fallback" if fetch_value returns undefined
528
+ ```
529
+
530
+ ### With Method Calls
531
+
532
+ The `??` operator applies after method invocations in access chains:
533
+
534
+ ```text
535
+ $dict.transform() ?? "default" # default if method throws or result missing
536
+ $obj.compute().value ?? 0 # default if value field missing after method
537
+ $config.get_setting() ?? [:] # default if method returns undefined
538
+ ```
539
+
540
+ Method calls evaluate fully before the default operator applies.
541
+
521
542
  ---
522
543
 
523
544
  ## Existence Operators