@barqel/barq 0.0.0-stage → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +89 -2
  3. package/dist/app.d.ts +159 -0
  4. package/dist/app.d.ts.map +1 -0
  5. package/dist/app.js +1370 -0
  6. package/dist/app.js.map +1 -0
  7. package/dist/context.d.ts +55 -0
  8. package/dist/context.d.ts.map +1 -0
  9. package/dist/context.js +261 -0
  10. package/dist/context.js.map +1 -0
  11. package/dist/cookies.d.ts +5 -0
  12. package/dist/cookies.d.ts.map +1 -0
  13. package/dist/cookies.js +234 -0
  14. package/dist/cookies.js.map +1 -0
  15. package/dist/cors.d.ts +11 -0
  16. package/dist/cors.d.ts.map +1 -0
  17. package/dist/cors.js +82 -0
  18. package/dist/cors.js.map +1 -0
  19. package/dist/errors.d.ts +10 -0
  20. package/dist/errors.d.ts.map +1 -0
  21. package/dist/errors.js +81 -0
  22. package/dist/errors.js.map +1 -0
  23. package/dist/http.d.ts +7 -0
  24. package/dist/http.d.ts.map +1 -0
  25. package/dist/http.js +127 -0
  26. package/dist/http.js.map +1 -0
  27. package/dist/index.d.ts +16 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +10 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/internal/ip.d.ts +6 -0
  32. package/dist/internal/ip.d.ts.map +1 -0
  33. package/dist/internal/ip.js +151 -0
  34. package/dist/internal/ip.js.map +1 -0
  35. package/dist/internal/pathname.d.ts +9 -0
  36. package/dist/internal/pathname.d.ts.map +1 -0
  37. package/dist/internal/pathname.js +158 -0
  38. package/dist/internal/pathname.js.map +1 -0
  39. package/dist/internal/query.d.ts +5 -0
  40. package/dist/internal/query.d.ts.map +1 -0
  41. package/dist/internal/query.js +126 -0
  42. package/dist/internal/query.js.map +1 -0
  43. package/dist/internal/scan.d.ts +33 -0
  44. package/dist/internal/scan.d.ts.map +1 -0
  45. package/dist/internal/scan.js +1069 -0
  46. package/dist/internal/scan.js.map +1 -0
  47. package/dist/internal/shutdown.d.ts +7 -0
  48. package/dist/internal/shutdown.d.ts.map +1 -0
  49. package/dist/internal/shutdown.js +30 -0
  50. package/dist/internal/shutdown.js.map +1 -0
  51. package/dist/internal/trie.d.ts +43 -0
  52. package/dist/internal/trie.d.ts.map +1 -0
  53. package/dist/internal/trie.js +560 -0
  54. package/dist/internal/trie.js.map +1 -0
  55. package/dist/middleware.d.ts +13 -0
  56. package/dist/middleware.d.ts.map +1 -0
  57. package/dist/middleware.js +269 -0
  58. package/dist/middleware.js.map +1 -0
  59. package/dist/types.d.ts +59 -0
  60. package/dist/types.d.ts.map +1 -0
  61. package/dist/types.js +2 -0
  62. package/dist/types.js.map +1 -0
  63. package/dist/validation.d.ts +27 -0
  64. package/dist/validation.d.ts.map +1 -0
  65. package/dist/validation.js +32 -0
  66. package/dist/validation.js.map +1 -0
  67. package/package.json +58 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ip.d.ts","sourceRoot":"","sources":["../../src/internal/ip.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,SAAS,GAAG,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;AAQhD,wBAAgB,iBAAiB,CAC/B,KAAK,EACD,OAAO,GACP,MAAM,GACN,SAAS,MAAM,EAAE,GACjB,CAAC,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,GACzB,SAAS,GACZ,SAAS,CA2CX;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAYhD;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CA4BjE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEvD"}
