@primate/core 0.1.10 → 0.2.1
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/lib/private/App.d.ts +54 -0
- package/lib/private/App.js +128 -0
- package/lib/private/AppError.d.ts +4 -0
- package/lib/private/AppError.js +8 -0
- package/lib/private/Binder.d.ts +13 -0
- package/lib/private/Binder.js +2 -0
- package/lib/private/BindingContext.d.ts +3 -0
- package/lib/private/BindingContext.js +2 -0
- package/lib/private/BuildApp.d.ts +23 -0
- package/lib/private/BuildApp.js +121 -0
- package/lib/private/CSP.d.ts +6 -0
- package/lib/private/CSP.js +2 -0
- package/lib/private/Loader.d.ts +17 -0
- package/lib/private/Loader.js +46 -0
- package/lib/private/Mode.d.ts +3 -0
- package/lib/private/Mode.js +2 -0
- package/lib/private/Module.d.ts +18 -0
- package/lib/private/Module.js +18 -0
- package/lib/private/ServeApp.d.ts +89 -0
- package/lib/private/ServeApp.js +305 -0
- package/lib/private/ServeInit.d.ts +29 -0
- package/lib/private/ServeInit.js +2 -0
- package/lib/private/asset/Asset.d.ts +11 -0
- package/lib/private/asset/Asset.js +2 -0
- package/lib/private/asset/Font.d.ts +8 -0
- package/lib/private/asset/Font.js +2 -0
- package/lib/private/asset/Script.d.ts +9 -0
- package/lib/private/asset/Script.js +2 -0
- package/lib/private/asset/Style.d.ts +6 -0
- package/lib/private/asset/Style.js +2 -0
- package/lib/private/backend/Module.d.ts +18 -0
- package/lib/private/backend/Module.js +22 -0
- package/lib/private/build.d.ts +4 -0
- package/lib/private/build.js +45 -0
- package/lib/private/builtin/DevModule.d.ts +11 -0
- package/lib/private/builtin/DevModule.js +32 -0
- package/lib/private/builtin/HandleModule.d.ts +10 -0
- package/lib/private/builtin/HandleModule.js +15 -0
- package/lib/private/bye.d.ts +3 -0
- package/{src → lib}/private/bye.js +2 -2
- package/lib/private/client/App.d.ts +4 -0
- package/lib/private/client/App.js +12 -0
- package/lib/private/client/Data.d.ts +9 -0
- package/lib/private/client/Data.js +2 -0
- package/lib/private/client/ValidateInit.d.ts +13 -0
- package/lib/private/client/ValidateInit.js +2 -0
- package/lib/private/client/ValidateUpdater.d.ts +3 -0
- package/lib/private/client/ValidateUpdater.js +2 -0
- package/lib/private/client/ValidationError.d.ts +6 -0
- package/lib/private/client/ValidationError.js +2 -0
- package/lib/private/client/spa/index.d.ts +6 -0
- package/lib/private/client/spa/index.js +192 -0
- package/lib/private/client/spa/storage.d.ts +12 -0
- package/lib/private/client/spa/storage.js +54 -0
- package/lib/private/client/toValidated.d.ts +17 -0
- package/lib/private/client/toValidated.js +21 -0
- package/lib/private/client/validate.d.ts +3 -0
- package/lib/private/client/validate.js +54 -0
- package/lib/private/config/Config.d.ts +4 -0
- package/lib/private/config/Config.js +2 -0
- package/lib/private/config/config/app.d.ts +3 -0
- package/lib/private/config/config/app.js +3 -0
- package/lib/private/config/config/database/index.d.ts +3 -0
- package/lib/private/config/config/database/index.js +3 -0
- package/lib/private/config/config/session.d.ts +3 -0
- package/lib/private/config/config/session.js +3 -0
- package/lib/private/config/index.d.ts +25 -0
- package/lib/private/config/index.js +3 -0
- package/lib/private/config/schema.d.ts +26 -0
- package/lib/private/config/schema.js +34 -0
- package/lib/private/cookie.d.ts +11 -0
- package/lib/private/cookie.js +30 -0
- package/lib/private/database/As.d.ts +7 -0
- package/lib/private/database/As.js +2 -0
- package/lib/private/database/Binds.d.ts +4 -0
- package/lib/private/database/Binds.js +2 -0
- package/lib/private/database/Changes.d.ts +11 -0
- package/lib/private/database/Changes.js +2 -0
- package/lib/private/database/ColumnTypes.d.ts +11 -0
- package/lib/private/database/ColumnTypes.js +2 -0
- package/lib/private/database/DataDict.d.ts +5 -0
- package/lib/private/database/DataDict.js +2 -0
- package/lib/private/database/DataKey.d.ts +4 -0
- package/lib/private/database/DataKey.js +2 -0
- package/lib/private/database/DataRecord.d.ts +8 -0
- package/lib/private/database/DataRecord.js +3 -0
- package/lib/private/database/DataValue.d.ts +5 -0
- package/lib/private/database/DataValue.js +2 -0
- package/lib/private/database/Database.d.ts +56 -0
- package/lib/private/database/Database.js +153 -0
- package/lib/private/database/InMemoryDatabase.d.ts +37 -0
- package/lib/private/database/InMemoryDatabase.js +181 -0
- package/lib/private/database/Query.d.ts +14 -0
- package/lib/private/database/Query.js +15 -0
- package/lib/private/database/QueryBuilder.d.ts +14 -0
- package/lib/private/database/QueryBuilder.js +3 -0
- package/lib/private/database/Sort.d.ts +4 -0
- package/lib/private/database/Sort.js +2 -0
- package/lib/private/database/Store.d.ts +169 -0
- package/lib/private/database/Store.js +255 -0
- package/lib/private/database/TypeMap.d.ts +14 -0
- package/lib/private/database/TypeMap.js +2 -0
- package/lib/private/database/Types.d.ts +6 -0
- package/lib/private/database/Types.js +2 -0
- package/lib/private/database/primary.d.ts +3 -0
- package/lib/private/database/primary.js +2 -0
- package/lib/private/database/storage.d.ts +4 -0
- package/lib/private/database/storage.js +3 -0
- package/lib/private/database/symbol/wrap.d.ts +3 -0
- package/lib/private/database/symbol/wrap.js +2 -0
- package/lib/private/database/symbol.d.ts +3 -0
- package/lib/private/database/symbol.js +2 -0
- package/lib/private/database/test.d.ts +4 -0
- package/lib/private/database/test.js +678 -0
- package/lib/private/database/wrap.d.ts +5 -0
- package/lib/private/database/wrap.js +5 -0
- package/lib/private/fail.d.ts +3 -0
- package/lib/private/fail.js +5 -0
- package/lib/private/frontend/Component.d.ts +8 -0
- package/lib/private/frontend/Component.js +2 -0
- package/lib/private/frontend/Module.d.ts +60 -0
- package/lib/private/frontend/Module.js +241 -0
- package/lib/private/frontend/Publish.d.ts +5 -0
- package/lib/private/frontend/Publish.js +2 -0
- package/lib/private/frontend/Render.d.ts +9 -0
- package/lib/private/frontend/Render.js +2 -0
- package/lib/private/frontend/ServerComponent.d.ts +5 -0
- package/lib/private/frontend/ServerComponent.js +2 -0
- package/lib/private/frontend/ServerData.d.ts +7 -0
- package/lib/private/frontend/ServerData.js +2 -0
- package/lib/private/frontend/ViewOptions.d.ts +12 -0
- package/lib/private/frontend/ViewOptions.js +3 -0
- package/lib/private/frontend/ViewResponse.d.ts +6 -0
- package/lib/private/frontend/ViewResponse.js +2 -0
- package/lib/private/frontend/bundle-server.d.ts +11 -0
- package/lib/private/frontend/bundle-server.js +48 -0
- package/lib/private/hash.d.ts +3 -0
- package/lib/private/hash.js +10 -0
- package/lib/private/hook/build.d.ts +4 -0
- package/lib/private/hook/build.js +246 -0
- package/lib/private/hook/serve.d.ts +4 -0
- package/lib/private/hook/serve.js +13 -0
- package/lib/private/i18n/API.d.ts +21 -0
- package/lib/private/i18n/API.js +2 -0
- package/lib/private/i18n/Catalog.d.ts +4 -0
- package/lib/private/i18n/Catalog.js +2 -0
- package/lib/private/i18n/Catalogs.d.ts +4 -0
- package/lib/private/i18n/Catalogs.js +2 -0
- package/lib/private/i18n/Config.d.ts +10 -0
- package/lib/private/i18n/Config.js +2 -0
- package/lib/private/i18n/ContextData.d.ts +6 -0
- package/lib/private/i18n/ContextData.js +2 -0
- package/lib/private/i18n/Formatter.d.ts +18 -0
- package/lib/private/i18n/Formatter.js +108 -0
- package/lib/private/i18n/Module.d.ts +16 -0
- package/lib/private/i18n/Module.js +109 -0
- package/lib/private/i18n/PersistMode.d.ts +3 -0
- package/lib/private/i18n/PersistMode.js +2 -0
- package/lib/private/i18n/TypeOf.d.ts +4 -0
- package/lib/private/i18n/TypeOf.js +2 -0
- package/lib/private/i18n/constant/COOKIE_NAME.d.ts +3 -0
- package/lib/private/i18n/constant/COOKIE_NAME.js +2 -0
- package/lib/private/i18n/constant/DEFAULT_LOCALE.d.ts +3 -0
- package/lib/private/i18n/constant/DEFAULT_LOCALE.js +2 -0
- package/lib/private/i18n/constant/DEFAULT_PERSIST_MODE.d.ts +3 -0
- package/lib/private/i18n/constant/DEFAULT_PERSIST_MODE.js +2 -0
- package/lib/private/i18n/constant/PERSIST_HEADER.d.ts +3 -0
- package/lib/private/i18n/constant/PERSIST_HEADER.js +2 -0
- package/lib/private/i18n/constant/PERSIST_METHOD.d.ts +3 -0
- package/lib/private/i18n/constant/PERSIST_METHOD.js +2 -0
- package/lib/private/i18n/constant/PERSIST_STORAGE_KEY.d.ts +3 -0
- package/lib/private/i18n/constant/PERSIST_STORAGE_KEY.js +2 -0
- package/lib/private/i18n/index.d.ts +28 -0
- package/lib/private/i18n/index.js +236 -0
- package/lib/private/i18n/locale.d.ts +5 -0
- package/lib/private/i18n/locale.js +4 -0
- package/lib/private/i18n/ordinals.d.ts +4 -0
- package/lib/private/i18n/ordinals.js +52 -0
- package/lib/private/i18n/schema.d.ts +8 -0
- package/lib/private/i18n/schema.js +13 -0
- package/lib/private/i18n/symbol/internal.d.ts +3 -0
- package/lib/private/i18n/symbol/internal.js +3 -0
- package/lib/private/i18n/toIntlUnit.d.ts +3 -0
- package/lib/private/i18n/toIntlUnit.js +125 -0
- package/lib/private/inline.d.ts +7 -0
- package/lib/private/inline.js +12 -0
- package/lib/private/location.d.ts +17 -0
- package/lib/private/location.js +29 -0
- package/lib/private/log.d.ts +19 -0
- package/lib/private/log.js +46 -0
- package/lib/private/module/BuildHook.d.ts +5 -0
- package/lib/private/module/BuildHook.js +2 -0
- package/lib/private/module/Hook.d.ts +5 -0
- package/lib/private/module/Hook.js +2 -0
- package/lib/private/module/Next.d.ts +4 -0
- package/lib/private/module/Next.js +2 -0
- package/lib/private/module/NextBuild.d.ts +5 -0
- package/lib/private/module/NextBuild.js +2 -0
- package/lib/private/module/NextHandle.d.ts +5 -0
- package/lib/private/module/NextHandle.js +2 -0
- package/lib/private/module/NextRoute.d.ts +6 -0
- package/lib/private/module/NextRoute.js +2 -0
- package/lib/private/module/NextServe.d.ts +5 -0
- package/lib/private/module/NextServe.js +2 -0
- package/lib/private/module/RequestHook.d.ts +6 -0
- package/lib/private/module/RequestHook.js +2 -0
- package/lib/private/reducer.d.ts +24 -0
- package/lib/private/reducer.js +10 -0
- package/lib/private/request/RequestBag.d.ts +80 -0
- package/lib/private/request/RequestBag.js +119 -0
- package/lib/private/request/RequestBody.d.ts +39 -0
- package/lib/private/request/RequestBody.js +91 -0
- package/lib/private/request/RequestFacade.d.ts +20 -0
- package/lib/private/request/RequestFacade.js +2 -0
- package/lib/private/request/Verb.d.ts +4 -0
- package/lib/private/request/Verb.js +2 -0
- package/lib/private/request/parse.d.ts +4 -0
- package/lib/private/request/parse.js +69 -0
- package/lib/private/request/route.d.ts +4 -0
- package/lib/private/request/route.js +61 -0
- package/lib/private/request/router.d.ts +5 -0
- package/lib/private/request/router.js +56 -0
- package/lib/private/request/verbs.d.ts +3 -0
- package/lib/private/request/verbs.js +12 -0
- package/lib/private/response/ResponseFunction.d.ts +8 -0
- package/lib/private/response/ResponseFunction.js +2 -0
- package/lib/private/response/ResponseLike.d.ts +6 -0
- package/lib/private/response/ResponseLike.js +2 -0
- package/lib/private/response/binary.d.ts +10 -0
- package/lib/private/response/binary.js +47 -0
- package/lib/private/response/error.d.ts +18 -0
- package/lib/private/response/error.js +18 -0
- package/lib/private/response/json.d.ts +9 -0
- package/lib/private/response/json.js +10 -0
- package/lib/private/response/redirect.d.ts +11 -0
- package/lib/private/response/redirect.js +62 -0
- package/lib/private/response/respond.d.ts +5 -0
- package/lib/private/response/respond.js +31 -0
- package/lib/private/response/sse.d.ts +15 -0
- package/lib/private/response/sse.js +25 -0
- package/lib/private/response/text.d.ts +9 -0
- package/lib/private/response/text.js +11 -0
- package/lib/private/response/view.d.ts +11 -0
- package/lib/private/response/view.js +41 -0
- package/lib/private/response/ws.d.ts +5 -0
- package/lib/private/response/ws.js +2 -0
- package/lib/private/response.d.ts +5 -0
- package/lib/private/response.js +2 -0
- package/lib/private/route/Handler.d.ts +6 -0
- package/lib/private/route/Handler.js +2 -0
- package/lib/private/route/Options.d.ts +5 -0
- package/lib/private/route/Options.js +2 -0
- package/lib/private/route/Path.d.ts +11 -0
- package/lib/private/route/Path.js +2 -0
- package/lib/private/route/guard.d.ts +4 -0
- package/lib/private/route/guard.js +22 -0
- package/lib/private/route/router.d.ts +51 -0
- package/lib/private/route/router.js +32 -0
- package/lib/private/route/wrap.d.ts +6 -0
- package/lib/private/route/wrap.js +17 -0
- package/lib/private/route.d.ts +9 -0
- package/lib/private/route.js +6 -0
- package/lib/private/serve.d.ts +5 -0
- package/lib/private/serve.js +8 -0
- package/lib/private/session/Config.d.ts +4 -0
- package/lib/private/session/Config.js +2 -0
- package/lib/private/session/Data.d.ts +5 -0
- package/lib/private/session/Data.js +2 -0
- package/lib/private/session/InMemoryManager.d.ts +9 -0
- package/lib/private/session/InMemoryManager.js +23 -0
- package/lib/private/session/Manager.d.ts +9 -0
- package/lib/private/session/Manager.js +4 -0
- package/lib/private/session/SessionFacade.d.ts +56 -0
- package/lib/private/session/SessionFacade.js +2 -0
- package/lib/private/session/SessionHandle.d.ts +20 -0
- package/lib/private/session/SessionHandle.js +67 -0
- package/lib/private/session/SessionModule.d.ts +13 -0
- package/lib/private/session/SessionModule.js +99 -0
- package/lib/private/session/index.d.ts +13 -0
- package/lib/private/session/index.js +41 -0
- package/lib/private/session/k-serialize.d.ts +3 -0
- package/lib/private/session/k-serialize.js +2 -0
- package/lib/private/session/schema.d.ts +14 -0
- package/lib/private/session/schema.js +20 -0
- package/lib/private/session/storage.d.ts +5 -0
- package/lib/private/session/storage.js +5 -0
- package/lib/private/symbol/config.d.ts +3 -0
- package/lib/private/symbol/config.js +2 -0
- package/lib/private/symbol/layout-depth.d.ts +3 -0
- package/lib/private/symbol/layout-depth.js +2 -0
- package/lib/private/tags.d.ts +10 -0
- package/lib/private/tags.js +29 -0
- package/lib/private/target/Manager.d.ts +14 -0
- package/lib/private/target/Manager.js +44 -0
- package/lib/private/target/Target.d.ts +8 -0
- package/lib/private/target/Target.js +3 -0
- package/lib/private/target/web.d.ts +4 -0
- package/lib/private/target/web.js +68 -0
- package/lib/private/wasm/API.d.ts +7 -0
- package/lib/private/wasm/API.js +2 -0
- package/lib/private/wasm/BufferViewSource.d.ts +4 -0
- package/lib/private/wasm/BufferViewSource.js +2 -0
- package/lib/private/wasm/Exports.d.ts +23 -0
- package/lib/private/wasm/Exports.js +2 -0
- package/lib/private/wasm/I32.d.ts +5 -0
- package/lib/private/wasm/I32.js +2 -0
- package/lib/private/wasm/I32_SIZE.d.ts +3 -0
- package/lib/private/wasm/I32_SIZE.js +2 -0
- package/lib/private/wasm/Instantiation.d.ts +12 -0
- package/lib/private/wasm/Instantiation.js +2 -0
- package/lib/private/wasm/Tagged.d.ts +7 -0
- package/lib/private/wasm/Tagged.js +2 -0
- package/lib/private/wasm/buffersize.d.ts +2 -0
- package/lib/private/wasm/buffersize.js +5 -0
- package/lib/private/wasm/decode-bytes.d.ts +3 -0
- package/lib/private/wasm/decode-bytes.js +5 -0
- package/lib/private/wasm/decode-json.d.ts +7 -0
- package/lib/private/wasm/decode-json.js +11 -0
- package/lib/private/wasm/decode-option.d.ts +5 -0
- package/lib/private/wasm/decode-option.js +10 -0
- package/lib/private/wasm/decode-response.d.ts +19 -0
- package/lib/private/wasm/decode-response.js +90 -0
- package/lib/private/wasm/decode-string.d.ts +3 -0
- package/lib/private/wasm/decode-string.js +5 -0
- package/lib/private/wasm/decode-websocket-close.d.ts +5 -0
- package/lib/private/wasm/decode-websocket-close.js +6 -0
- package/lib/private/wasm/decode-websocket-send.d.ts +6 -0
- package/lib/private/wasm/decode-websocket-send.js +19 -0
- package/lib/private/wasm/encode-buffer.d.ts +3 -0
- package/lib/private/wasm/encode-buffer.js +6 -0
- package/lib/private/wasm/encode-request.d.ts +9 -0
- package/lib/private/wasm/encode-request.js +198 -0
- package/lib/private/wasm/encode-session.d.ts +3 -0
- package/lib/private/wasm/encode-session.js +25 -0
- package/lib/private/wasm/encode-string-map.d.ts +5 -0
- package/lib/private/wasm/encode-string-map.js +14 -0
- package/lib/private/wasm/encode-string.d.ts +13 -0
- package/lib/private/wasm/encode-string.js +17 -0
- package/lib/private/wasm/encode-url.d.ts +11 -0
- package/lib/private/wasm/encode-url.js +14 -0
- package/lib/private/wasm/encode-websocket-close.d.ts +2 -0
- package/lib/private/wasm/encode-websocket-close.js +7 -0
- package/lib/private/wasm/encode-websocket-message.d.ts +4 -0
- package/lib/private/wasm/encode-websocket-message.js +30 -0
- package/lib/private/wasm/encode-websocket-open.d.ts +2 -0
- package/lib/private/wasm/encode-websocket-open.js +7 -0
- package/lib/private/wasm/filesize.d.ts +2 -0
- package/lib/private/wasm/filesize.js +8 -0
- package/lib/private/wasm/instantiate.d.ts +37 -0
- package/lib/private/wasm/instantiate.js +408 -0
- package/lib/private/wasm/open-websocket.d.ts +4 -0
- package/lib/private/wasm/open-websocket.js +26 -0
- package/lib/private/wasm/stringsize.d.ts +3 -0
- package/lib/private/wasm/stringsize.js +5 -0
- package/lib/private/wasm/urlsize.d.ts +2 -0
- package/lib/private/wasm/urlsize.js +5 -0
- package/lib/public/App.d.ts +2 -0
- package/lib/public/App.js +2 -0
- package/lib/public/AppError.d.ts +2 -0
- package/lib/public/AppError.js +2 -0
- package/lib/public/BuildApp.d.ts +2 -0
- package/lib/public/BuildApp.js +2 -0
- package/lib/public/BuildHook.d.ts +2 -0
- package/lib/public/BuildHook.js +2 -0
- package/lib/public/Database.d.ts +2 -0
- package/lib/public/Database.js +2 -0
- package/lib/public/Loader.d.ts +2 -0
- package/lib/public/Loader.js +2 -0
- package/lib/public/Mode.d.ts +2 -0
- package/lib/public/Mode.js +2 -0
- package/lib/public/Module.d.ts +2 -0
- package/lib/public/Module.js +2 -0
- package/lib/public/Next.d.ts +2 -0
- package/lib/public/Next.js +2 -0
- package/lib/public/NextBuild.d.ts +2 -0
- package/lib/public/NextBuild.js +2 -0
- package/lib/public/NextHandle.d.ts +2 -0
- package/lib/public/NextHandle.js +2 -0
- package/lib/public/NextRoute.d.ts +3 -0
- package/lib/public/NextRoute.js +2 -0
- package/lib/public/NextServe.d.ts +2 -0
- package/lib/public/NextServe.js +2 -0
- package/lib/public/ServeApp.d.ts +2 -0
- package/lib/public/ServeApp.js +2 -0
- package/lib/public/Target.d.ts +2 -0
- package/lib/public/Target.js +2 -0
- package/lib/public/backend/Module.d.ts +2 -0
- package/lib/public/backend/Module.js +2 -0
- package/lib/public/build.d.ts +2 -0
- package/lib/public/build.js +2 -0
- package/lib/public/client/App.d.ts +2 -0
- package/lib/public/client/App.js +2 -0
- package/lib/public/client/Data.d.ts +2 -0
- package/lib/public/client/Data.js +2 -0
- package/lib/public/client/ValidateInit.d.ts +2 -0
- package/lib/public/client/ValidateInit.js +2 -0
- package/lib/public/client/ValidateUpdater.d.ts +2 -0
- package/lib/public/client/ValidateUpdater.js +2 -0
- package/lib/public/client/ValidationError.d.ts +2 -0
- package/lib/public/client/ValidationError.js +2 -0
- package/lib/public/client/spa.d.ts +2 -0
- package/lib/public/client/spa.js +2 -0
- package/lib/public/client/toValidated.d.ts +2 -0
- package/lib/public/client/toValidated.js +2 -0
- package/lib/public/client/validate.d.ts +2 -0
- package/lib/public/client/validate.js +2 -0
- package/lib/public/config.d.ts +2 -0
- package/lib/public/config.js +2 -0
- package/lib/public/database/As.d.ts +2 -0
- package/lib/public/database/As.js +2 -0
- package/lib/public/database/DataDict.d.ts +2 -0
- package/lib/public/database/DataDict.js +2 -0
- package/lib/public/database/InMemoryDatabase.d.ts +2 -0
- package/lib/public/database/InMemoryDatabase.js +2 -0
- package/lib/public/database/Sort.d.ts +2 -0
- package/lib/public/database/Sort.js +2 -0
- package/lib/public/database/Store.d.ts +2 -0
- package/lib/public/database/Store.js +2 -0
- package/lib/public/database/TypeMap.d.ts +2 -0
- package/lib/public/database/TypeMap.js +2 -0
- package/lib/public/database/Types.d.ts +2 -0
- package/lib/public/database/Types.js +2 -0
- package/lib/public/database/test.d.ts +2 -0
- package/lib/public/database/test.js +2 -0
- package/lib/public/database/wrap.d.ts +2 -0
- package/lib/public/database/wrap.js +2 -0
- package/lib/public/frontend/Module.d.ts +2 -0
- package/lib/public/frontend/Module.js +2 -0
- package/lib/public/frontend/Publish.d.ts +2 -0
- package/lib/public/frontend/Publish.js +2 -0
- package/lib/public/frontend/Render.d.ts +2 -0
- package/lib/public/frontend/Render.js +2 -0
- package/lib/public/frontend/ViewResponse.d.ts +2 -0
- package/lib/public/frontend/ViewResponse.js +2 -0
- package/lib/public/i18n/API.d.ts +2 -0
- package/lib/public/i18n/API.js +2 -0
- package/lib/public/i18n/Catalogs.d.ts +2 -0
- package/lib/public/i18n/Catalogs.js +2 -0
- package/lib/public/i18n/ContextData.d.ts +2 -0
- package/lib/public/i18n/ContextData.js +2 -0
- package/lib/public/i18n/config.d.ts +2 -0
- package/lib/public/i18n/config.js +2 -0
- package/lib/public/i18n/locale.d.ts +2 -0
- package/lib/public/i18n/locale.js +2 -0
- package/lib/public/i18n/sInternal.d.ts +2 -0
- package/lib/public/i18n/sInternal.js +2 -0
- package/lib/public/inline.d.ts +2 -0
- package/lib/public/inline.js +2 -0
- package/lib/public/location.d.ts +2 -0
- package/lib/public/location.js +2 -0
- package/lib/public/log.d.ts +2 -0
- package/{src/log/index.js → lib/public/log.js} +1 -0
- package/lib/public/request/RequestBody.d.ts +2 -0
- package/lib/public/request/RequestBody.js +2 -0
- package/lib/public/request/RequestFacade.d.ts +2 -0
- package/lib/public/request/RequestFacade.js +2 -0
- package/lib/public/request/Verb.d.ts +2 -0
- package/lib/public/request/Verb.js +2 -0
- package/lib/public/request/verbs.d.ts +2 -0
- package/lib/public/request/verbs.js +2 -0
- package/lib/public/response/ResponseFunction.d.ts +2 -0
- package/lib/public/response/ResponseFunction.js +2 -0
- package/lib/public/response/ResponseLike.d.ts +2 -0
- package/lib/public/response/ResponseLike.js +2 -0
- package/lib/public/response/binary.d.ts +2 -0
- package/lib/public/response/binary.js +2 -0
- package/lib/public/response/error.d.ts +2 -0
- package/lib/public/response/error.js +2 -0
- package/lib/public/response/json.d.ts +2 -0
- package/lib/public/response/json.js +2 -0
- package/lib/public/response/redirect.d.ts +2 -0
- package/lib/public/response/redirect.js +2 -0
- package/lib/public/response/sse.d.ts +2 -0
- package/lib/public/response/sse.js +2 -0
- package/lib/public/response/text.d.ts +2 -0
- package/lib/public/response/text.js +2 -0
- package/lib/public/response/view.d.ts +2 -0
- package/lib/public/response/view.js +2 -0
- package/lib/public/response/ws.d.ts +2 -0
- package/lib/public/response/ws.js +2 -0
- package/lib/public/route/router.d.ts +2 -0
- package/lib/public/route/router.js +2 -0
- package/lib/public/route/wrap.d.ts +2 -0
- package/lib/public/route/wrap.js +2 -0
- package/lib/public/route.d.ts +2 -0
- package/lib/public/route.js +2 -0
- package/lib/public/serve.d.ts +2 -0
- package/lib/public/serve.js +2 -0
- package/lib/public/session/Manager.d.ts +2 -0
- package/lib/public/session/Manager.js +2 -0
- package/lib/public/session/config.d.ts +2 -0
- package/lib/public/session/config.js +2 -0
- package/lib/public/symbol/config.d.ts +2 -0
- package/lib/public/symbol/config.js +2 -0
- package/lib/public/wasm/decode-json.d.ts +5 -0
- package/lib/public/wasm/decode-json.js +3 -0
- package/lib/public/wasm/decode-response.d.ts +3 -0
- package/lib/public/wasm/decode-response.js +3 -0
- package/lib/public/wasm/encode-request.d.ts +3 -0
- package/lib/public/wasm/encode-request.js +3 -0
- package/lib/public/wasm/encode-session.d.ts +3 -0
- package/lib/public/wasm/encode-session.js +3 -0
- package/lib/public/wasm/instantiate.d.ts +4 -0
- package/lib/public/wasm/instantiate.js +3 -0
- package/package.json +41 -36
- package/src/build/app.js +0 -99
- package/src/build/hook/build.js +0 -188
- package/src/build/hook/copy_includes.js +0 -20
- package/src/build/hook/exports.js +0 -2
- package/src/build/hook/init.js +0 -3
- package/src/build/hook/router.js +0 -33
- package/src/build/index.js +0 -49
- package/src/build/module_loader.js +0 -30
- package/src/build/targets/exports.js +0 -1
- package/src/build/targets/web.js +0 -70
- package/src/dispatch/index.js +0 -1
- package/src/http/verbs.js +0 -11
- package/src/private/config-filename.js +0 -1
- package/src/private/config.js +0 -48
- package/src/private/depend.js +0 -20
- package/src/private/dispatch.js +0 -18
- package/src/private/error/bad-body.js +0 -6
- package/src/private/error/bad-default-export.js +0 -6
- package/src/private/error/bad-path.js +0 -6
- package/src/private/error/bad-type-export.js +0 -6
- package/src/private/error/bad-type-name.js +0 -6
- package/src/private/error/double-extension.js +0 -6
- package/src/private/error/double-module.js +0 -6
- package/src/private/error/double-path-parameter.js +0 -6
- package/src/private/error/double-route.js +0 -6
- package/src/private/error/empty-config-file.js +0 -6
- package/src/private/error/empty-directory.js +0 -6
- package/src/private/error/empty-path-parameter.js +0 -6
- package/src/private/error/empty-route-file.js +0 -6
- package/src/private/error/error-in-config-file.js +0 -6
- package/src/private/error/mismatched-body.js +0 -6
- package/src/private/error/mismatched-path.js +0 -6
- package/src/private/error/mismatched-type.js +0 -6
- package/src/private/error/module-no-name.js +0 -6
- package/src/private/error/modules-array.js +0 -6
- package/src/private/error/no-handler.js +0 -6
- package/src/private/error/no-route-to-path.js +0 -6
- package/src/private/error/optional-route.js +0 -6
- package/src/private/error/reserved-type-name.js +0 -6
- package/src/private/error/rest-route.js +0 -6
- package/src/private/error.js +0 -15
- package/src/private/log.js +0 -69
- package/src/private/loglevel.js +0 -9
- package/src/private/mark.js +0 -5
- package/src/private/validate.js +0 -11
- package/src/serve/app.js +0 -206
- package/src/serve/handler/error.js +0 -10
- package/src/serve/handler/json.js +0 -10
- package/src/serve/handler/redirect.js +0 -11
- package/src/serve/handler/shared/base.js +0 -4
- package/src/serve/handler/sse.js +0 -24
- package/src/serve/handler/stream.js +0 -4
- package/src/serve/handler/text.js +0 -10
- package/src/serve/handler/view.js +0 -15
- package/src/serve/handler/ws.js +0 -2
- package/src/serve/hook/exports.js +0 -5
- package/src/serve/hook/handle.js +0 -106
- package/src/serve/hook/init.js +0 -3
- package/src/serve/hook/parse.js +0 -17
- package/src/serve/hook/respond.js +0 -28
- package/src/serve/hook/route.js +0 -50
- package/src/serve/hook/serve.js +0 -53
- package/src/serve/index.js +0 -9
- package/src/serve/module_loader.js +0 -16
- package/src/serve/to_sorted.js +0 -1
- /package/{src/build → lib/private}/defaults/app.html +0 -0
- /package/{src/build → lib/private}/defaults/error.html +0 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type As from "#database/As";
|
|
2
|
+
import type Binds from "#database/Binds";
|
|
3
|
+
import type DataDict from "#database/DataDict";
|
|
4
|
+
import type DataKey from "#database/DataKey";
|
|
5
|
+
import type Sort from "#database/Sort";
|
|
6
|
+
import type TypeMap from "#database/TypeMap";
|
|
7
|
+
import type Types from "#database/Types";
|
|
8
|
+
import type Dict from "@rcompat/type/Dict";
|
|
9
|
+
import type MaybePromise from "@rcompat/type/MaybePromise";
|
|
10
|
+
import type StoreSchema from "pema/StoreSchema";
|
|
11
|
+
export default abstract class Database {
|
|
12
|
+
#private;
|
|
13
|
+
abstract close(): MaybePromise<void>;
|
|
14
|
+
constructor(bindPrefix?: string);
|
|
15
|
+
ident(name: string): string;
|
|
16
|
+
table(as: As): string;
|
|
17
|
+
toSelect(types: Types, columns?: string[]): string;
|
|
18
|
+
toSort(types: Types, sort?: Sort): string;
|
|
19
|
+
toLimit(limit?: number): string;
|
|
20
|
+
toWhere(types: Types, criteria: DataDict): string;
|
|
21
|
+
toSet(types: Types, changes: DataDict): Promise<{
|
|
22
|
+
set: string;
|
|
23
|
+
binds: Binds;
|
|
24
|
+
}>;
|
|
25
|
+
column(key: DataKey): string;
|
|
26
|
+
abstract get typemap(): TypeMap;
|
|
27
|
+
abstract schema: {
|
|
28
|
+
create(name: string, description: StoreSchema): MaybePromise<void>;
|
|
29
|
+
delete(name: string): MaybePromise<void>;
|
|
30
|
+
};
|
|
31
|
+
formatBinds(binds: Binds): Binds;
|
|
32
|
+
bind<In extends DataDict>(types: Types, object: In): Promise<Binds>;
|
|
33
|
+
bindCriteria(types: Types, criteria: DataDict): Promise<Binds>;
|
|
34
|
+
unbind(types: Types, object: Dict): Dict;
|
|
35
|
+
abstract create<O extends Dict>(as: As, args: {
|
|
36
|
+
record: Dict;
|
|
37
|
+
}): MaybePromise<O>;
|
|
38
|
+
abstract read(as: As, args: {
|
|
39
|
+
count: true;
|
|
40
|
+
criteria: Dict;
|
|
41
|
+
}): MaybePromise<number>;
|
|
42
|
+
abstract read(as: As, args: {
|
|
43
|
+
criteria: Dict;
|
|
44
|
+
fields?: string[];
|
|
45
|
+
limit?: number;
|
|
46
|
+
sort?: Sort;
|
|
47
|
+
}): MaybePromise<Dict[]>;
|
|
48
|
+
abstract update(as: As, args: {
|
|
49
|
+
changes: Dict;
|
|
50
|
+
criteria: Dict;
|
|
51
|
+
}): MaybePromise<number>;
|
|
52
|
+
abstract delete(as: As, args: {
|
|
53
|
+
criteria: Dict;
|
|
54
|
+
}): MaybePromise<number>;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=Database.d.ts.map
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import fail from "#fail";
|
|
2
|
+
import maybe from "@rcompat/assert/maybe";
|
|
3
|
+
import entries from "@rcompat/record/entries";
|
|
4
|
+
function required(operation) {
|
|
5
|
+
fail("{0}: at least one column required", operation);
|
|
6
|
+
}
|
|
7
|
+
function normalizeSort(direction) {
|
|
8
|
+
if (typeof direction !== "string")
|
|
9
|
+
throw fail("invalid sort direction {0}", direction);
|
|
10
|
+
const lowered = direction.toLowerCase();
|
|
11
|
+
if (lowered !== "asc" && lowered !== "desc")
|
|
12
|
+
throw fail("invalid sort direction {0}", direction);
|
|
13
|
+
return lowered.toUpperCase();
|
|
14
|
+
}
|
|
15
|
+
export default class Database {
|
|
16
|
+
#bindPrefix;
|
|
17
|
+
constructor(bindPrefix) {
|
|
18
|
+
this.#bindPrefix = bindPrefix ?? "";
|
|
19
|
+
}
|
|
20
|
+
#assert(types, columns) {
|
|
21
|
+
const known = new Set(Object.keys(types));
|
|
22
|
+
const unknown = columns.filter(c => !known.has(c));
|
|
23
|
+
if (unknown.length > 0) {
|
|
24
|
+
throw fail("unknown column(s) {0}", unknown.join(", "));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
#quote(name) {
|
|
28
|
+
if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(name)) {
|
|
29
|
+
throw fail("invalid identifier {0}", name);
|
|
30
|
+
}
|
|
31
|
+
return `\`${name}\``;
|
|
32
|
+
}
|
|
33
|
+
ident(name) {
|
|
34
|
+
return this.#quote(name);
|
|
35
|
+
}
|
|
36
|
+
table(as) {
|
|
37
|
+
return this.#quote(as.name);
|
|
38
|
+
}
|
|
39
|
+
toSelect(types, columns) {
|
|
40
|
+
maybe(columns).array();
|
|
41
|
+
if (!columns)
|
|
42
|
+
return "*";
|
|
43
|
+
if (columns.length === 0)
|
|
44
|
+
throw required("select");
|
|
45
|
+
this.#assert(types, columns);
|
|
46
|
+
return columns.map(this.#quote).join(", ");
|
|
47
|
+
}
|
|
48
|
+
toSort(types, sort) {
|
|
49
|
+
maybe(sort).record();
|
|
50
|
+
if (!sort)
|
|
51
|
+
return "";
|
|
52
|
+
const columns = Object.entries(sort);
|
|
53
|
+
if (columns.length === 0)
|
|
54
|
+
throw required("sort");
|
|
55
|
+
this.#assert(types, columns.map(([k]) => k));
|
|
56
|
+
const order = columns
|
|
57
|
+
.map(([k, direction]) => `${this.#quote(k)} ${normalizeSort(direction)}`)
|
|
58
|
+
.join(", ");
|
|
59
|
+
return ` ORDER BY ${order}`;
|
|
60
|
+
}
|
|
61
|
+
toLimit(limit) {
|
|
62
|
+
maybe(limit).usize();
|
|
63
|
+
return limit !== undefined ? ` LIMIT ${limit}` : "";
|
|
64
|
+
}
|
|
65
|
+
toWhere(types, criteria) {
|
|
66
|
+
const columns = Object.keys(criteria);
|
|
67
|
+
this.#assert(types, columns);
|
|
68
|
+
if (columns.length === 0)
|
|
69
|
+
return "";
|
|
70
|
+
const p = this.#bindPrefix; // "$" or ":"
|
|
71
|
+
const parts = columns.map(column => {
|
|
72
|
+
const value = criteria[column];
|
|
73
|
+
// null criteria
|
|
74
|
+
if (value === null)
|
|
75
|
+
return `${this.#quote(column)} IS NULL`;
|
|
76
|
+
if (typeof value === "object") {
|
|
77
|
+
if ("$like" in value) {
|
|
78
|
+
return `${this.#quote(column)} LIKE ${p}${column}`;
|
|
79
|
+
}
|
|
80
|
+
//if ("$gte" in value) return `${this.#quote(column)} >= ${p}${column}`;
|
|
81
|
+
throw fail("unsupported operator in field {0}", column);
|
|
82
|
+
}
|
|
83
|
+
return `${this.#quote(column)}=${p}${column}`;
|
|
84
|
+
});
|
|
85
|
+
return `WHERE ${parts.join(" AND ")}`;
|
|
86
|
+
}
|
|
87
|
+
async toSet(types, changes) {
|
|
88
|
+
const columns = Object.keys(changes);
|
|
89
|
+
this.#assert(types, columns);
|
|
90
|
+
if (columns.length === 0)
|
|
91
|
+
throw required("set");
|
|
92
|
+
const p = this.#bindPrefix; // "$" or ":"
|
|
93
|
+
const set = `SET ${columns.map(c => `${this.#quote(c)}=${p}s_${c}`).join(", ")}`;
|
|
94
|
+
const raw = Object.fromEntries(columns.map(c => [`s_${c}`, changes[c]]));
|
|
95
|
+
// bind original keys (e.g. { age: 35 } -> { $age: 35 })
|
|
96
|
+
const binds = await this.bind(types, raw);
|
|
97
|
+
return { set, binds };
|
|
98
|
+
}
|
|
99
|
+
#bind(key, value) {
|
|
100
|
+
return value === null
|
|
101
|
+
? null
|
|
102
|
+
: this.typemap[key].bind(value);
|
|
103
|
+
}
|
|
104
|
+
#unbind(key, value) {
|
|
105
|
+
return this.typemap[key].unbind(value);
|
|
106
|
+
}
|
|
107
|
+
column(key) {
|
|
108
|
+
return this.typemap[key].column;
|
|
109
|
+
}
|
|
110
|
+
;
|
|
111
|
+
// identity
|
|
112
|
+
formatBinds(binds) {
|
|
113
|
+
return binds;
|
|
114
|
+
}
|
|
115
|
+
async bind(types, object) {
|
|
116
|
+
const out = Object.fromEntries(await Promise.all(Object.entries(object).map(async ([key, value]) => {
|
|
117
|
+
// support "s_" pseudo-namespace for SET params
|
|
118
|
+
const base = key.startsWith("s_") ? key.slice(2) : key;
|
|
119
|
+
const bound = await this.#bind(types[base], value);
|
|
120
|
+
return [`${this.#bindPrefix}${key}`, bound];
|
|
121
|
+
})));
|
|
122
|
+
return this.formatBinds(out);
|
|
123
|
+
}
|
|
124
|
+
async bindCriteria(types, criteria) {
|
|
125
|
+
const filtered = {};
|
|
126
|
+
for (const [key, value] of Object.entries(criteria)) {
|
|
127
|
+
// null isn't bound
|
|
128
|
+
if (value === null)
|
|
129
|
+
continue;
|
|
130
|
+
if (typeof value === "object") {
|
|
131
|
+
// extract primitive value from operator object
|
|
132
|
+
if ("$like" in value) {
|
|
133
|
+
if (typeof value.$like !== "string") {
|
|
134
|
+
throw fail("$like operator requires string value, got {0}", typeof value.$like);
|
|
135
|
+
}
|
|
136
|
+
filtered[key] = value.$like;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
filtered[key] = value;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return this.bind(types, filtered);
|
|
144
|
+
}
|
|
145
|
+
unbind(types, object) {
|
|
146
|
+
return entries(object)
|
|
147
|
+
.filter(([, value]) => value !== null)
|
|
148
|
+
.map(([key, value]) => [key, this.#unbind(types[key], value)])
|
|
149
|
+
.get();
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
;
|
|
153
|
+
//# sourceMappingURL=Database.js.map
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type As from "#database/As";
|
|
2
|
+
import Database from "#database/Database";
|
|
3
|
+
import type DataDict from "#database/DataDict";
|
|
4
|
+
import type Sort from "#database/Sort";
|
|
5
|
+
import type TypeMap from "#database/TypeMap";
|
|
6
|
+
import type Dict from "@rcompat/type/Dict";
|
|
7
|
+
import type MaybePromise from "@rcompat/type/MaybePromise";
|
|
8
|
+
export default class InMemoryDatabase extends Database {
|
|
9
|
+
#private;
|
|
10
|
+
get typemap(): TypeMap<Dict>;
|
|
11
|
+
get schema(): {
|
|
12
|
+
create: (name: string) => void;
|
|
13
|
+
delete: (name: string) => void;
|
|
14
|
+
};
|
|
15
|
+
close(): void;
|
|
16
|
+
create<O extends Dict>(as: As, args: {
|
|
17
|
+
record: Dict;
|
|
18
|
+
}): MaybePromise<O>;
|
|
19
|
+
read(as: As, args: {
|
|
20
|
+
count: true;
|
|
21
|
+
criteria: DataDict;
|
|
22
|
+
}): number;
|
|
23
|
+
read(as: As, args: {
|
|
24
|
+
criteria: DataDict;
|
|
25
|
+
fields?: string[];
|
|
26
|
+
limit?: number;
|
|
27
|
+
sort?: Sort;
|
|
28
|
+
}): Dict[];
|
|
29
|
+
update(as: As, args: {
|
|
30
|
+
changes: DataDict;
|
|
31
|
+
criteria: DataDict;
|
|
32
|
+
}): Promise<number>;
|
|
33
|
+
delete(as: As, args: {
|
|
34
|
+
criteria: DataDict;
|
|
35
|
+
}): number;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=InMemoryDatabase.d.ts.map
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import Database from "#database/Database";
|
|
2
|
+
import fail from "#fail";
|
|
3
|
+
import assert from "@rcompat/assert";
|
|
4
|
+
import entries from "@rcompat/record/entries";
|
|
5
|
+
function match(record, criteria) {
|
|
6
|
+
return Object.entries(criteria).every(([k, v]) => {
|
|
7
|
+
const value = record[k];
|
|
8
|
+
// null criteria (IS NULL semantics)
|
|
9
|
+
if (v === null)
|
|
10
|
+
return !Object.hasOwn(record, k);
|
|
11
|
+
// handle operator objects
|
|
12
|
+
if (typeof v === "object") {
|
|
13
|
+
// $like operator
|
|
14
|
+
if ("$like" in v) {
|
|
15
|
+
// NULL values don't match LIKE patterns
|
|
16
|
+
if (value === null || value === undefined)
|
|
17
|
+
return false;
|
|
18
|
+
const $like = v.$like;
|
|
19
|
+
if (typeof $like !== "string")
|
|
20
|
+
throw fail("$like operator requires string, got {0}", typeof $like);
|
|
21
|
+
const regex = new RegExp("^" + $like.replace(/%/g, ".*").replace(/\?/g, ".") + "$");
|
|
22
|
+
return regex.test(String(value));
|
|
23
|
+
}
|
|
24
|
+
// future: number operators
|
|
25
|
+
// if ("$gte" in v) return recordValue >= v.$gte;
|
|
26
|
+
// if ("$gt" in v) return recordValue > v.$gt;
|
|
27
|
+
// if ("$lte" in v) return recordValue <= v.$lte;
|
|
28
|
+
// if ("$lt" in v) return recordValue < v.$lt;
|
|
29
|
+
return false; // unknown operator
|
|
30
|
+
}
|
|
31
|
+
// direct equality match
|
|
32
|
+
return value === v;
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
function filter(record, fields) {
|
|
36
|
+
return Object.fromEntries(Object.entries(record)
|
|
37
|
+
.filter(([key]) => fields.includes(key)));
|
|
38
|
+
}
|
|
39
|
+
function toSorted(d1, d2, sort) {
|
|
40
|
+
return [...entries(sort).valmap(([, value]) => value === "asc" ? 1 : -1)]
|
|
41
|
+
.reduce((sorting, [field, direction]) => {
|
|
42
|
+
const left = d1[field];
|
|
43
|
+
const right = d2[field];
|
|
44
|
+
// if sorting has been established, it stays fixed
|
|
45
|
+
if (sorting !== 0) {
|
|
46
|
+
return sorting;
|
|
47
|
+
}
|
|
48
|
+
// equal, sorting doesn't change
|
|
49
|
+
if (left === right) {
|
|
50
|
+
return sorting;
|
|
51
|
+
}
|
|
52
|
+
if (left < right) {
|
|
53
|
+
return -1 * direction;
|
|
54
|
+
}
|
|
55
|
+
return direction;
|
|
56
|
+
}, 0);
|
|
57
|
+
}
|
|
58
|
+
function ident(column) {
|
|
59
|
+
return {
|
|
60
|
+
bind: value => value,
|
|
61
|
+
column,
|
|
62
|
+
unbind: value => value,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
const typemap = {
|
|
66
|
+
blob: ident("BLOB"),
|
|
67
|
+
boolean: ident("BOOLEAN"),
|
|
68
|
+
datetime: ident("DATE"),
|
|
69
|
+
f32: ident("NUMBER"),
|
|
70
|
+
f64: ident("NUMBER"),
|
|
71
|
+
i128: ident("BIGINT"),
|
|
72
|
+
i16: ident("NUMBER"),
|
|
73
|
+
i32: ident("NUMBER"),
|
|
74
|
+
i64: ident("BIGINT"),
|
|
75
|
+
i8: ident("NUMBER"),
|
|
76
|
+
primary: ident("STRING"),
|
|
77
|
+
string: ident("STRING"),
|
|
78
|
+
time: ident("STRING"),
|
|
79
|
+
u128: ident("BIGINT"),
|
|
80
|
+
u16: ident("NUMBER"),
|
|
81
|
+
u32: ident("NUMBER"),
|
|
82
|
+
u64: ident("BIGINT"),
|
|
83
|
+
u8: ident("NUMBER"),
|
|
84
|
+
url: ident("URL"),
|
|
85
|
+
};
|
|
86
|
+
export default class InMemoryDatabase extends Database {
|
|
87
|
+
#collections = {};
|
|
88
|
+
get typemap() {
|
|
89
|
+
return typemap;
|
|
90
|
+
}
|
|
91
|
+
#new(name) {
|
|
92
|
+
if (this.#collections[name] !== undefined) {
|
|
93
|
+
throw fail("collection {0} already exists", name);
|
|
94
|
+
}
|
|
95
|
+
this.#collections[name] = [];
|
|
96
|
+
}
|
|
97
|
+
#drop(name) {
|
|
98
|
+
if (this.#collections[name] === undefined) {
|
|
99
|
+
// do nothing
|
|
100
|
+
}
|
|
101
|
+
delete this.#collections[name];
|
|
102
|
+
}
|
|
103
|
+
#use(name) {
|
|
104
|
+
if (this.#collections[name] === undefined) {
|
|
105
|
+
this.#collections[name] = [];
|
|
106
|
+
}
|
|
107
|
+
return this.#collections[name];
|
|
108
|
+
}
|
|
109
|
+
get schema() {
|
|
110
|
+
return {
|
|
111
|
+
create: this.#new.bind(this),
|
|
112
|
+
delete: this.#drop.bind(this),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
// noop
|
|
116
|
+
close() { }
|
|
117
|
+
create(as, args) {
|
|
118
|
+
const collection = this.#use(as.name);
|
|
119
|
+
const record = { ...args.record };
|
|
120
|
+
if (record.id === undefined) {
|
|
121
|
+
record.id = crypto.randomUUID();
|
|
122
|
+
}
|
|
123
|
+
;
|
|
124
|
+
if (typeof record.id !== "string") {
|
|
125
|
+
throw fail("id must be string, got {0}", record.id);
|
|
126
|
+
}
|
|
127
|
+
if (collection.find(stored => stored.id === record.id)) {
|
|
128
|
+
throw fail("id {0} already exists in the database", record.id);
|
|
129
|
+
}
|
|
130
|
+
collection.push({ ...record });
|
|
131
|
+
return record;
|
|
132
|
+
}
|
|
133
|
+
read(as, args) {
|
|
134
|
+
this.toWhere(as.types, args.criteria);
|
|
135
|
+
if (args.fields !== undefined)
|
|
136
|
+
this.toSelect(as.types, args.fields);
|
|
137
|
+
if (args.sort !== undefined)
|
|
138
|
+
this.toSort(as.types, args.sort);
|
|
139
|
+
const collection = this.#use(as.name);
|
|
140
|
+
const matches = collection.filter(r => match(r, args.criteria));
|
|
141
|
+
if (args.count === true) {
|
|
142
|
+
return matches.length;
|
|
143
|
+
}
|
|
144
|
+
const sort = args.sort ?? {};
|
|
145
|
+
const sorted = Object.keys(sort).length === 0
|
|
146
|
+
? matches
|
|
147
|
+
: matches.toSorted((a, b) => toSorted(a, b, sort));
|
|
148
|
+
const limit = args.limit ?? sorted.length;
|
|
149
|
+
const fields = args.fields ?? [];
|
|
150
|
+
return (fields.length === 0
|
|
151
|
+
? sorted
|
|
152
|
+
: sorted.map(s => filter(s, fields))).slice(0, limit);
|
|
153
|
+
}
|
|
154
|
+
async update(as, args) {
|
|
155
|
+
assert(Object.keys(args.criteria).length > 0, "update: no criteria");
|
|
156
|
+
this.toWhere(as.types, args.criteria);
|
|
157
|
+
await this.toSet(as.types, args.changes);
|
|
158
|
+
const collection = this.#use(as.name);
|
|
159
|
+
const matched = collection.filter(record => match(record, args.criteria));
|
|
160
|
+
return matched.map(record => {
|
|
161
|
+
const changed = entries({ ...record, ...args.changes })
|
|
162
|
+
.filter(([, value]) => value !== null)
|
|
163
|
+
.get();
|
|
164
|
+
const index = collection.findIndex(stored => stored.id === record.id);
|
|
165
|
+
collection.splice(index, 1, changed);
|
|
166
|
+
return changed;
|
|
167
|
+
}).length;
|
|
168
|
+
}
|
|
169
|
+
delete(as, args) {
|
|
170
|
+
if (Object.keys(args.criteria).length === 0) {
|
|
171
|
+
throw fail("delete: no criteria");
|
|
172
|
+
}
|
|
173
|
+
this.toWhere(as.types, args.criteria);
|
|
174
|
+
const collection = this.#use(as.name);
|
|
175
|
+
const size_before = collection.length;
|
|
176
|
+
this.#collections[as.name] = collection
|
|
177
|
+
.filter(record => !match(record, args.criteria));
|
|
178
|
+
return size_before - this.#use(as.name).length;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=InMemoryDatabase.js.map
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type StoreSchema from "pema/StoreSchema";
|
|
2
|
+
import type DataRecord from "#database/DataRecord";
|
|
3
|
+
type X<T> = {
|
|
4
|
+
[K in keyof T]: T[K];
|
|
5
|
+
} & {};
|
|
6
|
+
type Filter<T, P extends keyof T> = X<Pick<T, Extract<P, keyof T>>>;
|
|
7
|
+
export default class Query<T extends StoreSchema, P extends keyof DataRecord<T> = keyof DataRecord<T>> {
|
|
8
|
+
#private;
|
|
9
|
+
constructor(schema: T);
|
|
10
|
+
select<K extends P>(...projection: K[]): Query<T, K>;
|
|
11
|
+
run(): Promise<Filter<DataRecord<T>, P>>;
|
|
12
|
+
}
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=Query.d.ts.map
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export default class Query {
|
|
2
|
+
#schema;
|
|
3
|
+
#projection;
|
|
4
|
+
constructor(schema) {
|
|
5
|
+
this.#schema = schema;
|
|
6
|
+
}
|
|
7
|
+
select(...projection) {
|
|
8
|
+
this.#projection = projection;
|
|
9
|
+
return this;
|
|
10
|
+
}
|
|
11
|
+
async run() {
|
|
12
|
+
return this.#schema.infer;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=Query.js.map
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type DataRecord from "#database/DataRecord";
|
|
2
|
+
import type InferStoreOut from "pema/InferStoreOut";
|
|
3
|
+
import type StoreSchema from "pema/StoreSchema";
|
|
4
|
+
type X<T> = {
|
|
5
|
+
[K in keyof T]: T[K];
|
|
6
|
+
} & {};
|
|
7
|
+
type Filter<T, P extends keyof T> = X<Pick<T, Extract<P, keyof T>>>;
|
|
8
|
+
export default abstract class QueryBuilder<T extends StoreSchema, P extends keyof DataRecord<T> = keyof DataRecord<T>> {
|
|
9
|
+
abstract where(criteria: any): QueryBuilder<T>;
|
|
10
|
+
abstract select<K extends P>(...fields: K[]): QueryBuilder<T, K>;
|
|
11
|
+
abstract run(): Promise<Filter<InferStoreOut<T>, P>>;
|
|
12
|
+
}
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=QueryBuilder.d.ts.map
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import type Changes from "#database/Changes";
|
|
2
|
+
import type Database from "#database/Database";
|
|
3
|
+
import type DataRecord from "#database/DataRecord";
|
|
4
|
+
import wrap from "#database/symbol/wrap";
|
|
5
|
+
import type Types from "#database/Types";
|
|
6
|
+
import type Dict from "@rcompat/type/Dict";
|
|
7
|
+
import type Serializable from "@rcompat/type/Serializable";
|
|
8
|
+
import type Id from "pema/Id";
|
|
9
|
+
import type InferStore from "pema/InferStore";
|
|
10
|
+
import type StoreId from "pema/StoreId";
|
|
11
|
+
import type StoreSchema from "pema/StoreSchema";
|
|
12
|
+
type X<T> = {
|
|
13
|
+
[K in keyof T]: T[K];
|
|
14
|
+
} & {};
|
|
15
|
+
type StringOperators = {
|
|
16
|
+
$like?: string;
|
|
17
|
+
};
|
|
18
|
+
type QueryOperators<T> = T extends string ? T | StringOperators | null : T | null;
|
|
19
|
+
type Criteria<T extends StoreSchema> = X<{
|
|
20
|
+
[K in keyof Omit<InferStore<T>, "id">]?: QueryOperators<InferStore<T>[K]>;
|
|
21
|
+
} & {
|
|
22
|
+
id?: StoreId<T> | null;
|
|
23
|
+
}>;
|
|
24
|
+
type Select<T> = {
|
|
25
|
+
[K in keyof T]?: true;
|
|
26
|
+
};
|
|
27
|
+
type Sort<T> = {
|
|
28
|
+
[K in keyof T]?: "asc" | "desc";
|
|
29
|
+
};
|
|
30
|
+
type Insertable<T extends StoreSchema> = Omit<InferStore<T>, "id"> & {
|
|
31
|
+
id?: StoreId<T>;
|
|
32
|
+
};
|
|
33
|
+
type Filter<A, B = undefined> = B extends undefined ? A : {
|
|
34
|
+
[K in keyof A as K extends keyof B ? B[K] extends true ? K : never : never]: A[K];
|
|
35
|
+
};
|
|
36
|
+
type Config = {
|
|
37
|
+
database?: Database;
|
|
38
|
+
name?: string;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Database-backed store.
|
|
42
|
+
*
|
|
43
|
+
* A `DatabaseStore` exposes a typed, validated interface over a relational or
|
|
44
|
+
* document database table/collection. It pairs a Pema schema with a uniform
|
|
45
|
+
* CRUD/query API.
|
|
46
|
+
*
|
|
47
|
+
*/
|
|
48
|
+
export default class DatabaseStore<S extends StoreSchema> implements Serializable {
|
|
49
|
+
#private;
|
|
50
|
+
[wrap]: (name: string, database: Database) => this;
|
|
51
|
+
readonly R: DataRecord<S>;
|
|
52
|
+
constructor(schema: S, config?: Config);
|
|
53
|
+
static new<S extends StoreSchema>(schema: S, config?: Config): DatabaseStore<S>;
|
|
54
|
+
get schema(): {
|
|
55
|
+
create: () => import("@rcompat/type/MaybePromise").default<void>;
|
|
56
|
+
delete: () => import("@rcompat/type/MaybePromise").default<void>;
|
|
57
|
+
};
|
|
58
|
+
get infer(): InferStore<S>;
|
|
59
|
+
get database(): Database;
|
|
60
|
+
get types(): Types;
|
|
61
|
+
get name(): string;
|
|
62
|
+
/**
|
|
63
|
+
* Count records.
|
|
64
|
+
*
|
|
65
|
+
* @param criteria Criteria to limit which records are counted.
|
|
66
|
+
* @returns Number of matching records (or total if no criteria given).
|
|
67
|
+
*/
|
|
68
|
+
count(criteria?: Criteria<S> | {
|
|
69
|
+
id: StoreId<S>;
|
|
70
|
+
}): Promise<number>;
|
|
71
|
+
/**
|
|
72
|
+
* Check whether a record with the given id exists.
|
|
73
|
+
*
|
|
74
|
+
* @param id Record id.
|
|
75
|
+
* @returns `true` if a record with the given id exists, otherwise `false`.
|
|
76
|
+
*/
|
|
77
|
+
has(id: StoreId<S>): Promise<boolean>;
|
|
78
|
+
/**
|
|
79
|
+
* Get a record by id.
|
|
80
|
+
*
|
|
81
|
+
* @param id Record id.
|
|
82
|
+
* @throws If no record with the given id exists.
|
|
83
|
+
* @returns The record for the given id.
|
|
84
|
+
*/
|
|
85
|
+
get(id: Id): Promise<DataRecord<S>>;
|
|
86
|
+
/**
|
|
87
|
+
* Try to get a record by id.
|
|
88
|
+
*
|
|
89
|
+
* @param id Record id.
|
|
90
|
+
* @returns The record if found, otherwise `undefined`.
|
|
91
|
+
*/
|
|
92
|
+
try(id: Id): Promise<DataRecord<S> | undefined>;
|
|
93
|
+
/**
|
|
94
|
+
* Insert a single record.
|
|
95
|
+
*
|
|
96
|
+
* If `id` is omitted, the driver generates one. Input is validated
|
|
97
|
+
* according to the store schema.
|
|
98
|
+
*
|
|
99
|
+
* @param record Record to insert (id optional).
|
|
100
|
+
* @throws If a record with the same id already exists or validation fails.
|
|
101
|
+
* @returns The inserted record with id.
|
|
102
|
+
*/
|
|
103
|
+
insert(record: Insertable<S>): Promise<DataRecord<S>>;
|
|
104
|
+
/**
|
|
105
|
+
* Update a single record.
|
|
106
|
+
*
|
|
107
|
+
* Change semantics:
|
|
108
|
+
* - missing / undefined -> leave field unchanged
|
|
109
|
+
* - null -> unset field (only for nullable fields, otherwise throw)
|
|
110
|
+
* - value -> set field to value
|
|
111
|
+
*
|
|
112
|
+
* Change input is validated according to the store schema.
|
|
113
|
+
*
|
|
114
|
+
* @param id Record id.
|
|
115
|
+
* @param changes Partial changes per the rules above.
|
|
116
|
+
* @throws If the id is missing, `.id` is present in `changes`, attempting to
|
|
117
|
+
* unset a non-nullable field, validation fails, or no record is updated.
|
|
118
|
+
*/
|
|
119
|
+
update(id: Id, changes: Changes<S>): Promise<void>;
|
|
120
|
+
/**
|
|
121
|
+
* Update multiple records.
|
|
122
|
+
*
|
|
123
|
+
* Same change semantics as when updating a single record.
|
|
124
|
+
*
|
|
125
|
+
* @param criteria Criteria selecting which records to update.
|
|
126
|
+
* @param changes Partial changes per the rules above.
|
|
127
|
+
* @returns Number of updated records (may be 0).
|
|
128
|
+
*/
|
|
129
|
+
update(criteria: Criteria<S>, changes: Changes<S>): Promise<number>;
|
|
130
|
+
/**
|
|
131
|
+
* Delete a single record.
|
|
132
|
+
*
|
|
133
|
+
* @param id Record id.
|
|
134
|
+
* @throws If no records with the given id exists.
|
|
135
|
+
*/
|
|
136
|
+
delete(id: Id): Promise<void>;
|
|
137
|
+
/**
|
|
138
|
+
* Delete multiple records.
|
|
139
|
+
*
|
|
140
|
+
* @param criteria Criteria selecting which records to delete.
|
|
141
|
+
* @returns Number of records deleted (may be 0).
|
|
142
|
+
*/
|
|
143
|
+
delete(criteria: Criteria<S>): Promise<number>;
|
|
144
|
+
/**
|
|
145
|
+
* Find matching records.
|
|
146
|
+
*
|
|
147
|
+
* @param criteria Criteria to match records by.
|
|
148
|
+
* @param options Query options.
|
|
149
|
+
* @returns Matching records, possibly projected/limited/sorted.
|
|
150
|
+
*/
|
|
151
|
+
find(criteria: Criteria<S>): Promise<Filter<DataRecord<S>>[]>;
|
|
152
|
+
find(criteria: Criteria<S>, options: {
|
|
153
|
+
limit?: number;
|
|
154
|
+
select?: undefined;
|
|
155
|
+
sort?: Sort<DataRecord<S>>;
|
|
156
|
+
}): Promise<Filter<DataRecord<S>>[]>;
|
|
157
|
+
find<F extends Select<DataRecord<S>>>(criteria: Criteria<S>, options?: {
|
|
158
|
+
limit?: number;
|
|
159
|
+
select?: F;
|
|
160
|
+
sort?: Sort<DataRecord<S>>;
|
|
161
|
+
}): Promise<Filter<DataRecord<S>, F>[]>;
|
|
162
|
+
toJSON(): {
|
|
163
|
+
type: "object";
|
|
164
|
+
properties: Dict<import("pema/StoreType").Serialized>;
|
|
165
|
+
};
|
|
166
|
+
extend<A extends Dict>(extensor: (This: this) => A): this & A;
|
|
167
|
+
}
|
|
168
|
+
export {};
|
|
169
|
+
//# sourceMappingURL=Store.d.ts.map
|