akanjs 2.2.4-rc.4 → 2.2.4

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 (608) hide show
  1. package/base/base.test.ts +135 -0
  2. package/base/base.ts +1 -1
  3. package/base/baseEnv.test.ts +146 -0
  4. package/base/primitiveRegistry.test.ts +127 -0
  5. package/base/primitiveRegistry.ts +10 -6
  6. package/base/symbols.test.ts +29 -0
  7. package/base/types.ts +4 -1
  8. package/base/utils.test.ts +30 -0
  9. package/build.ts +318 -0
  10. package/capacitor.base.config.test.ts +83 -0
  11. package/capacitor.base.config.ts +1 -1
  12. package/client/capacitor.ts +1 -1
  13. package/client/client.auth-storage.test.ts +210 -0
  14. package/client/client.decorators.test.ts +74 -0
  15. package/client/client.device.test.ts +181 -0
  16. package/client/client.page.test.tsx +175 -0
  17. package/client/client.pure.test.ts +146 -0
  18. package/client/client.router.test.ts +290 -0
  19. package/client/cookie.ts +4 -2
  20. package/client/createFont.ts +2 -2
  21. package/client/csrTypes.ts +8 -2
  22. package/client/makePageProto.tsx +10 -4
  23. package/client/router.ts +8 -3
  24. package/client/translator.ts +12 -4
  25. package/common/Logger.test.ts +45 -0
  26. package/common/Logger.ts +4 -1
  27. package/common/formatAndValidation.test.ts +61 -0
  28. package/common/formatNumber.ts +5 -2
  29. package/common/hmrPhase.ts +1 -1
  30. package/common/httpClient.test.ts +91 -0
  31. package/common/isValidDate.ts +3 -0
  32. package/common/objectPath.test.ts +108 -0
  33. package/common/routeConvention.test.ts +132 -0
  34. package/common/runtimeConfig.test.ts +84 -0
  35. package/constant/constant.test.ts +374 -0
  36. package/constant/fieldInfo.ts +3 -3
  37. package/constant/purify.ts +2 -1
  38. package/constant/types.ts +4 -0
  39. package/constant/via.ts +12 -6
  40. package/dictionary/dictionary.test.ts +352 -0
  41. package/document/databaseRegistry.ts +8 -0
  42. package/document/document.test.ts +698 -0
  43. package/document/into.ts +1 -0
  44. package/fetch/client/fetchClient.ts +6 -1
  45. package/fetch/client/httpClient.ts +2 -1
  46. package/fetch/fetch.test.ts +838 -0
  47. package/fetch/fetchType/appliedReturn.type.ts +1 -0
  48. package/fetch/fetchType/endpointFetch.type.ts +3 -0
  49. package/fetch/fetchType/sliceFetch.type.ts +8 -0
  50. package/fetch/requestStorage.ts +10 -2
  51. package/package.json +24 -67
  52. package/server/akanApp.test.ts +130 -0
  53. package/server/akanApp.ts +5 -2
  54. package/server/akanLib.ts +1 -0
  55. package/server/akanServer.test.ts +157 -0
  56. package/server/akanServer.ts +4 -3
  57. package/server/artifact/builderRpc.ts +2 -2
  58. package/server/artifact/ipcTypes.ts +4 -0
  59. package/server/artifact/routeClientCache.test.ts +265 -0
  60. package/server/artifact/routeSeedIndex.test.ts +56 -0
  61. package/server/artifact/routesManifest.test.ts +64 -0
  62. package/server/decorators.ts +1 -1
  63. package/server/di/diLifecycle.contract.test.ts +168 -0
  64. package/server/di/diLifecycle.ts +6 -3
  65. package/server/hmr/clientScript.ts +20 -2
  66. package/server/hmr/devHmrController.ts +4 -0
  67. package/server/logging/rotatingLogWriter.test.ts +119 -0
  68. package/server/processMetrics.test.ts +24 -0
  69. package/server/processMetricsCollector.ts +1 -1
  70. package/server/proxy/webProxyRunner.test.ts +66 -0
  71. package/server/resolver/database.resolver.ts +2 -2
  72. package/server/resolver/resolver.contract.fixture.ts +1 -0
  73. package/server/resolver/resolver.contract.test.ts +594 -0
  74. package/server/resolver/signal.resolver.ts +10 -2
  75. package/server/robots.test.ts +16 -0
  76. package/server/routeTree.test.tsx +198 -0
  77. package/server/routing/apiRouter.test.ts +136 -0
  78. package/server/routing/apiRouter.ts +4 -2
  79. package/server/rscClient.tsx +7 -1
  80. package/server/rscWorkerHost.ts +33 -11
  81. package/server/sitemap.test.ts +61 -0
  82. package/server/ssrFromRscRenderer.tsx +35 -3
  83. package/server/systemPages.test.tsx +93 -0
  84. package/server/types/react-server-dom-webpack.d.ts +7 -1
  85. package/server/vendor/react-dom-client.ts +1 -1
  86. package/server/vendor/react-dom.ts +3 -2
  87. package/server/vendor/react-jsx-dev-runtime.ts +1 -1
  88. package/server/vendor/react-jsx-runtime.ts +1 -1
  89. package/server/vendor/react-refresh-runtime.ts +2 -2
  90. package/server/vendor/react-server-dom-webpack-client-browser.ts +1 -1
  91. package/server/vendor/react.ts +9 -2
  92. package/server/vendor/scheduler.ts +3 -2
  93. package/server/webRouter.test.ts +49 -0
  94. package/server/webRouter.ts +3 -2
  95. package/service/adapt.ts +5 -1
  96. package/service/predefinedAdaptor/cache.adaptor.ts +2 -1
  97. package/service/predefinedAdaptor/compress.adaptor.test.ts +184 -0
  98. package/service/predefinedAdaptor/database.adaptor.ts +20 -8
  99. package/service/predefinedAdaptor/solidCache.adaptor.test.ts +107 -0
  100. package/service/predefinedAdaptor/solidSqlite.test.ts +457 -0
  101. package/service/predefinedAdaptor/solidSqlite.ts +2 -1
  102. package/service/predefinedAdaptor/websocket.adaptor.ts +15 -3
  103. package/service/serve.ts +7 -3
  104. package/service/service.test.ts +732 -0
  105. package/signal/base.signal.ts +1 -0
  106. package/signal/endpointInfo.ts +7 -0
  107. package/signal/intercept.ts +2 -0
  108. package/signal/middleware.ts +2 -1
  109. package/signal/serverSignal.ts +15 -1
  110. package/signal/signal.test.ts +892 -0
  111. package/signal/signalContext.ts +1 -1
  112. package/signal/signalRegistry.ts +5 -0
  113. package/signal/sliceInfo.ts +3 -0
  114. package/signal/trace.ts +11 -0
  115. package/signal/types.ts +11 -2
  116. package/store/action.ts +5 -3
  117. package/store/stateBuilder.test.ts +168 -0
  118. package/store/stateBuilder.ts +2 -0
  119. package/store/stateInfo.ts +2 -1
  120. package/store/store.test.ts +427 -0
  121. package/store/types.ts +1 -1
  122. package/test/playwright.config.base.ts +28 -5
  123. package/test/playwright.pageAgent.ts +1 -1
  124. package/test/sampleOf.ts +1 -1
  125. package/test/testServer.ts +1 -1
  126. package/tsconfig.json +5 -0
  127. package/ui/BottomSheet.tsx +1 -1
  128. package/ui/Clipboard.tsx +1 -1
  129. package/ui/Constant/schemaDoc.test.ts +113 -0
  130. package/ui/CsrImage.tsx +14 -3
  131. package/ui/Data/ListContainer.tsx +1 -1
  132. package/ui/Data/Pagination.tsx +1 -1
  133. package/ui/Data/QueryMaker.tsx +339 -0
  134. package/ui/Data/index.ts +1 -0
  135. package/ui/DatePicker.tsx +95 -1
  136. package/ui/Dialog/Modal.tsx +1 -1
  137. package/ui/DraggableList.tsx +5 -5
  138. package/ui/Field.tsx +3 -2
  139. package/ui/Image.tsx +3 -2
  140. package/ui/InfiniteScroll.test.tsx +155 -0
  141. package/ui/InfiniteScroll.tsx +1 -0
  142. package/ui/Input.tsx +8 -1
  143. package/ui/Layout/BottomTab.tsx +2 -2
  144. package/ui/Link/SsrLink.tsx +2 -1
  145. package/ui/Load/Page.tsx +1 -1
  146. package/ui/Load/PageCSR.tsx +1 -0
  147. package/ui/Load/Units.tsx +2 -1
  148. package/ui/Load/View.tsx +2 -1
  149. package/ui/Menu.tsx +8 -5
  150. package/ui/Model/EditModal.tsx +5 -2
  151. package/ui/Popconfirm.tsx +4 -2
  152. package/ui/ScreenNavigator.tsx +3 -2
  153. package/ui/Signal/Message.tsx +3 -2
  154. package/ui/Signal/PubSub.tsx +2 -0
  155. package/ui/Signal/Response.tsx +1 -1
  156. package/ui/Signal/WebSocket.tsx +11 -2
  157. package/ui/System/Client.tsx +41 -7
  158. package/ui/System/Common.test.ts +37 -0
  159. package/ui/System/Gtag.tsx +5 -2
  160. package/ui/System/Messages.tsx +2 -2
  161. package/ui/System/Reconnect.tsx +6 -5
  162. package/ui/System/Root.tsx +1 -0
  163. package/ui/System/SSR.tsx +7 -1
  164. package/ui/ToggleSelect.tsx +8 -3
  165. package/ui/Unauthorized.tsx +1 -1
  166. package/webkit/bootCsr.test.tsx +153 -0
  167. package/webkit/bootCsr.tsx +6 -3
  168. package/webkit/lazy.tsx +8 -1
  169. package/webkit/native.test.tsx +341 -0
  170. package/webkit/useCamera.tsx +1 -0
  171. package/webkit/useCodepush.tsx +9 -4
  172. package/webkit/useContact.tsx +1 -0
  173. package/webkit/useCsrValues.ts +10 -6
  174. package/webkit/useDebounce.ts +2 -2
  175. package/webkit/usePurchase.tsx +9 -5
  176. package/webkit/usePushNoti.tsx +1 -0
  177. package/webkit/webkit.test.tsx +531 -0
  178. package/types/base/base.d.ts +0 -53
  179. package/types/base/baseEnv.d.ts +0 -68
  180. package/types/base/index.d.ts +0 -6
  181. package/types/base/primitiveRegistry.d.ts +0 -134
  182. package/types/base/symbols.d.ts +0 -11
  183. package/types/base/types.d.ts +0 -68
  184. package/types/base/utils.d.ts +0 -4
  185. package/types/base.d.ts +0 -1
  186. package/types/capacitor.base.config.d.ts +0 -3
  187. package/types/client/capacitor.d.ts +0 -233
  188. package/types/client/clientRuntime.d.ts +0 -63
  189. package/types/client/cookie.d.ts +0 -33
  190. package/types/client/createFont.d.ts +0 -6
  191. package/types/client/csrTypes.d.ts +0 -262
  192. package/types/client/decorators.d.ts +0 -7
  193. package/types/client/device.d.ts +0 -41
  194. package/types/client/fetch.d.ts +0 -1
  195. package/types/client/index.d.ts +0 -14
  196. package/types/client/locale.d.ts +0 -5
  197. package/types/client/makePageProto.d.ts +0 -17002
  198. package/types/client/router.d.ts +0 -66
  199. package/types/client/rscNavigation.d.ts +0 -19
  200. package/types/client/storage.d.ts +0 -5
  201. package/types/client/translator.d.ts +0 -18
  202. package/types/client/types.d.ts +0 -145
  203. package/types/client/useClient.d.ts +0 -1
  204. package/types/client.d.ts +0 -1
  205. package/types/common/Logger.d.ts +0 -41
  206. package/types/common/applyMixins.d.ts +0 -3
  207. package/types/common/capitalize.d.ts +0 -2
  208. package/types/common/deepObjectify.d.ts +0 -4
  209. package/types/common/fileUpload.d.ts +0 -28
  210. package/types/common/formatNumber.d.ts +0 -1
  211. package/types/common/formatPhone.d.ts +0 -2
  212. package/types/common/getAllPropertyDescriptors.d.ts +0 -5
  213. package/types/common/hmrPhase.d.ts +0 -6
  214. package/types/common/httpClient.d.ts +0 -20
  215. package/types/common/index.d.ts +0 -29
  216. package/types/common/isDayjs.d.ts +0 -2
  217. package/types/common/isEmail.d.ts +0 -2
  218. package/types/common/isPhoneNumber.d.ts +0 -2
  219. package/types/common/isQueryEqual.d.ts +0 -1
  220. package/types/common/isValidDate.d.ts +0 -2
  221. package/types/common/jwtDecode.d.ts +0 -2
  222. package/types/common/localeConfig.d.ts +0 -11
  223. package/types/common/lowerlize.d.ts +0 -2
  224. package/types/common/mergeVersion.d.ts +0 -10
  225. package/types/common/objectify.d.ts +0 -1
  226. package/types/common/pathGet.d.ts +0 -1
  227. package/types/common/pathSet.d.ts +0 -3
  228. package/types/common/randomPick.d.ts +0 -1
  229. package/types/common/randomPicks.d.ts +0 -1
  230. package/types/common/routeConvention.d.ts +0 -35
  231. package/types/common/sleep.d.ts +0 -2
  232. package/types/common/splitVersion.d.ts +0 -11
  233. package/types/common/subRoute.d.ts +0 -7
  234. package/types/common/types.d.ts +0 -14
  235. package/types/common.d.ts +0 -1
  236. package/types/constant/constantRegistry.d.ts +0 -89
  237. package/types/constant/crystalize.d.ts +0 -4
  238. package/types/constant/deserialize.d.ts +0 -7
  239. package/types/constant/fieldInfo.d.ts +0 -153
  240. package/types/constant/getDefault.d.ts +0 -3
  241. package/types/constant/immerify.d.ts +0 -2
  242. package/types/constant/index.d.ts +0 -10
  243. package/types/constant/purify.d.ts +0 -12
  244. package/types/constant/serialize.d.ts +0 -11
  245. package/types/constant/types.d.ts +0 -77
  246. package/types/constant/via.d.ts +0 -52
  247. package/types/constant.d.ts +0 -1
  248. package/types/dictionary/base.dictionary.d.ts +0 -1
  249. package/types/dictionary/dictInfo.d.ts +0 -206
  250. package/types/dictionary/dictionary.d.ts +0 -11
  251. package/types/dictionary/index.d.ts +0 -4
  252. package/types/dictionary/locale.d.ts +0 -128
  253. package/types/dictionary/trans.d.ts +0 -82
  254. package/types/dictionary.d.ts +0 -1
  255. package/types/document/by.d.ts +0 -20
  256. package/types/document/dataLoader.d.ts +0 -36
  257. package/types/document/database.d.ts +0 -96
  258. package/types/document/databaseRegistry.d.ts +0 -36
  259. package/types/document/documentQuery.d.ts +0 -105
  260. package/types/document/documentSchema.d.ts +0 -33
  261. package/types/document/filterMeta.d.ts +0 -84
  262. package/types/document/index.d.ts +0 -11
  263. package/types/document/into.d.ts +0 -65
  264. package/types/document/loaderInfo.d.ts +0 -35
  265. package/types/document/schema.d.ts +0 -5
  266. package/types/document/types.d.ts +0 -36
  267. package/types/document.d.ts +0 -1
  268. package/types/fetch/client/fetchClient.d.ts +0 -78
  269. package/types/fetch/client/httpClient.d.ts +0 -39
  270. package/types/fetch/client/index.d.ts +0 -3
  271. package/types/fetch/client/wsClient.d.ts +0 -37
  272. package/types/fetch/client.d.ts +0 -1
  273. package/types/fetch/fetchType/appliedReturn.type.d.ts +0 -67
  274. package/types/fetch/fetchType/buildFetch.type.d.ts +0 -11
  275. package/types/fetch/fetchType/clientSignal.type.d.ts +0 -16
  276. package/types/fetch/fetchType/endpointFetch.type.d.ts +0 -29
  277. package/types/fetch/fetchType/index.d.ts +0 -5
  278. package/types/fetch/fetchType/sliceFetch.type.d.ts +0 -76
  279. package/types/fetch/fetchType.d.ts +0 -1
  280. package/types/fetch/index.d.ts +0 -4
  281. package/types/fetch/requestStorage.d.ts +0 -29
  282. package/types/fetch/serializer/fetch.serializer.d.ts +0 -14
  283. package/types/fetch/serializer/index.d.ts +0 -1
  284. package/types/fetch/serializer.d.ts +0 -1
  285. package/types/fetch/types.d.ts +0 -19
  286. package/types/fetch.d.ts +0 -1
  287. package/types/index.d.ts +0 -213
  288. package/types/server/akanApp.d.ts +0 -17
  289. package/types/server/akanAppHeaders.d.ts +0 -1
  290. package/types/server/akanLib.d.ts +0 -33
  291. package/types/server/akanOption.d.ts +0 -15
  292. package/types/server/akanServer.d.ts +0 -47
  293. package/types/server/artifact/builderRpc.d.ts +0 -42
  294. package/types/server/artifact/index.d.ts +0 -6
  295. package/types/server/artifact/ipcTypes.d.ts +0 -73
  296. package/types/server/artifact/manifestTypes.d.ts +0 -16
  297. package/types/server/artifact/routeClientCache.d.ts +0 -45
  298. package/types/server/artifact/routeSeedIndexStore.d.ts +0 -43
  299. package/types/server/artifact/routesManifestStore.d.ts +0 -16
  300. package/types/server/artifact.d.ts +0 -1
  301. package/types/server/decorators.d.ts +0 -6
  302. package/types/server/di/diLifecycle.d.ts +0 -45
  303. package/types/server/di/index.d.ts +0 -4
  304. package/types/server/di/predefinedAdaptor.d.ts +0 -33
  305. package/types/server/di/resolveAdaptorHierarchy.d.ts +0 -21
  306. package/types/server/di/resolveHierarchy.d.ts +0 -11
  307. package/types/server/di/resolveServiceHierarchy.d.ts +0 -13
  308. package/types/server/di/utils.d.ts +0 -14
  309. package/types/server/di.d.ts +0 -1
  310. package/types/server/hmr/changeBatch.d.ts +0 -13
  311. package/types/server/hmr/clientScript.d.ts +0 -1
  312. package/types/server/hmr/devHmrController.d.ts +0 -24
  313. package/types/server/hmr/index.d.ts +0 -4
  314. package/types/server/hmr/wsHub.d.ts +0 -45
  315. package/types/server/hmr.d.ts +0 -1
  316. package/types/server/imageOptimizer.d.ts +0 -12
  317. package/types/server/imageOptimizerError.d.ts +0 -4
  318. package/types/server/index.d.ts +0 -14
  319. package/types/server/lifecycle/shutdownManager.d.ts +0 -13
  320. package/types/server/logging/rotatingLogWriter.d.ts +0 -20
  321. package/types/server/processMetricsCollector.d.ts +0 -10
  322. package/types/server/proxy/akanResponse.d.ts +0 -7
  323. package/types/server/proxy/bunRequestFields.d.ts +0 -1
  324. package/types/server/proxy/hostBasePathWebProxy.d.ts +0 -6
  325. package/types/server/proxy/index.d.ts +0 -6
  326. package/types/server/proxy/localeWebProxy.d.ts +0 -5
  327. package/types/server/proxy/types.d.ts +0 -37
  328. package/types/server/proxy/webProxyRunner.d.ts +0 -7
  329. package/types/server/proxy.d.ts +0 -1
  330. package/types/server/resolver/database.resolver.d.ts +0 -6
  331. package/types/server/resolver/index.d.ts +0 -3
  332. package/types/server/resolver/service.resolver.d.ts +0 -7
  333. package/types/server/resolver/signal.resolver.d.ts +0 -29
  334. package/types/server/resolver.d.ts +0 -1
  335. package/types/server/robots.d.ts +0 -1
  336. package/types/server/routeElementComposer.d.ts +0 -41
  337. package/types/server/routeTreeBuilder.d.ts +0 -28
  338. package/types/server/routing/apiRouter.d.ts +0 -61
  339. package/types/server/rscClient.d.ts +0 -15
  340. package/types/server/rscWorker.d.ts +0 -3
  341. package/types/server/rscWorkerHost.d.ts +0 -83
  342. package/types/server/sitemap.d.ts +0 -13
  343. package/types/server/ssrFromRscRenderer.d.ts +0 -6
  344. package/types/server/ssrTypes.d.ts +0 -47
  345. package/types/server/systemPages.d.ts +0 -27
  346. package/types/server/types/react-server-dom-webpack.d.ts +0 -91
  347. package/types/server/types.d.ts +0 -67
  348. package/types/server/vendor/akanjs-base.d.ts +0 -1
  349. package/types/server/vendor/akanjs-common.d.ts +0 -1
  350. package/types/server/vendor/akanjs-constant.d.ts +0 -1
  351. package/types/server/vendor/akanjs-store.d.ts +0 -1
  352. package/types/server/vendor/react-dom-client.d.ts +0 -3
  353. package/types/server/vendor/react-dom.d.ts +0 -3
  354. package/types/server/vendor/react-jsx-dev-runtime.d.ts +0 -3
  355. package/types/server/vendor/react-jsx-runtime.d.ts +0 -3
  356. package/types/server/vendor/react-refresh-runtime.d.ts +0 -3
  357. package/types/server/vendor/react-server-dom-webpack-client-browser.d.ts +0 -3
  358. package/types/server/vendor/react.d.ts +0 -11
  359. package/types/server/vendor/scheduler.d.ts +0 -3
  360. package/types/server/webRouter.d.ts +0 -44
  361. package/types/server.d.ts +0 -1
  362. package/types/service/adapt.d.ts +0 -15
  363. package/types/service/base.service.d.ts +0 -18
  364. package/types/service/index.d.ts +0 -10
  365. package/types/service/injectInfo.d.ts +0 -102
  366. package/types/service/ipcTypes.d.ts +0 -194
  367. package/types/service/predefinedAdaptor/cache.adaptor.d.ts +0 -46
  368. package/types/service/predefinedAdaptor/compress.adaptor.d.ts +0 -22
  369. package/types/service/predefinedAdaptor/database.adaptor.d.ts +0 -329
  370. package/types/service/predefinedAdaptor/index.d.ts +0 -13
  371. package/types/service/predefinedAdaptor/logging.adaptor.d.ts +0 -20
  372. package/types/service/predefinedAdaptor/queue.adaptor.d.ts +0 -22
  373. package/types/service/predefinedAdaptor/role.adaptor.d.ts +0 -17
  374. package/types/service/predefinedAdaptor/schedule.adaptor.d.ts +0 -60
  375. package/types/service/predefinedAdaptor/solidCache.adaptor.d.ts +0 -25
  376. package/types/service/predefinedAdaptor/solidPubsub.adaptor.d.ts +0 -20
  377. package/types/service/predefinedAdaptor/solidQueue.adaptor.d.ts +0 -19
  378. package/types/service/predefinedAdaptor/solidSqlite.d.ts +0 -24
  379. package/types/service/predefinedAdaptor/sqlitePath.d.ts +0 -9
  380. package/types/service/predefinedAdaptor/storage.adaptor.d.ts +0 -80
  381. package/types/service/predefinedAdaptor/websocket.adaptor.d.ts +0 -49
  382. package/types/service/predefinedAdaptor.d.ts +0 -1
  383. package/types/service/serve.d.ts +0 -31
  384. package/types/service/serviceModule.d.ts +0 -50
  385. package/types/service/serviceRegistry.d.ts +0 -9
  386. package/types/service/types.d.ts +0 -55
  387. package/types/service.d.ts +0 -1
  388. package/types/signal/base.signal.d.ts +0 -41
  389. package/types/signal/endpoint.d.ts +0 -28
  390. package/types/signal/endpointInfo.d.ts +0 -77
  391. package/types/signal/exception.d.ts +0 -54786
  392. package/types/signal/guard.d.ts +0 -10
  393. package/types/signal/guards.d.ts +0 -10
  394. package/types/signal/index.d.ts +0 -19
  395. package/types/signal/intercept.d.ts +0 -17
  396. package/types/signal/internal.d.ts +0 -18
  397. package/types/signal/internalArg.d.ts +0 -31
  398. package/types/signal/internalInfo.d.ts +0 -45
  399. package/types/signal/middleware.d.ts +0 -51
  400. package/types/signal/serializer/fetch.serializer.d.ts +0 -14
  401. package/types/signal/serializer/index.d.ts +0 -1
  402. package/types/signal/serializer.d.ts +0 -1
  403. package/types/signal/serverSignal.d.ts +0 -36
  404. package/types/signal/signalContext.d.ts +0 -96
  405. package/types/signal/signalRegistry.d.ts +0 -49
  406. package/types/signal/slice.d.ts +0 -42
  407. package/types/signal/sliceInfo.d.ts +0 -51
  408. package/types/signal/trace.d.ts +0 -97
  409. package/types/signal/types.d.ts +0 -142
  410. package/types/signal.d.ts +0 -1
  411. package/types/store/action.d.ts +0 -145
  412. package/types/store/baseSt.d.ts +0 -412
  413. package/types/store/hooks.d.ts +0 -1
  414. package/types/store/index.d.ts +0 -8
  415. package/types/store/rootStore.d.ts +0 -22
  416. package/types/store/state.d.ts +0 -91
  417. package/types/store/stateBuilder.d.ts +0 -141
  418. package/types/store/stateInfo.d.ts +0 -23
  419. package/types/store/store.d.ts +0 -36
  420. package/types/store/storeInstance.d.ts +0 -38
  421. package/types/store/storeRegistry.d.ts +0 -13
  422. package/types/store/types.d.ts +0 -42
  423. package/types/store/withSelector.d.ts +0 -42
  424. package/types/store.d.ts +0 -1
  425. package/types/test/index.d.ts +0 -4
  426. package/types/test/playwright.config.base.d.ts +0 -9
  427. package/types/test/playwright.pageAgent.d.ts +0 -12
  428. package/types/test/sample.d.ts +0 -15
  429. package/types/test/sampleOf.d.ts +0 -5
  430. package/types/test/signalTest.preload.d.ts +0 -1
  431. package/types/test/signalTestRuntime.d.ts +0 -29
  432. package/types/test/testServer.d.ts +0 -26
  433. package/types/test.d.ts +0 -1
  434. package/types/ui/BottomSheet.d.ts +0 -13
  435. package/types/ui/Button.d.ts +0 -11
  436. package/types/ui/ClientSide.d.ts +0 -8
  437. package/types/ui/Clipboard.d.ts +0 -7
  438. package/types/ui/Constant/Doc.d.ts +0 -29
  439. package/types/ui/Constant/Mermaid.d.ts +0 -8
  440. package/types/ui/Constant/index.d.ts +0 -6
  441. package/types/ui/Constant/schemaDoc.d.ts +0 -84
  442. package/types/ui/Constant.d.ts +0 -1
  443. package/types/ui/Copy.d.ts +0 -10
  444. package/types/ui/CsrImage.d.ts +0 -18
  445. package/types/ui/Data/CardList.d.ts +0 -36
  446. package/types/ui/Data/Dashboard.d.ts +0 -11
  447. package/types/ui/Data/Insight.d.ts +0 -9
  448. package/types/ui/Data/Item.d.ts +0 -75
  449. package/types/ui/Data/ListContainer.d.ts +0 -49
  450. package/types/ui/Data/Pagination.d.ts +0 -9
  451. package/types/ui/Data/QueryMaker.d.ts +0 -8
  452. package/types/ui/Data/TableList.d.ts +0 -26
  453. package/types/ui/Data/index.d.ts +0 -9
  454. package/types/ui/Data/index_.d.ts +0 -8
  455. package/types/ui/Data.d.ts +0 -1
  456. package/types/ui/DatePicker.d.ts +0 -36
  457. package/types/ui/Dialog/Action.d.ts +0 -5
  458. package/types/ui/Dialog/Close.d.ts +0 -6
  459. package/types/ui/Dialog/Content.d.ts +0 -6
  460. package/types/ui/Dialog/Modal.d.ts +0 -9
  461. package/types/ui/Dialog/Provider.d.ts +0 -11
  462. package/types/ui/Dialog/Title.d.ts +0 -5
  463. package/types/ui/Dialog/Trigger.d.ts +0 -6
  464. package/types/ui/Dialog/context.d.ts +0 -10
  465. package/types/ui/Dialog/index.d.ts +0 -9
  466. package/types/ui/Dialog.d.ts +0 -1
  467. package/types/ui/DragAction.d.ts +0 -24
  468. package/types/ui/DraggableList.d.ts +0 -31
  469. package/types/ui/Dropdown.d.ts +0 -14
  470. package/types/ui/Empty.d.ts +0 -12
  471. package/types/ui/Field.d.ts +0 -411
  472. package/types/ui/FontFace.d.ts +0 -6
  473. package/types/ui/Image.d.ts +0 -49
  474. package/types/ui/InfiniteScroll.d.ts +0 -10
  475. package/types/ui/Input.d.ts +0 -95
  476. package/types/ui/KeyboardAvoiding.d.ts +0 -8
  477. package/types/ui/Layout/BottomAction.d.ts +0 -6
  478. package/types/ui/Layout/BottomInset.d.ts +0 -7
  479. package/types/ui/Layout/BottomTab.d.ts +0 -14
  480. package/types/ui/Layout/Header.d.ts +0 -8
  481. package/types/ui/Layout/LeftSider.d.ts +0 -9
  482. package/types/ui/Layout/Navbar.d.ts +0 -11
  483. package/types/ui/Layout/RightSider.d.ts +0 -10
  484. package/types/ui/Layout/Sider.d.ts +0 -7
  485. package/types/ui/Layout/Template.d.ts +0 -7
  486. package/types/ui/Layout/TopLeftAction.d.ts +0 -6
  487. package/types/ui/Layout/Unit.d.ts +0 -9
  488. package/types/ui/Layout/View.d.ts +0 -8
  489. package/types/ui/Layout/Zone.d.ts +0 -6
  490. package/types/ui/Layout/index.d.ts +0 -14
  491. package/types/ui/Layout.d.ts +0 -1
  492. package/types/ui/Link/Back.d.ts +0 -7
  493. package/types/ui/Link/Close.d.ts +0 -7
  494. package/types/ui/Link/CsrLink.d.ts +0 -2
  495. package/types/ui/Link/Lang.d.ts +0 -8
  496. package/types/ui/Link/SsrLink.d.ts +0 -2
  497. package/types/ui/Link/index.d.ts +0 -10
  498. package/types/ui/Link/types.d.ts +0 -42
  499. package/types/ui/Link.d.ts +0 -1
  500. package/types/ui/Load/Edit.d.ts +0 -4
  501. package/types/ui/Load/Edit_Client.d.ts +0 -27
  502. package/types/ui/Load/Page.d.ts +0 -15
  503. package/types/ui/Load/PageCSR.d.ts +0 -3
  504. package/types/ui/Load/Pagination.d.ts +0 -8
  505. package/types/ui/Load/Units.d.ts +0 -30
  506. package/types/ui/Load/View.d.ts +0 -22
  507. package/types/ui/Load/index.d.ts +0 -8
  508. package/types/ui/Load/index_.d.ts +0 -3
  509. package/types/ui/Load.d.ts +0 -1
  510. package/types/ui/Loading/Area.d.ts +0 -1
  511. package/types/ui/Loading/Button.d.ts +0 -7
  512. package/types/ui/Loading/Input.d.ts +0 -7
  513. package/types/ui/Loading/ProgressBar.d.ts +0 -6
  514. package/types/ui/Loading/Skeleton.d.ts +0 -7
  515. package/types/ui/Loading/Spin.d.ts +0 -7
  516. package/types/ui/Loading/index.d.ts +0 -8
  517. package/types/ui/Loading.d.ts +0 -1
  518. package/types/ui/Menu.d.ts +0 -26
  519. package/types/ui/Modal.d.ts +0 -19
  520. package/types/ui/Model/AdminPanel.d.ts +0 -31
  521. package/types/ui/Model/Edit.d.ts +0 -16
  522. package/types/ui/Model/EditModal.d.ts +0 -52
  523. package/types/ui/Model/EditWrapper.d.ts +0 -13
  524. package/types/ui/Model/LoadInit.d.ts +0 -10
  525. package/types/ui/Model/New.d.ts +0 -16
  526. package/types/ui/Model/NewWrapper.d.ts +0 -13
  527. package/types/ui/Model/NewWrapper_Client.d.ts +0 -13
  528. package/types/ui/Model/Remove.d.ts +0 -13
  529. package/types/ui/Model/RemoveWrapper.d.ts +0 -12
  530. package/types/ui/Model/SureToRemove.d.ts +0 -11
  531. package/types/ui/Model/View.d.ts +0 -19
  532. package/types/ui/Model/ViewEditModal.d.ts +0 -12
  533. package/types/ui/Model/ViewModal.d.ts +0 -14
  534. package/types/ui/Model/ViewWrapper.d.ts +0 -12
  535. package/types/ui/Model/index.d.ts +0 -16
  536. package/types/ui/Model/index_.d.ts +0 -14
  537. package/types/ui/Model.d.ts +0 -1
  538. package/types/ui/More.d.ts +0 -12
  539. package/types/ui/ObjectId.d.ts +0 -5
  540. package/types/ui/Pagination.d.ts +0 -20
  541. package/types/ui/Popconfirm.d.ts +0 -28
  542. package/types/ui/Portal.d.ts +0 -6
  543. package/types/ui/Radio.d.ts +0 -19
  544. package/types/ui/RecentTime.d.ts +0 -12
  545. package/types/ui/Refresh.d.ts +0 -7
  546. package/types/ui/ScreenNavigator.d.ts +0 -18
  547. package/types/ui/Select.d.ts +0 -43
  548. package/types/ui/Signal/Arg.d.ts +0 -78
  549. package/types/ui/Signal/Doc.d.ts +0 -33
  550. package/types/ui/Signal/Listener.d.ts +0 -9
  551. package/types/ui/Signal/Message.d.ts +0 -23
  552. package/types/ui/Signal/Object.d.ts +0 -20
  553. package/types/ui/Signal/PubSub.d.ts +0 -24
  554. package/types/ui/Signal/Request.d.ts +0 -8
  555. package/types/ui/Signal/Response.d.ts +0 -14
  556. package/types/ui/Signal/RestApi.d.ts +0 -40
  557. package/types/ui/Signal/WebSocket.d.ts +0 -11
  558. package/types/ui/Signal/index.d.ts +0 -18
  559. package/types/ui/Signal/makeExample.d.ts +0 -4
  560. package/types/ui/Signal/style.d.ts +0 -15
  561. package/types/ui/Signal.d.ts +0 -1
  562. package/types/ui/System/CSR.d.ts +0 -32
  563. package/types/ui/System/Client.d.ts +0 -47
  564. package/types/ui/System/Common.d.ts +0 -47
  565. package/types/ui/System/DevModeToggle.d.ts +0 -1
  566. package/types/ui/System/Gtag.d.ts +0 -4
  567. package/types/ui/System/Messages.d.ts +0 -1
  568. package/types/ui/System/Reconnect.d.ts +0 -1
  569. package/types/ui/System/Root.d.ts +0 -6
  570. package/types/ui/System/SSR.d.ts +0 -24
  571. package/types/ui/System/SelectLanguage.d.ts +0 -5
  572. package/types/ui/System/ThemeToggle.d.ts +0 -4
  573. package/types/ui/System/index.d.ts +0 -12
  574. package/types/ui/System.d.ts +0 -1
  575. package/types/ui/Tab/Menu.d.ts +0 -12
  576. package/types/ui/Tab/Menus.d.ts +0 -6
  577. package/types/ui/Tab/Panel.d.ts +0 -8
  578. package/types/ui/Tab/Provider.d.ts +0 -10
  579. package/types/ui/Tab/context.d.ts +0 -9
  580. package/types/ui/Tab/index.d.ts +0 -7
  581. package/types/ui/Tab.d.ts +0 -1
  582. package/types/ui/Table.d.ts +0 -41
  583. package/types/ui/ToggleSelect.d.ts +0 -33
  584. package/types/ui/Unauthorized.d.ts +0 -9
  585. package/types/ui/animated.d.ts +0 -5
  586. package/types/ui/fontCss.d.ts +0 -11
  587. package/types/ui/index.d.ts +0 -44
  588. package/types/ui.d.ts +0 -1
  589. package/types/webkit/bootCsr.d.ts +0 -16
  590. package/types/webkit/createRobotPage.d.ts +0 -15
  591. package/types/webkit/createSitemapPage.d.ts +0 -4
  592. package/types/webkit/index.d.ts +0 -17
  593. package/types/webkit/lazy.d.ts +0 -11
  594. package/types/webkit/types.d.ts +0 -7
  595. package/types/webkit/useCamera.d.ts +0 -19
  596. package/types/webkit/useCodepush.d.ts +0 -16
  597. package/types/webkit/useContact.d.ts +0 -11
  598. package/types/webkit/useCsrValues.d.ts +0 -30
  599. package/types/webkit/useDebounce.d.ts +0 -2
  600. package/types/webkit/useFetch.d.ts +0 -18
  601. package/types/webkit/useGeoLocation.d.ts +0 -8
  602. package/types/webkit/useHistory.d.ts +0 -23
  603. package/types/webkit/useInterval.d.ts +0 -2
  604. package/types/webkit/useLocation.d.ts +0 -8
  605. package/types/webkit/usePurchase.d.ts +0 -19
  606. package/types/webkit/usePushNoti.d.ts +0 -7
  607. package/types/webkit/useThrottle.d.ts +0 -2
  608. package/types/webkit.d.ts +0 -1
