@toa.io/extensions.exposition 1.0.0-alpha.292 → 1.0.0-alpha.293

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 (443) hide show
  1. package/components/identity.basic/package.json +8 -0
  2. package/components/identity.federation/package.json +8 -0
  3. package/components/identity.passkeys/package.json +8 -0
  4. package/components/identity.tokens/package.json +10 -0
  5. package/package.json +24 -13
  6. package/transpiled/Endpoint.js +3 -0
  7. package/transpiled/Endpoint.js.map +1 -1
  8. package/transpiled/Introspection.d.ts +6 -0
  9. package/transpiled/Introspection.js +1 -0
  10. package/transpiled/Introspection.js.map +1 -1
  11. package/transpiled/MCP/schema.js +2 -2
  12. package/transpiled/Query.d.ts +2 -12
  13. package/transpiled/Query.js +2 -12
  14. package/transpiled/Query.js.map +1 -1
  15. package/transpiled/RTD/Endpoint.d.ts +2 -3
  16. package/ui/dist/_app/immutable/assets/0.Cu0AnR_8.css +2 -0
  17. package/ui/dist/_app/immutable/assets/2.BghF56l_.css +1 -0
  18. package/ui/dist/_app/immutable/assets/ui.C8aD6zzF.css +1 -0
  19. package/ui/dist/_app/immutable/chunks/B8GvXrmq.js +1 -0
  20. package/ui/dist/_app/immutable/chunks/BVDJTrf4.js +3 -0
  21. package/ui/dist/_app/immutable/chunks/D6q28_Ok.js +86 -0
  22. package/ui/dist/_app/immutable/chunks/{aLpTDmOc.js → DVlaUfVU.js} +1 -1
  23. package/ui/dist/_app/immutable/chunks/DpB73ZB6.js +6 -0
  24. package/ui/dist/_app/immutable/entry/app.CTava8yn.js +2 -0
  25. package/ui/dist/_app/immutable/entry/start.yWN0gSLA.js +1 -0
  26. package/ui/dist/_app/immutable/nodes/0.HKRDBYrC.js +1 -0
  27. package/ui/dist/_app/immutable/nodes/1.CLa0ydOi.js +1 -0
  28. package/ui/dist/_app/immutable/nodes/2.C9Kaym8C.js +8 -0
  29. package/ui/dist/_app/immutable/nodes/3.C1X4_rXZ.js +1 -0
  30. package/ui/dist/_app/immutable/nodes/4.DdzDIi9E.js +1 -0
  31. package/ui/dist/_app/immutable/nodes/5.DpbmCMdw.js +1 -0
  32. package/ui/dist/_app/version.json +1 -1
  33. package/ui/dist/index.html +12 -12
  34. package/CHANGELOG.md +0 -42
  35. package/components/identity.bans/tsconfig.tsbuildinfo +0 -1
  36. package/components/identity.basic/source/lib/credentials.test.ts +0 -18
  37. package/components/identity.basic/tsconfig.tsbuildinfo +0 -1
  38. package/components/identity.clients/source/lib/canonical.test.ts +0 -43
  39. package/components/identity.clients/source/lib/cimd.test.ts +0 -122
  40. package/components/identity.clients/source/lib/redirect.test.ts +0 -47
  41. package/components/identity.clients/tsconfig.tsbuildinfo +0 -1
  42. package/components/identity.credentials/source/list.test.ts +0 -70
  43. package/components/identity.credentials/tsconfig.tsbuildinfo +0 -1
  44. package/components/identity.federation/source/lib/discovery.test.ts +0 -60
  45. package/components/identity.federation/source/list.test.ts +0 -41
  46. package/components/identity.federation/tsconfig.tsbuildinfo +0 -1
  47. package/components/identity.grants/tsconfig.tsbuildinfo +0 -1
  48. package/components/identity.keys/tsconfig.tsbuildinfo +0 -1
  49. package/components/identity.otp/tsconfig.tsbuildinfo +0 -1
  50. package/components/identity.passkeys/source/errors.test.ts +0 -34
  51. package/components/identity.passkeys/source/webauthn.test.ts +0 -26
  52. package/components/identity.passkeys/tsconfig.tsbuildinfo +0 -1
  53. package/components/identity.roles/tsconfig.tsbuildinfo +0 -1
  54. package/components/identity.tokens/source/authenticate.test.ts +0 -112
  55. package/components/identity.tokens/source/decrypt.test.ts +0 -216
  56. package/components/identity.tokens/source/encrypt.test.ts +0 -150
  57. package/components/identity.tokens/source/issue.test.ts +0 -73
  58. package/components/identity.tokens/source/lib/form.test.ts +0 -25
  59. package/components/identity.tokens/source/lib/paseto.test.ts +0 -62
  60. package/components/identity.tokens/tsconfig.tsbuildinfo +0 -1
  61. package/context.toa.yaml +0 -31
  62. package/cucumber.mjs +0 -7
  63. package/documentation/.assets/ia3-dark.jpg +0 -0
  64. package/documentation/.assets/ia3-light.jpg +0 -0
  65. package/documentation/.assets/overview-dark.jpg +0 -0
  66. package/documentation/.assets/overview-light.jpg +0 -0
  67. package/documentation/.assets/role-scopes-dark.jpg +0 -0
  68. package/documentation/.assets/role-scopes-light.jpg +0 -0
  69. package/documentation/.assets/rtd-dark.jpg +0 -0
  70. package/documentation/.assets/rtd-light.jpg +0 -0
  71. package/documentation/access.md +0 -350
  72. package/documentation/authorities.md +0 -51
  73. package/documentation/cache.md +0 -72
  74. package/documentation/components.md +0 -472
  75. package/documentation/consent.md +0 -101
  76. package/documentation/credentials.md +0 -88
  77. package/documentation/dev.md +0 -30
  78. package/documentation/discovery.md +0 -81
  79. package/documentation/flow.md +0 -44
  80. package/documentation/help.md +0 -122
  81. package/documentation/identity.md +0 -304
  82. package/documentation/introspection.md +0 -123
  83. package/documentation/io.md +0 -167
  84. package/documentation/ip.md +0 -24
  85. package/documentation/map.md +0 -123
  86. package/documentation/mcp.md +0 -183
  87. package/documentation/notes/desync.jpg +0 -0
  88. package/documentation/notes/peers.md +0 -59
  89. package/documentation/notes/sse.md +0 -71
  90. package/documentation/notes/throttling.md +0 -122
  91. package/documentation/oauth.md +0 -180
  92. package/documentation/octets.md +0 -334
  93. package/documentation/passkeys.md +0 -11
  94. package/documentation/protocol.md +0 -120
  95. package/documentation/query.md +0 -324
  96. package/documentation/require.md +0 -15
  97. package/documentation/rpc.md +0 -154
  98. package/documentation/tracing.md +0 -70
  99. package/documentation/tree.md +0 -199
  100. package/features/access.feature +0 -596
  101. package/features/annotation.feature +0 -32
  102. package/features/auth.assert.feature +0 -55
  103. package/features/auth.bearer.feature +0 -120
  104. package/features/auth.claims.feature +0 -171
  105. package/features/auth.incept.feature +0 -166
  106. package/features/auth.input.feature +0 -59
  107. package/features/authorities.basic.feature +0 -141
  108. package/features/authorities.feature +0 -71
  109. package/features/authorities.federation.feature +0 -100
  110. package/features/authorities.tokens.feature +0 -117
  111. package/features/body.feature +0 -76
  112. package/features/cache.feature +0 -368
  113. package/features/configuration.feature +0 -206
  114. package/features/cors.feature +0 -127
  115. package/features/credentials.feature +0 -106
  116. package/features/debug.feature +0 -34
  117. package/features/dev.feature +0 -90
  118. package/features/directives.feature +0 -61
  119. package/features/discovery.feature +0 -213
  120. package/features/discovery.ui.feature +0 -213
  121. package/features/dynamic.feature +0 -192
  122. package/features/errors.feature +0 -258
  123. package/features/etag.feature +0 -239
  124. package/features/flow.feature +0 -148
  125. package/features/help.feature +0 -512
  126. package/features/identity.bans.feature +0 -200
  127. package/features/identity.basic.feature +0 -666
  128. package/features/identity.feature +0 -240
  129. package/features/identity.federation.feature +0 -396
  130. package/features/identity.otp.feature +0 -142
  131. package/features/identity.roles.feature +0 -568
  132. package/features/identity.tokens.custom.feature +0 -430
  133. package/features/identity.tokens.feature +0 -131
  134. package/features/interruptions.feature +0 -20
  135. package/features/introspection.feature +0 -565
  136. package/features/introspection.map.feature +0 -108
  137. package/features/io.feature +0 -204
  138. package/features/io.throttle.feature +0 -166
  139. package/features/map.feature +0 -360
  140. package/features/mcp.feature +0 -753
  141. package/features/methods.feature +0 -48
  142. package/features/oauth.clients.feature +0 -195
  143. package/features/oauth.discovery.feature +0 -164
  144. package/features/oauth.grants.feature +0 -301
  145. package/features/octets.cloudinary.feature +0 -233
  146. package/features/octets.download.feature +0 -194
  147. package/features/octets.entries.feature +0 -83
  148. package/features/octets.feature +0 -306
  149. package/features/octets.head.feature +0 -40
  150. package/features/octets.location.feature +0 -83
  151. package/features/octets.meta.feature +0 -117
  152. package/features/octets.workflows.feature +0 -565
  153. package/features/passkeys.feature +0 -66
  154. package/features/probes.feature +0 -18
  155. package/features/query.feature +0 -389
  156. package/features/realtime.feature +0 -34
  157. package/features/require.feature +0 -66
  158. package/features/response.feature +0 -103
  159. package/features/routes.feature +0 -224
  160. package/features/rpc.feature +0 -429
  161. package/features/server.feature +0 -21
  162. package/features/site/_app/immutable/asset.js +0 -1
  163. package/features/site/favicon.ico +0 -0
  164. package/features/site/index.html +0 -10
  165. package/features/steps/.env.example +0 -5
  166. package/features/steps/Captures.ts +0 -20
  167. package/features/steps/Cloudinary.ts +0 -12
  168. package/features/steps/Common.ts +0 -38
  169. package/features/steps/Components.ts +0 -115
  170. package/features/steps/Database.ts +0 -106
  171. package/features/steps/Gateway.ts +0 -239
  172. package/features/steps/HTTP.ts +0 -96
  173. package/features/steps/IDP.ts +0 -361
  174. package/features/steps/Identity.ts +0 -54
  175. package/features/steps/OTP.ts +0 -42
  176. package/features/steps/Parameters.ts +0 -162
  177. package/features/steps/Probe.ts +0 -38
  178. package/features/steps/Realtime.ts +0 -175
  179. package/features/steps/Workspace.ts +0 -48
  180. package/features/steps/components/audit/manifest.toa.yaml +0 -20
  181. package/features/steps/components/audit/operations/record.js +0 -5
  182. package/features/steps/components/echo/manifest.toa.yaml +0 -59
  183. package/features/steps/components/echo/operations/affect.js +0 -3
  184. package/features/steps/components/echo/operations/compute.js +0 -3
  185. package/features/steps/components/echo/operations/echo.js +0 -3
  186. package/features/steps/components/echo/operations/error.js +0 -7
  187. package/features/steps/components/echo/operations/identity.js +0 -3
  188. package/features/steps/components/echo/operations/parameters.js +0 -3
  189. package/features/steps/components/echo/operations/ping.js +0 -3
  190. package/features/steps/components/echo/operations/unwrap.js +0 -3
  191. package/features/steps/components/echo.beacon/manifest.toa.yaml +0 -2
  192. package/features/steps/components/echo.beacon/operations/hello.js +0 -3
  193. package/features/steps/components/greeter/manifest.toa.yaml +0 -5
  194. package/features/steps/components/greeter/operations/greet.js +0 -3
  195. package/features/steps/components/notify/manifest.toa.yaml +0 -20
  196. package/features/steps/components/notify/operations/send.js +0 -5
  197. package/features/steps/components/octets.tester/manifest.toa.yaml +0 -73
  198. package/features/steps/components/octets.tester/operations/authority.js +0 -3
  199. package/features/steps/components/octets.tester/operations/bar.js +0 -9
  200. package/features/steps/components/octets.tester/operations/baz.js +0 -9
  201. package/features/steps/components/octets.tester/operations/concat.js +0 -5
  202. package/features/steps/components/octets.tester/operations/echo.js +0 -5
  203. package/features/steps/components/octets.tester/operations/err.js +0 -14
  204. package/features/steps/components/octets.tester/operations/foo.js +0 -5
  205. package/features/steps/components/octets.tester/operations/id.js +0 -5
  206. package/features/steps/components/octets.tester/operations/identity.js +0 -5
  207. package/features/steps/components/octets.tester/operations/lenna.png +0 -0
  208. package/features/steps/components/octets.tester/operations/redirect.js +0 -17
  209. package/features/steps/components/octets.tester/operations/yex.js +0 -14
  210. package/features/steps/components/octets.tester/operations/yield.js +0 -11
  211. package/features/steps/components/orders/manifest.toa.yaml +0 -30
  212. package/features/steps/components/orders/operations/create.js +0 -7
  213. package/features/steps/components/pots/manifest.toa.yaml +0 -91
  214. package/features/steps/components/pots/migrations/0002-indexes.yaml +0 -4
  215. package/features/steps/components/pricing/manifest.toa.yaml +0 -13
  216. package/features/steps/components/pricing/operations/quote.js +0 -3
  217. package/features/steps/components/sequences/manifest.toa.yaml +0 -11
  218. package/features/steps/components/sequences/operations/numbers.js +0 -5
  219. package/features/steps/components/sequences/operations/tokens.js +0 -14
  220. package/features/steps/components/users/manifest.toa.yaml +0 -30
  221. package/features/steps/components/users/operations/create.js +0 -11
  222. package/features/steps/components/users.properties/manifest.toa.yaml +0 -22
  223. package/features/steps/map.ts +0 -30
  224. package/features/steps/tsconfig.json +0 -9
  225. package/features/streams.feature +0 -35
  226. package/features/timestamps.feature +0 -41
  227. package/features/timing.feature +0 -49
  228. package/features/tracing.feature +0 -123
  229. package/source/Branch.test.ts +0 -40
  230. package/source/Branch.ts +0 -44
  231. package/source/Composition.ts +0 -51
  232. package/source/Context.ts +0 -11
  233. package/source/Directive.test.ts +0 -199
  234. package/source/Directive.ts +0 -248
  235. package/source/Discovery/Explorer.ts +0 -34
  236. package/source/Discovery/Site.test.ts +0 -147
  237. package/source/Discovery/Site.ts +0 -202
  238. package/source/Discovery/index.ts +0 -3
  239. package/source/Discovery/tree.test.ts +0 -175
  240. package/source/Discovery/tree.ts +0 -77
  241. package/source/Discovery/trunk.ts +0 -33
  242. package/source/Endpoint.test.ts +0 -67
  243. package/source/Endpoint.ts +0 -157
  244. package/source/Factory.ts +0 -42
  245. package/source/Gateway.ts +0 -390
  246. package/source/HTTP/Context.ts +0 -143
  247. package/source/HTTP/Probe.ts +0 -99
  248. package/source/HTTP/Server.ts +0 -435
  249. package/source/HTTP/Timing.ts +0 -14
  250. package/source/HTTP/address.test.ts +0 -28
  251. package/source/HTTP/address.ts +0 -16
  252. package/source/HTTP/exceptions.ts +0 -99
  253. package/source/HTTP/formats/form.ts +0 -21
  254. package/source/HTTP/formats/index.ts +0 -36
  255. package/source/HTTP/formats/json.ts +0 -14
  256. package/source/HTTP/formats/msgpack.ts +0 -14
  257. package/source/HTTP/formats/text.ts +0 -10
  258. package/source/HTTP/formats/yaml.test.ts +0 -22
  259. package/source/HTTP/formats/yaml.ts +0 -40
  260. package/source/HTTP/index.ts +0 -6
  261. package/source/HTTP/messages.test.ts +0 -196
  262. package/source/HTTP/messages.ts +0 -186
  263. package/source/HTTP/types.ts +0 -39
  264. package/source/Interception.ts +0 -37
  265. package/source/Introspection.ts +0 -179
  266. package/source/MCP/Server.ts +0 -335
  267. package/source/MCP/discover.ts +0 -51
  268. package/source/MCP/errors.ts +0 -80
  269. package/source/MCP/index.ts +0 -1
  270. package/source/MCP/schema.test.ts +0 -91
  271. package/source/MCP/schema.ts +0 -94
  272. package/source/MCP/tools.ts +0 -144
  273. package/source/MCP/types.ts +0 -84
  274. package/source/Mapping.ts +0 -101
  275. package/source/Query.test.ts +0 -54
  276. package/source/Query.ts +0 -277
  277. package/source/RPC/Context.ts +0 -75
  278. package/source/RPC/Dispatcher.ts +0 -150
  279. package/source/RPC/errors.test.ts +0 -77
  280. package/source/RPC/errors.ts +0 -82
  281. package/source/RPC/index.ts +0 -1
  282. package/source/RPC/names.test.ts +0 -141
  283. package/source/RPC/names.ts +0 -176
  284. package/source/RPC/types.ts +0 -34
  285. package/source/RTD/Context.ts +0 -16
  286. package/source/RTD/Directives.ts +0 -126
  287. package/source/RTD/Endpoint.ts +0 -27
  288. package/source/RTD/Match.ts +0 -11
  289. package/source/RTD/Method.ts +0 -39
  290. package/source/RTD/Node.ts +0 -169
  291. package/source/RTD/Route.ts +0 -93
  292. package/source/RTD/Tree.ts +0 -137
  293. package/source/RTD/expiration.test.ts +0 -81
  294. package/source/RTD/factory.ts +0 -105
  295. package/source/RTD/index.ts +0 -8
  296. package/source/RTD/segment.test.ts +0 -35
  297. package/source/RTD/segment.ts +0 -51
  298. package/source/RTD/syntax/index.ts +0 -1
  299. package/source/RTD/walk.test.ts +0 -147
  300. package/source/Remotes.test.ts +0 -79
  301. package/source/Remotes.ts +0 -39
  302. package/source/Tenant.ts +0 -73
  303. package/source/directives/auth/Anonymous.test.ts +0 -70
  304. package/source/directives/auth/Anonymous.ts +0 -36
  305. package/source/directives/auth/Anyone.ts +0 -23
  306. package/source/directives/auth/Assert.ts +0 -43
  307. package/source/directives/auth/Authorization.test.ts +0 -24
  308. package/source/directives/auth/Authorization.ts +0 -388
  309. package/source/directives/auth/Delegate.test.ts +0 -36
  310. package/source/directives/auth/Delegate.ts +0 -54
  311. package/source/directives/auth/Echo.ts +0 -24
  312. package/source/directives/auth/Federation.ts +0 -104
  313. package/source/directives/auth/Id.ts +0 -37
  314. package/source/directives/auth/Incept.ts +0 -117
  315. package/source/directives/auth/Input.ts +0 -92
  316. package/source/directives/auth/Role.test.ts +0 -147
  317. package/source/directives/auth/Role.ts +0 -99
  318. package/source/directives/auth/Rule.ts +0 -59
  319. package/source/directives/auth/Scheme.ts +0 -31
  320. package/source/directives/auth/create.ts +0 -11
  321. package/source/directives/auth/index.ts +0 -3
  322. package/source/directives/auth/schemes.test.ts +0 -18
  323. package/source/directives/auth/schemes.ts +0 -39
  324. package/source/directives/auth/split.ts +0 -14
  325. package/source/directives/auth/types.ts +0 -75
  326. package/source/directives/cache/Cache.ts +0 -92
  327. package/source/directives/cache/Control.ts +0 -81
  328. package/source/directives/cache/Exact.ts +0 -7
  329. package/source/directives/cache/etag.ts +0 -38
  330. package/source/directives/cache/index.ts +0 -3
  331. package/source/directives/cache/types.ts +0 -9
  332. package/source/directives/cors/CORS.test.ts +0 -75
  333. package/source/directives/cors/CORS.ts +0 -88
  334. package/source/directives/cors/index.ts +0 -3
  335. package/source/directives/dev/Development.ts +0 -41
  336. package/source/directives/dev/Faulty.ts +0 -31
  337. package/source/directives/dev/Sleep.ts +0 -53
  338. package/source/directives/dev/Stub.ts +0 -14
  339. package/source/directives/dev/Throw.ts +0 -14
  340. package/source/directives/dev/index.ts +0 -3
  341. package/source/directives/dev/types.ts +0 -5
  342. package/source/directives/flow/Compose.ts +0 -98
  343. package/source/directives/flow/Fetch.ts +0 -86
  344. package/source/directives/flow/Flow.ts +0 -43
  345. package/source/directives/flow/index.ts +0 -3
  346. package/source/directives/flow/types.ts +0 -7
  347. package/source/directives/help/Family.ts +0 -122
  348. package/source/directives/help/Help.test.ts +0 -227
  349. package/source/directives/help/Help.ts +0 -47
  350. package/source/directives/help/Parameters.ts +0 -47
  351. package/source/directives/help/described.ts +0 -57
  352. package/source/directives/help/index.ts +0 -45
  353. package/source/directives/index.ts +0 -33
  354. package/source/directives/io/Directive.ts +0 -17
  355. package/source/directives/io/IO.ts +0 -118
  356. package/source/directives/io/Input.ts +0 -55
  357. package/source/directives/io/Message.ts +0 -1
  358. package/source/directives/io/Output.ts +0 -81
  359. package/source/directives/io/Status.test.ts +0 -88
  360. package/source/directives/io/Status.ts +0 -47
  361. package/source/directives/io/Throttle.ts +0 -30
  362. package/source/directives/io/index.ts +0 -3
  363. package/source/directives/io/lib/throttle/Configuration.test.ts +0 -72
  364. package/source/directives/io/lib/throttle/Configuration.ts +0 -68
  365. package/source/directives/io/lib/throttle/Keys.ts +0 -53
  366. package/source/directives/io/lib/throttle/Quotas.test.ts +0 -411
  367. package/source/directives/io/lib/throttle/Quotas.ts +0 -190
  368. package/source/directives/io/lib/throttle/Sync.test.ts +0 -163
  369. package/source/directives/io/lib/throttle/Sync.ts +0 -93
  370. package/source/directives/io/lib/throttle/Warning.test.ts +0 -32
  371. package/source/directives/io/lib/throttle/Warning.ts +0 -29
  372. package/source/directives/io/lib/throttle/components/Component.ts +0 -7
  373. package/source/directives/io/lib/throttle/components/IP.ts +0 -30
  374. package/source/directives/io/lib/throttle/components/Identity.ts +0 -19
  375. package/source/directives/io/lib/throttle/components/Path.ts +0 -8
  376. package/source/directives/io/lib/throttle/components/Route.ts +0 -19
  377. package/source/directives/io/lib/throttle/components/Segment.ts +0 -19
  378. package/source/directives/io/lib/throttle/components/index.ts +0 -19
  379. package/source/directives/io/lib/throttle/conditions/Condition.ts +0 -5
  380. package/source/directives/io/lib/throttle/conditions/Status.ts +0 -17
  381. package/source/directives/io/lib/throttle/conditions/index.ts +0 -11
  382. package/source/directives/io/lib/throttle/index.ts +0 -4
  383. package/source/directives/io/schemas.test.ts +0 -40
  384. package/source/directives/io/schemas.ts +0 -16
  385. package/source/directives/map/Authority.ts +0 -15
  386. package/source/directives/map/Buffer.ts +0 -15
  387. package/source/directives/map/Claims.ts +0 -63
  388. package/source/directives/map/Directive.ts +0 -4
  389. package/source/directives/map/Headers.ts +0 -60
  390. package/source/directives/map/Language.ts +0 -45
  391. package/source/directives/map/Languages.ts +0 -17
  392. package/source/directives/map/Map.ts +0 -85
  393. package/source/directives/map/Mapping.ts +0 -45
  394. package/source/directives/map/Properties.ts +0 -15
  395. package/source/directives/map/Segments.ts +0 -52
  396. package/source/directives/map/index.ts +0 -3
  397. package/source/directives/mcp/MCP.ts +0 -33
  398. package/source/directives/mcp/Tool.test.ts +0 -56
  399. package/source/directives/mcp/Tool.ts +0 -32
  400. package/source/directives/mcp/index.ts +0 -6
  401. package/source/directives/oauth/Discovery.ts +0 -66
  402. package/source/directives/oauth/documents.ts +0 -110
  403. package/source/directives/oauth/index.ts +0 -3
  404. package/source/directives/octets/Context.ts +0 -23
  405. package/source/directives/octets/Delete.ts +0 -96
  406. package/source/directives/octets/Directive.ts +0 -21
  407. package/source/directives/octets/Get.ts +0 -88
  408. package/source/directives/octets/Octets.ts +0 -82
  409. package/source/directives/octets/Put.ts +0 -186
  410. package/source/directives/octets/Workflow.ts +0 -60
  411. package/source/directives/octets/bytes.test.ts +0 -33
  412. package/source/directives/octets/bytes.ts +0 -18
  413. package/source/directives/octets/index.ts +0 -3
  414. package/source/directives/octets/schemas.test.ts +0 -20
  415. package/source/directives/octets/schemas.ts +0 -15
  416. package/source/directives/octets/types.ts +0 -9
  417. package/source/directives/octets/workflows/Execution.ts +0 -130
  418. package/source/directives/octets/workflows/Workflow.ts +0 -51
  419. package/source/directives/octets/workflows/index.ts +0 -1
  420. package/source/directives/require/Directive.ts +0 -5
  421. package/source/directives/require/Headers.ts +0 -19
  422. package/source/directives/require/Require.ts +0 -27
  423. package/source/directives/require/index.ts +0 -3
  424. package/source/discovery.ts +0 -1
  425. package/source/exceptions.ts +0 -47
  426. package/source/index.ts +0 -10
  427. package/source/io.ts +0 -4
  428. package/source/octets.d.ts +0 -17
  429. package/source/root.ts +0 -59
  430. package/source/service.ts +0 -95
  431. package/source/userland.ts +0 -47
  432. package/tsconfig.json +0 -13
  433. package/tsconfig.tsbuildinfo +0 -1
  434. package/ui/dist/_app/immutable/assets/0.Bl7vLmIK.css +0 -2
  435. package/ui/dist/_app/immutable/assets/2.BC0-Jhqu.css +0 -1
  436. package/ui/dist/_app/immutable/chunks/BaWe3aOV.js +0 -1
  437. package/ui/dist/_app/immutable/chunks/DjIYL2zC.js +0 -3
  438. package/ui/dist/_app/immutable/chunks/GZTfV0ks.js +0 -6
  439. package/ui/dist/_app/immutable/entry/app.D5v4JoUx.js +0 -2
  440. package/ui/dist/_app/immutable/entry/start.CWxFoIyZ.js +0 -1
  441. package/ui/dist/_app/immutable/nodes/0.DIh5T_5-.js +0 -1
  442. package/ui/dist/_app/immutable/nodes/1.CY-bFzHC.js +0 -1
  443. package/ui/dist/_app/immutable/nodes/2.6Ubd1ItY.js +0 -14
