@nifrajs/core 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -9,7 +9,7 @@
9
9
  * read its own package.json at runtime. `scripts/version.ts` rewrites it on every release bump and
10
10
  * `check:publish` asserts it equals `@nifrajs/core`'s package version.
11
11
  */
12
- export declare const VERSION: "2.1.0";
12
+ export declare const VERSION: "2.2.0";
13
13
  export type Version = typeof VERSION;
14
14
  export * from "./server.js";
15
15
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -9,6 +9,6 @@
9
9
  * read its own package.json at runtime. `scripts/version.ts` rewrites it on every release bump and
10
10
  * `check:publish` asserts it equals `@nifrajs/core`'s package version.
11
11
  */
12
- export const VERSION = "2.1.0";
12
+ export const VERSION = "2.2.0";
13
13
  export * from "./server.js";
14
14
  //# sourceMappingURL=index.js.map
@@ -8,6 +8,19 @@ export type RoutePatternSegment = {
8
8
  } | {
9
9
  readonly kind: "wildcard";
10
10
  readonly name: string;
11
+ }
12
+ /** A segment that is part literal, part parameter: `:key.txt`, `feed.:format`, `v:major.:minor`. */
13
+ | {
14
+ readonly kind: "mixed";
15
+ readonly parts: readonly MixedPart[];
16
+ };
17
+ /** One piece of a {@link RoutePatternSegment} of kind `mixed`, in left-to-right order. */
18
+ export type MixedPart = {
19
+ readonly t: "lit";
20
+ readonly v: string;
21
+ } | {
22
+ readonly t: "param";
23
+ readonly name: string;
11
24
  };
12
25
  /**
13
26
  * Compiled route grammar shared by runtime routers, browser navigation, mocks, and adapters.
@@ -29,9 +42,21 @@ export type RoutePatternMatch = {
29
42
  readonly matched: false;
30
43
  readonly reason: "not-found" | "malformed";
31
44
  };
45
+ /** The regex source matching one segment's worth of a mixed pattern, with a capture per parameter. */
46
+ export declare function mixedSegmentSource(parts: readonly MixedPart[]): string;
32
47
  /** Parse and validate Nifra's strict route grammar once. Trailing slashes remain significant. */
33
48
  export declare function compileRoutePattern(pattern: string): CompiledRoutePattern;
34
- /** Core precedence: static > param > wildcard at the first differing segment, independent of order. */
49
+ /**
50
+ * Total ordering for mixed segment shapes, shared by the trie and regex-based routers.
51
+ *
52
+ * Code-unit comparison, never `localeCompare`: this exists so the server and the browser agree on which
53
+ * of two equally-weighted patterns wins, and `localeCompare` answers by the RUNTIME's locale - a server
54
+ * and a visitor in different locales would order the same pair differently, which is the divergence
55
+ * being prevented.
56
+ */
57
+ export declare function compareMixedPartsSpecificity(left: readonly MixedPart[], right: readonly MixedPart[]): number;
58
+ /** Core precedence: static > mixed > param > wildcard at the first differing segment, independent of
59
+ * registration order. */
35
60
  export declare function compareRoutePatternSpecificity(left: CompiledRoutePattern, right: CompiledRoutePattern): number;
36
61
  /** Decode router captures under one rule. Plain values take the zero-allocation path; malformed
37
62
  * escapes return `null`, allowing HTTP to emit 400 while client navigation declines the match. */
@@ -1 +1 @@
1
- {"version":3,"file":"pattern.d.ts","sourceRoot":"","sources":["../../src/router/pattern.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,sBAAsB,EAAE,OAAO,MAA+C,CAAA;AAEpF,MAAM,MAAM,mBAAmB,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAExD;;;;;;GAMG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,CAAC,sBAAsB,CAAC,EAAE,IAAI,CAAA;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAA;IACjD,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAA;CACvC;AAED,MAAM,MAAM,iBAAiB,GACzB;IAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GACnE;IAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAAA;CAAE,CAAA;AAoC3E,iGAAiG;AACjG,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,oBAAoB,CA4DzE;AAED,uGAAuG;AACvG,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,oBAAoB,EAC1B,KAAK,EAAE,oBAAoB,GAC1B,MAAM,CAWR;AAED;kGACkG;AAClG,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAa5F;AAED,sGAAsG;AACtG,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,oBAAoB,EAC9B,QAAQ,EAAE,MAAM,GACf,iBAAiB,CAWnB"}
1
+ {"version":3,"file":"pattern.d.ts","sourceRoot":"","sources":["../../src/router/pattern.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,sBAAsB,EAAE,OAAO,MAA+C,CAAA;AAEpF,MAAM,MAAM,mBAAmB,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AACtD,oGAAoG;GAClG;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAA;CAAE,CAAA;AAEpE,0FAA0F;AAC1F,MAAM,MAAM,SAAS,GACjB;IAAE,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAElD;;;;;;GAMG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,CAAC,sBAAsB,CAAC,EAAE,IAAI,CAAA;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAA;IACjD,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAA;CACvC;AAED,MAAM,MAAM,iBAAiB,GACzB;IAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GACnE;IAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAAA;CAAE,CAAA;AA4G3E,sGAAsG;AACtG,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,MAAM,CAUtE;AAED,iGAAiG;AACjG,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,oBAAoB,CA4FzE;AAWD;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,SAAS,SAAS,EAAE,EAC1B,KAAK,EAAE,SAAS,SAAS,EAAE,GAC1B,MAAM,CAoBR;AAED;yBACyB;AACzB,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,oBAAoB,EAC1B,KAAK,EAAE,oBAAoB,GAC1B,MAAM,CAeR;AAED;kGACkG;AAClG,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAa5F;AAED,sGAAsG;AACtG,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,oBAAoB,EAC9B,QAAQ,EAAE,MAAM,GACf,iBAAiB,CAWnB"}
@@ -18,7 +18,9 @@ function regexOf(compiled) {
18
18
  ? escapeRegex(segment.value)
19
19
  : segment.kind === "param"
20
20
  ? "([^/]+)"
21
- : "(.+)");
21
+ : segment.kind === "mixed"
22
+ ? mixedSegmentSource(segment.parts)
23
+ : "(.+)");
22
24
  regex = new RegExp(parts.length === 0 ? "^/$" : `^/${parts.join("/")}$`);
23
25
  REGEX_CACHE.set(compiled, regex);
24
26
  }
