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
|
@@ -0,0 +1,612 @@
|
|
|
1
|
+
# Database Module in Akan.js
|
|
2
|
+
|
|
3
|
+
## Purpose of Database Modules
|
|
4
|
+
|
|
5
|
+
Database modules in Akan.js provide a structured approach to building domain-specific features with seamless integration between server and client:
|
|
6
|
+
|
|
7
|
+
1. **Domain Encapsulation**: Encapsulate all domain-specific logic (models, services, signals) in a consistent structure
|
|
8
|
+
2. **Full-Stack Integration**: Enable seamless integration between MongoDB, NestJS server, and React client
|
|
9
|
+
3. **Type Safety**: Ensure type safety across the entire stack with auto-generated GraphQL types
|
|
10
|
+
4. **Automated CRUD**: Provide automatic CRUD operations through standardized patterns
|
|
11
|
+
5. **Real-time Capabilities**: Support for websockets, GraphQL subscriptions, and background processing
|
|
12
|
+
6. **Security**: Implement role-based access control and validation at every level
|
|
13
|
+
|
|
14
|
+
## File Structure and Location Conventions
|
|
15
|
+
|
|
16
|
+
A complete database module follows this structure:
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
libs/shared/lib/[module-name]/
|
|
20
|
+
├── [ModuleName].Template.tsx // Form components
|
|
21
|
+
├── [ModuleName].Unit.tsx // Card/list view components
|
|
22
|
+
├── [ModuleName].Util.tsx // Utility components (dashboard, insights)
|
|
23
|
+
├── [ModuleName].View.tsx // Single item view components
|
|
24
|
+
├── [ModuleName].Zone.tsx // Main zone layout and routing
|
|
25
|
+
├── [module-name].constant.ts // Model definitions
|
|
26
|
+
├── [module-name].dictionary.ts // Translations
|
|
27
|
+
├── [module-name].document.ts // Database schema
|
|
28
|
+
├── [module-name].service.ts // Business logic
|
|
29
|
+
├── [module-name].signal.ts // API endpoints
|
|
30
|
+
├── [module-name].store.ts // Client state management
|
|
31
|
+
└── index.tsx // Module exports
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## How to Create Database Modules
|
|
35
|
+
|
|
36
|
+
### 1. Define Model Schema (`[module-name].constant.ts`)
|
|
37
|
+
|
|
38
|
+
Start by defining your data model schema using the decorator pattern:
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
import { Dayjs, dayjs, enumOf, Int } from "akanjs/base";
|
|
42
|
+
import { Field, Filter, Model, sortOf, via } from "akanjs/constant";
|
|
43
|
+
import { validate } from "@libs/util/common";
|
|
44
|
+
|
|
45
|
+
// Define enums
|
|
46
|
+
export const UserRole = enumOf(["user", "admin"] as const);
|
|
47
|
+
export type UserRole = enumOf<typeof UserRole>;
|
|
48
|
+
|
|
49
|
+
// Define input model (for create/update operations)
|
|
50
|
+
|
|
51
|
+
export class UserInput {
|
|
52
|
+
@Field.Prop(() => String, { validate: validate.email, type: "email", example: "user@example.com" })
|
|
53
|
+
email: string;
|
|
54
|
+
|
|
55
|
+
@Field.Secret(() => String, { nullable: true, type: "password", example: "password123" })
|
|
56
|
+
password: string | null;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Define object model (full data model)
|
|
60
|
+
|
|
61
|
+
export class UserObject extends via(UserInput) {
|
|
62
|
+
@Field.Prop(() => [String], [{ enum: UserRole, example: ["user"] }])
|
|
63
|
+
roles: (typeof UserRole.value)[];
|
|
64
|
+
|
|
65
|
+
@Field.Prop(() => Date, { default: () => dayjs(), example: dayjs() })
|
|
66
|
+
lastLoginAt: Dayjs;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Define light model (client-side model with essential fields)
|
|
70
|
+
|
|
71
|
+
export class LightUser extends via(UserObject, ["email", "roles"] as const) {
|
|
72
|
+
hasAccess(role: UserRole) {
|
|
73
|
+
return this.roles.includes(role);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Define full model (server-side model with all fields)
|
|
78
|
+
|
|
79
|
+
export class User extends via(UserObject, LightUser) {}
|
|
80
|
+
|
|
81
|
+
// Define filter model (for queries)
|
|
82
|
+
|
|
83
|
+
export class UserFilter extends sortOf(User, {}) {
|
|
84
|
+
@Filter.Mongo()
|
|
85
|
+
byEmail(@Filter.Arg("email", () => String) email: string) {
|
|
86
|
+
return { email };
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### 2. Implement Database Schema (`[module-name].document.ts`)
|
|
92
|
+
|
|
93
|
+
Create the MongoDB schema with document methods and middleware:
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
import { dayjs } from "akanjs/base";
|
|
97
|
+
import { beyond, by, Database, into, Loader, type SchemaOf } from "akanjs/document";
|
|
98
|
+
import { hashPassword } from "@libs/shared/server";
|
|
99
|
+
|
|
100
|
+
import * as cnst from "../cnst";
|
|
101
|
+
|
|
102
|
+
// Document model with methods
|
|
103
|
+
|
|
104
|
+
export class User extends by(cnst.User) {
|
|
105
|
+
addRole(role: cnst.UserRole) {
|
|
106
|
+
if (!this.roles.includes(role)) this.roles = [...this.roles, role];
|
|
107
|
+
return this;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
updateLastLogin() {
|
|
111
|
+
this.lastLoginAt = dayjs();
|
|
112
|
+
return this;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Model with database operations
|
|
117
|
+
|
|
118
|
+
export class UserModel extends into(User, cnst.userCnst, ...user.models) {
|
|
119
|
+
@Loader.ByField("email") userEmailLoader: Loader<string, User>;
|
|
120
|
+
|
|
121
|
+
async findByEmail(email: string) {
|
|
122
|
+
return this.User.findOne({ email, removedAt: { $exists: false } });
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
async getUserSecret(email: string) {
|
|
126
|
+
return this.User.pickOne({ email, removedAt: { $exists: false } }, { roles: true, password: true });
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### 3. Create Service (`[module-name].service.ts`)
|
|
134
|
+
|
|
135
|
+
Implement business logic in the service:
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
import { DbService, Srv, Use } from "akanjs/service";
|
|
139
|
+
import { Account, type Me } from "akanjs/signal";
|
|
140
|
+
import { isPasswordMatch } from "@libs/shared/server";
|
|
141
|
+
|
|
142
|
+
import * as cnst from "../cnst";
|
|
143
|
+
import * as db from "../db";
|
|
144
|
+
import type * as option from "../option";
|
|
145
|
+
import type * as srv from "../srv";
|
|
146
|
+
|
|
147
|
+
export class UserService extends DbService(db.userDb) {
|
|
148
|
+
@Use() protected readonly config: option.SecurityConfig;
|
|
149
|
+
@Srv() protected readonly securityService: srv.util.SecurityService;
|
|
150
|
+
|
|
151
|
+
async signin(email: string, password: string, account?: Account) {
|
|
152
|
+
const userSecret = await this.userModel.getUserSecret(email);
|
|
153
|
+
if (!userSecret) throw new Error("User not found");
|
|
154
|
+
|
|
155
|
+
const matched = await isPasswordMatch(password, userSecret.password || "");
|
|
156
|
+
if (!matched) throw new Error("Invalid credentials");
|
|
157
|
+
|
|
158
|
+
const user = await this.userModel.getUser(userSecret.id);
|
|
159
|
+
await user.updateLastLogin().save();
|
|
160
|
+
|
|
161
|
+
return this.securityService.addJwt({ me: user }, account);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
async addRole(userId: string, role: cnst.UserRole) {
|
|
165
|
+
const user = await this.userModel.getUser(userId);
|
|
166
|
+
return await user.addRole(role).save();
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
async createUser(data: db.UserInput) {
|
|
170
|
+
const existingUser = await this.userModel.findByEmail(data.email);
|
|
171
|
+
if (existingUser) throw new Error("User already exists");
|
|
172
|
+
|
|
173
|
+
const user = await this.userModel.createUser(data);
|
|
174
|
+
return await user.set({ roles: ["user"] }).save();
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### 4. Create Signal (`[module-name].signal.ts`)
|
|
180
|
+
|
|
181
|
+
Define GraphQL operations in the signal:
|
|
182
|
+
|
|
183
|
+
```typescript
|
|
184
|
+
import { ID } from "akanjs/base";
|
|
185
|
+
import { Account, Arg, DbSignal, Me, Mutation, Query, resolve, Signal } from "akanjs/signal";
|
|
186
|
+
|
|
187
|
+
import * as cnst from "../cnst";
|
|
188
|
+
import type * as db from "../db";
|
|
189
|
+
|
|
190
|
+
export class UserSignal extends DbSignal(cnst.userCnst, cnst.Srvs, {
|
|
191
|
+
guards: { root: Admin, get: Query.Public, cru: Mutation.Admin },
|
|
192
|
+
}) {
|
|
193
|
+
@Mutation.Public(() => cnst.util.AccessToken)
|
|
194
|
+
async signin(
|
|
195
|
+
@Arg.Body("email", () => String, { example: "user@example.com" }) email: string,
|
|
196
|
+
@Arg.Body("password", () => String, { example: "password123" }) password: string,
|
|
197
|
+
@Account() account: Account
|
|
198
|
+
) {
|
|
199
|
+
const accessToken = await this.userService.signin(email, password, account);
|
|
200
|
+
return resolve<cnst.util.AccessToken>(accessToken);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
@Query.User(() => cnst.User)
|
|
204
|
+
async me(@Me() me: Me) {
|
|
205
|
+
const user = await this.userService.getUser(me.id);
|
|
206
|
+
return resolve<cnst.User>(user);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
@Mutation.Admin(() => cnst.User)
|
|
210
|
+
async createUser(@Arg.Body("data", () => cnst.UserInput) data: db.UserInput) {
|
|
211
|
+
const user = await this.userService.createUser(data);
|
|
212
|
+
return resolve<cnst.User>(user);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
@Mutation.Admin(() => cnst.User)
|
|
216
|
+
async addUserRole(
|
|
217
|
+
@Arg.Param("userId", () => ID) userId: string,
|
|
218
|
+
@Arg.Body("role", () => String) role: cnst.UserRole
|
|
219
|
+
) {
|
|
220
|
+
const user = await this.userService.addRole(userId, role);
|
|
221
|
+
return resolve<cnst.User>(user);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### 5. Create Store (`[module-name].store.ts`)
|
|
227
|
+
|
|
228
|
+
Implement client-side state management:
|
|
229
|
+
|
|
230
|
+
```typescript
|
|
231
|
+
import { StateCreator } from "zustand";
|
|
232
|
+
import { immer } from "zustand/middleware/immer";
|
|
233
|
+
|
|
234
|
+
import * as cnst from "../cnst";
|
|
235
|
+
import * as fetch from "../sig";
|
|
236
|
+
|
|
237
|
+
export interface UserState {
|
|
238
|
+
users: cnst.User[];
|
|
239
|
+
selectedUser?: cnst.User;
|
|
240
|
+
userForm: cnst.UserInput;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
export interface UserAction {
|
|
244
|
+
setUsers: (users: cnst.User[]) => void;
|
|
245
|
+
selectUser: (user?: cnst.User) => void;
|
|
246
|
+
setUserForm: (form: Partial<cnst.UserInput>) => void;
|
|
247
|
+
resetUserForm: () => void;
|
|
248
|
+
signin: () => Promise<void>;
|
|
249
|
+
createUser: () => Promise<void>;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
export type UserStore = UserState & UserAction;
|
|
253
|
+
|
|
254
|
+
export const createUserStore: StateCreator<UserStore, [["zustand/immer", never]], [], UserStore> = immer(
|
|
255
|
+
(set, get) => ({
|
|
256
|
+
users: [],
|
|
257
|
+
userForm: { email: "", password: null },
|
|
258
|
+
|
|
259
|
+
setUsers: (users) =>
|
|
260
|
+
set((state) => {
|
|
261
|
+
state.users = users;
|
|
262
|
+
}),
|
|
263
|
+
selectUser: (user) =>
|
|
264
|
+
set((state) => {
|
|
265
|
+
state.selectedUser = user;
|
|
266
|
+
}),
|
|
267
|
+
setUserForm: (form) =>
|
|
268
|
+
set((state) => {
|
|
269
|
+
state.userForm = { ...state.userForm, ...form };
|
|
270
|
+
}),
|
|
271
|
+
resetUserForm: () =>
|
|
272
|
+
set((state) => {
|
|
273
|
+
state.userForm = { email: "", password: null };
|
|
274
|
+
}),
|
|
275
|
+
|
|
276
|
+
signin: async () => {
|
|
277
|
+
const { email, password } = get().userForm;
|
|
278
|
+
if (!password) return;
|
|
279
|
+
await fetch.user.signin(email, password);
|
|
280
|
+
get().resetUserForm();
|
|
281
|
+
},
|
|
282
|
+
|
|
283
|
+
createUser: async () => {
|
|
284
|
+
const { userForm } = get();
|
|
285
|
+
const user = await fetch.user.createUser({ data: userForm });
|
|
286
|
+
set((state) => {
|
|
287
|
+
state.users = [...state.users, user];
|
|
288
|
+
state.userForm = { email: "", password: null };
|
|
289
|
+
});
|
|
290
|
+
},
|
|
291
|
+
})
|
|
292
|
+
);
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
### 6. Create Dictionary (`[module-name].dictionary.ts`)
|
|
296
|
+
|
|
297
|
+
Define internationalization strings:
|
|
298
|
+
|
|
299
|
+
```typescript
|
|
300
|
+
export const userDict = {
|
|
301
|
+
email: {
|
|
302
|
+
ko: "이메일",
|
|
303
|
+
en: "Email",
|
|
304
|
+
},
|
|
305
|
+
password: {
|
|
306
|
+
ko: "비밀번호",
|
|
307
|
+
en: "Password",
|
|
308
|
+
},
|
|
309
|
+
signin: {
|
|
310
|
+
ko: "로그인",
|
|
311
|
+
en: "Sign In",
|
|
312
|
+
},
|
|
313
|
+
user_list: {
|
|
314
|
+
ko: "사용자 목록",
|
|
315
|
+
en: "User List",
|
|
316
|
+
},
|
|
317
|
+
add_user: {
|
|
318
|
+
ko: "사용자 추가",
|
|
319
|
+
en: "Add User",
|
|
320
|
+
},
|
|
321
|
+
};
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
### 7. Create UI Components
|
|
325
|
+
|
|
326
|
+
#### Template Component (`[ModuleName].Template.tsx`)
|
|
327
|
+
|
|
328
|
+
```tsx
|
|
329
|
+
import { Button } from "akanjs/ui";
|
|
330
|
+
|
|
331
|
+
import { dict } from "../dict";
|
|
332
|
+
import { st } from "../st";
|
|
333
|
+
|
|
334
|
+
export const General = () => {
|
|
335
|
+
const { userForm } = st.use.userForm();
|
|
336
|
+
|
|
337
|
+
return (
|
|
338
|
+
// WIP
|
|
339
|
+
);
|
|
340
|
+
};
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
#### Unit Component (`[ModuleName].Unit.tsx`)
|
|
344
|
+
|
|
345
|
+
```tsx
|
|
346
|
+
import { Card, ModelProps } from "@libs/util/ui";
|
|
347
|
+
|
|
348
|
+
export const UserCard = ({ user }: ModelProps<"user">) => (
|
|
349
|
+
<Card>
|
|
350
|
+
<Card.Title>{user.email}</Card.Title>
|
|
351
|
+
<Card.Content>
|
|
352
|
+
<div>Roles: {user.roles.join(", ")}</div>
|
|
353
|
+
</Card.Content>
|
|
354
|
+
</Card>
|
|
355
|
+
);
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
#### View Component (`[ModuleName].View.tsx`)
|
|
359
|
+
|
|
360
|
+
```tsx
|
|
361
|
+
import { useEffect } from "react";
|
|
362
|
+
import { Container, ListContainer } from "@libs/util/ui";
|
|
363
|
+
|
|
364
|
+
import * as Unit from "./User.Unit";
|
|
365
|
+
import * as Template from "./User.Template";
|
|
366
|
+
import { st } from "../st";
|
|
367
|
+
import { sig } from "../sig";
|
|
368
|
+
|
|
369
|
+
export const List = () => {
|
|
370
|
+
const { users } = st.use.user();
|
|
371
|
+
|
|
372
|
+
useEffect(() => {
|
|
373
|
+
void sig.user.getUsers().then((data) => {
|
|
374
|
+
st.do.user().setUsers(data.users);
|
|
375
|
+
});
|
|
376
|
+
}, []);
|
|
377
|
+
|
|
378
|
+
return (
|
|
379
|
+
<Container>
|
|
380
|
+
<ListContainer items={users} renderItem={(user) => <Unit.UserCard user={user} />} emptyText="No users found" />
|
|
381
|
+
</Container>
|
|
382
|
+
);
|
|
383
|
+
};
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
#### Zone Component (`[ModuleName].Zone.tsx`)
|
|
387
|
+
|
|
388
|
+
```tsx
|
|
389
|
+
import { Zone } from "@libs/util/ui";
|
|
390
|
+
|
|
391
|
+
import * as View from "./User.View";
|
|
392
|
+
import * as Template from "./User.Template";
|
|
393
|
+
import { dict } from "../dict";
|
|
394
|
+
|
|
395
|
+
export const User = () => (
|
|
396
|
+
<Zone title={dict.user.user_list}>
|
|
397
|
+
<Zone.Section title={dict.user.add_user}>
|
|
398
|
+
<Template.General />
|
|
399
|
+
</Zone.Section>
|
|
400
|
+
<Zone.Section>
|
|
401
|
+
<View.List />
|
|
402
|
+
</Zone.Section>
|
|
403
|
+
</Zone>
|
|
404
|
+
);
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
#### Client Exports (`index.tsx`)
|
|
408
|
+
|
|
409
|
+
```tsx
|
|
410
|
+
import { Signal } from "akanjs/ui";
|
|
411
|
+
import { FaUser } from "react-icons/fa";
|
|
412
|
+
|
|
413
|
+
import * as Template from "./User.Template";
|
|
414
|
+
import * as Unit from "./User.Unit";
|
|
415
|
+
import * as Util from "./User.Util";
|
|
416
|
+
import * as View from "./User.View";
|
|
417
|
+
import * as Zone from "./User.Zone";
|
|
418
|
+
|
|
419
|
+
export const User = {
|
|
420
|
+
Menu: {
|
|
421
|
+
User: {
|
|
422
|
+
key: "user",
|
|
423
|
+
label: "Users",
|
|
424
|
+
icon: <FaUser />,
|
|
425
|
+
render: () => <Zone.User />,
|
|
426
|
+
},
|
|
427
|
+
},
|
|
428
|
+
Template,
|
|
429
|
+
Unit,
|
|
430
|
+
Util,
|
|
431
|
+
View,
|
|
432
|
+
Zone,
|
|
433
|
+
};
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
## How to Use Database Modules in Nest.js Server
|
|
437
|
+
|
|
438
|
+
### 1. Register Module in Server Bootstrap
|
|
439
|
+
|
|
440
|
+
In your server bootstrap file:
|
|
441
|
+
|
|
442
|
+
```typescript
|
|
443
|
+
import { createNestApp } from "akanjs/server";
|
|
444
|
+
|
|
445
|
+
====== outdated, ned to be rewrited ======
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
### 2. Using Services in Controllers or Other Services
|
|
449
|
+
|
|
450
|
+
```typescript
|
|
451
|
+
import { Controller, Get } from "@nestjs/common";
|
|
452
|
+
import { UserService } from "./user/user.service";
|
|
453
|
+
|
|
454
|
+
@Controller("auth")
|
|
455
|
+
export class AuthController {
|
|
456
|
+
constructor(private readonly userService: UserService) {}
|
|
457
|
+
|
|
458
|
+
@Get("users")
|
|
459
|
+
async getUsers() {
|
|
460
|
+
return this.userService.getUsers({});
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
## How to Use Components, Stores, and Signals in Client Side
|
|
466
|
+
|
|
467
|
+
### 1. Using Components in Pages
|
|
468
|
+
|
|
469
|
+
```tsx
|
|
470
|
+
import { User } from "@libs/shared/lib/user";
|
|
471
|
+
|
|
472
|
+
export default function UserPage() {
|
|
473
|
+
return (
|
|
474
|
+
<main>
|
|
475
|
+
<User.Zone.User />
|
|
476
|
+
</main>
|
|
477
|
+
);
|
|
478
|
+
}
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
### 2. Using Stores for State Management
|
|
482
|
+
|
|
483
|
+
```tsx
|
|
484
|
+
import { st } from "@libs/shared/client";
|
|
485
|
+
|
|
486
|
+
const UserComponent = () => {
|
|
487
|
+
const { users, selectedUser } = st.use.user();
|
|
488
|
+
const { selectUser, setUsers } = st.do.user();
|
|
489
|
+
|
|
490
|
+
// Use the store state and actions
|
|
491
|
+
return (
|
|
492
|
+
<div>
|
|
493
|
+
{users.map((user) => (
|
|
494
|
+
<div key={user.id} onClick={() => selectUser(user)} className={selectedUser?.id === user.id ? "selected" : ""}>
|
|
495
|
+
{user.email}
|
|
496
|
+
</div>
|
|
497
|
+
))}
|
|
498
|
+
</div>
|
|
499
|
+
);
|
|
500
|
+
};
|
|
501
|
+
```
|
|
502
|
+
|
|
503
|
+
### 3. Using Signals for API Calls
|
|
504
|
+
|
|
505
|
+
```tsx
|
|
506
|
+
import { useEffect, useState } from "react";
|
|
507
|
+
import { sig } from "@libs/shared/client";
|
|
508
|
+
|
|
509
|
+
const UserData = () => {
|
|
510
|
+
const [loading, setLoading] = useState(true);
|
|
511
|
+
const [error, setError] = useState<string | null>(null);
|
|
512
|
+
|
|
513
|
+
useEffect(() => {
|
|
514
|
+
setLoading(true);
|
|
515
|
+
sig.user
|
|
516
|
+
.getUsers()
|
|
517
|
+
.then((data) => {
|
|
518
|
+
st.do.user().setUsers(data.users);
|
|
519
|
+
setLoading(false);
|
|
520
|
+
})
|
|
521
|
+
.catch((err) => {
|
|
522
|
+
setError(err.message);
|
|
523
|
+
setLoading(false);
|
|
524
|
+
});
|
|
525
|
+
}, []);
|
|
526
|
+
|
|
527
|
+
if (loading) return <div>Loading...</div>;
|
|
528
|
+
if (error) return <div>Error: {error}</div>;
|
|
529
|
+
|
|
530
|
+
return <User.View.List />;
|
|
531
|
+
};
|
|
532
|
+
```
|
|
533
|
+
|
|
534
|
+
### 4. Integrating with Menu System
|
|
535
|
+
|
|
536
|
+
```tsx
|
|
537
|
+
import { AppLayout } from "@libs/util/ui";
|
|
538
|
+
import { User } from "@libs/shared/lib/user";
|
|
539
|
+
import { Admin } from "@libs/shared/lib/admin";
|
|
540
|
+
|
|
541
|
+
export const Layout = () => (
|
|
542
|
+
<AppLayout
|
|
543
|
+
pageMenus={[
|
|
544
|
+
{
|
|
545
|
+
key: "users",
|
|
546
|
+
title: "User Management",
|
|
547
|
+
menus: User.Menu,
|
|
548
|
+
},
|
|
549
|
+
{
|
|
550
|
+
key: "admin",
|
|
551
|
+
title: "Administration",
|
|
552
|
+
menus: Admin.Menu,
|
|
553
|
+
},
|
|
554
|
+
]}
|
|
555
|
+
/>
|
|
556
|
+
);
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
## Best Practices
|
|
560
|
+
|
|
561
|
+
1. **Naming Conventions**
|
|
562
|
+
|
|
563
|
+
- Use PascalCase for classes and components (e.g., `UserService`, `User.Unit.tsx`)
|
|
564
|
+
- Use camelCase for files (e.g., `user.service.ts`, `user.document.ts`)
|
|
565
|
+
|
|
566
|
+
2. **Security**
|
|
567
|
+
|
|
568
|
+
- Use `@Field.Secret` for sensitive data like passwords
|
|
569
|
+
- Apply proper permission guards to queries and mutations (`@Query.Admin`, `@Mutation.Public`)
|
|
570
|
+
- Validate input data using the `validate` option in `@Field.Prop`
|
|
571
|
+
|
|
572
|
+
3. **Code Organization**
|
|
573
|
+
|
|
574
|
+
- Keep business logic in service files
|
|
575
|
+
- Use signals for API calls only, not for business logic
|
|
576
|
+
- Define reusable utility methods in document models
|
|
577
|
+
|
|
578
|
+
4. **Performance**
|
|
579
|
+
|
|
580
|
+
- Use dataloader pattern (`@Loader.ByField`) for efficient database access
|
|
581
|
+
- Create proper indexes in the middleware
|
|
582
|
+
- Use projections to limit returned fields when appropriate
|
|
583
|
+
|
|
584
|
+
5. **Testing**
|
|
585
|
+
|
|
586
|
+
- Create signal tests for each API endpoint
|
|
587
|
+
- Mock services for unit testing signals
|
|
588
|
+
- Use integration tests for testing complex workflows
|
|
589
|
+
|
|
590
|
+
6. **UI Components**
|
|
591
|
+
|
|
592
|
+
- Follow the separation between Template, Unit, View, and Zone components
|
|
593
|
+
- Make components reusable across different parts of the application
|
|
594
|
+
- Use dictionary files for all UI text to support internationalization
|
|
595
|
+
|
|
596
|
+
7. **Real-time Features**
|
|
597
|
+
- Use GraphQL subscriptions for real-time updates
|
|
598
|
+
- Use WebSockets for bidirectional communication
|
|
599
|
+
- Use Bull queues for background processing
|
|
600
|
+
|
|
601
|
+
## Data Flow in Database Modules
|
|
602
|
+
|
|
603
|
+
1. **User Interaction** → User interacts with a component (e.g., submits a form)
|
|
604
|
+
2. **Store Action** → Action in store is triggered (e.g., `st.do.user().signin()`)
|
|
605
|
+
3. **Signal Call** → Signal method is called (e.g., `sig.user.signin()`)
|
|
606
|
+
4. **GraphQL Request** → GraphQL request is sent to the server
|
|
607
|
+
5. **Resolver** → NestJS resolver (generated from Signal) handles the request
|
|
608
|
+
6. **Service** → Service method processes the business logic
|
|
609
|
+
7. **Database** → Database operations are performed
|
|
610
|
+
8. **Response** → Result is returned through the GraphQL API
|
|
611
|
+
9. **Store Update** → Client state is updated based on the response
|
|
612
|
+
10. **UI Update** → Components re-render with the updated state
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "How to create doc page",
|
|
3
|
+
"description": "How to create documentation page of Akan.js framework",
|
|
4
|
+
"scans": [
|
|
5
|
+
{
|
|
6
|
+
"type": "example",
|
|
7
|
+
"description": "Example of a system architecture documentation page",
|
|
8
|
+
"path": "apps/angelo/page/akanjs/(docs)/docs/systemArch/frontend/_index.tsx"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"type": "example",
|
|
12
|
+
"description": "Example of a module documentation page with API reference",
|
|
13
|
+
"path": "apps/angelo/page/akanjs/(docs)/docs/module/signal/_index.tsx"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"type": "source",
|
|
17
|
+
"description": "Documentation utility components",
|
|
18
|
+
"path": "apps/angelo/ui/Docs/index.ts"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"type": "source",
|
|
22
|
+
"description": "Code snippet component for syntax highlighting",
|
|
23
|
+
"path": "apps/angelo/ui/Docs/CodeSnippet.tsx"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"type": "source",
|
|
27
|
+
"description": "Title component for main headings",
|
|
28
|
+
"path": "apps/angelo/ui/Docs/Title.tsx"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"type": "source",
|
|
32
|
+
"description": "Description component for explanatory text",
|
|
33
|
+
"path": "apps/angelo/ui/Docs/Description.tsx"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"type": "source",
|
|
37
|
+
"description": "Option table component for displaying parameters",
|
|
38
|
+
"path": "apps/angelo/ui/Docs/OptionTable.tsx"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"type": "source",
|
|
42
|
+
"description": "Introduction table component for listing features",
|
|
43
|
+
"path": "apps/angelo/ui/Docs/IntroTable.tsx"
|
|
44
|
+
}
|
|
45
|
+
],
|
|
46
|
+
"update": {
|
|
47
|
+
"filePath": "./docPageRule.instruction.md",
|
|
48
|
+
"contents": [
|
|
49
|
+
"Purpose of doc page in Akan.js",
|
|
50
|
+
"How to create doc page",
|
|
51
|
+
"Page organization and structure",
|
|
52
|
+
"Utility components",
|
|
53
|
+
"Best practices for documentation",
|
|
54
|
+
"Internationalization guidelines",
|
|
55
|
+
"Code example guidelines",
|
|
56
|
+
"Complete example implementation",
|
|
57
|
+
"Troubleshooting common issues"
|
|
58
|
+
],
|
|
59
|
+
"rules": [
|
|
60
|
+
"Docs.Layout is already set on the top of layout.tsx file in the root of the project, so you don't need to use it in your page",
|
|
61
|
+
"Docs utility should be used with `Docs` prefix, like <Docs.Title>, do not use object destructuring",
|
|
62
|
+
"Always wrap user-facing text in l.trans() with at least English and Korean translations",
|
|
63
|
+
"Use a logical hierarchy of headings (Title → SubTitle → SubSubTitle)",
|
|
64
|
+
"Include a divider (<div className=\"divider\"></div>) between major sections",
|
|
65
|
+
"For long pages, use anchor links with hidden divs for navigation",
|
|
66
|
+
"Code examples should be realistic and include proper comments",
|
|
67
|
+
"Tables should use the appropriate type (OptionTable for parameters, IntroTable for features)",
|
|
68
|
+
"Always specify the correct language for CodeSnippet components"
|
|
69
|
+
]
|
|
70
|
+
},
|
|
71
|
+
"page": "/akanjs/(docs)/docs/[category]/[pageName]/_index"
|
|
72
|
+
}
|