akanjs 0.0.1 → 2.0.0-beta.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/CODE_OF_CONDUCT.md +54 -0
- package/CONTRIBUTING.md +83 -0
- package/LICENSE +21 -0
- package/README.ko.md +244 -0
- package/README.md +237 -6
- package/base/base.ts +194 -0
- package/base/baseEnv.ts +162 -0
- package/base/index.ts +6 -0
- package/base/primitiveRegistry.ts +342 -0
- package/base/symbols.ts +11 -0
- package/base/types.ts +137 -0
- package/base/utils.ts +30 -0
- package/cli/application/application.command.ts +213 -0
- package/cli/application/application.interface.tsx +225 -0
- package/cli/application/application.runner.ts +359 -0
- package/cli/application/application.script.ts +244 -0
- package/cli/build.ts +25 -0
- package/cli/cloud/cloud.command.ts +48 -0
- package/cli/cloud/cloud.runner.ts +158 -0
- package/cli/cloud/cloud.script.ts +40 -0
- package/cli/guideline/guideline.command.ts +31 -0
- package/cli/guideline/guideline.prompt.ts +212 -0
- package/cli/guideline/guideline.runner.ts +53 -0
- package/cli/guideline/guideline.script.ts +33 -0
- package/cli/guidelines/___library/sharedUiStructureDescription.en.md +767 -0
- package/cli/guidelines/___library/utilUiStructureDescription.en.md +395 -0
- package/cli/guidelines/___lint/lintRuleDescription.en.md +64 -0
- package/cli/guidelines/___module/moduleStructureDescription.en.md +80 -0
- package/cli/guidelines/componentRule/componentRule.generate.json +131 -0
- package/cli/guidelines/componentRule/componentRule.instruction.md +637 -0
- package/cli/guidelines/cssRule/cssRule.generate.json +93 -0
- package/cli/guidelines/cssRule/cssRule.instruction.md +435 -0
- package/cli/guidelines/databaseModule/databaseModule.generate.json +51 -0
- package/cli/guidelines/databaseModule/databaseModule.instruction.md +612 -0
- package/cli/guidelines/docPageRule/docPageRule.generate.json +72 -0
- package/cli/guidelines/docPageRule/docPageRule.instruction.md +389 -0
- package/cli/guidelines/enumConstant/enumConstant.generate.json +24 -0
- package/cli/guidelines/enumConstant/enumConstant.instruction.md +232 -0
- package/cli/guidelines/framework/framework.generate.json +119 -0
- package/cli/guidelines/framework/framework.instruction.md +1110 -0
- package/cli/guidelines/howToUseStore/howToUseStore.generate.json +0 -0
- package/cli/guidelines/modelConstant/modelConstant.generate.json +128 -0
- package/cli/guidelines/modelConstant/modelConstant.instruction.md +506 -0
- package/cli/guidelines/modelDictionary/modelDictionary.generate.json +108 -0
- package/cli/guidelines/modelDictionary/modelDictionary.instruction.md +547 -0
- package/cli/guidelines/modelDocument/modelDocument.generate.json +129 -0
- package/cli/guidelines/modelDocument/modelDocument.instruction.md +536 -0
- package/cli/guidelines/modelService/modelService.generate.json +135 -0
- package/cli/guidelines/modelService/modelService.instruction.md +708 -0
- package/cli/guidelines/modelSignal/modelSignal.generate.json +201 -0
- package/cli/guidelines/modelSignal/modelSignal.instruction.md +552 -0
- package/cli/guidelines/modelStore/modelStore.generate.json +130 -0
- package/cli/guidelines/modelStore/modelStore.instruction.md +585 -0
- package/cli/guidelines/modelTemplate/modelTemplate.generate.json +104 -0
- package/cli/guidelines/modelTemplate/modelTemplate.instruction.md +604 -0
- package/cli/guidelines/modelUnit/modelUnit.generate.json +92 -0
- package/cli/guidelines/modelUnit/modelUnit.instruction.md +541 -0
- package/cli/guidelines/modelUtil/modelUtil.generate.json +93 -0
- package/cli/guidelines/modelUtil/modelUtil.instruction.md +752 -0
- package/cli/guidelines/modelView/modelView.generate.json +80 -0
- package/cli/guidelines/modelView/modelView.instruction.md +1005 -0
- package/cli/guidelines/modelZone/modelZone.generate.json +126 -0
- package/cli/guidelines/modelZone/modelZone.instruction.md +528 -0
- package/cli/guidelines/scalarConstant/scalarConstant.generate.json +106 -0
- package/cli/guidelines/scalarConstant/scalarConstant.instruction.md +442 -0
- package/cli/guidelines/scalarDictionary/scalarDictionary.generate.json +83 -0
- package/cli/guidelines/scalarDictionary/scalarDictionary.instruction.md +273 -0
- package/cli/guidelines/scalarModule/scalarModule.generate.json +35 -0
- package/cli/guidelines/scalarModule/scalarModule.instruction.md +81 -0
- package/cli/guidelines/sharedUiUsage/sharedUiUsage.generate.json +108 -0
- package/cli/guidelines/sharedUiUsage/sharedUiUsage.instruction.md +310 -0
- package/cli/guidelines/utilUiUsage/utilUiUsage.generate.json +140 -0
- package/cli/guidelines/utilUiUsage/utilUiUsage.instruction.md +339 -0
- package/cli/index.js +11399 -0
- package/cli/index.ts +24 -0
- package/cli/library/library.command.ts +28 -0
- package/cli/library/library.runner.ts +69 -0
- package/cli/library/library.script.ts +39 -0
- package/cli/module/module.command.ts +35 -0
- package/cli/module/module.prompt.ts +18 -0
- package/cli/module/module.request.ts +319 -0
- package/cli/module/module.runner.ts +76 -0
- package/cli/module/module.script.ts +161 -0
- package/cli/package/package.command.ts +32 -0
- package/cli/package/package.runner.ts +64 -0
- package/cli/package/package.script.ts +35 -0
- package/cli/page/page.command.ts +14 -0
- package/cli/page/page.runner.ts +14 -0
- package/cli/page/page.script.ts +12 -0
- package/cli/scalar/scalar.command.ts +21 -0
- package/cli/scalar/scalar.prompt.ts +131 -0
- package/cli/scalar/scalar.runner.ts +38 -0
- package/cli/scalar/scalar.script.ts +16 -0
- package/cli/templates/__scalar/__model__/__model__.constant.ts +15 -0
- package/cli/templates/__scalar/__model__/__model__.dictionary.ts +19 -0
- package/cli/templates/__scalar/__model__/__model__.document.ts +15 -0
- package/cli/templates/app/akan.config.ts +14 -0
- package/cli/templates/app/capacitor.config.ts.template +8 -0
- package/cli/templates/app/common/commonLogic.ts +12 -0
- package/cli/templates/app/common/index.ts +10 -0
- package/cli/templates/app/env/env.client.debug.ts.template +7 -0
- package/cli/templates/app/env/env.client.develop.ts.template +7 -0
- package/cli/templates/app/env/env.client.local.ts.template +7 -0
- package/cli/templates/app/env/env.client.main.ts.template +7 -0
- package/cli/templates/app/env/env.client.testing.ts.template +7 -0
- package/cli/templates/app/env/env.client.ts +21 -0
- package/cli/templates/app/env/env.client.type.ts +16 -0
- package/cli/templates/app/env/env.server.debug.ts.template +7 -0
- package/cli/templates/app/env/env.server.develop.ts.template +9 -0
- package/cli/templates/app/env/env.server.local.ts.template +14 -0
- package/cli/templates/app/env/env.server.main.ts.template +9 -0
- package/cli/templates/app/env/env.server.testing.ts.template +6 -0
- package/cli/templates/app/env/env.server.ts +20 -0
- package/cli/templates/app/lib/___appName__/__appName__.dictionary.ts +17 -0
- package/cli/templates/app/lib/___appName__/__appName__.service.ts +13 -0
- package/cli/templates/app/lib/___appName__/__appName__.signal.ts +17 -0
- package/cli/templates/app/lib/___appName__/__appName__.store.ts +15 -0
- package/cli/templates/app/lib/option.ts +17 -0
- package/cli/templates/app/main.ts +16 -0
- package/cli/templates/app/package.json.template +5 -0
- package/cli/templates/app/page/_index.tsx +172 -0
- package/cli/templates/app/page/_layout.tsx +32 -0
- package/cli/templates/app/page/styles.css.template +53 -0
- package/cli/templates/app/public/favicon.ico +0 -0
- package/cli/templates/app/public/logo.png +0 -0
- package/cli/templates/app/srvkit/backendLogic.ts +12 -0
- package/cli/templates/app/srvkit/index.ts +10 -0
- package/cli/templates/app/tsconfig.json.template +21 -0
- package/cli/templates/app/ui/UiComponent.ts +16 -0
- package/cli/templates/app/ui/index.ts +10 -0
- package/cli/templates/app/webkit/frontendLogic.ts +12 -0
- package/cli/templates/app/webkit/index.ts +10 -0
- package/cli/templates/client.ts +46 -0
- package/cli/templates/crudPages/[__model__Id]/edit/page.tsx +47 -0
- package/cli/templates/crudPages/[__model__Id]/page.tsx +52 -0
- package/cli/templates/crudPages/new/page.tsx +42 -0
- package/cli/templates/crudPages/page.tsx +43 -0
- package/cli/templates/crudSinglePage/page.tsx +37 -0
- package/cli/templates/env/_env.server.type.ts +16 -0
- package/cli/templates/facetIndex/index.ts +32 -0
- package/cli/templates/index.ts +10 -0
- package/cli/templates/lib/__lib/lib.constant.ts +38 -0
- package/cli/templates/lib/__lib/lib.dictionary.ts +33 -0
- package/cli/templates/lib/__lib/lib.document.ts +35 -0
- package/cli/templates/lib/__lib/lib.service.ts +33 -0
- package/cli/templates/lib/__lib/lib.signal.ts +34 -0
- package/cli/templates/lib/__lib/lib.store.ts +33 -0
- package/cli/templates/lib/cnst.ts +29 -0
- package/cli/templates/lib/db.ts +32 -0
- package/cli/templates/lib/dict.ts +49 -0
- package/cli/templates/lib/sig.ts +60 -0
- package/cli/templates/lib/srv.ts +34 -0
- package/cli/templates/lib/st.ts +31 -0
- package/cli/templates/lib/useClient.ts +19 -0
- package/cli/templates/lib/useServer.ts +7 -0
- package/cli/templates/libRoot/.gitignore.template +16 -0
- package/cli/templates/libRoot/akan.config.ts +12 -0
- package/cli/templates/libRoot/base/baseLogic.ts +10 -0
- package/cli/templates/libRoot/base/index.ts +8 -0
- package/cli/templates/libRoot/common/commonLogic.ts +10 -0
- package/cli/templates/libRoot/common/index.ts +8 -0
- package/cli/templates/libRoot/env/env.server.example.ts.template +6 -0
- package/cli/templates/libRoot/env/env.server.testing.ts.template +6 -0
- package/cli/templates/libRoot/lib/___libName__/__libName__.dictionary.ts +15 -0
- package/cli/templates/libRoot/lib/___libName__/__libName__.service.ts +11 -0
- package/cli/templates/libRoot/lib/___libName__/__libName__.store.ts +13 -0
- package/cli/templates/libRoot/lib/option.ts +17 -0
- package/cli/templates/libRoot/package.json.template +5 -0
- package/cli/templates/libRoot/srvkit/backendLogic.ts +10 -0
- package/cli/templates/libRoot/srvkit/index.ts +8 -0
- package/cli/templates/libRoot/tsconfig.json.template +11 -0
- package/cli/templates/libRoot/ui/index.ts +7 -0
- package/cli/templates/libRoot/webkit/frontendLogic.ts +10 -0
- package/cli/templates/libRoot/webkit/index.ts +8 -0
- package/cli/templates/localDev/docker-compose.yaml.template +37 -0
- package/cli/templates/module/__Model__.Template.tsx +36 -0
- package/cli/templates/module/__Model__.Unit.tsx +26 -0
- package/cli/templates/module/__Model__.Util.tsx +30 -0
- package/cli/templates/module/__Model__.View.tsx +29 -0
- package/cli/templates/module/__Model__.Zone.tsx +43 -0
- package/cli/templates/module/__model__.constant.ts +24 -0
- package/cli/templates/module/__model__.dictionary.ts +30 -0
- package/cli/templates/module/__model__.document.ts +23 -0
- package/cli/templates/module/__model__.service.ts +16 -0
- package/cli/templates/module/__model__.signal.ts +27 -0
- package/cli/templates/module/__model__.store.ts +19 -0
- package/cli/templates/module/index.tsx +44 -0
- package/cli/templates/moduleRoot/index.tsx +31 -0
- package/cli/templates/pkgRoot/tsconfig.json.template +10 -0
- package/cli/templates/server.ts +45 -0
- package/cli/templates/workspaceRoot/.env.template +14 -0
- package/cli/templates/workspaceRoot/.gitignore.template +130 -0
- package/cli/templates/workspaceRoot/.vscode/settings.json.template +23 -0
- package/cli/templates/workspaceRoot/biome.json.template +175 -0
- package/cli/templates/workspaceRoot/bunfig.toml +4 -0
- package/cli/templates/workspaceRoot/infra/app/Chart.yaml.template +6 -0
- package/cli/templates/workspaceRoot/infra/app/templates/frontend.yaml.template +182 -0
- package/cli/templates/workspaceRoot/infra/app/values/_common-values.yaml.template +183 -0
- package/cli/templates/workspaceRoot/package.json.template +7 -0
- package/cli/templates/workspaceRoot/tsconfig.json.template +26 -0
- package/cli/testHelpers.ts +171 -0
- package/cli/workspace/workspace.command.ts +59 -0
- package/cli/workspace/workspace.runner.ts +57 -0
- package/cli/workspace/workspace.script.ts +68 -0
- package/client/capacitor.ts +68 -0
- package/client/clientRuntime.ts +141 -0
- package/client/cookie.ts +121 -0
- package/client/createFont.ts +8 -0
- package/client/csrTypes.ts +259 -0
- package/client/decorators.ts +25 -0
- package/client/device.ts +147 -0
- package/client/fetch.ts +1 -0
- package/client/index.ts +15 -0
- package/client/locale.ts +4 -0
- package/client/makePageProto.tsx +178 -0
- package/client/router.ts +286 -0
- package/client/rscNavigation.ts +19 -0
- package/client/storage.ts +33 -0
- package/client/translator.ts +43 -0
- package/client/types.ts +228 -0
- package/client/useClient.ts +1 -0
- package/common/Logger.ts +177 -0
- package/common/applyMixins.ts +14 -0
- package/common/capitalize.ts +4 -0
- package/common/deepObjectify.ts +27 -0
- package/common/formatNumber.ts +14 -0
- package/common/formatPhone.ts +7 -0
- package/common/getAllPropertyDescriptors.ts +13 -0
- package/common/hmrPhase.ts +17 -0
- package/common/httpClient.ts +101 -0
- package/common/index.ts +50 -0
- package/common/isDayjs.ts +3 -0
- package/common/isEmail.ts +2 -0
- package/common/isPhoneNumber.ts +8 -0
- package/common/isQueryEqual.ts +23 -0
- package/common/isValidDate.ts +14 -0
- package/common/localeConfig.ts +41 -0
- package/common/lowerlize.ts +4 -0
- package/common/mergeVersion.ts +10 -0
- package/common/objectify.ts +7 -0
- package/common/pathGet.ts +13 -0
- package/common/pathSet.ts +16 -0
- package/common/randomPick.ts +1 -0
- package/common/randomPicks.ts +12 -0
- package/common/routeConvention.ts +203 -0
- package/common/sleep.ts +8 -0
- package/common/splitVersion.ts +11 -0
- package/common/subRoute.ts +34 -0
- package/common/types.ts +15 -0
- package/constant/constantRegistry.ts +334 -0
- package/constant/crystalize.ts +45 -0
- package/constant/deserialize.ts +70 -0
- package/constant/fieldInfo.ts +415 -0
- package/constant/getDefault.ts +18 -0
- package/constant/immerify.ts +16 -0
- package/constant/index.ts +10 -0
- package/constant/purify.ts +118 -0
- package/constant/serialize.ts +87 -0
- package/constant/types.ts +105 -0
- package/constant/via.ts +360 -0
- package/devkit/aiEditor.ts +299 -0
- package/devkit/akanApp/akanApp.host.ts +356 -0
- package/devkit/akanApp/index.ts +1 -0
- package/devkit/akanConfig/akanConfig.ts +332 -0
- package/devkit/akanConfig/index.ts +2 -0
- package/devkit/akanConfig/types.ts +187 -0
- package/devkit/applicationBuildReporter.ts +69 -0
- package/devkit/applicationBuildRunner.ts +302 -0
- package/devkit/applicationReleasePackager.ts +205 -0
- package/devkit/artifact/implicitRootLayout.ts +155 -0
- package/devkit/artifact/index.ts +1 -0
- package/devkit/artifact/routeSeedIndex.ts +128 -0
- package/devkit/auth.ts +41 -0
- package/devkit/builder.ts +164 -0
- package/devkit/capacitor.base.config.ts +74 -0
- package/devkit/capacitorApp.ts +385 -0
- package/devkit/commandDecorators/argMeta.ts +88 -0
- package/devkit/commandDecorators/command.ts +314 -0
- package/devkit/commandDecorators/commandBuilder.ts +188 -0
- package/devkit/commandDecorators/commandMeta.ts +6 -0
- package/devkit/commandDecorators/dependencyBuilder.ts +100 -0
- package/devkit/commandDecorators/helpFormatter.ts +217 -0
- package/devkit/commandDecorators/index.ts +8 -0
- package/devkit/commandDecorators/targetMeta.ts +31 -0
- package/devkit/commandDecorators/types.ts +10 -0
- package/devkit/constants.ts +25 -0
- package/devkit/createTunnel.ts +36 -0
- package/devkit/dependencyScanner.ts +339 -0
- package/devkit/executors.ts +1325 -0
- package/devkit/extractDeps.ts +85 -0
- package/devkit/fileEditor.ts +106 -0
- package/devkit/fileSys.ts +39 -0
- package/devkit/frontendBuild/allRoutesBuilder.ts +103 -0
- package/devkit/frontendBuild/clientBuildTypes.ts +114 -0
- package/devkit/frontendBuild/clientEntriesBundler.ts +300 -0
- package/devkit/frontendBuild/clientEntryDiscovery.ts +196 -0
- package/devkit/frontendBuild/csrArtifactBuilder.ts +237 -0
- package/devkit/frontendBuild/cssCompiler.ts +279 -0
- package/devkit/frontendBuild/cssImportResolver.ts +116 -0
- package/devkit/frontendBuild/fontOptimizer.ts +427 -0
- package/devkit/frontendBuild/hmrChangeClassifier.ts +28 -0
- package/devkit/frontendBuild/hmrWatcher.ts +101 -0
- package/devkit/frontendBuild/index.ts +18 -0
- package/devkit/frontendBuild/pagesBundleBuilder.ts +137 -0
- package/devkit/frontendBuild/pagesEntrySourceGenerator.ts +37 -0
- package/devkit/frontendBuild/precompressArtifacts.ts +59 -0
- package/devkit/frontendBuild/routeClientBuilder.ts +290 -0
- package/devkit/frontendBuild/routesManifestArtifactSerializer.ts +62 -0
- package/devkit/frontendBuild/ssrBaseArtifactBuilder.ts +139 -0
- package/devkit/frontendBuild/vendorSpecifiers.ts +16 -0
- package/devkit/frontendBuild/watchRootResolver.ts +28 -0
- package/devkit/getCredentials.ts +19 -0
- package/devkit/getDirname.ts +3 -0
- package/devkit/getModelFileData.ts +59 -0
- package/devkit/getRelatedCnsts.ts +300 -0
- package/devkit/guideline.ts +19 -0
- package/devkit/incrementalBuilder/incrementalBuilder.host.ts +78 -0
- package/devkit/incrementalBuilder/incrementalBuilder.proc.ts +330 -0
- package/devkit/incrementalBuilder/index.ts +1 -0
- package/devkit/index.ts +36 -0
- package/devkit/lint/no-import-client-functions.grit +32 -0
- package/devkit/lint/no-import-external-library.grit +21 -0
- package/devkit/lint/no-js-private-class-method.grit +42 -0
- package/devkit/lint/no-use-client-in-server.grit +7 -0
- package/devkit/lint/non-scalar-props-restricted.grit +13 -0
- package/devkit/linter.ts +248 -0
- package/devkit/mobile/index.ts +1 -0
- package/devkit/mobile/mobileTarget.ts +47 -0
- package/devkit/prompter.ts +71 -0
- package/devkit/scanInfo.ts +605 -0
- package/devkit/selectModel.ts +11 -0
- package/devkit/spinner.ts +54 -0
- package/devkit/sshTunnel.ts +151 -0
- package/devkit/streamAi.ts +45 -0
- package/devkit/transforms/barrelAnalyzer.ts +249 -0
- package/devkit/transforms/barrelImportsPlugin.ts +451 -0
- package/devkit/transforms/externalizeFrameworkPlugin.ts +159 -0
- package/devkit/transforms/index.ts +5 -0
- package/devkit/transforms/rscUseClientTransform.ts +52 -0
- package/devkit/transforms/useClientBundlePlugin.ts +47 -0
- package/devkit/typeChecker.ts +260 -0
- package/devkit/types.ts +42 -0
- package/devkit/ui/MultiScrollList.tsx +228 -0
- package/devkit/ui/ScrollList.tsx +106 -0
- package/devkit/ui/index.ts +2 -0
- package/devkit/uploadRelease.ts +95 -0
- package/devkit/useStdoutDimensions.ts +20 -0
- package/dictionary/base.dictionary.ts +91 -0
- package/dictionary/dictInfo.ts +1079 -0
- package/dictionary/dictionary.ts +10 -0
- package/dictionary/index.ts +12 -0
- package/dictionary/locale.ts +230 -0
- package/dictionary/trans.ts +196 -0
- package/document/by.ts +39 -0
- package/document/dataLoader.ts +91 -0
- package/document/database.ts +168 -0
- package/document/databaseRegistry.ts +113 -0
- package/document/documentQuery.ts +143 -0
- package/document/documentSchema.ts +91 -0
- package/document/filterMeta.ts +210 -0
- package/document/index.ts +11 -0
- package/document/into.ts +169 -0
- package/document/loaderInfo.ts +50 -0
- package/document/schema.ts +24 -0
- package/document/types.ts +41 -0
- package/fetch/client/fetchClient.ts +600 -0
- package/fetch/client/httpClient.ts +157 -0
- package/fetch/client/index.ts +3 -0
- package/fetch/client/wsClient.ts +246 -0
- package/fetch/fetchType/appliedReturn.type.ts +108 -0
- package/fetch/fetchType/buildFetch.type.ts +24 -0
- package/fetch/fetchType/clientSignal.type.ts +22 -0
- package/fetch/fetchType/endpointFetch.type.ts +56 -0
- package/fetch/fetchType/index.ts +5 -0
- package/fetch/fetchType/sliceFetch.type.ts +173 -0
- package/fetch/index.ts +4 -0
- package/fetch/requestStorage.ts +127 -0
- package/fetch/serializer/fetch.serializer.ts +131 -0
- package/fetch/serializer/index.ts +1 -0
- package/fetch/types.ts +28 -0
- package/package.json +202 -5
- package/server/SSR_MEMORY_DIAGNOSIS.md +107 -0
- package/server/akanApp.ts +855 -0
- package/server/akanLib.ts +43 -0
- package/server/akanOption.ts +42 -0
- package/server/akanServer.ts +369 -0
- package/server/artifact/builderRpc.ts +124 -0
- package/server/artifact/index.ts +6 -0
- package/server/artifact/ipcTypes.ts +46 -0
- package/server/artifact/manifestTypes.ts +19 -0
- package/server/artifact/routeClientCache.ts +224 -0
- package/server/artifact/routeSeedIndexStore.ts +89 -0
- package/server/artifact/routesManifestStore.ts +120 -0
- package/server/decorators.ts +95 -0
- package/server/di/diLifecycle.ts +520 -0
- package/server/di/index.ts +4 -0
- package/server/di/predefinedAdaptor.ts +77 -0
- package/server/di/resolveAdaptorHierarchy.ts +82 -0
- package/server/di/resolveHierarchy.ts +89 -0
- package/server/di/resolveServiceHierarchy.ts +47 -0
- package/server/di/utils.ts +40 -0
- package/server/hmr/changeBatch.ts +14 -0
- package/server/hmr/clientScript.ts +310 -0
- package/server/hmr/devHmrController.ts +395 -0
- package/server/hmr/index.ts +4 -0
- package/server/hmr/wsHub.ts +56 -0
- package/server/imageOptimizer.ts +427 -0
- package/server/imageOptimizerError.ts +8 -0
- package/server/index.ts +14 -0
- package/server/lifecycle/shutdownManager.ts +52 -0
- package/server/logging/rotatingLogWriter.ts +190 -0
- package/server/processMetricsCollector.ts +78 -0
- package/server/proxy/akanResponse.ts +16 -0
- package/server/proxy/bunRequestFields.ts +12 -0
- package/server/proxy/hostBasePathWebProxy.ts +112 -0
- package/server/proxy/index.ts +15 -0
- package/server/proxy/localeWebProxy.ts +71 -0
- package/server/proxy/types.ts +41 -0
- package/server/proxy/webProxyRunner.ts +90 -0
- package/server/resolver/database.resolver.ts +340 -0
- package/server/resolver/index.ts +3 -0
- package/server/resolver/resolver.contract.fixture.ts +222 -0
- package/server/resolver/service.resolver.ts +176 -0
- package/server/resolver/signal.resolver.ts +386 -0
- package/server/robots.ts +32 -0
- package/server/routeElementComposer.tsx +91 -0
- package/server/routeTreeBuilder.ts +279 -0
- package/server/routing/apiRouter.ts +226 -0
- package/server/rscClient.tsx +140 -0
- package/server/rscWorker.tsx +625 -0
- package/server/rscWorkerHost.ts +616 -0
- package/server/sitemap.ts +90 -0
- package/server/ssrFromRscRenderer.tsx +285 -0
- package/server/ssrTypes.ts +48 -0
- package/server/types/react-server-dom-webpack.d.ts +91 -0
- package/server/types.tsx +109 -0
- package/server/vendor/akanjs-base.ts +1 -0
- package/server/vendor/akanjs-common.ts +1 -0
- package/server/vendor/akanjs-constant.ts +1 -0
- package/server/vendor/akanjs-store.ts +1 -0
- package/server/vendor/react-dom-client.ts +5 -0
- package/server/vendor/react-dom.ts +21 -0
- package/server/vendor/react-jsx-dev-runtime.ts +5 -0
- package/server/vendor/react-jsx-runtime.ts +5 -0
- package/server/vendor/react-refresh-runtime.ts +6 -0
- package/server/vendor/react-server-dom-webpack-client-browser.ts +12 -0
- package/server/vendor/react.ts +51 -0
- package/server/vendor/scheduler.ts +23 -0
- package/server/webRouter.ts +712 -0
- package/service/adapt.ts +47 -0
- package/service/base.service.ts +18 -0
- package/service/index.ts +10 -0
- package/service/injectInfo.ts +393 -0
- package/service/ipcTypes.ts +127 -0
- package/service/predefinedAdaptor/cache.adaptor.ts +105 -0
- package/service/predefinedAdaptor/compress.adaptor.ts +357 -0
- package/service/predefinedAdaptor/database.adaptor.ts +1310 -0
- package/service/predefinedAdaptor/index.ts +13 -0
- package/service/predefinedAdaptor/logging.adaptor.ts +36 -0
- package/service/predefinedAdaptor/queue.adaptor.ts +42 -0
- package/service/predefinedAdaptor/role.adaptor.ts +18 -0
- package/service/predefinedAdaptor/schedule.adaptor.ts +188 -0
- package/service/predefinedAdaptor/solidCache.adaptor.ts +143 -0
- package/service/predefinedAdaptor/solidPubsub.adaptor.ts +98 -0
- package/service/predefinedAdaptor/solidQueue.adaptor.ts +203 -0
- package/service/predefinedAdaptor/solidSqlite.ts +85 -0
- package/service/predefinedAdaptor/sqlitePath.ts +20 -0
- package/service/predefinedAdaptor/storage.adaptor.ts +121 -0
- package/service/predefinedAdaptor/websocket.adaptor.ts +313 -0
- package/service/serve.ts +223 -0
- package/service/serviceModule.ts +221 -0
- package/service/serviceRegistry.ts +26 -0
- package/service/types.ts +113 -0
- package/signal/base.signal.ts +46 -0
- package/signal/endpoint.ts +122 -0
- package/signal/endpointInfo.ts +374 -0
- package/signal/exception.ts +50 -0
- package/signal/guard.ts +18 -0
- package/signal/guards.ts +16 -0
- package/signal/index.ts +18 -0
- package/signal/intercept.ts +39 -0
- package/signal/internal.ts +56 -0
- package/signal/internalArg.ts +38 -0
- package/signal/internalInfo.ts +208 -0
- package/signal/middleware.ts +108 -0
- package/signal/serializer/fetch.serializer.ts +128 -0
- package/signal/serializer/index.ts +1 -0
- package/signal/serverSignal.ts +114 -0
- package/signal/signalContext.ts +446 -0
- package/signal/signalRegistry.ts +82 -0
- package/signal/slice.ts +158 -0
- package/signal/sliceInfo.ts +254 -0
- package/signal/types.ts +131 -0
- package/store/action.ts +1067 -0
- package/store/baseSt.ts +81 -0
- package/store/hooks.ts +2 -0
- package/store/index.ts +8 -0
- package/store/rootStore.ts +26 -0
- package/store/state.ts +226 -0
- package/store/stateBuilder.ts +429 -0
- package/store/stateInfo.ts +66 -0
- package/store/store.ts +194 -0
- package/store/storeInstance.ts +382 -0
- package/store/storeRegistry.ts +84 -0
- package/store/types.ts +69 -0
- package/store/withSelector.ts +62 -0
- package/test/index.ts +16 -0
- package/test/playwright.config.base.ts +48 -0
- package/test/playwright.pageAgent.ts +41 -0
- package/test/sample.ts +19 -0
- package/test/sampleOf.ts +70 -0
- package/test/signalTest.preload.ts +10 -0
- package/test/signalTestRuntime.ts +126 -0
- package/test/testServer.ts +187 -0
- package/ui/BottomSheet.tsx +103 -0
- package/ui/Button.tsx +70 -0
- package/ui/ClientSide.tsx +11 -0
- package/ui/Clipboard.tsx +49 -0
- package/ui/Constant/Doc.tsx +696 -0
- package/ui/Constant/Mermaid.tsx +149 -0
- package/ui/Constant/index.ts +6 -0
- package/ui/Constant/schemaDoc.ts +324 -0
- package/ui/Copy.tsx +27 -0
- package/ui/CsrImage.tsx +38 -0
- package/ui/Data/CardList.tsx +141 -0
- package/ui/Data/Dashboard.tsx +72 -0
- package/ui/Data/Insight.tsx +35 -0
- package/ui/Data/Item.tsx +285 -0
- package/ui/Data/ListContainer.tsx +320 -0
- package/ui/Data/Pagination.tsx +54 -0
- package/ui/Data/QueryMaker.tsx +21 -0
- package/ui/Data/TableList.tsx +161 -0
- package/ui/Data/index.ts +11 -0
- package/ui/Data/index_.tsx +11 -0
- package/ui/DatePicker.tsx +184 -0
- package/ui/Dialog/Action.tsx +15 -0
- package/ui/Dialog/Close.tsx +22 -0
- package/ui/Dialog/Content.tsx +11 -0
- package/ui/Dialog/Modal.tsx +137 -0
- package/ui/Dialog/Provider.tsx +33 -0
- package/ui/Dialog/Title.tsx +15 -0
- package/ui/Dialog/Trigger.tsx +22 -0
- package/ui/Dialog/context.ts +20 -0
- package/ui/Dialog/index.tsx +15 -0
- package/ui/DragAction.tsx +129 -0
- package/ui/DraggableList.tsx +230 -0
- package/ui/Dropdown.tsx +51 -0
- package/ui/Empty.tsx +32 -0
- package/ui/Field.tsx +1556 -0
- package/ui/FontFace.tsx +26 -0
- package/ui/Image.tsx +185 -0
- package/ui/InfiniteScroll.tsx +67 -0
- package/ui/Input.tsx +636 -0
- package/ui/KeyboardAvoiding.tsx +62 -0
- package/ui/Layout/BottomAction.tsx +15 -0
- package/ui/Layout/BottomInset.tsx +42 -0
- package/ui/Layout/BottomTab.tsx +71 -0
- package/ui/Layout/Header.tsx +38 -0
- package/ui/Layout/LeftSider.tsx +34 -0
- package/ui/Layout/Navbar.tsx +46 -0
- package/ui/Layout/RightSider.tsx +41 -0
- package/ui/Layout/Sider.tsx +69 -0
- package/ui/Layout/Template.tsx +11 -0
- package/ui/Layout/TopLeftAction.tsx +28 -0
- package/ui/Layout/Unit.tsx +19 -0
- package/ui/Layout/View.tsx +12 -0
- package/ui/Layout/Zone.tsx +10 -0
- package/ui/Layout/index.ts +27 -0
- package/ui/Link/Back.tsx +15 -0
- package/ui/Link/Close.tsx +20 -0
- package/ui/Link/CsrLink.tsx +41 -0
- package/ui/Link/Lang.tsx +16 -0
- package/ui/Link/SsrLink.tsx +68 -0
- package/ui/Link/index.tsx +32 -0
- package/ui/Link/types.ts +47 -0
- package/ui/Load/Edit.tsx +19 -0
- package/ui/Load/Edit_Client.tsx +120 -0
- package/ui/Load/Page.tsx +40 -0
- package/ui/Load/PageCSR.tsx +39 -0
- package/ui/Load/Pagination.tsx +89 -0
- package/ui/Load/Units.tsx +330 -0
- package/ui/Load/View.tsx +115 -0
- package/ui/Load/index.ts +11 -0
- package/ui/Load/index_.tsx +6 -0
- package/ui/Loading/Area.tsx +10 -0
- package/ui/Loading/Button.tsx +17 -0
- package/ui/Loading/Input.tsx +17 -0
- package/ui/Loading/ProgressBar.tsx +14 -0
- package/ui/Loading/Skeleton.tsx +22 -0
- package/ui/Loading/Spin.tsx +22 -0
- package/ui/Loading/index.tsx +8 -0
- package/ui/Menu.tsx +273 -0
- package/ui/Modal.tsx +87 -0
- package/ui/Model/AdminPanel.tsx +51 -0
- package/ui/Model/Edit.tsx +46 -0
- package/ui/Model/EditModal.tsx +301 -0
- package/ui/Model/EditWrapper.tsx +48 -0
- package/ui/Model/LoadInit.tsx +11 -0
- package/ui/Model/New.tsx +46 -0
- package/ui/Model/NewWrapper.tsx +20 -0
- package/ui/Model/NewWrapper_Client.tsx +57 -0
- package/ui/Model/Remove.tsx +75 -0
- package/ui/Model/RemoveWrapper.tsx +38 -0
- package/ui/Model/SureToRemove.tsx +108 -0
- package/ui/Model/View.tsx +65 -0
- package/ui/Model/ViewEditModal.tsx +125 -0
- package/ui/Model/ViewModal.tsx +71 -0
- package/ui/Model/ViewWrapper.tsx +38 -0
- package/ui/Model/index.ts +33 -0
- package/ui/Model/index_.tsx +16 -0
- package/ui/More.tsx +56 -0
- package/ui/ObjectId.tsx +29 -0
- package/ui/Pagination.tsx +120 -0
- package/ui/Popconfirm.tsx +135 -0
- package/ui/Portal.tsx +10 -0
- package/ui/Radio.tsx +53 -0
- package/ui/RecentTime.tsx +123 -0
- package/ui/Refresh.tsx +24 -0
- package/ui/ScreenNavigator.tsx +129 -0
- package/ui/Select.tsx +322 -0
- package/ui/Signal/Arg.tsx +352 -0
- package/ui/Signal/Doc.tsx +231 -0
- package/ui/Signal/Listener.tsx +74 -0
- package/ui/Signal/Message.tsx +267 -0
- package/ui/Signal/Object.tsx +131 -0
- package/ui/Signal/PubSub.tsx +247 -0
- package/ui/Signal/Request.tsx +30 -0
- package/ui/Signal/Response.tsx +76 -0
- package/ui/Signal/RestApi.tsx +390 -0
- package/ui/Signal/WebSocket.tsx +47 -0
- package/ui/Signal/index.ts +10 -0
- package/ui/Signal/makeExample.ts +75 -0
- package/ui/System/CSR.tsx +420 -0
- package/ui/System/Client.tsx +296 -0
- package/ui/System/Common.tsx +83 -0
- package/ui/System/DevModeToggle.tsx +21 -0
- package/ui/System/Gtag.tsx +69 -0
- package/ui/System/Messages.tsx +175 -0
- package/ui/System/Reconnect.tsx +156 -0
- package/ui/System/Root.tsx +10 -0
- package/ui/System/SSR.tsx +163 -0
- package/ui/System/SelectLanguage.tsx +47 -0
- package/ui/System/ThemeToggle.tsx +98 -0
- package/ui/System/index.tsx +23 -0
- package/ui/Tab/Menu.tsx +56 -0
- package/ui/Tab/Menus.tsx +10 -0
- package/ui/Tab/Panel.tsx +25 -0
- package/ui/Tab/Provider.tsx +25 -0
- package/ui/Tab/context.ts +16 -0
- package/ui/Tab/index.tsx +11 -0
- package/ui/Table.tsx +131 -0
- package/ui/ToggleSelect.tsx +144 -0
- package/ui/Unauthorized.tsx +29 -0
- package/ui/animated.tsx +8 -0
- package/ui/fontCss.ts +86 -0
- package/ui/index.ts +44 -0
- package/ui/styles.css +617 -0
- package/webkit/bootCsr.tsx +275 -0
- package/webkit/createRobotPage.ts +15 -0
- package/webkit/createSitemapPage.ts +4 -0
- package/webkit/index.ts +19 -0
- package/webkit/lazy.tsx +37 -0
- package/webkit/types.ts +7 -0
- package/webkit/useCamera.tsx +99 -0
- package/webkit/useCodepush.tsx +99 -0
- package/webkit/useContact.tsx +48 -0
- package/webkit/useCsrValues.ts +661 -0
- package/webkit/useDebounce.ts +24 -0
- package/webkit/useFetch.ts +48 -0
- package/webkit/useGeoLocation.tsx +24 -0
- package/webkit/useHistory.ts +76 -0
- package/webkit/useInterval.ts +21 -0
- package/webkit/useLocation.ts +69 -0
- package/webkit/usePurchase.tsx +156 -0
- package/webkit/usePushNoti.tsx +48 -0
- package/webkit/useThrottle.ts +22 -0
- package/src/index.js +0 -2
- package/src/index.js.map +0 -1
- package/src/lib/akan2.js +0 -4
- package/src/lib/akan2.js.map +0 -1
- package/src/run.js +0 -4
- package/src/run.js.map +0 -1
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type Any,
|
|
3
|
+
arraiedModel,
|
|
4
|
+
type Cls,
|
|
5
|
+
type Dayjs,
|
|
6
|
+
type EnumInstance,
|
|
7
|
+
type Float,
|
|
8
|
+
getNonArrayModel,
|
|
9
|
+
ID,
|
|
10
|
+
Int,
|
|
11
|
+
isEnum,
|
|
12
|
+
PRIMITIVE_CLIENT_VALUE,
|
|
13
|
+
PRIMITIVE_SERVER_VALUE,
|
|
14
|
+
PrimitiveRegistry,
|
|
15
|
+
type PrimitiveScalar,
|
|
16
|
+
type SingleValue,
|
|
17
|
+
type UnCls,
|
|
18
|
+
} from "akanjs/base";
|
|
19
|
+
import { ConstantRegistry } from "./constantRegistry";
|
|
20
|
+
import type { ConstantCls } from "./via";
|
|
21
|
+
|
|
22
|
+
export type ParamFieldType =
|
|
23
|
+
| (typeof PrimitiveScalar & {
|
|
24
|
+
[PRIMITIVE_CLIENT_VALUE]: string | number | boolean | Dayjs;
|
|
25
|
+
})
|
|
26
|
+
| EnumInstance<string, any>;
|
|
27
|
+
|
|
28
|
+
export type ConstantFieldType = typeof PrimitiveScalar | Cls | MapConstructor | EnumInstance<string, number>;
|
|
29
|
+
export type ConstantFieldTypeInput =
|
|
30
|
+
| ConstantFieldType
|
|
31
|
+
| ConstantFieldType[]
|
|
32
|
+
| ConstantFieldType[][]
|
|
33
|
+
| ConstantFieldType[][][];
|
|
34
|
+
|
|
35
|
+
export type FieldToValue<Field, MapValue = any> = Field extends null
|
|
36
|
+
? FieldToValue<Exclude<Field, null>> | null
|
|
37
|
+
: Field extends MapConstructor
|
|
38
|
+
? Map<string, FieldToValue<MapValue>>
|
|
39
|
+
: Field extends (infer F)[]
|
|
40
|
+
? FieldToValue<F>[]
|
|
41
|
+
: Field extends { [PRIMITIVE_SERVER_VALUE]: infer V }
|
|
42
|
+
? V
|
|
43
|
+
: Field extends EnumInstance<string, infer V>
|
|
44
|
+
? V
|
|
45
|
+
: Field extends Cls
|
|
46
|
+
? UnCls<Field>
|
|
47
|
+
: never;
|
|
48
|
+
export interface FieldInfoObject {
|
|
49
|
+
[key: string]: FieldInfo<any, ConstantFieldTypeInput | null, any>;
|
|
50
|
+
}
|
|
51
|
+
export type ExtractFieldInfoObject<Obj extends FieldInfoObject> = {
|
|
52
|
+
[K in keyof Obj]: Obj[K] extends FieldInfo<any, infer FieldValue, infer ExplicitType, infer MapValue>
|
|
53
|
+
? unknown extends ExplicitType
|
|
54
|
+
? FieldToValue<FieldValue, MapValue>
|
|
55
|
+
: ExplicitType
|
|
56
|
+
: never;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
export interface ConstantFieldProps<
|
|
60
|
+
FieldType extends "property" | "hidden" | "resolve" = "property" | "hidden" | "resolve",
|
|
61
|
+
FieldValue = any,
|
|
62
|
+
MapValue = any,
|
|
63
|
+
Metadata = { [key: string]: any },
|
|
64
|
+
> {
|
|
65
|
+
nullable?: boolean;
|
|
66
|
+
ref?: string;
|
|
67
|
+
refPath?: string;
|
|
68
|
+
refType?: "child" | "parent" | "relation";
|
|
69
|
+
default?: FieldValue | ((doc: { id: string }) => FieldValue);
|
|
70
|
+
type?: FieldPreset;
|
|
71
|
+
fieldType?: FieldType;
|
|
72
|
+
immutable?: boolean;
|
|
73
|
+
min?: number;
|
|
74
|
+
max?: number;
|
|
75
|
+
enum?: EnumInstance;
|
|
76
|
+
select?: boolean;
|
|
77
|
+
minlength?: number;
|
|
78
|
+
maxlength?: number;
|
|
79
|
+
accumulate?: any;
|
|
80
|
+
example?: FieldValue;
|
|
81
|
+
of?: MapValue;
|
|
82
|
+
validate?: (value: FieldValue, model: any) => boolean;
|
|
83
|
+
text?: "search" | "filter";
|
|
84
|
+
meta?: Metadata;
|
|
85
|
+
}
|
|
86
|
+
export const fieldPresets = ["email", "password", "url"] as const;
|
|
87
|
+
export type FieldPreset = (typeof fieldPresets)[number];
|
|
88
|
+
|
|
89
|
+
class FieldInfo<
|
|
90
|
+
FieldType extends "property" | "hidden" | "resolve" = any,
|
|
91
|
+
Value extends ConstantFieldTypeInput | null = null,
|
|
92
|
+
ExplicitType = unknown,
|
|
93
|
+
MapValue = Value extends MapConstructor ? typeof PrimitiveScalar : never,
|
|
94
|
+
> {
|
|
95
|
+
readonly value: Value;
|
|
96
|
+
readonly type: ConstantFieldTypeInput;
|
|
97
|
+
readonly option: ConstantFieldProps;
|
|
98
|
+
declare explicitType: ExplicitType;
|
|
99
|
+
constructor(value: Value, option: ConstantFieldProps<FieldType, any, MapValue>) {
|
|
100
|
+
this.value = value;
|
|
101
|
+
const [singleValue, arrDepth] = getNonArrayModel(value as Cls);
|
|
102
|
+
const isEnumValue = isEnum(singleValue);
|
|
103
|
+
const valueType = isEnumValue ? arraiedModel((singleValue as EnumInstance).type, arrDepth) : value;
|
|
104
|
+
this.type = valueType as ConstantFieldTypeInput;
|
|
105
|
+
this.option = {
|
|
106
|
+
...option,
|
|
107
|
+
...(isEnumValue ? { enum: singleValue } : {}),
|
|
108
|
+
} as any;
|
|
109
|
+
}
|
|
110
|
+
optional() {
|
|
111
|
+
this.option.nullable = true;
|
|
112
|
+
return this as FieldInfo<FieldType, Value | null, ExplicitType | null, MapValue>;
|
|
113
|
+
}
|
|
114
|
+
meta(meta: ConstantFieldProps["meta"]) {
|
|
115
|
+
this.option.meta = meta;
|
|
116
|
+
return this;
|
|
117
|
+
}
|
|
118
|
+
toField() {
|
|
119
|
+
return ConstantField.fromFieldInfo(this);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
interface ConstantFieldBuildProps<
|
|
124
|
+
FieldType extends "property" | "hidden" | "resolve" = any,
|
|
125
|
+
FieldValue = any,
|
|
126
|
+
MapValue = any,
|
|
127
|
+
Metadata = any,
|
|
128
|
+
Nullable extends boolean = boolean,
|
|
129
|
+
> {
|
|
130
|
+
nullable: Nullable;
|
|
131
|
+
ref?: string;
|
|
132
|
+
refPath?: string;
|
|
133
|
+
refType?: "child" | "parent" | "relation";
|
|
134
|
+
default: FieldValue | ((doc: { id: string }) => FieldValue);
|
|
135
|
+
type?: FieldPreset;
|
|
136
|
+
fieldType: FieldType;
|
|
137
|
+
immutable: boolean;
|
|
138
|
+
min?: number;
|
|
139
|
+
max?: number;
|
|
140
|
+
enum?: EnumInstance;
|
|
141
|
+
select: boolean;
|
|
142
|
+
minlength?: number;
|
|
143
|
+
maxlength?: number;
|
|
144
|
+
accumulate?: any;
|
|
145
|
+
example?: FieldValue;
|
|
146
|
+
of?: MapValue;
|
|
147
|
+
validate?: (value: FieldValue, model: any) => boolean;
|
|
148
|
+
text?: "search" | "filter";
|
|
149
|
+
modelRef: ConstantCls;
|
|
150
|
+
arrDepth: number;
|
|
151
|
+
optArrDepth: number;
|
|
152
|
+
meta: Metadata;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export interface FieldProps extends ConstantFieldBuildProps {
|
|
156
|
+
isClass: boolean;
|
|
157
|
+
isScalar: boolean;
|
|
158
|
+
isArray: boolean;
|
|
159
|
+
isMap: boolean;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
export type FieldInfoObjectToFieldObject<Obj extends FieldInfoObject> = {
|
|
163
|
+
[K in keyof Obj]: Obj[K] extends FieldInfo<infer FieldType, infer Value, infer ExplicitType, infer MapValue>
|
|
164
|
+
? ConstantField<
|
|
165
|
+
FieldType,
|
|
166
|
+
Value,
|
|
167
|
+
unknown extends ExplicitType ? FieldToValue<Value, MapValue> : ExplicitType,
|
|
168
|
+
MapValue
|
|
169
|
+
>
|
|
170
|
+
: never;
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
/** Runtime metadata for a single Akan constant field. */
|
|
174
|
+
export class ConstantField<
|
|
175
|
+
FieldType extends "property" | "hidden" | "resolve" = "property" | "hidden" | "resolve",
|
|
176
|
+
Value extends ConstantFieldTypeInput | null = any,
|
|
177
|
+
FieldValue = any,
|
|
178
|
+
MapValue = any,
|
|
179
|
+
Nullable extends boolean = false,
|
|
180
|
+
Metadata = { [key: string]: any },
|
|
181
|
+
> implements ConstantFieldBuildProps<FieldType, FieldValue, MapValue, Metadata>
|
|
182
|
+
{
|
|
183
|
+
static getBaseModelField(): FieldObject {
|
|
184
|
+
return {
|
|
185
|
+
id: field(ID).toField(),
|
|
186
|
+
createdAt: field(Date).toField(),
|
|
187
|
+
updatedAt: field(Date).toField(),
|
|
188
|
+
removedAt: field(Date).optional().toField(),
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
static getBaseInsightField(): FieldObject {
|
|
192
|
+
return {
|
|
193
|
+
count: field(Int, { default: 0, accumulate: { $sum: 1 } }).toField(),
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
readonly nullable: Nullable;
|
|
197
|
+
readonly ref?: string;
|
|
198
|
+
readonly refPath?: string;
|
|
199
|
+
readonly refType?: "child" | "parent" | "relation";
|
|
200
|
+
readonly default: FieldValue | ((doc: { id: string }) => FieldValue);
|
|
201
|
+
readonly type?: FieldPreset;
|
|
202
|
+
readonly fieldType: FieldType;
|
|
203
|
+
readonly immutable: boolean;
|
|
204
|
+
readonly min?: number;
|
|
205
|
+
readonly max?: number;
|
|
206
|
+
readonly enum?: EnumInstance;
|
|
207
|
+
readonly select: boolean;
|
|
208
|
+
readonly minlength?: number;
|
|
209
|
+
readonly maxlength?: number;
|
|
210
|
+
readonly accumulate?: any;
|
|
211
|
+
readonly example?: FieldValue;
|
|
212
|
+
readonly of?: MapValue;
|
|
213
|
+
readonly validate?: (value: FieldValue, model: any) => boolean;
|
|
214
|
+
readonly text?: "search" | "filter";
|
|
215
|
+
readonly modelRef: ConstantCls;
|
|
216
|
+
readonly arrDepth: number;
|
|
217
|
+
readonly optArrDepth: number;
|
|
218
|
+
readonly meta: Metadata;
|
|
219
|
+
|
|
220
|
+
constructor(props: ConstantFieldBuildProps<FieldType, FieldValue, MapValue, Metadata>) {
|
|
221
|
+
this.nullable = props.nullable as unknown as Nullable;
|
|
222
|
+
this.ref = props.ref;
|
|
223
|
+
this.refPath = props.refPath;
|
|
224
|
+
this.refType = props.refType;
|
|
225
|
+
this.default = props.default;
|
|
226
|
+
this.type = props.type;
|
|
227
|
+
this.fieldType = props.fieldType;
|
|
228
|
+
this.immutable = props.immutable;
|
|
229
|
+
this.min = props.min;
|
|
230
|
+
this.max = props.max;
|
|
231
|
+
this.enum = props.enum;
|
|
232
|
+
this.select = props.select;
|
|
233
|
+
this.minlength = props.minlength;
|
|
234
|
+
this.maxlength = props.maxlength;
|
|
235
|
+
this.accumulate = props.accumulate;
|
|
236
|
+
this.example = props.example;
|
|
237
|
+
this.of = props.of;
|
|
238
|
+
this.validate = props.validate;
|
|
239
|
+
this.text = props.text;
|
|
240
|
+
this.modelRef = props.modelRef;
|
|
241
|
+
this.arrDepth = props.arrDepth;
|
|
242
|
+
this.optArrDepth = props.optArrDepth;
|
|
243
|
+
this.meta = props.meta;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
static fromFieldInfo<
|
|
247
|
+
FieldType extends "property" | "hidden" | "resolve" = any,
|
|
248
|
+
Value extends ConstantFieldTypeInput | null = null,
|
|
249
|
+
FieldValue = any,
|
|
250
|
+
MapValue = any,
|
|
251
|
+
Nullable extends boolean = false,
|
|
252
|
+
Metadata = { [key: string]: any },
|
|
253
|
+
>(
|
|
254
|
+
fieldInfo: FieldInfo<FieldType, Value, FieldValue, MapValue>,
|
|
255
|
+
): ConstantField<FieldType, Value, FieldValue, MapValue, Nullable, Metadata> {
|
|
256
|
+
const [modelRef, arrDepth] = getNonArrayModel(fieldInfo.type as Cls);
|
|
257
|
+
const [option, optArrDepth] = getNonArrayModel(fieldInfo.option);
|
|
258
|
+
|
|
259
|
+
const isArray = arrDepth > 0;
|
|
260
|
+
const isMap = modelRef === Map;
|
|
261
|
+
if (isMap && !option.of) throw new Error("Map type must have 'of' option");
|
|
262
|
+
|
|
263
|
+
return new ConstantField({
|
|
264
|
+
nullable: option.nullable ?? ((option.default === "" ? true : false) as unknown as Nullable),
|
|
265
|
+
ref: option.ref,
|
|
266
|
+
refPath: option.refPath,
|
|
267
|
+
refType: option.refType,
|
|
268
|
+
default: option.default ?? (isArray ? [] : null),
|
|
269
|
+
type: option.type,
|
|
270
|
+
fieldType: option.fieldType ?? "property",
|
|
271
|
+
immutable: option.immutable ?? false,
|
|
272
|
+
min: option.min,
|
|
273
|
+
max: option.max,
|
|
274
|
+
enum: option.enum,
|
|
275
|
+
select: option.select ?? true,
|
|
276
|
+
minlength: option.minlength,
|
|
277
|
+
maxlength: option.maxlength,
|
|
278
|
+
accumulate: option.accumulate,
|
|
279
|
+
example: option.example,
|
|
280
|
+
of: option.of,
|
|
281
|
+
validate: option.validate,
|
|
282
|
+
text: option.text,
|
|
283
|
+
modelRef,
|
|
284
|
+
arrDepth: arrDepth,
|
|
285
|
+
optArrDepth: optArrDepth,
|
|
286
|
+
meta: (option.meta ?? {}) as Metadata,
|
|
287
|
+
} as ConstantFieldBuildProps<FieldType, FieldValue, MapValue, Metadata, Nullable>);
|
|
288
|
+
}
|
|
289
|
+
get isClass() {
|
|
290
|
+
return !PrimitiveRegistry.has(this.modelRef) && !this.isMap;
|
|
291
|
+
}
|
|
292
|
+
get isScalar() {
|
|
293
|
+
return ConstantRegistry.isScalar(this.modelRef) || PrimitiveRegistry.has(this.modelRef);
|
|
294
|
+
}
|
|
295
|
+
get isArray() {
|
|
296
|
+
return this.arrDepth > 0;
|
|
297
|
+
}
|
|
298
|
+
get isMap() {
|
|
299
|
+
return this.modelRef === Map;
|
|
300
|
+
}
|
|
301
|
+
getProps(): FieldProps {
|
|
302
|
+
return {
|
|
303
|
+
nullable: this.nullable as unknown as boolean,
|
|
304
|
+
ref: this.ref,
|
|
305
|
+
refPath: this.refPath,
|
|
306
|
+
refType: this.refType,
|
|
307
|
+
default: this.default,
|
|
308
|
+
type: this.type,
|
|
309
|
+
fieldType: this.fieldType,
|
|
310
|
+
immutable: this.immutable,
|
|
311
|
+
min: this.min,
|
|
312
|
+
max: this.max,
|
|
313
|
+
enum: this.enum,
|
|
314
|
+
select: this.select,
|
|
315
|
+
minlength: this.minlength,
|
|
316
|
+
maxlength: this.maxlength,
|
|
317
|
+
accumulate: this.accumulate,
|
|
318
|
+
example: this.example,
|
|
319
|
+
of: this.of,
|
|
320
|
+
validate: this.validate,
|
|
321
|
+
text: this.text,
|
|
322
|
+
modelRef: this.modelRef,
|
|
323
|
+
arrDepth: this.arrDepth,
|
|
324
|
+
optArrDepth: this.optArrDepth,
|
|
325
|
+
meta: this.meta,
|
|
326
|
+
isClass: this.isClass,
|
|
327
|
+
isScalar: this.isScalar,
|
|
328
|
+
isArray: this.isArray,
|
|
329
|
+
isMap: this.isMap,
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
export interface FieldObject {
|
|
334
|
+
[key: string]: ConstantField;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
type FieldOption<
|
|
338
|
+
Value extends ConstantFieldTypeInput,
|
|
339
|
+
MapValue = Value extends MapConstructor ? typeof PrimitiveScalar : never,
|
|
340
|
+
Metadata extends { [key: string]: any } = { [key: string]: any },
|
|
341
|
+
_FieldToValue = FieldToValue<Value, MapValue> | null | undefined,
|
|
342
|
+
> =
|
|
343
|
+
| Omit<
|
|
344
|
+
ConstantFieldProps<"property" | "hidden" | "resolve", _FieldToValue, MapValue, Metadata>,
|
|
345
|
+
"enum" | "meta" | "nullable" | "fieldType" | "select"
|
|
346
|
+
>
|
|
347
|
+
| Omit<
|
|
348
|
+
ConstantFieldProps<"property" | "hidden" | "resolve", SingleValue<_FieldToValue>, MapValue, Metadata>,
|
|
349
|
+
"enum" | "meta" | "nullable" | "fieldType" | "select"
|
|
350
|
+
>[];
|
|
351
|
+
|
|
352
|
+
export type PlainTypeToFieldType<PlainType> = PlainType extends [infer First, ...infer Rest]
|
|
353
|
+
? PlainTypeToFieldType<First>[]
|
|
354
|
+
: PlainType extends number
|
|
355
|
+
? typeof Int | typeof Float
|
|
356
|
+
: PlainType extends string
|
|
357
|
+
? StringConstructor
|
|
358
|
+
: typeof Any;
|
|
359
|
+
|
|
360
|
+
/** Builds a stored property field with optional validation, default, ref, text, and metadata options. */
|
|
361
|
+
export const field = <
|
|
362
|
+
ExplicitType,
|
|
363
|
+
Value extends ConstantFieldTypeInput = PlainTypeToFieldType<ExplicitType>,
|
|
364
|
+
MapValue = Value extends MapConstructor ? typeof PrimitiveScalar : never,
|
|
365
|
+
>(
|
|
366
|
+
value: Value,
|
|
367
|
+
option: FieldOption<Value, MapValue> = {},
|
|
368
|
+
) =>
|
|
369
|
+
new FieldInfo<"property", Value, ExplicitType, MapValue>(value, {
|
|
370
|
+
...option,
|
|
371
|
+
fieldType: "property",
|
|
372
|
+
});
|
|
373
|
+
|
|
374
|
+
field.hidden = <
|
|
375
|
+
ExplicitType,
|
|
376
|
+
Value extends ConstantFieldTypeInput = PlainTypeToFieldType<ExplicitType>,
|
|
377
|
+
MapValue = Value extends MapConstructor ? typeof PrimitiveScalar : never,
|
|
378
|
+
>(
|
|
379
|
+
value: Value,
|
|
380
|
+
option: FieldOption<Value, MapValue> = {},
|
|
381
|
+
) =>
|
|
382
|
+
new FieldInfo<"hidden", Value | null, ExplicitType | null, MapValue>(value, {
|
|
383
|
+
...option,
|
|
384
|
+
fieldType: "hidden",
|
|
385
|
+
nullable: true,
|
|
386
|
+
});
|
|
387
|
+
field.secret = <
|
|
388
|
+
ExplicitType,
|
|
389
|
+
Value extends ConstantFieldTypeInput = PlainTypeToFieldType<ExplicitType>,
|
|
390
|
+
MapValue = Value extends MapConstructor ? typeof PrimitiveScalar : never,
|
|
391
|
+
>(
|
|
392
|
+
value: Value,
|
|
393
|
+
option: FieldOption<Value, MapValue> = {},
|
|
394
|
+
) =>
|
|
395
|
+
new FieldInfo<"hidden", Value | null, ExplicitType | null, MapValue>(value, {
|
|
396
|
+
...option,
|
|
397
|
+
fieldType: "hidden",
|
|
398
|
+
select: false,
|
|
399
|
+
nullable: true,
|
|
400
|
+
});
|
|
401
|
+
/** Builds a resolved field that is derived rather than treated as a stored property. */
|
|
402
|
+
export const resolve = <
|
|
403
|
+
ExplicitType,
|
|
404
|
+
Value extends ConstantFieldTypeInput = PlainTypeToFieldType<ExplicitType>,
|
|
405
|
+
MapValue = Value extends MapConstructor ? typeof PrimitiveScalar : never,
|
|
406
|
+
>(
|
|
407
|
+
value: Value,
|
|
408
|
+
option: FieldOption<Value, MapValue> = {},
|
|
409
|
+
) =>
|
|
410
|
+
new FieldInfo<"resolve", Value, ExplicitType, MapValue>(value, {
|
|
411
|
+
...option,
|
|
412
|
+
fieldType: "resolve",
|
|
413
|
+
});
|
|
414
|
+
export type FieldBuilder = typeof field;
|
|
415
|
+
export type FieldResolver = typeof resolve;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { FIELD_META, PRIMITIVE_DEFAULT_VALUE, type PrimitiveScalar } from "akanjs/base";
|
|
2
|
+
import type { FieldObject } from ".";
|
|
3
|
+
import type { DefaultOf } from "./types";
|
|
4
|
+
|
|
5
|
+
export const getDefault = <T>(fieldObj: FieldObject): DefaultOf<T> => {
|
|
6
|
+
const result: Record<string, unknown> = {};
|
|
7
|
+
for (const [key, field] of Object.entries(fieldObj)) {
|
|
8
|
+
if (field.fieldType === "hidden") result[key] = null;
|
|
9
|
+
else if (field.default) {
|
|
10
|
+
if (typeof field.default === "function") result[key] = (field.default as () => object)();
|
|
11
|
+
else result[key] = field.default as object;
|
|
12
|
+
} else if (field.isArray) result[key] = [];
|
|
13
|
+
else if (field.nullable) result[key] = null;
|
|
14
|
+
else if (field.isClass) result[key] = field.isScalar ? getDefault(field.modelRef[FIELD_META]) : null;
|
|
15
|
+
else result[key] = (field.modelRef as unknown as typeof PrimitiveScalar)[PRIMITIVE_DEFAULT_VALUE];
|
|
16
|
+
}
|
|
17
|
+
return result as DefaultOf<T>;
|
|
18
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { FIELD_META } from "akanjs/base";
|
|
2
|
+
import { immerable } from "immer";
|
|
3
|
+
import type { ConstantCls } from ".";
|
|
4
|
+
|
|
5
|
+
export const immerify = <T extends object>(modelRef: ConstantCls, objOrArr: T): T => {
|
|
6
|
+
if (Array.isArray(objOrArr)) return objOrArr.map((val) => immerify(modelRef, val as object)) as T;
|
|
7
|
+
const immeredObj = Object.assign({}, objOrArr, {
|
|
8
|
+
[immerable]: true,
|
|
9
|
+
}) as Record<string, unknown>;
|
|
10
|
+
const objRecord = objOrArr as Record<string, unknown>;
|
|
11
|
+
Object.entries(modelRef[FIELD_META]).forEach(([key, field]) => {
|
|
12
|
+
if (field.isScalar && field.isClass && !!objRecord[key])
|
|
13
|
+
immeredObj[key] = immerify(field.modelRef, objRecord[key] as object);
|
|
14
|
+
});
|
|
15
|
+
return immeredObj as T;
|
|
16
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from "./constantRegistry";
|
|
2
|
+
export * from "./crystalize";
|
|
3
|
+
export * from "./deserialize";
|
|
4
|
+
export * from "./fieldInfo";
|
|
5
|
+
export * from "./getDefault";
|
|
6
|
+
export * from "./immerify";
|
|
7
|
+
export * from "./purify";
|
|
8
|
+
export * from "./serialize";
|
|
9
|
+
export * from "./types";
|
|
10
|
+
export * from "./via";
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import {
|
|
2
|
+
applyFnToArrayObjects,
|
|
3
|
+
type Cls,
|
|
4
|
+
type Dayjs,
|
|
5
|
+
dayjs,
|
|
6
|
+
FIELD_META,
|
|
7
|
+
type GetStateObject,
|
|
8
|
+
getNonArrayModel,
|
|
9
|
+
ID,
|
|
10
|
+
PrimitiveRegistry,
|
|
11
|
+
type PrimitiveScalar,
|
|
12
|
+
type Upload,
|
|
13
|
+
} from "akanjs/base";
|
|
14
|
+
import { Logger } from "akanjs/common";
|
|
15
|
+
|
|
16
|
+
import { type BaseObject, type ConstantCls, ConstantRegistry, type DefaultOf, type FieldProps } from ".";
|
|
17
|
+
|
|
18
|
+
type Purified<O> = O extends BaseObject
|
|
19
|
+
? string
|
|
20
|
+
: O extends BaseObject[]
|
|
21
|
+
? string[]
|
|
22
|
+
: O extends Dayjs
|
|
23
|
+
? Dayjs
|
|
24
|
+
: O extends object
|
|
25
|
+
? PurifiedModel<O>
|
|
26
|
+
: O;
|
|
27
|
+
type PurifiedWithObjectToId<T, StateKeys extends keyof GetStateObject<T> = keyof GetStateObject<T>> = {
|
|
28
|
+
[K in StateKeys as null extends T[K] ? never : K]: Purified<T[K]>;
|
|
29
|
+
} & {
|
|
30
|
+
[K in StateKeys as null extends T[K] ? K : never]?: Purified<T[K]> | undefined;
|
|
31
|
+
};
|
|
32
|
+
export type PurifiedModel<T> = T extends Upload[]
|
|
33
|
+
? FileList
|
|
34
|
+
: T extends (infer S)[]
|
|
35
|
+
? PurifiedModel<S>[]
|
|
36
|
+
: T extends string | number | boolean | Dayjs
|
|
37
|
+
? T
|
|
38
|
+
: T extends Map<infer K, infer V>
|
|
39
|
+
? Map<K, PurifiedModel<V>>
|
|
40
|
+
: PurifiedWithObjectToId<T>;
|
|
41
|
+
|
|
42
|
+
export type PurifyFunc<Input, _DefaultInput = DefaultOf<Input>, _PurifiedInput = PurifiedModel<Input>> = (
|
|
43
|
+
self: _DefaultInput,
|
|
44
|
+
isChild?: boolean,
|
|
45
|
+
) => _PurifiedInput | null;
|
|
46
|
+
|
|
47
|
+
const getPurifyFn = (modelRef: Cls): ((value: unknown) => unknown) => {
|
|
48
|
+
const [valueRef] = getNonArrayModel(modelRef);
|
|
49
|
+
const purifyFn = PrimitiveRegistry.has(valueRef)
|
|
50
|
+
? (value: unknown) => (valueRef as unknown as typeof PrimitiveScalar)._serialize(value as never)
|
|
51
|
+
: (value: unknown) => value as object;
|
|
52
|
+
return purifyFn;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
const purify = (field: FieldProps, key: string, value: unknown, self: Record<string, unknown>): unknown => {
|
|
56
|
+
|
|
57
|
+
if (
|
|
58
|
+
field.nullable &&
|
|
59
|
+
(value === null ||
|
|
60
|
+
value === undefined ||
|
|
61
|
+
(typeof value === "number" && Number.isNaN(value)) ||
|
|
62
|
+
(typeof value === "string" && !value.length))
|
|
63
|
+
)
|
|
64
|
+
return null;
|
|
65
|
+
if (field.isArray) {
|
|
66
|
+
if (!Array.isArray(value)) throw new Error(`Invalid Array Value in ${key} for value ${value}`);
|
|
67
|
+
if (field.minlength && value.length < field.minlength)
|
|
68
|
+
throw new Error(`Invalid Array Length (Min) in ${key} for value ${value}`);
|
|
69
|
+
else if (field.maxlength && value.length > field.maxlength)
|
|
70
|
+
throw new Error(`Invalid Array Length (Max) in ${key} for value ${value}`);
|
|
71
|
+
else if (field.optArrDepth === 0 && field.validate && !field.validate(value, self))
|
|
72
|
+
throw new Error(`Invalid Array Value (Failed to pass validation) in ${key} for value ${value}`);
|
|
73
|
+
return value.map((v) => purify({ ...field, isArray: field.arrDepth > 1, arrDepth: field.arrDepth - 1 }, key, v, v));
|
|
74
|
+
}
|
|
75
|
+
if (field.isMap && field.of) {
|
|
76
|
+
const purifyFn = PrimitiveRegistry.has(field.of as Cls)
|
|
77
|
+
? getPurifyFn(field.of as Cls)
|
|
78
|
+
: (value: unknown) => makePurify(field.of as ConstantCls)(value as object);
|
|
79
|
+
return Object.fromEntries(
|
|
80
|
+
[...(value as Map<string, unknown>).entries()].map(([key, val]) => [key, applyFnToArrayObjects(val, purifyFn)]),
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
if (field.isClass) return makePurify(field.modelRef)(value as object, true) as object;
|
|
84
|
+
if (field.modelRef === Date && dayjs(value as Date).isBefore(dayjs(new Date("0000"))))
|
|
85
|
+
throw new Error(`Invalid Date Value (Default) in ${key} for value ${value}`);
|
|
86
|
+
if ([String, ID].includes(field.modelRef as unknown as StringConstructor | typeof ID) && (value === "" || !value))
|
|
87
|
+
throw new Error(`Invalid String Value (Default) in ${key} for value ${value}`);
|
|
88
|
+
if (field.validate && !field.validate(value, self))
|
|
89
|
+
throw new Error(`Invalid Value (Failed to pass validation) / ${value} in ${key}`);
|
|
90
|
+
if (!field.nullable && !value && value !== 0 && value !== false)
|
|
91
|
+
throw new Error(`Invalid Value (Nullable) in ${key} for value ${value}`);
|
|
92
|
+
|
|
93
|
+
const purifyFn = getPurifyFn(field.modelRef);
|
|
94
|
+
return purifyFn(value);
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
export const makePurify = <I>(modelRef: ConstantCls<I>): PurifyFunc<I> => {
|
|
98
|
+
const fn = ((self: Record<string, unknown>, isChild?: boolean): unknown => {
|
|
99
|
+
try {
|
|
100
|
+
if (isChild && !ConstantRegistry.isScalar(modelRef)) {
|
|
101
|
+
const id = self.id as string;
|
|
102
|
+
if (!id) throw new Error(`Invalid Value (No ID) for id ${modelRef}`);
|
|
103
|
+
return id;
|
|
104
|
+
}
|
|
105
|
+
const result: Record<string, unknown> = {};
|
|
106
|
+
Object.entries(modelRef[FIELD_META]).forEach(([key, field]) => {
|
|
107
|
+
const value = self[key] as object;
|
|
108
|
+
result[key] = purify(field.getProps(), key, value, self) as object;
|
|
109
|
+
});
|
|
110
|
+
return result;
|
|
111
|
+
} catch (err) {
|
|
112
|
+
if (isChild) throw new Error(err as string);
|
|
113
|
+
Logger.debug(err as string);
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
}) as PurifyFunc<I>;
|
|
117
|
+
return fn;
|
|
118
|
+
};
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import {
|
|
2
|
+
applyFnToArrayObjects,
|
|
3
|
+
type Cls,
|
|
4
|
+
type Dayjs,
|
|
5
|
+
FIELD_META,
|
|
6
|
+
getNonArrayModel,
|
|
7
|
+
ID,
|
|
8
|
+
PrimitiveRegistry,
|
|
9
|
+
type PrimitiveScalar,
|
|
10
|
+
} from "akanjs/base";
|
|
11
|
+
|
|
12
|
+
import type { ConstantCls } from ".";
|
|
13
|
+
|
|
14
|
+
export type Serialized<O> = O extends (infer V)[]
|
|
15
|
+
? Serialized<V>[]
|
|
16
|
+
: O extends Dayjs
|
|
17
|
+
? Date
|
|
18
|
+
: O extends Map<infer K, infer V>
|
|
19
|
+
? { [key in K & string]: Serialized<V> }
|
|
20
|
+
: O extends object
|
|
21
|
+
? { [K in keyof O]: Serialized<O[K]> }
|
|
22
|
+
: O;
|
|
23
|
+
|
|
24
|
+
const getSerializeFn = (inputRef: Cls, { optional = false }: { optional?: boolean } = {}) => {
|
|
25
|
+
const serializeFn = PrimitiveRegistry.has(inputRef)
|
|
26
|
+
? (value: unknown) => (inputRef as typeof PrimitiveScalar)._serialize(value as never, { optional })
|
|
27
|
+
: (value: unknown) => value as object;
|
|
28
|
+
return serializeFn;
|
|
29
|
+
};
|
|
30
|
+
const serializeInput = <Input = unknown>(
|
|
31
|
+
value: Input | Input[],
|
|
32
|
+
inputRef: ConstantCls<Input> | PrimitiveScalar,
|
|
33
|
+
arrDepth: number,
|
|
34
|
+
serializeType: "input" | "object" = "object",
|
|
35
|
+
{ optional = false }: { optional?: boolean } = {},
|
|
36
|
+
): Input | Input[] => {
|
|
37
|
+
if (arrDepth && Array.isArray(value))
|
|
38
|
+
return value.map((v) => serializeInput(v, inputRef, arrDepth - 1) as Input) as unknown as Input[];
|
|
39
|
+
else if ((inputRef as MapConstructor).prototype === Map.prototype) {
|
|
40
|
+
const [valueRef] = getNonArrayModel(inputRef as Cls);
|
|
41
|
+
const serializeFn = getSerializeFn(valueRef, { optional });
|
|
42
|
+
return Object.fromEntries(
|
|
43
|
+
[...(value as Map<string, unknown>).entries()].map(([key, val]) => [
|
|
44
|
+
key,
|
|
45
|
+
applyFnToArrayObjects(val, serializeFn),
|
|
46
|
+
]),
|
|
47
|
+
) as unknown as Input;
|
|
48
|
+
} else if (PrimitiveRegistry.has(inputRef as Cls)) {
|
|
49
|
+
const serializeFn = getSerializeFn(inputRef as Cls, { optional });
|
|
50
|
+
return serializeFn(value) as Input;
|
|
51
|
+
} else {
|
|
52
|
+
const modelRef = inputRef as ConstantCls;
|
|
53
|
+
return Object.fromEntries(
|
|
54
|
+
Object.entries(modelRef[FIELD_META]).map(([key, field]) => [
|
|
55
|
+
key,
|
|
56
|
+
field.isClass && !field.isScalar
|
|
57
|
+
? serialize(ID, field.arrDepth, getRelationId((value as Record<string, unknown>)?.[key]), serializeType, {
|
|
58
|
+
nullable: field.nullable,
|
|
59
|
+
key,
|
|
60
|
+
})
|
|
61
|
+
: serialize(field.modelRef, field.arrDepth, (value as Record<string, unknown>)?.[key], serializeType, {
|
|
62
|
+
nullable: field.nullable,
|
|
63
|
+
key,
|
|
64
|
+
}),
|
|
65
|
+
]),
|
|
66
|
+
) as unknown as Input;
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
const getRelationId = (value: unknown): unknown => {
|
|
71
|
+
if (Array.isArray(value)) return value.map((item) => getRelationId(item));
|
|
72
|
+
if (value && typeof value === "object" && "id" in value) return (value as { id: unknown }).id;
|
|
73
|
+
return value;
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
export const serialize = (
|
|
77
|
+
argRef: ConstantCls | PrimitiveScalar,
|
|
78
|
+
arrDepth: number,
|
|
79
|
+
value: unknown,
|
|
80
|
+
serializeType: "input" | "object" = "object",
|
|
81
|
+
{ nullable = false, key }: { nullable?: boolean; key?: string },
|
|
82
|
+
) => {
|
|
83
|
+
if (nullable && (value === null || value === undefined)) return null;
|
|
84
|
+
else if (!nullable && (value === null || value === undefined))
|
|
85
|
+
throw new Error(`Invalid Value (Nullable) in ${argRef} for value ${value}${key ? ` in ${key}` : ""}`);
|
|
86
|
+
return serializeInput(value, argRef, arrDepth, serializeType, { optional: nullable }) as object[];
|
|
87
|
+
};
|