@@ -0,0 +1,290 @@
1
+ import { afterEach, beforeAll, describe, expect, mock, test } from "bun:test";
2
+
3
+ type Side = "server" | "client";
4
+
5
+ const envState = {
6
+ side: "client" as Side,
7
+ operationMode: "local",
8
+ basePaths: "admin,console",
9
+ };
10
+ const requestState = {
11
+ request: undefined as Request | undefined,
12
+ headers: new Map<string, string>(),
13
+ };
14
+ const messages: unknown[] = [];
15
+ const timeoutCallbacks: Array<() => void> = [];
16
+
17
+ beforeAll(() => {
18
+ mock.module("akanjs/base", () => ({
19
+ getEnv: () => ({
20
+ side: envState.side,
21
+ renderMode: "csr",
22
+ appName: "test-app",
23
+ environment: "debug",
24
+ operationMode: envState.operationMode,
25
+ }),
26
+ }));
27
+ mock.module("akanjs/common", () => ({
28
+ Logger: { log: () => undefined, verbose: () => undefined },
29
+ parseAkanI18nEnv: () => ({ locales: ["en", "ko"], defaultLocale: "en" }),
30
+ parseBasePaths: (value?: string) => (value ? value.split(",").filter(Boolean) : []),
31
+ pathGet: (path: string, obj: Record<string, unknown>, separator = ".", fallback?: unknown) =>
32
+ path.split(separator).reduce<unknown>((acc, key) => {
33
+ if (!acc || typeof acc !== "object") return fallback;
34
+ return (acc as Record<string, unknown>)[key] ?? fallback;
35
+ }, obj),
36
+ getBasePathFromPathname: (
37
+ pathname: string,
38
+ opts: { basePaths: Set<string>; i18n: { locales: string[] }; headerBasePath?: string },
39
+ ) => {
40
+ if (opts.headerBasePath) return opts.headerBasePath;
41
+ const [, lang, base] = pathname.split("/");
42
+ return opts.i18n.locales.includes(lang ?? "") && base && opts.basePaths.has(base) ? base : null;
43
+ },
44
+ }));
45
+ mock.module("akanjs/fetch", () => ({
46
+ FetchClient: {
47
+ build: () => ({ fetch: { setJwt: () => undefined }, sig: {} }),
48
+ },
49
+ defaultAccount: { appName: "test-app", environment: "debug" },
50
+ requestStorage: {
51
+ getStore: () => requestState.request,
52
+ },
53
+ getRequest: () => requestState.request,
54
+ headers: () => requestState.headers,
55
+ }));
56
+ });
57
+
58
+ const installClientWindow = (pathname = "/en/admin/current", search = "", hash = "") => {
59
+ Object.defineProperty(globalThis, "window", {
60
+ value: {
61
+ location: { pathname, search, hash },
62
+ parent: { postMessage: (message: unknown) => messages.push(message) },
63
+ },
64
+ configurable: true,
65
+ });
66
+ Object.defineProperty(globalThis, "document", {
67
+ value: { referrer: "https://example.test/en/admin/previous" },
68
+ configurable: true,
69
+ });
70
+ Object.defineProperty(globalThis, "location", {
71
+ value: { pathname, search, hash },
72
+ configurable: true,
73
+ });
74
+ };
75
+
76
+ afterEach(() => {
77
+ envState.side = "client";
78
+ envState.operationMode = "local";
79
+ envState.basePaths = "admin,console";
80
+ process.env.AKAN_PUBLIC_BASE_PATHS = envState.basePaths;
81
+ requestState.request = undefined;
82
+ requestState.headers = new Map();
83
+ messages.length = 0;
84
+ timeoutCallbacks.length = 0;
85
+ globalThis.__AKAN_ROUTER__ = undefined;
86
+ Object.defineProperty(globalThis, "window", { value: undefined, configurable: true });
87
+ Object.defineProperty(globalThis, "document", { value: undefined, configurable: true });
88
+ Object.defineProperty(globalThis, "location", { value: undefined, configurable: true });
89
+ });
90
+
91
+ describe("router", () => {
92
+ test("normalizes paths with language, prefix, query, hash, root, and absolute hrefs", async () => {
93
+ const { getPathInfo } = await import("./router");
94
+
95
+ expect(getPathInfo("/en/admin/users?tab=a#bio", "en", "admin")).toEqual({
96
+ path: "/users",
97
+ pathname: "/en/admin/users",
98
+ search: "tab=a",
99
+ hash: "bio",
100
+ href: "/en/admin/users?tab=a#bio",
101
+ });
102
+ expect(getPathInfo("/en/admin", "en", "admin").path).toBe("/");
103
+ expect(getPathInfo("/users", "ko", "").href).toBe("/ko/users");
104
+ expect(getPathInfo("https://external.test/path", "en", "admin").pathname).toBe("https://external.test/path");
105
+ });
106
+
107
+ test("client router init wraps push, replace, back, refresh, and path helpers", async () => {
108
+ envState.side = "client";
109
+ installClientWindow();
110
+ const originalSetTimeout = globalThis.setTimeout;
111
+ const mockSetTimeout = ((handler: TimerHandler) => {
112
+ timeoutCallbacks.push(() => {
113
+ if (typeof handler === "function") handler();
114
+ });
115
+ return timeoutCallbacks.length as unknown as ReturnType<typeof setTimeout>;
116
+ }) as unknown as typeof setTimeout;
117
+ globalThis.setTimeout = mockSetTimeout;
118
+ const calls: unknown[] = [];
119
+ const { router } = await import("./router");
120
+
121
+ router.init({
122
+ type: "csr",
123
+ lang: "en",
124
+ prefix: "admin",
125
+ router: {
126
+ push: (href, options) => calls.push(["push", href, options]),
127
+ replace: (href, options) => calls.push(["replace", href, options]),
128
+ back: (options) => calls.push(["back", options]),
129
+ refresh: () => calls.push(["refresh"]),
130
+ },
131
+ });
132
+
133
+ router.push("/users", { scrollToTop: true });
134
+ router.replace("/settings");
135
+ expect(calls).toEqual([["push", "/en/admin/users", { scrollToTop: true }]]);
136
+ timeoutCallbacks.splice(0).forEach((callback) => {
137
+ callback();
138
+ });
139
+ expect(calls).toEqual([
140
+ ["push", "/en/admin/users", { scrollToTop: true }],
141
+ ["replace", "/en/admin/settings", undefined],
142
+ ]);
143
+ router.back({ scrollToTop: false });
144
+ router.refresh();
145
+ expect(calls.at(-2)).toEqual(["back", { scrollToTop: false }]);
146
+ expect(calls.at(-1)).toEqual(["refresh"]);
147
+ expect(messages[0]).toMatchObject({ type: "pathChange", path: "/users", pathname: "/en/admin/users" });
148
+ expect(router.getPath("/en/admin/current")).toBe("/current");
149
+ expect(router.getFullPath()).toBe("/en/admin/current");
150
+ expect(router.getPrefixedPath("/next")).toBe("/en/admin/next");
151
+
152
+ router.setLang("ko");
153
+ timeoutCallbacks.splice(0).forEach((callback) => {
154
+ callback();
155
+ });
156
+ expect(calls.at(-1)).toEqual(["replace", "/ko/admin/current", undefined]);
157
+ globalThis.setTimeout = originalSetTimeout;
158
+ });
159
+
160
+ test("csr navigation preserves csr runtime search params", async () => {
161
+ envState.side = "client";
162
+ installClientWindow("/en/admin/current", "?csr=true&akanMobileTarget=default&akanMobileBasePath=admin");
163
+ const originalSetTimeout = globalThis.setTimeout;
164
+ const mockSetTimeout = ((handler: TimerHandler) => {
165
+ timeoutCallbacks.push(() => {
166
+ if (typeof handler === "function") handler();
167
+ });
168
+ return timeoutCallbacks.length as unknown as ReturnType<typeof setTimeout>;
169
+ }) as unknown as typeof setTimeout;
170
+ globalThis.setTimeout = mockSetTimeout;
171
+ const calls: unknown[] = [];
172
+ const { router } = await import("./router");
173
+
174
+ router.init({
175
+ type: "csr",
176
+ lang: "en",
177
+ prefix: "admin",
178
+ router: {
179
+ push: (href, options) => calls.push(["push", href, options]),
180
+ replace: (href, options) => calls.push(["replace", href, options]),
181
+ back: (options) => calls.push(["back", options]),
182
+ refresh: () => calls.push(["refresh"]),
183
+ },
184
+ });
185
+
186
+ router.push("/users?tab=a#bio");
187
+ router.replace("/settings?csr=false");
188
+ timeoutCallbacks.splice(0).forEach((callback) => {
189
+ callback();
190
+ });
191
+
192
+ expect(calls).toEqual([
193
+ ["push", "/en/admin/users?tab=a&csr=true&akanMobileTarget=default&akanMobileBasePath=admin#bio", undefined],
194
+ ["replace", "/en/admin/settings?csr=false&akanMobileTarget=default&akanMobileBasePath=admin", undefined],
195
+ ]);
196
+ globalThis.setTimeout = originalSetTimeout;
197
+ });
198
+
199
+ test("ssr client navigation hides base path outside local mode", async () => {
200
+ envState.side = "client";
201
+ envState.operationMode = "main";
202
+ installClientWindow("/en/current");
203
+ const calls: unknown[] = [];
204
+ const { router } = await import("./router");
205
+
206
+ router.init({
207
+ type: "ssr",
208
+ side: "client",
209
+ lang: "en",
210
+ prefix: "admin",
211
+ router: {
212
+ push: (href, options) => calls.push(["push", href, options]),
213
+ replace: (href, options) => calls.push(["replace", href, options]),
214
+ back: (options) => calls.push(["back", options]),
215
+ refresh: () => calls.push(["refresh"]),
216
+ },
217
+ });
218
+
219
+ router.push("/", { scrollToTop: true });
220
+ router.replace("/users?tab=a#bio");
221
+
222
+ expect(calls).toEqual([
223
+ ["push", "/en", { scrollToTop: true }],
224
+ ["replace", "/en/users?tab=a#bio", undefined],
225
+ ]);
226
+ expect(messages[0]).toMatchObject({ type: "pathChange", path: "/", pathname: "/en/admin" });
227
+ });
228
+
229
+ test("ssr setLang preserves production public paths while switching locale", async () => {
230
+ envState.side = "client";
231
+ envState.operationMode = "main";
232
+ installClientWindow("/ko/docs/intro/fundamentals", "?from=nav", "#section");
233
+ const calls: unknown[] = [];
234
+ const { router } = await import("./router");
235
+
236
+ router.init({
237
+ type: "ssr",
238
+ side: "client",
239
+ lang: "en",
240
+ prefix: "akanjs",
241
+ router: {
242
+ push: (href, options) => calls.push(["push", href, options]),
243
+ replace: (href, options) => calls.push(["replace", href, options]),
244
+ back: (options) => calls.push(["back", options]),
245
+ refresh: () => calls.push(["refresh"]),
246
+ },
247
+ });
248
+
249
+ router.setLang("ko");
250
+
251
+ expect(calls).toEqual([["replace", "/ko/docs/intro/fundamentals?from=nav#section", undefined]]);
252
+ expect(messages[0]).toMatchObject({
253
+ type: "pathChange",
254
+ path: "/docs/intro/fundamentals",
255
+ pathname: "/ko/akanjs/docs/intro/fundamentals",
256
+ hash: "section",
257
+ });
258
+ });
259
+
260
+ test("throws initialized guard before init and server redirect/notFound errors", async () => {
261
+ envState.side = "client";
262
+ installClientWindow();
263
+ const { AkanNotFoundError, AkanRedirectError, router } = await import("./router");
264
+
265
+ envState.side = "server";
266
+ process.env.AKAN_PUBLIC_BASE_PATHS = "admin,console";
267
+ requestState.request = new Request("https://example.test/en/admin/current");
268
+ requestState.headers = new Map([
269
+ ["x-locale", "en"],
270
+ ["x-base-path", "admin"],
271
+ ]);
272
+ expect(() => router.redirect("/users?tab=a")).toThrow(AkanRedirectError);
273
+ try {
274
+ router.redirect("/users?tab=a");
275
+ } catch (error) {
276
+ expect(error).toBeInstanceOf(AkanRedirectError);
277
+ expect((error as Error & { location: string; method: string }).location).toBe("/en/admin/users?tab=a");
278
+ expect((error as Error & { method: string }).method).toBe("replace");
279
+ }
280
+ envState.operationMode = "main";
281
+ expect(() => router.redirect("/users?tab=a")).toThrow(AkanRedirectError);
282
+ try {
283
+ router.redirect("/users?tab=a");
284
+ } catch (error) {
285
+ expect(error).toBeInstanceOf(AkanRedirectError);
286
+ expect((error as Error & { location: string; method: string }).location).toBe("/en/users?tab=a");
287
+ }
288
+ expect(() => router.notFound()).toThrow(AkanNotFoundError);
289
+ });
290
+ });
package/client/cookie.ts CHANGED
@@ -49,7 +49,7 @@ export const setCookie = (
49
49
  const path = options.path ? `; path=${options.path}` : "";
50
50
  const sameSite = options.sameSite ? `; SameSite=${options.sameSite}` : "";
51
51
  const secure = options.secure ? "; Secure" : "";
52
-
52
+ // biome-ignore lint/suspicious/noDocumentCookie: Akan auth helpers intentionally manage browser cookies.
53
53
  document.cookie = `${encoded}${path}${sameSite}${secure}`;
54
54
  if (env.renderMode !== "csr") return;
55
55
  void loadCapacitorCore()
@@ -59,6 +59,7 @@ export const setCookie = (
59
59
 
60
60
  export const getCookie = (key: string): string | undefined => {
61
61
  if (getEnv().side === "server") return cookies().get(key)?.value;
62
+ //capacitor 문서에서 document.cookie로 가져오라고 되어었음.
62
63
  else
63
64
  return document.cookie
64
65
  .split(";")
@@ -69,8 +70,9 @@ export const getCookie = (key: string): string | undefined => {
69
70
  export const removeCookie = (key: string, options: { path: string } = { path: "/" }) => {
70
71
  if (getEnv().side === "server") return cookies().delete(key);
71
72
  else {
72
-
73
+ // biome-ignore lint/suspicious/noDocumentCookie: Akan auth helpers intentionally manage browser cookies.
73
74
  document.cookie = `${key}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;
75
+ // void CapacitorCookies.deleteCookie({ key });
74
76
  }
75
77
  };
76
78
  export const headers = (): Map<string, string> => {
@@ -1,5 +1,5 @@
1
-
2
-
1
+ // webpack config에서 alias로 사용하는 파일, null처리로 CSR폰트를 할당할 수 있음.
2
+ // 각 사용하는 폰트마다 여기에 추가해줘야함.
3
3
  export const createFont = (_data: unknown) => null;
4
4
  export default createFont;
5
5
  export const Nanum_Gothic_Coding = createFont;
@@ -133,10 +133,16 @@ export interface Route {
133
133
  renderLayout?: RouteRender;
134
134
  pageIncludesOwnLayout?: boolean;
135
135
  isSpecialRoute?: boolean;
136
-
136
+ // Page?:
137
+ // | (({ params, searchParams }: PageProps) => ReactNode)
138
+ // | (({ params, searchParams }: PageProps) => Promise<ReactNode>);
139
+ // Layout?:
140
+ // | (({ children, params, searchParams }: LayoutProps) => ReactNode)
141
+ // | (({ children, params, searchParams }: LayoutProps) => Promise<ReactNode>);
137
142
  loader?: () => any;
138
143
  pageState?: PageState;
139
-
144
+ // action?: any;
145
+ // ErrorBoundary?: any;
140
146
  children: Map<string, Route>;
141
147
  }
142
148
 
@@ -26,13 +26,17 @@ const getPageInfo = (): { locale: string; path: string } => {
26
26
  if (getEnv().side !== "server") {
27
27
  const [, firstSegment = "", ...rest] = window.location.pathname.split("/");
28
28
  const hasLocalePrefix = localeSet.has(firstSegment);
29
-
29
+ // Prefer the server-resolved active locale (seeded via ClientWrapper) so client lookups match the
30
+ // SSR render even when the URL's leading segment is not the locale (base-path / cloud routing).
31
+ // Fall back to the URL segment for CSR or any pre-seed render.
30
32
  const activeLocale = Translator.getActiveLocale();
31
33
  const locale = activeLocale ?? (hasLocalePrefix ? firstSegment : defaultLocale);
32
34
  return { locale, path: hasLocalePrefix ? `/${rest.join("/")}` : window.location.pathname };
33
35
  }
34
36
  const h = headers();
35
-
37
+ // Honor explicit proxy/middleware headers when present; otherwise derive
38
+ // locale+path from the request URL itself so unadorned dev requests (e.g.
39
+ // `curl /en/hello`) still work.
36
40
  const localeHeader = h.get("x-locale");
37
41
  const pathHeader = h.get("x-path");
38
42
  if (localeHeader && pathHeader) return { locale: localeHeader, path: pathHeader };
@@ -158,11 +162,13 @@ export const makePageProto = <
158
162
  l.rich = (key: DictKey, param?: { [key: string]: string | number }) =>
159
163
  (
160
164
  <span
161
-
165
+ // biome-ignore lint/security/noDangerouslySetInnerHtml: <a>an explanation</a>
162
166
  dangerouslySetInnerHTML={{
163
167
  __html: translator.translate(lang, key, {
164
168
  ...param,
165
-
169
+ // strong: (chunks: string) => `<b>${chunks}</b>`,
170
+ // "bg-primary": (chunks: string) => `<span className="bg-primary text-base-100">${chunks}</span>`,
171
+ // primary: (chunks: string) => `<span className="bg-base-100 text-primary">${chunks}</span>`,
166
172
  br: `<br />`,
167
173
  }),
168
174
  }}
package/client/router.ts CHANGED
@@ -110,10 +110,14 @@ class Router {
110
110
  push: (href: string) => {
111
111
  const { href: fullHref } = this.#getPathInfo(href);
112
112
  Logger.log(`push to:${fullHref}`);
113
+ // ! need to revive
114
+ // if (getEnv().side === "server") void redirect(fullHref);
113
115
  },
114
116
  replace: (href: string) => {
115
117
  const { pathname } = this.#getPathInfo(href);
116
118
  Logger.log(`replace to:${pathname}`);
119
+ // ! need to revive
120
+ // if (getEnv().side === "server") void redirect(fullHref);
117
121
  },
118
122
  back: () => {
119
123
  throw new Error("back is only available in client");
@@ -123,7 +127,7 @@ class Router {
123
127
  },
124
128
  };
125
129
  init(options: SsrClientRouterOption | SsrServerRouterOption | CSRClientRouterOption) {
126
-
130
+ // if (this.isInitialized) throw new Error("Router is already initialized");
127
131
  this.#prefix = options.prefix ?? "";
128
132
  this.#lang = options.lang ?? parseAkanI18nEnv().defaultLocale;
129
133
  if (options.type === "csr") this.#initCsrClientRouter(options);
@@ -133,6 +137,7 @@ class Router {
133
137
  Logger.verbose("Router initialized");
134
138
  }
135
139
  #initSsrServerRouter(options: SsrServerRouterOption) {
140
+ // already initialized in next server
136
141
  }
137
142
  #initSsrClientRouter(options: SsrClientRouterOption) {
138
143
  this.#instance = {
@@ -174,7 +179,7 @@ class Router {
174
179
  replace: (href: string, routeOptions) => {
175
180
  const { path, pathname, hash, href: fullHref } = this.#getPathInfo(href);
176
181
  this.#postPathChange({ path, pathname, hash });
177
-
182
+ // for avoiding set state while rendering in redirect
178
183
  setTimeout(() => {
179
184
  options.router.replace(this.#withCsrRuntimeSearchParams(fullHref), routeOptions);
180
185
  }, 0);
@@ -235,7 +240,7 @@ class Router {
235
240
  }
236
241
  back(routeOptions?: RouteOptions) {
237
242
  if (getEnv().side === "server") throw new Error("back is only available in client side");
238
-
243
+ // history보고 뒤로갈지 끌지 정하던가 먹통하던가
239
244
  this.#checkInitialized();
240
245
  this.#instance.back(routeOptions);
241
246
  return undefined as never;
@@ -11,9 +11,15 @@ export interface AllDictionary {
11
11
 
12
12
  export class Translator {
13
13
  static #langDictionaryMap = new Map<string, Dictionary>();
14
-
14
+ // Tracks dictionary objects already merged into the static map. The seeded
15
+ // snapshot (`allDictionary[lang]`) is a stable module-level reference within a
16
+ // build, so repeat requests skip the merge entirely. A dev rebuild produces a
17
+ // new object reference, which re-seeds and keeps hot reload correct.
15
18
  static #seededDicts = new WeakSet<object>();
16
-
19
+ // Browser-only source of truth for the active locale. Set by ClientWrapper from the server-resolved
20
+ // `lang` (Flight prop) so client lookups use the same locale that was seeded and server-rendered,
21
+ // instead of re-deriving it from the URL (unreliable for base-path / cloud routing). Unsafe on the
22
+ // server (concurrent requests share the module), so it must only be set when `typeof window !== undefined`.
17
23
  static #activeLocale: string | undefined;
18
24
  static setActiveLocale(lang: string | undefined) {
19
25
  if (lang) Translator.#activeLocale = lang;
@@ -29,10 +35,12 @@ export class Translator {
29
35
  hasDictionary(lang: string) {
30
36
  return Translator.#langDictionaryMap.has(lang);
31
37
  }
32
-
38
+ // Synchronously merge a single locale's dictionary into the shared static map.
39
+ // Idempotent: re-seeding the same locale merges keys without dropping existing ones.
40
+ // Used by ClientWrapper to seed the active locale from the server-provided prop.
33
41
  static seed(lang: string, dict: Dictionary | undefined) {
34
42
  if (!dict) return;
35
-
43
+ // Skip the merge when this exact dictionary snapshot was already seeded.
36
44
  if (Translator.#seededDicts.has(dict)) return;
37
45
  Translator.#seededDicts.add(dict);
38
46
  const existingDictionary = Translator.#langDictionaryMap.get(lang) ?? {};
@@ -0,0 +1,45 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import { Logger, type LoggerSinkEntry } from "./Logger";
3
+
4
+ const resetLoggerLevels = () => {
5
+ Logger.setLevel("log");
6
+ Logger.setFileLevel("trace");
7
+ };
8
+
9
+ describe("Logger sinks", () => {
10
+ test("emits file sink entries independently from terminal log level", () => {
11
+ const entries: LoggerSinkEntry[] = [];
12
+ const removeSink = Logger.addSink((entry) => entries.push(entry));
13
+
14
+ try {
15
+ Logger.setLevel("error");
16
+ Logger.setFileLevel("trace");
17
+ Logger.trace("file only", "sink-test", "LoggerTest");
18
+
19
+ expect(entries.length).toBe(1);
20
+ expect(entries[0]?.level).toBe("trace");
21
+ expect(entries[0]?.plainMessage.includes("file only")).toBe(true);
22
+ } finally {
23
+ removeSink();
24
+ resetLoggerLevels();
25
+ }
26
+ });
27
+
28
+ test("filters sink entries with AKAN_LOG_FILE_LEVEL semantics", () => {
29
+ const entries: LoggerSinkEntry[] = [];
30
+ const removeSink = Logger.addSink((entry) => entries.push(entry));
31
+
32
+ try {
33
+ Logger.setLevel("error");
34
+ Logger.setFileLevel("warn");
35
+ Logger.info("skip file", "sink-test", "LoggerTest");
36
+ Logger.warn("keep file", "sink-test", "LoggerTest");
37
+
38
+ expect(entries.map((entry) => entry.level)).toEqual(["warn"]);
39
+ expect(entries[0]?.plainMessage.includes("keep file")).toBe(true);
40
+ } finally {
41
+ removeSink();
42
+ resetLoggerLevels();
43
+ }
44
+ });
45
+ });
package/common/Logger.ts CHANGED
@@ -92,7 +92,7 @@ export class Logger {
92
92
  rawLog(msg: string, method?: "console" | "process") {
93
93
  Logger.rawLog(msg, method);
94
94
  }
95
-
95
+ // biome-ignore lint/suspicious/useAdjacentOverloadSignatures: static logger API mirrors the instance API.
96
96
  static trace(msg: string, context = "", name = "App") {
97
97
  if (Logger.#shouldLog("trace")) Logger.#printMessages(name, msg, context, "trace");
98
98
  }
@@ -134,6 +134,7 @@ export class Logger {
134
134
  try {
135
135
  void Promise.resolve(sink(entry)).catch(() => undefined);
136
136
  } catch {
137
+ // Log sinks are observers; they must not break application logging.
137
138
  }
138
139
  }
139
140
  }
@@ -162,6 +163,7 @@ export class Logger {
162
163
  if (!Logger.#shouldWriteConsole(logLevel)) return;
163
164
  if (typeof window === "undefined")
164
165
  (process[writeStreamType] as unknown as NodeJS.WriteStream | undefined)?.write(message);
166
+ // biome-ignore lint/suspicious/noConsole: browser fallback
165
167
  else console.log(message);
166
168
  }
167
169
  static rawLog(msg = "", method?: "console" | "process", outputStream?: "log" | "error") {
@@ -172,6 +174,7 @@ export class Logger {
172
174
  Logger.#emit({ stream, message: msg, plainMessage: Logger.#stripAnsi(msg) });
173
175
  if (typeof window === "undefined" && method !== "console" && (process as unknown as NodeJS.Process | undefined))
174
176
  process[stream].write(msg);
177
+ // biome-ignore lint/suspicious/noConsole: browser fallback
175
178
  else console[outputStream === "error" ? "error" : "log"](msg.trim());
176
179
  }
177
180
  }
@@ -0,0 +1,61 @@
1
+ import { describe, expect, test } from "bun:test";
2
+
3
+ import {
4
+ capitalize,
5
+ formatNumber,
6
+ formatPhone,
7
+ isEmail,
8
+ isPhoneNumber,
9
+ isValidDate,
10
+ lowerlize,
11
+ mergeVersion,
12
+ splitVersion,
13
+ } from ".";
14
+
15
+ describe("format and validation helpers", () => {
16
+ test("capitalizes and lowerlizes only the first character", () => {
17
+ expect(capitalize("akan")).toBe("Akan");
18
+ expect(capitalize("aKan")).toBe("AKan");
19
+ expect(lowerlize("Akan")).toBe("akan");
20
+ expect(lowerlize("AKan")).toBe("aKan");
21
+ });
22
+
23
+ test("formats numbers while preserving decimal text", () => {
24
+ expect(formatNumber("1234567")).toBe("1,234,567");
25
+ expect(formatNumber("1,234,567.89")).toBe("1,234,567.89");
26
+ expect(formatNumber("12abc34")).toBe("1,234");
27
+ });
28
+
29
+ test("formats supported phone number lengths", () => {
30
+ expect(formatPhone("0101234567")).toBe("010-123-4567");
31
+ expect(formatPhone("010-1234-5678")).toBe("010-1234-5678");
32
+ expect(formatPhone("0212345678")).toBe("021-234-5678");
33
+ expect(formatPhone("12345")).toBe("12345");
34
+ expect(formatPhone("")).toBe("");
35
+ });
36
+
37
+ test("validates email and phone strings", () => {
38
+ expect(isEmail("user@example.com")).toBe(true);
39
+ expect(isEmail("user.name@example.co.kr")).toBe(true);
40
+ expect(isEmail("not-an-email")).toBe(false);
41
+ expect(isEmail(null)).toBe(false);
42
+
43
+ expect(isPhoneNumber("010-1234-5678")).toBe(true);
44
+ expect(isPhoneNumber("031-123-4567")).toBe(true);
45
+ expect(isPhoneNumber("01012345678")).toBe(false);
46
+ expect(isPhoneNumber(undefined)).toBe(false);
47
+ });
48
+
49
+ test("validates dates from strings and Date instances", () => {
50
+ expect(isValidDate("2025-01-01")).toBe(true);
51
+ expect(isValidDate("not-a-date")).toBe(false);
52
+ expect(isValidDate(new Date("2025-01-01T00:00:00.000Z"))).toBe(true);
53
+ expect(isValidDate(new Date("not-a-date"))).toBe(false);
54
+ });
55
+
56
+ test("splits and merges semantic version parts", () => {
57
+ expect(splitVersion("1.2.3")).toEqual({ major: "1", minor: "2", patch: "3" });
58
+ expect(mergeVersion(1, 2, 3)).toBe("1.2.3");
59
+ expect(() => splitVersion("1.2")).toThrow("Invalid version");
60
+ });
61
+ });
@@ -1,14 +1,17 @@
1
1
  export const formatNumber = (numString: string) => {
2
-
2
+ // 문자열이 아니면 문자열로 변환
3
3
  if (typeof numString !== "string") {
4
4
  numString = String(numString);
5
5
  }
6
6
 
7
+ // 소수점이 있는 경우 처리
7
8
  const parts = numString.split(".");
8
- const integerPart = parts[0]?.replace(/[^\d]/g, "") ?? "";
9
+ const integerPart = parts[0]?.replace(/[^\d]/g, "") ?? ""; // 정수 부분에서 숫자만 추출
9
10
  const decimalPart = parts.length > 1 ? `.${parts[1]}` : "";
10
11
 
12
+ // 정수 부분에 콤마 추가
11
13
  const formattedInteger = Number(integerPart).toLocaleString("ko-KR");
12
14
 
15
+ // 정수 부분과 소수 부분 합치기
13
16
  return formattedInteger + decimalPart;
14
17
  };
@@ -1,7 +1,7 @@
1
1
  export type AkanHmrPhase = "refresh-import" | "react-refresh" | null;
2
2
 
3
3
  declare global {
4
-
4
+ // Browser-only dev signal set by the Akan HMR client while applying Fast Refresh.
5
5
  var __AKAN_HMR_PHASE__: AkanHmrPhase | undefined;
6
6
  }
7
7