soseki 0.0.4 → 0.0.6

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 (352) hide show
  1. package/LICENSE +21 -0
  2. package/dist/src/components/browser-router.d.ts +19 -0
  3. package/dist/src/components/browser-router.d.ts.map +1 -0
  4. package/dist/src/components/browser-router.jsx +15 -0
  5. package/dist/src/components/outlet.d.ts +8 -0
  6. package/dist/src/components/outlet.d.ts.map +1 -0
  7. package/dist/src/components/outlet.jsx +15 -0
  8. package/dist/src/components/router.d.ts +21 -0
  9. package/dist/src/components/router.d.ts.map +1 -0
  10. package/dist/src/components/router.jsx +138 -0
  11. package/dist/src/contexts/route-context.d.ts +19 -0
  12. package/dist/src/contexts/route-context.d.ts.map +1 -0
  13. package/dist/src/contexts/route-context.js +6 -0
  14. package/dist/src/contexts/router-context.d.ts +55 -0
  15. package/dist/src/contexts/router-context.d.ts.map +1 -0
  16. package/dist/src/contexts/router-context.js +8 -0
  17. package/dist/src/core/_compare-route-paths.d.ts +11 -0
  18. package/dist/src/core/_compare-route-paths.d.ts.map +1 -0
  19. package/dist/src/core/_compare-route-paths.js +92 -0
  20. package/dist/src/core/_match-route-path.d.ts +22 -0
  21. package/dist/src/core/_match-route-path.d.ts.map +1 -0
  22. package/dist/src/core/_match-route-path.js +26 -0
  23. package/dist/src/core/_process-routes.d.ts +14 -0
  24. package/dist/src/core/_process-routes.d.ts.map +1 -0
  25. package/dist/src/core/_process-routes.js +45 -0
  26. package/dist/src/core/_singleton.d.ts +12 -0
  27. package/dist/src/core/_singleton.d.ts.map +1 -0
  28. package/dist/src/core/_singleton.js +18 -0
  29. package/dist/src/core/_unreachable.d.ts +16 -0
  30. package/dist/src/core/_unreachable.d.ts.map +1 -0
  31. package/dist/src/core/_unreachable.js +8 -0
  32. package/dist/src/core/_valibot.d.ts +25 -0
  33. package/dist/src/core/_valibot.d.ts.map +1 -0
  34. package/dist/src/core/_valibot.js +30 -0
  35. package/dist/src/core/errors.d.ts +182 -0
  36. package/dist/src/core/errors.d.ts.map +1 -0
  37. package/dist/src/core/errors.js +166 -0
  38. package/dist/src/core/expect-history-entry.d.ts +59 -0
  39. package/dist/src/core/expect-history-entry.d.ts.map +1 -0
  40. package/dist/src/core/expect-history-entry.js +42 -0
  41. package/dist/src/core/form-data-to-html-form-element.d.ts +11 -0
  42. package/dist/src/core/form-data-to-html-form-element.d.ts.map +1 -0
  43. package/dist/src/core/form-data-to-html-form-element.js +31 -0
  44. package/dist/src/core/history-entry-id-schema.d.ts +17 -0
  45. package/dist/src/core/history-entry-id-schema.d.ts.map +1 -0
  46. package/dist/src/core/history-entry-id-schema.js +9 -0
  47. package/dist/src/core/history-entry-url-schema.d.ts +18 -0
  48. package/dist/src/core/history-entry-url-schema.d.ts.map +1 -0
  49. package/dist/src/core/history-entry-url-schema.js +20 -0
  50. package/dist/src/core/init-loaders.d.ts +28 -0
  51. package/dist/src/core/init-loaders.d.ts.map +1 -0
  52. package/dist/src/core/init-loaders.js +30 -0
  53. package/dist/src/core/match-routes.d.ts +28 -0
  54. package/dist/src/core/match-routes.d.ts.map +1 -0
  55. package/dist/src/core/match-routes.js +31 -0
  56. package/dist/src/core/readonly-form-data.types.d.ts +74 -0
  57. package/dist/src/core/readonly-form-data.types.d.ts.map +1 -0
  58. package/dist/src/core/readonly-url.types.d.ts +164 -0
  59. package/dist/src/core/readonly-url.types.d.ts.map +1 -0
  60. package/dist/src/core/redirect-response.d.ts +37 -0
  61. package/dist/src/core/redirect-response.d.ts.map +1 -0
  62. package/dist/src/core/redirect-response.js +19 -0
  63. package/dist/src/core/route-path.d.ts +57 -0
  64. package/dist/src/core/route-path.d.ts.map +1 -0
  65. package/dist/src/core/route-path.js +93 -0
  66. package/dist/src/core/route-request.d.ts +149 -0
  67. package/dist/src/core/route-request.d.ts.map +1 -0
  68. package/dist/src/core/route-request.js +41 -0
  69. package/dist/src/core/route.types.d.ts +296 -0
  70. package/dist/src/core/route.types.d.ts.map +1 -0
  71. package/dist/src/core/start-action.d.ts +53 -0
  72. package/dist/src/core/start-action.d.ts.map +1 -0
  73. package/dist/src/core/start-action.js +95 -0
  74. package/dist/src/core/start-loaders.d.ts +63 -0
  75. package/dist/src/core/start-loaders.d.ts.map +1 -0
  76. package/dist/src/core/start-loaders.js +138 -0
  77. package/dist/{core.d.ts → src/core.d.ts} +7 -11
  78. package/dist/src/core.d.ts.map +1 -0
  79. package/dist/{core.js → src/core.js} +2 -4
  80. package/dist/src/engines/engine.types.d.ts +216 -0
  81. package/dist/src/engines/engine.types.d.ts.map +1 -0
  82. package/dist/src/engines/navigation-api-engine.d.ts +50 -0
  83. package/dist/src/engines/navigation-api-engine.d.ts.map +1 -0
  84. package/dist/src/engines/navigation-api-engine.js +411 -0
  85. package/dist/src/engines.d.ts +4 -0
  86. package/dist/src/engines.d.ts.map +1 -0
  87. package/dist/src/engines.js +1 -0
  88. package/dist/src/hooks/_use-singleton.d.ts +11 -0
  89. package/dist/src/hooks/_use-singleton.d.ts.map +1 -0
  90. package/dist/src/hooks/_use-singleton.js +26 -0
  91. package/dist/src/hooks/use-action-data.d.ts +17 -0
  92. package/dist/src/hooks/use-action-data.d.ts.map +1 -0
  93. package/dist/src/hooks/use-action-data.js +16 -0
  94. package/dist/src/hooks/use-form-action.d.ts +7 -0
  95. package/dist/src/hooks/use-form-action.d.ts.map +1 -0
  96. package/dist/src/hooks/use-form-action.js +9 -0
  97. package/dist/src/hooks/use-loader-data.d.ts +9 -0
  98. package/dist/src/hooks/use-loader-data.d.ts.map +1 -0
  99. package/dist/src/hooks/use-loader-data.js +20 -0
  100. package/dist/src/hooks/use-navigate.d.ts +53 -0
  101. package/dist/src/hooks/use-navigate.d.ts.map +1 -0
  102. package/dist/src/hooks/use-navigate.js +43 -0
  103. package/dist/{hooks → src/hooks}/use-params.d.ts +2 -2
  104. package/dist/src/hooks/use-params.d.ts.map +1 -0
  105. package/dist/{hooks → src/hooks}/use-params.js +1 -1
  106. package/dist/src/hooks/use-route-context.d.ts +10 -0
  107. package/dist/src/hooks/use-route-context.d.ts.map +1 -0
  108. package/dist/src/hooks/use-route-context.js +17 -0
  109. package/dist/src/hooks/use-router-context.d.ts +12 -0
  110. package/dist/src/hooks/use-router-context.d.ts.map +1 -0
  111. package/dist/src/hooks/use-router-context.js +20 -0
  112. package/dist/src/hooks/use-submit.d.ts +59 -0
  113. package/dist/src/hooks/use-submit.d.ts.map +1 -0
  114. package/dist/src/hooks/use-submit.js +38 -0
  115. package/dist/src/soseki.d.ts +31 -0
  116. package/dist/src/soseki.d.ts.map +1 -0
  117. package/dist/src/soseki.js +12 -0
  118. package/dist/src/utils/redirect.d.ts +11 -0
  119. package/dist/src/utils/redirect.d.ts.map +1 -0
  120. package/dist/src/utils/redirect.js +12 -0
  121. package/package.json +48 -30
  122. package/src/components/browser-router.tsx +8 -11
  123. package/src/components/outlet.tsx +3 -2
  124. package/src/components/router.tsx +139 -145
  125. package/src/contexts/route-context.ts +6 -5
  126. package/src/contexts/router-context.ts +36 -19
  127. package/src/core/_compare-route-paths.ts +48 -34
  128. package/src/core/_match-route-path.ts +21 -15
  129. package/src/core/_process-routes.ts +44 -46
  130. package/src/core/_singleton.ts +13 -38
  131. package/src/core/_unreachable.ts +12 -7
  132. package/src/core/_valibot.ts +19 -116
  133. package/src/core/errors.ts +150 -495
  134. package/src/core/expect-history-entry.ts +40 -41
  135. package/src/core/form-data-to-html-form-element.ts +37 -0
  136. package/src/core/history-entry-id-schema.ts +6 -11
  137. package/src/core/history-entry-url-schema.ts +25 -18
  138. package/src/core/init-loaders.ts +35 -57
  139. package/src/core/match-routes.ts +33 -65
  140. package/src/core/readonly-form-data.types.ts +48 -28
  141. package/src/core/readonly-url.types.ts +57 -28
  142. package/src/core/redirect-response.ts +26 -15
  143. package/src/core/route-path.ts +114 -0
  144. package/src/core/route-request.ts +144 -32
  145. package/src/core/route.types.ts +250 -226
  146. package/src/core/start-action.ts +164 -0
  147. package/src/core/start-loaders.ts +190 -212
  148. package/src/core.ts +8 -15
  149. package/src/engines/engine.types.ts +204 -166
  150. package/src/engines/navigation-api-engine.ts +332 -233
  151. package/src/engines.ts +4 -0
  152. package/src/hooks/_use-singleton.ts +30 -0
  153. package/src/hooks/use-action-data.ts +21 -26
  154. package/src/hooks/use-form-action.ts +4 -5
  155. package/src/hooks/use-loader-data.ts +16 -18
  156. package/src/hooks/use-navigate.ts +69 -28
  157. package/src/hooks/use-params.ts +4 -4
  158. package/src/hooks/use-route-context.ts +20 -0
  159. package/src/hooks/use-router-context.ts +25 -0
  160. package/src/hooks/use-submit.ts +48 -53
  161. package/src/soseki.ts +27 -34
  162. package/src/utils/redirect.ts +5 -5
  163. package/dist/components/action-id.d.ts +0 -19
  164. package/dist/components/action-id.d.ts.map +0 -1
  165. package/dist/components/action-id.jsx +0 -14
  166. package/dist/components/browser-router.d.ts +0 -17
  167. package/dist/components/browser-router.d.ts.map +0 -1
  168. package/dist/components/browser-router.jsx +0 -13
  169. package/dist/components/hidden-input.d.ts +0 -20
  170. package/dist/components/hidden-input.d.ts.map +0 -1
  171. package/dist/components/hidden-input.jsx +0 -8
  172. package/dist/components/outlet.d.ts +0 -8
  173. package/dist/components/outlet.d.ts.map +0 -1
  174. package/dist/components/outlet.jsx +0 -15
  175. package/dist/components/router.d.ts +0 -23
  176. package/dist/components/router.d.ts.map +0 -1
  177. package/dist/components/router.jsx +0 -128
  178. package/dist/contexts/route-context.d.ts +0 -19
  179. package/dist/contexts/route-context.d.ts.map +0 -1
  180. package/dist/contexts/route-context.js +0 -6
  181. package/dist/contexts/router-context.d.ts +0 -46
  182. package/dist/contexts/router-context.d.ts.map +0 -1
  183. package/dist/contexts/router-context.js +0 -8
  184. package/dist/core/_action-id-registry.d.ts +0 -10
  185. package/dist/core/_action-id-registry.d.ts.map +0 -1
  186. package/dist/core/_action-id-registry.js +0 -8
  187. package/dist/core/_capture-stack-trace.d.ts +0 -8
  188. package/dist/core/_capture-stack-trace.d.ts.map +0 -1
  189. package/dist/core/_capture-stack-trace.js +0 -12
  190. package/dist/core/_compare-route-paths.d.ts +0 -11
  191. package/dist/core/_compare-route-paths.d.ts.map +0 -1
  192. package/dist/core/_compare-route-paths.js +0 -80
  193. package/dist/core/_create-html-form-element-form-form-data.d.ts +0 -9
  194. package/dist/core/_create-html-form-element-form-form-data.d.ts.map +0 -1
  195. package/dist/core/_create-html-form-element-form-form-data.js +0 -27
  196. package/dist/core/_encode-pathname.d.ts +0 -10
  197. package/dist/core/_encode-pathname.d.ts.map +0 -1
  198. package/dist/core/_encode-pathname.js +0 -16
  199. package/dist/core/_is-error.d.ts +0 -3
  200. package/dist/core/_is-error.d.ts.map +0 -1
  201. package/dist/core/_is-error.js +0 -13
  202. package/dist/core/_is-promise-like.d.ts +0 -8
  203. package/dist/core/_is-promise-like.d.ts.map +0 -1
  204. package/dist/core/_is-promise-like.js +0 -12
  205. package/dist/core/_match-route-path.d.ts +0 -19
  206. package/dist/core/_match-route-path.d.ts.map +0 -1
  207. package/dist/core/_match-route-path.js +0 -22
  208. package/dist/core/_process-routes.d.ts +0 -9
  209. package/dist/core/_process-routes.d.ts.map +0 -1
  210. package/dist/core/_process-routes.js +0 -47
  211. package/dist/core/_singleton.d.ts +0 -18
  212. package/dist/core/_singleton.d.ts.map +0 -1
  213. package/dist/core/_singleton.js +0 -37
  214. package/dist/core/_unreachable.d.ts +0 -12
  215. package/dist/core/_unreachable.d.ts.map +0 -1
  216. package/dist/core/_unreachable.js +0 -8
  217. package/dist/core/_use-singleton.d.ts +0 -11
  218. package/dist/core/_use-singleton.d.ts.map +0 -1
  219. package/dist/core/_use-singleton.js +0 -21
  220. package/dist/core/_valibot.d.ts +0 -52
  221. package/dist/core/_valibot.d.ts.map +0 -1
  222. package/dist/core/_valibot.js +0 -107
  223. package/dist/core/_weak-id-registry.d.ts +0 -76
  224. package/dist/core/_weak-id-registry.d.ts.map +0 -1
  225. package/dist/core/_weak-id-registry.js +0 -67
  226. package/dist/core/constants.d.ts +0 -5
  227. package/dist/core/constants.d.ts.map +0 -1
  228. package/dist/core/constants.js +0 -4
  229. package/dist/core/data-map.types.d.ts +0 -23
  230. package/dist/core/data-map.types.d.ts.map +0 -1
  231. package/dist/core/data-map.types.js +0 -1
  232. package/dist/core/data-store.types.d.ts +0 -22
  233. package/dist/core/data-store.types.d.ts.map +0 -1
  234. package/dist/core/data-store.types.js +0 -1
  235. package/dist/core/deferred-promise.d.ts +0 -203
  236. package/dist/core/deferred-promise.d.ts.map +0 -1
  237. package/dist/core/deferred-promise.js +0 -200
  238. package/dist/core/errors.d.ts +0 -303
  239. package/dist/core/errors.d.ts.map +0 -1
  240. package/dist/core/errors.js +0 -400
  241. package/dist/core/expect-history-entry.d.ts +0 -52
  242. package/dist/core/expect-history-entry.d.ts.map +0 -1
  243. package/dist/core/expect-history-entry.js +0 -38
  244. package/dist/core/history-entry-id-schema.d.ts +0 -17
  245. package/dist/core/history-entry-id-schema.d.ts.map +0 -1
  246. package/dist/core/history-entry-id-schema.js +0 -9
  247. package/dist/core/history-entry-url-schema.d.ts +0 -20
  248. package/dist/core/history-entry-url-schema.d.ts.map +0 -1
  249. package/dist/core/history-entry-url-schema.js +0 -16
  250. package/dist/core/init-loaders.d.ts +0 -37
  251. package/dist/core/init-loaders.d.ts.map +0 -1
  252. package/dist/core/init-loaders.js +0 -38
  253. package/dist/core/match-routes.d.ts +0 -31
  254. package/dist/core/match-routes.d.ts.map +0 -1
  255. package/dist/core/match-routes.js +0 -54
  256. package/dist/core/readonly-form-data.types.d.ts +0 -32
  257. package/dist/core/readonly-form-data.types.d.ts.map +0 -1
  258. package/dist/core/readonly-url.types.d.ts +0 -135
  259. package/dist/core/readonly-url.types.d.ts.map +0 -1
  260. package/dist/core/redirect-response.d.ts +0 -29
  261. package/dist/core/redirect-response.d.ts.map +0 -1
  262. package/dist/core/redirect-response.js +0 -17
  263. package/dist/core/route-request.d.ts +0 -52
  264. package/dist/core/route-request.d.ts.map +0 -1
  265. package/dist/core/route-request.js +0 -26
  266. package/dist/core/route.types.d.ts +0 -309
  267. package/dist/core/route.types.d.ts.map +0 -1
  268. package/dist/core/start-actions.d.ts +0 -60
  269. package/dist/core/start-actions.d.ts.map +0 -1
  270. package/dist/core/start-actions.js +0 -186
  271. package/dist/core/start-loaders.d.ts +0 -69
  272. package/dist/core/start-loaders.d.ts.map +0 -1
  273. package/dist/core/start-loaders.js +0 -154
  274. package/dist/core.d.ts.map +0 -1
  275. package/dist/engines/engine.types.d.ts +0 -190
  276. package/dist/engines/engine.types.d.ts.map +0 -1
  277. package/dist/engines/navigation-api-engine.d.ts +0 -48
  278. package/dist/engines/navigation-api-engine.d.ts.map +0 -1
  279. package/dist/engines/navigation-api-engine.js +0 -332
  280. package/dist/hooks/_use-route-context.d.ts +0 -10
  281. package/dist/hooks/_use-route-context.d.ts.map +0 -1
  282. package/dist/hooks/_use-route-context.js +0 -17
  283. package/dist/hooks/_use-router-context.d.ts +0 -10
  284. package/dist/hooks/_use-router-context.d.ts.map +0 -1
  285. package/dist/hooks/_use-router-context.js +0 -18
  286. package/dist/hooks/use-action-data.d.ts +0 -23
  287. package/dist/hooks/use-action-data.d.ts.map +0 -1
  288. package/dist/hooks/use-action-data.js +0 -16
  289. package/dist/hooks/use-form-action.d.ts +0 -7
  290. package/dist/hooks/use-form-action.d.ts.map +0 -1
  291. package/dist/hooks/use-form-action.js +0 -10
  292. package/dist/hooks/use-loader-data.d.ts +0 -11
  293. package/dist/hooks/use-loader-data.d.ts.map +0 -1
  294. package/dist/hooks/use-loader-data.js +0 -19
  295. package/dist/hooks/use-navigate.d.ts +0 -39
  296. package/dist/hooks/use-navigate.d.ts.map +0 -1
  297. package/dist/hooks/use-navigate.js +0 -26
  298. package/dist/hooks/use-params.d.ts.map +0 -1
  299. package/dist/hooks/use-pathname.d.ts +0 -7
  300. package/dist/hooks/use-pathname.d.ts.map +0 -1
  301. package/dist/hooks/use-pathname.js +0 -9
  302. package/dist/hooks/use-submit.d.ts +0 -66
  303. package/dist/hooks/use-submit.d.ts.map +0 -1
  304. package/dist/hooks/use-submit.js +0 -35
  305. package/dist/soseki.d.ts +0 -42
  306. package/dist/soseki.d.ts.map +0 -1
  307. package/dist/soseki.js +0 -19
  308. package/dist/utils/get-action-id.d.ts +0 -8
  309. package/dist/utils/get-action-id.d.ts.map +0 -1
  310. package/dist/utils/get-action-id.js +0 -11
  311. package/dist/utils/href.d.ts +0 -11
  312. package/dist/utils/href.d.ts.map +0 -1
  313. package/dist/utils/href.js +0 -12
  314. package/dist/utils/redirect.d.ts +0 -11
  315. package/dist/utils/redirect.d.ts.map +0 -1
  316. package/dist/utils/redirect.js +0 -12
  317. package/dist/utils/route-index.d.ts +0 -41
  318. package/dist/utils/route-index.d.ts.map +0 -1
  319. package/dist/utils/route-index.js +0 -12
  320. package/dist/utils/route-route.d.ts +0 -62
  321. package/dist/utils/route-route.d.ts.map +0 -1
  322. package/dist/utils/route-route.js +0 -25
  323. package/dist/utils/set-action-id.d.ts +0 -9
  324. package/dist/utils/set-action-id.d.ts.map +0 -1
  325. package/dist/utils/set-action-id.js +0 -12
  326. package/src/components/action-id.tsx +0 -35
  327. package/src/components/hidden-input.tsx +0 -39
  328. package/src/core/_action-id-registry.ts +0 -11
  329. package/src/core/_capture-stack-trace.ts +0 -12
  330. package/src/core/_create-html-form-element-form-form-data.ts +0 -32
  331. package/src/core/_encode-pathname.ts +0 -17
  332. package/src/core/_is-error.ts +0 -16
  333. package/src/core/_is-promise-like.ts +0 -14
  334. package/src/core/_use-singleton.ts +0 -24
  335. package/src/core/_weak-id-registry.ts +0 -125
  336. package/src/core/constants.ts +0 -4
  337. package/src/core/data-map.types.ts +0 -28
  338. package/src/core/data-store.types.ts +0 -25
  339. package/src/core/deferred-promise.ts +0 -408
  340. package/src/core/start-actions.ts +0 -274
  341. package/src/hooks/_use-route-context.ts +0 -19
  342. package/src/hooks/_use-router-context.ts +0 -25
  343. package/src/hooks/use-pathname.ts +0 -10
  344. package/src/utils/get-action-id.ts +0 -12
  345. package/src/utils/href.ts +0 -17
  346. package/src/utils/route-index.ts +0 -70
  347. package/src/utils/route-route.ts +0 -111
  348. package/src/utils/set-action-id.ts +0 -14
  349. /package/dist/{core → src/core}/readonly-form-data.types.js +0 -0
  350. /package/dist/{core → src/core}/readonly-url.types.js +0 -0
  351. /package/dist/{core → src/core}/route.types.js +0 -0
  352. /package/dist/{engines → src/engines}/engine.types.js +0 -0
