@omgbase/oqx 0.10.1 → 0.12.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.
@@ -1 +1 @@
1
- {"version":3,"file":"semantics.js","sourceRoot":"","sources":["../src/semantics.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"semantics.js","sourceRoot":"","sources":["../src/semantics.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@omgbase/oqx",
3
- "version": "0.10.1",
3
+ "version": "0.12.0",
4
4
  "description": "OQX (omgbase Query eXpressions): a composable query language and engine for JavaScript collections",
5
5
  "keywords": [
6
6
  "query",
@@ -15,13 +15,14 @@
15
15
  ],
16
16
  "license": "MIT",
17
17
  "author": "Brendan Baldwin",
18
- "homepage": "https://github.com/omgbase/oqx#readme",
18
+ "homepage": "https://github.com/omgbase/omgbase/tree/main/packages/oqx#readme",
19
19
  "repository": {
20
20
  "type": "git",
21
- "url": "git+https://github.com/omgbase/oqx.git"
21
+ "url": "git+https://github.com/omgbase/omgbase.git",
22
+ "directory": "packages/oqx"
22
23
  },
23
24
  "bugs": {
24
- "url": "https://github.com/omgbase/oqx/issues"
25
+ "url": "https://github.com/omgbase/omgbase/issues"
25
26
  },
26
27
  "type": "module",
27
28
  "sideEffects": false,
@@ -53,7 +54,9 @@
53
54
  "clean": "rm -rf dist",
54
55
  "test": "node --test test/*.test.ts",
55
56
  "typecheck": "tsc --noEmit",
56
- "prepublishOnly": "npm run build"
57
+ "lint": "eslint .",
58
+ "lint:fix": "eslint . --fix",
59
+ "prepublishOnly": "pnpm run build"
57
60
  },
58
61
  "devDependencies": {
59
62
  "@types/node": "^22.20.2",
package/src/context.ts CHANGED
@@ -8,7 +8,14 @@
8
8
  // (Performant execution over a real store is the tier-3 seam — see planner.ts —
9
9
  // which pushes work into the store instead of driving it row-by-row here.)
10
10
 
11
- import { coerceCollection, BUILTIN_FUNCTIONS, BUILTIN_METHODS } from "./semantics.ts";
11
+ import { coerceCollection, regexMatches, BUILTIN_FUNCTIONS, BUILTIN_METHODS } from "./semantics.ts";
12
+ import type { RegexDialect } from "./regex.ts";
13
+
14
+ // An array's only properties are its integer indices, spelled canonically
15
+ // (`"0"`, `"12"`; never `"01"`, `"length"`, or a method name).
16
+ function isIndexKey(key: string): boolean {
17
+ return /^(0|[1-9]\d*)$/.test(key);
18
+ }
12
19
 
13
20
  /** Result of a context-provided function/method call: `handled: false` tells the
14
21
  * engine to fall back to the builtin table (or error if none). */
@@ -33,25 +40,42 @@ export interface DataContext {
33
40
  callFunction?(name: string, args: unknown[]): CallResult;
34
41
  /** Optional custom method; return `{ handled: false }` to defer. */
35
42
  callMethod?(name: string, recv: unknown, args: unknown[]): CallResult;
43
+ /** The regex dialect `matches()` compiles against. `"oqx"` (the default when
44
+ * absent) is the portable baseline the spec tests; `"native"` hands the
45
+ * pattern to the host `RegExp` unvalidated — implementation-defined, not
46
+ * portable. Note the engine dispatches `matches` through `callMethod`, so
47
+ * this is read by the context's own `matches` (`DefaultContext` does;
48
+ * `regexMatches(recv, args, dialect)` is the helper). `BUILTIN_METHODS.matches`
49
+ * is always the baseline. */
50
+ readonly regexDialect?: RegexDialect;
51
+ }
52
+
53
+ export interface DefaultContextOptions {
54
+ /** See `DataContext.regexDialect`. Default `"oqx"`. */
55
+ regexDialect?: RegexDialect;
36
56
  }
37
57
 
38
58
  /** The default context: ordinary JavaScript objects. Named roots come from a
39
- * plain `{ name: collection }` map; properties are own/inherited keys; identity
40
- * is `.id` when present, else the object itself (reference identity). */
59
+ * plain `{ name: collection }` map; properties are OWN keys only (an array
60
+ * exposes only its integer indices, a primitive has none); identity is `.id`
61
+ * when present, else the row itself (the engine keys it structurally). */
41
62
  export class DefaultContext implements DataContext {
42
63
  private roots: Record<string, unknown>;
64
+ readonly regexDialect: RegexDialect;
43
65
 
44
- constructor(roots: Record<string, unknown> = {}) {
66
+ constructor(roots: Record<string, unknown> = {}, options: DefaultContextOptions = {}) {
45
67
  this.roots = roots;
68
+ this.regexDialect = options.regexDialect ?? "oqx";
46
69
  }
47
70
 
48
71
  root(name: string): unknown {
49
- return this.roots[name];
72
+ return Object.hasOwn(this.roots, name) ? this.roots[name] : undefined;
50
73
  }
51
74
 
52
75
  get(row: unknown, key: string): unknown {
53
- if (row == null) return undefined;
54
- return (Object(row) as Record<string, unknown>)[key];
76
+ if (row == null || typeof row !== "object") return undefined;
77
+ if (Array.isArray(row)) return isIndexKey(key) ? row[Number(key)] : undefined;
78
+ return Object.hasOwn(row, key) ? (row as Record<string, unknown>)[key] : undefined;
55
79
  }
56
80
 
57
81
  toRows(value: unknown): Iterable<unknown> {
@@ -64,12 +88,13 @@ export class DefaultContext implements DataContext {
64
88
  }
65
89
 
66
90
  callFunction(name: string, args: unknown[]): CallResult {
67
- const fn = BUILTIN_FUNCTIONS[name];
91
+ const fn = Object.hasOwn(BUILTIN_FUNCTIONS, name) ? BUILTIN_FUNCTIONS[name] : undefined;
68
92
  return fn ? { handled: true, value: fn(args) } : { handled: false };
69
93
  }
70
94
 
71
95
  callMethod(name: string, recv: unknown, args: unknown[]): CallResult {
72
- const fn = BUILTIN_METHODS[name];
96
+ if (name === "matches") return { handled: true, value: regexMatches(recv, args, this.regexDialect) };
97
+ const fn = Object.hasOwn(BUILTIN_METHODS, name) ? BUILTIN_METHODS[name] : undefined;
73
98
  return fn ? { handled: true, value: fn(recv, args) } : { handled: false };
74
99
  }
75
100
  }
package/src/engine.ts CHANGED
@@ -3,9 +3,10 @@
3
3
  // interface so a pushdown planner (tier 3, planner.ts) is a drop-in alternative.
4
4
  //
5
5
  // Optimizations over a naive walk: `exists` short-circuits at the first match;
6
- // `first`/`single` stop early when the result is unordered; `count` never
7
- // materializes rows; and within an `&&` the cheap scalar leaves are evaluated
8
- // before expensive consumer-op leaves (which each drive a nested traversal).
6
+ // `first` stops early when the result is unordered; `count` never materializes
7
+ // rows. (`single` always materializes, so its error reports the true row count,
8
+ // and `&&` evaluates strictly left to right — evaluation order is observable
9
+ // through errors, so the engine never reorders conjuncts.)
9
10
  //
10
11
  // Name resolution is strictly lexical and LOCAL: a bare identifier is read from
11
12
  // the current scope only, and an enclosing scope is reached solely through an
@@ -19,7 +20,7 @@ import type { DataContext } from "./context.ts";
19
20
  import { DefaultContext } from "./context.ts";
20
21
  import { OqxError } from "./errors.ts";
21
22
  import {
22
- equals, relate, arith, membership, truthy, toNumber, compareForSort, makeRange, isEntry,
23
+ relate, arith, membership, truthy, compareForSort, compare, canonicalKey, makeRange, isEntry, isRange,
23
24
  } from "./semantics.ts";
24
25
 
25
26
  /** The shaped result of a top-level query, discriminated by consumer. */
@@ -95,11 +96,11 @@ export class InMemoryEngine implements Engine {
95
96
  return { consumer: "none", none: m === 0 };
96
97
  }
97
98
 
98
- // first/single over an unordered, non-distinct set need only the rows up to
99
- // the bound: offset + 1 (first) / offset + 2 (single, to detect a second).
100
- const want = query.consumer === "first" ? 1 : query.consumer === "single" ? 2 : Infinity;
101
- const cap = !query.orderBy && !query.distinct && want !== Infinity
102
- ? bound.offset + Math.min(want, bound.limit ?? want)
99
+ // first over an unordered, non-distinct set needs only the rows up to the
100
+ // bound (offset + 1). single materializes everything so its error can
101
+ // report how many rows actually matched.
102
+ const cap = query.consumer === "first" && !query.orderBy && !query.distinct
103
+ ? bound.offset + Math.min(1, bound.limit ?? 1)
103
104
  : Infinity;
104
105
  let kept: Scope[] = [];
105
106
  for (const r of rows) {
@@ -180,14 +181,16 @@ export class InMemoryEngine implements Engine {
180
181
 
181
182
  // Dedup scopes by their PROJECTED value (`distinct`): keep the first scope per
182
183
  // distinct projection, preserving order. An empty projection dedups by row
183
- // identity (so `count distinct { }` counts distinct rows).
184
+ // identity (so `count distinct { }` counts distinct rows). Both keys are
185
+ // structural (`canonicalKey`): absent ≡ null, key order ignored, types kept
186
+ // apart — never a host `String()`.
184
187
  private dedupByProjection(scopes: Scope[], proj: Projection): Scope[] {
185
188
  const seen = new Set<string>();
186
189
  const out: Scope[] = [];
187
190
  for (const s of scopes) {
188
191
  const key = proj.select.length === 0
189
- ? `i:${String(this.ctx.identity(s.row))}`
190
- : `p:${stableStringify(this.projectRow(proj, s))}`;
192
+ ? `i:${canonicalKey(this.ctx.identity(s.row))}`
193
+ : `p:${canonicalKey(this.projectRow(proj, s))}`;
191
194
  if (seen.has(key)) continue;
192
195
  seen.add(key);
193
196
  out.push(s);
@@ -207,12 +210,14 @@ export class InMemoryEngine implements Engine {
207
210
  // • `$leaf` = (stop == leaf); `$frontier` = (stop ∈ {frontier, depth}) — the
208
211
  // "there is unfollowed graph beyond me" signal;
209
212
  // • identity for cycle detection + `distinct` is `by <expr>` when given, else
210
- // `ctx.identity(row)`.
213
+ // `ctx.identity(row)` (an entry's identity is its value's); identities are
214
+ // compared structurally via `canonicalKey`, and `$ordinal` paths compare
215
+ // component-wise (`comparePath`), so `10` follows `9`.
211
216
  private followWalk(seedRows: unknown[], follow: Follow, parent: Scope): Occurrence[] {
212
217
  const cap = follow.depth ?? HARD_DEPTH_CAP;
213
218
  const scopeFor = (row: unknown): Scope => this.enter(row, parent);
214
- const keyOf = (row: unknown): string =>
215
- String(follow.by ? this.evalExpr(follow.by, scopeFor(row)) : this.ctx.identity(row));
219
+ const identityOf = (row: unknown): unknown =>
220
+ follow.by ? this.evalExpr(follow.by, scopeFor(row)) : this.ctx.identity(isEntry(row) ? row.value : row);
216
221
  const succOf = (row: unknown): unknown[] => {
217
222
  const raw = this.rowsOf(this.evalExpr(follow.receiver, scopeFor(row)));
218
223
  return follow.where ? raw.filter((x) => truthy(this.evalExpr(follow.where!, scopeFor(x)))) : raw;
@@ -220,12 +225,13 @@ export class InMemoryEngine implements Engine {
220
225
  const frontierHit = (row: unknown): boolean =>
221
226
  follow.frontier ? truthy(this.evalExpr(follow.frontier, scopeFor(row))) : false;
222
227
 
223
- interface Walked { row: unknown; depth: number; path: string; key: string; stop: string; }
228
+ interface Walked { row: unknown; depth: number; path: unknown[]; key: string; stop: string; }
224
229
  const walked: Walked[] = [];
225
230
 
226
- const visit = (row: unknown, depth: number, ancestors: string[]): void => {
227
- const key = keyOf(row);
228
- const path = `/${[...ancestors, key].join("/")}/`;
231
+ const visit = (row: unknown, depth: number, ancestors: string[], ancestorIds: unknown[]): void => {
232
+ const id = identityOf(row);
233
+ const key = canonicalKey(id);
234
+ const path = [...ancestorIds, id];
229
235
  let stop: string;
230
236
  if (ancestors.includes(key)) stop = "cycle";
231
237
  else if (frontierHit(row)) stop = "frontier";
@@ -235,13 +241,13 @@ export class InMemoryEngine implements Engine {
235
241
  if (succ.length === 0) stop = "leaf";
236
242
  else {
237
243
  walked.push({ row, depth, path, key, stop: "interior" });
238
- for (const s of succ) visit(s, depth + 1, [...ancestors, key]);
244
+ for (const s of succ) visit(s, depth + 1, [...ancestors, key], path);
239
245
  return;
240
246
  }
241
247
  }
242
248
  walked.push({ row, depth, path, key, stop });
243
249
  };
244
- for (const r of seedRows) visit(r, 1, []);
250
+ for (const r of seedRows) visit(r, 1, [], []);
245
251
 
246
252
  let rows = walked;
247
253
  if (follow.distinct) {
@@ -249,12 +255,12 @@ export class InMemoryEngine implements Engine {
249
255
  const best = new Map<string, Walked>();
250
256
  for (const w of rows) {
251
257
  const prev = best.get(w.key);
252
- if (!prev || w.depth < prev.depth || (w.depth === prev.depth && w.path < prev.path)) best.set(w.key, w);
258
+ if (!prev || w.depth < prev.depth || (w.depth === prev.depth && comparePath(w.path, prev.path) < 0)) best.set(w.key, w);
253
259
  }
254
260
  rows = [...best.values()];
255
261
  }
256
262
  // $ordinal: a deterministic 1..N rank over (depth, path).
257
- rows = rows.slice().sort((a, b) => a.depth - b.depth || (a.path < b.path ? -1 : a.path > b.path ? 1 : 0));
263
+ rows = rows.slice().sort((a, b) => a.depth - b.depth || comparePath(a.path, b.path));
258
264
  return rows.map((w, i) => ({
259
265
  row: w.row,
260
266
  meta: {
@@ -283,13 +289,14 @@ export class InMemoryEngine implements Engine {
283
289
  }
284
290
 
285
291
  // The per-row result: the raw row (empty projection), the single item's value
286
- // itself (`values` mode), or a `{ name: value }` record.
292
+ // itself (`values` mode), or a `{ name: value }` record. A range is an
293
+ // evaluation-time value only and never appears in a result.
287
294
  private projectRow(proj: Projection, scope: Scope): unknown {
288
295
  const { select } = proj;
289
- if (select.length === 0) return scope.row;
290
- if (proj.values) return this.itemValue(select[0]!, scope);
296
+ if (select.length === 0) return noRange(scope.row);
297
+ if (proj.values) return noRange(this.itemValue(select[0]!, scope));
291
298
  const out: Record<string, unknown> = {};
292
- for (const item of select) out[item.name] = this.itemValue(item, scope);
299
+ for (const item of select) out[item.name] = noRange(this.itemValue(item, scope));
293
300
  return out;
294
301
  }
295
302
 
@@ -301,11 +308,9 @@ export class InMemoryEngine implements Engine {
301
308
 
302
309
  private evalWhere(w: Where, scope: Scope): boolean {
303
310
  switch (w.kind) {
304
- case "and": {
305
- // Cheap scalar leaves before expensive consumer ops; `.every` short-circuits.
306
- for (const p of orderByCost(w.parts)) if (!this.evalWhere(p, scope)) return false;
307
- return true;
308
- }
311
+ // Strictly left to right, short-circuiting: `false && f()` never evaluates
312
+ // `f()`, so a query may guard an expensive or failing operand by position.
313
+ case "and": return w.parts.every((p) => this.evalWhere(p, scope));
309
314
  case "or": return w.parts.some((p) => this.evalWhere(p, scope));
310
315
  case "not": return !this.evalWhere(w.expr, scope);
311
316
  case "scalar": return truthy(this.evalExpr(w.expr, scope));
@@ -427,7 +432,11 @@ export class InMemoryEngine implements Engine {
427
432
  private evalExpr(e: Expr, scope: Scope): unknown {
428
433
  switch (e.kind) {
429
434
  case "lit": return e.value;
430
- case "binding": return scope.bindings[e.index];
435
+ case "binding":
436
+ if (e.index >= scope.bindings.length) {
437
+ throw new OqxError(`binding \${${e.index}} is out of range: the query references ${e.index + 1} value${e.index === 0 ? "" : "s"} but ${scope.bindings.length} ${scope.bindings.length === 1 ? "was" : "were"} given`, "eval");
438
+ }
439
+ return scope.bindings[e.index];
431
440
  case "ident": return this.resolveIn(e.name, scope);
432
441
  case "outer": {
433
442
  // `^name` reads from EXACTLY `levels` scopes out — the target scope is
@@ -446,8 +455,11 @@ export class InMemoryEngine implements Engine {
446
455
  return r == null ? undefined : this.ctx.get(r, String(i));
447
456
  }
448
457
  case "call": return this.evalCall(e, scope);
449
- case "unary":
450
- return e.op === "!" ? !truthy(this.evalExpr(e.expr, scope)) : -toNumber(this.evalExpr(e.expr, scope));
458
+ case "unary": {
459
+ const v = this.evalExpr(e.expr, scope);
460
+ if (e.op === "!") return !truthy(v);
461
+ return v == null ? undefined : -(v as number);
462
+ }
451
463
  case "binary": {
452
464
  const l = this.evalExpr(e.left, scope);
453
465
  const r = this.evalExpr(e.right, scope);
@@ -483,7 +495,7 @@ export class InMemoryEngine implements Engine {
483
495
  private resolveIn(name: string, scope: Scope): unknown {
484
496
  if (name === "$value") return scope.parent === null ? undefined : scope.row;
485
497
  if (name === KEY || RECUR.has(name)) return scope.meta ? scope.meta[name] : undefined;
486
- if (scope.lifts && name in scope.lifts) return scope.lifts[name];
498
+ if (scope.lifts && Object.hasOwn(scope.lifts, name)) return scope.lifts[name];
487
499
  if (scope.parent === null) return this.ctx.root(name);
488
500
  return this.ctx.get(scope.row, name);
489
501
  }
@@ -510,17 +522,40 @@ function isRelOp(op: string): boolean {
510
522
  return op === "==" || op === "!=" || op === "<" || op === "<=" || op === ">" || op === ">=";
511
523
  }
512
524
 
513
- // Deterministic stringify for `distinct` dedup keys: object keys are emitted in
514
- // sorted order so two projections that are equal-by-value collide regardless of
515
- // key insertion order. `undefined` normalizes to null (like an absent value).
516
- function stableStringify(v: unknown): string {
517
- if (v === undefined || v === null) return "null";
518
- if (Array.isArray(v)) return `[${v.map(stableStringify).join(",")}]`;
519
- if (typeof v === "object") {
520
- const o = v as Record<string, unknown>;
521
- return `{${Object.keys(o).sort().map((k) => `${JSON.stringify(k)}:${stableStringify(o[k])}`).join(",")}}`;
525
+ // Guard a value bound for a result: a range (`lo..hi`) exists only during
526
+ // evaluation. Checks the value itself and, for an array, its elements — deeper
527
+ // structure is host data (which cannot hold a range) or a nested block's
528
+ // result (already guarded when it was projected).
529
+ function noRange(v: unknown): unknown {
530
+ if (isRange(v) || (Array.isArray(v) && v.some(isRange))) {
531
+ throw new OqxError("a range (lo..hi) cannot appear in a result; test membership with `x in lo..hi` instead", "eval");
532
+ }
533
+ return v;
534
+ }
535
+
536
+ // Order two `follow` paths (identity sequences of equal depth) component-wise:
537
+ // two numbers numerically, two strings by code point; otherwise numbers precede
538
+ // strings precede everything else, and same-kind others order by canonical key.
539
+ function comparePath(a: unknown[], b: unknown[]): number {
540
+ const n = Math.min(a.length, b.length);
541
+ for (let i = 0; i < n; i++) {
542
+ const c = compareComponent(a[i], b[i]);
543
+ if (c !== 0) return c;
522
544
  }
523
- return JSON.stringify(v);
545
+ return a.length - b.length;
546
+ }
547
+
548
+ function compareComponent(x: unknown, y: unknown): number {
549
+ const c = compare(x, y);
550
+ if (c !== undefined) return c;
551
+ const rx = componentRank(x), ry = componentRank(y);
552
+ if (rx !== ry) return rx - ry;
553
+ const kx = canonicalKey(x), ky = canonicalKey(y);
554
+ return kx < ky ? -1 : kx > ky ? 1 : 0;
555
+ }
556
+
557
+ function componentRank(v: unknown): number {
558
+ return typeof v === "number" ? 0 : typeof v === "string" ? 1 : 2;
524
559
  }
525
560
 
526
561
  function compareCount(n: number, cmp: { op: string; value: number }): boolean {
@@ -537,20 +572,6 @@ function boundedCount(n: number, b: Bound): number {
537
572
  return b.limit == null ? rest : Math.min(rest, b.limit);
538
573
  }
539
574
 
540
- // Order `&&` conjuncts so cheap scalar leaves run before consumer-op leaves.
541
- function orderByCost(parts: Where[]): Where[] {
542
- return [...parts].sort((a, b) => whereCost(a) - whereCost(b));
543
- }
544
-
545
- function whereCost(w: Where): number {
546
- switch (w.kind) {
547
- case "op": return 2;
548
- case "and": case "or": return Math.max(0, ...w.parts.map(whereCost));
549
- case "not": return whereCost(w.expr);
550
- case "scalar": return 0;
551
- }
552
- }
553
-
554
575
  function describeReceiver(e: Expr): string {
555
576
  if (e.kind === "ident") return e.name;
556
577
  if (e.kind === "member") return `${describeReceiver(e.recv)}.${e.name}`;
package/src/index.ts CHANGED
@@ -27,10 +27,16 @@ import type { DataContext } from "./context.ts";
27
27
  import { DefaultContext } from "./context.ts";
28
28
 
29
29
  export { OqxError } from "./errors.ts";
30
+
31
+ /** The OQX spec version (`spec/oqx/VERSION`, `major.minor`) this implementation
32
+ * conforms to — distinct from the package's own semver. */
33
+ export const LANGUAGE_VERSION = "0.12";
30
34
  export type { OqxResult, Engine } from "./engine.ts";
31
35
  export { InMemoryEngine, runQuery } from "./engine.ts";
32
- export type { DataContext, CallResult } from "./context.ts";
36
+ export type { DataContext, CallResult, DefaultContextOptions } from "./context.ts";
33
37
  export { DefaultContext } from "./context.ts";
38
+ export type { RegexDialect, RegexFlags } from "./regex.ts";
39
+ export { compileRegex } from "./regex.ts";
34
40
  export type { QueryPlanner, Plan } from "./planner.ts";
35
41
  export { PlannedEngine } from "./planner.ts";
36
42
  export { IndexedCollection } from "./adapters/indexed.ts";
package/src/lexer.ts CHANGED
@@ -108,9 +108,18 @@ function lexFragment(src: string, base: number, out: Token[]): void {
108
108
  push("range", "..", i); i += 2; continue;
109
109
  }
110
110
 
111
- // `.` is a dot only when not the leading part of a number (.5) — but OQX has
112
- // no leading-dot numerals, so a bare `.` is always navigation.
113
- if (c === "." && !isDigit(src[i + 1] ?? "")) { push("dot", c, i); i++; continue; }
111
+ // `.` followed by a digit is neither navigation (a property name cannot start
112
+ // with a digit) nor a number (OQX has no leading-dot numerals): it is a
113
+ // malformed number, reported as such rather than surfacing as a confusing
114
+ // parse error downstream. Any other `.` is member navigation.
115
+ if (c === ".") {
116
+ if (isDigit(src[i + 1] ?? "")) {
117
+ const end = scanNumberTail(src, i + 1, base);
118
+ const lit = src.slice(i, end);
119
+ throw new OqxError(`malformed number ${JSON.stringify(lit)} at ${base + i} — a number starts with a digit (write 0${lit}), and a property name cannot be a digit (there is no index access)`, "lex");
120
+ }
121
+ push("dot", c, i); i++; continue;
122
+ }
114
123
 
115
124
  // string literal — decode into its VALUE (quotes stripped, escapes resolved).
116
125
  if (c === '"' || c === "'") {
@@ -133,18 +142,14 @@ function lexFragment(src: string, base: number, out: Token[]): void {
133
142
  continue;
134
143
  }
135
144
 
136
- // number (integer or decimal, optional exponent)
137
- if (isDigit(c) || (c === "." && isDigit(src[i + 1] ?? ""))) {
145
+ // number: `digits [ "." digits ] [ ("e"|"E") ["+"|"-"] digits ]`. A `.` is a
146
+ // decimal point only when a digit follows: `1..5` is `1` `..` `5`. A `.`
147
+ // followed by anything else (`1.`, `1.x`) and an exponent marker without
148
+ // digits (`1e`, `1e+`) are malformed numbers — lex errors, never a silent
149
+ // NaN or a dangling dot.
150
+ if (isDigit(c)) {
138
151
  const start = i;
139
- while (i < n && isDigit(src[i]!)) i++;
140
- // A `.` is a decimal point only when a digit follows; otherwise it belongs
141
- // to a range operator (`1..5`) or navigation, so the number stops here.
142
- if (src[i] === "." && isDigit(src[i + 1] ?? "")) { i++; while (i < n && isDigit(src[i]!)) i++; }
143
- if (src[i] === "e" || src[i] === "E") {
144
- i++;
145
- if (src[i] === "+" || src[i] === "-") i++;
146
- while (i < n && isDigit(src[i]!)) i++;
147
- }
152
+ i = scanNumberTail(src, i, base);
148
153
  push("number", src.slice(start, i), start);
149
154
  continue;
150
155
  }
@@ -168,6 +173,31 @@ function lexFragment(src: string, base: number, out: Token[]): void {
168
173
  }
169
174
  }
170
175
 
176
+ // Scan a number whose first digit is at `i`; return the index just past it.
177
+ // Throws the malformed-number lex error for a trailing decimal point or an
178
+ // exponent without digits.
179
+ function scanNumberTail(src: string, i: number, base = 0): number {
180
+ const start = i;
181
+ const n = src.length;
182
+ const fail = (end: number, why: string): never => {
183
+ throw new OqxError(`malformed number ${JSON.stringify(src.slice(start, end))} at ${base + start} — ${why}`, "lex");
184
+ };
185
+ while (i < n && isDigit(src[i]!)) i++;
186
+ if (src[i] === "." && src[i + 1] !== ".") {
187
+ if (!isDigit(src[i + 1] ?? "")) fail(i + 1, "a decimal point needs a digit after it (write 1.0, not 1.)");
188
+ i++;
189
+ while (i < n && isDigit(src[i]!)) i++;
190
+ }
191
+ if (src[i] === "e" || src[i] === "E") {
192
+ let j = i + 1;
193
+ if (src[j] === "+" || src[j] === "-") j++;
194
+ if (!isDigit(src[j] ?? "")) fail(j, "an exponent needs at least one digit (write 1e5)");
195
+ i = j;
196
+ while (i < n && isDigit(src[i]!)) i++;
197
+ }
198
+ return i;
199
+ }
200
+
171
201
  function unescape(c: string | undefined): string {
172
202
  switch (c) {
173
203
  case "n": return "\n";