@multiplayer-app/agent 0.1.19 → 0.1.21

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 (308) hide show
  1. package/README.md +14 -7
  2. package/dist/agent/definition.d.ts +13 -0
  3. package/dist/agent/definition.d.ts.map +1 -1
  4. package/dist/agent/definition.test.js +8 -3
  5. package/dist/agent/definition.test.js.map +1 -1
  6. package/dist/agent/profiles/coding.d.ts +1 -1
  7. package/dist/agent/profiles/coding.d.ts.map +1 -1
  8. package/dist/agent/profiles/coding.js +21 -4
  9. package/dist/agent/profiles/coding.js.map +1 -1
  10. package/dist/agent/profiles/index.js +1 -1
  11. package/dist/agent/profiles/index.js.map +1 -1
  12. package/dist/agent/profiles/research.d.ts.map +1 -1
  13. package/dist/agent/profiles/research.js +23 -1
  14. package/dist/agent/profiles/research.js.map +1 -1
  15. package/dist/agent/turn-history.d.ts +40 -0
  16. package/dist/agent/turn-history.d.ts.map +1 -0
  17. package/dist/agent/turn-history.js +167 -0
  18. package/dist/agent/turn-history.js.map +1 -0
  19. package/dist/agent/turn-runner.d.ts +22 -1
  20. package/dist/agent/turn-runner.d.ts.map +1 -1
  21. package/dist/agent/turn-runner.js +162 -79
  22. package/dist/agent/turn-runner.js.map +1 -1
  23. package/dist/app/app-host.d.ts +57 -0
  24. package/dist/app/app-host.d.ts.map +1 -0
  25. package/dist/app/app-host.js +252 -0
  26. package/dist/app/app-host.js.map +1 -0
  27. package/dist/app/app-host.test.d.ts +2 -0
  28. package/dist/app/app-host.test.d.ts.map +1 -0
  29. package/dist/app/app-host.test.js +639 -0
  30. package/dist/app/app-host.test.js.map +1 -0
  31. package/dist/app/config.d.ts +196 -0
  32. package/dist/app/config.d.ts.map +1 -0
  33. package/dist/app/config.js +362 -0
  34. package/dist/app/config.js.map +1 -0
  35. package/dist/app/config.test.d.ts +2 -0
  36. package/dist/app/config.test.d.ts.map +1 -0
  37. package/dist/app/config.test.js +224 -0
  38. package/dist/app/config.test.js.map +1 -0
  39. package/dist/app/detect.d.ts +68 -0
  40. package/dist/app/detect.d.ts.map +1 -0
  41. package/dist/app/detect.js +449 -0
  42. package/dist/app/detect.js.map +1 -0
  43. package/dist/app/detect.test.d.ts +2 -0
  44. package/dist/app/detect.test.d.ts.map +1 -0
  45. package/dist/app/detect.test.js +267 -0
  46. package/dist/app/detect.test.js.map +1 -0
  47. package/dist/app/env.d.ts +5 -0
  48. package/dist/app/env.d.ts.map +1 -0
  49. package/dist/app/env.js +22 -0
  50. package/dist/app/env.js.map +1 -0
  51. package/dist/app/functions-cli.d.ts +3 -0
  52. package/dist/app/functions-cli.d.ts.map +1 -0
  53. package/dist/app/functions-cli.js +27 -0
  54. package/dist/app/functions-cli.js.map +1 -0
  55. package/dist/app/functions-host.d.ts +15 -0
  56. package/dist/app/functions-host.d.ts.map +1 -0
  57. package/dist/app/functions-host.js +276 -0
  58. package/dist/app/functions-host.js.map +1 -0
  59. package/dist/app/functions-host.test.d.ts +2 -0
  60. package/dist/app/functions-host.test.d.ts.map +1 -0
  61. package/dist/app/functions-host.test.js +117 -0
  62. package/dist/app/functions-host.test.js.map +1 -0
  63. package/dist/app/functions-routes.d.ts +23 -0
  64. package/dist/app/functions-routes.d.ts.map +1 -0
  65. package/dist/app/functions-routes.js +85 -0
  66. package/dist/app/functions-routes.js.map +1 -0
  67. package/dist/app/functions-routes.test.d.ts +2 -0
  68. package/dist/app/functions-routes.test.d.ts.map +1 -0
  69. package/dist/app/functions-routes.test.js +40 -0
  70. package/dist/app/functions-routes.test.js.map +1 -0
  71. package/dist/app/manifest.d.ts +17 -0
  72. package/dist/app/manifest.d.ts.map +1 -0
  73. package/dist/app/manifest.js +64 -0
  74. package/dist/app/manifest.js.map +1 -0
  75. package/dist/app/manifest.test.d.ts +2 -0
  76. package/dist/app/manifest.test.d.ts.map +1 -0
  77. package/dist/app/manifest.test.js +173 -0
  78. package/dist/app/manifest.test.js.map +1 -0
  79. package/dist/app/release-artifacts.d.ts +39 -0
  80. package/dist/app/release-artifacts.d.ts.map +1 -0
  81. package/dist/app/release-artifacts.js +229 -0
  82. package/dist/app/release-artifacts.js.map +1 -0
  83. package/dist/app/release-artifacts.test.d.ts +2 -0
  84. package/dist/app/release-artifacts.test.d.ts.map +1 -0
  85. package/dist/app/release-artifacts.test.js +295 -0
  86. package/dist/app/release-artifacts.test.js.map +1 -0
  87. package/dist/app/route-pattern.d.ts +23 -0
  88. package/dist/app/route-pattern.d.ts.map +1 -0
  89. package/dist/app/route-pattern.js +339 -0
  90. package/dist/app/route-pattern.js.map +1 -0
  91. package/dist/app/route-pattern.test.d.ts +2 -0
  92. package/dist/app/route-pattern.test.d.ts.map +1 -0
  93. package/dist/app/route-pattern.test.js +187 -0
  94. package/dist/app/route-pattern.test.js.map +1 -0
  95. package/dist/app/rules.d.ts +61 -0
  96. package/dist/app/rules.d.ts.map +1 -0
  97. package/dist/app/rules.js +90 -0
  98. package/dist/app/rules.js.map +1 -0
  99. package/dist/app/rules.test.d.ts +2 -0
  100. package/dist/app/rules.test.d.ts.map +1 -0
  101. package/dist/app/rules.test.js +69 -0
  102. package/dist/app/rules.test.js.map +1 -0
  103. package/dist/app/runner.d.ts +109 -0
  104. package/dist/app/runner.d.ts.map +1 -0
  105. package/dist/app/runner.js +429 -0
  106. package/dist/app/runner.js.map +1 -0
  107. package/dist/app/site.d.ts +73 -0
  108. package/dist/app/site.d.ts.map +1 -0
  109. package/dist/app/site.js +161 -0
  110. package/dist/app/site.js.map +1 -0
  111. package/dist/app/site.test.d.ts +2 -0
  112. package/dist/app/site.test.d.ts.map +1 -0
  113. package/dist/app/site.test.js +291 -0
  114. package/dist/app/site.test.js.map +1 -0
  115. package/dist/app/static-server.d.ts +20 -0
  116. package/dist/app/static-server.d.ts.map +1 -0
  117. package/dist/app/static-server.js +145 -0
  118. package/dist/app/static-server.js.map +1 -0
  119. package/dist/context-pruning.d.ts +2 -0
  120. package/dist/context-pruning.d.ts.map +1 -1
  121. package/dist/context-pruning.js +3 -2
  122. package/dist/context-pruning.js.map +1 -1
  123. package/dist/models/usage.d.ts +6 -0
  124. package/dist/models/usage.d.ts.map +1 -1
  125. package/dist/models/usage.js +13 -0
  126. package/dist/models/usage.js.map +1 -1
  127. package/dist/persistence/conversation-store.d.ts +21 -0
  128. package/dist/persistence/conversation-store.d.ts.map +1 -0
  129. package/dist/persistence/conversation-store.js +59 -0
  130. package/dist/persistence/conversation-store.js.map +1 -0
  131. package/dist/persistence/conversation-store.test.d.ts +2 -0
  132. package/dist/persistence/conversation-store.test.d.ts.map +1 -0
  133. package/dist/persistence/conversation-store.test.js +98 -0
  134. package/dist/persistence/conversation-store.test.js.map +1 -0
  135. package/dist/persistence/git-sync.d.ts +14 -1
  136. package/dist/persistence/git-sync.d.ts.map +1 -1
  137. package/dist/persistence/git-sync.js +73 -17
  138. package/dist/persistence/git-sync.js.map +1 -1
  139. package/dist/persistence/git-sync.test.js +155 -6
  140. package/dist/persistence/git-sync.test.js.map +1 -1
  141. package/dist/persistence/snapshot-sync.d.ts +19 -2
  142. package/dist/persistence/snapshot-sync.d.ts.map +1 -1
  143. package/dist/persistence/snapshot-sync.js +194 -83
  144. package/dist/persistence/snapshot-sync.js.map +1 -1
  145. package/dist/persistence/snapshot-sync.test.js +145 -27
  146. package/dist/persistence/snapshot-sync.test.js.map +1 -1
  147. package/dist/persistence/workspace.d.ts +3 -0
  148. package/dist/persistence/workspace.d.ts.map +1 -1
  149. package/dist/persistence/workspace.js +1 -0
  150. package/dist/persistence/workspace.js.map +1 -1
  151. package/dist/research/extract-texts.d.ts.map +1 -1
  152. package/dist/research/extract-texts.js +34 -16
  153. package/dist/research/extract-texts.js.map +1 -1
  154. package/dist/research/filingramp/attachment-tools.d.ts.map +1 -1
  155. package/dist/research/filingramp/attachment-tools.js +7 -4
  156. package/dist/research/filingramp/attachment-tools.js.map +1 -1
  157. package/dist/research/filingramp/shared.d.ts.map +1 -1
  158. package/dist/research/filingramp/shared.js +5 -5
  159. package/dist/research/filingramp/shared.js.map +1 -1
  160. package/dist/research/prompt.d.ts.map +1 -1
  161. package/dist/research/prompt.js +2 -1
  162. package/dist/research/prompt.js.map +1 -1
  163. package/dist/runtime/app-mode.d.ts +10 -0
  164. package/dist/runtime/app-mode.d.ts.map +1 -0
  165. package/dist/runtime/app-mode.js +172 -0
  166. package/dist/runtime/app-mode.js.map +1 -0
  167. package/dist/runtime/app-mode.test.d.ts +2 -0
  168. package/dist/runtime/app-mode.test.d.ts.map +1 -0
  169. package/dist/runtime/app-mode.test.js +130 -0
  170. package/dist/runtime/app-mode.test.js.map +1 -0
  171. package/dist/runtime/app-rehearsal.d.ts +2 -0
  172. package/dist/runtime/app-rehearsal.d.ts.map +1 -0
  173. package/dist/runtime/app-rehearsal.js +56 -0
  174. package/dist/runtime/app-rehearsal.js.map +1 -0
  175. package/dist/runtime/build-mode.d.ts +12 -0
  176. package/dist/runtime/build-mode.d.ts.map +1 -0
  177. package/dist/runtime/build-mode.js +116 -0
  178. package/dist/runtime/build-mode.js.map +1 -0
  179. package/dist/runtime/build-mode.test.d.ts +2 -0
  180. package/dist/runtime/build-mode.test.d.ts.map +1 -0
  181. package/dist/runtime/build-mode.test.js +121 -0
  182. package/dist/runtime/build-mode.test.js.map +1 -0
  183. package/dist/runtime/cli.js +7 -2
  184. package/dist/runtime/cli.js.map +1 -1
  185. package/dist/runtime/config.d.ts +4 -0
  186. package/dist/runtime/config.d.ts.map +1 -1
  187. package/dist/runtime/config.js +13 -2
  188. package/dist/runtime/config.js.map +1 -1
  189. package/dist/runtime/guest-server.d.ts +3 -0
  190. package/dist/runtime/guest-server.d.ts.map +1 -0
  191. package/dist/runtime/{lambda-microvm.js → guest-server.js} +49 -18
  192. package/dist/runtime/guest-server.js.map +1 -0
  193. package/dist/runtime/image-hooks.d.ts +5 -0
  194. package/dist/runtime/image-hooks.d.ts.map +1 -0
  195. package/dist/runtime/image-hooks.js +68 -0
  196. package/dist/runtime/image-hooks.js.map +1 -0
  197. package/dist/runtime/image-hooks.test.d.ts +2 -0
  198. package/dist/runtime/image-hooks.test.d.ts.map +1 -0
  199. package/dist/runtime/image-hooks.test.js +74 -0
  200. package/dist/runtime/image-hooks.test.js.map +1 -0
  201. package/dist/runtime/index.d.ts +8 -3
  202. package/dist/runtime/index.d.ts.map +1 -1
  203. package/dist/runtime/index.js +53 -35
  204. package/dist/runtime/index.js.map +1 -1
  205. package/dist/runtime/listening-ports.d.ts +13 -0
  206. package/dist/runtime/listening-ports.d.ts.map +1 -0
  207. package/dist/runtime/listening-ports.js +78 -0
  208. package/dist/runtime/listening-ports.js.map +1 -0
  209. package/dist/runtime/listening-ports.test.d.ts +2 -0
  210. package/dist/runtime/listening-ports.test.d.ts.map +1 -0
  211. package/dist/runtime/listening-ports.test.js +39 -0
  212. package/dist/runtime/listening-ports.test.js.map +1 -0
  213. package/dist/runtime/preview-proxy.d.ts +56 -0
  214. package/dist/runtime/preview-proxy.d.ts.map +1 -0
  215. package/dist/runtime/preview-proxy.js +302 -0
  216. package/dist/runtime/preview-proxy.js.map +1 -0
  217. package/dist/runtime/preview-proxy.test.d.ts +2 -0
  218. package/dist/runtime/preview-proxy.test.d.ts.map +1 -0
  219. package/dist/runtime/preview-proxy.test.js +122 -0
  220. package/dist/runtime/preview-proxy.test.js.map +1 -0
  221. package/dist/runtime/session-mode.d.ts +3 -0
  222. package/dist/runtime/session-mode.d.ts.map +1 -0
  223. package/dist/runtime/session-mode.js +60 -0
  224. package/dist/runtime/session-mode.js.map +1 -0
  225. package/dist/runtime/workload.d.ts +44 -0
  226. package/dist/runtime/workload.d.ts.map +1 -0
  227. package/dist/runtime/workload.js +222 -0
  228. package/dist/runtime/workload.js.map +1 -0
  229. package/dist/runtime/workload.test.d.ts +2 -0
  230. package/dist/runtime/workload.test.d.ts.map +1 -0
  231. package/dist/runtime/workload.test.js +235 -0
  232. package/dist/runtime/workload.test.js.map +1 -0
  233. package/dist/session/conversation.d.ts +10 -2
  234. package/dist/session/conversation.d.ts.map +1 -1
  235. package/dist/session/conversation.js +40 -12
  236. package/dist/session/conversation.js.map +1 -1
  237. package/dist/session/conversation.test.js +2 -3
  238. package/dist/session/conversation.test.js.map +1 -1
  239. package/dist/session/index.d.ts +1 -1
  240. package/dist/session/index.d.ts.map +1 -1
  241. package/dist/session/index.js +2 -1
  242. package/dist/session/index.js.map +1 -1
  243. package/dist/session/runtime.d.ts +20 -3
  244. package/dist/session/runtime.d.ts.map +1 -1
  245. package/dist/session/runtime.js +97 -16
  246. package/dist/session/runtime.js.map +1 -1
  247. package/dist/session/runtime.test.js +18 -7
  248. package/dist/session/runtime.test.js.map +1 -1
  249. package/dist/session/tools.d.ts.map +1 -1
  250. package/dist/session/tools.js +5 -4
  251. package/dist/session/tools.js.map +1 -1
  252. package/dist/task/loop.d.ts.map +1 -1
  253. package/dist/task/loop.js +6 -4
  254. package/dist/task/loop.js.map +1 -1
  255. package/dist/tools/exec-tools.d.ts +12 -0
  256. package/dist/tools/exec-tools.d.ts.map +1 -1
  257. package/dist/tools/exec-tools.js +46 -3
  258. package/dist/tools/exec-tools.js.map +1 -1
  259. package/dist/tools/exec-tools.test.d.ts +2 -0
  260. package/dist/tools/exec-tools.test.d.ts.map +1 -0
  261. package/dist/tools/exec-tools.test.js +48 -0
  262. package/dist/tools/exec-tools.test.js.map +1 -0
  263. package/dist/tools/fs-tools.d.ts.map +1 -1
  264. package/dist/tools/fs-tools.js +5 -5
  265. package/dist/tools/fs-tools.js.map +1 -1
  266. package/dist/transport/link.d.ts.map +1 -1
  267. package/dist/transport/link.js +16 -5
  268. package/dist/transport/link.js.map +1 -1
  269. package/dist/transport/link.test.js +24 -0
  270. package/dist/transport/link.test.js.map +1 -1
  271. package/dist/transport/protocol.d.ts +190 -3
  272. package/dist/transport/protocol.d.ts.map +1 -1
  273. package/dist/transport/protocol.js +147 -7
  274. package/dist/transport/protocol.js.map +1 -1
  275. package/dist/transport/protocol.test.js +41 -0
  276. package/dist/transport/protocol.test.js.map +1 -1
  277. package/dist/workspace-sync/eligibility.d.ts +14 -0
  278. package/dist/workspace-sync/eligibility.d.ts.map +1 -0
  279. package/dist/workspace-sync/eligibility.js +53 -0
  280. package/dist/workspace-sync/eligibility.js.map +1 -0
  281. package/dist/workspace-sync/merge.d.ts +15 -0
  282. package/dist/workspace-sync/merge.d.ts.map +1 -0
  283. package/dist/workspace-sync/merge.js +66 -0
  284. package/dist/workspace-sync/merge.js.map +1 -0
  285. package/dist/workspace-sync/merge.test.d.ts +2 -0
  286. package/dist/workspace-sync/merge.test.d.ts.map +1 -0
  287. package/dist/workspace-sync/merge.test.js +28 -0
  288. package/dist/workspace-sync/merge.test.js.map +1 -0
  289. package/dist/workspace-sync/workspace-sync.d.ts +48 -0
  290. package/dist/workspace-sync/workspace-sync.d.ts.map +1 -0
  291. package/dist/workspace-sync/workspace-sync.js +308 -0
  292. package/dist/workspace-sync/workspace-sync.js.map +1 -0
  293. package/dist/workspace-sync/workspace-sync.test.d.ts +2 -0
  294. package/dist/workspace-sync/workspace-sync.test.d.ts.map +1 -0
  295. package/dist/workspace-sync/workspace-sync.test.js +111 -0
  296. package/dist/workspace-sync/workspace-sync.test.js.map +1 -0
  297. package/dist/workspace-sync/write-drafts.d.ts +24 -0
  298. package/dist/workspace-sync/write-drafts.d.ts.map +1 -0
  299. package/dist/workspace-sync/write-drafts.js +87 -0
  300. package/dist/workspace-sync/write-drafts.js.map +1 -0
  301. package/dist/workspace-sync/write-drafts.test.d.ts +2 -0
  302. package/dist/workspace-sync/write-drafts.test.d.ts.map +1 -0
  303. package/dist/workspace-sync/write-drafts.test.js +36 -0
  304. package/dist/workspace-sync/write-drafts.test.js.map +1 -0
  305. package/package.json +12 -2
  306. package/dist/runtime/lambda-microvm.d.ts +0 -3
  307. package/dist/runtime/lambda-microvm.d.ts.map +0 -1
  308. package/dist/runtime/lambda-microvm.js.map +0 -1