@@ -0,0 +1,149 @@
1
+ import type { ReadonlyFormData } from "./readonly-form-data.types.js";
2
+ import type { ReadonlyURL } from "./readonly-url.types.js";
3
+ /**
4
+ * HTTP の GET メソッドによるルーティングリクエストを表すインターフェースです。
5
+ *
6
+ * GET リクエストの特性上、`formData` は常に `null` となります。
7
+ */
8
+ interface RouteGetRequest {
9
+ /**
10
+ * HTTP メソッドを表します。常に `"GET"` です。
11
+ */
12
+ readonly method: "GET";
13
+ /**
14
+ * リクエスト対象の読み取り専用 URL オブジェクトです。
15
+ */
16
+ readonly url: ReadonlyURL;
17
+ /**
18
+ * 非同期処理やフェッチを中断するための中断シグナルです。
19
+ */
20
+ readonly signal: AbortSignal;
21
+ /**
22
+ * フォームデータです。GET リクエストではデータを本文に含めないため、常に `null` です。
23
+ */
24
+ readonly formData: null;
25
+ /**
26
+ * Web 標準の `Request` オブジェクトに変換します。
27
+ *
28
+ * @param init 変換時に上書きまたは追加するリクエストの設定オプションです。
29
+ * @returns 構築された `Request` インスタンスを返します。
30
+ */
31
+ toRequest(init?: RequestInit): Request;
32
+ }
33
+ /**
34
+ * HTTP の POST メソッドによるルーティングリクエストを表すインターフェースです。
35
+ *
36
+ * POST リクエストに伴う読み取り専用の `formData` を保持します。
37
+ */
38
+ interface RoutePostRequest {
39
+ /**
40
+ * HTTP メソッドを表します。常に `"POST"` です。
41
+ */
42
+ readonly method: "POST";
43
+ /**
44
+ * リクエスト対象の読み取り専用 URL オブジェクトです。
45
+ */
46
+ readonly url: ReadonlyURL;
47
+ /**
48
+ * 非同期処理やフェッチを中断するための中断シグナルです。
49
+ */
50
+ readonly signal: AbortSignal;
51
+ /**
52
+ * リクエスト本文に紐付けられた、読み取り専用のフォームデータです。
53
+ */
54
+ readonly formData: ReadonlyFormData;
55
+ /**
56
+ * Web 標準の `Request` オブジェクトに変換します。
57
+ *
58
+ * @param init 変換時に上書きまたは追加するリクエストの設定オプションです。
59
+ * @returns 構築された `Request` インスタンスを返します。
60
+ */
61
+ toRequest(init?: RequestInit): Request;
62
+ }
63
+ /**
64
+ * GET または POST のルーティングリクエストを表す識別子付きユニオン型です。
65
+ */
66
+ type RouteRequest = RouteGetRequest | RoutePostRequest;
67
+ /**
68
+ * ルーティングコンテキストにおける HTTP リクエストを抽象化し、管理するクラスです。
69
+ *
70
+ * メソッドの種類(GET / POST)に応じて、型安全なリクエストの生成と Web 標準の `Request` オブジェクトへの変換を提供します。
71
+ */
72
+ declare const RouteRequest: {
73
+ new (method: "GET", url: ReadonlyURL, signal: AbortSignal): {
74
+ /**
75
+ * 読み取り専用の URL オブジェクトです。
76
+ */
77
+ readonly url: ReadonlyURL;
78
+ /**
79
+ * 使用される HTTP メソッドです。
80
+ */
81
+ readonly method: "GET" | "POST";
82
+ /**
83
+ * 処理中断用の中断シグナルです。
84
+ */
85
+ readonly signal: AbortSignal;
86
+ /**
87
+ * 保持されている読み取り専用のフォームデータです。GET リクエストの場合は `null` となります。
88
+ */
89
+ readonly formData: ReadonlyFormData | null;
90
+ /**
91
+ * インスタンスが保持する情報を基に、Web 標準である Fetch API の `Request` オブジェクトを構築して返します。
92
+ *
93
+ * 外部から任意の `RequestInit` オプションが指定された場合は、インスタンス固有の既定値を上書きします。
94
+ *
95
+ * @param init リクエストの生成オプションを上書きするための初期化オブジェクトです。既定値は空のオブジェクトです。
96
+ * @returns Fetch API でそのまま利用可能な `Request` インスタンスです。
97
+ */
98
+ toRequest(init?: RequestInit): Request;
99
+ };
100
+ new (method: "POST", url: ReadonlyURL, signal: AbortSignal, formData: ReadonlyFormData): {
101
+ /**
102
+ * 読み取り専用の URL オブジェクトです。
103
+ */
104
+ readonly url: ReadonlyURL;
105
+ /**
106
+ * 使用される HTTP メソッドです。
107
+ */
108
+ readonly method: "GET" | "POST";
109
+ /**
110
+ * 処理中断用の中断シグナルです。
111
+ */
112
+ readonly signal: AbortSignal;
113
+ /**
114
+ * 保持されている読み取り専用のフォームデータです。GET リクエストの場合は `null` となります。
115
+ */
116
+ readonly formData: ReadonlyFormData | null;
117
+ /**
118
+ * インスタンスが保持する情報を基に、Web 標準である Fetch API の `Request` オブジェクトを構築して返します。
119
+ *
120
+ * 外部から任意の `RequestInit` オプションが指定された場合は、インスタンス固有の既定値を上書きします。
121
+ *
122
+ * @param init リクエストの生成オプションを上書きするための初期化オブジェクトです。既定値は空のオブジェクトです。
123
+ * @returns Fetch API でそのまま利用可能な `Request` インスタンスです。
124
+ */
125
+ toRequest(init?: RequestInit): Request;
126
+ };
127
+ /**
128
+ * GET メソッド用の `RouteGetRequest` インスタンスを生成するファクトリーメソッドです。
129
+ *
130
+ * @param method HTTP メソッド名("GET")です。
131
+ * @param url 読み取り専用の URL オブジェクトです。
132
+ * @param signal 処理中断用の中断シグナルです。
133
+ * @returns `RouteGetRequest` インターフェースを満たすインスタンスを返します。
134
+ */
135
+ "new"(method: "GET", url: ReadonlyURL, signal: AbortSignal): RouteGetRequest;
136
+ /**
137
+ * POST メソッド用の `RoutePostRequest` インスタンスを生成するファクトリーメソッドです。
138
+ *
139
+ * @param method HTTP メソッド名("POST")です。
140
+ * @param url 読み取り専用の URL オブジェクトです。
141
+ * @param signal 処理中断用の中断シグナルです。
142
+ * @param formData 読み取り専用のフォームデータです。
143
+ * @returns `RoutePostRequest` インターフェースを満たすインスタンスを返します。
144
+ */
145
+ "new"(method: "POST", url: ReadonlyURL, signal: AbortSignal, formData: ReadonlyFormData): RoutePostRequest;
146
+ };
147
+ export type { RouteGetRequest, RoutePostRequest };
148
+ export default RouteRequest;
149
+ //# sourceMappingURL=route-request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-request.d.ts","sourceRoot":"","sources":["../../../src/core/route-request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D;;;;GAIG;AACH,UAAU,eAAe;IACvB;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;IAEvB;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC;IAE1B;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAE7B;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IAExB;;;;;OAKG;IACH,SAAS,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC;CACxC;AAED;;;;GAIG;AACH,UAAU,gBAAgB;IACxB;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC;IAE1B;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAE7B;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IAEpC;;;;;OAKG;IACH,SAAS,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC;CACxC;AAED;;GAEG;AACH,KAAK,YAAY,GAAG,eAAe,GAAG,gBAAgB,CAAC;AAWvD;;;;GAIG;AACH,QAAA,MAAM,YAAY;iBAsDW,KAAK,OAAO,WAAW,UAAU,WAAW;QAvBvE;;WAEG;sBACkB,WAAW;QAEhC;;WAEG;yBACqB,KAAK,GAAG,MAAM;QAEtC;;WAEG;yBACqB,WAAW;QAEnC;;WAEG;2BACuB,gBAAgB,GAAG,IAAI;QAkCjD;;;;;;;WAOG;yBACoB,WAAW,GAAQ,OAAO;;iBA/BvC,MAAM,OACT,WAAW,UACR,WAAW,YACT,gBAAgB;QAhC5B;;WAEG;sBACkB,WAAW;QAEhC;;WAEG;yBACqB,KAAK,GAAG,MAAM;QAEtC;;WAEG;yBACqB,WAAW;QAEnC;;WAEG;2BACuB,gBAAgB,GAAG,IAAI;QAkCjD;;;;;;;WAOG;yBACoB,WAAW,GAAQ,OAAO;;IA1FjD;;;;;;;OAOG;kBACuB,KAAK,OAAO,WAAW,UAAU,WAAW,GAAG,eAAe;IAExF;;;;;;;;OAQG;kBAEO,MAAM,OACT,WAAW,UACR,WAAW,YACT,gBAAgB,GACzB,gBAAgB;CAkFpB,CAAC;AAEF,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,CAAC;AAElD,eAAe,YAAY,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * ルーティングコンテキストにおける HTTP リクエストを抽象化し、管理するクラスです。
3
+ *
4
+ * メソッドの種類(GET / POST)に応じて、型安全なリクエストの生成と Web 標準の `Request` オブジェクトへの変換を提供します。
5
+ */
6
+ const RouteRequest = class RouteRequest {
7
+ static new(...args) {
8
+ return new RouteRequest(...args);
9
+ }
10
+ /**
11
+ * `RouteRequest` コンストラクターの実装本体です。
12
+ *
13
+ * 渡された引数をそれぞれのプロパティーに代入して内部状態を初期化します。
14
+ */
15
+ constructor(method, url, signal, formData = null) {
16
+ this.url = url;
17
+ this.method = method;
18
+ this.signal = signal;
19
+ this.formData = formData;
20
+ }
21
+ /**
22
+ * インスタンスが保持する情報を基に、Web 標準である Fetch API の `Request` オブジェクトを構築して返します。
23
+ *
24
+ * 外部から任意の `RequestInit` オプションが指定された場合は、インスタンス固有の既定値を上書きします。
25
+ *
26
+ * @param init リクエストの生成オプションを上書きするための初期化オブジェクトです。既定値は空のオブジェクトです。
27
+ * @returns Fetch API でそのまま利用可能な `Request` インスタンスです。
28
+ */
29
+ toRequest(init = {}) {
30
+ const {
31
+ // 内部の型定義の整合性を維持するため、読み取り専用のインターフェースである formData を、標準の Request の body に適合する FormData 型にキャストしています。
32
+ body = this.formData, method = this.method, signal = this.signal, ...other } = init;
33
+ return new Request(this.url.href, {
34
+ body,
35
+ method,
36
+ signal,
37
+ ...other,
38
+ });
39
+ }
40
+ };
41
+ export default RouteRequest;
@@ -0,0 +1,296 @@
1
+ import type * as React from "react";
2
+ import type { ReadonlyURL } from "./readonly-url.types.js";
3
+ import type { RouteGetRequest, RoutePostRequest } from "./route-request.js";
4
+ /**
5
+ * 個別のパスパラメーターを解析し、適切なプロパティーの型オブジェクトへと変換する内部ユーティリティー型です。
6
+ *
7
+ * パラメーターの末尾の形状を条件付き型により詳細に選別します。
8
+ *
9
+ * @template Param 解析対象となる単一のパラメーター文字列です。
10
+ */
11
+ type ParamRecord<Param extends string> = Param extends `${infer Name}?` ? {
12
+ [K in Name]?: string;
13
+ } : Param extends `${infer Name}.${string}` ? {
14
+ [K in Name]: string;
15
+ } : {
16
+ [K in Param]: string;
17
+ };
18
+ /**
19
+ * パス文字列のセグメントから動的なパラメーターやワイルドカードを再帰的に抽出し、型安全なオブジェクト構造を構築するユーティリティー型です。
20
+ *
21
+ * 開発者が指定した文字列リテラル型の形状に基づいて、ルーティングに必要なパラメーターの型を静的に決定します。
22
+ *
23
+ * このユーティリティー型は、ライブラリー `regexparam` の改良版です。
24
+ *
25
+ * @template T 解析対象となる URL パス全体の文字列リテラル型です。
26
+ * @see https://github.com/lukeed/regexparam
27
+ * @see https://github.com/lukeed/regexparam/issues/31
28
+ * @see https://github.com/lukeed/regexparam/pull/33
29
+ */
30
+ type RouteParams<T extends string> = string extends T ? {
31
+ [K in string]?: string;
32
+ } : T extends `${infer Prev}/*/${infer Rest}` ? RouteParams<Prev> & {
33
+ wild: string;
34
+ } & RouteParams<`/${Rest}`> : T extends `:${infer Rest}` ? RouteParams<`/:${Rest}`> : T extends `${string}:${infer Param}/${infer Rest}` ? ParamRecord<Param> & RouteParams<`/${Rest}`> : T extends `${string}/:${infer Param}` ? ParamRecord<Param> : T extends `${string}/*?` ? {
35
+ "*"?: string;
36
+ } : T extends `${string}/*` ? {
37
+ "*": string;
38
+ } : {};
39
+ /**
40
+ * 文字列リテラルとして定義されたパスの形状から、含まれるパスパラメーターを解析し、静的に型付けされたオブジェクトとして抽出する型定義です。
41
+ *
42
+ * @template TRoutePath パラメーター抽出の対象となるパス文字列リテラル型です。
43
+ */
44
+ export type RoutePathParams<TRoutePath extends string = string> = Readonly<RouteParams<TRoutePath>>;
45
+ /**
46
+ * データ更新などのアクション処理を実行する際に、該当する関数へ渡される引数の型定義です。
47
+ *
48
+ * 解析済みのパスパラメーターと、HTTP の POST メソッドを抽象化したリクエストオブジェクトを含みます。
49
+ *
50
+ * @template TRoutePath 対象となるルートのパス文字列リテラル型です。
51
+ */
52
+ export type ActionFunctionArgs<TRoutePath extends string = string> = {
53
+ /**
54
+ * 現在の URL パスから抽出されたパラメーターオブジェクトです。
55
+ */
56
+ params: RoutePathParams<TRoutePath>;
57
+ /**
58
+ * フォームデータなどを内包する、HTTP の POST メソッドに特化したルーティングリクエストオブジェクトです。
59
+ */
60
+ request: RoutePostRequest;
61
+ };
62
+ /**
63
+ * データの登録、更新、削除といった副作用を伴うアクション処理を定義するための関数インターフェースです。
64
+ *
65
+ * @template TRoutePath 対象となるルートのパス文字列リテラル型です。
66
+ * @template TData アクション関数が返す戻り値の型定義です。既定値は `unknown` です。
67
+ */
68
+ export interface ActionFunction<TRoutePath extends string = string, TData = unknown> {
69
+ (args: ActionFunctionArgs<TRoutePath>): TData;
70
+ }
71
+ /**
72
+ * ページ遷移やデータ更新が発生した際、現在の画面データを再読み込みすべきかどうかを判定する関数へ渡される引数の型定義です。
73
+ *
74
+ * アクションを実行した契機となる HTTP メソッドの種類(GET / POST)に応じて、含まれるコンテキスト情報が分岐します。
75
+ *
76
+ * @template TRoutePath 対象となるルートのパス文字列リテラル型です。
77
+ */
78
+ export type ShouldReloadFunctionArgs<TRoutePath extends string = string> = {
79
+ /**
80
+ * 再読み込みを引き起こした HTTP メソッドの種別です。
81
+ */
82
+ triggerMethod: "GET";
83
+ /**
84
+ * 現在の画面に対応する読み取り専用 URL オブジェクトです。
85
+ */
86
+ currentUrl: ReadonlyURL;
87
+ /**
88
+ * 現在の URL から抽出されたパスパラメーターです。
89
+ */
90
+ currentParams: RoutePathParams<TRoutePath>;
91
+ /**
92
+ * POST リクエストが発生する直前の読み取り専用 URL オブジェクトです。
93
+ */
94
+ prevUrl: ReadonlyURL;
95
+ /**
96
+ * POST リクエストが発生する直前の URL から抽出されたパスパラメーターです。
97
+ */
98
+ prevParams: RoutePathParams;
99
+ /**
100
+ * システムが内部ロジックに基づいて判断した、再読み込み実行の既定の判定フラグです。
101
+ */
102
+ defaultShouldReload: boolean;
103
+ } | {
104
+ /**
105
+ * 再読み込みを引き起こした HTTP メソッドの種別です。
106
+ */
107
+ triggerMethod: "POST";
108
+ /**
109
+ * 現在の画面に対応する読み取り専用 URL オブジェクトです。
110
+ */
111
+ currentUrl: ReadonlyURL;
112
+ /**
113
+ * 現在の URL から抽出されたパスパラメーターです。
114
+ */
115
+ currentParams: RoutePathParams<TRoutePath>;
116
+ /**
117
+ * POST リクエストが発生する直前の読み取り専用 URL オブジェクトです。
118
+ */
119
+ prevUrl: ReadonlyURL;
120
+ /**
121
+ * POST リクエストが発生する直前の URL から抽出されたパスパラメーターです。
122
+ */
123
+ prevParams: RoutePathParams;
124
+ /**
125
+ * POST リクエストと共に送信された標準のフォームデータオブジェクトです。
126
+ */
127
+ formData: FormData;
128
+ /**
129
+ * 直前に実行されたアクション関数から返されたデータです。
130
+ */
131
+ actionData: unknown;
132
+ /**
133
+ * システムが内部ロジックに基づいて判断した、再読み込み実行の既定の判定フラグです。
134
+ */
135
+ defaultShouldReload: boolean;
136
+ };
137
+ /**
138
+ * ルートデータの再読み込みが不必要な場合に、余分な通信や再取得処理を抑制するための判定関数インターフェースです。
139
+ *
140
+ * @template TRoutePath 対象となるルートのパス文字列リテラル型です。
141
+ * @returns データを再読み込みする場合は `true`、スキップする場合は `false` を返します。
142
+ */
143
+ export interface ShouldReloadFunction<TRoutePath extends string = string> {
144
+ (args: ShouldReloadFunctionArgs<TRoutePath>): boolean;
145
+ }
146
+ /**
147
+ * 画面の描画に必要なデータを取得(ロード)する際に、該当する関数へ渡される引数の型定義です。
148
+ *
149
+ * 解析済みのパスパラメーターと、HTTP の GET メソッドを抽象化したリクエストオブジェクトを含みます。
150
+ *
151
+ * @template TRoutePath 対象となるルートのパス文字列リテラル型です。
152
+ */
153
+ export type LoaderFunctionArgs<TRoutePath extends string = string> = {
154
+ /**
155
+ * 現在の URL パスから抽出されたパラメーターオブジェクトです。
156
+ */
157
+ params: RoutePathParams<TRoutePath>;
158
+ /**
159
+ * HTTP の GET メソッドに特化したルーティングリクエストオブジェクトです。
160
+ */
161
+ request: RouteGetRequest;
162
+ };
163
+ /**
164
+ * 画面の初期描画時や遷移時にデータをオンデマンドで取得するための関数インターフェースです。
165
+ *
166
+ * @template TRoutePath 対象となるルートのパス文字列リテラル型です。
167
+ * @template TData ローダー関数が返す戻り値の型定義です。既定値は `unknown` です。
168
+ */
169
+ export interface LoaderFunction<TRoutePath extends string = string, TData = unknown> {
170
+ (args: LoaderFunctionArgs<TRoutePath>): TData;
171
+ }
172
+ /**
173
+ * アプリケーションのルーティング設定を定義するためのオブジェクトの型定義です。
174
+ *
175
+ * 開発者が宣言的にルーティングのツリーやリストを記述する際に使用します。
176
+ *
177
+ * @template TPath ルートに関連付けるパス文字列リテラル型です。
178
+ */
179
+ export type RouteDefinitionObject<TPath extends string = string> = {
180
+ /**
181
+ * マッチングの対象となる URL パスのパターン文字列です。
182
+ */
183
+ readonly path: TPath;
184
+ /**
185
+ * 親ルートのパスにおいて、インデックスルートとして機能させるかどうかのフラグです。
186
+ */
187
+ readonly index?: boolean | undefined;
188
+ /**
189
+ * このルートで実行されるデータ更新用のアクション関数です。
190
+ */
191
+ readonly action?: ActionFunction<TPath> | undefined;
192
+ /**
193
+ * このルートのデータ再読み込み動作を制御する判定関数です。
194
+ */
195
+ readonly shouldReload?: ShouldReloadFunction<TPath> | undefined;
196
+ /**
197
+ * このルートの画面描画に必要なデータを取得する関数です。
198
+ */
199
+ readonly loader?: LoaderFunction<TPath> | undefined;
200
+ /**
201
+ * このルートに対応して描画される React のコンポーネントです。
202
+ */
203
+ readonly component?: React.ComponentType<{}> | undefined;
204
+ };
205
+ /**
206
+ * ルーティング設定をインポート経由で定義するための構造体型定義です。
207
+ *
208
+ * @template TPath ルートに関連付けるパス文字列リテラル型です。
209
+ */
210
+ export type RouteDefinitionModule<TPath extends string = string> = {
211
+ /**
212
+ * マッチングの対象となる URL パスのパターン文字列です。
213
+ */
214
+ readonly path: TPath;
215
+ /**
216
+ * 親ルートのパスにおいて、インデックスルートとして機能させるかどうかのフラグです。
217
+ */
218
+ readonly index?: boolean | undefined;
219
+ /**
220
+ * このルートで実行されるデータ更新用のアクション関数です。
221
+ */
222
+ readonly action?: ActionFunction<TPath> | undefined;
223
+ /**
224
+ * このルートのデータ再読み込み動作を制御する判定関数です。
225
+ */
226
+ readonly shouldReload?: ShouldReloadFunction<TPath> | undefined;
227
+ /**
228
+ * このルートの画面描画に必要なデータを取得する関数です。
229
+ */
230
+ readonly loader?: LoaderFunction<TPath> | undefined;
231
+ /**
232
+ * このルートに対応して描画される React のコンポーネントです。
233
+ *
234
+ * `default` プロパティーよりこちらが優先されます。
235
+ */
236
+ readonly component?: React.ComponentType<{}> | undefined;
237
+ /**
238
+ * ES モジュールのデフォルトエクスポートとして定義された、描画対象となる React のコンポーネントです。
239
+ *
240
+ * `component` プロパティーがない場合はこちらにフォールバックされます。
241
+ */
242
+ readonly default?: React.ComponentType<{}> | undefined;
243
+ /**
244
+ * オブジェクトの文字列表現をカスタマイズするための組み込みタグプロパティーです。
245
+ *
246
+ * モジュールオブジェクトとしての識別に使用します。
247
+ */
248
+ get [Symbol.toStringTag](): string;
249
+ };
250
+ /**
251
+ * アプリケーションのルーティング設定を定義するためのオブジェクトの型定義です。
252
+ *
253
+ * @template TPath ルートに関連付けるパス文字列リテラル型です。
254
+ */
255
+ export type RouteDefinition<TPath extends string = string> = RouteDefinitionObject<TPath> | RouteDefinitionModule<TPath>;
256
+ /**
257
+ * `RouteDefinition` を基にシステム内部で解析・コンパイルされ、ルーティングエンジンが直接処理を行うための実体化されたルートオブジェクトの型定義です。
258
+ *
259
+ * 省略可能だったプロパティーが正規化され、正規表現によるマッチング機構が追加されています。
260
+ */
261
+ export type Route = {
262
+ /**
263
+ * マッチングの対象となる URL パスのパターン文字列です。
264
+ */
265
+ readonly path: string;
266
+ /**
267
+ * インデックスルートであるかどうかの確定的なフラグです。
268
+ */
269
+ readonly index: boolean;
270
+ /**
271
+ * 実際の URL パスがこのルートに合致するかを検証するために動的に生成された正規表現オブジェクトです。
272
+ */
273
+ readonly pathPattern: RegExp;
274
+ /**
275
+ * パスパターン内に含まれるパラメーターのキー名を、順番通りに格納した読み取り専用の配列です。
276
+ */
277
+ readonly paramKeys: readonly string[];
278
+ /**
279
+ * データ更新用のアクション関数です。未定義の場合は `undefined` となります。
280
+ */
281
+ readonly action: ActionFunction | undefined;
282
+ /**
283
+ * データの再読み込み動作を制御する確定的な判定関数です。定義がない場合はシステム既定の挙動を行う関数が割り当てられます。
284
+ */
285
+ readonly shouldReload: ShouldReloadFunction;
286
+ /**
287
+ * 画面描画に必要なデータを取得する関数です。未定義の場合は `undefined` となります。
288
+ */
289
+ readonly loader: LoaderFunction | undefined;
290
+ /**
291
+ * 表示対象となる React のコンポーネントです。未定義の場合は `undefined` となります。
292
+ */
293
+ readonly component: React.ComponentType<{}> | undefined;
294
+ };
295
+ export {};
296
+ //# sourceMappingURL=route.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.types.d.ts","sourceRoot":"","sources":["../../../src/core/route.types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import { NinjaPromise } from "ninja-promise";
2
+ import type { HistoryEntryUrl } from "./history-entry-url-schema.js";
3
+ import type { MatchedRoute } from "./match-routes.js";
4
+ import type { ReadonlyFormData } from "./readonly-form-data.types.js";
5
+ import RedirectResponse from "./redirect-response.js";
6
+ import type { ActionFunction } from "./route.types.js";
7
+ /**
8
+ * アクション処理の実行開始時に必要となる、起点リクエスト情報の型定義です。
9
+ */
10
+ export type ActionStartRequest = {
11
+ /**
12
+ * アクションの送信先(トリガーされた現在)の正規化済み URL オブジェクトです。
13
+ */
14
+ readonly url: HistoryEntryUrl;
15
+ /**
16
+ * クライアントから送信された、書き換え用の不変なフォームデータです。
17
+ */
18
+ readonly formData: ReadonlyFormData;
19
+ /**
20
+ * 実行中の非同期アクションを外部から中断するための中断シグナルです。
21
+ */
22
+ readonly signal: AbortSignal;
23
+ };
24
+ /**
25
+ * 起動されたアクションの実行コンテキストおよび非同期状態を追跡・制御するためのインターフェースです。
26
+ */
27
+ export interface StartedAction {
28
+ /**
29
+ * アクションの実行結果、または現在進行中の非同期状態を表す `NinjaPromise` です。
30
+ */
31
+ data: NinjaPromise<unknown>;
32
+ /**
33
+ * 実際に実行対象として選出されたアクション関数の参照です。
34
+ */
35
+ func: ActionFunction;
36
+ /**
37
+ * アクションの非同期処理が完了してアイドル状態に移行するのを待機し、処理結果に伴うリダイレクト要求の有無を回収します。
38
+ *
39
+ * @returns 処理結果に伴うリダイレクト要求を含むオブジェクトです。
40
+ */
41
+ idle: () => Promise<{
42
+ redirectTo: RedirectResponse | undefined;
43
+ }>;
44
+ }
45
+ /**
46
+ * マッチしたルート配列から、アクションの送信先に近い親ルートのアクション関数を 1 つだけ選出して実行し、リダイレクトの傍受や応答データの型正規化などを行う、POST 処理の開始関数です。
47
+ *
48
+ * @param routes 現在の URL にマッチしたルート情報の配列です。
49
+ * @param request アクションを起動するための URL、フォームデータ、および中断シグナルを含むオブジェクトです。
50
+ * @returns 実行対象のアクション関数が検出された場合は `StartedAction` オブジェクトを返し、1つも定義されていなかった場合は `null` を返します。
51
+ */
52
+ export default function startAction(routes: readonly Pick<MatchedRoute, "params" | "action" | "urlPath">[], request: ActionStartRequest): StartedAction | null;
53
+ //# sourceMappingURL=start-action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-action.d.ts","sourceRoot":"","sources":["../../../src/core/start-action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,gBAAgB,MAAM,wBAAwB,CAAC;AAEtD,OAAO,KAAK,EAAE,cAAc,EAAmB,MAAM,kBAAkB,CAAC;AAExE;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC;IAE9B;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IAEpC;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;CAC9B,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,IAAI,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;IAE5B;;OAEG;IACH,IAAI,EAAE,cAAc,CAAC;IAErB;;;;OAIG;IACH,IAAI,EAAE,MAAM,OAAO,CAAC;QAClB,UAAU,EAAE,gBAAgB,GAAG,SAAS,CAAC;KAC1C,CAAC,CAAC;CACJ;AAED;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,UAAU,WAAW,CACjC,MAAM,EAAE,SAAS,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC,EAAE,EACtE,OAAO,EAAE,kBAAkB,GAC1B,aAAa,GAAG,IAAI,CAmGtB"}
@@ -0,0 +1,95 @@
1
+ import { NinjaPromise } from "ninja-promise";
2
+ import unreachable from "./_unreachable.js";
3
+ import RedirectResponse from "./redirect-response.js";
4
+ import RouteRequest from "./route-request.js";
5
+ /**
6
+ * マッチしたルート配列から、アクションの送信先に近い親ルートのアクション関数を 1 つだけ選出して実行し、リダイレクトの傍受や応答データの型正規化などを行う、POST 処理の開始関数です。
7
+ *
8
+ * @param routes 現在の URL にマッチしたルート情報の配列です。
9
+ * @param request アクションを起動するための URL、フォームデータ、および中断シグナルを含むオブジェクトです。
10
+ * @returns 実行対象のアクション関数が検出された場合は `StartedAction` オブジェクトを返し、1つも定義されていなかった場合は `null` を返します。
11
+ */
12
+ export default function startAction(routes, request) {
13
+ let action;
14
+ let params;
15
+ let urlPath;
16
+ for ({ action, params, urlPath } of routes) {
17
+ if (
18
+ // アクションを実行するために、関数が定義されている必要があります。
19
+ typeof action === "function" &&
20
+ // アクションの送信先に近い親ルートを選出します。
21
+ request.url.pathname.startsWith(urlPath)) {
22
+ break;
23
+ }
24
+ }
25
+ if (typeof action !== "function") {
26
+ return null;
27
+ }
28
+ let actionData;
29
+ let redirectTo;
30
+ const actionReturn = NinjaPromise.try(function executeAction() {
31
+ return action({
32
+ params,
33
+ request: RouteRequest.new("POST", request.url, request.signal, request.formData),
34
+ });
35
+ });
36
+ switch (actionReturn.status) {
37
+ case "pending": {
38
+ // アクションの戻り値が非同期(Promise)である場合、中継用のプロミスを作成して状態変化をコントロールします。
39
+ const proxy = NinjaPromise.withResolvers();
40
+ actionData = proxy.promise;
41
+ // 非同期の完了を追跡します。
42
+ void (async () => {
43
+ const value = await actionReturn;
44
+ switch (true) {
45
+ // アクションの非同期結果がリダイレクト応答(RedirectResponse)であった場合、
46
+ // 内部状態にリダイレクト先を記録し、画面側のコンポーネントが参照するデータとしては undefined を返してデータ露出を抑制します。
47
+ case value instanceof RedirectResponse:
48
+ redirectTo = value;
49
+ return undefined;
50
+ default:
51
+ return value;
52
+ }
53
+ })()
54
+ .then((value) => proxy.resolve(value))
55
+ .catch((reason) => proxy.reject(reason)); // 例外が発生した場合はそのまま下流へ伝播させます。
56
+ break;
57
+ }
58
+ case "rejected":
59
+ // 同期的な実行の段階で既に例外が発生している場合は、特別な加工をせずそのままエラー状態を引き継ぎます。
60
+ // エラーハンドリングの責務は、このアクションデータを参照・購読するコンポーネント側に一任されます。
61
+ actionData = actionReturn;
62
+ break;
63
+ case "fulfilled": {
64
+ // 同期的に実行が完了し、すでに値が確定している場合の処理です。
65
+ const { value } = actionReturn;
66
+ switch (true) {
67
+ case value instanceof RedirectResponse:
68
+ // 返り値がリダイレクト指示である場合は、リダイレクト先を記録し、データを undefined に置き換えた解決済みのプロミスを作成します。
69
+ redirectTo = value;
70
+ actionData = NinjaPromise.resolve(undefined);
71
+ break;
72
+ default:
73
+ // 通常のデータであれば、そのままの完了状態をアクションデータとして引き継ぎます。
74
+ actionData = actionReturn;
75
+ }
76
+ break;
77
+ }
78
+ default:
79
+ unreachable(actionReturn);
80
+ }
81
+ return {
82
+ data: actionData,
83
+ func: action,
84
+ async idle() {
85
+ try {
86
+ // アクションデータのエラーハンドリングはコンポーネント側に一任されます。
87
+ await actionData;
88
+ }
89
+ catch { }
90
+ return {
91
+ redirectTo,
92
+ };
93
+ },
94
+ };
95
+ }