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,541 @@
|
|
|
1
|
+
# Model.Unit.tsx Files in Akan.js - Implementation Guide
|
|
2
|
+
|
|
3
|
+
## Purpose and Role of Model.Unit.tsx Files
|
|
4
|
+
|
|
5
|
+
Model.Unit.tsx files are foundational server components in the Akan.js framework that provide reusable presentation elements for domain models. They serve several critical purposes:
|
|
6
|
+
|
|
7
|
+
1. **Consistent Model Representation**: Create standardized visual representations of domain entities
|
|
8
|
+
2. **UI Building Blocks**: Serve as atomic components for building complex interfaces
|
|
9
|
+
3. **Presentation Layer**: Encapsulate rendering logic for `cnst.LightModel` data objects
|
|
10
|
+
4. **Cross-Component Reuse**: Enable consistent usage across pages, zones, templates, and utilities
|
|
11
|
+
5. **Server-Side Rendering**: Optimize for Next.js server components architecture
|
|
12
|
+
|
|
13
|
+
Key characteristics:
|
|
14
|
+
|
|
15
|
+
- **Server Components**: Do not use client-side hooks (useState, useEffect, etc.)
|
|
16
|
+
- **Model-Focused**: Primarily render `cnst.LightModel` data structures
|
|
17
|
+
- **Presentation-Only**: Contain no business logic, state management, or data fetching
|
|
18
|
+
- **Prop-Configurable**: Accept standardized props for customization
|
|
19
|
+
- **Composable**: Designed to work seamlessly with other Akan.js components
|
|
20
|
+
|
|
21
|
+
## How to Create Model.Unit.tsx Files
|
|
22
|
+
|
|
23
|
+
### 1. File Location and Naming
|
|
24
|
+
|
|
25
|
+
Model Unit files follow strict naming conventions:
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
libs/
|
|
29
|
+
your-lib/
|
|
30
|
+
lib/
|
|
31
|
+
feature-name/
|
|
32
|
+
FeatureName.Unit.tsx # PascalCase for file name
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### 2. Basic Structure and Exports
|
|
36
|
+
|
|
37
|
+
A typical Model.Unit.tsx file exports multiple component variations:
|
|
38
|
+
|
|
39
|
+
```tsx
|
|
40
|
+
import { clsx } from "clsx";
|
|
41
|
+
import { cnst } from "@your-lib/client";
|
|
42
|
+
import { Image, Link } from "akanjs/ui";
|
|
43
|
+
|
|
44
|
+
// Compact representation (minimal details)
|
|
45
|
+
export const Abstract = ({
|
|
46
|
+
product,
|
|
47
|
+
className,
|
|
48
|
+
href,
|
|
49
|
+
}: {
|
|
50
|
+
product: cnst.LightProduct;
|
|
51
|
+
className?: string;
|
|
52
|
+
href?: string;
|
|
53
|
+
}) => {
|
|
54
|
+
const Content = (
|
|
55
|
+
<div className={clsx("flex items-center gap-3 rounded border p-2", className)}>
|
|
56
|
+
{product.thumbnail && <Image file={product.thumbnail} className="h-12 w-12 rounded" alt={product.name} />}
|
|
57
|
+
<div>
|
|
58
|
+
<h3 className="font-medium">{product.name}</h3>
|
|
59
|
+
<p className="text-sm text-gray-500">{product.price.toLocaleString()} KRW</p>
|
|
60
|
+
</div>
|
|
61
|
+
</div>
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
return href ? <Link href={href}>{Content}</Link> : Content;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
// Medium detail representation (card style)
|
|
68
|
+
export const Card = ({ product, className }: { product: cnst.LightProduct; className?: string }) => (
|
|
69
|
+
<div className={clsx("card bg-base-100 shadow-sm", className)}>
|
|
70
|
+
{product.image && (
|
|
71
|
+
<figure>
|
|
72
|
+
<Image file={product.image} className="h-48 w-full object-cover" alt={product.name} />
|
|
73
|
+
</figure>
|
|
74
|
+
)}
|
|
75
|
+
<div className="card-body p-4">
|
|
76
|
+
<h2 className="card-title text-lg">{product.name}</h2>
|
|
77
|
+
<p className="line-clamp-2 text-sm">{product.description}</p>
|
|
78
|
+
<div className="mt-2 flex items-center justify-between">
|
|
79
|
+
<span className="font-bold">{product.price.toLocaleString()} KRW</span>
|
|
80
|
+
<span className={clsx("badge", product.inStock ? "badge-success" : "badge-error")}>
|
|
81
|
+
{product.inStock ? "In Stock" : "Out of Stock"}
|
|
82
|
+
</span>
|
|
83
|
+
</div>
|
|
84
|
+
</div>
|
|
85
|
+
</div>
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
// Full detailed representation
|
|
89
|
+
export const Full = ({ product, className }: { product: cnst.LightProduct; className?: string }) => (
|
|
90
|
+
<div className={clsx("overflow-hidden rounded-lg border", className)}>
|
|
91
|
+
{product.image && <Image file={product.image} className="h-64 w-full object-cover" alt={product.name} />}
|
|
92
|
+
<div className="p-4">
|
|
93
|
+
<div className="mb-2 flex justify-between">
|
|
94
|
+
<h2 className="text-xl font-bold">{product.name}</h2>
|
|
95
|
+
<span className="text-lg font-bold">{product.price.toLocaleString()} KRW</span>
|
|
96
|
+
</div>
|
|
97
|
+
<p className="my-3">{product.description}</p>
|
|
98
|
+
<div className="grid grid-cols-2 gap-2 text-sm">
|
|
99
|
+
<div>
|
|
100
|
+
Category: <span className="font-medium">{product.category}</span>
|
|
101
|
+
</div>
|
|
102
|
+
<div>
|
|
103
|
+
SKU: <span className="font-medium">{product.sku}</span>
|
|
104
|
+
</div>
|
|
105
|
+
<div>
|
|
106
|
+
Manufacturer: <span className="font-medium">{product.manufacturer}</span>
|
|
107
|
+
</div>
|
|
108
|
+
<div>
|
|
109
|
+
Stock: <span className="font-medium">{product.stockQuantity}</span>
|
|
110
|
+
</div>
|
|
111
|
+
</div>
|
|
112
|
+
{product.tags?.length > 0 && (
|
|
113
|
+
<div className="mt-3 flex flex-wrap gap-1">
|
|
114
|
+
{product.tags.map((tag) => (
|
|
115
|
+
<span key={tag} className="badge badge-outline">
|
|
116
|
+
{tag}
|
|
117
|
+
</span>
|
|
118
|
+
))}
|
|
119
|
+
</div>
|
|
120
|
+
)}
|
|
121
|
+
</div>
|
|
122
|
+
</div>
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
// Additional specialized variations as needed
|
|
126
|
+
export const Row = ({ product, className }: { product: cnst.LightProduct; className?: string }) => (
|
|
127
|
+
<div className={clsx("flex items-center justify-between border-b p-3", className)}>
|
|
128
|
+
<div className="flex items-center gap-3">
|
|
129
|
+
{product.thumbnail && <Image file={product.thumbnail} className="h-10 w-10 rounded" alt={product.name} />}
|
|
130
|
+
<div>
|
|
131
|
+
<h3 className="font-medium">{product.name}</h3>
|
|
132
|
+
<div className="text-xs text-gray-500">SKU: {product.sku}</div>
|
|
133
|
+
</div>
|
|
134
|
+
</div>
|
|
135
|
+
<div className="text-right">
|
|
136
|
+
<div className="font-bold">{product.price.toLocaleString()} KRW</div>
|
|
137
|
+
<div className={clsx("text-xs", product.inStock ? "text-green-600" : "text-red-600")}>
|
|
138
|
+
{product.inStock ? `${product.stockQuantity} in stock` : "Out of stock"}
|
|
139
|
+
</div>
|
|
140
|
+
</div>
|
|
141
|
+
</div>
|
|
142
|
+
);
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### 3. Integration with LightModel Types
|
|
146
|
+
|
|
147
|
+
Model Units work with LightModel types defined in constant files:
|
|
148
|
+
|
|
149
|
+
```tsx
|
|
150
|
+
// In your constant.ts file
|
|
151
|
+
|
|
152
|
+
export class LightProduct extends via(ProductObject, ["name", "price", "sku", "inStock"] as const) {
|
|
153
|
+
get displayPrice() {
|
|
154
|
+
return `${this.price.toLocaleString()} KRW`;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// In your Unit.tsx file
|
|
159
|
+
import { cnst } from "@your-lib/client";
|
|
160
|
+
|
|
161
|
+
export const Abstract = ({ product }: { product: cnst.LightProduct }) => (
|
|
162
|
+
<div>
|
|
163
|
+
<h3>{product.name}</h3>
|
|
164
|
+
<p>{product.displayPrice}</p>
|
|
165
|
+
</div>
|
|
166
|
+
);
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### 4. Implementation Guidelines
|
|
170
|
+
|
|
171
|
+
1. **Server Component Requirements**:
|
|
172
|
+
|
|
173
|
+
- No client-side hooks (`useState`, `useEffect`, `useRouter`, etc.)
|
|
174
|
+
- No browser-only APIs (`localStorage`, `window`, etc.)
|
|
175
|
+
- No `"use client"` directive in the file
|
|
176
|
+
|
|
177
|
+
2. **Props Design**:
|
|
178
|
+
|
|
179
|
+
- Primary prop should be the model object (e.g., `product`, `user`, `story`)
|
|
180
|
+
- Always include `className` prop for styling customization
|
|
181
|
+
- Include `href` prop when the component might be used for navigation
|
|
182
|
+
- Keep prop interface consistent across export variations
|
|
183
|
+
|
|
184
|
+
3. **Component Variations**:
|
|
185
|
+
|
|
186
|
+
- `Abstract`: Compact representation with minimal information
|
|
187
|
+
- `Card`: Medium-detail representation in a card format
|
|
188
|
+
- `Full`: Complete representation with all relevant details
|
|
189
|
+
- Additional variations as needed (List, Row, Grid, etc.)
|
|
190
|
+
|
|
191
|
+
4. **Accessibility**:
|
|
192
|
+
- Use semantic HTML elements (`<article>`, `<section>`, `<h2>`, etc.)
|
|
193
|
+
- Include appropriate ARIA attributes
|
|
194
|
+
- Ensure proper image alt text
|
|
195
|
+
- Maintain keyboard navigability
|
|
196
|
+
|
|
197
|
+
## Best Practices
|
|
198
|
+
|
|
199
|
+
### 1. Component Variations and Consistent Exports
|
|
200
|
+
|
|
201
|
+
Define multiple components for different presentation contexts:
|
|
202
|
+
|
|
203
|
+
```tsx
|
|
204
|
+
// User.Unit.tsx - Consistent naming pattern
|
|
205
|
+
export const Abstract = ({ user }) => {}; // Minimal view
|
|
206
|
+
export const Card = ({ user }) => {}; // Card view
|
|
207
|
+
export const Full = ({ user }) => {}; // Complete view
|
|
208
|
+
export const Row = ({ user }) => {}; // Table row view
|
|
209
|
+
export const Avatar = ({ user }) => {}; // Avatar-only view
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### 2. Prop Handling and Styling
|
|
213
|
+
|
|
214
|
+
```tsx
|
|
215
|
+
// Best practice: Accept and forward className
|
|
216
|
+
export const Abstract = ({
|
|
217
|
+
user,
|
|
218
|
+
className,
|
|
219
|
+
...props
|
|
220
|
+
}: {
|
|
221
|
+
user: cnst.LightUser;
|
|
222
|
+
className?: string;
|
|
223
|
+
[key: string]: any;
|
|
224
|
+
}) => (
|
|
225
|
+
<div className={clsx("user-abstract rounded border p-3", className)} {...props}>
|
|
226
|
+
{/* content */}
|
|
227
|
+
</div>
|
|
228
|
+
);
|
|
229
|
+
|
|
230
|
+
// Best practice: Conditional rendering based on available data
|
|
231
|
+
export const Card = ({ user, className }: { user: cnst.LightUser; className?: string }) => (
|
|
232
|
+
<div className={clsx("card", className)}>
|
|
233
|
+
<div className="card-body">
|
|
234
|
+
<h3 className="card-title">{user.name}</h3>
|
|
235
|
+
{user.title && <p className="text-sm text-gray-600">{user.title}</p>}
|
|
236
|
+
{user.bio && <p className="mt-2">{user.bio}</p>}
|
|
237
|
+
{user.tags?.length > 0 && (
|
|
238
|
+
<div className="mt-2 flex gap-1">
|
|
239
|
+
{user.tags.map((tag) => (
|
|
240
|
+
<span key={tag} className="badge">
|
|
241
|
+
{tag}
|
|
242
|
+
</span>
|
|
243
|
+
))}
|
|
244
|
+
</div>
|
|
245
|
+
)}
|
|
246
|
+
</div>
|
|
247
|
+
</div>
|
|
248
|
+
);
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
### 3. Image Handling
|
|
252
|
+
|
|
253
|
+
Always use the optimized `Image` component from `@util/ui` with proper attributes:
|
|
254
|
+
|
|
255
|
+
```tsx
|
|
256
|
+
import { Image } from "akanjs/ui";
|
|
257
|
+
|
|
258
|
+
export const Card = ({ product }: { product: cnst.LightProduct }) => (
|
|
259
|
+
<div className="card">
|
|
260
|
+
{product.image ? (
|
|
261
|
+
<Image
|
|
262
|
+
file={product.image}
|
|
263
|
+
alt={product.name}
|
|
264
|
+
className="h-40 w-full object-cover"
|
|
265
|
+
sizes="(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw"
|
|
266
|
+
/>
|
|
267
|
+
) : (
|
|
268
|
+
<div className="flex h-40 w-full items-center justify-center bg-gray-200">
|
|
269
|
+
<span className="text-gray-400">No image</span>
|
|
270
|
+
</div>
|
|
271
|
+
)}
|
|
272
|
+
{/* Other content */}
|
|
273
|
+
</div>
|
|
274
|
+
);
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
### 4. Conditional Rendering and Link Handling
|
|
278
|
+
|
|
279
|
+
```tsx
|
|
280
|
+
export const Abstract = ({ post, href, className }: { post: cnst.LightPost; href?: string; className?: string }) => {
|
|
281
|
+
const Content = (
|
|
282
|
+
<div className={clsx("post-abstract p-3", className)}>
|
|
283
|
+
<h3 className="font-bold">{post.title}</h3>
|
|
284
|
+
<p className="line-clamp-2 text-sm text-gray-600">{post.summary}</p>
|
|
285
|
+
</div>
|
|
286
|
+
);
|
|
287
|
+
|
|
288
|
+
// Conditionally wrap with Link if href is provided
|
|
289
|
+
return href ? (
|
|
290
|
+
<Link href={href} className="block transition hover:bg-gray-50">
|
|
291
|
+
{Content}
|
|
292
|
+
</Link>
|
|
293
|
+
) : (
|
|
294
|
+
Content
|
|
295
|
+
);
|
|
296
|
+
};
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
### 5. Responsive Design
|
|
300
|
+
|
|
301
|
+
```tsx
|
|
302
|
+
export const Card = ({ event }: { event: cnst.LightEvent }) => (
|
|
303
|
+
<div className="card">
|
|
304
|
+
<div className="card-body">
|
|
305
|
+
<h3 className="text-lg font-bold md:text-xl">{event.title}</h3>
|
|
306
|
+
<div className="flex flex-col sm:flex-row sm:justify-between">
|
|
307
|
+
<div className="text-sm">{formatDate(event.startDate)}</div>
|
|
308
|
+
<div className="mt-1 text-sm sm:mt-0">{event.location}</div>
|
|
309
|
+
</div>
|
|
310
|
+
<p className="mt-2 line-clamp-3 text-sm md:text-base">{event.description}</p>
|
|
311
|
+
</div>
|
|
312
|
+
</div>
|
|
313
|
+
);
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
## Common Component Patterns and Variations
|
|
317
|
+
|
|
318
|
+
### 1. Hierarchical Components
|
|
319
|
+
|
|
320
|
+
```tsx
|
|
321
|
+
// Department.Unit.tsx
|
|
322
|
+
export const Tree = ({ department }: { department: cnst.LightDepartment }) => (
|
|
323
|
+
<div className="rounded border p-3">
|
|
324
|
+
<h3 className="font-bold">{department.name}</h3>
|
|
325
|
+
{department.children?.length > 0 && (
|
|
326
|
+
<div className="mt-2 border-l pl-4">
|
|
327
|
+
{department.children.map((child) => (
|
|
328
|
+
<Tree key={child.id} department={child} />
|
|
329
|
+
))}
|
|
330
|
+
</div>
|
|
331
|
+
)}
|
|
332
|
+
</div>
|
|
333
|
+
);
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
### 2. Status-Based Styling
|
|
337
|
+
|
|
338
|
+
```tsx
|
|
339
|
+
// Order.Unit.tsx
|
|
340
|
+
export const Card = ({ order }: { order: cnst.LightOrder }) => (
|
|
341
|
+
<div className="rounded border p-4">
|
|
342
|
+
<div className="flex justify-between">
|
|
343
|
+
<h3 className="font-bold">#{order.orderNumber}</h3>
|
|
344
|
+
<span
|
|
345
|
+
className={clsx(
|
|
346
|
+
"badge",
|
|
347
|
+
order.status === "completed" && "badge-success",
|
|
348
|
+
order.status === "processing" && "badge-info",
|
|
349
|
+
order.status === "cancelled" && "badge-error",
|
|
350
|
+
order.status === "pending" && "badge-warning"
|
|
351
|
+
)}
|
|
352
|
+
>
|
|
353
|
+
{order.status}
|
|
354
|
+
</span>
|
|
355
|
+
</div>
|
|
356
|
+
<div className="mt-2">
|
|
357
|
+
<div>Customer: {order.customerName}</div>
|
|
358
|
+
<div>Items: {order.itemCount}</div>
|
|
359
|
+
<div>Total: {order.totalAmount.toLocaleString()} KRW</div>
|
|
360
|
+
</div>
|
|
361
|
+
</div>
|
|
362
|
+
);
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
### 3. Detail and Summary Pattern
|
|
366
|
+
|
|
367
|
+
```tsx
|
|
368
|
+
// FAQ.Unit.tsx
|
|
369
|
+
export const Item = ({ faq }: { faq: cnst.LightFAQ }) => (
|
|
370
|
+
<details className="mb-2 overflow-hidden rounded border">
|
|
371
|
+
<summary className="cursor-pointer bg-gray-50 p-3 font-medium hover:bg-gray-100">{faq.question}</summary>
|
|
372
|
+
<div className="mt-2 p-3 pt-0">{faq.answer}</div>
|
|
373
|
+
</details>
|
|
374
|
+
);
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
### 4. Grid and List Variations
|
|
378
|
+
|
|
379
|
+
```tsx
|
|
380
|
+
// Product.Unit.tsx
|
|
381
|
+
// For grid layouts
|
|
382
|
+
export const Grid = ({ product }: { product: cnst.LightProduct }) => (
|
|
383
|
+
<div className="overflow-hidden rounded border">
|
|
384
|
+
{product.image && <Image file={product.image} className="h-40 w-full object-cover" alt={product.name} />}
|
|
385
|
+
<div className="p-3">
|
|
386
|
+
<h3 className="truncate font-bold">{product.name}</h3>
|
|
387
|
+
<p className="mt-1 font-bold">{product.price.toLocaleString()} KRW</p>
|
|
388
|
+
</div>
|
|
389
|
+
</div>
|
|
390
|
+
);
|
|
391
|
+
|
|
392
|
+
// For list layouts
|
|
393
|
+
export const List = ({ product }: { product: cnst.LightProduct }) => (
|
|
394
|
+
<div className="flex border-b py-3">
|
|
395
|
+
{product.thumbnail && <Image file={product.thumbnail} className="h-16 w-16 object-cover" alt={product.name} />}
|
|
396
|
+
<div className="ml-3 flex-grow">
|
|
397
|
+
<h3 className="font-medium">{product.name}</h3>
|
|
398
|
+
<p className="line-clamp-1 text-sm text-gray-600">{product.description}</p>
|
|
399
|
+
</div>
|
|
400
|
+
<div className="ml-3 text-right">
|
|
401
|
+
<p className="font-bold">{product.price.toLocaleString()} KRW</p>
|
|
402
|
+
<p className="text-xs text-gray-500">SKU: {product.sku}</p>
|
|
403
|
+
</div>
|
|
404
|
+
</div>
|
|
405
|
+
);
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
## Troubleshooting Common Issues
|
|
409
|
+
|
|
410
|
+
### 1. Server Component Errors
|
|
411
|
+
|
|
412
|
+
```
|
|
413
|
+
Error: useState is not defined in Model.Unit.tsx
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
**Solution**: Keep Model.Unit.tsx as server components without client-side hooks:
|
|
417
|
+
|
|
418
|
+
```tsx
|
|
419
|
+
// ❌ INCORRECT: Don't use client hooks in Unit components
|
|
420
|
+
export const Card = ({ product }) => {
|
|
421
|
+
const [expanded, setExpanded] = useState(false); // Error: client hook in server component
|
|
422
|
+
return (/* ... */);
|
|
423
|
+
};
|
|
424
|
+
|
|
425
|
+
// ✅ CORRECT: Keep Unit components as pure presentation components
|
|
426
|
+
export const Card = ({ product, expanded = false }) => {
|
|
427
|
+
return (/* Render based on expanded prop */);
|
|
428
|
+
};
|
|
429
|
+
|
|
430
|
+
// If you need interactivity, handle it in a client component that wraps the Unit:
|
|
431
|
+
// In a client component file:
|
|
432
|
+
"use client";
|
|
433
|
+
import { useState } from "react";
|
|
434
|
+
import { Product } from "@libs/shared/client";
|
|
435
|
+
|
|
436
|
+
export const ExpandableProductCard = ({ product }) => {
|
|
437
|
+
const [expanded, setExpanded] = useState(false);
|
|
438
|
+
return (
|
|
439
|
+
<div>
|
|
440
|
+
<Product.Unit.Card product={product} expanded={expanded} />
|
|
441
|
+
<button onClick={() => setExpanded(!expanded)}>
|
|
442
|
+
{expanded ? "Show Less" : "Show More"}
|
|
443
|
+
</button>
|
|
444
|
+
</div>
|
|
445
|
+
);
|
|
446
|
+
};
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
### 2. Image Handling Errors
|
|
450
|
+
|
|
451
|
+
```
|
|
452
|
+
Error: Image component requires "alt" prop
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
**Solution**: Always include alt text for images:
|
|
456
|
+
|
|
457
|
+
```tsx
|
|
458
|
+
// ❌ INCORRECT
|
|
459
|
+
<Image file={product.image} className="w-full" />
|
|
460
|
+
|
|
461
|
+
// ✅ CORRECT
|
|
462
|
+
<Image
|
|
463
|
+
file={product.image}
|
|
464
|
+
alt={product.name || "Product image"}
|
|
465
|
+
className="w-full"
|
|
466
|
+
/>
|
|
467
|
+
```
|
|
468
|
+
|
|
469
|
+
### 3. Conditional Rendering Issues
|
|
470
|
+
|
|
471
|
+
```
|
|
472
|
+
Error: Cannot read properties of undefined (reading 'url')
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
**Solution**: Always check for existence before accessing nested properties:
|
|
476
|
+
|
|
477
|
+
```tsx
|
|
478
|
+
// ❌ INCORRECT
|
|
479
|
+
<Image file={user.avatar.url} alt={user.name} />;
|
|
480
|
+
|
|
481
|
+
// ✅ CORRECT
|
|
482
|
+
{
|
|
483
|
+
user.avatar?.url && <Image file={user.avatar} alt={user.name} />;
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
// Alternative approach with default/fallback
|
|
487
|
+
{
|
|
488
|
+
user.avatar?.url ? (
|
|
489
|
+
<Image file={user.avatar} alt={user.name} />
|
|
490
|
+
) : (
|
|
491
|
+
<div className="avatar-placeholder">{user.name.charAt(0).toUpperCase()}</div>
|
|
492
|
+
);
|
|
493
|
+
}
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
### 4. Type Safety Issues
|
|
497
|
+
|
|
498
|
+
```
|
|
499
|
+
Type error: Property 'description' does not exist on type 'LightProduct'
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
**Solution**: Ensure you're only accessing properties defined in the LightModel:
|
|
503
|
+
|
|
504
|
+
```tsx
|
|
505
|
+
// In constant.ts
|
|
506
|
+
|
|
507
|
+
export class LightProduct extends via(ProductObject, ["name", "price", "sku"] as const) {
|
|
508
|
+
// Only these fields are guaranteed to be available
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
// ❌ INCORRECT: Accessing properties not in the LightModel
|
|
512
|
+
export const Card = ({ product }: { product: cnst.LightProduct }) => (
|
|
513
|
+
<div>
|
|
514
|
+
<h3>{product.name}</h3>
|
|
515
|
+
<p>{product.description}</p> // Error: description is not in LightProduct
|
|
516
|
+
</div>
|
|
517
|
+
);
|
|
518
|
+
|
|
519
|
+
// ✅ CORRECT: Check for optional properties
|
|
520
|
+
export const Card = ({ product }: { product: cnst.LightProduct }) => (
|
|
521
|
+
<div>
|
|
522
|
+
<h3>{product.name}</h3>
|
|
523
|
+
{/* Use optional chaining for properties that might not exist */}
|
|
524
|
+
{product.description && <p>{product.description}</p>}
|
|
525
|
+
</div>
|
|
526
|
+
);
|
|
527
|
+
```
|
|
528
|
+
|
|
529
|
+
## Conclusion
|
|
530
|
+
|
|
531
|
+
Model.Unit.tsx files are essential building blocks in the Akan.js framework, providing consistent, reusable presentation components for your domain models. By following these guidelines, you'll create well-structured, performant, and maintainable UI components that work seamlessly across your application.
|
|
532
|
+
|
|
533
|
+
Key takeaways:
|
|
534
|
+
|
|
535
|
+
- Create multiple component variations (Abstract, Card, Full, etc.) for different use cases
|
|
536
|
+
- Keep components as server components without client-side hooks
|
|
537
|
+
- Focus on presentation only, leaving business logic to Service files
|
|
538
|
+
- Follow consistent prop patterns with className and href support
|
|
539
|
+
- Ensure type safety by respecting LightModel type definitions
|
|
540
|
+
|
|
541
|
+
Well-designed Model.Unit components improve development velocity, maintain UI consistency, and enable seamless component reuse throughout your Akan.js applications.
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "Model Util",
|
|
3
|
+
"description": "How to create and implement Model.Util.ts files in Akan.js",
|
|
4
|
+
"scans": [
|
|
5
|
+
{
|
|
6
|
+
"type": "example",
|
|
7
|
+
"description": "Model Util examples",
|
|
8
|
+
"path": "{apps,libs}/*/lib/*/*.Util.ts{,x}",
|
|
9
|
+
"sample": 5
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"type": "source",
|
|
13
|
+
"description": "Example of high-quality Model.Util implementation",
|
|
14
|
+
"path": "libs/shared/lib/admin/Admin.Util.tsx"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"type": "source",
|
|
18
|
+
"description": "Example of complex Model.Util implementation",
|
|
19
|
+
"path": "libs/shared/lib/user/User.Util.tsx"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"type": "usage",
|
|
23
|
+
"description": "Model Util usage in pages",
|
|
24
|
+
"path": "apps/*/page/**/_index.tsx",
|
|
25
|
+
"filterText": ".Util.",
|
|
26
|
+
"sample": 3
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"type": "usage",
|
|
30
|
+
"description": "Model Util usage in Units",
|
|
31
|
+
"path": "{apps,libs}/*/lib/*/*.Unit.tsx",
|
|
32
|
+
"filterText": ".Util.",
|
|
33
|
+
"sample": 3
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"type": "usage",
|
|
37
|
+
"description": "Model Util usage in Templates",
|
|
38
|
+
"path": "{apps,libs}/*/lib/*/*.Template.tsx",
|
|
39
|
+
"filterText": ".Util.",
|
|
40
|
+
"sample": 2
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"type": "usage",
|
|
44
|
+
"description": "Model Util usage in Views",
|
|
45
|
+
"path": "{apps,libs}/*/lib/*/*.View.tsx",
|
|
46
|
+
"filterText": ".Util.",
|
|
47
|
+
"sample": 3
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"type": "usage",
|
|
51
|
+
"description": "Model Util usage in Zones",
|
|
52
|
+
"path": "{apps,libs}/*/lib/*/*.Zone.tsx",
|
|
53
|
+
"filterText": ".Util.",
|
|
54
|
+
"sample": 3
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"type": "related",
|
|
58
|
+
"description": "Relationship with model.store.ts",
|
|
59
|
+
"path": "{apps,libs}/*/lib/*/*.{store,signal}.ts",
|
|
60
|
+
"sample": 2
|
|
61
|
+
}
|
|
62
|
+
],
|
|
63
|
+
"update": {
|
|
64
|
+
"filePath": "./modelUtil.instruction.md",
|
|
65
|
+
"contents": [
|
|
66
|
+
"Purpose and role of Model.Util.ts files",
|
|
67
|
+
"How to create Model.Util.ts files",
|
|
68
|
+
"Common patterns and implementations",
|
|
69
|
+
"Using with store actions and state",
|
|
70
|
+
"Using with signal API calls",
|
|
71
|
+
"Performance optimization techniques",
|
|
72
|
+
"How to use Model.Util.ts files in pages",
|
|
73
|
+
"How to use Model.Util.ts files in Units",
|
|
74
|
+
"How to use Model.Util.ts files in Templates",
|
|
75
|
+
"How to use Model.Util.ts files in Views",
|
|
76
|
+
"How to use Model.Util.ts files in Zones",
|
|
77
|
+
"Best practices and error handling"
|
|
78
|
+
],
|
|
79
|
+
"rules": [
|
|
80
|
+
"Model.Util.tsx is a client component, so it can use client-side hooks like useEffect, useState, etc.",
|
|
81
|
+
"Model.Util.tsx is a utility component to reuse in pages, Units, Templates, Views, and Zones, etc.",
|
|
82
|
+
"Util components should be focused on a single responsibility",
|
|
83
|
+
"Util can be a wrapper component for using in server components",
|
|
84
|
+
"Util can be a wrapper component for store actions or signal api calls",
|
|
85
|
+
"Util components should handle their own loading and error states",
|
|
86
|
+
"Always use TypeScript for type safety in props and returned values",
|
|
87
|
+
"Consider memoization for performance-critical components",
|
|
88
|
+
"Follow consistent naming conventions (e.g., ActionButton, FilterPanel)",
|
|
89
|
+
"Document props with JSDoc comments for better IDE support"
|
|
90
|
+
]
|
|
91
|
+
},
|
|
92
|
+
"page": "/akanjs/(docs)/docs/module/util/_index.tsx"
|
|
93
|
+
}
|