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
@@ -360,7 +360,7 @@ export class HttpExecutionContext<Appended = unknown> {
360
360
  async getArgs(endpointInfo: EndpointInfo): Promise<unknown[]> {
361
361
  if (endpointInfo.args.length === 0) return [];
362
362
  this.params = this.req.params;
363
-
363
+ // TODO: Optimize the efficiency of this code
364
364
  const hasBodyArgs = endpointInfo.args.some((arg) => arg.type === "body");
365
365
  const hasUploadArgs = hasBodyArgs && endpointInfo.args.some((arg) => arg.type === "body" && arg.argRef === Upload);
366
366
  if (endpointInfo.type === "mutation" && hasBodyArgs && this.req.body) {
@@ -56,6 +56,11 @@ export class ServiceSignal<
56
56
  }
57
57
  }
58
58
 
59
+ // TODO: add scalar signal for resolve field
60
+ // export interface ScalarSignal {
61
+ // internal: InternalCls;
62
+ // }
63
+
59
64
  /** Registry for database and service signals used by routing and fetch serialization. */
60
65
  export class SignalRegistry {
61
66
  static readonly #database = new Map<string, DatabaseSignal<InternalCls, EndpointCls, SliceCls, ServerSignalCls>>();
@@ -202,6 +202,9 @@ export const buildSlice =
202
202
  signalOption,
203
203
  );
204
204
 
205
+ // --- Accessors ---
206
+ // Named projections for SliceInfo's 11 generics. Use these to avoid repeating
207
+ // 11-slot `extends SliceInfo<any, any, ..., infer X, any, any>` patterns.
205
208
  export type SliceInfoRefName<S> =
206
209
  S extends SliceInfo<infer R, any, any, any, any, any, any, any, any, any, any> ? R : never;
207
210
  export type SliceInfoInput<S> =
package/signal/trace.ts CHANGED
@@ -81,6 +81,13 @@ export class SignalTrace {
81
81
  }
82
82
  }
83
83
 
