@naylence/advanced-security 0.3.15 → 0.4.1

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 (129) hide show
  1. package/LICENSE +1 -1
  2. package/dist/browser/index.cjs +2673 -3
  3. package/dist/browser/index.mjs +2684 -14
  4. package/dist/cjs/advanced-security-isomorphic.js +4 -0
  5. package/dist/cjs/advanced-security-isomorphic.js.map +1 -1
  6. package/dist/cjs/naylence/fame/expr/ast.js +135 -0
  7. package/dist/cjs/naylence/fame/expr/ast.js.map +1 -0
  8. package/dist/cjs/naylence/fame/expr/builtins.js +477 -0
  9. package/dist/cjs/naylence/fame/expr/builtins.js.map +1 -0
  10. package/dist/cjs/naylence/fame/expr/errors.js +88 -0
  11. package/dist/cjs/naylence/fame/expr/errors.js.map +1 -0
  12. package/dist/cjs/naylence/fame/expr/evaluator.js +385 -0
  13. package/dist/cjs/naylence/fame/expr/evaluator.js.map +1 -0
  14. package/dist/cjs/naylence/fame/expr/index.js +21 -0
  15. package/dist/cjs/naylence/fame/expr/index.js.map +1 -0
  16. package/dist/cjs/naylence/fame/expr/limits.js +80 -0
  17. package/dist/cjs/naylence/fame/expr/limits.js.map +1 -0
  18. package/dist/cjs/naylence/fame/expr/parser.js +429 -0
  19. package/dist/cjs/naylence/fame/expr/parser.js.map +1 -0
  20. package/dist/cjs/naylence/fame/expr/tokenizer.js +336 -0
  21. package/dist/cjs/naylence/fame/expr/tokenizer.js.map +1 -0
  22. package/dist/cjs/naylence/fame/factory-manifest.js +2 -0
  23. package/dist/cjs/naylence/fame/factory-manifest.js.map +1 -1
  24. package/dist/cjs/naylence/fame/security/auth/index.js +7 -0
  25. package/dist/cjs/naylence/fame/security/auth/index.js.map +1 -0
  26. package/dist/cjs/naylence/fame/security/auth/policy/advanced-authorization-policy-factory.js +70 -0
  27. package/dist/cjs/naylence/fame/security/auth/policy/advanced-authorization-policy-factory.js.map +1 -0
  28. package/dist/cjs/naylence/fame/security/auth/policy/advanced-authorization-policy.js +562 -0
  29. package/dist/cjs/naylence/fame/security/auth/policy/advanced-authorization-policy.js.map +1 -0
  30. package/dist/cjs/naylence/fame/security/auth/policy/expr-builtins.js +129 -0
  31. package/dist/cjs/naylence/fame/security/auth/policy/expr-builtins.js.map +1 -0
  32. package/dist/cjs/naylence/fame/security/auth/policy/index.js +15 -0
  33. package/dist/cjs/naylence/fame/security/auth/policy/index.js.map +1 -0
  34. package/dist/cjs/naylence/fame/security/index.js +2 -0
  35. package/dist/cjs/naylence/fame/security/index.js.map +1 -1
  36. package/dist/cjs/naylence/fame/security/register-advanced-security-factories.js +2 -0
  37. package/dist/cjs/naylence/fame/security/register-advanced-security-factories.js.map +1 -1
  38. package/dist/cjs/naylence/fame/security/strict-overlay-security-profile.js +64 -0
  39. package/dist/cjs/naylence/fame/security/strict-overlay-security-profile.js.map +1 -0
  40. package/dist/cjs/package.json +3 -0
  41. package/dist/cjs/plugin.js +2 -0
  42. package/dist/cjs/plugin.js.map +1 -1
  43. package/dist/cjs/version.js +2 -2
  44. package/dist/cjs/version.js.map +1 -1
  45. package/dist/esm/advanced-security-isomorphic.js +4 -0
  46. package/dist/esm/advanced-security-isomorphic.js.map +1 -1
  47. package/dist/esm/naylence/fame/expr/ast.js +135 -0
  48. package/dist/esm/naylence/fame/expr/ast.js.map +1 -0
  49. package/dist/esm/naylence/fame/expr/builtins.js +477 -0
  50. package/dist/esm/naylence/fame/expr/builtins.js.map +1 -0
  51. package/dist/esm/naylence/fame/expr/errors.js +88 -0
  52. package/dist/esm/naylence/fame/expr/errors.js.map +1 -0
  53. package/dist/esm/naylence/fame/expr/evaluator.js +385 -0
  54. package/dist/esm/naylence/fame/expr/evaluator.js.map +1 -0
  55. package/dist/esm/naylence/fame/expr/index.js +21 -0
  56. package/dist/esm/naylence/fame/expr/index.js.map +1 -0
  57. package/dist/esm/naylence/fame/expr/limits.js +80 -0
  58. package/dist/esm/naylence/fame/expr/limits.js.map +1 -0
  59. package/dist/esm/naylence/fame/expr/parser.js +429 -0
  60. package/dist/esm/naylence/fame/expr/parser.js.map +1 -0
  61. package/dist/esm/naylence/fame/expr/tokenizer.js +336 -0
  62. package/dist/esm/naylence/fame/expr/tokenizer.js.map +1 -0
  63. package/dist/esm/naylence/fame/factory-manifest.js +2 -0
  64. package/dist/esm/naylence/fame/factory-manifest.js.map +1 -1
  65. package/dist/esm/naylence/fame/security/auth/index.js +7 -0
  66. package/dist/esm/naylence/fame/security/auth/index.js.map +1 -0
  67. package/dist/esm/naylence/fame/security/auth/policy/advanced-authorization-policy-factory.js +70 -0
  68. package/dist/esm/naylence/fame/security/auth/policy/advanced-authorization-policy-factory.js.map +1 -0
  69. package/dist/esm/naylence/fame/security/auth/policy/advanced-authorization-policy.js +562 -0
  70. package/dist/esm/naylence/fame/security/auth/policy/advanced-authorization-policy.js.map +1 -0
  71. package/dist/esm/naylence/fame/security/auth/policy/expr-builtins.js +129 -0
  72. package/dist/esm/naylence/fame/security/auth/policy/expr-builtins.js.map +1 -0
  73. package/dist/esm/naylence/fame/security/auth/policy/index.js +15 -0
  74. package/dist/esm/naylence/fame/security/auth/policy/index.js.map +1 -0
  75. package/dist/esm/naylence/fame/security/index.js +2 -0
  76. package/dist/esm/naylence/fame/security/index.js.map +1 -1
  77. package/dist/esm/naylence/fame/security/register-advanced-security-factories.js +2 -0
  78. package/dist/esm/naylence/fame/security/register-advanced-security-factories.js.map +1 -1
  79. package/dist/esm/naylence/fame/security/strict-overlay-security-profile.js +64 -0
  80. package/dist/esm/naylence/fame/security/strict-overlay-security-profile.js.map +1 -0
  81. package/dist/esm/package.json +3 -0
  82. package/dist/esm/plugin.js +2 -0
  83. package/dist/esm/plugin.js.map +1 -1
  84. package/dist/esm/version.js +2 -2
  85. package/dist/esm/version.js.map +1 -1
  86. package/dist/node/index.cjs +2795 -6
  87. package/dist/node/index.mjs +2770 -15
  88. package/dist/node/node.cjs +2819 -3
  89. package/dist/node/node.mjs +2796 -15
  90. package/dist/types/advanced-security-isomorphic.d.ts +2 -0
  91. package/dist/types/advanced-security-isomorphic.d.ts.map +1 -1
  92. package/dist/types/naylence/fame/expr/ast.d.ts +85 -0
  93. package/dist/types/naylence/fame/expr/ast.d.ts.map +1 -0
  94. package/dist/types/naylence/fame/expr/builtins.d.ts +79 -0
  95. package/dist/types/naylence/fame/expr/builtins.d.ts.map +1 -0
  96. package/dist/types/naylence/fame/expr/errors.d.ts +61 -0
  97. package/dist/types/naylence/fame/expr/errors.d.ts.map +1 -0
  98. package/dist/types/naylence/fame/expr/evaluator.d.ts +90 -0
  99. package/dist/types/naylence/fame/expr/evaluator.d.ts.map +1 -0
  100. package/dist/types/naylence/fame/expr/index.d.ts +16 -0
  101. package/dist/types/naylence/fame/expr/index.d.ts.map +1 -0
  102. package/dist/types/naylence/fame/expr/limits.d.ts +65 -0
  103. package/dist/types/naylence/fame/expr/limits.d.ts.map +1 -0
  104. package/dist/types/naylence/fame/expr/parser.d.ts +102 -0
  105. package/dist/types/naylence/fame/expr/parser.d.ts.map +1 -0
  106. package/dist/types/naylence/fame/expr/tokenizer.d.ts +51 -0
  107. package/dist/types/naylence/fame/expr/tokenizer.d.ts.map +1 -0
  108. package/dist/types/naylence/fame/factory-manifest.d.ts +1 -1
  109. package/dist/types/naylence/fame/factory-manifest.d.ts.map +1 -1
  110. package/dist/types/naylence/fame/security/auth/index.d.ts +7 -0
  111. package/dist/types/naylence/fame/security/auth/index.d.ts.map +1 -0
  112. package/dist/types/naylence/fame/security/auth/policy/advanced-authorization-policy-factory.d.ts +47 -0
  113. package/dist/types/naylence/fame/security/auth/policy/advanced-authorization-policy-factory.d.ts.map +1 -0
  114. package/dist/types/naylence/fame/security/auth/policy/advanced-authorization-policy.d.ts +73 -0
  115. package/dist/types/naylence/fame/security/auth/policy/advanced-authorization-policy.d.ts.map +1 -0
  116. package/dist/types/naylence/fame/security/auth/policy/expr-builtins.d.ts +14 -0
  117. package/dist/types/naylence/fame/security/auth/policy/expr-builtins.d.ts.map +1 -0
  118. package/dist/types/naylence/fame/security/auth/policy/index.d.ts +12 -0
  119. package/dist/types/naylence/fame/security/auth/policy/index.d.ts.map +1 -0
  120. package/dist/types/naylence/fame/security/index.d.ts +2 -0
  121. package/dist/types/naylence/fame/security/index.d.ts.map +1 -1
  122. package/dist/types/naylence/fame/security/register-advanced-security-factories.d.ts +1 -0
  123. package/dist/types/naylence/fame/security/register-advanced-security-factories.d.ts.map +1 -1
  124. package/dist/types/naylence/fame/security/strict-overlay-security-profile.d.ts +11 -0
  125. package/dist/types/naylence/fame/security/strict-overlay-security-profile.d.ts.map +1 -0
  126. package/dist/types/plugin.d.ts.map +1 -1
  127. package/dist/types/version.d.ts +1 -1
  128. package/dist/types/version.d.ts.map +1 -1
  129. package/package.json +5 -4
