akanjs 0.0.1 → 2.0.0-beta.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/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 +11401 -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 +60 -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 +1326 -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
|
File without changes
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "Model Constant",
|
|
3
|
+
"description": "How to create and implement model.constant.ts files in Akan.js",
|
|
4
|
+
"scans": [
|
|
5
|
+
{
|
|
6
|
+
"type": "source",
|
|
7
|
+
"description": "Model decorator implementation",
|
|
8
|
+
"path": "pkgs/akanjs/constant/classMeta.ts"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"type": "source",
|
|
12
|
+
"description": "Field decorator implementation",
|
|
13
|
+
"path": "pkgs/akanjs/constant/fieldMeta.ts"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"type": "source",
|
|
17
|
+
"description": "Filter implementation",
|
|
18
|
+
"path": "pkgs/akanjs/constant/filterMeta.ts"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"type": "source",
|
|
22
|
+
"description": "via and sortOf implementations",
|
|
23
|
+
"path": "pkgs/akanjs/constant/constantDecorator.ts"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"type": "source",
|
|
27
|
+
"description": "GraphQL schema generation",
|
|
28
|
+
"path": "pkgs/akanjs/server/gql.ts"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"type": "source",
|
|
32
|
+
"description": "MongoDB schema generation",
|
|
33
|
+
"path": "pkgs/akanjs/server/schema.ts"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"type": "source",
|
|
37
|
+
"description": "Query resolver implementation",
|
|
38
|
+
"path": "pkgs/akanjs/server/resolver.ts"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"type": "source",
|
|
42
|
+
"description": "Search indexing implementation",
|
|
43
|
+
"path": "pkgs/akanjs/server/searchDaemon.ts"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"type": "example",
|
|
47
|
+
"description": "Simple model examples",
|
|
48
|
+
"path": "{apps,libs}/*/lib/*/*.constant.ts",
|
|
49
|
+
"query": "lines < 100",
|
|
50
|
+
"sample": 3
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"type": "example",
|
|
54
|
+
"description": "Complex models with all types",
|
|
55
|
+
"path": "{apps,libs}/*/lib/*/*.constant.ts",
|
|
56
|
+
"filterText": "@Model\\.(Input|Object|Light|Full|Filter|Summary|Insight)",
|
|
57
|
+
"sample": 3
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"type": "example",
|
|
61
|
+
"description": "Models with enum definitions",
|
|
62
|
+
"path": "{apps,libs}/*/lib/*/*.constant.ts",
|
|
63
|
+
"filterText": "enumOf",
|
|
64
|
+
"sample": 3
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"type": "example",
|
|
68
|
+
"description": "Models with reference fields",
|
|
69
|
+
"path": "{apps,libs}/*/lib/*/*.constant.ts",
|
|
70
|
+
"filterText": "ref: \"",
|
|
71
|
+
"sample": 2
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"type": "usage",
|
|
75
|
+
"description": "Usage of models in UI components",
|
|
76
|
+
"path": "{apps,libs}/*/lib/*/[A-Z]*.{Template,Unit,View}.tsx",
|
|
77
|
+
"sample": 3
|
|
78
|
+
}
|
|
79
|
+
],
|
|
80
|
+
"update": {
|
|
81
|
+
"filePath": "./modelConstant.instruction.md",
|
|
82
|
+
"contents": [
|
|
83
|
+
"Purpose and role of model.constant.ts files",
|
|
84
|
+
"Model class hierarchy and relationships",
|
|
85
|
+
"File structure and organization conventions",
|
|
86
|
+
"Required imports and dependencies",
|
|
87
|
+
"Enum definition patterns",
|
|
88
|
+
"ModelInput implementation",
|
|
89
|
+
"ModelObject implementation",
|
|
90
|
+
"LightModel implementation",
|
|
91
|
+
"Full Model implementation",
|
|
92
|
+
"Insight Model implementation",
|
|
93
|
+
"Summary Model implementation",
|
|
94
|
+
"Filter Model implementation",
|
|
95
|
+
"Field decorators and options",
|
|
96
|
+
"Filter decorators and arguments",
|
|
97
|
+
"Inheritance with via() and sortOf()",
|
|
98
|
+
"Working with references to other models",
|
|
99
|
+
"Validation rules and constraints",
|
|
100
|
+
"Type safety considerations",
|
|
101
|
+
"Common mistakes and solutions",
|
|
102
|
+
"Best practices for maintainable models",
|
|
103
|
+
"Complete example with all model types"
|
|
104
|
+
],
|
|
105
|
+
"rules": [
|
|
106
|
+
"Follow the model hierarchy: Input → Object → Light/Full → Filter/Summary/Insight",
|
|
107
|
+
"Always create an Input model with user-editable fields",
|
|
108
|
+
"Always create an Object model extending Input with system fields",
|
|
109
|
+
"Always create a Light model with essential fields for listings",
|
|
110
|
+
"Always create a Full model combining Object and Light models",
|
|
111
|
+
"Create Filter models with sortOf() and custom filter methods",
|
|
112
|
+
"Create Insight models for aggregation/analytics",
|
|
113
|
+
"Create Summary models for dashboards",
|
|
114
|
+
"Use consistent naming: ModelInput, ModelObject, LightModel, Model (full)",
|
|
115
|
+
"Use via() for inheritance and field selection",
|
|
116
|
+
"Mark field arrays as const with 'as const' assertion",
|
|
117
|
+
"Avoid getters, setters, and instance methods - use static methods if needed",
|
|
118
|
+
"Always use Field.Prop/Hidden/Secret/Resolve decorators",
|
|
119
|
+
"Define enums with enumOf() and export both const and type",
|
|
120
|
+
"Set appropriate field defaults, especially for arrays (empty array)",
|
|
121
|
+
"Add validation constraints (min, max, minlength, maxlength) where appropriate",
|
|
122
|
+
"Use proper reference format with { ref: 'ModelName' }",
|
|
123
|
+
"Group related models in the same file",
|
|
124
|
+
"Export all models and enums"
|
|
125
|
+
]
|
|
126
|
+
},
|
|
127
|
+
"page": "/akanjs/(docs)/docs/module/constant/_index.tsx"
|
|
128
|
+
}
|
|
@@ -0,0 +1,506 @@
|
|
|
1
|
+
# Akan.js Model Constant Implementation Guide
|
|
2
|
+
|
|
3
|
+
## Purpose and Role of Model Constant Files
|
|
4
|
+
|
|
5
|
+
Model constant files (`model.constant.ts`) serve as the foundation of the Akan.js framework by:
|
|
6
|
+
|
|
7
|
+
- Defining data structures for database schemas
|
|
8
|
+
- Generating GraphQL types for API interfaces
|
|
9
|
+
- Configuring validation rules for input data
|
|
10
|
+
- Establishing relationships between entities
|
|
11
|
+
- Supporting search indexing and optimization
|
|
12
|
+
- Enabling type-safe data manipulation
|
|
13
|
+
- Creating a single source of truth for the data model
|
|
14
|
+
|
|
15
|
+
## Model Class Hierarchy and Relationships
|
|
16
|
+
|
|
17
|
+
```mermaid
|
|
18
|
+
graph TD
|
|
19
|
+
Input[Model.Input] --> Object[Model.Object]
|
|
20
|
+
Object --> Light[Model.Light]
|
|
21
|
+
Object --> Full[Model.Full]
|
|
22
|
+
Object --> Insight[Model.Insight]
|
|
23
|
+
Insight --> Summary[Model.Summary]
|
|
24
|
+
Object --> Query[Model.Query]
|
|
25
|
+
Object --> Sort[Model.Sort]
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Each model type serves a specific purpose in the data lifecycle:
|
|
29
|
+
|
|
30
|
+
1. **Input Model**: Data required to create a schema
|
|
31
|
+
2. **Object Model**: Schema completed when data is created
|
|
32
|
+
3. **Light Model**: Lightweight schema used when querying multiple data
|
|
33
|
+
4. **Full Model**: Class-based complete form of data
|
|
34
|
+
5. **Insight Model**: Statistical data extractable during queries
|
|
35
|
+
6. **Summary Model**: Statistical data extracted periodically during monitoring
|
|
36
|
+
7. **Query Model**: Defines query methods and statements
|
|
37
|
+
8. **Sort Model**: Defines sort keys and values for data ordering
|
|
38
|
+
|
|
39
|
+
## File Structure and Organization
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
// 1. Imports
|
|
43
|
+
import { enumOf, ID, Int } from "akanjs/base";
|
|
44
|
+
import { Field, Model } from "akanjs/constant";
|
|
45
|
+
|
|
46
|
+
// 2. Enums
|
|
47
|
+
export const StatusEnum = enumOf(["active", "inactive"] as const);
|
|
48
|
+
export type StatusEnum = enumOf<typeof StatusEnum>;
|
|
49
|
+
|
|
50
|
+
// 3. Input Model
|
|
51
|
+
|
|
52
|
+
export class DroneInput {
|
|
53
|
+
@Field.Prop(() => String)
|
|
54
|
+
name: string;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// 4. Object Model
|
|
58
|
+
|
|
59
|
+
export class DroneObject extends BaseModel(DroneInput) {
|
|
60
|
+
@Field.Prop(() => String, { enum: StatusEnum, default: "offline" })
|
|
61
|
+
status: StatusEnum;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// 5. Light Model
|
|
65
|
+
|
|
66
|
+
export class LightDrone extends Light(DroneObject, ["id", "name", "status"] as const) {
|
|
67
|
+
isConnected() {
|
|
68
|
+
return this.status !== "offline";
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// 6. Full Model
|
|
73
|
+
|
|
74
|
+
export class Drone extends Full(DroneObject, LightDrone) {
|
|
75
|
+
isAvailable() {
|
|
76
|
+
return this.isConnected() && this.wsUri.startsWith("ws://");
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// 7. Insight Model
|
|
81
|
+
|
|
82
|
+
export class DroneInsight {
|
|
83
|
+
@Field.Prop(() => Int, { default: 0, accumulate: { $sum: 1 } })
|
|
84
|
+
count: number;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// 9. Query Model
|
|
88
|
+
export const droneQuery = {
|
|
89
|
+
byName: (name: string) => ({ name }),
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
// 10. Sort Model
|
|
93
|
+
export const droneSort = {
|
|
94
|
+
alphabetical: { name: 1 },
|
|
95
|
+
};
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Required Imports
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
// Base types
|
|
102
|
+
import { enumOf, ID, Int, Float, String, Boolean, Date, type Dayjs, dayjs, JSON } from "akanjs/base";
|
|
103
|
+
|
|
104
|
+
// Model decorators
|
|
105
|
+
import { Field, Model } from "akanjs/constant";
|
|
106
|
+
|
|
107
|
+
// Related models (use Light models to prevent circular dependencies)
|
|
108
|
+
import { LightCategory } from "../category/category.constant";
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## ModelInput Implementation
|
|
112
|
+
|
|
113
|
+
The Input model defines fields required for data creation:
|
|
114
|
+
|
|
115
|
+
```typescript
|
|
116
|
+
export class DroneInput {
|
|
117
|
+
@Field.Prop(() => String)
|
|
118
|
+
name: string;
|
|
119
|
+
|
|
120
|
+
@Field.Prop(() => String, { default: "ws://10.10.150.10:9091" })
|
|
121
|
+
wsUri: string;
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
**Usage Examples**:
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
// Document creation
|
|
129
|
+
new this.Drone({ name: "myDrone", wsUri: "ws://10.10.150.10:9091" });
|
|
130
|
+
|
|
131
|
+
// Service logic
|
|
132
|
+
this.createDrone({ name: "myDrone", wsUri: "ws://10.10.150.10:9091" });
|
|
133
|
+
|
|
134
|
+
// API call
|
|
135
|
+
fetch.createDrone({ name: "myDrone", wsUri: "ws://10.10.150.10:9091" });
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## ModelObject Implementation
|
|
139
|
+
|
|
140
|
+
The Object model adds system-managed fields:
|
|
141
|
+
|
|
142
|
+
```typescript
|
|
143
|
+
export const droneStatuses = ["active", "offline", "inactive"] as const;
|
|
144
|
+
export type DroneStatus = (typeof droneStatuses)[number];
|
|
145
|
+
|
|
146
|
+
export class DroneObject extends BaseModel(DroneInput) {
|
|
147
|
+
@Field.Prop(() => String, { enum: droneStatuses, default: "offline" })
|
|
148
|
+
status: DroneStatus;
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
**Usage Examples**:
|
|
153
|
+
|
|
154
|
+
```typescript
|
|
155
|
+
// Document lookup
|
|
156
|
+
const drone = await this.Drone.pickById("droneId"); // drone.status
|
|
157
|
+
|
|
158
|
+
// Service lookup
|
|
159
|
+
const drone = await this.getDrone("droneId"); // drone.status
|
|
160
|
+
|
|
161
|
+
// Store lookup
|
|
162
|
+
const drone = await fetch.drone("droneId"); // drone.status
|
|
163
|
+
|
|
164
|
+
// Component usage
|
|
165
|
+
const drone = st.use.drone(); // drone.status
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## LightModel Implementation
|
|
169
|
+
|
|
170
|
+
Light model defines lightweight schema for list queries:
|
|
171
|
+
|
|
172
|
+
```typescript
|
|
173
|
+
export class LightDrone extends Light(DroneObject, ["name", "status"] as const) {
|
|
174
|
+
isConnected() {
|
|
175
|
+
return this.status !== "offline";
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
**Usage Examples**:
|
|
181
|
+
|
|
182
|
+
```typescript
|
|
183
|
+
// Store query
|
|
184
|
+
const droneList = await fetch.droneList({ status: "active" });
|
|
185
|
+
// drone.name available, drone.wsUri not available
|
|
186
|
+
|
|
187
|
+
// Component usage
|
|
188
|
+
const droneMap = st.use.droneMap(); // Map<string, LightDrone>
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
## Full Model Implementation
|
|
192
|
+
|
|
193
|
+
Full model adds convenience functions:
|
|
194
|
+
|
|
195
|
+
```typescript
|
|
196
|
+
export class Drone extends Full(DroneObject, LightDrone) {
|
|
197
|
+
static isDronesAllConnected(droneList: LightDrone[]) {
|
|
198
|
+
return droneList.every((drone) => drone.isConnected());
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
isAvailable() {
|
|
202
|
+
return this.isConnected() && this.wsUri.startsWith("ws://");
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
**Usage Examples**:
|
|
208
|
+
|
|
209
|
+
```typescript
|
|
210
|
+
// API response handling
|
|
211
|
+
const drone = await fetch.drone("droneId");
|
|
212
|
+
drone.isAvailable();
|
|
213
|
+
|
|
214
|
+
// Component logic
|
|
215
|
+
const droneMap = st.use.droneMap();
|
|
216
|
+
const droneList = [...droneMap.values()];
|
|
217
|
+
const isAllConnected = cnst.Drone.isDroneAllConnected(droneList);
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## Insight Model Implementation
|
|
221
|
+
|
|
222
|
+
Insight model defines statistical fields:
|
|
223
|
+
|
|
224
|
+
```typescript
|
|
225
|
+
export class DroneInsight {
|
|
226
|
+
@Field.Prop(() => Int, { default: 0, accumulate: { $sum: 1 } })
|
|
227
|
+
count: number;
|
|
228
|
+
}
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
**Usage Examples**:
|
|
232
|
+
|
|
233
|
+
```typescript
|
|
234
|
+
// Service usage
|
|
235
|
+
const droneInsight = await this.insight({ ...query });
|
|
236
|
+
|
|
237
|
+
// API call
|
|
238
|
+
const droneInsight = await fetch.droneInsight({ ...query });
|
|
239
|
+
|
|
240
|
+
// Component usage
|
|
241
|
+
const droneInsight = st.use.droneInsight(); // droneInsight.count
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
**Usage Examples**:
|
|
245
|
+
|
|
246
|
+
```typescript
|
|
247
|
+
// Service usage
|
|
248
|
+
const summary = await this.getActiveSummary();
|
|
249
|
+
|
|
250
|
+
// API call
|
|
251
|
+
const summary = await fetch.getActiveSummary();
|
|
252
|
+
|
|
253
|
+
// Component usage
|
|
254
|
+
const summary = st.use.summary(); // summary.totalDrone
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
## Query Model Implementation
|
|
258
|
+
|
|
259
|
+
Query model defines query methods:
|
|
260
|
+
|
|
261
|
+
```typescript
|
|
262
|
+
export const droneQuery = {
|
|
263
|
+
...baseQueries,
|
|
264
|
+
byName: (name: string) => ({ name }),
|
|
265
|
+
};
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
**Usage Examples**:
|
|
269
|
+
|
|
270
|
+
```typescript
|
|
271
|
+
// Document queries
|
|
272
|
+
const drone = await this.findByName("myDrone");
|
|
273
|
+
const drones = await this.listByName("myDrone");
|
|
274
|
+
const droneCount = await this.countByName("myDrone");
|
|
275
|
+
|
|
276
|
+
// Service queries
|
|
277
|
+
const drone = await this.findByName("myDrone");
|
|
278
|
+
const drones = await this.listByName("myDrone");
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
## Sort Model Implementation
|
|
282
|
+
|
|
283
|
+
Sort model defines sorting options:
|
|
284
|
+
|
|
285
|
+
```typescript
|
|
286
|
+
export const droneSort = {
|
|
287
|
+
...baseSorts,
|
|
288
|
+
alphabetical: { name: 1 },
|
|
289
|
+
};
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
**Usage Examples**:
|
|
293
|
+
|
|
294
|
+
```typescript
|
|
295
|
+
// Document sorting
|
|
296
|
+
const drones = await this.listByName("myDrone", { sort: "alphabetical" });
|
|
297
|
+
|
|
298
|
+
// Service sorting
|
|
299
|
+
const drones = await this.listByName("myDrone", { sort: "alphabetical" });
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
## Field Decorators and Options
|
|
303
|
+
|
|
304
|
+
| Option | Type | Default | Description | Example |
|
|
305
|
+
| ------------ | -------------------- | ------- | -------------------------------------- | ---------------------------------------------------------------------- |
|
|
306
|
+
| `nullable` | `boolean` | `false` | Field required status | `@Field.Prop(()=> String, { default: "untitled" }) title: string;` |
|
|
307
|
+
| `ref` | `string` | - | Reference collection name | `@Field.Prop(()=> ID, { ref: "drone" }) drone: string;` |
|
|
308
|
+
| `refPath` | `string` | - | Dynamic reference collection name | `@Field.Prop(()=> ID, { refPath: "rootType" }) root: string;` |
|
|
309
|
+
| `default` | `any` | - | Default value when no value entered | `@Field.Prop(()=> String, { default: "untitled" }) title: string;` |
|
|
310
|
+
| `type` | `string` | - | Preset validation (email/password/url) | `@Field.Prop(()=> String, { type: "email" }) email: string;` |
|
|
311
|
+
| `immutable` | `boolean` | `false` | Cannot be changed after creation | `@Field.Prop(()=> ID, { immutable: true }) creator: string;` |
|
|
312
|
+
| `min` | `number` | - | Minimum value for Int/Float fields | `@Field.Prop(()=> Int, { min: 0 }) progress: number;` |
|
|
313
|
+
| `max` | `number` | - | Maximum value for Int/Float fields | `@Field.Prop(()=> Float, { min: 0, max: 1 }) ratio: number;` |
|
|
314
|
+
| `enum` | `any[]` | - | Enum values restriction | `@Field.Prop(()=> String, { enum: ["active","inactive"] }) status;` |
|
|
315
|
+
| `minlength` | `number` | - | Minimum string length | `@Field.Prop(()=> String, { minlength: 2 }) name: string;` |
|
|
316
|
+
| `maxlength` | `number` | - | Maximum string length | `@Field.Prop(()=> String, { maxlength: 30 }) title: string;` |
|
|
317
|
+
| `query` | `object` | - | Query value for Summary fields | `@Field.Prop(() => Int, { query: { status: { $ne: 'inactive' } })` |
|
|
318
|
+
| `accumulate` | `object` | - | Aggregation value for Insight fields | `@Field.Prop(() => Int, { accumulate: { $sum: 1 } }) count: number;` |
|
|
319
|
+
| `example` | `any` | - | Example value for API docs | `@Field.Prop(()=> String, { example: "contact@akanjs.com" }) email;` |
|
|
320
|
+
| `of` | `any` | - | Value type for Map fields | `@Field.Prop(()=> Map, { of: Date }) readAts: Map<string, Dayjs>;` |
|
|
321
|
+
| `validate` | `(value) => boolean` | - | Custom validation function | `@Field.Prop(()=> String, { validate: (v)=> v.includes("@") }) email;` |
|
|
322
|
+
|
|
323
|
+
## Advanced Field Types
|
|
324
|
+
|
|
325
|
+
```mermaid
|
|
326
|
+
graph LR
|
|
327
|
+
Prop[Field.Prop] -->|General purpose| Standard
|
|
328
|
+
Hidden[Field.Hidden] -->|Backend only| Restricted
|
|
329
|
+
Secret[Field.Secret] -->|Security restricted| Sensitive
|
|
330
|
+
Resolve[Field.Resolve] -->|Computed| Virtual
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
1. **Field.Prop**
|
|
334
|
+
General schema field declaration, visible in both backend and frontend
|
|
335
|
+
|
|
336
|
+
```typescript
|
|
337
|
+
@Field.Prop(() => String)
|
|
338
|
+
name: string;
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
2. **Field.Hidden**
|
|
342
|
+
Backend-only fields, restricted in frontend for security
|
|
343
|
+
|
|
344
|
+
```typescript
|
|
345
|
+
@Field.Hidden(() => String)
|
|
346
|
+
internalCode: string;
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
3. **Field.Secret**
|
|
350
|
+
Security-sensitive fields with query restrictions
|
|
351
|
+
|
|
352
|
+
```typescript
|
|
353
|
+
@Field.Secret(() => String)
|
|
354
|
+
apiKey: string;
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
4. **Field.Resolve**
|
|
358
|
+
Computed fields not stored in database
|
|
359
|
+
```typescript
|
|
360
|
+
@Field.Resolve(() => Int)
|
|
361
|
+
get total() { return this.items.length }
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
## Advanced - Relation Patterns
|
|
365
|
+
|
|
366
|
+
### 1. Scalar Embedded Style
|
|
367
|
+
|
|
368
|
+
```typescript
|
|
369
|
+
export class DronePhysicalState {
|
|
370
|
+
@Field.Prop(() => [Float], { default: [0, 0, 0] })
|
|
371
|
+
rpy: [number, number, number];
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
export class DroneObject {
|
|
375
|
+
@Field.Prop(() => DronePhysicalState)
|
|
376
|
+
physicalState: DronePhysicalState;
|
|
377
|
+
}
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
### 2. Reference ID Style
|
|
381
|
+
|
|
382
|
+
```typescript
|
|
383
|
+
export class MissionInput {
|
|
384
|
+
@Field.Prop(() => ID, { ref: "drone" })
|
|
385
|
+
drone: string;
|
|
386
|
+
}
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
### 3. Resolved Reference Style
|
|
390
|
+
|
|
391
|
+
```typescript
|
|
392
|
+
export class DroneObject {
|
|
393
|
+
@Field.Prop(() => LightMission, { nullable: true })
|
|
394
|
+
mission: LightMission | null;
|
|
395
|
+
}
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
**Important**: Avoid circular dependencies by importing directly from constant files:
|
|
399
|
+
|
|
400
|
+
```typescript
|
|
401
|
+
// Correct
|
|
402
|
+
import { LightMission } from "../mission/mission.constant";
|
|
403
|
+
|
|
404
|
+
// Incorrect
|
|
405
|
+
import { LightMission } from "../cnst_";
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
## Best Practices for Maintainable Models
|
|
409
|
+
|
|
410
|
+
1. **Consistent Naming**:
|
|
411
|
+
|
|
412
|
+
- Input: `DroneInput`
|
|
413
|
+
- Object: `DroneObject`
|
|
414
|
+
- Light: `LightDrone`
|
|
415
|
+
- Query: `droneQuery`
|
|
416
|
+
- Sort: `droneSort`
|
|
417
|
+
|
|
418
|
+
2. **Reference Handling**:
|
|
419
|
+
|
|
420
|
+
- Use Light models for references
|
|
421
|
+
- Avoid circular dependencies
|
|
422
|
+
- Prefer direct imports over barrel files
|
|
423
|
+
|
|
424
|
+
3. **Field Design**:
|
|
425
|
+
|
|
426
|
+
- Use proper field types (Prop, Hidden, Secret, Resolve)
|
|
427
|
+
- Set appropriate defaults (especially for arrays)
|
|
428
|
+
- Add validation where needed
|
|
429
|
+
|
|
430
|
+
4. **Performance Optimization**:
|
|
431
|
+
|
|
432
|
+
- Use Light models for list queries
|
|
433
|
+
- Keep Insight/Summary models lean
|
|
434
|
+
- Use appropriate indexes for queries
|
|
435
|
+
|
|
436
|
+
5. **Documentation**:
|
|
437
|
+
- Comment complex fields
|
|
438
|
+
- Explain non-obvious relationships
|
|
439
|
+
- Document query/sort usage patterns
|
|
440
|
+
|
|
441
|
+
## Complete Example
|
|
442
|
+
|
|
443
|
+
```typescript
|
|
444
|
+
import { ID, Int, String } from "akanjs/base";
|
|
445
|
+
import { Field, Model } from "akanjs/constant";
|
|
446
|
+
|
|
447
|
+
// Input Model
|
|
448
|
+
|
|
449
|
+
export class DroneInput {
|
|
450
|
+
@Field.Prop(() => String)
|
|
451
|
+
name: string;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
// Object Model
|
|
455
|
+
|
|
456
|
+
export class DroneObject extends BaseModel(DroneInput) {
|
|
457
|
+
@Field.Prop(() => String, { enum: ["active", "offline"], default: "offline" })
|
|
458
|
+
status: string;
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
// Light Model
|
|
462
|
+
|
|
463
|
+
export class LightDrone extends Light(DroneObject, ["id", "name", "status"] as const) {
|
|
464
|
+
isConnected() {
|
|
465
|
+
return this.status === "active";
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
// Full Model
|
|
470
|
+
|
|
471
|
+
export class Drone extends Full(DroneObject, LightDrone) {
|
|
472
|
+
isAvailable() {
|
|
473
|
+
return this.isConnected() && this.battery > 20;
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
// Insight Model
|
|
478
|
+
|
|
479
|
+
export class DroneInsight {
|
|
480
|
+
@Field.Prop(() => Int, { accumulate: { $sum: 1 } })
|
|
481
|
+
count: number;
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
// Query Model
|
|
485
|
+
export const droneQuery = {
|
|
486
|
+
byStatus: (status: string) => ({ status }),
|
|
487
|
+
};
|
|
488
|
+
|
|
489
|
+
// Sort Model
|
|
490
|
+
export const droneSort = {
|
|
491
|
+
byName: { name: 1 },
|
|
492
|
+
};
|
|
493
|
+
```
|
|
494
|
+
|
|
495
|
+
## Summary Checklist
|
|
496
|
+
|
|
497
|
+
1. [ ] Implement all required model types (Input, Object, Light, Full, Insight, Summary, Query, Sort)
|
|
498
|
+
2. [ ] Define field options properly (nullable, ref, default, etc.)
|
|
499
|
+
3. [ ] Add necessary validation rules
|
|
500
|
+
4. [ ] Implement relation patterns where needed
|
|
501
|
+
5. [ ] Use proper field types (Prop, Hidden, Secret, Resolve)
|
|
502
|
+
6. [ ] Add convenience functions to Light/Full models
|
|
503
|
+
7. [ ] Prevent circular dependencies in references
|
|
504
|
+
8. [ ] Add comprehensive JSDoc comments
|
|
505
|
+
9. [ ] Verify all examples in usage contexts
|
|
506
|
+
10. [ ] Test query/sort functionality
|