84
+ // Shared across bundle chunks (see traceAggregator note) so that span/db/cache helpers
85
+ // invoked from other modules (database.resolver, middleware) observe the active trace.
86
+ // Shared store pinned to `process`. The akan worker loads the app server bundle and the
87
+ // framework runtime in separate module realms (each with its own `globalThis`), so the
88
+ // signal layer that records spans and the metrics collector that reads them would otherwise
89
+ // hold different singletons. `process` is the one object shared across realms in a single OS
90
+ // process, so we hang the trace ALS + aggregator off it to guarantee a single instance.
84
91
  const traceProcessStore = process as unknown as {
85
92
  __akanTraceAls?: AsyncLocalStorage<SignalTrace>;
86
93
  __akanTraceAggregator?: TraceAggregator;
@@ -246,6 +253,10 @@ const round = (value: number, digits = 3): number => {
246
253
  return Math.round(value * factor) / factor;
247
254
  };
248
255
 
256
+ // The akan build can bundle this module into more than one chunk (e.g. the signal layer
257
+ // that writes spans vs. the metrics collector that reads them). A plain module-level
258
+ // singleton would then diverge per chunk, so pin it to globalThis to guarantee that every
259
+ // copy of this module shares one aggregator within the process.
249
260
  let aggregatorInstance = traceProcessStore.__akanTraceAggregator;
250
261
  if (!aggregatorInstance) {
251
262
  aggregatorInstance = new TraceAggregator();
package/signal/types.ts CHANGED
@@ -4,6 +4,11 @@ import type { GuardCls } from "./guard";
4
4
  import type { MiddlewareCls } from "./middleware";
5
5
  import type { SliceCls } from "./slice";
6
6
 
7
+ // --- ServiceModel projection helpers (D1) ---
8
+ // Use these instead of re-typing `NonNullable<SrvModule["cnst"]>["_Full"]` /
9
+ // `SlceCls["srv"]["cnst"]["_Full"]` everywhere. Centralizing the path keeps
10
+ // type derivations consistent and dramatically reduces the amount of text
11
+ // TypeScript has to re-evaluate at each callsite.
7
12
  export type CnstOf<S extends ServiceModel> = NonNullable<S["cnst"]>;
8
13
  export type DbOf<S extends ServiceModel> = NonNullable<S["db"]>;
9
14
 
@@ -23,6 +28,8 @@ export type CnstCapitalizedRefName<S extends ServiceModel> = CnstOf<S>["_Capital
23
28
  export type DbFilter<S extends ServiceModel> = DbOf<S>["_Filter"];
24
29
  export type DbSort<S extends ServiceModel> = DbOf<S>["_Sort"];
25
30
 
31
+ // Slice-cls shortcuts (common in store/state/action). The branches that
32
+ // include `SlceCls extends SliceCls` preserve `ServiceModel` inference.
26
33
  export type SlceSrv<S extends SliceCls> = S["srv"];
27
34
  export type SlceCnstRefName<S extends SliceCls> = S["srv"]["cnst"]["refName"];
28
35
  export type SlceCnstInput<S extends SliceCls> = S["srv"]["cnst"]["_Input"];
@@ -73,11 +80,13 @@ export interface SignalOption<Response = any, Nullable extends boolean = false,
73
80
  /** Marks this mutation as the framework file-upload endpoint (see resolveFileUploadCapability). */
74
81
  fileUpload?: boolean;
75
82
 
83
+ // * ==================== Schedule ==================== * //
76
84
  scheduleType?: "init" | "destroy" | "cron" | "interval" | "timeout";
77
85
  scheduleCron?: string;
78
86
  scheduleTime?: number;
79
87
  lock?: boolean;
80
88
  enabled?: boolean;
89
+ // * ==================== Schedule ==================== * //
81
90
  }
82
91
 
83
92
  interface SerializedSignalOption {
@@ -92,7 +101,7 @@ export interface SerializedSlice extends SerializedSignalOption {}
92
101
 
93
102
  export interface SerializedReturns {
94
103
  refName: Exclude<DefaultPrimitiveName, "Map" | "Upload"> | (string & {});
95
- modelType?: "input" | "full" | "light" | "insight" | "scalar";
104
+ modelType?: "input" | "full" | "light" | "insight" | "scalar"; // undefined when primitive
96
105
  arrDepth?: number;
97
106
  partial?: string[];
98
107
  nullable?: boolean;
@@ -101,7 +110,7 @@ export interface SerializedArg {
101
110
  type: ArgType;
102
111
  refName: Exclude<DefaultPrimitiveName, "Map"> | (string & {});
103
112
  name: string;
104
- modelType?: "input" | "object" | "insight" | "scalar";
113
+ modelType?: "input" | "object" | "insight" | "scalar"; // undefined when primitive
105
114
  arrDepth?: number;
106
115
  nullable?: boolean;
107
116
  example?: string | number | boolean | Date;
package/store/action.ts CHANGED
@@ -783,6 +783,7 @@ export const makeActions = (refName: string, slice: { [key: string]: SerializedS
783
783
  const currentState = this.get() as { [key: string]: any };
784
784
  if (fullOrLightModels.length === 0) return;
785
785
 
786
+ // set the first model to the model state
786
787
  const firstModel = fullOrLightModels[0];
787
788
  const model = currentState[names.model] as Full | null;
788
789
  const isFull = firstModel instanceof modelRef;
@@ -797,6 +798,7 @@ export const makeActions = (refName: string, slice: { [key: string]: SerializedS
797
798
  this.set({ [names.model]: crystalizedModel });
798
799
  }
799
800
 
801
+ // set the rest of the models to the model list
800
802
  const lightModels = fullOrLightModels.map(
801
803
  (fullOrLightModel) => new cnst.light().set(fullOrLightModel) as unknown as Light,
802
804
  );
@@ -905,7 +907,7 @@ export const makeActions = (refName: string, slice: { [key: string]: SerializedS
905
907
  limit === limitOfModel &&
906
908
  isQueryEqual(sort as unknown as object, sortOfModel as unknown as object)
907
909
  )
908
- return;
910
+ return; // store-level cache hit
909
911
  else this.set({ [namesOfSlice.modelListLoading]: true });
910
912
  const fetchQueryArgs = expandQueryArgs(queryArgs, slice.args);
911
913
  const [modelDataList, modelInsight] = await Promise.all([
@@ -1044,7 +1046,7 @@ export const makeActions = (refName: string, slice: { [key: string]: SerializedS
1044
1046
  const sortOfModel = currentState[namesOfSlice.sortOfModel] as Sort;
1045
1047
  if (isQueryEqual(queryArgsOfModel, queryArgs)) {
1046
1048
  Logger.trace(`${namesOfSlice.queryArgsOfModel} store-level cache hit`);
1047
- return;
1049
+ return; // store-level cache hit
1048
1050
  }
1049
1051
  this.set({ [namesOfSlice.modelListLoading]: true });
1050
1052
  const fetchQueryArgs = expandQueryArgs(queryArgs, slice.args);
@@ -1077,7 +1079,7 @@ export const makeActions = (refName: string, slice: { [key: string]: SerializedS
1077
1079
  const queryArgsOfModel = currentState[namesOfSlice.queryArgsOfModel] as object[];
1078
1080
  const limitOfModel = currentState[namesOfSlice.limitOfModel] as number;
1079
1081
  const sortOfModel = currentState[namesOfSlice.sortOfModel] as Sort;
1080
- if (sortOfModel === sort) return;
1082
+ if (sortOfModel === sort) return; // store-level cache hit
1081
1083
  this.set({ [namesOfSlice.modelListLoading]: true });
1082
1084
  const fetchQueryArgs = expandQueryArgs(queryArgsOfModel, slice.args);
1083
1085
  const modelDataList = await (fetch[namesOfSlice.modelList] as (...args: any[]) => Promise<Light[]>)(
@@ -0,0 +1,168 @@
1
+ import { describe, expect, mock, spyOn, test } from "bun:test";
2
+ import { enumOf, Int } from "akanjs/base";
3
+ import { ConstantRegistry, via } from "akanjs/constant";
4
+ import {
5
+ createDerivedStateBuilder,
6
+ createWritableStateBuilder,
7
+ mergeDerivedMeta,
8
+ resolveDerivedState,
9
+ resolveWritableState,
10
+ } from "./stateBuilder";
11
+
12
+ class StateBuilderTestMode extends enumOf("StateBuilderTestMode", ["list", "grid"] as const) {}
13
+ const StateBuilderTestAddress = via((f) => ({
14
+ city: f(String),
15
+ zip: f(Int, { default: 10000 }),
16
+ }));
17
+ ConstantRegistry.buildScalar("stateBuilderTestAddress", StateBuilderTestAddress, { StateBuilderTestAddress });
18
+
19
+ const setupEnv = () => {
20
+ process.env.AKAN_PUBLIC_APP_NAME = "storetest";
21
+ process.env.AKAN_PUBLIC_REPO_NAME = "storetest";
22
+ process.env.AKAN_PUBLIC_SERVE_DOMAIN = "localhost";
23
+ process.env.AKAN_PUBLIC_ENV = "testing";
24
+ };
25
+
26
+ describe("makeDefaultFactory", () => {
27
+ test("preserves DataList instances when cloning default state", async () => {
28
+ setupEnv();
29
+
30
+ const [{ DataList }, { makeDefaultFactory }] = await Promise.all([import("akanjs/base"), import("./stateBuilder")]);
31
+ const original = new DataList([{ id: "project-1", name: "Project 1" }]);
32
+ const clone = makeDefaultFactory(original)();
33
+
34
+ expect(clone).toBeInstanceOf(DataList);
35
+ expect(clone).not.toBe(original);
36
+ expect(clone.map((project) => project.name)).toEqual(["Project 1"]);
37
+ expect(clone.get("project-1")?.name).toBe("Project 1");
38
+ });
39
+
40
+ test("keeps non-plain browser-like objects as opaque references", async () => {
41
+ setupEnv();
42
+
43
+ const { makeDefaultFactory } = await import("./stateBuilder");
44
+ class BrowserResource {
45
+ readonly id = "stream-1";
46
+ getTracks() {
47
+ return ["audio"];
48
+ }
49
+ }
50
+ const original = new BrowserResource();
51
+ const clone = makeDefaultFactory(original)();
52
+
53
+ expect(clone).toBe(original);
54
+ expect(clone.getTracks()).toEqual(["audio"]);
55
+ });
56
+ });
57
+
58
+ describe("state builder declarations", () => {
59
+ test("resolves persist and session metadata with typed defaults and codecs", () => {
60
+ setupEnv();
61
+ const builder = createWritableStateBuilder();
62
+ const state = {
63
+ count: builder.persist(Int, { default: 7, key: "countOverride" }),
64
+ tags: builder.session([String], { default: ["alpha"] }),
65
+ mode: builder.persist(StateBuilderTestMode, { default: "list" }),
66
+ address: builder.persist(StateBuilderTestAddress, {
67
+ default: () => new StateBuilderTestAddress({ city: "Seoul" }),
68
+ }),
69
+ };
70
+
71
+ const resolved = resolveWritableState("prefs", state);
72
+
73
+ expect(resolved.shape).toMatchObject({
74
+ count: 7,
75
+ tags: ["alpha"],
76
+ mode: "list",
77
+ });
78
+ expect(resolved.shape.address).toBeInstanceOf(StateBuilderTestAddress);
79
+ expect((resolved.shape.address as InstanceType<typeof StateBuilderTestAddress>).zip).toBe(10000);
80
+ expect(resolved.meta.persistSession.count).toMatchObject({
81
+ kind: "persist",
82
+ key: "count",
83
+ });
84
+ expect(resolved.meta.persistSession.count.storageKey).toContain(".prefs.countOverride");
85
+ expect(resolved.meta.persistSession.tags.kind).toBe("session");
86
+ expect(resolved.meta.persistSession.count.parse("9")).toBe(9);
87
+ expect(resolved.meta.persistSession.tags.parse(["a", "b"])).toEqual(["a", "b"]);
88
+ expect(resolved.meta.persistSession.mode.parse("grid")).toBe("grid");
89
+ expect(() => resolved.meta.persistSession.mode.parse("invalid")).toThrow("Invalid enum value");
90
+
91
+ const parsedAddress = resolved.meta.persistSession.address.parse({ city: "Busan", zip: "12345" });
92
+ expect(parsedAddress).toEqual({ city: "Busan", zip: 12345 });
93
+ expect(resolved.meta.persistSession.address.serialize(parsedAddress)).toEqual({ city: "Busan", zip: 12345 });
94
+ });
95
+
96
+ test("parses search state from repeated params and JSON object params", () => {
97
+ setupEnv();
98
+ const builder = createDerivedStateBuilder<{ searchParams: Record<string, string | string[]> }>();
99
+ const resolved = resolveDerivedState(
100
+ {
101
+ ids: builder.search("id", [Int], { default: [1] }),
102
+ modes: builder.search("mode", [StateBuilderTestMode], { default: ["list"] }),
103
+ addresses: builder.search("address", [StateBuilderTestAddress], { default: [] }),
104
+ enabled: builder.search("enabled", Boolean, { default: false }),
105
+ },
106
+ new Set(["searchParams"]),
107
+ );
108
+
109
+ expect(resolved.meta.search.ids.parseSearch({ id: ["3", "4"] })).toEqual([3, 4]);
110
+ expect(resolved.meta.search.modes.parseSearch({ mode: JSON.stringify(["grid", "list"]) })).toEqual([
111
+ "grid",
112
+ "list",
113
+ ]);
114
+ expect(
115
+ resolved.meta.search.addresses.parseSearch({
116
+ address: JSON.stringify([
117
+ { city: "Seoul", zip: 12345 },
118
+ { city: "Jeju", zip: 10000 },
119
+ ]),
120
+ }),
121
+ ).toEqual([
122
+ { city: "Seoul", zip: 12345 },
123
+ { city: "Jeju", zip: 10000 },
124
+ ]);
125
+ expect(resolved.meta.search.enabled.parseSearch({ enabled: "true" })).toBe(true);
126
+
127
+ const warn = spyOn(console, "warn").mockImplementation(() => {});
128
+ expect(resolved.meta.search.ids.parseSearch({ id: "not-number" })).toEqual([1]);
129
+ expect(warn).toHaveBeenCalledWith(expect.stringContaining("Failed to parse search param id"));
130
+ warn.mockRestore();
131
+ });
132
+
133
+ test("validates computed dependencies and rejects duplicate derived metadata", () => {
134
+ setupEnv();
135
+ const builder = createDerivedStateBuilder<{ count: number; label: string }>();
136
+ const equals = mock((a: string, b: string) => a.toLowerCase() === b.toLowerCase());
137
+ const resolved = resolveDerivedState(
138
+ {
139
+ summary: builder.computed(["count", "label"], (count, label) => `${label}:${count}`, { equals }),
140
+ },
141
+ new Set(["count", "label"]),
142
+ );
143
+
144
+ expect(resolved.shape.summary).toBeUndefined();
145
+ expect(resolved.meta.derivedKeys.has("summary")).toBe(true);
146
+ expect(resolved.meta.computed.summary.deps).toEqual(["count", "label"]);
147
+ expect(resolved.meta.computed.summary.selector(2, "total")).toBe("total:2");
148
+ expect(resolved.meta.computed.summary.equals("TOTAL:2", "total:2")).toBe(true);
149
+ expect(equals).toHaveBeenCalled();
150
+
151
+ expect(() =>
152
+ resolveDerivedState({ broken: builder.computed(["missing" as never], () => "bad") }, new Set(["count"])),
153
+ ).toThrow("Computed broken has invalid deps: missing");
154
+ expect(() => mergeDerivedMeta(resolved.meta, resolved.meta)).toThrow("Duplicate state metadata key: summary");
155
+ });
156
+
157
+ test("rejects derived declarations that conflict with writable keys", () => {
158
+ setupEnv();
159
+ const builder = createDerivedStateBuilder<{ count: number }>();
160
+
161
+ expect(() => resolveDerivedState({ count: builder.search("count", Int) }, new Set(["count"]))).toThrow(
162
+ "Derived state key conflicts with writable state: count",
163
+ );
164
+ expect(() => resolveDerivedState({ count: 1 }, new Set(["value"]))).toThrow(
165
+ "Derived state count must be declared with search() or computed()",
166
+ );
167
+ });
168
+ });
@@ -278,6 +278,7 @@ export const makeDefaultFactory = (value: unknown): StateInitializer => {
278
278
  try {
279
279
  return structuredClone(value);
280
280
  } catch {
281
+ // Fall back to recursive clone for class-like plain data.
281
282
  }
282
283
  }
283
284
  return Object.fromEntries(Object.entries(value).map(([key, val]) => [key, makeDefaultFactory(val)()]));
@@ -414,6 +415,7 @@ const getSessionKey = () => {
414
415
  sessionStorage.setItem(key, next);
415
416
  return next;
416
417
  } catch {
418
+ // fall through
417
419
  }
418
420
  }
419
421
  memorySessionKey ??= Math.random().toString(36).slice(2);
@@ -1,13 +1,14 @@
1
1
  import type { EnumInstance, PrimitiveScalar } from "akanjs/base";
2
2
  import type { ConstantFieldTypeInput, PlainTypeToFieldType } from "akanjs/constant";
3
3
 
4
+ // not implemented
4
5
  export type StateType = "normal" | "storage" | "cookie" | "param" | "searchParam";
5
6
 
6
7
  export interface StateProps<FieldValue = any, MapValue = any, Nullable extends boolean = false> {
7
8
  nullable: Nullable;
8
9
  default?: FieldValue | ((doc: { id: string }) => FieldValue);
9
10
  enum?: EnumInstance;
10
- of?: MapValue;
11
+ of?: MapValue; // for Map type fields
11
12
  }
12
13
 
13
14
  export class StateInfo<