@@ -1,176 +0,0 @@
1
- import * as http from '../HTTP/index.js'
2
- import { verbs } from '../RTD/syntax/index.js'
3
- import type { Segment } from '../RTD/segment.js'
4
- import { QUERY, type Params } from './types.js'
5
-
6
- /**
7
- * What a name resolves to: the path the call is made at, and the verb it is made with.
8
- *
9
- * A name is the route template with its variables marked and the verb appended as a segment
10
- * of its own — `pots._id.GET`. The revision names the characters a tool's name may hold, and
11
- * `/` is not among them, so segments are joined by `.` — which a segment cannot hold either,
12
- * so nothing in a name can be mistaken for anything else, and the verb is always last.
13
- */
14
- export interface Address {
15
- path: string
16
- verb: string
17
-
18
- /** the `params` the path took, which are therefore not the operation's input */
19
- variables: string[]
20
- }
21
-
22
- export function address(method: string, params: Params): Address {
23
- const parts = method.split(SEPARATOR)
24
- const verb = parts.pop()!
25
-
26
- if (!verbs.has(verb)) throw new http.NotFound(`'${method}' names no method`)
27
-
28
- const variables: string[] = []
29
- const fragments: string[] = []
30
-
31
- for (const part of parts) {
32
- const key = parameter(part)
33
-
34
- if (key === null) {
35
- fragments.push(literal(part, method))
36
-
37
- continue
38
- }
39
-
40
- if (part !== TAIL && !NAMEABLE.test(key))
41
- throw new http.NotFound(`'${method}' names no procedure`)
42
-
43
- const value = params[key]
44
-
45
- if (value === undefined || value === null)
46
- throw new http.BadRequest(`'${method}' requires the parameter '${key}'`)
47
-
48
- const fragment = String(value)
49
-
50
- // `__` stands for the rest of the path and may carry separators; a variable is one segment
51
- if (!(part === TAIL ? TAILED : OPAQUE).test(fragment))
52
- throw new http.BadRequest(`The parameter '${key}' cannot be a path of its own`)
53
-
54
- variables.push(key)
55
- fragments.push(fragment)
56
- }
57
-
58
- // a route is matched with its trailing slash, and the trunk is the bare one
59
- const path = fragments.length === 0 ? '/' : `/${fragments.join('/')}/`
60
-
61
- return { path, verb, variables }
62
- }
63
-
64
- /**
65
- * What the call carries, as a request carries it: the path took its variables, `query` is
66
- * the querystring, and the rest is the body.
67
- */
68
- export function split(
69
- params: Params,
70
- variables: string[]
71
- ): { query?: Params; input?: Params } {
72
- const input: Params = {}
73
- let query: Params | undefined
74
-
75
- for (const [key, value] of Object.entries(params)) {
76
- if (variables.includes(key)) continue
77
-
78
- if (key !== QUERY) {
79
- input[key] = value
80
-
81
- continue
82
- }
83
-
84
- if (typeof value !== 'object' || value === null || Array.isArray(value))
85
- throw new http.BadRequest(`'${QUERY}' must be an object`)
86
-
87
- query = value as Params
88
- }
89
-
90
- // an absent body is what a request without one has, and the mapping fills it as it does
91
- return { query, input: Object.keys(input).length === 0 ? undefined : input }
92
- }
93
-
94
- /** The parameter a part reads, or nothing where the part is a literal segment. */
95
- function parameter(part: string): string | null {
96
- if (part === TAIL) return WILDCARD
97
-
98
- return part[0] === VARIABLE ? part.slice(1) : null
99
- }
100
-
101
- /** A segment a name cannot spell is a segment no name has, so this one names nothing. */
102
- function literal(part: string, method: string): string {
103
- if (!NAMEABLE.test(part)) throw new http.NotFound(`'${method}' names no procedure`)
104
-
105
- return part
106
- }
107
-
108
- /** The name of a method on this route, or nothing where the route has none. */
109
- export function name(segments: Segment[], verb: string): string | null {
110
- const parts: string[] = []
111
-
112
- for (const segment of segments) {
113
- const part = component(segment)
114
-
115
- if (part === null) return null
116
-
117
- parts.push(part)
118
- }
119
-
120
- parts.push(verb)
121
-
122
- return parts.join(SEPARATOR)
123
- }
124
-
125
- /** The segment that leaves a route unnameable, as it was declared, or nothing where none does. */
126
- export function refusal(segments: Segment[]): string | null {
127
- for (const segment of segments)
128
- if (component(segment) === null) return declared(segment)
129
-
130
- return null
131
- }
132
-
133
- function component(segment: Segment): string | null {
134
- if (segment.fragment !== null)
135
- return NAMEABLE.test(segment.fragment) ? segment.fragment : null
136
-
137
- if (segment.wildcard === true) return TAIL
138
-
139
- // it stands for a segment the caller cannot name, so there is nothing to substitute
140
- if (segment.placeholder === null) return null
141
-
142
- return NAMEABLE.test(segment.placeholder) ? VARIABLE + segment.placeholder : null
143
- }
144
-
145
- /** The route as it was declared, which is how a message about it should read. */
146
- export function template(segments: Segment[]): string {
147
- return '/' + segments.map(declared).join('/')
148
- }
149
-
150
- function declared(segment: Segment): string {
151
- if (segment.fragment !== null) return segment.fragment
152
-
153
- if (segment.wildcard === true) return '**'
154
-
155
- return segment.placeholder === null ? '*' : ':' + segment.placeholder
156
- }
157
-
158
- const SEPARATOR = '.'
159
- const VARIABLE = '_'
160
- const TAIL = '__'
161
-
162
- /** How the RTD names the rest of a path, wherever a parameter of it is read. */
163
- const WILDCARD = '**'
164
-
165
- /**
166
- * What a segment may hold to have a name. `_` is the convention's own, and every other
167
- * character a client leaves alone is here: a client shows a model the name with the rest
168
- * turned into `_`, and two names must not become one.
169
- */
170
- const NAMEABLE = /^[A-Za-z0-9-]+$/
171
-
172
- /** A segment ends at what divides or ends a path. */
173
- const OPAQUE = /^[^/?#]*$/
174
-
175
- /** A tail is several segments, so it keeps the divider and loses only what ends a path. */
176
- const TAILED = /^[^?#]*$/
@@ -1,34 +0,0 @@
1
- /** The version every call and every response states. */
2
- export const VERSION = '2.0'
3
-
4
- /**
5
- * The member `params` reserves for what a querystring would carry. An operation's input is
6
- * free to have an `id` or a `limit` of its own, so the two cannot share one object.
7
- */
8
- export const QUERY = 'query'
9
-
10
- export type Params = Record<string, unknown>
11
-
12
- export interface Call {
13
- jsonrpc: string
14
- method: string
15
- params?: Params
16
-
17
- /** Absent makes this a notification: it runs, and nothing is returned for it. */
18
- id?: string | number
19
- }
20
-
21
- export interface Response {
22
- jsonrpc: string
23
-
24
- /** `null` where the request was not readable enough to carry one. */
25
- id: string | number | null
26
- result?: unknown
27
- error?: Failure
28
- }
29
-
30
- export interface Failure {
31
- code: number
32
- message: string
33
- data?: unknown
34
- }
@@ -1,16 +0,0 @@
1
- import { type DirectiveFactory } from './Directives.js'
2
- import { type EndpointsFactory } from './Endpoint.js'
3
- import type { Directive } from './syntax/index.js'
4
-
5
- export interface Context<TExtension = any> {
6
- readonly protected: boolean
7
- readonly endpoints: EndpointsFactory
8
- readonly directives: {
9
- readonly factory: DirectiveFactory
10
- stack: Directive[]
11
- }
12
-
13
- /** The route being built, accumulated on the way down and restored on the way up. */
14
- path: string
15
- readonly extension: TExtension
16
- }
@@ -1,126 +0,0 @@
1
- import type { Parameter } from './Match.js'
2
- import type * as syntax from './syntax/index.js'
3
- import type { Context, OutgoingMessage, Options } from '../HTTP/index.js'
4
- import type { Output } from '../io.js'
5
- import type { Introspection } from '../Introspection.js'
6
- import type { extensions } from '@toa.io/core/types'
7
-
8
- type Host = extensions.Host
9
-
10
- export interface Directives {
11
- /**
12
- * The directives of one family on this method, or nothing where it declares none of it.
13
- * For a consumer of a declaration rather than of a stage: what a method is published as
14
- * is stated on the route, and read where the publishing happens.
15
- */
16
- declared: <T>(family: string) => T[] | undefined
17
-
18
- precall: (context: Context, parameters: Parameter[]) => Promise<Output>
19
-
20
- /** What this route's directives make of what its method says about itself. */
21
- explain: (
22
- context: Context,
23
- introspection: Introspection
24
- ) => Promise<Introspection | null>
25
- settle: (context: Context, response: OutgoingMessage) => Promise<void>
26
- dispose: () => void
27
- }
28
-
29
- export interface DirectiveFactory {
30
- create: (directives: syntax.Directive[], route: string) => Directives
31
-
32
- /** Whether this declaration is carried into the nodes below the one it is on. */
33
- inheritable: (directive: syntax.Directive) => boolean
34
-
35
- /** Runs every family's `preflight`, which is request-scoped and needs no node. */
36
- preflight: (context: Context) => Promise<void>
37
-
38
- /** Runs every family's `depart`, the counterpart of `preflight`. */
39
- depart: (context: Context, response: OutgoingMessage) => Promise<void>
40
-
41
- dispose: () => void
42
- }
43
-
44
- export interface DirectiveSet {
45
- family: DirectiveFamily
46
- directives: any[]
47
-
48
- /** qualified directive names, e.g. `auth:id` */
49
- names?: string[]
50
- }
51
-
52
- export interface DirectiveFamily<TDirective = any, TExtension = any> {
53
- readonly name: string
54
- readonly mandatory: boolean
55
-
56
- /**
57
- * Whether a declaration applies to everything below the node it is on, as every directive
58
- * does unless it says otherwise. A family that describes what one node *is* sets this
59
- * `false`: inherited, it would say the same thing of every resource under it.
60
- */
61
- readonly inherited?: boolean
62
-
63
- create: (name: string, ...rest: any[]) => TDirective
64
-
65
- /**
66
- * Called once per gateway with what the host provides and how the gateway is configured,
67
- * before any directive is created.
68
- */
69
- mount?: (host: Host, options: Options) => void
70
-
71
- /**
72
- * Puts the directives of one route in the order they must run in. Called once, when
73
- * the set is built — the order cannot depend on the request.
74
- */
75
- arrange?: (directives: TDirective[]) => void
76
-
77
- /**
78
- * Request-scoped, before anything is routed. It takes no directives: no node is known
79
- * yet, and a request that carries several calls has no single node at all. What a
80
- * directive declares is call-scoped by definition, so only what a family does on its
81
- * own behalf — authenticating a credential — belongs here. It answers nothing: a stage
82
- * that runs before a route is known has no reply to make, and refuses by throwing.
83
- */
84
- preflight?: (request: Context & TExtension) => void | Promise<void>
85
-
86
- /** Call-scoped, with what the node declares. Runs once per call. */
87
- precall?: (
88
- directives: TDirective[],
89
- request: Context & TExtension,
90
- parameters: Parameter[]
91
- ) => Output | Promise<Output>
92
-
93
- /**
94
- * What this family's directives make of what the method says about itself, which is
95
- * what `OPTIONS` answers and what a tool is described by. `null` refuses: the method
96
- * is not reachable by this caller, and is not described at all.
97
- *
98
- * There is no request here — no route variable has a value and no body has arrived, which
99
- * is why no parameters are passed — so a directive that can only tell from one hands back
100
- * what it was given.
101
- */
102
- explain?: (
103
- directives: TDirective[],
104
- request: Context & TExtension,
105
- introspection: Introspection
106
- ) => Introspection | null | Promise<Introspection | null>
107
-
108
- /** Call-scoped, on the message that call produced. */
109
- settle?: (
110
- directives: TDirective[],
111
- request: Context & TExtension,
112
- response: OutgoingMessage
113
- ) => void | Promise<void>
114
-
115
- /**
116
- * Request-scoped, on the message going back — the counterpart of `preflight`, and
117
- * likewise without directives. A reply the whole request carries, such as a re-issued
118
- * credential, is written here rather than by a call that would not own it.
119
- */
120
- depart?: (
121
- request: Context & TExtension,
122
- response: OutgoingMessage
123
- ) => void | Promise<void>
124
-
125
- dispose?: (directives: TDirective[]) => void
126
- }
@@ -1,27 +0,0 @@
1
- import { type Context } from './Context.js'
2
- import type * as http from '../HTTP/index.js'
3
- import type * as syntax from './syntax/index.js'
4
- import type * as RTD from './index.js'
5
- import type { Introspection, Schema } from '../Introspection.js'
6
-
7
- export interface Endpoint {
8
- call: (
9
- context: http.Context,
10
- parameters: RTD.Parameter[]
11
- ) => Promise<http.OutgoingMessage>
12
-
13
- explain: (parameters: RTD.Parameter[]) => Promise<Introspection>
14
-
15
- /**
16
- * What picks the records a call is about — `criteria`, `sort` and the rest. Not part of
17
- * what the resource says about itself: it is the same of every queryable one. A
18
- * procedure carries it, because there it is something the caller sends.
19
- */
20
- selection: () => Record<string, Schema> | null
21
-
22
- close: () => Promise<void>
23
- }
24
-
25
- export interface EndpointsFactory {
26
- create: (method: syntax.Method, context: Context) => Endpoint
27
- }
@@ -1,11 +0,0 @@
1
- import { type Node } from './Node.js'
2
-
3
- export interface Match {
4
- node: Node
5
- parameters: Parameter[]
6
- }
7
-
8
- export interface Parameter {
9
- name: string
10
- value: string
11
- }
@@ -1,39 +0,0 @@
1
- import type { Parameter } from './Match.js'
2
- import type { Endpoint } from './Endpoint.js'
3
- import type { Directives } from './Directives.js'
4
- import type { Context } from '../HTTP/index.js'
5
- import { order } from '../Introspection.js'
6
- import type { Introspection } from '../Introspection.js'
7
-
8
- export class Method {
9
- public readonly endpoint: Endpoint | null
10
- public readonly directives: Directives
11
-
12
- public constructor(endpoint: Endpoint | null, directives: Directives) {
13
- this.endpoint = endpoint
14
- this.directives = directives
15
- }
16
-
17
- /**
18
- * What this method says about itself, as its directives leave it, or nothing where they
19
- * refuse this caller. A method of no endpoint — one a directive answers on its own —
20
- * states nothing of its own, and its directives still have their say.
21
- */
22
- public async explain(
23
- context: Context,
24
- parameters: Parameter[]
25
- ): Promise<Introspection | null> {
26
- const introspection =
27
- this.endpoint === null ? {} : await this.endpoint.explain(parameters)
28
-
29
- const described = await this.directives.explain(context, introspection)
30
-
31
- return described === null ? null : order(described)
32
- }
33
-
34
- public async close(): Promise<void> {
35
- await this.endpoint?.close()
36
- }
37
- }
38
-
39
- export type Methods = Record<string, Method>
@@ -1,169 +0,0 @@
1
- import { type Route } from './Route.js'
2
- import { type Method, type Methods } from './Method.js'
3
- import { type Match, type Parameter } from './Match.js'
4
- import type { Segment } from './segment.js'
5
- import type { Context } from '../HTTP/index.js'
6
- import { guarded, resource, type Described } from '../directives/help/index.js'
7
- import type { Introspection } from '../Introspection.js'
8
-
9
- export class Node {
10
- public intermediate: boolean
11
- public forward: string | null
12
- public expiration: number
13
- public methods: Methods
14
- private readonly protected: boolean
15
- private routes: Route[]
16
-
17
- public constructor(routes: Route[], methods: Methods, properties: Properties) {
18
- this.routes = routes
19
- this.methods = methods
20
- this.protected = properties.protected
21
- this.forward = properties.forward ?? null
22
- this.expiration = properties.expiration ?? Infinity
23
- this.intermediate = this.routes.findIndex((route) => route.root) !== -1
24
-
25
- this.sort()
26
- }
27
-
28
- public match(fragments: string[], parameters: Parameter[] = []): Match | null {
29
- // a route only pushes, so what a failed one added is cut off rather than the array copied
30
- const mark = parameters.length
31
-
32
- for (const route of this.routes) {
33
- const match = route.match(fragments, parameters)
34
-
35
- if (match !== null) return match
36
-
37
- parameters.length = mark
38
- }
39
-
40
- return null
41
- }
42
-
43
- /**
44
- * Returns the nodes the merged branch has landed on, so that its expiration
45
- * can later be extended without rebuilding anything.
46
- */
47
- public merge(node: Node): Node[] {
48
- this.intermediate = node.intermediate
49
-
50
- const nodes = this.protected ? this.append(node) : this.replace(node)
51
-
52
- this.sort()
53
-
54
- return nodes
55
- }
56
-
57
- public touch(expiration: number): void {
58
- if (!this.protected) this.expiration = expiration
59
- }
60
-
61
- /**
62
- * Every method under this node, with the template it answers at.
63
- *
64
- * An intermediate node is skipped: it is never what a path matches, because its `/` route
65
- * answers at the same place and is reached instead. The trunk is the exception `match`
66
- * makes for it — `'/'` answers the trunk itself, whatever it holds.
67
- */
68
- public *walk(segments: Segment[], trunk = false): Generator<Mount> {
69
- if (trunk || !this.intermediate)
70
- for (const [verb, method] of Object.entries(this.methods))
71
- yield { segments, verb, method }
72
-
73
- for (const route of this.routes) yield* route.walk(segments)
74
- }
75
-
76
- /**
77
- * What this resource is, and every method of it this caller may reach, in the order they
78
- * were declared. The two are answered apart because only the methods are `Allow`.
79
- */
80
- public async explain(context: Context, parameters: Parameter[]): Promise<Explained> {
81
- const entries = Object.entries(this.methods)
82
-
83
- const explained = await Promise.all(
84
- entries.map(async ([, method]) => await method.explain(context, parameters))
85
- )
86
-
87
- const methods: Record<string, Introspection> = {}
88
-
89
- for (let i = 0; i < entries.length; i++)
90
- if (explained[i] !== null) methods[entries[i][0]] = explained[i]!
91
-
92
- // every method of a node carries the same declaration, so the first that is there says it
93
- const stated = entries.length === 0 ? null : resource(entries[0][1].directives)
94
- const described = { ...stated, ...guarded(methods) }
95
-
96
- return {
97
- described: Object.keys(described).length === 0 ? null : described,
98
- methods
99
- }
100
- }
101
-
102
- private replace(node: Node): Node[] {
103
- const methods = Object.values(this.methods)
104
-
105
- this.routes = node.routes
106
- this.methods = node.methods
107
- this.expiration = node.expiration
108
- this.forward = node.forward
109
-
110
- // race condition is really unlikely
111
- for (const method of methods) void method.close()
112
-
113
- return this.nodes()
114
- }
115
-
116
- private append(node: Node): Node[] {
117
- const nodes: Node[] = []
118
-
119
- for (const route of node.routes) nodes.push(...this.route(route))
120
-
121
- for (const [verb, method] of Object.entries(node.methods)) this.methods[verb] = method
122
-
123
- return nodes
124
- }
125
-
126
- private route(candidate: Route): Node[] {
127
- for (const route of this.routes)
128
- if (candidate.equals(route)) return route.merge(candidate)
129
-
130
- this.routes.push(candidate)
131
-
132
- return candidate.node.nodes()
133
- }
134
-
135
- private nodes(): Node[] {
136
- const nodes: Node[] = [this]
137
-
138
- for (const route of this.routes) nodes.push(...route.node.nodes())
139
-
140
- return nodes
141
- }
142
-
143
- private sort(): void {
144
- this.routes.sort((a, b) => {
145
- return a.variables === b.variables
146
- ? b.segments.length - a.segments.length // routes with more segments should be matched first
147
- : a.variables - b.variables // routes with more variables should be matched last
148
- })
149
- }
150
- }
151
-
152
- /** What a resource says of itself, and what it serves. */
153
- export interface Explained {
154
- described: Described | null
155
- methods: Record<string, Introspection>
156
- }
157
-
158
- /** A method, and the route template it is reached by. */
159
- export interface Mount {
160
- segments: Segment[]
161
- verb: string
162
- method: Method
163
- }
164
-
165
- export interface Properties {
166
- protected: boolean
167
- forward?: string
168
- expiration?: number
169
- }
@@ -1,93 +0,0 @@
1
- import { type Segment } from './segment.js'
2
- import { type Match, type Parameter } from './Match.js'
3
- import type { Mount, Node } from './Node.js'
4
-
5
- export class Route {
6
- public readonly root: boolean
7
- public readonly variables: number = 0
8
- public readonly segments: Segment[]
9
- public readonly node: Node
10
- private readonly wildcard: boolean = false
11
-
12
- public constructor(segments: Segment[], node: Node) {
13
- this.root = segments.length === 0
14
- this.segments = segments
15
- this.node = node
16
-
17
- for (const segment of segments)
18
- if (segment.fragment === null) {
19
- this.variables++
20
- this.wildcard ||= segment.wildcard === true
21
- }
22
- }
23
-
24
- public match(fragments: string[], parameters: Parameter[]): Match | null {
25
- if (Date.now() >= this.node.expiration) return null
26
-
27
- for (let i = 0; i < this.segments.length; i++) {
28
- const segment = this.segments[i]
29
-
30
- if (segment.fragment !== null && segment.fragment !== fragments[i]) return null
31
-
32
- if (segment.fragment === null && segment.placeholder !== null)
33
- parameters.push({ name: segment.placeholder, value: decode(fragments[i]) })
34
-
35
- if (segment.fragment === null && segment.wildcard === true)
36
- parameters.push({
37
- name: '**',
38
- value: fragments
39
- .slice(this.segments.length - 1)
40
- .map(decode)
41
- .join('/')
42
- })
43
- }
44
-
45
- const exact = this.segments.length === fragments.length
46
-
47
- if ((exact && !this.node.intermediate) || this.wildcard)
48
- return { node: this.node, parameters }
49
- else return this.matchNested(fragments, parameters)
50
- }
51
-
52
- public *walk(prefix: Segment[]): Generator<Mount> {
53
- // an expired branch is not matched, so nothing under it is reachable to name
54
- if (Date.now() >= this.node.expiration) return
55
-
56
- yield* this.node.walk(prefix.concat(this.segments))
57
- }
58
-
59
- public equals(route: Route): boolean {
60
- if (route.segments.length !== this.segments.length) return false
61
-
62
- for (let i = 0; i < this.segments.length; i++)
63
- if (this.segments[i].fragment !== route.segments[i].fragment) return false
64
-
65
- return true
66
- }
67
-
68
- public merge(route: Route): Node[] {
69
- return this.node.merge(route.node)
70
- }
71
-
72
- private matchNested(fragments: string[], parameters: Parameter[]): Match | null {
73
- fragments = fragments.slice(this.segments.length)
74
-
75
- return this.node.match(fragments, parameters)
76
- }
77
- }
78
-
79
- /**
80
- * What the segment says, rather than how it was written: a value is percent-encoded to
81
- * survive the path, and an operation reads what a caller meant — a `client_id` that is a
82
- * URL arrives as one. A literal segment is matched as written, which is how it is declared.
83
- *
84
- * An escape that decodes to nothing valid is left as it stands; refusing the route over it
85
- * would answer `404` to a request whose only fault is its spelling.
86
- */
87
- function decode(fragment: string): string {
88
- try {
89
- return decodeURIComponent(fragment)
90
- } catch {
91
- return fragment
92
- }
93
- }