@@ -0,0 +1,151 @@
1
+ import { isIP } from "node:net";
2
+ function ipv4ToNumber(bytes) {
3
+ return (((bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3]) >>> 0);
4
+ }
5
+ export function compileTrustProxy(trust) {
6
+ if (!trust)
7
+ return () => false;
8
+ if (trust === true)
9
+ return () => true;
10
+ if (typeof trust === "function")
11
+ return trust;
12
+ const ranges = typeof trust === "string" ? [trust] : trust;
13
+ if (ranges.length === 0)
14
+ return () => false;
15
+ const matchers = [];
16
+ for (const range of ranges) {
17
+ if (range === "loopback") {
18
+ matchers.push((ip) => {
19
+ const addr = parseIpAddress(ip);
20
+ if (addr === null)
21
+ return false;
22
+ if (addr.length === 4)
23
+ return addr[0] === 127;
24
+ return addr.slice(0, 15).every((b) => b === 0) && addr[15] === 1;
25
+ });
26
+ continue;
27
+ }
28
+ const slash = range.indexOf("/");
29
+ const netText = slash === -1 ? range : range.slice(0, slash);
30
+ const netBytes = parseIpAddress(netText);
31
+ if (!netBytes)
32
+ continue;
33
+ const bits = slash === -1 ? netBytes.length * 8 : Number(range.slice(slash + 1));
34
+ if (netBytes.length === 4) {
35
+ const netNum = ipv4ToNumber(netBytes);
36
+ const mask = bits === 0 ? 0 : (~0 << (32 - bits)) >>> 0;
37
+ const expected = (netNum & mask) >>> 0;
38
+ matchers.push((ip) => {
39
+ const addr = parseIpAddress(ip);
40
+ if (addr?.length !== 4)
41
+ return false;
42
+ return (ipv4ToNumber(addr) & mask) >>> 0 === expected;
43
+ });
44
+ }
45
+ else {
46
+ matchers.push((ip) => ipMatchesRange(ip, range));
47
+ }
48
+ }
49
+ return (ip) => matchers.some((m) => m(ip));
50
+ }
51
+ export function isIpRange(value) {
52
+ if (value === "loopback")
53
+ return true;
54
+ const slash = value.indexOf("/");
55
+ if (slash !== value.lastIndexOf("/"))
56
+ return false;
57
+ const address = slash === -1 ? value : value.slice(0, slash);
58
+ const bytes = parseIpAddress(address);
59
+ if (bytes === null)
60
+ return false;
61
+ if (slash === -1)
62
+ return true;
63
+ const bitsText = value.slice(slash + 1);
64
+ if (!/^\d+$/.test(bitsText))
65
+ return false;
66
+ const bits = Number(bitsText);
67
+ return Number.isInteger(bits) && bits >= 0 && bits <= bytes.length * 8;
68
+ }
69
+ export function ipMatchesRange(ip, range) {
70
+ const address = parseIpAddress(ip);
71
+ if (address === null)
72
+ return false;
73
+ if (range === "loopback") {
74
+ if (address.length === 4)
75
+ return address[0] === 127;
76
+ return (address.slice(0, 15).every((byte) => byte === 0) && address[15] === 1);
77
+ }
78
+ const slash = range.indexOf("/");
79
+ const networkText = slash === -1 ? range : range.slice(0, slash);
80
+ const network = parseIpAddress(networkText);
81
+ if (network === null || address.length !== network.length)
82
+ return false;
83
+ const bits = slash === -1 ? network.length * 8 : Number(range.slice(slash + 1));
84
+ if (!Number.isInteger(bits) || bits < 0 || bits > network.length * 8) {
85
+ return false;
86
+ }
87
+ const fullBytes = Math.floor(bits / 8);
88
+ for (let i = 0; i < fullBytes; i++) {
89
+ if (address[i] !== network[i])
90
+ return false;
91
+ }
92
+ const remainingBits = bits % 8;
93
+ if (remainingBits === 0)
94
+ return true;
95
+ const mask = (0xff << (8 - remainingBits)) & 0xff;
96
+ return (address[fullBytes] & mask) === (network[fullBytes] & mask);
97
+ }
98
+ export function isValidIpAddress(value) {
99
+ return parseIpAddress(value) !== null;
100
+ }
101
+ function parseIpAddress(value) {
102
+ const version = isIP(value);
103
+ if (version === 4) {
104
+ const bytes = value.split(".").map(Number);
105
+ if (bytes.length !== 4)
106
+ return null;
107
+ return Uint8Array.from(bytes);
108
+ }
109
+ if (version !== 6)
110
+ return null;
111
+ let address = value.toLowerCase();
112
+ if (address.includes(".")) {
113
+ const separator = address.lastIndexOf(":");
114
+ const ipv4 = address
115
+ .slice(separator + 1)
116
+ .split(".")
117
+ .map(Number);
118
+ if (separator === -1 || ipv4.length !== 4)
119
+ return null;
120
+ const high = ((ipv4[0] << 8) | ipv4[1]).toString(16);
121
+ const low = ((ipv4[2] << 8) | ipv4[3]).toString(16);
122
+ address = `${address.slice(0, separator + 1)}${high}:${low}`;
123
+ }
124
+ const halves = address.split("::");
125
+ if (halves.length > 2)
126
+ return null;
127
+ const left = halves[0] ? halves[0].split(":") : [];
128
+ const right = halves.length === 2 && halves[1] ? halves[1].split(":") : [];
129
+ const missing = 8 - left.length - right.length;
130
+ if ((halves.length === 1 && missing !== 0) ||
131
+ (halves.length === 2 && missing < 1)) {
132
+ return null;
133
+ }
134
+ const groups = [
135
+ ...left,
136
+ ...new Array(halves.length === 2 ? missing : 0).fill("0"),
137
+ ...right,
138
+ ];
139
+ if (groups.length !== 8 ||
140
+ groups.some((group) => !/^[0-9a-f]{1,4}$/.test(group))) {
141
+ return null;
142
+ }
143
+ const bytes = new Uint8Array(16);
144
+ for (let i = 0; i < groups.length; i++) {
145
+ const group = Number.parseInt(groups[i], 16);
146
+ bytes[i * 2] = group >>> 8;
147
+ bytes[i * 2 + 1] = group & 0xff;
148
+ }
149
+ return bytes;
150
+ }
151
+ //# sourceMappingURL=ip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ip.js","sourceRoot":"","sources":["../../src/internal/ip.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface ParsedTarget {
2
+ pathname: string;
3
+ query: string | undefined;
4
+ }
5
+ export declare function hasEncodedSlash(path: string): boolean;
6
+ export declare function normalizeDotSegments(path: string): string;
7
+ export declare function scanPathname(url: string): string;
8
+ export declare function parseRequestTarget(url: string): ParsedTarget;
9
+ //# sourceMappingURL=pathname.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pathname.d.ts","sourceRoot":"","sources":["../../src/internal/pathname.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AAoDD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAErD;AAoBD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA2BzD;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAoBhD;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAuC5D"}
@@ -0,0 +1,158 @@
1
+ function decodeSegment(seg) {
2
+ if (seg.indexOf("%") === -1)
3
+ return seg;
4
+ try {
5
+ return decodeURIComponent(seg);
6
+ }
7
+ catch {
8
+ return seg;
9
+ }
10
+ }
11
+ function decodePercentSegment(seg) {
12
+ try {
13
+ return decodeURIComponent(seg);
14
+ }
15
+ catch {
16
+ return seg;
17
+ }
18
+ }
19
+ function isDotSegment(seg) {
20
+ return seg === "." || seg === "..";
21
+ }
22
+ function hasDotSegment(path) {
23
+ let i = 0;
24
+ const len = path.length;
25
+ while (i < len) {
26
+ while (i < len && path.charCodeAt(i) === 47)
27
+ i++;
28
+ if (i >= len)
29
+ break;
30
+ const endIdx = path.indexOf("/", i);
31
+ const segEnd = endIdx === -1 ? len : endIdx;
32
+ const segmentLength = segEnd - i;
33
+ if ((segmentLength === 1 && path.charCodeAt(i) === 46) ||
34
+ (segmentLength === 2 &&
35
+ path.charCodeAt(i) === 46 &&
36
+ path.charCodeAt(i + 1) === 46)) {
37
+ return true;
38
+ }
39
+ const percent = path.indexOf("%", i);
40
+ if (percent !== -1 && percent < segEnd) {
41
+ const decoded = decodePercentSegment(path.slice(i, segEnd));
42
+ if (isDotSegment(decoded))
43
+ return true;
44
+ }
45
+ if (endIdx === -1)
46
+ break;
47
+ i = endIdx + 1;
48
+ }
49
+ return false;
50
+ }
51
+ export function hasEncodedSlash(path) {
52
+ return path.includes("%2f") || path.includes("%2F");
53
+ }
54
+ function targetStart(url) {
55
+ if (url.charCodeAt(0) === 47)
56
+ return 0;
57
+ if (url.charCodeAt(4) === 58 &&
58
+ url.charCodeAt(5) === 47 &&
59
+ url.charCodeAt(6) === 47)
60
+ return 7;
61
+ if (url.charCodeAt(5) === 58 &&
62
+ url.charCodeAt(6) === 47 &&
63
+ url.charCodeAt(7) === 47)
64
+ return 8;
65
+ const scheme = url.indexOf("://");
66
+ return scheme === -1 ? 0 : scheme + 3;
67
+ }
68
+ export function normalizeDotSegments(path) {
69
+ const len = path.length;
70
+ const segments = [];
71
+ let start = 0;
72
+ while (start < len) {
73
+ while (start < len && path.charCodeAt(start) === 47)
74
+ start++;
75
+ if (start >= len)
76
+ break;
77
+ const end = path.indexOf("/", start);
78
+ const segEnd = end === -1 ? len : end;
79
+ const rawSeg = path.slice(start, segEnd);
80
+ const decodedSeg = decodeSegment(rawSeg);
81
+ if (decodedSeg === ".") {
82
+ }
83
+ else if (decodedSeg === "..") {
84
+ segments.pop();
85
+ }
86
+ else {
87
+ segments.push(rawSeg);
88
+ }
89
+ if (end === -1)
90
+ break;
91
+ start = end + 1;
92
+ }
93
+ const res = `/${segments.join("/")}`;
94
+ const endsWithSlash = path.endsWith("/") || path.endsWith("/.") || path.endsWith("/..");
95
+ return path.length > 1 && endsWithSlash && res !== "/" ? `${res}/` : res;
96
+ }
97
+ export function scanPathname(url) {
98
+ const s = targetStart(url);
99
+ const slash = url.indexOf("/", s);
100
+ if (slash === -1)
101
+ return "/";
102
+ let end = url.indexOf("?", slash);
103
+ if (end === -1) {
104
+ end = url.indexOf("#", slash);
105
+ if (end === -1)
106
+ end = url.length;
107
+ }
108
+ else {
109
+ const hash = url.indexOf("#", slash);
110
+ if (hash !== -1 && hash < end)
111
+ end = hash;
112
+ }
113
+ const raw = url.slice(slash, end);
114
+ if (raw.indexOf(".") === -1 && raw.indexOf("%") === -1)
115
+ return raw;
116
+ if (hasEncodedSlash(raw)) {
117
+ return raw;
118
+ }
119
+ return hasDotSegment(raw) ? normalizeDotSegments(raw) : raw;
120
+ }
121
+ export function parseRequestTarget(url) {
122
+ const s = targetStart(url);
123
+ const slash = url.indexOf("/", s);
124
+ let pathname;
125
+ let query;
126
+ if (slash === -1) {
127
+ pathname = "/";
128
+ const q = url.indexOf("?", s);
129
+ const h = url.indexOf("#", s);
130
+ if (q !== -1 && (h === -1 || q < h)) {
131
+ query = h === -1 ? url.slice(q + 1) : url.slice(q + 1, h);
132
+ }
133
+ }
134
+ else {
135
+ let end = url.indexOf("?", slash);
136
+ const hash = url.indexOf("#", slash);
137
+ if (hash !== -1 && (end === -1 || hash < end))
138
+ end = hash;
139
+ if (end === -1) {
140
+ end = url.length;
141
+ }
142
+ else if (url.charCodeAt(end) === 63) {
143
+ query =
144
+ hash !== -1 && hash > end
145
+ ? url.slice(end + 1, hash)
146
+ : url.slice(end + 1);
147
+ }
148
+ const raw = url.slice(slash, end);
149
+ if (hasEncodedSlash(raw)) {
150
+ pathname = raw;
151
+ }
152
+ else {
153
+ pathname = hasDotSegment(raw) ? normalizeDotSegments(raw) : raw;
154
+ }
155
+ }
156
+ return { pathname, query };
157
+ }
158
+ //# sourceMappingURL=pathname.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pathname.js","sourceRoot":"","sources":["../../src/internal/pathname.ts"],"names":[],"mappings":"AAKA,SAAS,aAAa,CAAC,GAAW;IAChC,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,GAAG,CAAC;IACxC,IAAI,CAAC;QACH,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,GAAW;IACvC,IAAI,CAAC;QACH,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,IAAI,CAAC;AACrC,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;IACxB,OAAO,CAAC,GAAG,GAAG,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE;YAAE,CAAC,EAAE,CAAC;QACjD,IAAI,CAAC,IAAI,GAAG;YAAE,MAAM;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;QAC5C,MAAM,aAAa,GAAG,MAAM,GAAG,CAAC,CAAC;QACjC,IACE,CAAC,aAAa,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;YAClD,CAAC,aAAa,KAAK,CAAC;gBAClB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE;gBACzB,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAChC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrC,IAAI,OAAO,KAAK,CAAC,CAAC,IAAI,OAAO,GAAG,MAAM,EAAE,CAAC;YACvC,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;YAC5D,IAAI,YAAY,CAAC,OAAO,CAAC;gBAAE,OAAO,IAAI,CAAC;QACzC,CAAC;QACD,IAAI,MAAM,KAAK,CAAC,CAAC;YAAE,MAAM;QACzB,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE;QAAE,OAAO,CAAC,CAAC;IACvC,IACE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE;QACxB,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE;QACxB,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE;QAExB,OAAO,CAAC,CAAC;IACX,IACE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE;QACxB,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE;QACxB,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE;QAExB,OAAO,CAAC,CAAC;IACX,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAClC,OAAO,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;IACxB,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,OAAO,KAAK,GAAG,GAAG,EAAE,CAAC;QACnB,OAAO,KAAK,GAAG,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE;YAAE,KAAK,EAAE,CAAC;QAC7D,IAAI,KAAK,IAAI,GAAG;YAAE,MAAM;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACzC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QAEzC,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;QACzB,CAAC;aAAM,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YAC/B,QAAQ,CAAC,GAAG,EAAE,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC;QACD,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,MAAM;QACtB,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACrC,MAAM,aAAa,GACjB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpE,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,aAAa,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC3B,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAClC,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,GAAG,CAAC;IAC7B,IAAI,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAClC,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;QACf,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC9B,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACrC,IAAI,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,GAAG,GAAG;YAAE,GAAG,GAAG,IAAI,CAAC;IAC5C,CAAC;IACD,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAClC,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,GAAG,CAAC;IAEnE,IAAI,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,GAAG,CAAC;IACb,CAAC;IAED,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC3B,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAElC,IAAI,QAAgB,CAAC;IACrB,IAAI,KAAyB,CAAC;IAE9B,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACjB,QAAQ,GAAG,GAAG,CAAC;QACf,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACpC,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAClC,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAErC,IAAI,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,IAAI,GAAG,GAAG,CAAC;YAAE,GAAG,GAAG,IAAI,CAAC;QAE1D,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;YACf,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC;QACnB,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC;YACtC,KAAK;gBACH,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,GAAG,GAAG;oBACvB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC;oBAC1B,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAC3B,CAAC;QAED,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAElC,IAAI,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,QAAQ,GAAG,GAAG,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAClE,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function findQueryParam(url: string, name: string, startPos?: number): string | null;
2
+ export declare function findQueryParamAll(url: string, name: string): string[];
3
+ export declare function parseAllQueryParams(url: string): Record<string, string>;
4
+ export declare function parseFastQuery(url: string, startPos: number): Record<string, string>;
5
+ //# sourceMappingURL=query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/internal/query.ts"],"names":[],"mappings":"AAaA,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,GAAG,IAAI,CAkCf;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CA2BrE;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAiBvE;AAED,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,GACf,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAkBxB"}
@@ -0,0 +1,126 @@
1
+ function decodeQueryComponent(value) {
2
+ const hasPlus = value.indexOf("+") !== -1;
3
+ const hasPercent = value.indexOf("%") !== -1;
4
+ if (!hasPlus && !hasPercent)
5
+ return value;
6
+ const formValue = hasPlus ? value.replace(/\+/g, " ") : value;
7
+ if (!hasPercent)
8
+ return formValue;
9
+ try {
10
+ return decodeURIComponent(formValue);
11
+ }
12
+ catch {
13
+ return new URLSearchParams(`v=${value}`).get("v") ?? "";
14
+ }
15
+ }
16
+ export function findQueryParam(url, name, startPos) {
17
+ const queryStart = startPos !== undefined && startPos >= 0 ? startPos : url.indexOf("?");
18
+ if (queryStart === -1)
19
+ return null;
20
+ let s = queryStart + 1;
21
+ const len = url.length;
22
+ const nameLen = name.length;
23
+ while (s < len) {
24
+ if (url.startsWith(name, s)) {
25
+ const eqPos = s + nameLen;
26
+ const nextChar = url.charCodeAt(eqPos);
27
+ if (nextChar === 61) {
28
+ // '='
29
+ const valStart = eqPos + 1;
30
+ let amp = url.indexOf("&", valStart);
31
+ if (amp === -1)
32
+ amp = len;
33
+ const val = url.slice(valStart, amp);
34
+ if (val.indexOf("+") === -1 && val.indexOf("%") === -1) {
35
+ return val;
36
+ }
37
+ return decodeQueryComponent(val);
38
+ }
39
+ if (nextChar === 38 || eqPos === len) {
40
+ return "";
41
+ }
42
+ }
43
+ const amp = url.indexOf("&", s);
44
+ if (amp === -1)
45
+ break;
46
+ s = amp + 1;
47
+ }
48
+ return null;
49
+ }
50
+ export function findQueryParamAll(url, name) {
51
+ const res = [];
52
+ const queryStart = url.indexOf("?");
53
+ if (queryStart === -1)
54
+ return res;
55
+ const len = url.length;
56
+ let s = queryStart + 1;
57
+ const nLen = name.length;
58
+ while (s < len) {
59
+ let amp = url.indexOf("&", s);
60
+ if (amp === -1)
61
+ amp = len;
62
+ let eq = url.indexOf("=", s);
63
+ if (eq === -1 || eq > amp)
64
+ eq = amp;
65
+ if (eq - s === nLen && url.startsWith(name, s)) {
66
+ const val = eq < amp ? url.slice(eq + 1, amp) : "";
67
+ if (val.indexOf("%") === -1 && val.indexOf("+") === -1) {
68
+ res.push(val);
69
+ }
70
+ else {
71
+ try {
72
+ res.push(decodeURIComponent(val.replace(/\+/g, " ")));
73
+ }
74
+ catch {
75
+ res.push(val);
76
+ }
77
+ }
78
+ }
79
+ s = amp + 1;
80
+ }
81
+ return res;
82
+ }
83
+ export function parseAllQueryParams(url) {
84
+ const qIdx = url.indexOf("?");
85
+ if (qIdx === -1)
86
+ return Object.create(null);
87
+ const len = url.length;
88
+ const res = Object.create(null);
89
+ let s = qIdx + 1;
90
+ while (s < len) {
91
+ let amp = url.indexOf("&", s);
92
+ if (amp === -1)
93
+ amp = len;
94
+ let eq = url.indexOf("=", s);
95
+ if (eq === -1 || eq > amp)
96
+ eq = amp;
97
+ const k = decodeQueryComponent(url.slice(s, eq));
98
+ const v = eq < amp ? decodeQueryComponent(url.slice(eq + 1, amp)) : "";
99
+ if (res[k] === undefined)
100
+ res[k] = v;
101
+ s = amp + 1;
102
+ }
103
+ return res;
104
+ }
105
+ export function parseFastQuery(url, startPos) {
106
+ const out = Object.create(null);
107
+ let s = startPos;
108
+ const len = url.length;
109
+ while (s < len) {
110
+ let eq = url.indexOf("=", s);
111
+ if (eq === -1)
112
+ eq = len;
113
+ let amp = url.indexOf("&", eq < len ? eq + 1 : s);
114
+ if (amp === -1)
115
+ amp = len;
116
+ const k = url.slice(s, eq);
117
+ const v = eq < amp ? url.slice(eq + 1, amp) : "";
118
+ out[k] =
119
+ v.indexOf("+") === -1 && v.indexOf("%") === -1
120
+ ? v
121
+ : decodeURIComponent(v.replace(/\+/g, " "));
122
+ s = amp + 1;
123
+ }
124
+ return out;
125
+ }
126
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/internal/query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Token-based lexical scanner + semantic analyzer for handler functions.
3
+ * Runs ONCE per route at registration time. Zero dependencies.
4
+ */
5
+ export interface LiteralInfo {
6
+ kind: "string" | "json";
7
+ value: string;
8
+ }
9
+ export type HandlerFunction = (...args: never[]) => unknown;
10
+ export type ParamSerializer = (params: Record<string, string> | string) => string;
11
+ export interface ParamEntry {
12
+ key: string;
13
+ isParam: boolean;
14
+ paramKey?: string;
15
+ literalValue?: string;
16
+ }
17
+ export interface HandlerAnalysis {
18
+ isNoArg: boolean;
19
+ contextProps: Set<string>;
20
+ hasDynamicAccess: boolean;
21
+ isDestructured: boolean;
22
+ destructuredProps: Set<string>;
23
+ literal: LiteralInfo | null;
24
+ arglessJsonCall: boolean;
25
+ isParamJson?: boolean;
26
+ paramJsonKey?: string;
27
+ paramSerializer?: ParamSerializer | null;
28
+ paramParts?: ParamEntry[] | null;
29
+ }
30
+ export declare const ESCAPE_JSON_CHARS_RE: RegExp;
31
+ export declare function escapeJsonString(value: string): string;
32
+ export declare function analyzeHandler(fn: HandlerFunction): HandlerAnalysis;
33
+ //# sourceMappingURL=scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/internal/scan.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,CAAC;AAC5D,MAAM,MAAM,eAAe,GAAG,CAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,KACpC,MAAM,CAAC;AAEZ,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,cAAc,EAAE,OAAO,CAAC;IACxB,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,eAAe,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACzC,UAAU,CAAC,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;CAClC;AAUD,eAAO,MAAM,oBAAoB,QAAuB,CAAC;AAEzD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGtD;AA0XD,wBAAgB,cAAc,CAAC,EAAE,EAAE,eAAe,GAAG,eAAe,CA2FnE"}