@toa.io/extensions.exposition 1.0.0-alpha.291 → 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 (526) 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 +25 -13
  6. package/transpiled/Discovery/Explorer.js +1 -1
  7. package/transpiled/Discovery/Explorer.js.map +1 -1
  8. package/transpiled/Discovery/Site.js +1 -1
  9. package/transpiled/Discovery/Site.js.map +1 -1
  10. package/transpiled/Discovery/trunk.js +1 -1
  11. package/transpiled/Discovery/trunk.js.map +1 -1
  12. package/transpiled/Endpoint.js +3 -0
  13. package/transpiled/Endpoint.js.map +1 -1
  14. package/transpiled/Factory.js +1 -1
  15. package/transpiled/Factory.js.map +1 -1
  16. package/transpiled/Gateway.js +1 -1
  17. package/transpiled/Gateway.js.map +1 -1
  18. package/transpiled/HTTP/Server.d.ts +1 -1
  19. package/transpiled/HTTP/Server.js +1 -1
  20. package/transpiled/HTTP/Server.js.map +1 -1
  21. package/transpiled/Introspection.d.ts +6 -0
  22. package/transpiled/Introspection.js +1 -0
  23. package/transpiled/Introspection.js.map +1 -1
  24. package/transpiled/MCP/Server.d.ts +1 -1
  25. package/transpiled/MCP/Server.js +1 -1
  26. package/transpiled/MCP/Server.js.map +1 -1
  27. package/transpiled/MCP/discover.d.ts +1 -1
  28. package/transpiled/MCP/schema.js +2 -2
  29. package/transpiled/Query.d.ts +2 -12
  30. package/transpiled/Query.js +3 -13
  31. package/transpiled/Query.js.map +1 -1
  32. package/transpiled/RPC/Dispatcher.d.ts +1 -1
  33. package/transpiled/RPC/Dispatcher.js +2 -2
  34. package/transpiled/RPC/Dispatcher.js.map +1 -1
  35. package/transpiled/RTD/Endpoint.d.ts +2 -3
  36. package/transpiled/RTD/Tree.js +1 -1
  37. package/transpiled/RTD/Tree.js.map +1 -1
  38. package/transpiled/RTD/factory.js +1 -1
  39. package/transpiled/RTD/factory.js.map +1 -1
  40. package/transpiled/RTD/syntax/index.d.ts +1 -2
  41. package/transpiled/RTD/syntax/index.js +1 -2
  42. package/transpiled/RTD/syntax/index.js.map +1 -1
  43. package/transpiled/Tenant.js +1 -1
  44. package/transpiled/Tenant.js.map +1 -1
  45. package/transpiled/directives/auth/Authorization.js +1 -1
  46. package/transpiled/directives/auth/Authorization.js.map +1 -1
  47. package/transpiled/directives/io/IO.js +1 -1
  48. package/transpiled/directives/io/IO.js.map +1 -1
  49. package/transpiled/directives/oauth/documents.d.ts +1 -1
  50. package/transpiled/index.d.ts +0 -2
  51. package/transpiled/index.js +0 -2
  52. package/transpiled/index.js.map +1 -1
  53. package/transpiled/service.js +1 -1
  54. package/transpiled/service.js.map +1 -1
  55. package/ui/dist/_app/immutable/assets/0.Cu0AnR_8.css +2 -0
  56. package/ui/dist/_app/immutable/assets/2.BghF56l_.css +1 -0
  57. package/ui/dist/_app/immutable/assets/ui.C8aD6zzF.css +1 -0
  58. package/ui/dist/_app/immutable/chunks/B8GvXrmq.js +1 -0
  59. package/ui/dist/_app/immutable/chunks/BVDJTrf4.js +3 -0
  60. package/ui/dist/_app/immutable/chunks/D6q28_Ok.js +86 -0
  61. package/ui/dist/_app/immutable/chunks/{D9tE1yyO.js → DVlaUfVU.js} +1 -1
  62. package/ui/dist/_app/immutable/chunks/DpB73ZB6.js +6 -0
  63. package/ui/dist/_app/immutable/entry/app.CTava8yn.js +2 -0
  64. package/ui/dist/_app/immutable/entry/start.yWN0gSLA.js +1 -0
  65. package/ui/dist/_app/immutable/nodes/0.HKRDBYrC.js +1 -0
  66. package/ui/dist/_app/immutable/nodes/1.CLa0ydOi.js +1 -0
  67. package/ui/dist/_app/immutable/nodes/2.C9Kaym8C.js +8 -0
  68. package/ui/dist/_app/immutable/nodes/3.C1X4_rXZ.js +1 -0
  69. package/ui/dist/_app/immutable/nodes/4.DdzDIi9E.js +1 -0
  70. package/ui/dist/_app/immutable/nodes/5.DpbmCMdw.js +1 -0
  71. package/ui/dist/_app/version.json +1 -1
  72. package/ui/dist/index.html +12 -12
  73. package/CHANGELOG.md +0 -35
  74. package/components/identity.bans/tsconfig.tsbuildinfo +0 -1
  75. package/components/identity.basic/source/lib/credentials.test.ts +0 -18
  76. package/components/identity.basic/tsconfig.tsbuildinfo +0 -1
  77. package/components/identity.clients/source/lib/canonical.test.ts +0 -43
  78. package/components/identity.clients/source/lib/cimd.test.ts +0 -122
  79. package/components/identity.clients/source/lib/redirect.test.ts +0 -47
  80. package/components/identity.clients/tsconfig.tsbuildinfo +0 -1
  81. package/components/identity.credentials/source/list.test.ts +0 -70
  82. package/components/identity.credentials/tsconfig.tsbuildinfo +0 -1
  83. package/components/identity.federation/source/lib/discovery.test.ts +0 -60
  84. package/components/identity.federation/source/list.test.ts +0 -41
  85. package/components/identity.federation/tsconfig.tsbuildinfo +0 -1
  86. package/components/identity.grants/tsconfig.tsbuildinfo +0 -1
  87. package/components/identity.keys/tsconfig.tsbuildinfo +0 -1
  88. package/components/identity.otp/tsconfig.tsbuildinfo +0 -1
  89. package/components/identity.passkeys/source/errors.test.ts +0 -34
  90. package/components/identity.passkeys/source/webauthn.test.ts +0 -26
  91. package/components/identity.passkeys/tsconfig.tsbuildinfo +0 -1
  92. package/components/identity.roles/tsconfig.tsbuildinfo +0 -1
  93. package/components/identity.tokens/source/authenticate.test.ts +0 -112
  94. package/components/identity.tokens/source/decrypt.test.ts +0 -216
  95. package/components/identity.tokens/source/encrypt.test.ts +0 -150
  96. package/components/identity.tokens/source/issue.test.ts +0 -73
  97. package/components/identity.tokens/source/lib/form.test.ts +0 -25
  98. package/components/identity.tokens/source/lib/paseto.test.ts +0 -62
  99. package/components/identity.tokens/tsconfig.tsbuildinfo +0 -1
  100. package/context.toa.yaml +0 -31
  101. package/cucumber.mjs +0 -7
  102. package/documentation/.assets/ia3-dark.jpg +0 -0
  103. package/documentation/.assets/ia3-light.jpg +0 -0
  104. package/documentation/.assets/overview-dark.jpg +0 -0
  105. package/documentation/.assets/overview-light.jpg +0 -0
  106. package/documentation/.assets/role-scopes-dark.jpg +0 -0
  107. package/documentation/.assets/role-scopes-light.jpg +0 -0
  108. package/documentation/.assets/rtd-dark.jpg +0 -0
  109. package/documentation/.assets/rtd-light.jpg +0 -0
  110. package/documentation/access.md +0 -350
  111. package/documentation/authorities.md +0 -51
  112. package/documentation/cache.md +0 -72
  113. package/documentation/components.md +0 -472
  114. package/documentation/consent.md +0 -101
  115. package/documentation/credentials.md +0 -88
  116. package/documentation/dev.md +0 -30
  117. package/documentation/discovery.md +0 -81
  118. package/documentation/flow.md +0 -44
  119. package/documentation/help.md +0 -122
  120. package/documentation/identity.md +0 -304
  121. package/documentation/introspection.md +0 -123
  122. package/documentation/io.md +0 -167
  123. package/documentation/ip.md +0 -24
  124. package/documentation/map.md +0 -123
  125. package/documentation/mcp.md +0 -183
  126. package/documentation/notes/desync.jpg +0 -0
  127. package/documentation/notes/peers.md +0 -59
  128. package/documentation/notes/sse.md +0 -71
  129. package/documentation/notes/throttling.md +0 -122
  130. package/documentation/oauth.md +0 -180
  131. package/documentation/octets.md +0 -334
  132. package/documentation/passkeys.md +0 -11
  133. package/documentation/protocol.md +0 -120
  134. package/documentation/query.md +0 -324
  135. package/documentation/require.md +0 -15
  136. package/documentation/rpc.md +0 -154
  137. package/documentation/tracing.md +0 -70
  138. package/documentation/tree.md +0 -199
  139. package/features/access.feature +0 -596
  140. package/features/annotation.feature +0 -32
  141. package/features/auth.assert.feature +0 -55
  142. package/features/auth.bearer.feature +0 -120
  143. package/features/auth.claims.feature +0 -171
  144. package/features/auth.incept.feature +0 -166
  145. package/features/auth.input.feature +0 -59
  146. package/features/authorities.basic.feature +0 -141
  147. package/features/authorities.feature +0 -71
  148. package/features/authorities.federation.feature +0 -100
  149. package/features/authorities.tokens.feature +0 -117
  150. package/features/body.feature +0 -76
  151. package/features/cache.feature +0 -368
  152. package/features/configuration.feature +0 -206
  153. package/features/cors.feature +0 -127
  154. package/features/credentials.feature +0 -106
  155. package/features/debug.feature +0 -34
  156. package/features/dev.feature +0 -90
  157. package/features/directives.feature +0 -61
  158. package/features/discovery.feature +0 -213
  159. package/features/discovery.ui.feature +0 -213
  160. package/features/dynamic.feature +0 -192
  161. package/features/errors.feature +0 -258
  162. package/features/etag.feature +0 -239
  163. package/features/flow.feature +0 -148
  164. package/features/help.feature +0 -512
  165. package/features/identity.bans.feature +0 -200
  166. package/features/identity.basic.feature +0 -666
  167. package/features/identity.feature +0 -240
  168. package/features/identity.federation.feature +0 -396
  169. package/features/identity.otp.feature +0 -142
  170. package/features/identity.roles.feature +0 -568
  171. package/features/identity.tokens.custom.feature +0 -430
  172. package/features/identity.tokens.feature +0 -131
  173. package/features/interruptions.feature +0 -20
  174. package/features/introspection.feature +0 -565
  175. package/features/introspection.map.feature +0 -108
  176. package/features/io.feature +0 -204
  177. package/features/io.throttle.feature +0 -166
  178. package/features/map.feature +0 -360
  179. package/features/mcp.feature +0 -753
  180. package/features/methods.feature +0 -48
  181. package/features/oauth.clients.feature +0 -195
  182. package/features/oauth.discovery.feature +0 -164
  183. package/features/oauth.grants.feature +0 -301
  184. package/features/octets.cloudinary.feature +0 -233
  185. package/features/octets.download.feature +0 -194
  186. package/features/octets.entries.feature +0 -83
  187. package/features/octets.feature +0 -306
  188. package/features/octets.head.feature +0 -40
  189. package/features/octets.location.feature +0 -83
  190. package/features/octets.meta.feature +0 -117
  191. package/features/octets.workflows.feature +0 -565
  192. package/features/passkeys.feature +0 -66
  193. package/features/probes.feature +0 -18
  194. package/features/query.feature +0 -389
  195. package/features/realtime.feature +0 -34
  196. package/features/require.feature +0 -66
  197. package/features/response.feature +0 -103
  198. package/features/routes.feature +0 -224
  199. package/features/rpc.feature +0 -429
  200. package/features/server.feature +0 -21
  201. package/features/site/_app/immutable/asset.js +0 -1
  202. package/features/site/favicon.ico +0 -0
  203. package/features/site/index.html +0 -10
  204. package/features/steps/.env.example +0 -5
  205. package/features/steps/Captures.ts +0 -20
  206. package/features/steps/Cloudinary.ts +0 -12
  207. package/features/steps/Common.ts +0 -38
  208. package/features/steps/Components.ts +0 -115
  209. package/features/steps/Database.ts +0 -106
  210. package/features/steps/Gateway.ts +0 -240
  211. package/features/steps/HTTP.ts +0 -96
  212. package/features/steps/IDP.ts +0 -361
  213. package/features/steps/Identity.ts +0 -54
  214. package/features/steps/OTP.ts +0 -42
  215. package/features/steps/Parameters.ts +0 -162
  216. package/features/steps/Probe.ts +0 -38
  217. package/features/steps/Realtime.ts +0 -175
  218. package/features/steps/Workspace.ts +0 -48
  219. package/features/steps/components/audit/manifest.toa.yaml +0 -20
  220. package/features/steps/components/audit/operations/record.js +0 -5
  221. package/features/steps/components/echo/manifest.toa.yaml +0 -59
  222. package/features/steps/components/echo/operations/affect.js +0 -3
  223. package/features/steps/components/echo/operations/compute.js +0 -3
  224. package/features/steps/components/echo/operations/echo.js +0 -3
  225. package/features/steps/components/echo/operations/error.js +0 -7
  226. package/features/steps/components/echo/operations/identity.js +0 -3
  227. package/features/steps/components/echo/operations/parameters.js +0 -3
  228. package/features/steps/components/echo/operations/ping.js +0 -3
  229. package/features/steps/components/echo/operations/unwrap.js +0 -3
  230. package/features/steps/components/echo.beacon/manifest.toa.yaml +0 -2
  231. package/features/steps/components/echo.beacon/operations/hello.js +0 -3
  232. package/features/steps/components/greeter/manifest.toa.yaml +0 -5
  233. package/features/steps/components/greeter/operations/greet.js +0 -3
  234. package/features/steps/components/notify/manifest.toa.yaml +0 -20
  235. package/features/steps/components/notify/operations/send.js +0 -5
  236. package/features/steps/components/octets.tester/manifest.toa.yaml +0 -73
  237. package/features/steps/components/octets.tester/operations/authority.js +0 -3
  238. package/features/steps/components/octets.tester/operations/bar.js +0 -9
  239. package/features/steps/components/octets.tester/operations/baz.js +0 -9
  240. package/features/steps/components/octets.tester/operations/concat.js +0 -5
  241. package/features/steps/components/octets.tester/operations/echo.js +0 -5
  242. package/features/steps/components/octets.tester/operations/err.js +0 -14
  243. package/features/steps/components/octets.tester/operations/foo.js +0 -5
  244. package/features/steps/components/octets.tester/operations/id.js +0 -5
  245. package/features/steps/components/octets.tester/operations/identity.js +0 -5
  246. package/features/steps/components/octets.tester/operations/lenna.png +0 -0
  247. package/features/steps/components/octets.tester/operations/redirect.js +0 -17
  248. package/features/steps/components/octets.tester/operations/yex.js +0 -14
  249. package/features/steps/components/octets.tester/operations/yield.js +0 -11
  250. package/features/steps/components/orders/manifest.toa.yaml +0 -30
  251. package/features/steps/components/orders/operations/create.js +0 -7
  252. package/features/steps/components/pots/manifest.toa.yaml +0 -91
  253. package/features/steps/components/pots/migrations/0002-indexes.yaml +0 -4
  254. package/features/steps/components/pricing/manifest.toa.yaml +0 -13
  255. package/features/steps/components/pricing/operations/quote.js +0 -3
  256. package/features/steps/components/sequences/manifest.toa.yaml +0 -11
  257. package/features/steps/components/sequences/operations/numbers.js +0 -5
  258. package/features/steps/components/sequences/operations/tokens.js +0 -14
  259. package/features/steps/components/users/manifest.toa.yaml +0 -30
  260. package/features/steps/components/users/operations/create.js +0 -11
  261. package/features/steps/components/users.properties/manifest.toa.yaml +0 -22
  262. package/features/steps/map.ts +0 -30
  263. package/features/steps/tsconfig.json +0 -9
  264. package/features/streams.feature +0 -35
  265. package/features/timestamps.feature +0 -41
  266. package/features/timing.feature +0 -49
  267. package/features/tracing.feature +0 -123
  268. package/schemas/annotation.cos.yaml +0 -125
  269. package/schemas/call.cos.yaml +0 -18
  270. package/schemas/directive.cos.yaml +0 -7
  271. package/schemas/method.cos.yaml +0 -23
  272. package/schemas/node.cos.yaml +0 -22
  273. package/schemas/query.cos.yaml +0 -31
  274. package/schemas/querystring.cos.yaml +0 -19
  275. package/schemas/range.cos.yaml +0 -10
  276. package/schemas/route.cos.yaml +0 -6
  277. package/source/Annotation.ts +0 -89
  278. package/source/Branch.test.ts +0 -40
  279. package/source/Branch.ts +0 -44
  280. package/source/Composition.ts +0 -51
  281. package/source/Context.ts +0 -11
  282. package/source/Directive.test.ts +0 -199
  283. package/source/Directive.ts +0 -248
  284. package/source/Discovery/Explorer.ts +0 -34
  285. package/source/Discovery/Site.test.ts +0 -147
  286. package/source/Discovery/Site.ts +0 -202
  287. package/source/Discovery/index.ts +0 -3
  288. package/source/Discovery/tree.test.ts +0 -175
  289. package/source/Discovery/tree.ts +0 -77
  290. package/source/Discovery/trunk.ts +0 -33
  291. package/source/Endpoint.test.ts +0 -67
  292. package/source/Endpoint.ts +0 -157
  293. package/source/Factory.ts +0 -42
  294. package/source/Gateway.ts +0 -390
  295. package/source/HTTP/Context.ts +0 -143
  296. package/source/HTTP/Probe.ts +0 -99
  297. package/source/HTTP/Server.ts +0 -430
  298. package/source/HTTP/Timing.ts +0 -14
  299. package/source/HTTP/address.test.ts +0 -28
  300. package/source/HTTP/address.ts +0 -16
  301. package/source/HTTP/exceptions.ts +0 -99
  302. package/source/HTTP/formats/form.ts +0 -21
  303. package/source/HTTP/formats/index.ts +0 -36
  304. package/source/HTTP/formats/json.ts +0 -14
  305. package/source/HTTP/formats/msgpack.ts +0 -14
  306. package/source/HTTP/formats/text.ts +0 -10
  307. package/source/HTTP/formats/yaml.test.ts +0 -22
  308. package/source/HTTP/formats/yaml.ts +0 -40
  309. package/source/HTTP/index.ts +0 -6
  310. package/source/HTTP/messages.test.ts +0 -196
  311. package/source/HTTP/messages.ts +0 -186
  312. package/source/HTTP/types.ts +0 -39
  313. package/source/Interception.ts +0 -37
  314. package/source/Introspection.ts +0 -179
  315. package/source/MCP/Server.ts +0 -335
  316. package/source/MCP/discover.ts +0 -51
  317. package/source/MCP/errors.ts +0 -80
  318. package/source/MCP/index.ts +0 -1
  319. package/source/MCP/schema.test.ts +0 -91
  320. package/source/MCP/schema.ts +0 -94
  321. package/source/MCP/tools.ts +0 -144
  322. package/source/MCP/types.ts +0 -84
  323. package/source/Mapping.ts +0 -101
  324. package/source/Query.test.ts +0 -54
  325. package/source/Query.ts +0 -277
  326. package/source/RPC/Context.ts +0 -75
  327. package/source/RPC/Dispatcher.ts +0 -150
  328. package/source/RPC/errors.test.ts +0 -77
  329. package/source/RPC/errors.ts +0 -82
  330. package/source/RPC/index.ts +0 -1
  331. package/source/RPC/names.test.ts +0 -141
  332. package/source/RPC/names.ts +0 -176
  333. package/source/RPC/types.ts +0 -34
  334. package/source/RTD/Context.ts +0 -16
  335. package/source/RTD/Directives.ts +0 -126
  336. package/source/RTD/Endpoint.ts +0 -27
  337. package/source/RTD/Match.ts +0 -11
  338. package/source/RTD/Method.ts +0 -39
  339. package/source/RTD/Node.ts +0 -169
  340. package/source/RTD/Route.ts +0 -93
  341. package/source/RTD/Tree.ts +0 -137
  342. package/source/RTD/expiration.test.ts +0 -81
  343. package/source/RTD/factory.ts +0 -105
  344. package/source/RTD/index.ts +0 -8
  345. package/source/RTD/segment.test.ts +0 -35
  346. package/source/RTD/segment.ts +0 -51
  347. package/source/RTD/syntax/index.ts +0 -2
  348. package/source/RTD/syntax/parse.test.ts +0 -196
  349. package/source/RTD/syntax/parse.ts +0 -171
  350. package/source/RTD/syntax/types.ts +0 -69
  351. package/source/RTD/walk.test.ts +0 -147
  352. package/source/Remotes.test.ts +0 -79
  353. package/source/Remotes.ts +0 -39
  354. package/source/Tenant.ts +0 -73
  355. package/source/const.ts +0 -45
  356. package/source/deployment.ts +0 -96
  357. package/source/directives/auth/Anonymous.test.ts +0 -70
  358. package/source/directives/auth/Anonymous.ts +0 -36
  359. package/source/directives/auth/Anyone.ts +0 -23
  360. package/source/directives/auth/Assert.ts +0 -43
  361. package/source/directives/auth/Authorization.test.ts +0 -24
  362. package/source/directives/auth/Authorization.ts +0 -388
  363. package/source/directives/auth/Delegate.test.ts +0 -36
  364. package/source/directives/auth/Delegate.ts +0 -54
  365. package/source/directives/auth/Echo.ts +0 -24
  366. package/source/directives/auth/Federation.ts +0 -104
  367. package/source/directives/auth/Id.ts +0 -37
  368. package/source/directives/auth/Incept.ts +0 -117
  369. package/source/directives/auth/Input.ts +0 -92
  370. package/source/directives/auth/Role.test.ts +0 -147
  371. package/source/directives/auth/Role.ts +0 -99
  372. package/source/directives/auth/Rule.ts +0 -59
  373. package/source/directives/auth/Scheme.ts +0 -31
  374. package/source/directives/auth/create.ts +0 -11
  375. package/source/directives/auth/index.ts +0 -3
  376. package/source/directives/auth/schemes.test.ts +0 -18
  377. package/source/directives/auth/schemes.ts +0 -39
  378. package/source/directives/auth/split.ts +0 -14
  379. package/source/directives/auth/types.ts +0 -75
  380. package/source/directives/cache/Cache.ts +0 -92
  381. package/source/directives/cache/Control.ts +0 -81
  382. package/source/directives/cache/Exact.ts +0 -7
  383. package/source/directives/cache/etag.ts +0 -38
  384. package/source/directives/cache/index.ts +0 -3
  385. package/source/directives/cache/types.ts +0 -9
  386. package/source/directives/cors/CORS.test.ts +0 -75
  387. package/source/directives/cors/CORS.ts +0 -88
  388. package/source/directives/cors/index.ts +0 -3
  389. package/source/directives/dev/Development.ts +0 -41
  390. package/source/directives/dev/Faulty.ts +0 -31
  391. package/source/directives/dev/Sleep.ts +0 -53
  392. package/source/directives/dev/Stub.ts +0 -14
  393. package/source/directives/dev/Throw.ts +0 -14
  394. package/source/directives/dev/index.ts +0 -3
  395. package/source/directives/dev/types.ts +0 -5
  396. package/source/directives/flow/Compose.ts +0 -98
  397. package/source/directives/flow/Fetch.ts +0 -86
  398. package/source/directives/flow/Flow.ts +0 -43
  399. package/source/directives/flow/index.ts +0 -3
  400. package/source/directives/flow/types.ts +0 -7
  401. package/source/directives/help/Family.ts +0 -122
  402. package/source/directives/help/Help.test.ts +0 -227
  403. package/source/directives/help/Help.ts +0 -47
  404. package/source/directives/help/Parameters.ts +0 -47
  405. package/source/directives/help/described.ts +0 -57
  406. package/source/directives/help/index.ts +0 -45
  407. package/source/directives/index.ts +0 -33
  408. package/source/directives/io/Directive.ts +0 -17
  409. package/source/directives/io/IO.ts +0 -118
  410. package/source/directives/io/Input.ts +0 -55
  411. package/source/directives/io/Message.ts +0 -1
  412. package/source/directives/io/Output.ts +0 -81
  413. package/source/directives/io/Status.test.ts +0 -88
  414. package/source/directives/io/Status.ts +0 -47
  415. package/source/directives/io/Throttle.ts +0 -30
  416. package/source/directives/io/index.ts +0 -3
  417. package/source/directives/io/lib/throttle/Configuration.test.ts +0 -72
  418. package/source/directives/io/lib/throttle/Configuration.ts +0 -68
  419. package/source/directives/io/lib/throttle/Keys.ts +0 -53
  420. package/source/directives/io/lib/throttle/Quotas.test.ts +0 -411
  421. package/source/directives/io/lib/throttle/Quotas.ts +0 -190
  422. package/source/directives/io/lib/throttle/Sync.test.ts +0 -163
  423. package/source/directives/io/lib/throttle/Sync.ts +0 -93
  424. package/source/directives/io/lib/throttle/Warning.test.ts +0 -32
  425. package/source/directives/io/lib/throttle/Warning.ts +0 -29
  426. package/source/directives/io/lib/throttle/components/Component.ts +0 -7
  427. package/source/directives/io/lib/throttle/components/IP.ts +0 -30
  428. package/source/directives/io/lib/throttle/components/Identity.ts +0 -19
  429. package/source/directives/io/lib/throttle/components/Path.ts +0 -8
  430. package/source/directives/io/lib/throttle/components/Route.ts +0 -19
  431. package/source/directives/io/lib/throttle/components/Segment.ts +0 -19
  432. package/source/directives/io/lib/throttle/components/index.ts +0 -19
  433. package/source/directives/io/lib/throttle/conditions/Condition.ts +0 -5
  434. package/source/directives/io/lib/throttle/conditions/Status.ts +0 -17
  435. package/source/directives/io/lib/throttle/conditions/index.ts +0 -11
  436. package/source/directives/io/lib/throttle/index.ts +0 -4
  437. package/source/directives/io/schemas.test.ts +0 -40
  438. package/source/directives/io/schemas.ts +0 -16
  439. package/source/directives/map/Authority.ts +0 -15
  440. package/source/directives/map/Buffer.ts +0 -15
  441. package/source/directives/map/Claims.ts +0 -63
  442. package/source/directives/map/Directive.ts +0 -4
  443. package/source/directives/map/Headers.ts +0 -60
  444. package/source/directives/map/Language.ts +0 -45
  445. package/source/directives/map/Languages.ts +0 -17
  446. package/source/directives/map/Map.ts +0 -85
  447. package/source/directives/map/Mapping.ts +0 -45
  448. package/source/directives/map/Properties.ts +0 -15
  449. package/source/directives/map/Segments.ts +0 -52
  450. package/source/directives/map/index.ts +0 -3
  451. package/source/directives/mcp/MCP.ts +0 -33
  452. package/source/directives/mcp/Tool.test.ts +0 -56
  453. package/source/directives/mcp/Tool.ts +0 -32
  454. package/source/directives/mcp/index.ts +0 -6
  455. package/source/directives/oauth/Discovery.ts +0 -66
  456. package/source/directives/oauth/documents.ts +0 -110
  457. package/source/directives/oauth/index.ts +0 -3
  458. package/source/directives/octets/Context.ts +0 -23
  459. package/source/directives/octets/Delete.ts +0 -96
  460. package/source/directives/octets/Directive.ts +0 -21
  461. package/source/directives/octets/Get.ts +0 -88
  462. package/source/directives/octets/Octets.ts +0 -82
  463. package/source/directives/octets/Put.ts +0 -186
  464. package/source/directives/octets/Workflow.ts +0 -60
  465. package/source/directives/octets/bytes.test.ts +0 -33
  466. package/source/directives/octets/bytes.ts +0 -18
  467. package/source/directives/octets/index.ts +0 -3
  468. package/source/directives/octets/schemas.test.ts +0 -20
  469. package/source/directives/octets/schemas.ts +0 -15
  470. package/source/directives/octets/types.ts +0 -9
  471. package/source/directives/octets/workflows/Execution.ts +0 -130
  472. package/source/directives/octets/workflows/Workflow.ts +0 -51
  473. package/source/directives/octets/workflows/index.ts +0 -1
  474. package/source/directives/require/Directive.ts +0 -5
  475. package/source/directives/require/Headers.ts +0 -19
  476. package/source/directives/require/Require.ts +0 -27
  477. package/source/directives/require/index.ts +0 -3
  478. package/source/discovery.ts +0 -1
  479. package/source/exceptions.ts +0 -47
  480. package/source/index.ts +0 -12
  481. package/source/io.ts +0 -4
  482. package/source/manifest.test.ts +0 -56
  483. package/source/manifest.ts +0 -56
  484. package/source/octets.d.ts +0 -17
  485. package/source/root.ts +0 -59
  486. package/source/schemas.test.ts +0 -31
  487. package/source/schemas.ts +0 -15
  488. package/source/service.ts +0 -94
  489. package/source/shortcuts.ts +0 -14
  490. package/source/userland.ts +0 -47
  491. package/transpiled/Annotation.d.ts +0 -70
  492. package/transpiled/Annotation.js +0 -2
  493. package/transpiled/Annotation.js.map +0 -1
  494. package/transpiled/RTD/syntax/parse.d.ts +0 -4
  495. package/transpiled/RTD/syntax/parse.js +0 -112
  496. package/transpiled/RTD/syntax/parse.js.map +0 -1
  497. package/transpiled/RTD/syntax/types.d.ts +0 -52
  498. package/transpiled/RTD/syntax/types.js +0 -11
  499. package/transpiled/RTD/syntax/types.js.map +0 -1
  500. package/transpiled/const.d.ts +0 -36
  501. package/transpiled/const.js +0 -37
  502. package/transpiled/const.js.map +0 -1
  503. package/transpiled/deployment.d.ts +0 -6
  504. package/transpiled/deployment.js +0 -76
  505. package/transpiled/deployment.js.map +0 -1
  506. package/transpiled/manifest.d.ts +0 -3
  507. package/transpiled/manifest.js +0 -39
  508. package/transpiled/manifest.js.map +0 -1
  509. package/transpiled/schemas.d.ts +0 -9
  510. package/transpiled/schemas.js +0 -9
  511. package/transpiled/schemas.js.map +0 -1
  512. package/transpiled/shortcuts.d.ts +0 -3
  513. package/transpiled/shortcuts.js +0 -13
  514. package/transpiled/shortcuts.js.map +0 -1
  515. package/tsconfig.json +0 -13
  516. package/tsconfig.tsbuildinfo +0 -1
  517. package/ui/dist/_app/immutable/assets/0.Bl7vLmIK.css +0 -2
  518. package/ui/dist/_app/immutable/assets/2.BC0-Jhqu.css +0 -1
  519. package/ui/dist/_app/immutable/chunks/B_pK3U1C.js +0 -6
  520. package/ui/dist/_app/immutable/chunks/CiKbPLyY.js +0 -1
  521. package/ui/dist/_app/immutable/chunks/DjIYL2zC.js +0 -3
  522. package/ui/dist/_app/immutable/entry/app.DMqmL4NY.js +0 -2
  523. package/ui/dist/_app/immutable/entry/start.CRe7HWBI.js +0 -1
  524. package/ui/dist/_app/immutable/nodes/0.D9m-6cbM.js +0 -1
  525. package/ui/dist/_app/immutable/nodes/1.Cgi_RcSO.js +0 -1
  526. package/ui/dist/_app/immutable/nodes/2.D_Cbxgz4.js +0 -14
