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.
- package/base/base.test.ts +135 -0
- package/base/base.ts +1 -1
- package/base/baseEnv.test.ts +146 -0
- package/base/primitiveRegistry.test.ts +127 -0
- package/base/primitiveRegistry.ts +10 -6
- package/base/symbols.test.ts +29 -0
- package/base/types.ts +4 -1
- package/base/utils.test.ts +30 -0
- package/build.ts +318 -0
- package/capacitor.base.config.test.ts +83 -0
- package/capacitor.base.config.ts +1 -1
- package/client/capacitor.ts +1 -1
- package/client/client.auth-storage.test.ts +210 -0
- package/client/client.decorators.test.ts +74 -0
- package/client/client.device.test.ts +181 -0
- package/client/client.page.test.tsx +175 -0
- package/client/client.pure.test.ts +146 -0
- package/client/client.router.test.ts +290 -0
- package/client/cookie.ts +4 -2
- package/client/createFont.ts +2 -2
- package/client/csrTypes.ts +8 -2
- package/client/makePageProto.tsx +10 -4
- package/client/router.ts +8 -3
- package/client/translator.ts +12 -4
- package/common/Logger.test.ts +45 -0
- package/common/Logger.ts +4 -1
- package/common/formatAndValidation.test.ts +61 -0
- package/common/formatNumber.ts +5 -2
- package/common/hmrPhase.ts +1 -1
- package/common/httpClient.test.ts +91 -0
- package/common/isValidDate.ts +3 -0
- package/common/objectPath.test.ts +108 -0
- package/common/routeConvention.test.ts +132 -0
- package/common/runtimeConfig.test.ts +84 -0
- package/constant/constant.test.ts +374 -0
- package/constant/fieldInfo.ts +3 -3
- package/constant/purify.ts +2 -1
- package/constant/types.ts +4 -0
- package/constant/via.ts +12 -6
- package/dictionary/dictionary.test.ts +352 -0
- package/document/databaseRegistry.ts +8 -0
- package/document/document.test.ts +698 -0
- package/document/into.ts +1 -0
- package/fetch/client/fetchClient.ts +6 -1
- package/fetch/client/httpClient.ts +2 -1
- package/fetch/fetch.test.ts +838 -0
- package/fetch/fetchType/appliedReturn.type.ts +1 -0
- package/fetch/fetchType/endpointFetch.type.ts +3 -0
- package/fetch/fetchType/sliceFetch.type.ts +8 -0
- package/fetch/requestStorage.ts +10 -2
- package/package.json +24 -67
- package/server/akanApp.test.ts +130 -0
- package/server/akanApp.ts +5 -2
- package/server/akanLib.ts +1 -0
- package/server/akanServer.test.ts +157 -0
- package/server/akanServer.ts +4 -3
- package/server/artifact/builderRpc.ts +2 -2
- package/server/artifact/ipcTypes.ts +4 -0
- package/server/artifact/routeClientCache.test.ts +265 -0
- package/server/artifact/routeSeedIndex.test.ts +56 -0
- package/server/artifact/routesManifest.test.ts +64 -0
- package/server/decorators.ts +1 -1
- package/server/di/diLifecycle.contract.test.ts +168 -0
- package/server/di/diLifecycle.ts +6 -3
- package/server/hmr/clientScript.ts +20 -2
- package/server/hmr/devHmrController.ts +4 -0
- package/server/logging/rotatingLogWriter.test.ts +119 -0
- package/server/processMetrics.test.ts +24 -0
- package/server/processMetricsCollector.ts +1 -1
- package/server/proxy/webProxyRunner.test.ts +66 -0
- package/server/resolver/database.resolver.ts +2 -2
- package/server/resolver/resolver.contract.fixture.ts +1 -0
- package/server/resolver/resolver.contract.test.ts +594 -0
- package/server/resolver/signal.resolver.ts +10 -2
- package/server/robots.test.ts +16 -0
- package/server/routeTree.test.tsx +198 -0
- package/server/routing/apiRouter.test.ts +136 -0
- package/server/routing/apiRouter.ts +4 -2
- package/server/rscClient.tsx +7 -1
- package/server/rscWorkerHost.ts +33 -11
- package/server/sitemap.test.ts +61 -0
- package/server/ssrFromRscRenderer.tsx +35 -3
- package/server/systemPages.test.tsx +93 -0
- package/server/types/react-server-dom-webpack.d.ts +7 -1
- package/server/vendor/react-dom-client.ts +1 -1
- package/server/vendor/react-dom.ts +3 -2
- package/server/vendor/react-jsx-dev-runtime.ts +1 -1
- package/server/vendor/react-jsx-runtime.ts +1 -1
- package/server/vendor/react-refresh-runtime.ts +2 -2
- package/server/vendor/react-server-dom-webpack-client-browser.ts +1 -1
- package/server/vendor/react.ts +9 -2
- package/server/vendor/scheduler.ts +3 -2
- package/server/webRouter.test.ts +49 -0
- package/server/webRouter.ts +3 -2
- package/service/adapt.ts +5 -1
- package/service/predefinedAdaptor/cache.adaptor.ts +2 -1
- package/service/predefinedAdaptor/compress.adaptor.test.ts +184 -0
- package/service/predefinedAdaptor/database.adaptor.ts +20 -8
- package/service/predefinedAdaptor/solidCache.adaptor.test.ts +107 -0
- package/service/predefinedAdaptor/solidSqlite.test.ts +457 -0
- package/service/predefinedAdaptor/solidSqlite.ts +2 -1
- package/service/predefinedAdaptor/websocket.adaptor.ts +15 -3
- package/service/serve.ts +7 -3
- package/service/service.test.ts +732 -0
- package/signal/base.signal.ts +1 -0
- package/signal/endpointInfo.ts +7 -0
- package/signal/intercept.ts +2 -0
- package/signal/middleware.ts +2 -1
- package/signal/serverSignal.ts +15 -1
- package/signal/signal.test.ts +892 -0
- package/signal/signalContext.ts +1 -1
- package/signal/signalRegistry.ts +5 -0
- package/signal/sliceInfo.ts +3 -0
- package/signal/trace.ts +11 -0
- package/signal/types.ts +11 -2
- package/store/action.ts +5 -3
- package/store/stateBuilder.test.ts +168 -0
- package/store/stateBuilder.ts +2 -0
- package/store/stateInfo.ts +2 -1
- package/store/store.test.ts +427 -0
- package/store/types.ts +1 -1
- package/test/playwright.config.base.ts +28 -5
- package/test/playwright.pageAgent.ts +1 -1
- package/test/sampleOf.ts +1 -1
- package/test/testServer.ts +1 -1
- package/tsconfig.json +5 -0
- package/ui/BottomSheet.tsx +1 -1
- package/ui/Clipboard.tsx +1 -1
- package/ui/Constant/schemaDoc.test.ts +113 -0
- package/ui/CsrImage.tsx +14 -3
- package/ui/Data/ListContainer.tsx +1 -1
- package/ui/Data/Pagination.tsx +1 -1
- package/ui/Data/QueryMaker.tsx +339 -0
- package/ui/Data/index.ts +1 -0
- package/ui/DatePicker.tsx +95 -1
- package/ui/Dialog/Modal.tsx +1 -1
- package/ui/DraggableList.tsx +5 -5
- package/ui/Field.tsx +3 -2
- package/ui/Image.tsx +3 -2
- package/ui/InfiniteScroll.test.tsx +155 -0
- package/ui/InfiniteScroll.tsx +1 -0
- package/ui/Input.tsx +8 -1
- package/ui/Layout/BottomTab.tsx +2 -2
- package/ui/Link/SsrLink.tsx +2 -1
- package/ui/Load/Page.tsx +1 -1
- package/ui/Load/PageCSR.tsx +1 -0
- package/ui/Load/Units.tsx +2 -1
- package/ui/Load/View.tsx +2 -1
- package/ui/Menu.tsx +8 -5
- package/ui/Model/EditModal.tsx +5 -2
- package/ui/Popconfirm.tsx +4 -2
- package/ui/ScreenNavigator.tsx +3 -2
- package/ui/Signal/Message.tsx +3 -2
- package/ui/Signal/PubSub.tsx +2 -0
- package/ui/Signal/Response.tsx +1 -1
- package/ui/Signal/WebSocket.tsx +11 -2
- package/ui/System/Client.tsx +41 -7
- package/ui/System/Common.test.ts +37 -0
- package/ui/System/Gtag.tsx +5 -2
- package/ui/System/Messages.tsx +2 -2
- package/ui/System/Reconnect.tsx +6 -5
- package/ui/System/Root.tsx +1 -0
- package/ui/System/SSR.tsx +7 -1
- package/ui/ToggleSelect.tsx +8 -3
- package/ui/Unauthorized.tsx +1 -1
- package/webkit/bootCsr.test.tsx +153 -0
- package/webkit/bootCsr.tsx +6 -3
- package/webkit/lazy.tsx +8 -1
- package/webkit/native.test.tsx +341 -0
- package/webkit/useCamera.tsx +1 -0
- package/webkit/useCodepush.tsx +9 -4
- package/webkit/useContact.tsx +1 -0
- package/webkit/useCsrValues.ts +10 -6
- package/webkit/useDebounce.ts +2 -2
- package/webkit/usePurchase.tsx +9 -5
- package/webkit/usePushNoti.tsx +1 -0
- package/webkit/webkit.test.tsx +531 -0
- package/types/base/base.d.ts +0 -53
- package/types/base/baseEnv.d.ts +0 -68
- package/types/base/index.d.ts +0 -6
- package/types/base/primitiveRegistry.d.ts +0 -134
- package/types/base/symbols.d.ts +0 -11
- package/types/base/types.d.ts +0 -68
- package/types/base/utils.d.ts +0 -4
- package/types/base.d.ts +0 -1
- package/types/capacitor.base.config.d.ts +0 -3
- package/types/client/capacitor.d.ts +0 -233
- package/types/client/clientRuntime.d.ts +0 -63
- package/types/client/cookie.d.ts +0 -33
- package/types/client/createFont.d.ts +0 -6
- package/types/client/csrTypes.d.ts +0 -262
- package/types/client/decorators.d.ts +0 -7
- package/types/client/device.d.ts +0 -41
- package/types/client/fetch.d.ts +0 -1
- package/types/client/index.d.ts +0 -14
- package/types/client/locale.d.ts +0 -5
- package/types/client/makePageProto.d.ts +0 -17002
- package/types/client/router.d.ts +0 -66
- package/types/client/rscNavigation.d.ts +0 -19
- package/types/client/storage.d.ts +0 -5
- package/types/client/translator.d.ts +0 -18
- package/types/client/types.d.ts +0 -145
- package/types/client/useClient.d.ts +0 -1
- package/types/client.d.ts +0 -1
- package/types/common/Logger.d.ts +0 -41
- package/types/common/applyMixins.d.ts +0 -3
- package/types/common/capitalize.d.ts +0 -2
- package/types/common/deepObjectify.d.ts +0 -4
- package/types/common/fileUpload.d.ts +0 -28
- package/types/common/formatNumber.d.ts +0 -1
- package/types/common/formatPhone.d.ts +0 -2
- package/types/common/getAllPropertyDescriptors.d.ts +0 -5
- package/types/common/hmrPhase.d.ts +0 -6
- package/types/common/httpClient.d.ts +0 -20
- package/types/common/index.d.ts +0 -29
- package/types/common/isDayjs.d.ts +0 -2
- package/types/common/isEmail.d.ts +0 -2
- package/types/common/isPhoneNumber.d.ts +0 -2
- package/types/common/isQueryEqual.d.ts +0 -1
- package/types/common/isValidDate.d.ts +0 -2
- package/types/common/jwtDecode.d.ts +0 -2
- package/types/common/localeConfig.d.ts +0 -11
- package/types/common/lowerlize.d.ts +0 -2
- package/types/common/mergeVersion.d.ts +0 -10
- package/types/common/objectify.d.ts +0 -1
- package/types/common/pathGet.d.ts +0 -1
- package/types/common/pathSet.d.ts +0 -3
- package/types/common/randomPick.d.ts +0 -1
- package/types/common/randomPicks.d.ts +0 -1
- package/types/common/routeConvention.d.ts +0 -35
- package/types/common/sleep.d.ts +0 -2
- package/types/common/splitVersion.d.ts +0 -11
- package/types/common/subRoute.d.ts +0 -7
- package/types/common/types.d.ts +0 -14
- package/types/common.d.ts +0 -1
- package/types/constant/constantRegistry.d.ts +0 -89
- package/types/constant/crystalize.d.ts +0 -4
- package/types/constant/deserialize.d.ts +0 -7
- package/types/constant/fieldInfo.d.ts +0 -153
- package/types/constant/getDefault.d.ts +0 -3
- package/types/constant/immerify.d.ts +0 -2
- package/types/constant/index.d.ts +0 -10
- package/types/constant/purify.d.ts +0 -12
- package/types/constant/serialize.d.ts +0 -11
- package/types/constant/types.d.ts +0 -77
- package/types/constant/via.d.ts +0 -52
- package/types/constant.d.ts +0 -1
- package/types/dictionary/base.dictionary.d.ts +0 -1
- package/types/dictionary/dictInfo.d.ts +0 -206
- package/types/dictionary/dictionary.d.ts +0 -11
- package/types/dictionary/index.d.ts +0 -4
- package/types/dictionary/locale.d.ts +0 -128
- package/types/dictionary/trans.d.ts +0 -82
- package/types/dictionary.d.ts +0 -1
- package/types/document/by.d.ts +0 -20
- package/types/document/dataLoader.d.ts +0 -36
- package/types/document/database.d.ts +0 -96
- package/types/document/databaseRegistry.d.ts +0 -36
- package/types/document/documentQuery.d.ts +0 -105
- package/types/document/documentSchema.d.ts +0 -33
- package/types/document/filterMeta.d.ts +0 -84
- package/types/document/index.d.ts +0 -11
- package/types/document/into.d.ts +0 -65
- package/types/document/loaderInfo.d.ts +0 -35
- package/types/document/schema.d.ts +0 -5
- package/types/document/types.d.ts +0 -36
- package/types/document.d.ts +0 -1
- package/types/fetch/client/fetchClient.d.ts +0 -78
- package/types/fetch/client/httpClient.d.ts +0 -39
- package/types/fetch/client/index.d.ts +0 -3
- package/types/fetch/client/wsClient.d.ts +0 -37
- package/types/fetch/client.d.ts +0 -1
- package/types/fetch/fetchType/appliedReturn.type.d.ts +0 -67
- package/types/fetch/fetchType/buildFetch.type.d.ts +0 -11
- package/types/fetch/fetchType/clientSignal.type.d.ts +0 -16
- package/types/fetch/fetchType/endpointFetch.type.d.ts +0 -29
- package/types/fetch/fetchType/index.d.ts +0 -5
- package/types/fetch/fetchType/sliceFetch.type.d.ts +0 -76
- package/types/fetch/fetchType.d.ts +0 -1
- package/types/fetch/index.d.ts +0 -4
- package/types/fetch/requestStorage.d.ts +0 -29
- package/types/fetch/serializer/fetch.serializer.d.ts +0 -14
- package/types/fetch/serializer/index.d.ts +0 -1
- package/types/fetch/serializer.d.ts +0 -1
- package/types/fetch/types.d.ts +0 -19
- package/types/fetch.d.ts +0 -1
- package/types/index.d.ts +0 -213
- package/types/server/akanApp.d.ts +0 -17
- package/types/server/akanAppHeaders.d.ts +0 -1
- package/types/server/akanLib.d.ts +0 -33
- package/types/server/akanOption.d.ts +0 -15
- package/types/server/akanServer.d.ts +0 -47
- package/types/server/artifact/builderRpc.d.ts +0 -42
- package/types/server/artifact/index.d.ts +0 -6
- package/types/server/artifact/ipcTypes.d.ts +0 -73
- package/types/server/artifact/manifestTypes.d.ts +0 -16
- package/types/server/artifact/routeClientCache.d.ts +0 -45
- package/types/server/artifact/routeSeedIndexStore.d.ts +0 -43
- package/types/server/artifact/routesManifestStore.d.ts +0 -16
- package/types/server/artifact.d.ts +0 -1
- package/types/server/decorators.d.ts +0 -6
- package/types/server/di/diLifecycle.d.ts +0 -45
- package/types/server/di/index.d.ts +0 -4
- package/types/server/di/predefinedAdaptor.d.ts +0 -33
- package/types/server/di/resolveAdaptorHierarchy.d.ts +0 -21
- package/types/server/di/resolveHierarchy.d.ts +0 -11
- package/types/server/di/resolveServiceHierarchy.d.ts +0 -13
- package/types/server/di/utils.d.ts +0 -14
- package/types/server/di.d.ts +0 -1
- package/types/server/hmr/changeBatch.d.ts +0 -13
- package/types/server/hmr/clientScript.d.ts +0 -1
- package/types/server/hmr/devHmrController.d.ts +0 -24
- package/types/server/hmr/index.d.ts +0 -4
- package/types/server/hmr/wsHub.d.ts +0 -45
- package/types/server/hmr.d.ts +0 -1
- package/types/server/imageOptimizer.d.ts +0 -12
- package/types/server/imageOptimizerError.d.ts +0 -4
- package/types/server/index.d.ts +0 -14
- package/types/server/lifecycle/shutdownManager.d.ts +0 -13
- package/types/server/logging/rotatingLogWriter.d.ts +0 -20
- package/types/server/processMetricsCollector.d.ts +0 -10
- package/types/server/proxy/akanResponse.d.ts +0 -7
- package/types/server/proxy/bunRequestFields.d.ts +0 -1
- package/types/server/proxy/hostBasePathWebProxy.d.ts +0 -6
- package/types/server/proxy/index.d.ts +0 -6
- package/types/server/proxy/localeWebProxy.d.ts +0 -5
- package/types/server/proxy/types.d.ts +0 -37
- package/types/server/proxy/webProxyRunner.d.ts +0 -7
- package/types/server/proxy.d.ts +0 -1
- package/types/server/resolver/database.resolver.d.ts +0 -6
- package/types/server/resolver/index.d.ts +0 -3
- package/types/server/resolver/service.resolver.d.ts +0 -7
- package/types/server/resolver/signal.resolver.d.ts +0 -29
- package/types/server/resolver.d.ts +0 -1
- package/types/server/robots.d.ts +0 -1
- package/types/server/routeElementComposer.d.ts +0 -41
- package/types/server/routeTreeBuilder.d.ts +0 -28
- package/types/server/routing/apiRouter.d.ts +0 -61
- package/types/server/rscClient.d.ts +0 -15
- package/types/server/rscWorker.d.ts +0 -3
- package/types/server/rscWorkerHost.d.ts +0 -83
- package/types/server/sitemap.d.ts +0 -13
- package/types/server/ssrFromRscRenderer.d.ts +0 -6
- package/types/server/ssrTypes.d.ts +0 -47
- package/types/server/systemPages.d.ts +0 -27
- package/types/server/types/react-server-dom-webpack.d.ts +0 -91
- package/types/server/types.d.ts +0 -67
- package/types/server/vendor/akanjs-base.d.ts +0 -1
- package/types/server/vendor/akanjs-common.d.ts +0 -1
- package/types/server/vendor/akanjs-constant.d.ts +0 -1
- package/types/server/vendor/akanjs-store.d.ts +0 -1
- package/types/server/vendor/react-dom-client.d.ts +0 -3
- package/types/server/vendor/react-dom.d.ts +0 -3
- package/types/server/vendor/react-jsx-dev-runtime.d.ts +0 -3
- package/types/server/vendor/react-jsx-runtime.d.ts +0 -3
- package/types/server/vendor/react-refresh-runtime.d.ts +0 -3
- package/types/server/vendor/react-server-dom-webpack-client-browser.d.ts +0 -3
- package/types/server/vendor/react.d.ts +0 -11
- package/types/server/vendor/scheduler.d.ts +0 -3
- package/types/server/webRouter.d.ts +0 -44
- package/types/server.d.ts +0 -1
- package/types/service/adapt.d.ts +0 -15
- package/types/service/base.service.d.ts +0 -18
- package/types/service/index.d.ts +0 -10
- package/types/service/injectInfo.d.ts +0 -102
- package/types/service/ipcTypes.d.ts +0 -194
- package/types/service/predefinedAdaptor/cache.adaptor.d.ts +0 -46
- package/types/service/predefinedAdaptor/compress.adaptor.d.ts +0 -22
- package/types/service/predefinedAdaptor/database.adaptor.d.ts +0 -329
- package/types/service/predefinedAdaptor/index.d.ts +0 -13
- package/types/service/predefinedAdaptor/logging.adaptor.d.ts +0 -20
- package/types/service/predefinedAdaptor/queue.adaptor.d.ts +0 -22
- package/types/service/predefinedAdaptor/role.adaptor.d.ts +0 -17
- package/types/service/predefinedAdaptor/schedule.adaptor.d.ts +0 -60
- package/types/service/predefinedAdaptor/solidCache.adaptor.d.ts +0 -25
- package/types/service/predefinedAdaptor/solidPubsub.adaptor.d.ts +0 -20
- package/types/service/predefinedAdaptor/solidQueue.adaptor.d.ts +0 -19
- package/types/service/predefinedAdaptor/solidSqlite.d.ts +0 -24
- package/types/service/predefinedAdaptor/sqlitePath.d.ts +0 -9
- package/types/service/predefinedAdaptor/storage.adaptor.d.ts +0 -80
- package/types/service/predefinedAdaptor/websocket.adaptor.d.ts +0 -49
- package/types/service/predefinedAdaptor.d.ts +0 -1
- package/types/service/serve.d.ts +0 -31
- package/types/service/serviceModule.d.ts +0 -50
- package/types/service/serviceRegistry.d.ts +0 -9
- package/types/service/types.d.ts +0 -55
- package/types/service.d.ts +0 -1
- package/types/signal/base.signal.d.ts +0 -41
- package/types/signal/endpoint.d.ts +0 -28
- package/types/signal/endpointInfo.d.ts +0 -77
- package/types/signal/exception.d.ts +0 -54786
- package/types/signal/guard.d.ts +0 -10
- package/types/signal/guards.d.ts +0 -10
- package/types/signal/index.d.ts +0 -19
- package/types/signal/intercept.d.ts +0 -17
- package/types/signal/internal.d.ts +0 -18
- package/types/signal/internalArg.d.ts +0 -31
- package/types/signal/internalInfo.d.ts +0 -45
- package/types/signal/middleware.d.ts +0 -51
- package/types/signal/serializer/fetch.serializer.d.ts +0 -14
- package/types/signal/serializer/index.d.ts +0 -1
- package/types/signal/serializer.d.ts +0 -1
- package/types/signal/serverSignal.d.ts +0 -36
- package/types/signal/signalContext.d.ts +0 -96
- package/types/signal/signalRegistry.d.ts +0 -49
- package/types/signal/slice.d.ts +0 -42
- package/types/signal/sliceInfo.d.ts +0 -51
- package/types/signal/trace.d.ts +0 -97
- package/types/signal/types.d.ts +0 -142
- package/types/signal.d.ts +0 -1
- package/types/store/action.d.ts +0 -145
- package/types/store/baseSt.d.ts +0 -412
- package/types/store/hooks.d.ts +0 -1
- package/types/store/index.d.ts +0 -8
- package/types/store/rootStore.d.ts +0 -22
- package/types/store/state.d.ts +0 -91
- package/types/store/stateBuilder.d.ts +0 -141
- package/types/store/stateInfo.d.ts +0 -23
- package/types/store/store.d.ts +0 -36
- package/types/store/storeInstance.d.ts +0 -38
- package/types/store/storeRegistry.d.ts +0 -13
- package/types/store/types.d.ts +0 -42
- package/types/store/withSelector.d.ts +0 -42
- package/types/store.d.ts +0 -1
- package/types/test/index.d.ts +0 -4
- package/types/test/playwright.config.base.d.ts +0 -9
- package/types/test/playwright.pageAgent.d.ts +0 -12
- package/types/test/sample.d.ts +0 -15
- package/types/test/sampleOf.d.ts +0 -5
- package/types/test/signalTest.preload.d.ts +0 -1
- package/types/test/signalTestRuntime.d.ts +0 -29
- package/types/test/testServer.d.ts +0 -26
- package/types/test.d.ts +0 -1
- package/types/ui/BottomSheet.d.ts +0 -13
- package/types/ui/Button.d.ts +0 -11
- package/types/ui/ClientSide.d.ts +0 -8
- package/types/ui/Clipboard.d.ts +0 -7
- package/types/ui/Constant/Doc.d.ts +0 -29
- package/types/ui/Constant/Mermaid.d.ts +0 -8
- package/types/ui/Constant/index.d.ts +0 -6
- package/types/ui/Constant/schemaDoc.d.ts +0 -84
- package/types/ui/Constant.d.ts +0 -1
- package/types/ui/Copy.d.ts +0 -10
- package/types/ui/CsrImage.d.ts +0 -18
- package/types/ui/Data/CardList.d.ts +0 -36
- package/types/ui/Data/Dashboard.d.ts +0 -11
- package/types/ui/Data/Insight.d.ts +0 -9
- package/types/ui/Data/Item.d.ts +0 -75
- package/types/ui/Data/ListContainer.d.ts +0 -49
- package/types/ui/Data/Pagination.d.ts +0 -9
- package/types/ui/Data/QueryMaker.d.ts +0 -8
- package/types/ui/Data/TableList.d.ts +0 -26
- package/types/ui/Data/index.d.ts +0 -9
- package/types/ui/Data/index_.d.ts +0 -8
- package/types/ui/Data.d.ts +0 -1
- package/types/ui/DatePicker.d.ts +0 -36
- package/types/ui/Dialog/Action.d.ts +0 -5
- package/types/ui/Dialog/Close.d.ts +0 -6
- package/types/ui/Dialog/Content.d.ts +0 -6
- package/types/ui/Dialog/Modal.d.ts +0 -9
- package/types/ui/Dialog/Provider.d.ts +0 -11
- package/types/ui/Dialog/Title.d.ts +0 -5
- package/types/ui/Dialog/Trigger.d.ts +0 -6
- package/types/ui/Dialog/context.d.ts +0 -10
- package/types/ui/Dialog/index.d.ts +0 -9
- package/types/ui/Dialog.d.ts +0 -1
- package/types/ui/DragAction.d.ts +0 -24
- package/types/ui/DraggableList.d.ts +0 -31
- package/types/ui/Dropdown.d.ts +0 -14
- package/types/ui/Empty.d.ts +0 -12
- package/types/ui/Field.d.ts +0 -411
- package/types/ui/FontFace.d.ts +0 -6
- package/types/ui/Image.d.ts +0 -49
- package/types/ui/InfiniteScroll.d.ts +0 -10
- package/types/ui/Input.d.ts +0 -95
- package/types/ui/KeyboardAvoiding.d.ts +0 -8
- package/types/ui/Layout/BottomAction.d.ts +0 -6
- package/types/ui/Layout/BottomInset.d.ts +0 -7
- package/types/ui/Layout/BottomTab.d.ts +0 -14
- package/types/ui/Layout/Header.d.ts +0 -8
- package/types/ui/Layout/LeftSider.d.ts +0 -9
- package/types/ui/Layout/Navbar.d.ts +0 -11
- package/types/ui/Layout/RightSider.d.ts +0 -10
- package/types/ui/Layout/Sider.d.ts +0 -7
- package/types/ui/Layout/Template.d.ts +0 -7
- package/types/ui/Layout/TopLeftAction.d.ts +0 -6
- package/types/ui/Layout/Unit.d.ts +0 -9
- package/types/ui/Layout/View.d.ts +0 -8
- package/types/ui/Layout/Zone.d.ts +0 -6
- package/types/ui/Layout/index.d.ts +0 -14
- package/types/ui/Layout.d.ts +0 -1
- package/types/ui/Link/Back.d.ts +0 -7
- package/types/ui/Link/Close.d.ts +0 -7
- package/types/ui/Link/CsrLink.d.ts +0 -2
- package/types/ui/Link/Lang.d.ts +0 -8
- package/types/ui/Link/SsrLink.d.ts +0 -2
- package/types/ui/Link/index.d.ts +0 -10
- package/types/ui/Link/types.d.ts +0 -42
- package/types/ui/Link.d.ts +0 -1
- package/types/ui/Load/Edit.d.ts +0 -4
- package/types/ui/Load/Edit_Client.d.ts +0 -27
- package/types/ui/Load/Page.d.ts +0 -15
- package/types/ui/Load/PageCSR.d.ts +0 -3
- package/types/ui/Load/Pagination.d.ts +0 -8
- package/types/ui/Load/Units.d.ts +0 -30
- package/types/ui/Load/View.d.ts +0 -22
- package/types/ui/Load/index.d.ts +0 -8
- package/types/ui/Load/index_.d.ts +0 -3
- package/types/ui/Load.d.ts +0 -1
- package/types/ui/Loading/Area.d.ts +0 -1
- package/types/ui/Loading/Button.d.ts +0 -7
- package/types/ui/Loading/Input.d.ts +0 -7
- package/types/ui/Loading/ProgressBar.d.ts +0 -6
- package/types/ui/Loading/Skeleton.d.ts +0 -7
- package/types/ui/Loading/Spin.d.ts +0 -7
- package/types/ui/Loading/index.d.ts +0 -8
- package/types/ui/Loading.d.ts +0 -1
- package/types/ui/Menu.d.ts +0 -26
- package/types/ui/Modal.d.ts +0 -19
- package/types/ui/Model/AdminPanel.d.ts +0 -31
- package/types/ui/Model/Edit.d.ts +0 -16
- package/types/ui/Model/EditModal.d.ts +0 -52
- package/types/ui/Model/EditWrapper.d.ts +0 -13
- package/types/ui/Model/LoadInit.d.ts +0 -10
- package/types/ui/Model/New.d.ts +0 -16
- package/types/ui/Model/NewWrapper.d.ts +0 -13
- package/types/ui/Model/NewWrapper_Client.d.ts +0 -13
- package/types/ui/Model/Remove.d.ts +0 -13
- package/types/ui/Model/RemoveWrapper.d.ts +0 -12
- package/types/ui/Model/SureToRemove.d.ts +0 -11
- package/types/ui/Model/View.d.ts +0 -19
- package/types/ui/Model/ViewEditModal.d.ts +0 -12
- package/types/ui/Model/ViewModal.d.ts +0 -14
- package/types/ui/Model/ViewWrapper.d.ts +0 -12
- package/types/ui/Model/index.d.ts +0 -16
- package/types/ui/Model/index_.d.ts +0 -14
- package/types/ui/Model.d.ts +0 -1
- package/types/ui/More.d.ts +0 -12
- package/types/ui/ObjectId.d.ts +0 -5
- package/types/ui/Pagination.d.ts +0 -20
- package/types/ui/Popconfirm.d.ts +0 -28
- package/types/ui/Portal.d.ts +0 -6
- package/types/ui/Radio.d.ts +0 -19
- package/types/ui/RecentTime.d.ts +0 -12
- package/types/ui/Refresh.d.ts +0 -7
- package/types/ui/ScreenNavigator.d.ts +0 -18
- package/types/ui/Select.d.ts +0 -43
- package/types/ui/Signal/Arg.d.ts +0 -78
- package/types/ui/Signal/Doc.d.ts +0 -33
- package/types/ui/Signal/Listener.d.ts +0 -9
- package/types/ui/Signal/Message.d.ts +0 -23
- package/types/ui/Signal/Object.d.ts +0 -20
- package/types/ui/Signal/PubSub.d.ts +0 -24
- package/types/ui/Signal/Request.d.ts +0 -8
- package/types/ui/Signal/Response.d.ts +0 -14
- package/types/ui/Signal/RestApi.d.ts +0 -40
- package/types/ui/Signal/WebSocket.d.ts +0 -11
- package/types/ui/Signal/index.d.ts +0 -18
- package/types/ui/Signal/makeExample.d.ts +0 -4
- package/types/ui/Signal/style.d.ts +0 -15
- package/types/ui/Signal.d.ts +0 -1
- package/types/ui/System/CSR.d.ts +0 -32
- package/types/ui/System/Client.d.ts +0 -47
- package/types/ui/System/Common.d.ts +0 -47
- package/types/ui/System/DevModeToggle.d.ts +0 -1
- package/types/ui/System/Gtag.d.ts +0 -4
- package/types/ui/System/Messages.d.ts +0 -1
- package/types/ui/System/Reconnect.d.ts +0 -1
- package/types/ui/System/Root.d.ts +0 -6
- package/types/ui/System/SSR.d.ts +0 -24
- package/types/ui/System/SelectLanguage.d.ts +0 -5
- package/types/ui/System/ThemeToggle.d.ts +0 -4
- package/types/ui/System/index.d.ts +0 -12
- package/types/ui/System.d.ts +0 -1
- package/types/ui/Tab/Menu.d.ts +0 -12
- package/types/ui/Tab/Menus.d.ts +0 -6
- package/types/ui/Tab/Panel.d.ts +0 -8
- package/types/ui/Tab/Provider.d.ts +0 -10
- package/types/ui/Tab/context.d.ts +0 -9
- package/types/ui/Tab/index.d.ts +0 -7
- package/types/ui/Tab.d.ts +0 -1
- package/types/ui/Table.d.ts +0 -41
- package/types/ui/ToggleSelect.d.ts +0 -33
- package/types/ui/Unauthorized.d.ts +0 -9
- package/types/ui/animated.d.ts +0 -5
- package/types/ui/fontCss.d.ts +0 -11
- package/types/ui/index.d.ts +0 -44
- package/types/ui.d.ts +0 -1
- package/types/webkit/bootCsr.d.ts +0 -16
- package/types/webkit/createRobotPage.d.ts +0 -15
- package/types/webkit/createSitemapPage.d.ts +0 -4
- package/types/webkit/index.d.ts +0 -17
- package/types/webkit/lazy.d.ts +0 -11
- package/types/webkit/types.d.ts +0 -7
- package/types/webkit/useCamera.d.ts +0 -19
- package/types/webkit/useCodepush.d.ts +0 -16
- package/types/webkit/useContact.d.ts +0 -11
- package/types/webkit/useCsrValues.d.ts +0 -30
- package/types/webkit/useDebounce.d.ts +0 -2
- package/types/webkit/useFetch.d.ts +0 -18
- package/types/webkit/useGeoLocation.d.ts +0 -8
- package/types/webkit/useHistory.d.ts +0 -23
- package/types/webkit/useInterval.d.ts +0 -2
- package/types/webkit/useLocation.d.ts +0 -8
- package/types/webkit/usePurchase.d.ts +0 -19
- package/types/webkit/usePushNoti.d.ts +0 -7
- package/types/webkit/useThrottle.d.ts +0 -2
- package/types/webkit.d.ts +0 -1
package/signal/signalContext.ts
CHANGED
|
@@ -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) {
|
package/signal/signalRegistry.ts
CHANGED
|
@@ -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>>();
|
package/signal/sliceInfo.ts
CHANGED
|
@@ -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
|
+
});
|
package/store/stateBuilder.ts
CHANGED
|
@@ -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);
|
package/store/stateInfo.ts
CHANGED
|
@@ -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<
|