@@ -0,0 +1,477 @@
1
+ /**
2
+ * Built-in functions for the expression language.
3
+ *
4
+ * All built-in functions are pure and deterministic.
5
+ *
6
+ * Null handling semantics:
7
+ * - `undefined` is normalized to `null` throughout the expression value model.
8
+ * - Predicate-style builtins (starts_with, ends_with, contains, glob_match,
9
+ * regex_match, etc.) return `false` when passed `null` for required args
10
+ * instead of throwing an error.
11
+ * - Wrong non-null types still raise BuiltinError to surface real bugs.
12
+ * - Non-predicate operations (arithmetic, comparisons) remain strict.
13
+ */
14
+ import { BuiltinError, EvaluationError } from "./errors.js";
15
+ import { sha256 } from '@noble/hashes/sha256';
16
+ import { generateFingerprintSync } from '@naylence/core';
17
+ import { checkGlobPatternLength, checkRegexPatternLength, } from "./limits.js";
18
+ /**
19
+ * Normalizes a JavaScript value to an ExprValue.
20
+ *
21
+ * Rules:
22
+ * - `undefined` -> `null`
23
+ * - `null` -> `null`
24
+ * - boolean/number/string -> returned as-is
25
+ * - array -> elements are recursively normalized
26
+ * - object -> returned as-is (reads will normalize on access)
27
+ * - other types (function, symbol, etc.) -> `null`
28
+ *
29
+ * This ensures `undefined` never leaks into the expression value model.
30
+ */
31
+ export function normalizeJsValue(value) {
32
+ if (value === undefined || value === null) {
33
+ return null;
34
+ }
35
+ if (typeof value === "boolean" || typeof value === "number") {
36
+ return value;
37
+ }
38
+ if (typeof value === "string") {
39
+ return value;
40
+ }
41
+ if (Array.isArray(value)) {
42
+ return value.map((element) => normalizeJsValue(element));
43
+ }
44
+ if (typeof value === "object") {
45
+ // Return the object as-is; reads will normalize on access
46
+ return value;
47
+ }
48
+ // Function, symbol, bigint, etc. -> null
49
+ return null;
50
+ }
51
+ /**
52
+ * Gets the type name of a value for error messages.
53
+ */
54
+ export function getTypeName(value) {
55
+ if (value === null)
56
+ return "null";
57
+ if (Array.isArray(value))
58
+ return "array";
59
+ return typeof value;
60
+ }
61
+ /**
62
+ * Asserts that a value is a string.
63
+ */
64
+ function assertString(value, argName, functionName) {
65
+ if (typeof value !== "string") {
66
+ throw new BuiltinError(functionName, `${argName} must be a string, got ${getTypeName(value)}`);
67
+ }
68
+ }
69
+ /**
70
+ * Checks if a value is null (for null-tolerant predicates).
71
+ */
72
+ function isNull(value) {
73
+ return value === null;
74
+ }
75
+ /**
76
+ * Asserts that a non-null value is a string (for null-tolerant predicates).
77
+ * Returns false if the value is null (indicating predicate should return false).
78
+ * Throws BuiltinError if the value is non-null but not a string.
79
+ */
80
+ function assertStringOrNull(value, argName, functionName) {
81
+ if (isNull(value)) {
82
+ return false;
83
+ }
84
+ if (typeof value !== "string") {
85
+ throw new BuiltinError(functionName, `${argName} must be a string, got ${getTypeName(value)}`);
86
+ }
87
+ return true;
88
+ }
89
+ /**
90
+ * Gets an argument by index, throwing if not present.
91
+ */
92
+ function getArg(args, index, functionName) {
93
+ const value = args[index];
94
+ if (value === undefined) {
95
+ throw new BuiltinError(functionName, `missing argument at index ${index}`);
96
+ }
97
+ return value;
98
+ }
99
+ /**
100
+ * Asserts argument count.
101
+ */
102
+ function assertArgCount(args, expected, functionName) {
103
+ if (args.length !== expected) {
104
+ throw new BuiltinError(functionName, `expected ${expected} argument(s), got ${args.length}`);
105
+ }
106
+ }
107
+ /**
108
+ * Asserts argument count range.
109
+ */
110
+ function assertArgCountRange(args, min, max, functionName) {
111
+ if (args.length < min || args.length > max) {
112
+ throw new BuiltinError(functionName, `expected ${min}-${max} argument(s), got ${args.length}`);
113
+ }
114
+ }
115
+ // ============================================================
116
+ // String Helpers
117
+ // ============================================================
118
+ /**
119
+ * lower(s: string) -> string
120
+ *
121
+ * Returns the lowercase version of the string.
122
+ */
123
+ const lower = (args) => {
124
+ assertArgCount(args, 1, "lower");
125
+ const s = getArg(args, 0, "lower");
126
+ assertString(s, "s", "lower");
127
+ return s.toLowerCase();
128
+ };
129
+ /**
130
+ * upper(s: string) -> string
131
+ *
132
+ * Returns the uppercase version of the string.
133
+ */
134
+ const upper = (args) => {
135
+ assertArgCount(args, 1, "upper");
136
+ const s = getArg(args, 0, "upper");
137
+ assertString(s, "s", "upper");
138
+ return s.toUpperCase();
139
+ };
140
+ /**
141
+ * starts_with(s: string, prefix: string) -> bool
142
+ *
143
+ * Returns true if the string starts with the prefix.
144
+ * Null-tolerant: returns false if either argument is null.
145
+ */
146
+ const starts_with = (args) => {
147
+ assertArgCount(args, 2, "starts_with");
148
+ const s = getArg(args, 0, "starts_with");
149
+ const prefix = getArg(args, 1, "starts_with");
150
+ // Null-tolerant: return false if either arg is null
151
+ if (!assertStringOrNull(s, "s", "starts_with"))
152
+ return false;
153
+ if (!assertStringOrNull(prefix, "prefix", "starts_with"))
154
+ return false;
155
+ return s.startsWith(prefix);
156
+ };
157
+ /**
158
+ * ends_with(s: string, suffix: string) -> bool
159
+ *
160
+ * Returns true if the string ends with the suffix.
161
+ * Null-tolerant: returns false if either argument is null.
162
+ */
163
+ const ends_with = (args) => {
164
+ assertArgCount(args, 2, "ends_with");
165
+ const s = getArg(args, 0, "ends_with");
166
+ const suffix = getArg(args, 1, "ends_with");
167
+ // Null-tolerant: return false if either arg is null
168
+ if (!assertStringOrNull(s, "s", "ends_with"))
169
+ return false;
170
+ if (!assertStringOrNull(suffix, "suffix", "ends_with"))
171
+ return false;
172
+ return s.endsWith(suffix);
173
+ };
174
+ /**
175
+ * contains(s: string, substring: string) -> bool
176
+ *
177
+ * Returns true if the string contains the substring.
178
+ * Null-tolerant: returns false if either argument is null.
179
+ */
180
+ const contains = (args) => {
181
+ assertArgCount(args, 2, "contains");
182
+ const s = getArg(args, 0, "contains");
183
+ const substring = getArg(args, 1, "contains");
184
+ // Null-tolerant: return false if either arg is null
185
+ if (!assertStringOrNull(s, "s", "contains"))
186
+ return false;
187
+ if (!assertStringOrNull(substring, "substring", "contains"))
188
+ return false;
189
+ return s.includes(substring);
190
+ };
191
+ /**
192
+ * split(s: string, separator: string) -> string[]
193
+ *
194
+ * Splits the string by the separator.
195
+ */
196
+ const split = (args) => {
197
+ assertArgCountRange(args, 1, 2, "split");
198
+ const s = getArg(args, 0, "split");
199
+ assertString(s, "s", "split");
200
+ const separator = args.length >= 2 ? getArg(args, 1, "split") : " ";
201
+ assertString(separator, "separator", "split");
202
+ return s.split(separator);
203
+ };
204
+ // ============================================================
205
+ // Collection Helpers
206
+ // ============================================================
207
+ /**
208
+ * len(x: string | array) -> number
209
+ *
210
+ * Returns the length of a string or array.
211
+ */
212
+ const len = (args) => {
213
+ assertArgCount(args, 1, "len");
214
+ const x = getArg(args, 0, "len");
215
+ if (typeof x === "string") {
216
+ return x.length;
217
+ }
218
+ if (Array.isArray(x)) {
219
+ return x.length;
220
+ }
221
+ throw new BuiltinError("len", `expected string or array, got ${getTypeName(x)}`);
222
+ };
223
+ // ============================================================
224
+ // Generic Helpers
225
+ // ============================================================
226
+ /**
227
+ * exists(x: any) -> bool
228
+ *
229
+ * Returns true if the value is not null.
230
+ * Missing bindings and missing properties evaluate to null, so this
231
+ * can be used to check for presence.
232
+ */
233
+ const exists = (args) => {
234
+ assertArgCount(args, 1, "exists");
235
+ const x = getArg(args, 0, "exists");
236
+ return x !== null;
237
+ };
238
+ /**
239
+ * coalesce(a: any, b: any) -> any
240
+ *
241
+ * Returns `a` if it is not null, otherwise returns `b`.
242
+ * This is useful for providing default values.
243
+ */
244
+ const coalesce = (args) => {
245
+ assertArgCount(args, 2, "coalesce");
246
+ const a = getArg(args, 0, "coalesce");
247
+ const b = getArg(args, 1, "coalesce");
248
+ return a !== null ? a : b;
249
+ };
250
+ /**
251
+ * trim(s: string) -> string
252
+ *
253
+ * Trims whitespace from both ends of a string.
254
+ * Returns an empty string if `s` is null (for convenient composition).
255
+ * Throws BuiltinError if `s` is non-null but not a string.
256
+ */
257
+ const trim = (args) => {
258
+ assertArgCount(args, 1, "trim");
259
+ const s = getArg(args, 0, "trim");
260
+ // Null-friendly: return empty string for null
261
+ if (s === null) {
262
+ return "";
263
+ }
264
+ // Strict type check for non-null values
265
+ if (typeof s !== "string") {
266
+ throw new BuiltinError("trim", `s must be a string, got ${getTypeName(s)}`);
267
+ }
268
+ return s.trim();
269
+ };
270
+ /**
271
+ * secure_hash(input_str: string, length: number) -> string
272
+ *
273
+ * Generates a deterministic secure hash/fingerprint of the input string.
274
+ * Uses SHA-256 hashing to create a stable identifier of the specified length.
275
+ * Returns base62-encoded string (alphanumeric, case-sensitive).
276
+ * Automatically rehashes if result contains blacklisted words.
277
+ * Returns empty string if input_str is null (for convenient composition).
278
+ * Throws BuiltinError if input_str is non-null but not a string, or if length is invalid.
279
+ */
280
+ const secure_hash = (args) => {
281
+ assertArgCount(args, 2, "secure_hash");
282
+ const input_str = getArg(args, 0, "secure_hash");
283
+ const length = getArg(args, 1, "secure_hash");
284
+ // Null-friendly: return empty string for null input
285
+ if (input_str === null) {
286
+ return "";
287
+ }
288
+ // Strict type check for input_str
289
+ if (typeof input_str !== "string") {
290
+ throw new BuiltinError("secure_hash", `input_str must be a string, got ${getTypeName(input_str)}`);
291
+ }
292
+ // Strict type check for length
293
+ if (typeof length !== "number") {
294
+ throw new BuiltinError("secure_hash", `length must be a number, got ${getTypeName(length)}`);
295
+ }
296
+ // Validate length is a positive integer
297
+ if (!Number.isInteger(length) || length <= 0) {
298
+ throw new BuiltinError("secure_hash", `length must be a positive integer, got ${length}`);
299
+ }
300
+ // Use generateFingerprintSync from @naylence/core
301
+ // This provides SHA-256 hashing, base62 encoding, and profanity filtering
302
+ return generateFingerprintSync(input_str, length, sha256);
303
+ };
304
+ // ============================================================
305
+ // Pattern Helpers (BSL-only)
306
+ // ============================================================
307
+ /**
308
+ * Escapes special regex characters in a string.
309
+ */
310
+ function escapeRegex(str) {
311
+ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
312
+ }
313
+ /**
314
+ * Converts a glob pattern to a regex pattern.
315
+ */
316
+ function globToRegex(glob) {
317
+ const parts = [];
318
+ let i = 0;
319
+ while (i < glob.length) {
320
+ const ch = glob[i];
321
+ if (ch === "*") {
322
+ if (glob[i + 1] === "*") {
323
+ // `**` matches any characters
324
+ parts.push(".*");
325
+ i += 2;
326
+ }
327
+ else {
328
+ // `*` matches any characters except dots
329
+ parts.push("[^.]*");
330
+ i += 1;
331
+ }
332
+ }
333
+ else if (ch === "?") {
334
+ // `?` matches a single character
335
+ parts.push("[^.]");
336
+ i += 1;
337
+ }
338
+ else {
339
+ parts.push(escapeRegex(ch));
340
+ i += 1;
341
+ }
342
+ }
343
+ return parts.join("");
344
+ }
345
+ /**
346
+ * glob_match(value: string, pattern: string) -> bool
347
+ *
348
+ * Returns true if the value matches the glob pattern.
349
+ * Glob syntax: * (single segment), ** (any depth), ? (single char)
350
+ * Null-tolerant: returns false if either argument is null.
351
+ */
352
+ const glob_match = (args, context) => {
353
+ assertArgCount(args, 2, "glob_match");
354
+ const value = getArg(args, 0, "glob_match");
355
+ const pattern = getArg(args, 1, "glob_match");
356
+ // Null-tolerant: return false if either arg is null
357
+ if (!assertStringOrNull(value, "value", "glob_match"))
358
+ return false;
359
+ if (!assertStringOrNull(pattern, "pattern", "glob_match"))
360
+ return false;
361
+ // Validate pattern length
362
+ checkGlobPatternLength(pattern, context.limits);
363
+ // Convert glob to regex
364
+ const regexPattern = `^${globToRegex(pattern)}$`;
365
+ try {
366
+ const regex = new RegExp(regexPattern);
367
+ return regex.test(value);
368
+ }
369
+ catch {
370
+ throw new BuiltinError("glob_match", `invalid glob pattern: ${pattern}`);
371
+ }
372
+ };
373
+ /**
374
+ * Detects potentially catastrophic regex patterns.
375
+ *
376
+ * This is a best-effort heuristic check for common ReDoS patterns.
377
+ */
378
+ function isSafeRegex(pattern) {
379
+ // Check for obvious catastrophic patterns:
380
+ // - Nested quantifiers: (a+)+, (a*)*
381
+ // - Overlapping alternation with quantifiers: (a|a)+
382
+ // Simple heuristic: reject patterns with nested quantifiers
383
+ const nestedQuantifiers = /([+*?]|\{\d+,?\d*\})\s*\)\s*([+*?]|\{\d+,?\d*\})/;
384
+ if (nestedQuantifiers.test(pattern)) {
385
+ return false;
386
+ }
387
+ // Reject patterns with excessive backtracking potential
388
+ const excessiveBacktracking = /(\.\*){3,}|(\.\+){3,}/;
389
+ if (excessiveBacktracking.test(pattern)) {
390
+ return false;
391
+ }
392
+ return true;
393
+ }
394
+ /**
395
+ * regex_match(value: string, pattern: string) -> bool
396
+ *
397
+ * Returns true if the value matches the regex pattern.
398
+ * The pattern is anchored (full match).
399
+ * Null-tolerant: returns false if either argument is null.
400
+ */
401
+ const regex_match = (args, context) => {
402
+ assertArgCount(args, 2, "regex_match");
403
+ const value = getArg(args, 0, "regex_match");
404
+ const pattern = getArg(args, 1, "regex_match");
405
+ // Null-tolerant: return false if either arg is null
406
+ if (!assertStringOrNull(value, "value", "regex_match"))
407
+ return false;
408
+ if (!assertStringOrNull(pattern, "pattern", "regex_match"))
409
+ return false;
410
+ // Validate pattern length
411
+ checkRegexPatternLength(pattern, context.limits);
412
+ // Check for potentially unsafe patterns
413
+ if (!isSafeRegex(pattern)) {
414
+ throw new BuiltinError("regex_match", `pattern may cause excessive backtracking: ${pattern}`);
415
+ }
416
+ // Anchor the pattern for full match
417
+ const anchoredPattern = pattern.startsWith("^")
418
+ ? pattern
419
+ : pattern.endsWith("$")
420
+ ? pattern
421
+ : `^(?:${pattern})$`;
422
+ try {
423
+ const regex = new RegExp(anchoredPattern);
424
+ return regex.test(value);
425
+ }
426
+ catch (error) {
427
+ throw new BuiltinError("regex_match", `invalid regex pattern: ${pattern} - ${error instanceof Error ? error.message : String(error)}`);
428
+ }
429
+ };
430
+ // ============================================================
431
+ // Registry
432
+ // ============================================================
433
+ /**
434
+ * Registry of all built-in functions.
435
+ */
436
+ export const BUILTIN_FUNCTIONS = new Map([
437
+ // String helpers
438
+ ["lower", lower],
439
+ ["upper", upper],
440
+ ["starts_with", starts_with],
441
+ ["ends_with", ends_with],
442
+ ["contains", contains],
443
+ ["split", split],
444
+ ["trim", trim],
445
+ // Collection helpers
446
+ ["len", len],
447
+ // Generic helpers
448
+ ["exists", exists],
449
+ ["coalesce", coalesce],
450
+ ["secure_hash", secure_hash],
451
+ // Pattern helpers
452
+ ["glob_match", glob_match],
453
+ ["regex_match", regex_match],
454
+ ]);
455
+ /**
456
+ * Calls a built-in function by name.
457
+ *
458
+ * @param name - The function name
459
+ * @param args - The function arguments
460
+ * @param context - The evaluation context
461
+ * @returns The function result
462
+ * @throws BuiltinError if the function doesn't exist or fails
463
+ */
464
+ export function callBuiltin(name, args, context, functions = BUILTIN_FUNCTIONS) {
465
+ const fn = functions.get(name);
466
+ if (!fn) {
467
+ throw new EvaluationError(`Unknown function: ${name}`, context.position, context.source);
468
+ }
469
+ return fn(args, context);
470
+ }
471
+ /**
472
+ * Checks if a name is a built-in function.
473
+ */
474
+ export function isBuiltinFunction(name, functions = BUILTIN_FUNCTIONS) {
475
+ return functions.has(name);
476
+ }
477
+ //# sourceMappingURL=builtins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builtins.js","sourceRoot":"","sources":["../../../../../src/naylence/fame/expr/builtins.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Error types for the expression evaluation engine.
3
+ *
4
+ * All expression errors extend ExpressionError for consistent handling.
5
+ */
6
+ /**
7
+ * Base error class for all expression-related errors.
8
+ */
9
+ export class ExpressionError extends Error {
10
+ constructor(message, position, expression) {
11
+ super(message);
12
+ this.name = "ExpressionError";
13
+ this.position = position;
14
+ this.expression = expression;
15
+ }
16
+ /**
17
+ * Returns a formatted error message with position context.
18
+ */
19
+ formatWithContext() {
20
+ if (this.expression === undefined || this.position === undefined) {
21
+ return this.message;
22
+ }
23
+ const pointer = " ".repeat(this.position) + "^";
24
+ return `${this.message}\n ${this.expression}\n ${pointer}`;
25
+ }
26
+ }
27
+ /**
28
+ * Error thrown during tokenization (lexical analysis).
29
+ */
30
+ export class TokenizerError extends ExpressionError {
31
+ constructor(message, position, expression) {
32
+ super(message, position, expression);
33
+ this.name = "TokenizerError";
34
+ }
35
+ }
36
+ /**
37
+ * Error thrown during parsing (syntax analysis).
38
+ */
39
+ export class ParseError extends ExpressionError {
40
+ constructor(message, position, expression) {
41
+ super(message, position, expression);
42
+ this.name = "ParseError";
43
+ }
44
+ }
45
+ /**
46
+ * Error thrown during evaluation (runtime error).
47
+ */
48
+ export class EvaluationError extends ExpressionError {
49
+ constructor(message, position, expression, path) {
50
+ super(message, position, expression);
51
+ this.name = "EvaluationError";
52
+ this.path = path;
53
+ }
54
+ }
55
+ /**
56
+ * Error thrown for type mismatches during evaluation.
57
+ */
58
+ export class TypeError extends EvaluationError {
59
+ constructor(expected, actual, position, expression) {
60
+ super(`Type error: expected ${expected}, got ${actual}`, position, expression);
61
+ this.name = "TypeError";
62
+ this.expected = expected;
63
+ this.actual = actual;
64
+ }
65
+ }
66
+ /**
67
+ * Error thrown when expression limits are exceeded.
68
+ */
69
+ export class LimitExceededError extends ExpressionError {
70
+ constructor(limitName, limit, actual) {
71
+ super(`Limit exceeded: ${limitName} (limit: ${limit}, actual: ${actual})`);
72
+ this.name = "LimitExceededError";
73
+ this.limitName = limitName;
74
+ this.limit = limit;
75
+ this.actual = actual;
76
+ }
77
+ }
78
+ /**
79
+ * Error thrown when a built-in function encounters an error.
80
+ */
81
+ export class BuiltinError extends EvaluationError {
82
+ constructor(functionName, message, position, expression) {
83
+ super(`${functionName}: ${message}`, position, expression);
84
+ this.name = "BuiltinError";
85
+ this.functionName = functionName;
86
+ }
87
+ }
88
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../../src/naylence/fame/expr/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAIxC,YAAY,OAAe,EAAE,QAAiB,EAAE,UAAmB;QACjE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED;;OAEG;IACI,iBAAiB;QACtB,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACjE,OAAO,IAAI,CAAC,OAAO,CAAC;QACtB,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC;QAChD,OAAO,GAAG,IAAI,CAAC,OAAO,OAAO,IAAI,CAAC,UAAU,OAAO,OAAO,EAAE,CAAC;IAC/D,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,eAAe;IACjD,YAAY,OAAe,EAAE,QAAiB,EAAE,UAAmB;QACjE,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,UAAW,SAAQ,eAAe;IAC7C,YAAY,OAAe,EAAE,QAAiB,EAAE,UAAmB;QACjE,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,eAAe;IAGlD,YACE,OAAe,EACf,QAAiB,EACjB,UAAmB,EACnB,IAAa;QAEb,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,SAAU,SAAQ,eAAe;IAI5C,YACE,QAAgB,EAChB,MAAc,EACd,QAAiB,EACjB,UAAmB;QAEnB,KAAK,CACH,wBAAwB,QAAQ,SAAS,MAAM,EAAE,EACjD,QAAQ,EACR,UAAU,CACX,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;QACxB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,kBAAmB,SAAQ,eAAe;IAKrD,YAAY,SAAiB,EAAE,KAAa,EAAE,MAAc;QAC1D,KAAK,CAAC,mBAAmB,SAAS,YAAY,KAAK,aAAa,MAAM,GAAG,CAAC,CAAC;QAC3E,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,YAAa,SAAQ,eAAe;IAG/C,YACE,YAAoB,EACpB,OAAe,EACf,QAAiB,EACjB,UAAmB;QAEnB,KAAK,CAAC,GAAG,YAAY,KAAK,OAAO,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;CACF"}