@@ -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
- }
@@ -1,137 +0,0 @@
1
- import { console } from 'openspan'
2
- import { refusal, template } from '../RPC/names.js'
3
- import { DISCOVERY } from '../const.js'
4
- import { branchTTL, createNode } from './factory.js'
5
- import { fragment } from './segment.js'
6
- import type { Mount, Node } from './Node.js'
7
- import type { Match } from './Match.js'
8
- import type { Context } from './Context.js'
9
- import type { DirectiveFactory } from './Directives.js'
10
- import type { EndpointsFactory } from './Endpoint.js'
11
- import type * as syntax from './syntax/index.js'
12
-
13
- export class Tree {
14
- private readonly root: syntax.Node
15
- private readonly trunk: Node
16
- private readonly endpoints: EndpointsFactory
17
- private readonly directives: DirectiveFactory
18
-
19
- public constructor(
20
- node: syntax.Node,
21
- endpoints: EndpointsFactory,
22
- directives: DirectiveFactory
23
- ) {
24
- this.endpoints = endpoints
25
- this.directives = directives
26
- this.root = node
27
- this.trunk = this.createNode(node, PROTECTED)
28
-
29
- announce(this.trunk)
30
- }
31
-
32
- public match(path: string): Match | null {
33
- if (path === '/')
34
- return {
35
- node: this.trunk,
36
- parameters: []
37
- }
38
-
39
- const fragments = fragment(path)
40
-
41
- return this.trunk.match(fragments)
42
- }
43
-
44
- /** Every method in the tree, with the template it answers at. */
45
- public walk(): Generator<Mount> {
46
- return this.trunk.walk([], TRUNK)
47
- }
48
-
49
- public merge(node: syntax.Node, extension: unknown): Node[] {
50
- const branch = this.createNode(node, !PROTECTED, extension)
51
-
52
- announce(branch)
53
-
54
- return this.trunk.merge(branch)
55
- }
56
-
57
- /**
58
- * Extends the expiration of an already merged branch, leaving its endpoints
59
- * and their remotes intact.
60
- */
61
- public refresh(nodes: Node[]): void {
62
- const expiration = Date.now() + branchTTL()
63
-
64
- for (const node of nodes) node.touch(expiration)
65
- }
66
-
67
- public dispose(): void {
68
- this.directives.dispose()
69
- }
70
-
71
- private createNode(node: syntax.Node, protect: boolean, extension?: unknown): Node {
72
- const context: Context = {
73
- protected: protect,
74
- endpoints: this.endpoints,
75
- directives: {
76
- factory: this.directives,
77
- // A merged branch is mounted under the root, so it inherits the root's
78
- // directives. The trunk is the root: createNode adds them itself, and
79
- // seeding them here too would apply every one of them twice.
80
- stack: node === this.root ? [] : (this.root.directives ?? [])
81
- },
82
- path: label(extension),
83
- extension
84
- }
85
-
86
- return createNode(node, context)
87
- }
88
- }
89
-
90
- /**
91
- * What is served but cannot be reached as it reads. Said once per route as it is built,
92
- * because either of these is otherwise noticed only by the caller who cannot find it.
93
- */
94
- function announce(node: Node): void {
95
- const said = new Set<string>()
96
-
97
- for (const { segments } of node.walk([], TRUNK)) {
98
- const route = template(segments)
99
-
100
- if (said.has(route)) continue
101
-
102
- // the page is served under this prefix, before a request is routed at all
103
- if (route === DISCOVERY || route.startsWith(DISCOVERY + '/')) {
104
- said.add(route)
105
-
106
- console.warn('Route is shadowed by the discovery endpoint', { route })
107
-
108
- continue
109
- }
110
-
111
- const segment = refusal(segments)
112
-
113
- if (segment === null) continue
114
-
115
- said.add(route)
116
-
117
- console.warn('Route cannot be addressed as a procedure', { route, segment })
118
- }
119
- }
120
-
121
- /**
122
- * A branch's routes are relative to wherever it is merged, and the mount point is not
123
- * known while it is being built — so the component it came from is what keeps two
124
- * branches from looking like the same route.
125
- */
126
- function label(extension: unknown): string {
127
- if (extension === null || typeof extension !== 'object') return ''
128
-
129
- const { namespace, component } = extension as Record<string, unknown>
130
-
131
- return typeof namespace === 'string' && typeof component === 'string'
132
- ? `${namespace}.${component}`
133
- : ''
134
- }
135
-
136
- const PROTECTED = true
137
- const TRUNK = true
@@ -1,81 +0,0 @@
1
- import { it, mock } from 'node:test'
2
- import assert from 'node:assert/strict'
3
-
4
- import { Tree } from './Tree.js'
5
- import type { EndpointsFactory } from '../Endpoint.js'
6
- import type { DirectiveFactory } from './Directives.js'
7
- import type * as syntax from './syntax/index.js'
8
-
9
- const endpoints = {} as unknown as EndpointsFactory
10
-
11
- const directives = {
12
- create: () => ({
13
- precall: async () => null,
14
- settle: async () => undefined,
15
- dispose: () => undefined
16
- }),
17
- dispose: mock.fn()
18
- } as unknown as DirectiveFactory
19
-
20
- const root: syntax.Node = {
21
- routes: [],
22
- methods: [],
23
- directives: []
24
- }
25
-
26
- const pots: syntax.Node = {
27
- routes: [
28
- {
29
- path: '/pots',
30
- node: {
31
- routes: [],
32
- methods: [{ verb: 'GET', directives: [] }],
33
- directives: []
34
- }
35
- }
36
- ],
37
- methods: [],
38
- directives: []
39
- }
40
-
41
- it('should extend expiration without rebuilding the branch', () => {
42
- process.env.__TESTING_EXPOSITION_BRANCH_TTL = '1000'
43
-
44
- const now = mock.method(Date, 'now', () => 10_000)
45
- const tree = new Tree(root, endpoints, directives)
46
- const nodes = tree.merge(pots, { namespace: 'default', component: 'pots' })
47
- const match = tree.match('/pots/')
48
-
49
- assert.notStrictEqual(match, null)
50
-
51
- now.mock.mockImplementation(() => 10_900)
52
- tree.refresh(nodes)
53
-
54
- now.mock.mockImplementation(() => 11_500)
55
-
56
- const refreshed = tree.match('/pots/')
57
-
58
- assert.notStrictEqual(refreshed, null)
59
- assert.strictEqual(refreshed?.node, match?.node)
60
-
61
- now.mock.restore()
62
- delete process.env.__TESTING_EXPOSITION_BRANCH_TTL
63
- })
64
-
65
- it('should ignore expired nodes during match', () => {
66
- process.env.__TESTING_EXPOSITION_BRANCH_TTL = '1000'
67
-
68
- const now = mock.method(Date, 'now', () => 10_000)
69
- const tree = new Tree(root, endpoints, directives)
70
-
71
- tree.merge(pots, { namespace: 'default', component: 'pots' })
72
-
73
- assert.notStrictEqual(tree.match('/pots/'), null)
74
-
75
- now.mock.mockImplementation(() => 11_000)
76
-
77
- assert.strictEqual(tree.match('/pots/'), null)
78
-
79
- now.mock.restore()
80
- delete process.env.__TESTING_EXPOSITION_BRANCH_TTL
81
- })
@@ -1,105 +0,0 @@
1
- import assert from 'node:assert'
2
- import { BRANCH_TTL } from '../const.js'
3
- import { Node, type Properties } from './Node.js'
4
- import { Route } from './Route.js'
5
- import { fragment, segment } from './segment.js'
6
- import { Method, type Methods } from './Method.js'
7
- import type { Context } from './Context.js'
8
- import type * as syntax from './syntax/index.js'
9
-
10
- export function createNode(node: syntax.Node, context: Context): Node {
11
- if (node.isolated === true) context.directives.stack = node.directives
12
- else context.directives.stack = node.directives.concat(context.directives.stack)
13
-
14
- described(node, context)
15
-
16
- const routes: Route[] = node.routes.map((route) => createRoute(route, context))
17
- const methods: Methods = {}
18
-
19
- for (const method of node.methods) methods[method.verb] = createMethod(method, context)
20
-
21
- const protect = node.protected ?? context.protected
22
-
23
- const properties: Properties = {
24
- protected: protect,
25
- forward: node.forward,
26
- expiration: protect ? Infinity : Date.now() + branchTTL()
27
- }
28
-
29
- return new Node(routes, methods, properties)
30
- }
31
-
32
- export function branchTTL(): number {
33
- const value = process.env.__TESTING_EXPOSITION_BRANCH_TTL
34
-
35
- if (value === undefined || value === '') return BRANCH_TTL
36
-
37
- const parsed = Number(value)
38
-
39
- return Number.isFinite(parsed) ? parsed : BRANCH_TTL
40
- }
41
-
42
- function createRoute(route: syntax.Route, context: Context): Route {
43
- const stack = context.directives.stack.slice()
44
- const path = context.path
45
- const segments = segment(route.path)
46
-
47
- context.path = join(path, route.path)
48
-
49
- /*
50
- * What a node says of itself is not said of what is under it. Its own `/` is the
51
- * exception: an intermediate node is never what a path matches, because that route
52
- * answers in its place — so the two are one resource and what describes it carries.
53
- */
54
- if (route.path !== ROOT)
55
- context.directives.stack = stack.filter((directive) =>
56
- context.directives.factory.inheritable(directive)
57
- )
58
-
59
- const node = createNode(route.node, context)
60
-
61
- context.directives.stack = stack // restore
62
- context.path = path
63
-
64
- return new Route(segments, node)
65
- }
66
-
67
- function join(base: string, path: string): string {
68
- // '/one/' and '/two/' would otherwise read as '/one//two/'
69
- return (base + path).replace(/\/+/g, '/').replace(/(.)\/$/, '$1')
70
- }
71
-
72
- function createMethod(method: syntax.Method, context: Context): Method {
73
- const stack = method.directives.concat(context.directives.stack)
74
- const directives = context.directives.factory.create(stack, context.path)
75
-
76
- const endpoint =
77
- method.mapping?.endpoint === undefined
78
- ? null
79
- : context.endpoints.create(method, context)
80
-
81
- return new Method(endpoint, directives)
82
- }
83
-
84
- /**
85
- * A resource is what it is described beside: a node with no methods of its own is never
86
- * what a path answers, so nothing would carry what it says about itself. Refused where the
87
- * declaration is, rather than left to be noticed by whoever cannot find it in the answer.
88
- */
89
- function described(node: syntax.Node, context: Context): void {
90
- const help = node.directives.find(
91
- (directive) => directive.family === HELP && directive.name === 'node'
92
- )
93
-
94
- if (help === undefined || node.methods.length > 0) return
95
-
96
- // an intermediate node's `/` answers in its place, and carries what it says
97
- if (node.routes.some((route) => route.path === ROOT)) return
98
-
99
- const route = '/' + fragment(context.path).join('/')
100
-
101
- assert.fail(`Directive help:node: '${route}' serves no methods`)
102
- }
103
-
104
- const ROOT = '/'
105
- const HELP = 'help'
@@ -1,8 +0,0 @@
1
- export * from './Tree.js'
2
- export * from './Node.js'
3
- export * from './Match.js'
4
- export * from './Method.js'
5
- export * from './Context.js'
6
- export * from './Endpoint.js'
7
- export * from './Directives.js'
8
- export * as syntax from './syntax/index.js'
@@ -1,35 +0,0 @@
1
- import { it } from 'node:test'
2
- import assert from 'node:assert/strict'
3
-
4
- import { segment, fragment } from './segment.js'
5
-
6
- it('should return segments', async () => {
7
- const segments = segment('/foo/bar/')
8
-
9
- assert.strictEqual(segments.length, 2)
10
- assert.strictEqual(segments[0].fragment, 'foo')
11
- assert.strictEqual(segments[1].fragment, 'bar')
12
- })
13
-
14
- it('should parse placeholders', async () => {
15
- const segments = segment('/foo/:id/')
16
-
17
- assert.strictEqual(segments.length, 2)
18
- assert.strictEqual(segments[0].fragment, 'foo')
19
- assert.strictEqual(segments[1].fragment, null)
20
-
21
- // helping typescript
22
- if (segments[1].fragment !== null) throw new Error('?')
23
-
24
- assert.strictEqual(segments[1].placeholder, 'id')
25
- })
26
-
27
- it('should handle root path', async () => {
28
- assert.deepStrictEqual(segment('/'), [])
29
- })
30
-
31
- it('should split', async () => {
32
- const parts = fragment('/foo/bar/')
33
-
34
- assert.deepStrictEqual(parts, ['foo', 'bar'])
35
- })
@@ -1,51 +0,0 @@
1
- import type { Parameter } from './Match.js'
2
-
3
- export function segment(path: string): Segment[] {
4
- return fragment(path).map(parse)
5
- }
6
-
7
- export function fragment(path: string): string[] {
8
- const parts = path.split('/')
9
-
10
- // trailing slash
11
- if (parts[parts.length - 1] === '') parts.length--
12
-
13
- // leading slash
14
- return parts.splice(1)
15
- }
16
-
17
- function parse(segment: string): Segment {
18
- if (segment[0] === ':') return { fragment: null, placeholder: segment.substring(1) }
19
- else if (segment === '*') return { fragment: null, placeholder: null }
20
- else if (segment === '**') return { fragment: null, placeholder: null, wildcard: true }
21
- else return { fragment: segment }
22
- }
23
-
24
- export type Segment =
25
- | {
26
- fragment: string
27
- }
28
- | {
29
- fragment: null
30
- placeholder: string | null
31
- wildcard?: boolean
32
- }
33
-
34
- /**
35
- * What a route template takes, by name. Describing has no values for them — a template is
36
- * not a path — and nothing that describes a method reads one. A `*` is skipped: it stands
37
- * for a segment the caller cannot name, so there is nothing to substitute.
38
- */
39
- export function variables(segments: Segment[]): Parameter[] {
40
- const params: Parameter[] = []
41
-
42
- for (const segment of segments) {
43
- if (segment.fragment !== null) continue
44
-
45
- if (segment.wildcard === true) params.push({ name: '**', value: '' })
46
- else if (segment.placeholder !== null)
47
- params.push({ name: segment.placeholder, value: '' })
48
- }
49
-
50
- return params
51
- }
@@ -1,2 +0,0 @@
1
- export * from './parse.js'
2
- export * from './types.js'