@primate/core 0.1.9 → 0.2.0
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 +245 -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 -35
- 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,245 @@
|
|
|
1
|
+
import AppError from "#AppError";
|
|
2
|
+
import location from "#location";
|
|
3
|
+
import log from "#log";
|
|
4
|
+
import reducer from "#reducer";
|
|
5
|
+
import $router from "#request/router";
|
|
6
|
+
import s_layout_depth from "#symbol/layout-depth";
|
|
7
|
+
import FileRef from "@rcompat/fs/FileRef";
|
|
8
|
+
import json from "@rcompat/package/json";
|
|
9
|
+
import dedent from "@rcompat/string/dedent";
|
|
10
|
+
const dirname = import.meta.dirname;
|
|
11
|
+
const pre = async (app) => {
|
|
12
|
+
// remove build directory in case exists
|
|
13
|
+
await app.path.build.remove();
|
|
14
|
+
await app.path.build.create();
|
|
15
|
+
await Promise.all(["server", "client", "components"]
|
|
16
|
+
.map(directory => app.runpath(directory).create()));
|
|
17
|
+
// this has to occur before post, so that layout depth is available for
|
|
18
|
+
// compiling root components
|
|
19
|
+
// bindings should have been registered during `init`
|
|
20
|
+
const router = await $router(app.path.routes, app.extensions);
|
|
21
|
+
app.set(s_layout_depth, router.depth("layout"));
|
|
22
|
+
const i18n_config_path = app.path.config.join("i18n.ts");
|
|
23
|
+
const i18n_config_js_path = app.path.config.join("i18n.js");
|
|
24
|
+
// minimal effort: check if i18n.ts exists (heavier effort during serve)
|
|
25
|
+
const has_i18n_config = await i18n_config_path.exists()
|
|
26
|
+
|| await i18n_config_js_path.exists();
|
|
27
|
+
app.i18n_active = has_i18n_config;
|
|
28
|
+
return app;
|
|
29
|
+
};
|
|
30
|
+
async function indexDatabase(base) {
|
|
31
|
+
const export_from = "export { default } from";
|
|
32
|
+
const default_database = `${export_from} "#stage/config/database/index.js";`;
|
|
33
|
+
// app/config/database does not exist
|
|
34
|
+
if (!await base.exists())
|
|
35
|
+
return default_database;
|
|
36
|
+
const databases = await base.list();
|
|
37
|
+
const n = databases.length;
|
|
38
|
+
// none in app/config/database -> fallback
|
|
39
|
+
if (n === 0)
|
|
40
|
+
return default_database;
|
|
41
|
+
// index database file found, will be overwritten in next step
|
|
42
|
+
if (databases.some(d => d.base === "index"))
|
|
43
|
+
return "";
|
|
44
|
+
const names = databases.map(d => d.name);
|
|
45
|
+
// app/config/database/default.ts -> use
|
|
46
|
+
const ts = names.includes("default.ts");
|
|
47
|
+
if (ts)
|
|
48
|
+
return `${export_from} "#stage/config/database/default.ts";`;
|
|
49
|
+
// app/config/database/default.js -> use
|
|
50
|
+
const js = names.includes("default.js");
|
|
51
|
+
if (js)
|
|
52
|
+
return `${export_from} "#stage/config/database/default.js";`;
|
|
53
|
+
// one in app/config/database -> default
|
|
54
|
+
if (n === 1)
|
|
55
|
+
return `${export_from} "#stage/config/database/${names[0]}";`;
|
|
56
|
+
throw new AppError("Multiple database drivers; add index or default.(ts|js). Found: {0}", names.join(", "));
|
|
57
|
+
}
|
|
58
|
+
const js_re = /^.*.js$/;
|
|
59
|
+
const write_directories = async (build_directory, app) => {
|
|
60
|
+
for (const name of app.server_build) {
|
|
61
|
+
const d = app.runpath(`${name}s`);
|
|
62
|
+
const e = await Promise.all((await FileRef.collect(d, file => js_re.test(file.path)))
|
|
63
|
+
.map(async (path) => `${path}`.replace(d.toString(), _ => "")));
|
|
64
|
+
const files_js = `
|
|
65
|
+
const ${name} = [];
|
|
66
|
+
${e.map(path => path.slice(1, -".js".length)).map((bare, i) => `const ${name}${i} = (await import("${FileRef.webpath(`#${name}/${bare}`)}")).default;
|
|
67
|
+
${name}.push(["${FileRef.webpath(bare)}", ${name}${i}]);`).join("\n")}
|
|
68
|
+
export default ${name};`;
|
|
69
|
+
await build_directory.join(`${name}s.js`).write(files_js);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
const write_stores = async (build_directory, app) => {
|
|
73
|
+
const d2 = app.runpath(location.stores);
|
|
74
|
+
const e = await Promise.all((await FileRef.collect(d2, file => js_re.test(file.path)))
|
|
75
|
+
.map(async (path) => `${path}`.replace(d2.toString(), _ => "")));
|
|
76
|
+
const stores_js = `
|
|
77
|
+
const store = [];
|
|
78
|
+
${e.map(path => path.slice(1, -".js".length)).map((bare, i) => `import * as store${i} from "${FileRef.webpath(`#store/${bare}`)}";
|
|
79
|
+
store.push(["${FileRef.webpath(bare)}", store${i}]);`).join("\n")}
|
|
80
|
+
|
|
81
|
+
export default store;`;
|
|
82
|
+
await build_directory.join("stores.js").write(stores_js);
|
|
83
|
+
};
|
|
84
|
+
const write_components = async (build_directory, app) => {
|
|
85
|
+
const d2 = app.runpath(location.components);
|
|
86
|
+
const e = await Promise.all((await FileRef.collect(d2, file => js_re.test(file.path)))
|
|
87
|
+
.map(async (path) => `${path}`.replace(d2.toString(), _ => "")));
|
|
88
|
+
const components_js = `
|
|
89
|
+
const component = [];
|
|
90
|
+
${e.map(path => path.slice(1, -".js".length)).map((bare, i) => `import * as component${i} from "${FileRef.webpath(`#component/${bare}`)}";
|
|
91
|
+
component.push(["${FileRef.webpath(bare)}", component${i}]);`).join("\n")}
|
|
92
|
+
|
|
93
|
+
${app.roots.map((root, i) => `
|
|
94
|
+
import * as root${i} from "${FileRef.webpath(`../server/${root.name}`)}";
|
|
95
|
+
component.push(["${root.name.slice(0, -".js".length)}", root${i}]);
|
|
96
|
+
`).join("\n")}
|
|
97
|
+
|
|
98
|
+
export default component;`;
|
|
99
|
+
await build_directory.join("components.js").write(components_js);
|
|
100
|
+
};
|
|
101
|
+
const write_bootstrap = async (app, mode, i18n_active) => {
|
|
102
|
+
const build_start_script = `
|
|
103
|
+
import serve from "primate/serve";
|
|
104
|
+
const files = {};
|
|
105
|
+
${app.server_build.map(name => `${name}s`).map(name => `import ${name} from "./${app.id}/${name}.js";
|
|
106
|
+
files.${name} = ${name};`).join("\n")}
|
|
107
|
+
import components from "./${app.id}/components.js";
|
|
108
|
+
import stores from "./${app.id}/stores.js";
|
|
109
|
+
import target from "./target.js";
|
|
110
|
+
import session from "#session";
|
|
111
|
+
import config from "#config";
|
|
112
|
+
import s_config from "primate/symbol/config";
|
|
113
|
+
|
|
114
|
+
${i18n_active ? `
|
|
115
|
+
import t from "#i18n";
|
|
116
|
+
const i18n_config = t[s_config];
|
|
117
|
+
` : `
|
|
118
|
+
const i18n_config = undefined;
|
|
119
|
+
`}
|
|
120
|
+
|
|
121
|
+
const app = await serve(import.meta.url, {
|
|
122
|
+
...target,
|
|
123
|
+
config,
|
|
124
|
+
files,
|
|
125
|
+
components,
|
|
126
|
+
stores,
|
|
127
|
+
mode: "${mode}",
|
|
128
|
+
session_config: session[s_config],
|
|
129
|
+
i18n_config,
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
export default app;
|
|
133
|
+
`;
|
|
134
|
+
await app.path.build.join("serve.js").write(build_start_script);
|
|
135
|
+
};
|
|
136
|
+
const post = async (app) => {
|
|
137
|
+
const defaults = FileRef.join(import.meta.url, "../../defaults");
|
|
138
|
+
await app.stage(app.path.routes, "routes", file => dedent `
|
|
139
|
+
export * from "#stage/route${file}";
|
|
140
|
+
`);
|
|
141
|
+
await app.stage(app.path.stores, "stores", file => dedent `
|
|
142
|
+
import database from "#database";
|
|
143
|
+
import store from "#stage/store${file}";
|
|
144
|
+
import wrap from "primate/database/wrap";
|
|
145
|
+
|
|
146
|
+
export default await wrap("${file.base}", store, database);
|
|
147
|
+
`);
|
|
148
|
+
const configs = FileRef.join(dirname, "../../private/config/config");
|
|
149
|
+
const database_base = app.path.config.join("database");
|
|
150
|
+
await app.stage(configs, "config", async (file) => {
|
|
151
|
+
if (file.path === "/database/index.js")
|
|
152
|
+
return indexDatabase(database_base);
|
|
153
|
+
return `export { default } from "#stage/config${file}";`;
|
|
154
|
+
});
|
|
155
|
+
await app.stage(app.path.modules, "modules", file => `export { default } from "#stage/module${file}";`);
|
|
156
|
+
// stage locales
|
|
157
|
+
await app.stage(app.path.locales, "locales", file => `export { default } from "#stage/locale${file}";`);
|
|
158
|
+
// stage app config after locales so #locale imports can be resolved
|
|
159
|
+
await app.stage(app.path.config, "config", file => `export { default } from "#stage/config${file}";`);
|
|
160
|
+
// stage components
|
|
161
|
+
await app.stage(app.path.components, "components", file => `
|
|
162
|
+
import * as component from "#stage/component${file}";
|
|
163
|
+
|
|
164
|
+
export * from "#stage/component${file}";
|
|
165
|
+
export default component?.default;
|
|
166
|
+
`);
|
|
167
|
+
// copy framework pages
|
|
168
|
+
await defaults.copy(app.runpath(location.server, location.pages));
|
|
169
|
+
// copy pages to build
|
|
170
|
+
if (await app.path.pages.exists()) {
|
|
171
|
+
await app.path.pages.copy(app.runpath(location.server, location.pages));
|
|
172
|
+
}
|
|
173
|
+
if (await app.path.static.exists()) {
|
|
174
|
+
// copy static files to build/static
|
|
175
|
+
await app.path.static.copy(app.runpath(location.static));
|
|
176
|
+
}
|
|
177
|
+
// publish JavaScript and CSS files
|
|
178
|
+
const imports = await FileRef.collect(app.path.static, file => /\.(?:js|ts|css)$/.test(file.path));
|
|
179
|
+
await Promise.all(imports.map(async (file) => {
|
|
180
|
+
const src = file.debase(app.path.static);
|
|
181
|
+
app.build.export(`import "./${location.static}${src}";`);
|
|
182
|
+
}));
|
|
183
|
+
app.build.export("export { default } from \"primate/client/app\";");
|
|
184
|
+
app.build.plugin({
|
|
185
|
+
name: "@primate/core/frontend",
|
|
186
|
+
setup(build) {
|
|
187
|
+
build.onResolve({ filter: /#frontends/ }, ({ path }) => {
|
|
188
|
+
return { namespace: "frontends", path };
|
|
189
|
+
});
|
|
190
|
+
build.onLoad({ filter: /#frontends/ }, async () => {
|
|
191
|
+
const contents = [...app.frontends.keys()].map(name => `export { default as ${name} } from "@primate/${name}";`).join("\n");
|
|
192
|
+
return { contents, resolveDir: app.root.path };
|
|
193
|
+
});
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
app.build.plugin({
|
|
197
|
+
name: "@primate/core/alias",
|
|
198
|
+
setup(build) {
|
|
199
|
+
build.onResolve({ filter: /#static/ }, args => {
|
|
200
|
+
const path = args.path.slice(1);
|
|
201
|
+
return { path: app.root.join(path).path };
|
|
202
|
+
});
|
|
203
|
+
},
|
|
204
|
+
});
|
|
205
|
+
// start the build
|
|
206
|
+
await app.build.start();
|
|
207
|
+
// a target needs to create an `assets.js` that exports assets
|
|
208
|
+
await app.target.run();
|
|
209
|
+
const build_directory = app.path.build.join(app.id);
|
|
210
|
+
// TODO: remove after rcompat automatically creates directories
|
|
211
|
+
await build_directory.create();
|
|
212
|
+
await write_components(build_directory, app);
|
|
213
|
+
await write_stores(build_directory, app);
|
|
214
|
+
await write_directories(build_directory, app);
|
|
215
|
+
await write_bootstrap(app, app.mode, app.i18n_active);
|
|
216
|
+
const manifest_data = {
|
|
217
|
+
...await (await json()).json(),
|
|
218
|
+
imports: {
|
|
219
|
+
"#config": "./config/app.js",
|
|
220
|
+
"#config/*": "./config/*.js",
|
|
221
|
+
"#database": "./config/database/index.js",
|
|
222
|
+
"#database/*": "./config/database/*.js",
|
|
223
|
+
"#session": "./config/session.js",
|
|
224
|
+
"#i18n": "./config/i18n.js",
|
|
225
|
+
"#component/*": "./components/*.js",
|
|
226
|
+
"#locale/*": "./locales/*.js",
|
|
227
|
+
"#module/*": "./modules/*.js",
|
|
228
|
+
"#route/*": "./routes/*.js",
|
|
229
|
+
"#stage/component/*": "./stage/components/*.js",
|
|
230
|
+
"#stage/locale/*": "./stage/locales/*.js",
|
|
231
|
+
"#stage/config/*": "./stage/config/*.js",
|
|
232
|
+
"#stage/module/*": "./stage/modules/*.js",
|
|
233
|
+
"#stage/route/*": "./stage/routes/*.js",
|
|
234
|
+
"#stage/store/*": "./stage/stores/*.js",
|
|
235
|
+
"#store/*": "./stores/*.js",
|
|
236
|
+
},
|
|
237
|
+
};
|
|
238
|
+
// create package.json
|
|
239
|
+
await app.path.build.join("package.json").writeJSON(manifest_data);
|
|
240
|
+
log.system("build written to {0}", app.path.build);
|
|
241
|
+
app.cleanup();
|
|
242
|
+
return app;
|
|
243
|
+
};
|
|
244
|
+
export default async (app) => post(await reducer(app.modules, await pre(app), "build"));
|
|
245
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import log from "#log";
|
|
2
|
+
import reducer from "#reducer";
|
|
3
|
+
function pre(app) {
|
|
4
|
+
log.system("in startup");
|
|
5
|
+
return app;
|
|
6
|
+
}
|
|
7
|
+
;
|
|
8
|
+
async function post(app) {
|
|
9
|
+
await app.start();
|
|
10
|
+
return app;
|
|
11
|
+
}
|
|
12
|
+
export default async (app) => post(await reducer(app.modules, pre(app), "serve"));
|
|
13
|
+
//# sourceMappingURL=serve.js.map
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type Catalogs from "#i18n/Catalogs";
|
|
2
|
+
import type sInternal from "#i18n/symbol/internal";
|
|
3
|
+
type LocaleTags<C extends Catalogs> = keyof C & string;
|
|
4
|
+
type API<C extends Catalogs> = {
|
|
5
|
+
onChange(fn: (locale: LocaleTags<C>) => void): () => void;
|
|
6
|
+
subscribe(run: (value: API<C>) => void): () => void;
|
|
7
|
+
locale: {
|
|
8
|
+
get(): LocaleTags<C>;
|
|
9
|
+
set(locale: LocaleTags<C>): void;
|
|
10
|
+
};
|
|
11
|
+
readonly loading: boolean;
|
|
12
|
+
[sInternal]: {
|
|
13
|
+
init(locale: LocaleTags<C>): void;
|
|
14
|
+
wait(): Promise<void>;
|
|
15
|
+
depend(fn: () => void): () => void;
|
|
16
|
+
readonly version: number;
|
|
17
|
+
restore: () => void;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
export type { API as default };
|
|
21
|
+
//# sourceMappingURL=API.d.ts.map
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type Catalogs from "#i18n/Catalogs";
|
|
2
|
+
import type PersistMode from "#i18n/PersistMode";
|
|
3
|
+
type Config<C extends Catalogs = Catalogs> = {
|
|
4
|
+
defaultLocale: keyof C & string;
|
|
5
|
+
locales: C;
|
|
6
|
+
currency?: string;
|
|
7
|
+
persist?: PersistMode;
|
|
8
|
+
};
|
|
9
|
+
export type { Config as default };
|
|
10
|
+
//# sourceMappingURL=Config.d.ts.map
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export default class Formatter {
|
|
2
|
+
#private;
|
|
3
|
+
constructor(locale: string);
|
|
4
|
+
get locale(): string;
|
|
5
|
+
set locale(locale: string);
|
|
6
|
+
number(number: number): string;
|
|
7
|
+
date(date: Date): string;
|
|
8
|
+
currency(currency: string, amount: number): string;
|
|
9
|
+
ordinal(number: number): string;
|
|
10
|
+
relative(milliseconds: number, options?: {
|
|
11
|
+
numeric?: "always" | "auto";
|
|
12
|
+
style?: "long" | "short" | "narrow";
|
|
13
|
+
}): string;
|
|
14
|
+
list(items: string[]): string;
|
|
15
|
+
unit(value: number, u: string): string;
|
|
16
|
+
pluralRules(): Intl.PluralRules;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=Formatter.d.ts.map
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import fail from "#fail";
|
|
2
|
+
import ordinals from "#i18n/ordinals";
|
|
3
|
+
import toIntlUnit from "#i18n/toIntlUnit";
|
|
4
|
+
import is from "@rcompat/assert/is";
|
|
5
|
+
export default class Formatter {
|
|
6
|
+
#locale;
|
|
7
|
+
constructor(locale) {
|
|
8
|
+
is(locale).string();
|
|
9
|
+
this.#locale = locale;
|
|
10
|
+
}
|
|
11
|
+
get locale() {
|
|
12
|
+
return this.#locale;
|
|
13
|
+
}
|
|
14
|
+
set locale(locale) {
|
|
15
|
+
is(locale).string();
|
|
16
|
+
this.#locale = locale;
|
|
17
|
+
}
|
|
18
|
+
number(number) {
|
|
19
|
+
try {
|
|
20
|
+
return new Intl.NumberFormat(this.#locale).format(number);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return String(number);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
date(date) {
|
|
27
|
+
try {
|
|
28
|
+
return new Intl.DateTimeFormat(this.#locale).format(date);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return date.toString();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
currency(currency, amount) {
|
|
35
|
+
const options = { style: "currency", currency };
|
|
36
|
+
try {
|
|
37
|
+
return new Intl.NumberFormat(this.#locale, options).format(amount);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return String(amount);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
ordinal(number) {
|
|
44
|
+
try {
|
|
45
|
+
const n = Math.trunc(number);
|
|
46
|
+
const rules = new Intl.PluralRules(this.#locale, { type: "ordinal" });
|
|
47
|
+
const category = rules.select(n);
|
|
48
|
+
const language = this.#locale.split("-")[0];
|
|
49
|
+
if (!(language in ordinals))
|
|
50
|
+
return String(n);
|
|
51
|
+
const strategy = ordinals[language];
|
|
52
|
+
const position = strategy.position;
|
|
53
|
+
const pattern = strategy[category] || strategy.other;
|
|
54
|
+
return position === "prefix" ? `${pattern}${n}` : `${n}${pattern}`;
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return String(Math.trunc(number));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
relative(milliseconds, options) {
|
|
61
|
+
const defaults = { numeric: "auto", style: "long", ...options };
|
|
62
|
+
try {
|
|
63
|
+
const rtf = new Intl.RelativeTimeFormat(this.#locale, defaults);
|
|
64
|
+
const s = Math.round(milliseconds / 1000);
|
|
65
|
+
const abs = Math.abs(s);
|
|
66
|
+
if (abs >= 31536000)
|
|
67
|
+
return rtf.format(Math.trunc(s / 31536000), "year");
|
|
68
|
+
if (abs >= 2592000)
|
|
69
|
+
return rtf.format(Math.trunc(s / 2592000), "month");
|
|
70
|
+
if (abs >= 604800)
|
|
71
|
+
return rtf.format(Math.trunc(s / 604800), "week");
|
|
72
|
+
if (abs >= 86400)
|
|
73
|
+
return rtf.format(Math.trunc(s / 86400), "day");
|
|
74
|
+
if (abs >= 3600)
|
|
75
|
+
return rtf.format(Math.trunc(s / 3600), "hour");
|
|
76
|
+
if (abs >= 60)
|
|
77
|
+
return rtf.format(Math.trunc(s / 60), "minute");
|
|
78
|
+
return rtf.format(s, "second");
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return `${milliseconds}ms`;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
list(items) {
|
|
85
|
+
try {
|
|
86
|
+
return new Intl.ListFormat(this.#locale).format(items);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return items.join(", ");
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
unit(value, u) {
|
|
93
|
+
const unit = toIntlUnit(u);
|
|
94
|
+
if (unit === undefined)
|
|
95
|
+
throw fail("unit {0} not supported", u);
|
|
96
|
+
const options = { style: "unit", unit };
|
|
97
|
+
try {
|
|
98
|
+
return new Intl.NumberFormat(this.#locale, options).format(value);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return `${value} ${u}`;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
pluralRules() {
|
|
105
|
+
return new Intl.PluralRules(this.#locale);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=Formatter.js.map
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type Config from "#i18n/Config";
|
|
2
|
+
import Module from "#Module";
|
|
3
|
+
import type NextHandle from "#module/NextHandle";
|
|
4
|
+
import type NextRoute from "#module/NextRoute";
|
|
5
|
+
import type NextServe from "#module/NextServe";
|
|
6
|
+
import type RequestFacade from "#request/RequestFacade";
|
|
7
|
+
import type ServeApp from "#ServeApp";
|
|
8
|
+
export default class I18NModule extends Module {
|
|
9
|
+
#private;
|
|
10
|
+
name: string;
|
|
11
|
+
constructor(config: Config);
|
|
12
|
+
serve(app: ServeApp, next: NextServe): import("@rcompat/type/MaybePromise").default<ServeApp>;
|
|
13
|
+
handle(request: RequestFacade, next: NextHandle): import("@rcompat/type/MaybePromise").default<Response>;
|
|
14
|
+
route(request: RequestFacade, next: NextRoute): import("@rcompat/type/MaybePromise").default<import("../response/ResponseLike.js").default>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=Module.d.ts.map
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import AppError from "#AppError";
|
|
2
|
+
import bye from "#bye";
|
|
3
|
+
import cookie from "#cookie";
|
|
4
|
+
import COOKIE_NAME from "#i18n/constant/COOKIE_NAME";
|
|
5
|
+
import PERSIST_HEADER from "#i18n/constant/PERSIST_HEADER";
|
|
6
|
+
import log from "#log";
|
|
7
|
+
import Module from "#Module";
|
|
8
|
+
import Status from "@rcompat/http/Status";
|
|
9
|
+
function toLowerCase(string) {
|
|
10
|
+
return string.toLowerCase();
|
|
11
|
+
}
|
|
12
|
+
function pick(client, server) {
|
|
13
|
+
const lower = server.map(toLowerCase);
|
|
14
|
+
for (const raw of client.map(toLowerCase)) {
|
|
15
|
+
const locale = raw.trim();
|
|
16
|
+
if (!locale)
|
|
17
|
+
continue;
|
|
18
|
+
const exact = lower.indexOf(locale);
|
|
19
|
+
if (exact !== -1)
|
|
20
|
+
return server[exact];
|
|
21
|
+
const base = locale.split("-")[0];
|
|
22
|
+
const index = lower.findIndex(s => s === base || s.startsWith(`${base}-`));
|
|
23
|
+
if (index !== -1)
|
|
24
|
+
return server[index];
|
|
25
|
+
}
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
function fail(message, ...params) {
|
|
29
|
+
const error = new AppError(`{0} ${message}`, "[i18n]", ...params);
|
|
30
|
+
log.error(error);
|
|
31
|
+
bye();
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
export default class I18NModule extends Module {
|
|
35
|
+
name = "builtin/i18n";
|
|
36
|
+
#secure = false;
|
|
37
|
+
#defaultLocale;
|
|
38
|
+
#locales;
|
|
39
|
+
#persist = "cookie";
|
|
40
|
+
#currency;
|
|
41
|
+
constructor(config) {
|
|
42
|
+
super();
|
|
43
|
+
const defaultLocale = config.defaultLocale;
|
|
44
|
+
const locales = Object.keys(config.locales);
|
|
45
|
+
if (locales.length < 1)
|
|
46
|
+
fail("must have at least 1 locale");
|
|
47
|
+
if (defaultLocale === undefined)
|
|
48
|
+
fail("must have a default locale");
|
|
49
|
+
if (!locales.includes(defaultLocale))
|
|
50
|
+
fail("default locale not in locales");
|
|
51
|
+
this.#defaultLocale = defaultLocale;
|
|
52
|
+
this.#locales = locales;
|
|
53
|
+
this.#persist = config.persist ?? "cookie";
|
|
54
|
+
this.#currency = config.currency ?? "USD";
|
|
55
|
+
}
|
|
56
|
+
#configured(locale) {
|
|
57
|
+
return this.#locales.includes(locale);
|
|
58
|
+
}
|
|
59
|
+
serve(app, next) {
|
|
60
|
+
this.#secure = app.secure;
|
|
61
|
+
return next(app);
|
|
62
|
+
}
|
|
63
|
+
handle(request, next) {
|
|
64
|
+
const requested = request.headers.try(PERSIST_HEADER);
|
|
65
|
+
if (requested === undefined)
|
|
66
|
+
return next(request);
|
|
67
|
+
// only cookie-persistance is server-supported
|
|
68
|
+
if (this.#persist !== "cookie")
|
|
69
|
+
return new Response(null, { status: Status.NO_CONTENT });
|
|
70
|
+
// only accept configured locales
|
|
71
|
+
if (!this.#configured(requested))
|
|
72
|
+
return new Response(null, { status: Status.NO_CONTENT });
|
|
73
|
+
const header = cookie(COOKIE_NAME, requested, {
|
|
74
|
+
secure: this.#secure,
|
|
75
|
+
path: "/",
|
|
76
|
+
sameSite: "Strict",
|
|
77
|
+
});
|
|
78
|
+
return new Response(null, {
|
|
79
|
+
headers: { "set-cookie": header },
|
|
80
|
+
status: Status.NO_CONTENT,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
route(request, next) {
|
|
84
|
+
const server_locales = this.#locales;
|
|
85
|
+
const accept_language = request.headers.try("Accept-Language") ?? "";
|
|
86
|
+
const client_locales = accept_language
|
|
87
|
+
.split(",")
|
|
88
|
+
.map(s => s.split(";")[0].trim())
|
|
89
|
+
.filter(Boolean);
|
|
90
|
+
const mode = this.#persist;
|
|
91
|
+
const cookieLocale = mode === "cookie" ? request.cookies.try(COOKIE_NAME) : undefined;
|
|
92
|
+
const locale = cookieLocale ??
|
|
93
|
+
pick(client_locales, server_locales) ??
|
|
94
|
+
this.#defaultLocale;
|
|
95
|
+
return next({
|
|
96
|
+
...request,
|
|
97
|
+
context: {
|
|
98
|
+
...request.context,
|
|
99
|
+
i18n: {
|
|
100
|
+
currency: this.#currency,
|
|
101
|
+
mode,
|
|
102
|
+
locale,
|
|
103
|
+
locales: server_locales,
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=Module.js.map
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
type Normalize<S extends string> = Lowercase<S extends `${infer A}|${string}` ? A : S>;
|
|
2
|
+
type TypeOf<T extends string> = Normalize<T> extends "n" | "number" ? number : Normalize<T> extends "d" | "date" ? Date | number : Normalize<T> extends "c" | "currency" ? number : Normalize<T> extends "o" | "ordinal" ? number : Normalize<T> extends "a" | "ago" ? number : Normalize<T> extends "l" | "list" ? string[] : Normalize<T> extends `u(${string})` | `unit(${string})` ? number : string;
|
|
3
|
+
export type { TypeOf as default };
|
|
4
|
+
//# sourceMappingURL=TypeOf.d.ts.map
|