akanjs 0.0.1 → 2.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CODE_OF_CONDUCT.md +54 -0
- package/CONTRIBUTING.md +83 -0
- package/LICENSE +21 -0
- package/README.ko.md +244 -0
- package/README.md +237 -6
- package/base/base.ts +194 -0
- package/base/baseEnv.ts +162 -0
- package/base/index.ts +6 -0
- package/base/primitiveRegistry.ts +342 -0
- package/base/symbols.ts +11 -0
- package/base/types.ts +137 -0
- package/base/utils.ts +30 -0
- package/cli/application/application.command.ts +213 -0
- package/cli/application/application.interface.tsx +225 -0
- package/cli/application/application.runner.ts +359 -0
- package/cli/application/application.script.ts +244 -0
- package/cli/build.ts +25 -0
- package/cli/cloud/cloud.command.ts +48 -0
- package/cli/cloud/cloud.runner.ts +158 -0
- package/cli/cloud/cloud.script.ts +40 -0
- package/cli/guideline/guideline.command.ts +31 -0
- package/cli/guideline/guideline.prompt.ts +212 -0
- package/cli/guideline/guideline.runner.ts +53 -0
- package/cli/guideline/guideline.script.ts +33 -0
- package/cli/guidelines/___library/sharedUiStructureDescription.en.md +767 -0
- package/cli/guidelines/___library/utilUiStructureDescription.en.md +395 -0
- package/cli/guidelines/___lint/lintRuleDescription.en.md +64 -0
- package/cli/guidelines/___module/moduleStructureDescription.en.md +80 -0
- package/cli/guidelines/componentRule/componentRule.generate.json +131 -0
- package/cli/guidelines/componentRule/componentRule.instruction.md +637 -0
- package/cli/guidelines/cssRule/cssRule.generate.json +93 -0
- package/cli/guidelines/cssRule/cssRule.instruction.md +435 -0
- package/cli/guidelines/databaseModule/databaseModule.generate.json +51 -0
- package/cli/guidelines/databaseModule/databaseModule.instruction.md +612 -0
- package/cli/guidelines/docPageRule/docPageRule.generate.json +72 -0
- package/cli/guidelines/docPageRule/docPageRule.instruction.md +389 -0
- package/cli/guidelines/enumConstant/enumConstant.generate.json +24 -0
- package/cli/guidelines/enumConstant/enumConstant.instruction.md +232 -0
- package/cli/guidelines/framework/framework.generate.json +119 -0
- package/cli/guidelines/framework/framework.instruction.md +1110 -0
- package/cli/guidelines/howToUseStore/howToUseStore.generate.json +0 -0
- package/cli/guidelines/modelConstant/modelConstant.generate.json +128 -0
- package/cli/guidelines/modelConstant/modelConstant.instruction.md +506 -0
- package/cli/guidelines/modelDictionary/modelDictionary.generate.json +108 -0
- package/cli/guidelines/modelDictionary/modelDictionary.instruction.md +547 -0
- package/cli/guidelines/modelDocument/modelDocument.generate.json +129 -0
- package/cli/guidelines/modelDocument/modelDocument.instruction.md +536 -0
- package/cli/guidelines/modelService/modelService.generate.json +135 -0
- package/cli/guidelines/modelService/modelService.instruction.md +708 -0
- package/cli/guidelines/modelSignal/modelSignal.generate.json +201 -0
- package/cli/guidelines/modelSignal/modelSignal.instruction.md +552 -0
- package/cli/guidelines/modelStore/modelStore.generate.json +130 -0
- package/cli/guidelines/modelStore/modelStore.instruction.md +585 -0
- package/cli/guidelines/modelTemplate/modelTemplate.generate.json +104 -0
- package/cli/guidelines/modelTemplate/modelTemplate.instruction.md +604 -0
- package/cli/guidelines/modelUnit/modelUnit.generate.json +92 -0
- package/cli/guidelines/modelUnit/modelUnit.instruction.md +541 -0
- package/cli/guidelines/modelUtil/modelUtil.generate.json +93 -0
- package/cli/guidelines/modelUtil/modelUtil.instruction.md +752 -0
- package/cli/guidelines/modelView/modelView.generate.json +80 -0
- package/cli/guidelines/modelView/modelView.instruction.md +1005 -0
- package/cli/guidelines/modelZone/modelZone.generate.json +126 -0
- package/cli/guidelines/modelZone/modelZone.instruction.md +528 -0
- package/cli/guidelines/scalarConstant/scalarConstant.generate.json +106 -0
- package/cli/guidelines/scalarConstant/scalarConstant.instruction.md +442 -0
- package/cli/guidelines/scalarDictionary/scalarDictionary.generate.json +83 -0
- package/cli/guidelines/scalarDictionary/scalarDictionary.instruction.md +273 -0
- package/cli/guidelines/scalarModule/scalarModule.generate.json +35 -0
- package/cli/guidelines/scalarModule/scalarModule.instruction.md +81 -0
- package/cli/guidelines/sharedUiUsage/sharedUiUsage.generate.json +108 -0
- package/cli/guidelines/sharedUiUsage/sharedUiUsage.instruction.md +310 -0
- package/cli/guidelines/utilUiUsage/utilUiUsage.generate.json +140 -0
- package/cli/guidelines/utilUiUsage/utilUiUsage.instruction.md +339 -0
- package/cli/index.js +11399 -0
- package/cli/index.ts +24 -0
- package/cli/library/library.command.ts +28 -0
- package/cli/library/library.runner.ts +69 -0
- package/cli/library/library.script.ts +39 -0
- package/cli/module/module.command.ts +35 -0
- package/cli/module/module.prompt.ts +18 -0
- package/cli/module/module.request.ts +319 -0
- package/cli/module/module.runner.ts +76 -0
- package/cli/module/module.script.ts +161 -0
- package/cli/package/package.command.ts +32 -0
- package/cli/package/package.runner.ts +64 -0
- package/cli/package/package.script.ts +35 -0
- package/cli/page/page.command.ts +14 -0
- package/cli/page/page.runner.ts +14 -0
- package/cli/page/page.script.ts +12 -0
- package/cli/scalar/scalar.command.ts +21 -0
- package/cli/scalar/scalar.prompt.ts +131 -0
- package/cli/scalar/scalar.runner.ts +38 -0
- package/cli/scalar/scalar.script.ts +16 -0
- package/cli/templates/__scalar/__model__/__model__.constant.ts +15 -0
- package/cli/templates/__scalar/__model__/__model__.dictionary.ts +19 -0
- package/cli/templates/__scalar/__model__/__model__.document.ts +15 -0
- package/cli/templates/app/akan.config.ts +14 -0
- package/cli/templates/app/capacitor.config.ts.template +8 -0
- package/cli/templates/app/common/commonLogic.ts +12 -0
- package/cli/templates/app/common/index.ts +10 -0
- package/cli/templates/app/env/env.client.debug.ts.template +7 -0
- package/cli/templates/app/env/env.client.develop.ts.template +7 -0
- package/cli/templates/app/env/env.client.local.ts.template +7 -0
- package/cli/templates/app/env/env.client.main.ts.template +7 -0
- package/cli/templates/app/env/env.client.testing.ts.template +7 -0
- package/cli/templates/app/env/env.client.ts +21 -0
- package/cli/templates/app/env/env.client.type.ts +16 -0
- package/cli/templates/app/env/env.server.debug.ts.template +7 -0
- package/cli/templates/app/env/env.server.develop.ts.template +9 -0
- package/cli/templates/app/env/env.server.local.ts.template +14 -0
- package/cli/templates/app/env/env.server.main.ts.template +9 -0
- package/cli/templates/app/env/env.server.testing.ts.template +6 -0
- package/cli/templates/app/env/env.server.ts +20 -0
- package/cli/templates/app/lib/___appName__/__appName__.dictionary.ts +17 -0
- package/cli/templates/app/lib/___appName__/__appName__.service.ts +13 -0
- package/cli/templates/app/lib/___appName__/__appName__.signal.ts +17 -0
- package/cli/templates/app/lib/___appName__/__appName__.store.ts +15 -0
- package/cli/templates/app/lib/option.ts +17 -0
- package/cli/templates/app/main.ts +16 -0
- package/cli/templates/app/package.json.template +5 -0
- package/cli/templates/app/page/_index.tsx +172 -0
- package/cli/templates/app/page/_layout.tsx +32 -0
- package/cli/templates/app/page/styles.css.template +53 -0
- package/cli/templates/app/public/favicon.ico +0 -0
- package/cli/templates/app/public/logo.png +0 -0
- package/cli/templates/app/srvkit/backendLogic.ts +12 -0
- package/cli/templates/app/srvkit/index.ts +10 -0
- package/cli/templates/app/tsconfig.json.template +21 -0
- package/cli/templates/app/ui/UiComponent.ts +16 -0
- package/cli/templates/app/ui/index.ts +10 -0
- package/cli/templates/app/webkit/frontendLogic.ts +12 -0
- package/cli/templates/app/webkit/index.ts +10 -0
- package/cli/templates/client.ts +46 -0
- package/cli/templates/crudPages/[__model__Id]/edit/page.tsx +47 -0
- package/cli/templates/crudPages/[__model__Id]/page.tsx +52 -0
- package/cli/templates/crudPages/new/page.tsx +42 -0
- package/cli/templates/crudPages/page.tsx +43 -0
- package/cli/templates/crudSinglePage/page.tsx +37 -0
- package/cli/templates/env/_env.server.type.ts +16 -0
- package/cli/templates/facetIndex/index.ts +32 -0
- package/cli/templates/index.ts +10 -0
- package/cli/templates/lib/__lib/lib.constant.ts +38 -0
- package/cli/templates/lib/__lib/lib.dictionary.ts +33 -0
- package/cli/templates/lib/__lib/lib.document.ts +35 -0
- package/cli/templates/lib/__lib/lib.service.ts +33 -0
- package/cli/templates/lib/__lib/lib.signal.ts +34 -0
- package/cli/templates/lib/__lib/lib.store.ts +33 -0
- package/cli/templates/lib/cnst.ts +29 -0
- package/cli/templates/lib/db.ts +32 -0
- package/cli/templates/lib/dict.ts +49 -0
- package/cli/templates/lib/sig.ts +60 -0
- package/cli/templates/lib/srv.ts +34 -0
- package/cli/templates/lib/st.ts +31 -0
- package/cli/templates/lib/useClient.ts +19 -0
- package/cli/templates/lib/useServer.ts +7 -0
- package/cli/templates/libRoot/.gitignore.template +16 -0
- package/cli/templates/libRoot/akan.config.ts +12 -0
- package/cli/templates/libRoot/base/baseLogic.ts +10 -0
- package/cli/templates/libRoot/base/index.ts +8 -0
- package/cli/templates/libRoot/common/commonLogic.ts +10 -0
- package/cli/templates/libRoot/common/index.ts +8 -0
- package/cli/templates/libRoot/env/env.server.example.ts.template +6 -0
- package/cli/templates/libRoot/env/env.server.testing.ts.template +6 -0
- package/cli/templates/libRoot/lib/___libName__/__libName__.dictionary.ts +15 -0
- package/cli/templates/libRoot/lib/___libName__/__libName__.service.ts +11 -0
- package/cli/templates/libRoot/lib/___libName__/__libName__.store.ts +13 -0
- package/cli/templates/libRoot/lib/option.ts +17 -0
- package/cli/templates/libRoot/package.json.template +5 -0
- package/cli/templates/libRoot/srvkit/backendLogic.ts +10 -0
- package/cli/templates/libRoot/srvkit/index.ts +8 -0
- package/cli/templates/libRoot/tsconfig.json.template +11 -0
- package/cli/templates/libRoot/ui/index.ts +7 -0
- package/cli/templates/libRoot/webkit/frontendLogic.ts +10 -0
- package/cli/templates/libRoot/webkit/index.ts +8 -0
- package/cli/templates/localDev/docker-compose.yaml.template +37 -0
- package/cli/templates/module/__Model__.Template.tsx +36 -0
- package/cli/templates/module/__Model__.Unit.tsx +26 -0
- package/cli/templates/module/__Model__.Util.tsx +30 -0
- package/cli/templates/module/__Model__.View.tsx +29 -0
- package/cli/templates/module/__Model__.Zone.tsx +43 -0
- package/cli/templates/module/__model__.constant.ts +24 -0
- package/cli/templates/module/__model__.dictionary.ts +30 -0
- package/cli/templates/module/__model__.document.ts +23 -0
- package/cli/templates/module/__model__.service.ts +16 -0
- package/cli/templates/module/__model__.signal.ts +27 -0
- package/cli/templates/module/__model__.store.ts +19 -0
- package/cli/templates/module/index.tsx +44 -0
- package/cli/templates/moduleRoot/index.tsx +31 -0
- package/cli/templates/pkgRoot/tsconfig.json.template +10 -0
- package/cli/templates/server.ts +45 -0
- package/cli/templates/workspaceRoot/.env.template +14 -0
- package/cli/templates/workspaceRoot/.gitignore.template +130 -0
- package/cli/templates/workspaceRoot/.vscode/settings.json.template +23 -0
- package/cli/templates/workspaceRoot/biome.json.template +175 -0
- package/cli/templates/workspaceRoot/bunfig.toml +4 -0
- package/cli/templates/workspaceRoot/infra/app/Chart.yaml.template +6 -0
- package/cli/templates/workspaceRoot/infra/app/templates/frontend.yaml.template +182 -0
- package/cli/templates/workspaceRoot/infra/app/values/_common-values.yaml.template +183 -0
- package/cli/templates/workspaceRoot/package.json.template +7 -0
- package/cli/templates/workspaceRoot/tsconfig.json.template +26 -0
- package/cli/testHelpers.ts +171 -0
- package/cli/workspace/workspace.command.ts +59 -0
- package/cli/workspace/workspace.runner.ts +57 -0
- package/cli/workspace/workspace.script.ts +68 -0
- package/client/capacitor.ts +68 -0
- package/client/clientRuntime.ts +141 -0
- package/client/cookie.ts +121 -0
- package/client/createFont.ts +8 -0
- package/client/csrTypes.ts +259 -0
- package/client/decorators.ts +25 -0
- package/client/device.ts +147 -0
- package/client/fetch.ts +1 -0
- package/client/index.ts +15 -0
- package/client/locale.ts +4 -0
- package/client/makePageProto.tsx +178 -0
- package/client/router.ts +286 -0
- package/client/rscNavigation.ts +19 -0
- package/client/storage.ts +33 -0
- package/client/translator.ts +43 -0
- package/client/types.ts +228 -0
- package/client/useClient.ts +1 -0
- package/common/Logger.ts +177 -0
- package/common/applyMixins.ts +14 -0
- package/common/capitalize.ts +4 -0
- package/common/deepObjectify.ts +27 -0
- package/common/formatNumber.ts +14 -0
- package/common/formatPhone.ts +7 -0
- package/common/getAllPropertyDescriptors.ts +13 -0
- package/common/hmrPhase.ts +17 -0
- package/common/httpClient.ts +101 -0
- package/common/index.ts +50 -0
- package/common/isDayjs.ts +3 -0
- package/common/isEmail.ts +2 -0
- package/common/isPhoneNumber.ts +8 -0
- package/common/isQueryEqual.ts +23 -0
- package/common/isValidDate.ts +14 -0
- package/common/localeConfig.ts +41 -0
- package/common/lowerlize.ts +4 -0
- package/common/mergeVersion.ts +10 -0
- package/common/objectify.ts +7 -0
- package/common/pathGet.ts +13 -0
- package/common/pathSet.ts +16 -0
- package/common/randomPick.ts +1 -0
- package/common/randomPicks.ts +12 -0
- package/common/routeConvention.ts +203 -0
- package/common/sleep.ts +8 -0
- package/common/splitVersion.ts +11 -0
- package/common/subRoute.ts +34 -0
- package/common/types.ts +15 -0
- package/constant/constantRegistry.ts +334 -0
- package/constant/crystalize.ts +45 -0
- package/constant/deserialize.ts +70 -0
- package/constant/fieldInfo.ts +415 -0
- package/constant/getDefault.ts +18 -0
- package/constant/immerify.ts +16 -0
- package/constant/index.ts +10 -0
- package/constant/purify.ts +118 -0
- package/constant/serialize.ts +87 -0
- package/constant/types.ts +105 -0
- package/constant/via.ts +360 -0
- package/devkit/aiEditor.ts +299 -0
- package/devkit/akanApp/akanApp.host.ts +356 -0
- package/devkit/akanApp/index.ts +1 -0
- package/devkit/akanConfig/akanConfig.ts +332 -0
- package/devkit/akanConfig/index.ts +2 -0
- package/devkit/akanConfig/types.ts +187 -0
- package/devkit/applicationBuildReporter.ts +69 -0
- package/devkit/applicationBuildRunner.ts +302 -0
- package/devkit/applicationReleasePackager.ts +205 -0
- package/devkit/artifact/implicitRootLayout.ts +155 -0
- package/devkit/artifact/index.ts +1 -0
- package/devkit/artifact/routeSeedIndex.ts +128 -0
- package/devkit/auth.ts +41 -0
- package/devkit/builder.ts +164 -0
- package/devkit/capacitor.base.config.ts +74 -0
- package/devkit/capacitorApp.ts +385 -0
- package/devkit/commandDecorators/argMeta.ts +88 -0
- package/devkit/commandDecorators/command.ts +314 -0
- package/devkit/commandDecorators/commandBuilder.ts +188 -0
- package/devkit/commandDecorators/commandMeta.ts +6 -0
- package/devkit/commandDecorators/dependencyBuilder.ts +100 -0
- package/devkit/commandDecorators/helpFormatter.ts +217 -0
- package/devkit/commandDecorators/index.ts +8 -0
- package/devkit/commandDecorators/targetMeta.ts +31 -0
- package/devkit/commandDecorators/types.ts +10 -0
- package/devkit/constants.ts +25 -0
- package/devkit/createTunnel.ts +36 -0
- package/devkit/dependencyScanner.ts +339 -0
- package/devkit/executors.ts +1325 -0
- package/devkit/extractDeps.ts +85 -0
- package/devkit/fileEditor.ts +106 -0
- package/devkit/fileSys.ts +39 -0
- package/devkit/frontendBuild/allRoutesBuilder.ts +103 -0
- package/devkit/frontendBuild/clientBuildTypes.ts +114 -0
- package/devkit/frontendBuild/clientEntriesBundler.ts +300 -0
- package/devkit/frontendBuild/clientEntryDiscovery.ts +196 -0
- package/devkit/frontendBuild/csrArtifactBuilder.ts +237 -0
- package/devkit/frontendBuild/cssCompiler.ts +279 -0
- package/devkit/frontendBuild/cssImportResolver.ts +116 -0
- package/devkit/frontendBuild/fontOptimizer.ts +427 -0
- package/devkit/frontendBuild/hmrChangeClassifier.ts +28 -0
- package/devkit/frontendBuild/hmrWatcher.ts +101 -0
- package/devkit/frontendBuild/index.ts +18 -0
- package/devkit/frontendBuild/pagesBundleBuilder.ts +137 -0
- package/devkit/frontendBuild/pagesEntrySourceGenerator.ts +37 -0
- package/devkit/frontendBuild/precompressArtifacts.ts +59 -0
- package/devkit/frontendBuild/routeClientBuilder.ts +290 -0
- package/devkit/frontendBuild/routesManifestArtifactSerializer.ts +62 -0
- package/devkit/frontendBuild/ssrBaseArtifactBuilder.ts +139 -0
- package/devkit/frontendBuild/vendorSpecifiers.ts +16 -0
- package/devkit/frontendBuild/watchRootResolver.ts +28 -0
- package/devkit/getCredentials.ts +19 -0
- package/devkit/getDirname.ts +3 -0
- package/devkit/getModelFileData.ts +59 -0
- package/devkit/getRelatedCnsts.ts +300 -0
- package/devkit/guideline.ts +19 -0
- package/devkit/incrementalBuilder/incrementalBuilder.host.ts +78 -0
- package/devkit/incrementalBuilder/incrementalBuilder.proc.ts +330 -0
- package/devkit/incrementalBuilder/index.ts +1 -0
- package/devkit/index.ts +36 -0
- package/devkit/lint/no-import-client-functions.grit +32 -0
- package/devkit/lint/no-import-external-library.grit +21 -0
- package/devkit/lint/no-js-private-class-method.grit +42 -0
- package/devkit/lint/no-use-client-in-server.grit +7 -0
- package/devkit/lint/non-scalar-props-restricted.grit +13 -0
- package/devkit/linter.ts +248 -0
- package/devkit/mobile/index.ts +1 -0
- package/devkit/mobile/mobileTarget.ts +47 -0
- package/devkit/prompter.ts +71 -0
- package/devkit/scanInfo.ts +605 -0
- package/devkit/selectModel.ts +11 -0
- package/devkit/spinner.ts +54 -0
- package/devkit/sshTunnel.ts +151 -0
- package/devkit/streamAi.ts +45 -0
- package/devkit/transforms/barrelAnalyzer.ts +249 -0
- package/devkit/transforms/barrelImportsPlugin.ts +451 -0
- package/devkit/transforms/externalizeFrameworkPlugin.ts +159 -0
- package/devkit/transforms/index.ts +5 -0
- package/devkit/transforms/rscUseClientTransform.ts +52 -0
- package/devkit/transforms/useClientBundlePlugin.ts +47 -0
- package/devkit/typeChecker.ts +260 -0
- package/devkit/types.ts +42 -0
- package/devkit/ui/MultiScrollList.tsx +228 -0
- package/devkit/ui/ScrollList.tsx +106 -0
- package/devkit/ui/index.ts +2 -0
- package/devkit/uploadRelease.ts +95 -0
- package/devkit/useStdoutDimensions.ts +20 -0
- package/dictionary/base.dictionary.ts +91 -0
- package/dictionary/dictInfo.ts +1079 -0
- package/dictionary/dictionary.ts +10 -0
- package/dictionary/index.ts +12 -0
- package/dictionary/locale.ts +230 -0
- package/dictionary/trans.ts +196 -0
- package/document/by.ts +39 -0
- package/document/dataLoader.ts +91 -0
- package/document/database.ts +168 -0
- package/document/databaseRegistry.ts +113 -0
- package/document/documentQuery.ts +143 -0
- package/document/documentSchema.ts +91 -0
- package/document/filterMeta.ts +210 -0
- package/document/index.ts +11 -0
- package/document/into.ts +169 -0
- package/document/loaderInfo.ts +50 -0
- package/document/schema.ts +24 -0
- package/document/types.ts +41 -0
- package/fetch/client/fetchClient.ts +600 -0
- package/fetch/client/httpClient.ts +157 -0
- package/fetch/client/index.ts +3 -0
- package/fetch/client/wsClient.ts +246 -0
- package/fetch/fetchType/appliedReturn.type.ts +108 -0
- package/fetch/fetchType/buildFetch.type.ts +24 -0
- package/fetch/fetchType/clientSignal.type.ts +22 -0
- package/fetch/fetchType/endpointFetch.type.ts +56 -0
- package/fetch/fetchType/index.ts +5 -0
- package/fetch/fetchType/sliceFetch.type.ts +173 -0
- package/fetch/index.ts +4 -0
- package/fetch/requestStorage.ts +127 -0
- package/fetch/serializer/fetch.serializer.ts +131 -0
- package/fetch/serializer/index.ts +1 -0
- package/fetch/types.ts +28 -0
- package/package.json +202 -5
- package/server/SSR_MEMORY_DIAGNOSIS.md +107 -0
- package/server/akanApp.ts +855 -0
- package/server/akanLib.ts +43 -0
- package/server/akanOption.ts +42 -0
- package/server/akanServer.ts +369 -0
- package/server/artifact/builderRpc.ts +124 -0
- package/server/artifact/index.ts +6 -0
- package/server/artifact/ipcTypes.ts +46 -0
- package/server/artifact/manifestTypes.ts +19 -0
- package/server/artifact/routeClientCache.ts +224 -0
- package/server/artifact/routeSeedIndexStore.ts +89 -0
- package/server/artifact/routesManifestStore.ts +120 -0
- package/server/decorators.ts +95 -0
- package/server/di/diLifecycle.ts +520 -0
- package/server/di/index.ts +4 -0
- package/server/di/predefinedAdaptor.ts +77 -0
- package/server/di/resolveAdaptorHierarchy.ts +82 -0
- package/server/di/resolveHierarchy.ts +89 -0
- package/server/di/resolveServiceHierarchy.ts +47 -0
- package/server/di/utils.ts +40 -0
- package/server/hmr/changeBatch.ts +14 -0
- package/server/hmr/clientScript.ts +310 -0
- package/server/hmr/devHmrController.ts +395 -0
- package/server/hmr/index.ts +4 -0
- package/server/hmr/wsHub.ts +56 -0
- package/server/imageOptimizer.ts +427 -0
- package/server/imageOptimizerError.ts +8 -0
- package/server/index.ts +14 -0
- package/server/lifecycle/shutdownManager.ts +52 -0
- package/server/logging/rotatingLogWriter.ts +190 -0
- package/server/processMetricsCollector.ts +78 -0
- package/server/proxy/akanResponse.ts +16 -0
- package/server/proxy/bunRequestFields.ts +12 -0
- package/server/proxy/hostBasePathWebProxy.ts +112 -0
- package/server/proxy/index.ts +15 -0
- package/server/proxy/localeWebProxy.ts +71 -0
- package/server/proxy/types.ts +41 -0
- package/server/proxy/webProxyRunner.ts +90 -0
- package/server/resolver/database.resolver.ts +340 -0
- package/server/resolver/index.ts +3 -0
- package/server/resolver/resolver.contract.fixture.ts +222 -0
- package/server/resolver/service.resolver.ts +176 -0
- package/server/resolver/signal.resolver.ts +386 -0
- package/server/robots.ts +32 -0
- package/server/routeElementComposer.tsx +91 -0
- package/server/routeTreeBuilder.ts +279 -0
- package/server/routing/apiRouter.ts +226 -0
- package/server/rscClient.tsx +140 -0
- package/server/rscWorker.tsx +625 -0
- package/server/rscWorkerHost.ts +616 -0
- package/server/sitemap.ts +90 -0
- package/server/ssrFromRscRenderer.tsx +285 -0
- package/server/ssrTypes.ts +48 -0
- package/server/types/react-server-dom-webpack.d.ts +91 -0
- package/server/types.tsx +109 -0
- package/server/vendor/akanjs-base.ts +1 -0
- package/server/vendor/akanjs-common.ts +1 -0
- package/server/vendor/akanjs-constant.ts +1 -0
- package/server/vendor/akanjs-store.ts +1 -0
- package/server/vendor/react-dom-client.ts +5 -0
- package/server/vendor/react-dom.ts +21 -0
- package/server/vendor/react-jsx-dev-runtime.ts +5 -0
- package/server/vendor/react-jsx-runtime.ts +5 -0
- package/server/vendor/react-refresh-runtime.ts +6 -0
- package/server/vendor/react-server-dom-webpack-client-browser.ts +12 -0
- package/server/vendor/react.ts +51 -0
- package/server/vendor/scheduler.ts +23 -0
- package/server/webRouter.ts +712 -0
- package/service/adapt.ts +47 -0
- package/service/base.service.ts +18 -0
- package/service/index.ts +10 -0
- package/service/injectInfo.ts +393 -0
- package/service/ipcTypes.ts +127 -0
- package/service/predefinedAdaptor/cache.adaptor.ts +105 -0
- package/service/predefinedAdaptor/compress.adaptor.ts +357 -0
- package/service/predefinedAdaptor/database.adaptor.ts +1310 -0
- package/service/predefinedAdaptor/index.ts +13 -0
- package/service/predefinedAdaptor/logging.adaptor.ts +36 -0
- package/service/predefinedAdaptor/queue.adaptor.ts +42 -0
- package/service/predefinedAdaptor/role.adaptor.ts +18 -0
- package/service/predefinedAdaptor/schedule.adaptor.ts +188 -0
- package/service/predefinedAdaptor/solidCache.adaptor.ts +143 -0
- package/service/predefinedAdaptor/solidPubsub.adaptor.ts +98 -0
- package/service/predefinedAdaptor/solidQueue.adaptor.ts +203 -0
- package/service/predefinedAdaptor/solidSqlite.ts +85 -0
- package/service/predefinedAdaptor/sqlitePath.ts +20 -0
- package/service/predefinedAdaptor/storage.adaptor.ts +121 -0
- package/service/predefinedAdaptor/websocket.adaptor.ts +313 -0
- package/service/serve.ts +223 -0
- package/service/serviceModule.ts +221 -0
- package/service/serviceRegistry.ts +26 -0
- package/service/types.ts +113 -0
- package/signal/base.signal.ts +46 -0
- package/signal/endpoint.ts +122 -0
- package/signal/endpointInfo.ts +374 -0
- package/signal/exception.ts +50 -0
- package/signal/guard.ts +18 -0
- package/signal/guards.ts +16 -0
- package/signal/index.ts +18 -0
- package/signal/intercept.ts +39 -0
- package/signal/internal.ts +56 -0
- package/signal/internalArg.ts +38 -0
- package/signal/internalInfo.ts +208 -0
- package/signal/middleware.ts +108 -0
- package/signal/serializer/fetch.serializer.ts +128 -0
- package/signal/serializer/index.ts +1 -0
- package/signal/serverSignal.ts +114 -0
- package/signal/signalContext.ts +446 -0
- package/signal/signalRegistry.ts +82 -0
- package/signal/slice.ts +158 -0
- package/signal/sliceInfo.ts +254 -0
- package/signal/types.ts +131 -0
- package/store/action.ts +1067 -0
- package/store/baseSt.ts +81 -0
- package/store/hooks.ts +2 -0
- package/store/index.ts +8 -0
- package/store/rootStore.ts +26 -0
- package/store/state.ts +226 -0
- package/store/stateBuilder.ts +429 -0
- package/store/stateInfo.ts +66 -0
- package/store/store.ts +194 -0
- package/store/storeInstance.ts +382 -0
- package/store/storeRegistry.ts +84 -0
- package/store/types.ts +69 -0
- package/store/withSelector.ts +62 -0
- package/test/index.ts +16 -0
- package/test/playwright.config.base.ts +48 -0
- package/test/playwright.pageAgent.ts +41 -0
- package/test/sample.ts +19 -0
- package/test/sampleOf.ts +70 -0
- package/test/signalTest.preload.ts +10 -0
- package/test/signalTestRuntime.ts +126 -0
- package/test/testServer.ts +187 -0
- package/ui/BottomSheet.tsx +103 -0
- package/ui/Button.tsx +70 -0
- package/ui/ClientSide.tsx +11 -0
- package/ui/Clipboard.tsx +49 -0
- package/ui/Constant/Doc.tsx +696 -0
- package/ui/Constant/Mermaid.tsx +149 -0
- package/ui/Constant/index.ts +6 -0
- package/ui/Constant/schemaDoc.ts +324 -0
- package/ui/Copy.tsx +27 -0
- package/ui/CsrImage.tsx +38 -0
- package/ui/Data/CardList.tsx +141 -0
- package/ui/Data/Dashboard.tsx +72 -0
- package/ui/Data/Insight.tsx +35 -0
- package/ui/Data/Item.tsx +285 -0
- package/ui/Data/ListContainer.tsx +320 -0
- package/ui/Data/Pagination.tsx +54 -0
- package/ui/Data/QueryMaker.tsx +21 -0
- package/ui/Data/TableList.tsx +161 -0
- package/ui/Data/index.ts +11 -0
- package/ui/Data/index_.tsx +11 -0
- package/ui/DatePicker.tsx +184 -0
- package/ui/Dialog/Action.tsx +15 -0
- package/ui/Dialog/Close.tsx +22 -0
- package/ui/Dialog/Content.tsx +11 -0
- package/ui/Dialog/Modal.tsx +137 -0
- package/ui/Dialog/Provider.tsx +33 -0
- package/ui/Dialog/Title.tsx +15 -0
- package/ui/Dialog/Trigger.tsx +22 -0
- package/ui/Dialog/context.ts +20 -0
- package/ui/Dialog/index.tsx +15 -0
- package/ui/DragAction.tsx +129 -0
- package/ui/DraggableList.tsx +230 -0
- package/ui/Dropdown.tsx +51 -0
- package/ui/Empty.tsx +32 -0
- package/ui/Field.tsx +1556 -0
- package/ui/FontFace.tsx +26 -0
- package/ui/Image.tsx +185 -0
- package/ui/InfiniteScroll.tsx +67 -0
- package/ui/Input.tsx +636 -0
- package/ui/KeyboardAvoiding.tsx +62 -0
- package/ui/Layout/BottomAction.tsx +15 -0
- package/ui/Layout/BottomInset.tsx +42 -0
- package/ui/Layout/BottomTab.tsx +71 -0
- package/ui/Layout/Header.tsx +38 -0
- package/ui/Layout/LeftSider.tsx +34 -0
- package/ui/Layout/Navbar.tsx +46 -0
- package/ui/Layout/RightSider.tsx +41 -0
- package/ui/Layout/Sider.tsx +69 -0
- package/ui/Layout/Template.tsx +11 -0
- package/ui/Layout/TopLeftAction.tsx +28 -0
- package/ui/Layout/Unit.tsx +19 -0
- package/ui/Layout/View.tsx +12 -0
- package/ui/Layout/Zone.tsx +10 -0
- package/ui/Layout/index.ts +27 -0
- package/ui/Link/Back.tsx +15 -0
- package/ui/Link/Close.tsx +20 -0
- package/ui/Link/CsrLink.tsx +41 -0
- package/ui/Link/Lang.tsx +16 -0
- package/ui/Link/SsrLink.tsx +68 -0
- package/ui/Link/index.tsx +32 -0
- package/ui/Link/types.ts +47 -0
- package/ui/Load/Edit.tsx +19 -0
- package/ui/Load/Edit_Client.tsx +120 -0
- package/ui/Load/Page.tsx +40 -0
- package/ui/Load/PageCSR.tsx +39 -0
- package/ui/Load/Pagination.tsx +89 -0
- package/ui/Load/Units.tsx +330 -0
- package/ui/Load/View.tsx +115 -0
- package/ui/Load/index.ts +11 -0
- package/ui/Load/index_.tsx +6 -0
- package/ui/Loading/Area.tsx +10 -0
- package/ui/Loading/Button.tsx +17 -0
- package/ui/Loading/Input.tsx +17 -0
- package/ui/Loading/ProgressBar.tsx +14 -0
- package/ui/Loading/Skeleton.tsx +22 -0
- package/ui/Loading/Spin.tsx +22 -0
- package/ui/Loading/index.tsx +8 -0
- package/ui/Menu.tsx +273 -0
- package/ui/Modal.tsx +87 -0
- package/ui/Model/AdminPanel.tsx +51 -0
- package/ui/Model/Edit.tsx +46 -0
- package/ui/Model/EditModal.tsx +301 -0
- package/ui/Model/EditWrapper.tsx +48 -0
- package/ui/Model/LoadInit.tsx +11 -0
- package/ui/Model/New.tsx +46 -0
- package/ui/Model/NewWrapper.tsx +20 -0
- package/ui/Model/NewWrapper_Client.tsx +57 -0
- package/ui/Model/Remove.tsx +75 -0
- package/ui/Model/RemoveWrapper.tsx +38 -0
- package/ui/Model/SureToRemove.tsx +108 -0
- package/ui/Model/View.tsx +65 -0
- package/ui/Model/ViewEditModal.tsx +125 -0
- package/ui/Model/ViewModal.tsx +71 -0
- package/ui/Model/ViewWrapper.tsx +38 -0
- package/ui/Model/index.ts +33 -0
- package/ui/Model/index_.tsx +16 -0
- package/ui/More.tsx +56 -0
- package/ui/ObjectId.tsx +29 -0
- package/ui/Pagination.tsx +120 -0
- package/ui/Popconfirm.tsx +135 -0
- package/ui/Portal.tsx +10 -0
- package/ui/Radio.tsx +53 -0
- package/ui/RecentTime.tsx +123 -0
- package/ui/Refresh.tsx +24 -0
- package/ui/ScreenNavigator.tsx +129 -0
- package/ui/Select.tsx +322 -0
- package/ui/Signal/Arg.tsx +352 -0
- package/ui/Signal/Doc.tsx +231 -0
- package/ui/Signal/Listener.tsx +74 -0
- package/ui/Signal/Message.tsx +267 -0
- package/ui/Signal/Object.tsx +131 -0
- package/ui/Signal/PubSub.tsx +247 -0
- package/ui/Signal/Request.tsx +30 -0
- package/ui/Signal/Response.tsx +76 -0
- package/ui/Signal/RestApi.tsx +390 -0
- package/ui/Signal/WebSocket.tsx +47 -0
- package/ui/Signal/index.ts +10 -0
- package/ui/Signal/makeExample.ts +75 -0
- package/ui/System/CSR.tsx +420 -0
- package/ui/System/Client.tsx +296 -0
- package/ui/System/Common.tsx +83 -0
- package/ui/System/DevModeToggle.tsx +21 -0
- package/ui/System/Gtag.tsx +69 -0
- package/ui/System/Messages.tsx +175 -0
- package/ui/System/Reconnect.tsx +156 -0
- package/ui/System/Root.tsx +10 -0
- package/ui/System/SSR.tsx +163 -0
- package/ui/System/SelectLanguage.tsx +47 -0
- package/ui/System/ThemeToggle.tsx +98 -0
- package/ui/System/index.tsx +23 -0
- package/ui/Tab/Menu.tsx +56 -0
- package/ui/Tab/Menus.tsx +10 -0
- package/ui/Tab/Panel.tsx +25 -0
- package/ui/Tab/Provider.tsx +25 -0
- package/ui/Tab/context.ts +16 -0
- package/ui/Tab/index.tsx +11 -0
- package/ui/Table.tsx +131 -0
- package/ui/ToggleSelect.tsx +144 -0
- package/ui/Unauthorized.tsx +29 -0
- package/ui/animated.tsx +8 -0
- package/ui/fontCss.ts +86 -0
- package/ui/index.ts +44 -0
- package/ui/styles.css +617 -0
- package/webkit/bootCsr.tsx +275 -0
- package/webkit/createRobotPage.ts +15 -0
- package/webkit/createSitemapPage.ts +4 -0
- package/webkit/index.ts +19 -0
- package/webkit/lazy.tsx +37 -0
- package/webkit/types.ts +7 -0
- package/webkit/useCamera.tsx +99 -0
- package/webkit/useCodepush.tsx +99 -0
- package/webkit/useContact.tsx +48 -0
- package/webkit/useCsrValues.ts +661 -0
- package/webkit/useDebounce.ts +24 -0
- package/webkit/useFetch.ts +48 -0
- package/webkit/useGeoLocation.tsx +24 -0
- package/webkit/useHistory.ts +76 -0
- package/webkit/useInterval.ts +21 -0
- package/webkit/useLocation.ts +69 -0
- package/webkit/usePurchase.tsx +156 -0
- package/webkit/usePushNoti.tsx +48 -0
- package/webkit/useThrottle.ts +22 -0
- package/src/index.js +0 -2
- package/src/index.js.map +0 -1
- package/src/lib/akan2.js +0 -4
- package/src/lib/akan2.js.map +0 -1
- package/src/run.js +0 -4
- package/src/run.js.map +0 -1
|
@@ -0,0 +1,604 @@
|
|
|
1
|
+
# Model.Template.tsx Implementation Guide
|
|
2
|
+
|
|
3
|
+
## Purpose and Role of Model.Template.tsx Files
|
|
4
|
+
|
|
5
|
+
Model.Template.tsx files are client-side React components that define the form structure for creating/editing models in Akan.js applications. They serve as:
|
|
6
|
+
|
|
7
|
+
1. **Form Blueprints**: Provide reusable form structures for model CRUD operations
|
|
8
|
+
2. **State Management**: Connect form inputs to Zustand store slices
|
|
9
|
+
3. **Validation**: Implement field-level validation rules
|
|
10
|
+
4. **UI Consistency**: Ensure uniform form design across the application
|
|
11
|
+
5. **Type Safety**: Enforce data types based on Model.Constant definitions
|
|
12
|
+
6. **Internationalization**: Support multi-language form fields with dictionary integration
|
|
13
|
+
7. **Component Reusability**: Enable form sections to be used in multiple contexts (pages, modals, utilities)
|
|
14
|
+
|
|
15
|
+
## File Location and Naming Convention
|
|
16
|
+
|
|
17
|
+
### Standard Path
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
{apps,libs}/*/lib/[model]/[Model].Template.tsx
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Examples:
|
|
24
|
+
|
|
25
|
+
- `libs/game/lib/map/Map.Template.tsx`
|
|
26
|
+
- `apps/lu/lib/feeling/Feeling.Template.tsx`
|
|
27
|
+
- `libs/shared/lib/user/User.Template.tsx`
|
|
28
|
+
|
|
29
|
+
### Naming Rules:
|
|
30
|
+
|
|
31
|
+
- PascalCase for model names (e.g., `Map.Template.tsx`)
|
|
32
|
+
- Place in the same directory as other model files (`[Model].store.ts`, `[Model].constant.ts`)
|
|
33
|
+
- Export named components (typically `General`, `Advanced`, `Compact`)
|
|
34
|
+
|
|
35
|
+
## Basic Structure and Component Patterns
|
|
36
|
+
|
|
37
|
+
### Minimum Structure
|
|
38
|
+
|
|
39
|
+
```tsx
|
|
40
|
+
"use client";
|
|
41
|
+
import { Field } from "@libs/shared/ui";
|
|
42
|
+
import { st } from "@[project]/client";
|
|
43
|
+
import { usePage } from "@[project]/lib/useClient";
|
|
44
|
+
|
|
45
|
+
export const General = ({ id }: { id?: string }) => {
|
|
46
|
+
const form = st.use.[model]Form();
|
|
47
|
+
const { l } = usePage();
|
|
48
|
+
|
|
49
|
+
return (
|
|
50
|
+
<div className="grid grid-cols-1 gap-4">
|
|
51
|
+
<Field.Text
|
|
52
|
+
label={l("model.fieldName")}
|
|
53
|
+
value={form.fieldName}
|
|
54
|
+
onChange={(v) => st.do.setFieldNameOn[Model](v)}
|
|
55
|
+
/>
|
|
56
|
+
</div>
|
|
57
|
+
);
|
|
58
|
+
};
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Component Organization Patterns
|
|
62
|
+
|
|
63
|
+
```tsx
|
|
64
|
+
// Single-file pattern
|
|
65
|
+
export const General = () => { /* main form */ }
|
|
66
|
+
export const Advanced = () => { /* advanced fields */ }
|
|
67
|
+
|
|
68
|
+
// Multi-file pattern (recommended)
|
|
69
|
+
[Model].Template/
|
|
70
|
+
├─ General.tsx
|
|
71
|
+
├─ Sections/
|
|
72
|
+
│ ├─ BasicInfo.tsx
|
|
73
|
+
│ ├─ ContactDetails.tsx
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Integration with Store State Management
|
|
77
|
+
|
|
78
|
+
### Connecting to Zustand Store
|
|
79
|
+
|
|
80
|
+
```tsx
|
|
81
|
+
// Access form state
|
|
82
|
+
const form = st.use.[model]Form();
|
|
83
|
+
|
|
84
|
+
// Update fields
|
|
85
|
+
<Field.Text
|
|
86
|
+
value={form.name}
|
|
87
|
+
onChange={st.do.setNameOn[Model]}
|
|
88
|
+
/>
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Store Action Patterns
|
|
92
|
+
|
|
93
|
+
```tsx
|
|
94
|
+
// Simple field update
|
|
95
|
+
st.do.setNameOn[Model](value);
|
|
96
|
+
|
|
97
|
+
// Nested field update
|
|
98
|
+
st.do.writeOn[Model](["address", "city"], value);
|
|
99
|
+
|
|
100
|
+
// List operations
|
|
101
|
+
st.do.addItemOn[Model](newItem);
|
|
102
|
+
st.do.removeItemOn[Model](index);
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Initialization and Cleanup
|
|
106
|
+
|
|
107
|
+
```tsx
|
|
108
|
+
useEffect(() => {
|
|
109
|
+
if (id) {
|
|
110
|
+
// Load existing data
|
|
111
|
+
void st.do.load[Model](id);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return () => {
|
|
115
|
+
// Reset form on unmount
|
|
116
|
+
st.do.reset[Model]Form();
|
|
117
|
+
};
|
|
118
|
+
}, [id]);
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## Field Types and Form Components
|
|
122
|
+
|
|
123
|
+
### Core Field Components
|
|
124
|
+
|
|
125
|
+
| Component | Usage | Example |
|
|
126
|
+
| -------------------- | --------------------- | ------------------------------------------- |
|
|
127
|
+
| `Field.Text` | Text input | `<Field.Text value={form.name} />` |
|
|
128
|
+
| `Field.TextArea` | Multi-line text | `<Field.TextArea value={form.desc} />` |
|
|
129
|
+
| `Field.Number` | Numeric input | `<Field.Number value={form.age} />` |
|
|
130
|
+
| `Field.Select` | Dropdown selection | `<Field.Select options={statusOptions} />` |
|
|
131
|
+
| `Field.ToggleSelect` | Toggleable options | `<Field.ToggleSelect items={types} />` |
|
|
132
|
+
| `Field.Tags` | Tag input | `<Field.Tags value={form.tags} />` |
|
|
133
|
+
| `Field.Img` | Image upload | `<Field.Img sliceName="model" />` |
|
|
134
|
+
| `Field.Date` | Date picker | `<Field.Date value={form.dueDate} />` |
|
|
135
|
+
| `Field.Parent` | Relationship selector | `<Field.Parent sliceName="relatedModel" />` |
|
|
136
|
+
| `Field.Slate` | Rich text editor | `<Field.Slate valuePath="content" />` |
|
|
137
|
+
|
|
138
|
+
### Complex Field Example
|
|
139
|
+
|
|
140
|
+
```tsx
|
|
141
|
+
<Field.List
|
|
142
|
+
label={l("map.spawnPositions")}
|
|
143
|
+
value={form.spawnPositions}
|
|
144
|
+
onAdd={() => st.do.addSpawnPosition(defaultPosition)}
|
|
145
|
+
renderItem={(position, idx) => (
|
|
146
|
+
<div className="flex gap-4">
|
|
147
|
+
<Field.Text value={position.key} onChange={(v) => st.do.writeOnMap(["spawnPositions", idx, "key"], v)} />
|
|
148
|
+
<Field.DoubleNumber
|
|
149
|
+
value={position.position}
|
|
150
|
+
onChange={(v) => st.do.writeOnMap(["spawnPositions", idx, "position"], v)}
|
|
151
|
+
/>
|
|
152
|
+
</div>
|
|
153
|
+
)}
|
|
154
|
+
/>
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## Form Validation Approaches
|
|
158
|
+
|
|
159
|
+
### Field-Level Validation
|
|
160
|
+
|
|
161
|
+
```tsx
|
|
162
|
+
<Field.Email
|
|
163
|
+
value={form.email}
|
|
164
|
+
validate={(v) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v)}
|
|
165
|
+
errorMessage="Invalid email format"
|
|
166
|
+
required
|
|
167
|
+
/>
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### Custom Validation Functions
|
|
171
|
+
|
|
172
|
+
```tsx
|
|
173
|
+
// Phone validation
|
|
174
|
+
<Field.Phone
|
|
175
|
+
value={form.phone}
|
|
176
|
+
validate={(v) => isPhoneNumber(v)}
|
|
177
|
+
/>
|
|
178
|
+
|
|
179
|
+
// Custom business rule
|
|
180
|
+
<Field.Number
|
|
181
|
+
value={form.quantity}
|
|
182
|
+
validate={(v) => v > 0 ? true : "Must be positive"}
|
|
183
|
+
/>
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### Validation Props
|
|
187
|
+
|
|
188
|
+
| Prop | Description | Example |
|
|
189
|
+
| ----------------------- | -------------------- | ------------------------------- |
|
|
190
|
+
| `required` | Mandatory field | `required` |
|
|
191
|
+
| `min`/`max` | Number range | `min={0} max={100}` |
|
|
192
|
+
| `minLength`/`maxLength` | Text length | `minLength={2}` |
|
|
193
|
+
| `validate` | Custom validation fn | `validate={(v) => isValid(v)}` |
|
|
194
|
+
| `errorMessage` | Custom error text | `errorMessage="Invalid format"` |
|
|
195
|
+
|
|
196
|
+
## Internationalization with usePage
|
|
197
|
+
|
|
198
|
+
### Dictionary Integration
|
|
199
|
+
|
|
200
|
+
```tsx
|
|
201
|
+
const { l } = usePage();
|
|
202
|
+
|
|
203
|
+
// Basic field
|
|
204
|
+
<Field.Text label={l("model.name")} />
|
|
205
|
+
|
|
206
|
+
// With description
|
|
207
|
+
<Field.Text
|
|
208
|
+
label={l("model.email")}
|
|
209
|
+
desc={l("model.email.desc")}
|
|
210
|
+
/>
|
|
211
|
+
|
|
212
|
+
// Dynamic content
|
|
213
|
+
<div>{l(`profileVerify.enum-type-${type}`)}</div>
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### Dictionary Structure
|
|
217
|
+
|
|
218
|
+
```tsx
|
|
219
|
+
// Example dictionary
|
|
220
|
+
export const dictionary = {
|
|
221
|
+
field: {
|
|
222
|
+
model: {
|
|
223
|
+
name: { en: "Name", ko: "이름" },
|
|
224
|
+
email: { en: "Email", ko: "이메일" },
|
|
225
|
+
},
|
|
226
|
+
},
|
|
227
|
+
desc: {
|
|
228
|
+
model: {
|
|
229
|
+
email: { en: "Your contact email", ko: "연락처 이메일" },
|
|
230
|
+
},
|
|
231
|
+
},
|
|
232
|
+
};
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
## Form Layout Patterns and Best Practices
|
|
236
|
+
|
|
237
|
+
### Responsive Grid Layout
|
|
238
|
+
|
|
239
|
+
```tsx
|
|
240
|
+
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">
|
|
241
|
+
<Field.Text label="First Name" />
|
|
242
|
+
<Field.Text label="Last Name" />
|
|
243
|
+
<Field.Email label="Email" className="md:col-span-2" />
|
|
244
|
+
</div>
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
### Section Grouping
|
|
248
|
+
|
|
249
|
+
```tsx
|
|
250
|
+
<section className="mb-6">
|
|
251
|
+
<h3 className="mb-3 text-xl font-semibold">Personal Information</h3>
|
|
252
|
+
<div className="space-y-4">
|
|
253
|
+
<Field.Text label="Full Name" />
|
|
254
|
+
<Field.Date label="Birth Date" />
|
|
255
|
+
</div>
|
|
256
|
+
</section>
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
### Conditional Sections
|
|
260
|
+
|
|
261
|
+
```tsx
|
|
262
|
+
{
|
|
263
|
+
form.type === "business" && (
|
|
264
|
+
<section>
|
|
265
|
+
<h3>Business Details</h3>
|
|
266
|
+
<Field.Text label="Company Name" />
|
|
267
|
+
<Field.Text label="Tax ID" />
|
|
268
|
+
</section>
|
|
269
|
+
);
|
|
270
|
+
}
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
### Best Practices
|
|
274
|
+
|
|
275
|
+
1. Use consistent spacing (`gap-4`, `mb-4`)
|
|
276
|
+
2. Group related fields visually
|
|
277
|
+
3. Place important fields above the fold
|
|
278
|
+
4. Use appropriate field types for data
|
|
279
|
+
5. Provide clear validation feedback
|
|
280
|
+
6. Optimize for mobile-first experiences
|
|
281
|
+
|
|
282
|
+
## Using Templates in Pages, Utilities, and Zones
|
|
283
|
+
|
|
284
|
+
### In Page Components
|
|
285
|
+
|
|
286
|
+
```tsx
|
|
287
|
+
// Creation page
|
|
288
|
+
<Model.Edit sliceName="model" type="form">
|
|
289
|
+
<Model.Template.General />
|
|
290
|
+
</Model.Edit>
|
|
291
|
+
|
|
292
|
+
// Edit page
|
|
293
|
+
<Model.Edit modelId={params.id} sliceName="model">
|
|
294
|
+
<Model.Template.General id={params.id} />
|
|
295
|
+
</Model.Edit>
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### In Utility Components
|
|
299
|
+
|
|
300
|
+
```tsx
|
|
301
|
+
// Modal-based editing
|
|
302
|
+
<Modal.Open opens={`edit-${id}`}>
|
|
303
|
+
<button>Edit</button>
|
|
304
|
+
</Modal.Open>
|
|
305
|
+
|
|
306
|
+
<Modal.Window name={`edit-${id}`}>
|
|
307
|
+
<Model.Edit modelId={id} sliceName="model">
|
|
308
|
+
<Model.Template.Compact />
|
|
309
|
+
</Model.Edit>
|
|
310
|
+
</Modal.Window>
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
### In Zone Components
|
|
314
|
+
|
|
315
|
+
```tsx
|
|
316
|
+
// List view with create form
|
|
317
|
+
<Data.ListContainer
|
|
318
|
+
renderTemplate={() => <Model.Template.General />}
|
|
319
|
+
/>
|
|
320
|
+
|
|
321
|
+
// Inline editor
|
|
322
|
+
<Zone.InlineEdit>
|
|
323
|
+
<Model.Template.Compact />
|
|
324
|
+
</Zone.InlineEdit>
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
## State Management and Lifecycle Methods
|
|
328
|
+
|
|
329
|
+
### Lifecycle Hooks
|
|
330
|
+
|
|
331
|
+
```tsx
|
|
332
|
+
useEffect(() => {
|
|
333
|
+
// Initialize form data
|
|
334
|
+
if (id) void st.do.loadModel(id);
|
|
335
|
+
|
|
336
|
+
// Initialize related data
|
|
337
|
+
void st.do.initRelatedData();
|
|
338
|
+
|
|
339
|
+
return () => {
|
|
340
|
+
// Cleanup on unmount
|
|
341
|
+
st.do.resetModelForm();
|
|
342
|
+
};
|
|
343
|
+
}, [id]);
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
### Form State Flow
|
|
347
|
+
|
|
348
|
+
1. **Initialization**: Load data when component mounts
|
|
349
|
+
2. **User Interaction**: Update state via store actions
|
|
350
|
+
3. **Validation**: Validate on change/blur/submit
|
|
351
|
+
4. **Submission**: Process form data
|
|
352
|
+
5. **Cleanup**: Reset state on unmount
|
|
353
|
+
|
|
354
|
+
## Performance Optimization Techniques
|
|
355
|
+
|
|
356
|
+
### Memoization
|
|
357
|
+
|
|
358
|
+
```tsx
|
|
359
|
+
const FormSection = React.memo(({ fields }) => {
|
|
360
|
+
// Component implementation
|
|
361
|
+
});
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
### Debounced Inputs
|
|
365
|
+
|
|
366
|
+
```tsx
|
|
367
|
+
import { useDebounce } from "akanjs/hooks";
|
|
368
|
+
|
|
369
|
+
const [input, setInput] = useState("");
|
|
370
|
+
const debouncedInput = useDebounce(input, 300);
|
|
371
|
+
|
|
372
|
+
useEffect(() => {
|
|
373
|
+
st.do.search(debouncedInput);
|
|
374
|
+
}, [debouncedInput]);
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
### Lazy Loading
|
|
378
|
+
|
|
379
|
+
```tsx
|
|
380
|
+
const HeavyEditor = React.lazy(() => import("./HeavyEditor"));
|
|
381
|
+
|
|
382
|
+
<Suspense fallback={<Loader />}>
|
|
383
|
+
<HeavyEditor />
|
|
384
|
+
</Suspense>;
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
## Accessibility Considerations
|
|
388
|
+
|
|
389
|
+
### Accessible Form Patterns
|
|
390
|
+
|
|
391
|
+
```tsx
|
|
392
|
+
// Proper labeling
|
|
393
|
+
<label htmlFor="email-field">Email</label>
|
|
394
|
+
<input id="email-field" type="email" />
|
|
395
|
+
|
|
396
|
+
// ARIA attributes
|
|
397
|
+
<div
|
|
398
|
+
role="alert"
|
|
399
|
+
aria-live="polite"
|
|
400
|
+
>
|
|
401
|
+
{error && <p>{error}</p>}
|
|
402
|
+
</div>
|
|
403
|
+
|
|
404
|
+
// Keyboard navigation
|
|
405
|
+
<button onKeyDown={handleKeyNavigation}>Submit</button>
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
### Accessibility Requirements
|
|
409
|
+
|
|
410
|
+
1. Associate all inputs with labels
|
|
411
|
+
2. Provide ARIA attributes for custom components
|
|
412
|
+
3. Ensure proper focus management
|
|
413
|
+
4. Support keyboard navigation
|
|
414
|
+
5. Provide error messages as live regions
|
|
415
|
+
6. Use sufficient color contrast
|
|
416
|
+
|
|
417
|
+
## Common Patterns and Reusable Components
|
|
418
|
+
|
|
419
|
+
### Reusable Form Sections
|
|
420
|
+
|
|
421
|
+
```tsx
|
|
422
|
+
// AddressSection.tsx
|
|
423
|
+
export const AddressSection = () => (
|
|
424
|
+
<>
|
|
425
|
+
<Field.Text label="Street" />
|
|
426
|
+
<Field.Text label="City" />
|
|
427
|
+
<Field.Text label="Zip Code" />
|
|
428
|
+
</>
|
|
429
|
+
);
|
|
430
|
+
|
|
431
|
+
// Usage
|
|
432
|
+
<AddressSection />;
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
### Dynamic Field Arrays
|
|
436
|
+
|
|
437
|
+
```tsx
|
|
438
|
+
<Field.List
|
|
439
|
+
value={form.items}
|
|
440
|
+
onAdd={() => st.do.addItem(defaultItem)}
|
|
441
|
+
renderItem={(item, index) => (
|
|
442
|
+
<div key={index}>
|
|
443
|
+
<Field.Text value={item.name} />
|
|
444
|
+
<Field.Number value={item.quantity} />
|
|
445
|
+
</div>
|
|
446
|
+
)}
|
|
447
|
+
/>
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
### Compound Components
|
|
451
|
+
|
|
452
|
+
```tsx
|
|
453
|
+
// DockerRegistryField.tsx
|
|
454
|
+
const DockerRegistry = ({ value, onChange }) => (
|
|
455
|
+
<>
|
|
456
|
+
<Field.Text label="URI" value={value.uri} />
|
|
457
|
+
<Field.Text label="Username" value={value.username} />
|
|
458
|
+
<Field.Text label="Password" value={value.password} />
|
|
459
|
+
</>
|
|
460
|
+
);
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
## Form State Integration with Database Models
|
|
464
|
+
|
|
465
|
+
### Type Alignment
|
|
466
|
+
|
|
467
|
+
```tsx
|
|
468
|
+
// Model.constant.ts
|
|
469
|
+
|
|
470
|
+
export class ProjectInput {
|
|
471
|
+
@Field.Prop(() => String)
|
|
472
|
+
name: string;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
// Project.Template.tsx
|
|
476
|
+
const form = st.use.projectForm(); // Type: ProjectInput
|
|
477
|
+
|
|
478
|
+
<Field.Text value={form.name} onChange={st.do.setNameOnProject} />;
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
### Data Transformation
|
|
482
|
+
|
|
483
|
+
```tsx
|
|
484
|
+
// Before submission
|
|
485
|
+
const handleSubmit = () => {
|
|
486
|
+
const dataToSend = transformFormData(form);
|
|
487
|
+
st.do.createProject(dataToSend);
|
|
488
|
+
};
|
|
489
|
+
|
|
490
|
+
// After load
|
|
491
|
+
useEffect(() => {
|
|
492
|
+
if (data) {
|
|
493
|
+
const formData = transformAPIData(data);
|
|
494
|
+
st.do.setProjectForm(formData);
|
|
495
|
+
}
|
|
496
|
+
}, [data]);
|
|
497
|
+
```
|
|
498
|
+
|
|
499
|
+
## Troubleshooting Common Issues
|
|
500
|
+
|
|
501
|
+
### Common Problems and Solutions
|
|
502
|
+
|
|
503
|
+
| Issue | Solution |
|
|
504
|
+
| ----------------------- | ---------------------------------------------- |
|
|
505
|
+
| Form not updating | Verify Zustand actions are connected correctly |
|
|
506
|
+
| Validation not working | Check validate prop and error handling |
|
|
507
|
+
| Performance issues | Memoize components, debounce inputs |
|
|
508
|
+
| Type mismatches | Ensure constant types match form state |
|
|
509
|
+
| Missing translations | Verify dictionary keys and scopes |
|
|
510
|
+
| Form reset issues | Check cleanup useEffect dependencies |
|
|
511
|
+
| API submission failures | Validate server-side requirements |
|
|
512
|
+
|
|
513
|
+
### Debugging Tips
|
|
514
|
+
|
|
515
|
+
1. Check Zustand store state with Redux DevTools
|
|
516
|
+
2. Verify prop drilling in complex forms
|
|
517
|
+
3. Test validation rules independently
|
|
518
|
+
4. Check network requests for API errors
|
|
519
|
+
5. Verify dictionary key paths with `l()` function
|
|
520
|
+
6. Ensure all required fields have `required` prop
|
|
521
|
+
|
|
522
|
+
## Integration with API Calls and Form Submission
|
|
523
|
+
|
|
524
|
+
### Submission Workflow
|
|
525
|
+
|
|
526
|
+
```tsx
|
|
527
|
+
const handleSubmit = async () => {
|
|
528
|
+
try {
|
|
529
|
+
// Validate form
|
|
530
|
+
const errors = validateForm(form);
|
|
531
|
+
if (Object.keys(errors).length) throw errors;
|
|
532
|
+
|
|
533
|
+
// Submit data
|
|
534
|
+
if (id) {
|
|
535
|
+
await st.do.updateModel(id, form);
|
|
536
|
+
} else {
|
|
537
|
+
await st.do.createModel(form);
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
// Redirect on success
|
|
541
|
+
router.push("/success");
|
|
542
|
+
} catch (error) {
|
|
543
|
+
// Handle API errors
|
|
544
|
+
st.do.setFormErrors(error);
|
|
545
|
+
}
|
|
546
|
+
};
|
|
547
|
+
|
|
548
|
+
// In component
|
|
549
|
+
<Button onClick={handleSubmit}>Save</Button>;
|
|
550
|
+
```
|
|
551
|
+
|
|
552
|
+
### API Error Handling
|
|
553
|
+
|
|
554
|
+
```tsx
|
|
555
|
+
// In store
|
|
556
|
+
createModel: async (form) => {
|
|
557
|
+
try {
|
|
558
|
+
return await fetch.createModel(form);
|
|
559
|
+
} catch (error) {
|
|
560
|
+
// Transform API errors to form errors
|
|
561
|
+
const formErrors = transformErrors(error);
|
|
562
|
+
set({ formErrors });
|
|
563
|
+
throw formErrors;
|
|
564
|
+
}
|
|
565
|
+
};
|
|
566
|
+
```
|
|
567
|
+
|
|
568
|
+
### Success/Failure Feedback
|
|
569
|
+
|
|
570
|
+
```tsx
|
|
571
|
+
// Using toast notifications
|
|
572
|
+
toast.success(l("model.createdSuccess"));
|
|
573
|
+
|
|
574
|
+
// Inline messages
|
|
575
|
+
{
|
|
576
|
+
submitError && <div className="text-error">{submitError}</div>;
|
|
577
|
+
}
|
|
578
|
+
```
|
|
579
|
+
|
|
580
|
+
## Additional Best Practices
|
|
581
|
+
|
|
582
|
+
### Component Design Principles
|
|
583
|
+
|
|
584
|
+
1. **Single Responsibility**: Each template should focus on one model
|
|
585
|
+
2. **Reusability**: Design components to work in different contexts
|
|
586
|
+
3. **Composition**: Build complex forms from simple components
|
|
587
|
+
4. **Consistency**: Follow established patterns across all templates
|
|
588
|
+
5. **Accessibility**: Meet WCAG 2.1 standards for all form elements
|
|
589
|
+
|
|
590
|
+
### Performance Guidelines
|
|
591
|
+
|
|
592
|
+
1. Avoid unnecessary state updates
|
|
593
|
+
2. Use React.memo for expensive components
|
|
594
|
+
3. Virtualize long lists of fields
|
|
595
|
+
4. Debounce rapid state updates
|
|
596
|
+
5. Lazy load heavy form sections
|
|
597
|
+
|
|
598
|
+
### Testing Recommendations
|
|
599
|
+
|
|
600
|
+
1. Unit test validation functions
|
|
601
|
+
2. Test form submission flows
|
|
602
|
+
3. Verify internationalization coverage
|
|
603
|
+
4. Test accessibility with screen readers
|
|
604
|
+
5. Perform cross-browser testing
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "Model Unit",
|
|
3
|
+
"description": "How to create and implement Model.Unit.tsx files in Akan.js",
|
|
4
|
+
"scans": [
|
|
5
|
+
{
|
|
6
|
+
"type": "example",
|
|
7
|
+
"description": "Model Unit examples",
|
|
8
|
+
"path": "{apps,libs}/*/lib/*/*.Unit.tsx",
|
|
9
|
+
"sample": 5
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"type": "implementation",
|
|
13
|
+
"description": "Model Unit typical implementations",
|
|
14
|
+
"path": "{apps,libs}/*/lib/**/*.Unit.tsx",
|
|
15
|
+
"filterText": "export const Abstract",
|
|
16
|
+
"sample": 3
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"type": "implementation",
|
|
20
|
+
"description": "Model Unit Card implementations",
|
|
21
|
+
"path": "{apps,libs}/*/lib/**/*.Unit.tsx",
|
|
22
|
+
"filterText": "export const Card",
|
|
23
|
+
"sample": 2
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"type": "usage",
|
|
27
|
+
"description": "Model Unit usage in pages",
|
|
28
|
+
"path": "apps/*/page/**/_index.tsx",
|
|
29
|
+
"filterText": ".Unit.",
|
|
30
|
+
"sample": 1
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"type": "usage",
|
|
34
|
+
"description": "Model Unit usage in Utils",
|
|
35
|
+
"path": "{apps,libs}/*/lib/*/*.Util.tsx",
|
|
36
|
+
"filterText": ".Unit.",
|
|
37
|
+
"sample": 1
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"type": "usage",
|
|
41
|
+
"description": "Model Unit usage in Templates",
|
|
42
|
+
"path": "{apps,libs}/*/lib/*/*.Template.tsx",
|
|
43
|
+
"filterText": ".Unit.",
|
|
44
|
+
"sample": 1
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"type": "usage",
|
|
48
|
+
"description": "Model Unit usage in Zones",
|
|
49
|
+
"path": "{apps,libs}/*/lib/*/*.Zone.tsx",
|
|
50
|
+
"filterText": ".Unit.",
|
|
51
|
+
"sample": 3
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"type": "reference",
|
|
55
|
+
"description": "Integration with database models",
|
|
56
|
+
"path": "{apps,libs}/*/lib/*/*.document.ts",
|
|
57
|
+
"sample": 1
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"type": "reference",
|
|
61
|
+
"description": "Integration with model constants",
|
|
62
|
+
"path": "{apps,libs}/*/lib/*/*.constant.ts",
|
|
63
|
+
"sample": 1
|
|
64
|
+
}
|
|
65
|
+
],
|
|
66
|
+
"update": {
|
|
67
|
+
"filePath": "./modelUnit.instruction.md",
|
|
68
|
+
"contents": [
|
|
69
|
+
"Purpose and role of Model.Unit.tsx files",
|
|
70
|
+
"How to create Model.Unit.tsx files",
|
|
71
|
+
"Common export patterns (Abstract, Card, Full, etc.)",
|
|
72
|
+
"Integration with LightModel types from constants",
|
|
73
|
+
"How to use Model.Unit.tsx files in pages",
|
|
74
|
+
"How to use Model.Unit.tsx files in Utils",
|
|
75
|
+
"How to use Model.Unit.tsx files in Zones",
|
|
76
|
+
"How to use Model.Unit.tsx files in Templates",
|
|
77
|
+
"Best practices for performance optimization",
|
|
78
|
+
"Common component patterns and variations"
|
|
79
|
+
],
|
|
80
|
+
"rules": [
|
|
81
|
+
"Model.Unit.tsx is a server component, so it should not use client-side hooks like useEffect, useState, etc.",
|
|
82
|
+
"Model.Unit.tsx is a presentation component of cnst.LightModel to reuse in pages, Utils, Zones, and Templates, etc.",
|
|
83
|
+
"Always accept className prop for styling customization",
|
|
84
|
+
"Create multiple export variations (Abstract, Card, Full) for different use cases",
|
|
85
|
+
"Use semantic HTML and ensure accessibility",
|
|
86
|
+
"Focus on presentation only - do not include business logic",
|
|
87
|
+
"Include href prop for navigation when appropriate",
|
|
88
|
+
"Ensure proper image handling with the Image component from @util/ui"
|
|
89
|
+
]
|
|
90
|
+
},
|
|
91
|
+
"page": "/akanjs/(docs)/docs/module/unit/_index.tsx"
|
|
92
|
+
}
|