@@ -0,0 +1,339 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.compileRoute = compileRoute;
7
+ exports.routeSourceProblem = routeSourceProblem;
8
+ exports.isValidRouteSource = isValidRouteSource;
9
+ exports.runsOnTimeLimit = runsOnTimeLimit;
10
+ exports.forgetRouteStrikes = forgetRouteStrikes;
11
+ exports.matchRoute = matchRoute;
12
+ exports.fillDestination = fillDestination;
13
+ // builder.json's `source` patterns, read the way Vercel reads vercel.json's: path-to-regexp 6.x
14
+ // syntax (`/api/(.*)`, `/blog/:slug`, `/((?!assets/).*)`) with its defaults — case-insensitive,
15
+ // an optional trailing slash, anchored at both ends. Only the subset of that syntax builder.json
16
+ // needs; `{…}` groups are rejected.
17
+ //
18
+ // These patterns are written by whoever owns the app and run inside the shared gateway on paths
19
+ // anyone can send, and a regex can't be stopped by an event loop. So: shapes that blow up are refused
20
+ // when the file is read, patterns that provably can't blow up run as they are, and everything
21
+ // else runs under a time limit. RE2 or V8's linear engine would be simpler, but neither has
22
+ // lookaheads, which `/((?!assets/).*)` needs.
23
+ const node_vm_1 = __importDefault(require("node:vm"));
24
+ const DEFAULT_PATTERN = '[^\\/#\\?]+?';
25
+ const PREFIXES = './';
26
+ const MODIFIERS = '?*+';
27
+ /** Far past what a real pattern needs on a real path, and short enough not to be felt. */
28
+ const MATCH_TIME_LIMIT_MS = 10;
29
+ /** What a pattern on a time limit is tried against. Length is what a slow pattern feeds on. */
30
+ const MAX_LIMITED_PATH_LENGTH = 2048;
31
+ /** A pattern that runs out of time this often in a window stops matching until the window ends. */
32
+ const MAX_STRIKES = 3;
33
+ const STRIKE_WINDOW_MS = 10 * 60000;
34
+ const MAX_TRACKED_STRIKES = 1000;
35
+ /** One thing a pattern's text does in a fixed number of steps: a character, or a look at literal text ahead. */
36
+ const FIXED_STEP = String.raw `[\w/~%-]|\\.|\(\?[=!](?:[\w./~%|-]|\\.)*\)`;
37
+ /** One character or class repeated. */
38
+ const SINGLE_REPEAT = String.raw `(?:\.|\\.|\[(?:[^\]\\]|\\.)*\])[*+]`;
39
+ /** A custom pattern of fixed steps with at most one repeat among them. Group 1 is that repeat. */
40
+ const LINEAR_PATTERN = new RegExp(`^(?:${FIXED_STEP})*(?:(${SINGLE_REPEAT})(?:${FIXED_STEP})*)?$`);
41
+ function escape(text) {
42
+ return text.replace(/([.+*?=^!:${}()[\]|/\\])/g, '\\$1');
43
+ }
44
+ /** The `(…)` group starting at `start`, and the index after it. */
45
+ function readGroup(source, start) {
46
+ var _a;
47
+ if (source[start + 1] === '?')
48
+ throw new Error(`pattern cannot start with "?" at ${start + 1}`);
49
+ let depth = 1;
50
+ let pattern = '';
51
+ let i = start + 1;
52
+ while (i < source.length) {
53
+ const char = source[i];
54
+ if (char === '\\') {
55
+ pattern += char + ((_a = source[i + 1]) !== null && _a !== void 0 ? _a : '');
56
+ i += 2;
57
+ continue;
58
+ }
59
+ if (char === ')') {
60
+ depth--;
61
+ if (depth === 0)
62
+ break;
63
+ }
64
+ else if (char === '(') {
65
+ depth++;
66
+ if (source[i + 1] !== '?')
67
+ throw new Error(`capturing groups are not allowed at ${i}`);
68
+ }
69
+ pattern += char;
70
+ i++;
71
+ }
72
+ if (depth !== 0)
73
+ throw new Error(`unbalanced pattern at ${start}`);
74
+ if (!pattern)
75
+ throw new Error(`missing pattern at ${start}`);
76
+ return { pattern, end: i + 1 };
77
+ }
78
+ function parse(source) {
79
+ var _a, _b;
80
+ const tokens = [];
81
+ let path = '';
82
+ let unnamed = 0;
83
+ let i = 0;
84
+ const pushParam = (name, pattern) => {
85
+ let prefix = '';
86
+ const last = path[path.length - 1];
87
+ if (last !== undefined && PREFIXES.includes(last)) {
88
+ prefix = last;
89
+ path = path.slice(0, -1);
90
+ }
91
+ if (path)
92
+ tokens.push(path);
93
+ path = '';
94
+ let modifier = '';
95
+ if (i < source.length && MODIFIERS.includes(source[i]))
96
+ modifier = source[i++];
97
+ tokens.push({ name, prefix, pattern, modifier });
98
+ };
99
+ while (i < source.length) {
100
+ const char = source[i];
101
+ if (char === '\\') {
102
+ path += (_a = source[i + 1]) !== null && _a !== void 0 ? _a : '';
103
+ i += 2;
104
+ }
105
+ else if (char === ':') {
106
+ const name = (_b = /^[A-Za-z0-9_]+/.exec(source.slice(i + 1))) === null || _b === void 0 ? void 0 : _b[0];
107
+ if (!name)
108
+ throw new Error(`missing parameter name at ${i}`);
109
+ i += 1 + name.length;
110
+ let pattern = DEFAULT_PATTERN;
111
+ if (source[i] === '(') {
112
+ const group = readGroup(source, i);
113
+ pattern = group.pattern;
114
+ i = group.end;
115
+ }
116
+ pushParam(name, pattern);
117
+ }
118
+ else if (char === '(') {
119
+ const group = readGroup(source, i);
120
+ i = group.end;
121
+ pushParam(unnamed++, group.pattern);
122
+ }
123
+ else if (char === '{' || char === '}' || MODIFIERS.includes(char)) {
124
+ throw new Error(`unexpected "${char}" at ${i}`);
125
+ }
126
+ else {
127
+ path += char;
128
+ i++;
129
+ }
130
+ }
131
+ if (path)
132
+ tokens.push(path);
133
+ return tokens;
134
+ }
135
+ /** Why a custom pattern can take exponential time, or capture what the keys don't count; undefined if neither. */
136
+ function patternProblem(pattern, repeated) {
137
+ var _a;
138
+ // One entry per open group: whether it holds something that can match more than one way.
139
+ const groups = [{ varies: false }];
140
+ /** Whether what was just read, which a quantifier would apply to, is a group that varies. */
141
+ let lastVaries = false;
142
+ let i = 0;
143
+ while (i < pattern.length) {
144
+ const char = pattern[i];
145
+ if (char === '\\') {
146
+ if (/[1-9k]/.test((_a = pattern[i + 1]) !== null && _a !== void 0 ? _a : ''))
147
+ return 'it refers back to a group, which can take exponential time';
148
+ i += 2;
149
+ lastVaries = false;
150
+ }
151
+ else if (char === '[') {
152
+ i++;
153
+ while (i < pattern.length && pattern[i] !== ']')
154
+ i += pattern[i] === '\\' ? 2 : 1;
155
+ i++;
156
+ lastVaries = false;
157
+ }
158
+ else if (char === '(') {
159
+ if (/^\(\?<(?![=!])/.test(pattern.slice(i, i + 4)))
160
+ return 'it has a named group; use :name';
161
+ groups.push({ varies: false });
162
+ i++;
163
+ if (pattern[i] === '?')
164
+ i += pattern[i + 2] === '=' || pattern[i + 2] === '!' ? 3 : 2;
165
+ lastVaries = false;
166
+ }
167
+ else if (char === ')') {
168
+ lastVaries = groups.pop().varies;
169
+ if (lastVaries)
170
+ groups[groups.length - 1].varies = true;
171
+ i++;
172
+ }
173
+ else if (char === '|') {
174
+ groups[groups.length - 1].varies = true;
175
+ i++;
176
+ lastVaries = false;
177
+ }
178
+ else if (char === '*' || char === '+' || char === '?' || char === '{') {
179
+ const close = char === '{' ? pattern.indexOf('}', i) : i;
180
+ if (close === -1) {
181
+ i++;
182
+ continue;
183
+ }
184
+ const repeats = char !== '?';
185
+ if (repeats && lastVaries)
186
+ return 'it repeats a group that can itself match in more than one way, which can take exponential time';
187
+ groups[groups.length - 1].varies = true;
188
+ i = close + 1;
189
+ if (pattern[i] === '?')
190
+ i++;
191
+ lastVaries = false;
192
+ }
193
+ else {
194
+ i++;
195
+ lastVaries = false;
196
+ }
197
+ }
198
+ if (repeated && groups[0].varies)
199
+ return 'a :name+ or :name* repeats a pattern that can itself match in more than one way, which can take exponential time';
200
+ return undefined;
201
+ }
202
+ /** Whether every step of matching is settled by the next character, bar at most one choice. */
203
+ function isLinear(tokens) {
204
+ let choices = 0;
205
+ for (const [index, token] of tokens.entries()) {
206
+ if (typeof token === 'string')
207
+ continue;
208
+ if (token.pattern === DEFAULT_PATTERN) {
209
+ // It stops at the next `/`, so the only way on is the one that starts with one.
210
+ const next = tokens[index + 1];
211
+ const bounded = token.prefix === '/' && (next === undefined || (typeof next === 'string' ? next.startsWith('/') : next.prefix === '/'));
212
+ if (!bounded)
213
+ return false;
214
+ if (token.modifier)
215
+ choices++;
216
+ }
217
+ else {
218
+ const shape = LINEAR_PATTERN.exec(token.pattern);
219
+ if (!shape || token.modifier)
220
+ return false;
221
+ if (shape[1])
222
+ choices++;
223
+ }
224
+ }
225
+ return choices <= 1;
226
+ }
227
+ /** Compiles a `source` pattern; throws an Error saying what is wrong with an invalid or dangerous one. */
228
+ function compileRoute(source) {
229
+ const keys = [];
230
+ const tokens = parse(source);
231
+ let route = '^';
232
+ for (const token of tokens) {
233
+ if (typeof token === 'string') {
234
+ route += escape(token);
235
+ continue;
236
+ }
237
+ keys.push(token.name);
238
+ const prefix = escape(token.prefix);
239
+ if (token.modifier === '+' || token.modifier === '*') {
240
+ const optional = token.modifier === '*' ? '?' : '';
241
+ route += `(?:${prefix}((?:${token.pattern})(?:${prefix}(?:${token.pattern}))*))${optional}`;
242
+ }
243
+ else {
244
+ route += `(?:${prefix}(${token.pattern}))${token.modifier}`;
245
+ }
246
+ }
247
+ route += '[\\/#\\?]?$';
248
+ const regexp = new RegExp(route, 'i');
249
+ for (const token of tokens) {
250
+ if (typeof token === 'string' || token.pattern === DEFAULT_PATTERN)
251
+ continue;
252
+ const problem = patternProblem(token.pattern, token.modifier === '+' || token.modifier === '*');
253
+ if (problem)
254
+ throw new Error(problem);
255
+ }
256
+ return { source, regexp, keys, linear: isLinear(tokens) };
257
+ }
258
+ /** What is wrong with `source`, in a sentence; undefined when it's fine. */
259
+ function routeSourceProblem(source) {
260
+ try {
261
+ compileRoute(source);
262
+ return undefined;
263
+ }
264
+ catch (error) {
265
+ return error.message;
266
+ }
267
+ }
268
+ /** Whether `source` compiles. */
269
+ function isValidRouteSource(source) {
270
+ return routeSourceProblem(source) === undefined;
271
+ }
272
+ /** Whether `source` will run under the time limit. */
273
+ function runsOnTimeLimit(source) {
274
+ return !compileRoute(source).linear;
275
+ }
276
+ const limited = node_vm_1.default.createContext(Object.create(null));
277
+ const limitedExec = new node_vm_1.default.Script('regexp.exec(pathname)');
278
+ /** By source, since a site can be compiled again. Only a window's end clears them: a request that matches proves nothing about the next path. */
279
+ const strikes = new Map();
280
+ function isStruckOut(source, now) {
281
+ const entry = strikes.get(source);
282
+ if (!entry)
283
+ return false;
284
+ if (now - entry.since < STRIKE_WINDOW_MS)
285
+ return entry.count >= MAX_STRIKES;
286
+ strikes.delete(source);
287
+ return false;
288
+ }
289
+ function strike(source, now) {
290
+ var _a;
291
+ const entry = strikes.get(source);
292
+ if (entry) {
293
+ entry.count++;
294
+ }
295
+ else {
296
+ if (strikes.size >= MAX_TRACKED_STRIKES)
297
+ strikes.delete(strikes.keys().next().value);
298
+ strikes.set(source, { count: 1, since: now });
299
+ }
300
+ console.warn(`builder.json path pattern ${JSON.stringify(source)} ran out of time (${(_a = entry === null || entry === void 0 ? void 0 : entry.count) !== null && _a !== void 0 ? _a : 1} of ${MAX_STRIKES})`);
301
+ }
302
+ /** Tests only. */
303
+ function forgetRouteStrikes() {
304
+ strikes.clear();
305
+ }
306
+ /** The match, or null when there is none or it took too long: a slow pattern only costs its own site that rule. */
307
+ function execLimited(pattern, pathname) {
308
+ if (pathname.length > MAX_LIMITED_PATH_LENGTH)
309
+ return null;
310
+ const now = Date.now();
311
+ if (isStruckOut(pattern.source, now))
312
+ return null;
313
+ limited.regexp = pattern.regexp;
314
+ limited.pathname = pathname;
315
+ try {
316
+ return limitedExec.runInContext(limited, { timeout: MATCH_TIME_LIMIT_MS });
317
+ }
318
+ catch (_a) {
319
+ strike(pattern.source, now);
320
+ return null;
321
+ }
322
+ }
323
+ /** The pattern's values for `pathname` (by key), or undefined when it doesn't match. */
324
+ function matchRoute(pattern, pathname) {
325
+ const match = pattern.linear ? pattern.regexp.exec(pathname) : execLimited(pattern, pathname);
326
+ if (!match)
327
+ return undefined;
328
+ const values = new Map();
329
+ pattern.keys.forEach((key, index) => { var _a; return values.set(key, (_a = match[index + 1]) !== null && _a !== void 0 ? _a : ''); });
330
+ return values;
331
+ }
332
+ /** A rewrite destination with `:name` and `$1`-style references to a match filled in. */
333
+ function fillDestination(destination, values) {
334
+ const positional = [...values.values()];
335
+ return destination
336
+ .replace(/\$(\d+)/g, (_, index) => { var _a; return (_a = positional[Number(index) - 1]) !== null && _a !== void 0 ? _a : ''; })
337
+ .replace(/:([A-Za-z0-9_]+)/g, (whole, name) => (values.has(name) ? values.get(name) : whole));
338
+ }
339
+ //# sourceMappingURL=route-pattern.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-pattern.js","sourceRoot":"","sources":["../../src/app/route-pattern.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=route-pattern.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-pattern.test.d.ts","sourceRoot":"","sources":["../../src/app/route-pattern.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const strict_1 = __importDefault(require("node:assert/strict"));
7
+ const node_test_1 = require("node:test");
8
+ const route_pattern_1 = require("./route-pattern");
9
+ function matches(source, pathname) {
10
+ return (0, route_pattern_1.matchRoute)((0, route_pattern_1.compileRoute)(source), pathname) !== undefined;
11
+ }
12
+ (0, node_test_1.describe)('route patterns (path-to-regexp 6 syntax, as vercel.json)', () => {
13
+ (0, node_test_1.it)('reads the rewrites of a vercel.json', () => {
14
+ strict_1.default.ok(matches('/api/(.*)', '/api/users/1'));
15
+ strict_1.default.ok(matches('/api/(.*)', '/api/'));
16
+ strict_1.default.ok(!matches('/api/(.*)', '/apis/x'));
17
+ strict_1.default.ok(matches('/(.*)', '/'));
18
+ strict_1.default.ok(matches('/(.*)', '/anything/at/all'));
19
+ });
20
+ (0, node_test_1.it)('keeps a negative lookahead group', () => {
21
+ strict_1.default.ok(matches('/((?!assets/).*)', '/dashboard/settings'));
22
+ strict_1.default.ok(matches('/((?!assets/).*)', '/'));
23
+ strict_1.default.ok(!matches('/((?!assets/).*)', '/assets/index-abc.js'));
24
+ });
25
+ (0, node_test_1.it)('matches named parameters with their modifiers', () => {
26
+ strict_1.default.deepEqual([...(0, route_pattern_1.matchRoute)((0, route_pattern_1.compileRoute)('/blog/:slug'), '/blog/hello')], [['slug', 'hello']]);
27
+ strict_1.default.ok(!matches('/blog/:slug', '/blog/a/b'));
28
+ strict_1.default.ok(matches('/docs/:path*', '/docs'));
29
+ strict_1.default.ok(matches('/docs/:path*', '/docs/a/b'));
30
+ strict_1.default.ok(!matches('/docs/:path+', '/docs'));
31
+ strict_1.default.ok(matches('/user/:id?', '/user'));
32
+ });
33
+ (0, node_test_1.it)('ignores case and a trailing slash, as path-to-regexp does by default', () => {
34
+ strict_1.default.ok(matches('/About', '/about/'));
35
+ });
36
+ (0, node_test_1.it)('fills a destination from the match', () => {
37
+ const values = (0, route_pattern_1.matchRoute)((0, route_pattern_1.compileRoute)('/old/:name/(.*)'), '/old/docs/a/b');
38
+ strict_1.default.equal((0, route_pattern_1.fillDestination)('/new/:name/$2', values), '/new/docs/a/b');
39
+ });
40
+ (0, node_test_1.it)('rejects what it cannot read', () => {
41
+ strict_1.default.equal((0, route_pattern_1.isValidRouteSource)('/x/(foo'), false);
42
+ strict_1.default.equal((0, route_pattern_1.isValidRouteSource)('/x/((foo))'), false);
43
+ strict_1.default.equal((0, route_pattern_1.isValidRouteSource)('/x/{a}'), false);
44
+ strict_1.default.equal((0, route_pattern_1.isValidRouteSource)('/x/:'), false);
45
+ });
46
+ });
47
+ (0, node_test_1.describe)('a pattern someone else wrote, on a path anyone can send', () => {
48
+ /** How long a match takes, and what it answered. */
49
+ function timed(source, pathname) {
50
+ const pattern = (0, route_pattern_1.compileRoute)(source);
51
+ const start = performance.now();
52
+ const matched = (0, route_pattern_1.matchRoute)(pattern, pathname) !== undefined;
53
+ return { ms: performance.now() - start, matched };
54
+ }
55
+ (0, node_test_1.it)('refuses the shapes that take exponential time, and says why', () => {
56
+ var _a, _b, _c, _d;
57
+ for (const source of [
58
+ '/((?:a+)+)',
59
+ '/((?:a*)*)',
60
+ '/((?:a|a)*)',
61
+ '/((?:a|b)+)',
62
+ '/((?:a+){2,})',
63
+ '/((?!(?:a+)+b).*)',
64
+ '/((?:(?:a+))+)',
65
+ '/:x((?:a|b))+',
66
+ '/:x(a+)*',
67
+ '/:x(.*)+',
68
+ ]) {
69
+ strict_1.default.match((_a = (0, route_pattern_1.routeSourceProblem)(source)) !== null && _a !== void 0 ? _a : 'allowed', /exponential/, source);
70
+ }
71
+ strict_1.default.match((_b = (0, route_pattern_1.routeSourceProblem)(String.raw `/(.*\1)`)) !== null && _b !== void 0 ? _b : '', /refers back/);
72
+ strict_1.default.match((_c = (0, route_pattern_1.routeSourceProblem)('/((?<name>a))')) !== null && _c !== void 0 ? _c : '', /named group/);
73
+ strict_1.default.match((_d = (0, route_pattern_1.routeSourceProblem)('/(+)')) !== null && _d !== void 0 ? _d : '', /Invalid regular expression/);
74
+ });
75
+ (0, node_test_1.it)('keeps what real apps write', () => {
76
+ for (const source of [
77
+ '/(.*)',
78
+ '/api/(.*)',
79
+ '/blog/:slug',
80
+ '/docs/:path*',
81
+ '/:lang(en|fr)/about',
82
+ '/:id(\\\\d+)',
83
+ '/((?!assets/).*)',
84
+ '/((?!api|_next/static|favicon.ico).*)',
85
+ '/(admin(?!/))',
86
+ '/assets/(.*\\.(?:js|css))',
87
+ '/((?:foo|bar)?)',
88
+ '/(a+b+)',
89
+ ]) {
90
+ strict_1.default.equal((0, route_pattern_1.routeSourceProblem)(source), undefined, source);
91
+ }
92
+ });
93
+ (0, node_test_1.it)('runs the common shapes with no time limit, and only those', () => {
94
+ for (const source of [
95
+ '/',
96
+ '/about',
97
+ '/(.*)',
98
+ '/api/(.*)',
99
+ '/api/:version/(.*)',
100
+ '/blog/:slug',
101
+ '/a/:b/c/:d',
102
+ '/user/:id?',
103
+ '/docs/:path*',
104
+ '/docs/:path+',
105
+ '/:id(\\d+)',
106
+ '/:name([a-z-]+)',
107
+ '/((?!assets/).*)',
108
+ '/((?!api|_next/static|favicon\\.ico).*)',
109
+ '/(admin(?!/))',
110
+ ]) {
111
+ strict_1.default.equal((0, route_pattern_1.compileRoute)(source).linear, true, source);
112
+ }
113
+ for (const source of [
114
+ '/:a?/:b?',
115
+ '/:a*/x/:b*',
116
+ '/(.*)/(.*)',
117
+ '/:a:b(.*)',
118
+ '/:a.:b',
119
+ '/:a-:b',
120
+ '/(.*)-(.*)',
121
+ '/:lang(en|fr)',
122
+ '/(a+b+)',
123
+ '/:name(.*)?',
124
+ ]) {
125
+ strict_1.default.equal((0, route_pattern_1.compileRoute)(source).linear, false, source);
126
+ }
127
+ });
128
+ (0, node_test_1.it)('takes linear time on what it runs with no limit, on the worst paths for each', () => {
129
+ const size = 200000;
130
+ for (const [source, pathname] of [
131
+ ['/(.*)x', '/' + 'a'.repeat(size)],
132
+ ['/((?!assets/).*)x', '/' + 'a'.repeat(size)],
133
+ ['/a/:b/(.*)x/c', '/a/b/' + 'x/'.repeat(size / 2)],
134
+ ['/(.*)/:a/:b/:c', '/' + 'a'.repeat(size)],
135
+ ['/:path*/x', '/' + 'a/'.repeat(size / 2)],
136
+ ['/:a/:b/:c/:d', '/' + 'a/'.repeat(size / 2)],
137
+ ['/:name([a-z]+)x', '/' + 'a'.repeat(size)],
138
+ ]) {
139
+ const pattern = (0, route_pattern_1.compileRoute)(source);
140
+ strict_1.default.equal(pattern.linear, true, source);
141
+ const { ms } = timed(source, pathname);
142
+ // Quadratic on this size would take minutes.
143
+ strict_1.default.ok(ms < 1000, `${source} took ${ms}ms`);
144
+ }
145
+ });
146
+ (0, node_test_1.it)('stops every slow pattern it can\'t rule out, and carries on', () => {
147
+ (0, route_pattern_1.forgetRouteStrikes)();
148
+ for (const [source, pathname] of [
149
+ ['/(.*)(.*)(.*)(.*)(.*)x', '/' + 'a'.repeat(2000)],
150
+ ['/((?=(?:.*)(?:.*)(?:.*)(?:.*)x).*)', '/' + 'a'.repeat(2000)],
151
+ ['/([ab]+[ab]+[ab]+[ab]+[ab]+x)', '/' + 'a'.repeat(2000)],
152
+ ['/(.{1,60000}.{1,60000}.{1,60000}.{1,60000}.{1,60000}x)', '/' + 'a'.repeat(2000)],
153
+ ]) {
154
+ strict_1.default.equal((0, route_pattern_1.compileRoute)(source).linear, false, source);
155
+ const { ms, matched } = timed(source, pathname);
156
+ strict_1.default.equal(matched, false, source);
157
+ strict_1.default.ok(ms < 200, `${source} took ${ms}ms`);
158
+ }
159
+ strict_1.default.ok((0, route_pattern_1.matchRoute)((0, route_pattern_1.compileRoute)('/:lang(en|fr)/x'), '/en/x'));
160
+ });
161
+ (0, node_test_1.it)('stops trying a pattern that keeps running out of time, then gives it another chance', (t) => {
162
+ (0, route_pattern_1.forgetRouteStrikes)();
163
+ const warned = t.mock.method(console, 'warn', () => undefined);
164
+ const now = t.mock.method(Date, 'now', () => 1000);
165
+ const source = '/(.*)(.*)(.*)(.*)(.*)x';
166
+ const slow = '/' + 'a'.repeat(2000);
167
+ for (let attempt = 0; attempt < 3; attempt++)
168
+ timed(source, slow);
169
+ strict_1.default.equal(warned.mock.callCount(), 3);
170
+ const struck = timed(source, slow);
171
+ strict_1.default.equal(warned.mock.callCount(), 3);
172
+ strict_1.default.ok(struck.ms < 5, `took ${struck.ms}ms`);
173
+ // Matching in the meantime clears nothing, or a run of slow paths could alternate with quick ones.
174
+ strict_1.default.equal(timed(source, '/axxxx').matched, false);
175
+ now.mock.mockImplementation(() => 1000 + 11 * 60000);
176
+ strict_1.default.equal(timed(source, '/ax').matched, true);
177
+ (0, route_pattern_1.forgetRouteStrikes)();
178
+ });
179
+ (0, node_test_1.it)('does not try one on a path longer than it would ever need', () => {
180
+ (0, route_pattern_1.forgetRouteStrikes)();
181
+ const source = '/:lang(en|fr)/(.*)';
182
+ strict_1.default.ok(timed(source, '/en/' + 'a'.repeat(2000)).matched);
183
+ strict_1.default.ok(!timed(source, '/en/' + 'a'.repeat(3000)).matched);
184
+ strict_1.default.ok(timed('/api/(.*)', '/api/' + 'a'.repeat(3000)).matched);
185
+ });
186
+ });
187
+ //# sourceMappingURL=route-pattern.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-pattern.test.js","sourceRoot":"","sources":["../../src/app/route-pattern.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import { type RoutePattern } from './route-pattern';
2
+ interface CompiledRedirect {
3
+ pattern: RoutePattern;
4
+ destination: string;
5
+ status: number;
6
+ }
7
+ interface CompiledRewrite {
8
+ pattern: RoutePattern;
9
+ destination: string;
10
+ }
11
+ interface CompiledHeaderRule {
12
+ pattern: RoutePattern;
13
+ headers: Array<{
14
+ key: string;
15
+ value: string;
16
+ }>;
17
+ }
18
+ export interface RoutingRules {
19
+ redirects: CompiledRedirect[];
20
+ rewrites: CompiledRewrite[];
21
+ headers: CompiledHeaderRule[];
22
+ cleanUrls: boolean;
23
+ trailingSlash?: boolean;
24
+ }
25
+ /** The rule keys of a service in builder.json. */
26
+ export interface RuleSettings {
27
+ redirects?: Array<{
28
+ source: string;
29
+ destination: string;
30
+ permanent?: boolean;
31
+ statusCode?: number;
32
+ }>;
33
+ rewrites?: Array<{
34
+ source: string;
35
+ destination: string;
36
+ }>;
37
+ headers?: Array<{
38
+ source: string;
39
+ headers: Array<{
40
+ key: string;
41
+ value: string;
42
+ }>;
43
+ }>;
44
+ cleanUrls?: boolean;
45
+ trailingSlash?: boolean;
46
+ }
47
+ export declare function compileRules(settings: RuleSettings): RoutingRules;
48
+ /** The redirect that answers `pathname`, if any; `search` (with its `?`) carries over to it. */
49
+ export declare function redirectFor(rules: RoutingRules, pathname: string, search: string): {
50
+ status: number;
51
+ location: string;
52
+ } | undefined;
53
+ /** The URL a rewrite turns `pathname` into, `search` included; undefined when none matches. */
54
+ export declare function rewriteFor(rules: RoutingRules, pathname: string, search?: string): string | undefined;
55
+ /** The headers every matching rule sets on the answer to `pathname`. */
56
+ export declare function headersFor(rules: RoutingRules, pathname: string): Array<{
57
+ key: string;
58
+ value: string;
59
+ }>;
60
+ export {};
61
+ //# sourceMappingURL=rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/app/rules.ts"],"names":[],"mappings":"AAIA,OAAO,EAA6C,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAK9F,UAAU,gBAAgB;IACxB,OAAO,EAAE,YAAY,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,YAAY,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,UAAU,kBAAkB;IAC1B,OAAO,EAAE,YAAY,CAAA;IACrB,OAAO,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC/C;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,gBAAgB,EAAE,CAAA;IAC7B,QAAQ,EAAE,eAAe,EAAE,CAAA;IAC3B,OAAO,EAAE,kBAAkB,EAAE,CAAA;IAC7B,SAAS,EAAE,OAAO,CAAA;IAClB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,kDAAkD;AAClD,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACpG,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACzD,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,KAAK,CAAC;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAA;IACnF,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,YAAY,GAAG,YAAY,CAYjE;AA8BD,gGAAgG;AAChG,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAUnI;AAED,+FAA+F;AAC/F,wBAAgB,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAK,GAAG,MAAM,GAAG,SAAS,CAMjG;AAED,wEAAwE;AACxE,wBAAgB,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAEvG"}