@@ -27,9 +29,93 @@ function regexOf(compiled) {
27
29
  function validParamName(name) {
28
30
  return PARAM_NAME.test(name) && !RESERVED_PARAM_NAMES.has(name);
29
31
  }
32
+ /**
33
+ * Explain WHY a parameter name was rejected, in the terms the author was thinking in.
34
+ *
35
+ * The grammar is per-segment: a segment is wholly static or wholly a parameter, so everything after
36
+ * the colon is the name. `/v/:id.json` therefore asks for a parameter literally named `id.json`,
37
+ * which is not what anyone means by it — but the bare "invalid parameter" that produces reads as a
38
+ * typo rather than as a rule, leaving the author to guess whether the dot, the length, or the casing
39
+ * was the problem. Naming the actual limitation and showing the two ways out is the difference
40
+ * between a five-second fix and a trip to the source.
41
+ */
42
+ function paramNameHint(name) {
43
+ if (RESERVED_PARAM_NAMES.has(name))
44
+ return ` — "${name}" is reserved (prototype key)`;
45
+ if (name.length === 0)
46
+ return ` — ":" needs a name after it`;
47
+ // No "a segment is wholly static or wholly a parameter" case here any more: mixed segments made
48
+ // that message obsolete. `:id.json` was the shape it explained, and `:id.json` now compiles.
49
+ return ` — a name must match ${PARAM_NAME.source}`;
50
+ }
30
51
  function escapeRegex(value) {
31
52
  return value.replace(/[.*+?^()|[\]\\{}$]/g, "\\$&");
32
53
  }
54
+ /**
55
+ * Split a segment containing `:` into literal and parameter parts.
56
+ *
57
+ * The param name is the LONGEST run matching {@link PARAM_NAME}'s body after each `:`; everything
58
+ * else in the segment is literal. So `:key.txt` is `[param key][lit ".txt"]`. Choosing a greedy scan
59
+ * on the existing sigil rather than a new `{key}.txt` syntax is a safety argument, not a taste one:
60
+ * every segment this newly accepts currently THROWS `INVALID_PARAM_NAME`, so no pattern that compiles
61
+ * today can change meaning.
62
+ *
63
+ * Returns `undefined` when the segment holds no parameter at all, so a literal colon
64
+ * (`/v1/things:batchGet` - legal in a URL path) stays a plain static segment.
65
+ */
66
+ function splitMixed(value) {
67
+ const parts = [];
68
+ let literal = "";
69
+ let sawParam = false;
70
+ for (let i = 0; i < value.length; i++) {
71
+ if (value[i] !== ":") {
72
+ literal += value[i];
73
+ continue;
74
+ }
75
+ const rest = value.slice(i + 1);
76
+ const name = /^[A-Za-z_][A-Za-z0-9_]*/.exec(rest)?.[0];
77
+ // A `:` not followed by a valid name start is literal text, not a malformed parameter.
78
+ if (name === undefined) {
79
+ literal += ":";
80
+ continue;
81
+ }
82
+ const paramEnd = i + 1 + name.length;
83
+ const previous = i > 0 ? value[i - 1] : undefined;
84
+ const precededByBoundary = previous === undefined || !/[A-Za-z0-9_]/.test(previous);
85
+ // Preserve established RPC-style literals such as `things:batchGet`. A colon embedded after an
86
+ // identifier and running to the end is literal; mixed params remain unambiguous at segment start,
87
+ // after punctuation (`post-:id`), or when followed by a literal suffix (`v:major.json`).
88
+ if (!precededByBoundary && paramEnd === value.length) {
89
+ literal += `:${name}`;
90
+ i += name.length;
91
+ continue;
92
+ }
93
+ if (literal !== "") {
94
+ parts.push({ t: "lit", v: literal });
95
+ literal = "";
96
+ }
97
+ parts.push({ t: "param", name });
98
+ sawParam = true;
99
+ i += name.length;
100
+ }
101
+ if (!sawParam)
102
+ return undefined;
103
+ if (literal !== "")
104
+ parts.push({ t: "lit", v: literal });
105
+ return parts;
106
+ }
107
+ /** The regex source matching one segment's worth of a mixed pattern, with a capture per parameter. */
108
+ export function mixedSegmentSource(parts) {
109
+ let source = "";
110
+ for (const part of parts) {
111
+ // LAZY (`+?`), not greedy. A greedy capture swallows the trailing literal, so `/:key.txt` against
112
+ // `/abc.txt` would capture `abc.txt` and then fail to match `\.txt`. With `^…$` anchoring, the
113
+ // lazy form still yields `abc.txt` for `/abc.txt.txt` - the anchor forces the LAST `.txt` to be
114
+ // the literal. `+?` and not `*?`: an empty capture must not match (see the empty-segment rule).
115
+ source += part.t === "lit" ? escapeRegex(part.v) : "([^/]+?)";
116
+ }
117
+ return source;
118
+ }
33
119
  /** Parse and validate Nifra's strict route grammar once. Trailing slashes remain significant. */
34
120
  export function compileRoutePattern(pattern) {
35
121
  if (pattern.length === 0 || pattern.charCodeAt(0) !== 47 /* / */) {
@@ -40,11 +126,18 @@ export function compileRoutePattern(pattern) {
40
126
  const paramNames = [];
41
127
  for (let i = 0; i < raw.length; i++) {
42
128
  const value = raw[i];
43
- if (value.charCodeAt(0) === 58 /* : */) {
44
- const name = value.slice(1);
45
- if (!validParamName(name)) {
46
- throw new RouteConfigError("INVALID_PARAM_NAME", `invalid parameter ":${name}" in "${pattern}"`);
129
+ // A leading `:` whose name run spans the WHOLE segment is a plain parameter - the untouched fast
130
+ // path. When it does not (`:key.txt`), the segment is mixed and is handled below; but a leading
131
+ // `:` that yields no usable name at all (`:9lives`, `:`) was clearly meant as a parameter, so it
132
+ // still fails here rather than being silently reinterpreted as literal text.
133
+ if (value.charCodeAt(0) === 58 /* : */ && !validParamName(value.slice(1))) {
134
+ if (splitMixed(value) === undefined) {
135
+ const name = value.slice(1);
136
+ throw new RouteConfigError("INVALID_PARAM_NAME", `invalid parameter ":${name}" in "${pattern}"${paramNameHint(name)}`);
47
137
  }
138
+ }
139
+ else if (value.charCodeAt(0) === 58 /* : */) {
140
+ const name = value.slice(1);
48
141
  if (paramNames.includes(name)) {
49
142
  throw new RouteConfigError("DUPLICATE_PARAM", `duplicate parameter ":${name}" in "${pattern}"`);
50
143
  }
@@ -67,6 +160,27 @@ export function compileRoutePattern(pattern) {
67
160
  segments.push(Object.freeze({ kind: "wildcard", name }));
68
161
  continue;
69
162
  }
163
+ // A segment holding a `:` anywhere other than the front is part literal, part parameter. Checked
164
+ // last so the wholly-static and wholly-param fast paths above are untouched.
165
+ const mixed = value.includes(":") ? splitMixed(value) : undefined;
166
+ if (mixed !== undefined) {
167
+ for (const part of mixed) {
168
+ if (part.t !== "param")
169
+ continue;
170
+ if (!validParamName(part.name)) {
171
+ throw new RouteConfigError("INVALID_PARAM_NAME", `invalid parameter ":${part.name}" in "${pattern}"${paramNameHint(part.name)}`);
172
+ }
173
+ // Duplicates must be rejected WITHIN a segment (`/:a.:a`) as well as across segments,
174
+ // or two captures would race for one params key.
175
+ if (paramNames.includes(part.name)) {
176
+ throw new RouteConfigError("DUPLICATE_PARAM", `duplicate parameter ":${part.name}" in "${pattern}"`);
177
+ }
178
+ // Pushed left-to-right so `paramNames` stays aligned with regex capture order.
179
+ paramNames.push(part.name);
180
+ }
181
+ segments.push(Object.freeze({ kind: "mixed", parts: Object.freeze(mixed) }));
182
+ continue;
183
+ }
70
184
  segments.push(Object.freeze({ kind: "static", value }));
71
185
  }
72
186
  const compiled = Object.freeze({
@@ -77,7 +191,44 @@ export function compileRoutePattern(pattern) {
77
191
  });
78
192
  return compiled;
79
193
  }
80
- /** Core precedence: static > param > wildcard at the first differing segment, independent of order. */
194
+ /** Weight for {@link compareRoutePatternSpecificity}. A mixed segment constrains more than a bare
195
+ * param (it pins literal text) and less than a fully static one, so it sits between them. */
196
+ const SPECIFICITY = {
197
+ static: 4,
198
+ mixed: 3,
199
+ param: 2,
200
+ wildcard: 1,
201
+ };
202
+ /**
203
+ * Total ordering for mixed segment shapes, shared by the trie and regex-based routers.
204
+ *
205
+ * Code-unit comparison, never `localeCompare`: this exists so the server and the browser agree on which
206
+ * of two equally-weighted patterns wins, and `localeCompare` answers by the RUNTIME's locale - a server
207
+ * and a visitor in different locales would order the same pair differently, which is the divergence
208
+ * being prevented.
209
+ */
210
+ export function compareMixedPartsSpecificity(left, right) {
211
+ const literalWeight = (parts) => parts.reduce((sum, part) => (part.t === "lit" ? sum + part.v.length : sum), 0);
212
+ const order = (a, b) => (a < b ? -1 : a > b ? 1 : 0);
213
+ const weightDifference = literalWeight(right) - literalWeight(left);
214
+ if (weightDifference !== 0)
215
+ return weightDifference;
216
+ const length = Math.max(left.length, right.length);
217
+ for (let i = 0; i < length; i++) {
218
+ const a = left[i];
219
+ const b = right[i];
220
+ if (a === undefined || b === undefined)
221
+ return b === undefined ? -1 : 1;
222
+ if (a.t !== b.t)
223
+ return a.t === "lit" ? -1 : 1;
224
+ if (a.t === "lit" && b.t === "lit" && a.v !== b.v) {
225
+ return a.v.length === b.v.length ? order(a.v, b.v) : b.v.length - a.v.length;
226
+ }
227
+ }
228
+ return order(mixedSegmentSource(left), mixedSegmentSource(right));
229
+ }
230
+ /** Core precedence: static > mixed > param > wildcard at the first differing segment, independent of
231
+ * registration order. */
81
232
  export function compareRoutePatternSpecificity(left, right) {
82
233
  const length = Math.max(left.segments.length, right.segments.length);
83
234
  for (let i = 0; i < length; i++) {
@@ -85,10 +236,15 @@ export function compareRoutePatternSpecificity(left, right) {
85
236
  const b = right.segments[i];
86
237
  if (a === undefined || b === undefined)
87
238
  return b === undefined ? -1 : 1;
88
- const aWeight = a.kind === "static" ? 3 : a.kind === "param" ? 2 : 1;
89
- const bWeight = b.kind === "static" ? 3 : b.kind === "param" ? 2 : 1;
239
+ const aWeight = SPECIFICITY[a.kind];
240
+ const bWeight = SPECIFICITY[b.kind];
90
241
  if (aWeight !== bWeight)
91
242
  return bWeight - aWeight;
243
+ if (a.kind === "mixed" && b.kind === "mixed") {
244
+ const mixed = compareMixedPartsSpecificity(a.parts, b.parts);
245
+ if (mixed !== 0)
246
+ return mixed;
247
+ }
92
248
  }
93
249
  return 0;
94
250
  }
@@ -1 +1 @@
1
- {"version":3,"file":"pattern.js","sourceRoot":"","sources":["../../src/router/pattern.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pattern.js","sourceRoot":"","sources":["../../src/router/pattern.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/router/router.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,oBAAoB,EAAuB,MAAM,cAAc,CAAA;AAE7E,uCAAuC;AACvC,eAAO,MAAM,OAAO,uEAAwE,CAAA;AAE5F,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,CAAC,CAAA;AAS7C,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAqB,CAAA;AAGrE;;;;GAIG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,IACrB;IAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GACtF;IAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;CAAE,GACvD;IAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAA;AAyKhG;;;;;;;;GAQG;AACH,qBAAa,MAAM,CAAC,CAAC;IACnB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAc;IACnC;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA0B;IACvD;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAU;;IAQ7C;;;;OAIG;IACH,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,oBAAoB,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI;IAkE7E;;;OAGG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC;IAelD,OAAO,CAAC,WAAW;IA8BnB,OAAO,CAAC,sBAAsB;CAwB/B"}
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/router/router.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,oBAAoB,EAK1B,MAAM,cAAc,CAAA;AAErB,uCAAuC;AACvC,eAAO,MAAM,OAAO,uEAAwE,CAAA;AAE5F,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,CAAC,CAAA;AAS7C,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAqB,CAAA;AAGrE;;;;GAIG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,IACrB;IAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GACtF;IAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;CAAE,GACvD;IAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAA;AA0NhG;;;;;;;;GAQG;AACH,qBAAa,MAAM,CAAC,CAAC;IACnB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAc;IACnC;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA0B;IACvD;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAU;;IAQ7C;;;;OAIG;IACH,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,oBAAoB,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI;IAqF7E;;;OAGG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC;IAelD,OAAO,CAAC,WAAW;IA8BnB,OAAO,CAAC,sBAAsB;CAwB/B"}
@@ -1,5 +1,5 @@
1
1
  import { RouteConfigError } from "../errors.js";
2
- import { compileRoutePattern } from "./pattern.js";
2
+ import { compareMixedPartsSpecificity, compileRoutePattern, mixedSegmentSource, } from "./pattern.js";
3
3
  /** HTTP methods the router accepts. */
4
4
  export const METHODS = ["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"];
5
5
  const METHOD_SET = new Set(METHODS);
@@ -26,6 +26,7 @@ function createNode() {
26
26
  return {
27
27
  staticChildren: new Map(),
28
28
  paramChild: undefined,
29
+ mixedChildren: undefined,
29
30
  wildcardChild: undefined,
30
31
  terminal: undefined,
31
32
  };
@@ -66,6 +67,33 @@ function matchNode(node, path, start, len, paramValues) {
66
67
  return found;
67
68
  }
68
69
  }
70
+ // Mixed sits between static and param: it pins literal text, so it is more specific than a bare
71
+ // `:param`, and less than an exact segment. Guarded on `undefined` so a mixed-free route table
72
+ // never enters this branch.
73
+ const mixedChildren = node.mixedChildren;
74
+ if (mixedChildren !== undefined && seg.length > 0) {
75
+ for (const child of mixedChildren) {
76
+ const matched = child.regex.exec(seg);
77
+ if (matched === null)
78
+ continue;
79
+ // Push left-to-right, matching the order `paramNames` was built in.
80
+ for (let i = 1; i <= child.arity; i++)
81
+ paramValues.push(matched[i]);
82
+ if (isLast) {
83
+ if (child.node.terminal !== undefined)
84
+ return child.node.terminal;
85
+ }
86
+ else {
87
+ const found = matchNode(child.node, path, end + 1, len, paramValues);
88
+ if (found !== undefined)
89
+ return found;
90
+ }
91
+ // Backtrack: a mixed segment pushed `arity` values, not one, so unwind exactly that many or
92
+ // every later param reads a value belonging to an abandoned branch.
93
+ for (let i = 0; i < child.arity; i++)
94
+ paramValues.pop();
95
+ }
96
+ }
69
97
  const paramChild = node.paramChild;
70
98
  // An empty segment (`/users//posts`) never matches a `:param` — matching would hand the handler
71
99
  // `id: ""` and downstream code a `WHERE id = ''` class of bug. Peers (Hono, Elysia, Next) 404
@@ -183,6 +211,26 @@ export class Router {
183
211
  node.wildcardChild ??= createNode();
184
212
  node = node.wildcardChild;
185
213
  }
214
+ else if (segment.kind === "mixed") {
215
+ const source = mixedSegmentSource(segment.parts);
216
+ node.mixedChildren ??= [];
217
+ let child = node.mixedChildren.find((entry) => entry.source === source);
218
+ if (child === undefined) {
219
+ child = {
220
+ regex: new RegExp(`^${source}$`),
221
+ arity: segment.parts.reduce((n, part) => (part.t === "param" ? n + 1 : n), 0),
222
+ parts: segment.parts,
223
+ node: createNode(),
224
+ source,
225
+ };
226
+ node.mixedChildren.push(child);
227
+ // Most literal text first. Registration order must not decide which of `/:id.txt` and
228
+ // `/:id.json` wins, and re-sorting on insert (a boot-time cost) keeps the match path a
229
+ // straight scan.
230
+ node.mixedChildren.sort((a, b) => compareMixedPartsSpecificity(a.parts, b.parts));
231
+ }
232
+ node = child.node;
233
+ }
186
234
  else {
187
235
  let child = node.staticChildren.get(segment.value);
188
236
  if (child === undefined) {
@@ -1 +1 @@
1
- {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/router/router.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/router/router.ts"],"names":[],"mappings":"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"}
@@ -13,7 +13,7 @@ export interface TransportCodec {
13
13
  decode(text: string): unknown;
14
14
  }
15
15
  export declare class TransportCodecError extends TypeError {
16
- constructor(message: string);
16
+ constructor(message: string, options?: ErrorOptions);
17
17
  }
18
18
  export declare const plainJsonCodec: TransportCodec;
19
19
  export interface TransportCodecRegistry {
@@ -1 +1 @@
1
- {"version":3,"file":"transport-codec.d.ts","sourceRoot":"","sources":["../src/transport-codec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAA;IAC9B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;CAC9B;AAED,qBAAa,mBAAoB,SAAQ,SAAS;gBACpC,OAAO,EAAE,MAAM;CAI5B;AAmBD,eAAO,MAAM,cAAc,EAAE,cAY3B,CAAA;AAEF,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAA;IACjC,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,cAAc,CAAA;IAC1D,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,cAAc,CAAA;IAChD,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc,CAAA;CACxD;AAUD,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,SAAS,cAAc,EAAE,EACjC,QAAQ,GAAE,cAA+B,GACxC,sBAAsB,CA0ExB;AAED,eAAO,MAAM,sBAAsB,EAAE,sBAEnC,CAAA;AAEF,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,OAAO,EACd,KAAK,GAAE,cAA+B,EACtC,IAAI,GAAE,YAAiB,GACtB,QAAQ,CAKV;AA2CD,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,QAAQ,EAClB,QAAQ,GAAE,sBAA+C,EACzD,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,OAAO,CAAC,CAIlB;AAQD,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,EACd,KAAK,GAAE,cAA+B,GACrC,MAAM,CAER;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EACb,QAAQ,GAAE,sBAA+C,EACzD,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAcT"}
1
+ {"version":3,"file":"transport-codec.d.ts","sourceRoot":"","sources":["../src/transport-codec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAA;IAC9B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;CAC9B;AAED,qBAAa,mBAAoB,SAAQ,SAAS;gBACpC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAIpD;AAsCD,eAAO,MAAM,cAAc,EAAE,cAY3B,CAAA;AAEF,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAA;IACjC,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,cAAc,CAAA;IAC1D,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,cAAc,CAAA;IAChD,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc,CAAA;CACxD;AAUD,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,SAAS,cAAc,EAAE,EACjC,QAAQ,GAAE,cAA+B,GACxC,sBAAsB,CA0ExB;AAED,eAAO,MAAM,sBAAsB,EAAE,sBAEnC,CAAA;AAEF,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,OAAO,EACd,KAAK,GAAE,cAA+B,EACtC,IAAI,GAAE,YAAiB,GACtB,QAAQ,CAKV;AA8CD,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,QAAQ,EAClB,QAAQ,GAAE,sBAA+C,EACzD,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,OAAO,CAAC,CAQlB;AAQD,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,EACd,KAAK,GAAE,cAA+B,GACrC,MAAM,CAER;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EACb,QAAQ,GAAE,sBAA+C,EACzD,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAsBT"}
@@ -5,11 +5,31 @@
5
5
  const DEFAULT_MAX_BYTES = 16 * 1024 * 1024;
6
6
  const TOKEN = /^[a-z][a-z0-9_.-]{0,63}$/;
7
7
  export class TransportCodecError extends TypeError {
8
- constructor(message) {
9
- super(message);
8
+ constructor(message, options) {
9
+ super(message, options);
10
10
  this.name = "TransportCodecError";
11
11
  }
12
12
  }
13
+ /**
14
+ * Run a decode step and normalize whatever it throws into {@link TransportCodecError}.
15
+ *
16
+ * Decoding is the one place this module touches attacker-controlled bytes, and the primitives it
17
+ * delegates to raise their own native types — `JSON.parse` throws `SyntaxError`, a BYO codec throws
18
+ * whatever it likes. Every other failure here is a `TransportCodecError`, so letting those escape
19
+ * would mean a malformed payload — the single most likely hostile input — is the one case that slips
20
+ * past a caller catching the documented error type. The original is kept as `cause`, so the parse
21
+ * failure stays diagnosable; a codec already speaking the contract is re-thrown untouched.
22
+ */
23
+ function decodeOrThrow(decode, message) {
24
+ try {
25
+ return decode();
26
+ }
27
+ catch (cause) {
28
+ if (cause instanceof TransportCodecError)
29
+ throw cause;
30
+ throw new TransportCodecError(message, { cause });
31
+ }
32
+ }
13
33
  function maxBytesOf(options) {
14
34
  const maxBytes = options.maxBytes ?? DEFAULT_MAX_BYTES;
15
35
  if (!Number.isSafeInteger(maxBytes) || maxBytes < 0)
@@ -164,19 +184,21 @@ async function readBoundedText(response, options) {
164
184
  bytes.set(chunk, offset);
165
185
  offset += chunk.byteLength;
166
186
  }
167
- return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
187
+ return decodeOrThrow(() => new TextDecoder("utf-8", { fatal: true }).decode(bytes), "transport payload is not valid UTF-8");
168
188
  }
169
189
  export async function decodeTransportResponse(response, registry = defaultTransportCodecs, options = {}) {
170
190
  const codec = registry.forContentType(response.headers.get("content-type"));
171
191
  const text = await readBoundedText(response, options);
172
- return text === "" ? undefined : codec.decode(text);
192
+ if (text === "")
193
+ return undefined;
194
+ return decodeOrThrow(() => codec.decode(text), `malformed transport body for codec ${codec.id}@${codec.version}`);
173
195
  }
174
196
  export function encodeTransportFrame(value, codec = plainJsonCodec) {
175
197
  return JSON.stringify({ codec: codec.id, version: codec.version, payload: codec.encode(value) });
176
198
  }
177
199
  export function decodeTransportFrame(frame, registry = defaultTransportCodecs, options = {}) {
178
200
  assertBounded(frame, options);
179
- const envelope = JSON.parse(frame);
201
+ const envelope = decodeOrThrow(() => JSON.parse(frame), "malformed transport frame");
180
202
  if (envelope === null ||
181
203
  typeof envelope !== "object" ||
182
204
  typeof envelope.codec !== "string" ||
@@ -184,7 +206,9 @@ export function decodeTransportFrame(frame, registry = defaultTransportCodecs, o
184
206
  typeof envelope.payload !== "string") {
185
207
  throw new TransportCodecError("malformed transport frame");
186
208
  }
187
- assertBounded(envelope.payload, options);
188
- return registry.byIdentity(envelope.codec, envelope.version).decode(envelope.payload);
209
+ const payload = envelope.payload;
210
+ assertBounded(payload, options);
211
+ const codec = registry.byIdentity(envelope.codec, envelope.version);
212
+ return decodeOrThrow(() => codec.decode(payload), `malformed transport frame payload for codec ${codec.id}@${codec.version}`);
189
213
  }
190
214
  //# sourceMappingURL=transport-codec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"transport-codec.js","sourceRoot":"","sources":["../src/transport-codec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transport-codec.js","sourceRoot":"","sources":["../src/transport-codec.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nifrajs/core",
3
- "version": "2.1.0",
3
+ "version": "2.2.0",
4
4
  "description": "Bun-native, contract-first HTTP framework — the router, server, and route descriptor.",
5
5
  "keywords": [
6
6
  "bun",
package/src/index.ts CHANGED
@@ -10,7 +10,7 @@
10
10
  * read its own package.json at runtime. `scripts/version.ts` rewrites it on every release bump and
11
11
  * `check:publish` asserts it equals `@nifrajs/core`'s package version.
12
12
  */
13
- export const VERSION = "2.1.0" as const
13
+ export const VERSION = "2.2.0" as const
14
14
 
15
15
  export type Version = typeof VERSION
16
16
 
@@ -8,6 +8,13 @@ export type RoutePatternSegment =
8
8
  | { readonly kind: "static"; readonly value: string }
9
9
  | { readonly kind: "param"; readonly name: string }
10
10
  | { readonly kind: "wildcard"; readonly name: string }
11
+ /** A segment that is part literal, part parameter: `:key.txt`, `feed.:format`, `v:major.:minor`. */
12
+ | { readonly kind: "mixed"; readonly parts: readonly MixedPart[] }
13
+
14
+ /** One piece of a {@link RoutePatternSegment} of kind `mixed`, in left-to-right order. */
15
+ export type MixedPart =
16
+ | { readonly t: "lit"; readonly v: string }
17
+ | { readonly t: "param"; readonly name: string }
11
18
 
12
19
  /**
13
20
  * Compiled route grammar shared by runtime routers, browser navigation, mocks, and adapters.
@@ -45,7 +52,9 @@ function regexOf(compiled: CompiledRoutePattern): RegExp {
45
52
  ? escapeRegex(segment.value)
46
53
  : segment.kind === "param"
47
54
  ? "([^/]+)"
48
- : "(.+)",
55
+ : segment.kind === "mixed"
56
+ ? mixedSegmentSource(segment.parts)
57
+ : "(.+)",
49
58
  )
50
59
  regex = new RegExp(parts.length === 0 ? "^/$" : `^/${parts.join("/")}$`)
51
60
  REGEX_CACHE.set(compiled, regex)
@@ -57,10 +66,93 @@ function validParamName(name: string): boolean {
57
66
  return PARAM_NAME.test(name) && !RESERVED_PARAM_NAMES.has(name)
58
67
  }
59
68
 
69
+ /**
70
+ * Explain WHY a parameter name was rejected, in the terms the author was thinking in.
71
+ *
72
+ * The grammar is per-segment: a segment is wholly static or wholly a parameter, so everything after
73
+ * the colon is the name. `/v/:id.json` therefore asks for a parameter literally named `id.json`,
74
+ * which is not what anyone means by it — but the bare "invalid parameter" that produces reads as a
75
+ * typo rather than as a rule, leaving the author to guess whether the dot, the length, or the casing
76
+ * was the problem. Naming the actual limitation and showing the two ways out is the difference
77
+ * between a five-second fix and a trip to the source.
78
+ */
79
+ function paramNameHint(name: string): string {
80
+ if (RESERVED_PARAM_NAMES.has(name)) return ` — "${name}" is reserved (prototype key)`
81
+ if (name.length === 0) return ` — ":" needs a name after it`
82
+ // No "a segment is wholly static or wholly a parameter" case here any more: mixed segments made
83
+ // that message obsolete. `:id.json` was the shape it explained, and `:id.json` now compiles.
84
+ return ` — a name must match ${PARAM_NAME.source}`
85
+ }
86
+
60
87
  function escapeRegex(value: string): string {
61
88
  return value.replace(/[.*+?^()|[\]\\{}$]/g, "\\$&")
62
89
  }
63
90
 
91
+ /**
92
+ * Split a segment containing `:` into literal and parameter parts.
93
+ *
94
+ * The param name is the LONGEST run matching {@link PARAM_NAME}'s body after each `:`; everything
95
+ * else in the segment is literal. So `:key.txt` is `[param key][lit ".txt"]`. Choosing a greedy scan
96
+ * on the existing sigil rather than a new `{key}.txt` syntax is a safety argument, not a taste one:
97
+ * every segment this newly accepts currently THROWS `INVALID_PARAM_NAME`, so no pattern that compiles
98
+ * today can change meaning.
99
+ *
100
+ * Returns `undefined` when the segment holds no parameter at all, so a literal colon
101
+ * (`/v1/things:batchGet` - legal in a URL path) stays a plain static segment.
102
+ */
103
+ function splitMixed(value: string): MixedPart[] | undefined {
104
+ const parts: MixedPart[] = []
105
+ let literal = ""
106
+ let sawParam = false
107
+ for (let i = 0; i < value.length; i++) {
108
+ if (value[i] !== ":") {
109
+ literal += value[i]
110
+ continue
111
+ }
112
+ const rest = value.slice(i + 1)
113
+ const name = /^[A-Za-z_][A-Za-z0-9_]*/.exec(rest)?.[0]
114
+ // A `:` not followed by a valid name start is literal text, not a malformed parameter.
115
+ if (name === undefined) {
116
+ literal += ":"
117
+ continue
118
+ }
119
+ const paramEnd = i + 1 + name.length
120
+ const previous = i > 0 ? value[i - 1] : undefined
121
+ const precededByBoundary = previous === undefined || !/[A-Za-z0-9_]/.test(previous)
122
+ // Preserve established RPC-style literals such as `things:batchGet`. A colon embedded after an
123
+ // identifier and running to the end is literal; mixed params remain unambiguous at segment start,
124
+ // after punctuation (`post-:id`), or when followed by a literal suffix (`v:major.json`).
125
+ if (!precededByBoundary && paramEnd === value.length) {
126
+ literal += `:${name}`
127
+ i += name.length
128
+ continue
129
+ }
130
+ if (literal !== "") {
131
+ parts.push({ t: "lit", v: literal })
132
+ literal = ""
133
+ }
134
+ parts.push({ t: "param", name })
135
+ sawParam = true
136
+ i += name.length
137
+ }
138
+ if (!sawParam) return undefined
139
+ if (literal !== "") parts.push({ t: "lit", v: literal })
140
+ return parts
141
+ }
142
+
143
+ /** The regex source matching one segment's worth of a mixed pattern, with a capture per parameter. */
144
+ export function mixedSegmentSource(parts: readonly MixedPart[]): string {
145
+ let source = ""
146
+ for (const part of parts) {
147
+ // LAZY (`+?`), not greedy. A greedy capture swallows the trailing literal, so `/:key.txt` against
148
+ // `/abc.txt` would capture `abc.txt` and then fail to match `\.txt`. With `^…$` anchoring, the
149
+ // lazy form still yields `abc.txt` for `/abc.txt.txt` - the anchor forces the LAST `.txt` to be
150
+ // the literal. `+?` and not `*?`: an empty capture must not match (see the empty-segment rule).
151
+ source += part.t === "lit" ? escapeRegex(part.v) : "([^/]+?)"
152
+ }
153
+ return source
154
+ }
155
+
64
156
  /** Parse and validate Nifra's strict route grammar once. Trailing slashes remain significant. */
65
157
  export function compileRoutePattern(pattern: string): CompiledRoutePattern {
66
158
  if (pattern.length === 0 || pattern.charCodeAt(0) !== 47 /* / */) {
@@ -71,14 +163,20 @@ export function compileRoutePattern(pattern: string): CompiledRoutePattern {
71
163
  const paramNames: string[] = []
72
164
  for (let i = 0; i < raw.length; i++) {
73
165
  const value = raw[i]!
74
- if (value.charCodeAt(0) === 58 /* : */) {
75
- const name = value.slice(1)
76
- if (!validParamName(name)) {
166
+ // A leading `:` whose name run spans the WHOLE segment is a plain parameter - the untouched fast
167
+ // path. When it does not (`:key.txt`), the segment is mixed and is handled below; but a leading
168
+ // `:` that yields no usable name at all (`:9lives`, `:`) was clearly meant as a parameter, so it
169
+ // still fails here rather than being silently reinterpreted as literal text.
170
+ if (value.charCodeAt(0) === 58 /* : */ && !validParamName(value.slice(1))) {
171
+ if (splitMixed(value) === undefined) {
172
+ const name = value.slice(1)
77
173
  throw new RouteConfigError(
78
174
  "INVALID_PARAM_NAME",
79
- `invalid parameter ":${name}" in "${pattern}"`,
175
+ `invalid parameter ":${name}" in "${pattern}"${paramNameHint(name)}`,
80
176
  )
81
177
  }
178
+ } else if (value.charCodeAt(0) === 58 /* : */) {
179
+ const name = value.slice(1)
82
180
  if (paramNames.includes(name)) {
83
181
  throw new RouteConfigError(
84
182
  "DUPLICATE_PARAM",
@@ -113,6 +211,32 @@ export function compileRoutePattern(pattern: string): CompiledRoutePattern {
113
211
  segments.push(Object.freeze({ kind: "wildcard", name }))
114
212
  continue
115
213
  }
214
+ // A segment holding a `:` anywhere other than the front is part literal, part parameter. Checked
215
+ // last so the wholly-static and wholly-param fast paths above are untouched.
216
+ const mixed = value.includes(":") ? splitMixed(value) : undefined
217
+ if (mixed !== undefined) {
218
+ for (const part of mixed) {
219
+ if (part.t !== "param") continue
220
+ if (!validParamName(part.name)) {
221
+ throw new RouteConfigError(
222
+ "INVALID_PARAM_NAME",
223
+ `invalid parameter ":${part.name}" in "${pattern}"${paramNameHint(part.name)}`,
224
+ )
225
+ }
226
+ // Duplicates must be rejected WITHIN a segment (`/:a.:a`) as well as across segments,
227
+ // or two captures would race for one params key.
228
+ if (paramNames.includes(part.name)) {
229
+ throw new RouteConfigError(
230
+ "DUPLICATE_PARAM",
231
+ `duplicate parameter ":${part.name}" in "${pattern}"`,
232
+ )
233
+ }
234
+ // Pushed left-to-right so `paramNames` stays aligned with regex capture order.
235
+ paramNames.push(part.name)
236
+ }
237
+ segments.push(Object.freeze({ kind: "mixed", parts: Object.freeze(mixed) }))
238
+ continue
239
+ }
116
240
  segments.push(Object.freeze({ kind: "static", value }))
117
241
  }
118
242
  const compiled = Object.freeze({
@@ -124,7 +248,50 @@ export function compileRoutePattern(pattern: string): CompiledRoutePattern {
124
248
  return compiled
125
249
  }
126
250
 
127
- /** Core precedence: static > param > wildcard at the first differing segment, independent of order. */
251
+ /** Weight for {@link compareRoutePatternSpecificity}. A mixed segment constrains more than a bare
252
+ * param (it pins literal text) and less than a fully static one, so it sits between them. */
253
+ const SPECIFICITY: Readonly<Record<RoutePatternSegment["kind"], number>> = {
254
+ static: 4,
255
+ mixed: 3,
256
+ param: 2,
257
+ wildcard: 1,
258
+ }
259
+
260
+ /**
261
+ * Total ordering for mixed segment shapes, shared by the trie and regex-based routers.
262
+ *
263
+ * Code-unit comparison, never `localeCompare`: this exists so the server and the browser agree on which
264
+ * of two equally-weighted patterns wins, and `localeCompare` answers by the RUNTIME's locale - a server
265
+ * and a visitor in different locales would order the same pair differently, which is the divergence
266
+ * being prevented.
267
+ */
268
+ export function compareMixedPartsSpecificity(
269
+ left: readonly MixedPart[],
270
+ right: readonly MixedPart[],
271
+ ): number {
272
+ const literalWeight = (parts: readonly MixedPart[]): number =>
273
+ parts.reduce((sum, part) => (part.t === "lit" ? sum + part.v.length : sum), 0)
274
+ const order = (a: string, b: string): number => (a < b ? -1 : a > b ? 1 : 0)
275
+
276
+ const weightDifference = literalWeight(right) - literalWeight(left)
277
+ if (weightDifference !== 0) return weightDifference
278
+
279
+ const length = Math.max(left.length, right.length)
280
+ for (let i = 0; i < length; i++) {
281
+ const a = left[i]
282
+ const b = right[i]
283
+ if (a === undefined || b === undefined) return b === undefined ? -1 : 1
284
+ if (a.t !== b.t) return a.t === "lit" ? -1 : 1
285
+ if (a.t === "lit" && b.t === "lit" && a.v !== b.v) {
286
+ return a.v.length === b.v.length ? order(a.v, b.v) : b.v.length - a.v.length
287
+ }
288
+ }
289
+
290
+ return order(mixedSegmentSource(left), mixedSegmentSource(right))
291
+ }
292
+
293
+ /** Core precedence: static > mixed > param > wildcard at the first differing segment, independent of
294
+ * registration order. */
128
295
  export function compareRoutePatternSpecificity(
129
296
  left: CompiledRoutePattern,
130
297
  right: CompiledRoutePattern,
@@ -134,9 +301,13 @@ export function compareRoutePatternSpecificity(
134
301
  const a = left.segments[i]
135
302
  const b = right.segments[i]
136
303
  if (a === undefined || b === undefined) return b === undefined ? -1 : 1
137
- const aWeight = a.kind === "static" ? 3 : a.kind === "param" ? 2 : 1
138
- const bWeight = b.kind === "static" ? 3 : b.kind === "param" ? 2 : 1
304
+ const aWeight = SPECIFICITY[a.kind]
305
+ const bWeight = SPECIFICITY[b.kind]
139
306
  if (aWeight !== bWeight) return bWeight - aWeight
307
+ if (a.kind === "mixed" && b.kind === "mixed") {
308
+ const mixed = compareMixedPartsSpecificity(a.parts, b.parts)
309
+ if (mixed !== 0) return mixed
310
+ }
140
311
  }
141
312
  return 0
142
313
  }
@@ -1,5 +1,11 @@
1
1
  import { RouteConfigError } from "../errors.ts"
2
- import { type CompiledRoutePattern, compileRoutePattern } from "./pattern.ts"
2
+ import {
3
+ type CompiledRoutePattern,
4
+ compareMixedPartsSpecificity,
5
+ compileRoutePattern,
6
+ type MixedPart,
7
+ mixedSegmentSource,
8
+ } from "./pattern.ts"
3
9
 
4
10
  /** HTTP methods the router accepts. */
5
11
  export const METHODS = ["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"] as const
@@ -68,16 +74,43 @@ interface RouteNode<T> {
68
74
  readonly staticChildren: Map<string, RouteNode<T>>
69
75
  /** Single `:param` child, if any. */
70
76
  paramChild: RouteNode<T> | undefined
77
+ /**
78
+ * Part-literal-part-param children (`:key.txt`), ordered by specificity.
79
+ *
80
+ * Unlike `paramChild` there can legitimately be SEVERAL at one level - `/:id.txt` and `/:id.json`
81
+ * are different shapes, not a conflict - so this is a list rather than a slot, and it must be tried
82
+ * in specificity order rather than registration order.
83
+ *
84
+ * Left `undefined` unless a mixed route is registered, so an app that never uses one pays nothing:
85
+ * no allocation, and one `undefined` check on the match path.
86
+ */
87
+ mixedChildren: MixedChild<T>[] | undefined
71
88
  /** Catch-all `*` child, if any — always terminal. */
72
89
  wildcardChild: RouteNode<T> | undefined
73
90
  /** Set once this node terminates one or more routes. */
74
91
  terminal: Terminal<T> | undefined
75
92
  }
76
93
 
94
+ interface MixedChild<T> {
95
+ /** Anchored matcher for ONE segment, with a capture group per parameter. */
96
+ readonly regex: RegExp
97
+ /**
98
+ * How many values this segment pushes. A mixed segment pushes N, not one, so a failed branch must
99
+ * pop exactly N to keep `paramValues` aligned with `paramNames`.
100
+ */
101
+ readonly arity: number
102
+ /** Parsed shape used by the same total specificity comparator as the browser router. */
103
+ readonly parts: readonly MixedPart[]
104
+ readonly node: RouteNode<T>
105
+ /** The pattern source, so re-registering the same shape reuses its node. */
106
+ readonly source: string
107
+ }
108
+
77
109
  function createNode<T>(): RouteNode<T> {
78
110
  return {
79
111
  staticChildren: new Map(),
80
112
  paramChild: undefined,
113
+ mixedChildren: undefined,
81
114
  wildcardChild: undefined,
82
115
  terminal: undefined,
83
116
  }
@@ -123,6 +156,28 @@ function matchNode<T>(
123
156
  }
124
157
  }
125
158
 
159
+ // Mixed sits between static and param: it pins literal text, so it is more specific than a bare
160
+ // `:param`, and less than an exact segment. Guarded on `undefined` so a mixed-free route table
161
+ // never enters this branch.
162
+ const mixedChildren = node.mixedChildren
163
+ if (mixedChildren !== undefined && seg.length > 0) {
164
+ for (const child of mixedChildren) {
165
+ const matched = child.regex.exec(seg)
166
+ if (matched === null) continue
167
+ // Push left-to-right, matching the order `paramNames` was built in.
168
+ for (let i = 1; i <= child.arity; i++) paramValues.push(matched[i] as string)
169
+ if (isLast) {
170
+ if (child.node.terminal !== undefined) return child.node.terminal
171
+ } else {
172
+ const found = matchNode(child.node, path, end + 1, len, paramValues)
173
+ if (found !== undefined) return found
174
+ }
175
+ // Backtrack: a mixed segment pushed `arity` values, not one, so unwind exactly that many or
176
+ // every later param reads a value belonging to an abandoned branch.
177
+ for (let i = 0; i < child.arity; i++) paramValues.pop()
178
+ }
179
+ }
180
+
126
181
  const paramChild = node.paramChild
127
182
  // An empty segment (`/users//posts`) never matches a `:param` — matching would hand the handler
128
183
  // `id: ""` and downstream code a `WHERE id = ''` class of bug. Peers (Hono, Elysia, Next) 404
@@ -250,6 +305,25 @@ export class Router<T> {
250
305
  } else if (segment.kind === "wildcard") {
251
306
  node.wildcardChild ??= createNode<T>()
252
307
  node = node.wildcardChild
308
+ } else if (segment.kind === "mixed") {
309
+ const source = mixedSegmentSource(segment.parts)
310
+ node.mixedChildren ??= []
311
+ let child = node.mixedChildren.find((entry) => entry.source === source)
312
+ if (child === undefined) {
313
+ child = {
314
+ regex: new RegExp(`^${source}$`),
315
+ arity: segment.parts.reduce((n, part) => (part.t === "param" ? n + 1 : n), 0),
316
+ parts: segment.parts,
317
+ node: createNode<T>(),
318
+ source,
319
+ }
320
+ node.mixedChildren.push(child)
321
+ // Most literal text first. Registration order must not decide which of `/:id.txt` and
322
+ // `/:id.json` wins, and re-sorting on insert (a boot-time cost) keeps the match path a
323
+ // straight scan.
324
+ node.mixedChildren.sort((a, b) => compareMixedPartsSpecificity(a.parts, b.parts))
325
+ }
326
+ node = child.node
253
327
  } else {
254
328
  let child = node.staticChildren.get(segment.value)
255
329
  if (child === undefined) {
@@ -19,12 +19,31 @@ export interface TransportCodec {
19
19
  }
20
20
 
21
21
  export class TransportCodecError extends TypeError {
22
- constructor(message: string) {
23
- super(message)
22
+ constructor(message: string, options?: ErrorOptions) {
23
+ super(message, options)
24
24
  this.name = "TransportCodecError"
25
25
  }
26
26
  }
27
27
 
28
+ /**
29
+ * Run a decode step and normalize whatever it throws into {@link TransportCodecError}.
30
+ *
31
+ * Decoding is the one place this module touches attacker-controlled bytes, and the primitives it
32
+ * delegates to raise their own native types — `JSON.parse` throws `SyntaxError`, a BYO codec throws
33
+ * whatever it likes. Every other failure here is a `TransportCodecError`, so letting those escape
34
+ * would mean a malformed payload — the single most likely hostile input — is the one case that slips
35
+ * past a caller catching the documented error type. The original is kept as `cause`, so the parse
36
+ * failure stays diagnosable; a codec already speaking the contract is re-thrown untouched.
37
+ */
38
+ function decodeOrThrow<T>(decode: () => T, message: string): T {
39
+ try {
40
+ return decode()
41
+ } catch (cause) {
42
+ if (cause instanceof TransportCodecError) throw cause
43
+ throw new TransportCodecError(message, { cause })
44
+ }
45
+ }
46
+
28
47
  function maxBytesOf(options: TransportDecodeOptions): number {
29
48
  const maxBytes = options.maxBytes ?? DEFAULT_MAX_BYTES
30
49
  if (!Number.isSafeInteger(maxBytes) || maxBytes < 0)
@@ -203,7 +222,10 @@ async function readBoundedText(
203
222
  bytes.set(chunk, offset)
204
223
  offset += chunk.byteLength
205
224
  }
206
- return new TextDecoder("utf-8", { fatal: true }).decode(bytes)
225
+ return decodeOrThrow(
226
+ () => new TextDecoder("utf-8", { fatal: true }).decode(bytes),
227
+ "transport payload is not valid UTF-8",
228
+ )
207
229
  }
208
230
 
209
231
  export async function decodeTransportResponse(
@@ -213,7 +235,11 @@ export async function decodeTransportResponse(
213
235
  ): Promise<unknown> {
214
236
  const codec = registry.forContentType(response.headers.get("content-type"))
215
237
  const text = await readBoundedText(response, options)
216
- return text === "" ? undefined : codec.decode(text)
238
+ if (text === "") return undefined
239
+ return decodeOrThrow(
240
+ () => codec.decode(text),
241
+ `malformed transport body for codec ${codec.id}@${codec.version}`,
242
+ )
217
243
  }
218
244
 
219
245
  interface TransportFrame {
@@ -235,7 +261,10 @@ export function decodeTransportFrame(
235
261
  options: TransportDecodeOptions = {},
236
262
  ): unknown {
237
263
  assertBounded(frame, options)
238
- const envelope = JSON.parse(frame) as Partial<TransportFrame>
264
+ const envelope = decodeOrThrow(
265
+ () => JSON.parse(frame),
266
+ "malformed transport frame",
267
+ ) as Partial<TransportFrame>
239
268
  if (
240
269
  envelope === null ||
241
270
  typeof envelope !== "object" ||
@@ -245,6 +274,11 @@ export function decodeTransportFrame(
245
274
  ) {
246
275
  throw new TransportCodecError("malformed transport frame")
247
276
  }
248
- assertBounded(envelope.payload, options)
249
- return registry.byIdentity(envelope.codec, envelope.version as number).decode(envelope.payload)
277
+ const payload = envelope.payload
278
+ assertBounded(payload, options)
279
+ const codec = registry.byIdentity(envelope.codec, envelope.version as number)
280
+ return decodeOrThrow(
281
+ () => codec.decode(payload),
282
+ `malformed transport frame payload for codec ${codec.id}@${codec.version}`,
283
+ )
250
284
  }