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,106 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "Scalar Constant",
|
|
3
|
+
"description": "how to generate a scalar.constant.ts file",
|
|
4
|
+
"scans": [
|
|
5
|
+
{
|
|
6
|
+
"type": "source",
|
|
7
|
+
"description": "core constant library source code for scalar definitions",
|
|
8
|
+
"path": "pkgs/akanjs/constant/classMeta.ts"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"type": "source",
|
|
12
|
+
"description": "field metadata implementation",
|
|
13
|
+
"path": "pkgs/akanjs/constant/fieldMeta.ts"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"type": "source",
|
|
17
|
+
"description": "via() function and scalar implementation",
|
|
18
|
+
"path": "pkgs/akanjs/constant/baseGql.ts"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"type": "source",
|
|
22
|
+
"description": "base scalar types and enumOf implementation",
|
|
23
|
+
"path": "pkgs/akanjs/base/base.ts"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"type": "source",
|
|
27
|
+
"description": "GqlScalar type definition",
|
|
28
|
+
"path": "pkgs/akanjs/base/scalar.ts"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"type": "source",
|
|
32
|
+
"description": "constant metadata usage in graphql schema generation",
|
|
33
|
+
"path": "pkgs/akanjs/server/gql.ts"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"type": "source",
|
|
37
|
+
"description": "constant metadata usage in mongoDB schema generation",
|
|
38
|
+
"path": "pkgs/akanjs/server/schema.ts"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"type": "example",
|
|
42
|
+
"description": "simple scalar.constant.ts file examples",
|
|
43
|
+
"path": "{apps,libs}/*/lib/__scalar/*/*.constant.ts",
|
|
44
|
+
"query": "lines < 30",
|
|
45
|
+
"sample": 5
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"type": "example",
|
|
49
|
+
"description": "complex scalar.constant.ts file examples with enum definitions",
|
|
50
|
+
"path": "{apps,libs}/*/lib/__scalar/*/*.constant.ts",
|
|
51
|
+
"query": "lines > 30 && /enumOf/",
|
|
52
|
+
"sample": 3
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"type": "example",
|
|
56
|
+
"description": "scalar.constant.ts file examples with static methods",
|
|
57
|
+
"path": "{apps,libs}/*/lib/__scalar/*/*.constant.ts",
|
|
58
|
+
"query": "/static\\s+\\w+/",
|
|
59
|
+
"sample": 3
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"type": "example",
|
|
63
|
+
"description": "scalar.constant.ts file examples with nested scalar references",
|
|
64
|
+
"path": "{apps,libs}/*/lib/__scalar/*/*.constant.ts",
|
|
65
|
+
"query": "/import.*\\.constant/",
|
|
66
|
+
"sample": 3
|
|
67
|
+
}
|
|
68
|
+
],
|
|
69
|
+
"update": {
|
|
70
|
+
"filePath": "./scalarConstant.instruction.md",
|
|
71
|
+
"contents": [
|
|
72
|
+
"Purpose of scalar constants in Akan.js",
|
|
73
|
+
"File structure and location conventions",
|
|
74
|
+
"Naming standards for directories, files, classes and enums",
|
|
75
|
+
"Required imports from akanjs/constant and akanjs/base",
|
|
76
|
+
"Basic syntax with via() function",
|
|
77
|
+
"Field definitions with field() helper function",
|
|
78
|
+
"Field options reference table (default, min, max, minlength, maxlength, validate, example)",
|
|
79
|
+
"Available field types (String, Int, Float, Boolean, Date, ID)",
|
|
80
|
+
"Array fields using bracket notation [Type]",
|
|
81
|
+
"Optional fields using .optional() chain method",
|
|
82
|
+
"Enum definition with enumOf(name, values) class pattern",
|
|
83
|
+
"Instance methods in scalar classes",
|
|
84
|
+
"Static methods in scalar classes",
|
|
85
|
+
"Common mistakes and fixes",
|
|
86
|
+
"Implementation checklist",
|
|
87
|
+
"Full examples of scalar.constant.ts files"
|
|
88
|
+
],
|
|
89
|
+
"rules": [
|
|
90
|
+
"One scalar.constant.ts should contain only one scalar class extending via(). If you need more than one scalar model, make another scalar.constant.ts file.",
|
|
91
|
+
"The directory and filename convention is camelCase, such as `encourageInfo/encourageInfo.constant.ts`",
|
|
92
|
+
"The class name should be PascalCase, matching the camelCase directory name (e.g., EncourageInfo for encourageInfo)",
|
|
93
|
+
"Use `extends via((field) => ({...}))` pattern to define scalar classes, not decorators",
|
|
94
|
+
"Import `via` from `akanjs/constant` and `enumOf`, `ID`, `Int`, `Float`, `dayjs` from `akanjs/base`",
|
|
95
|
+
"The values of enum strings must be camelCase (e.g., 'waitPay', not 'WAIT_PAY')",
|
|
96
|
+
"Define enums using class pattern: `export class EnumName extends enumOf('enumName', [...] as const) {}`",
|
|
97
|
+
"The first argument of enumOf() is the enum name string used in dictionary/GraphQL",
|
|
98
|
+
"Use .optional() chain method for nullable fields, not { nullable: true } option",
|
|
99
|
+
"Use bracket notation for arrays ([Type]) rather than generics (Array<Type>)",
|
|
100
|
+
"Use factory functions for dynamic defaults: { default: () => dayjs() }, not { default: dayjs() }",
|
|
101
|
+
"Always export both the scalar class and enum classes",
|
|
102
|
+
"Add 'as const' to enum value arrays for better TypeScript type inference"
|
|
103
|
+
]
|
|
104
|
+
},
|
|
105
|
+
"page": "/akanjs/(docs)/docs/scalar/constant/_index.tsx"
|
|
106
|
+
}
|
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
# Scalar Constant Implementation Guide for Akan.js
|
|
2
|
+
|
|
3
|
+
## Purpose of Scalar Constants
|
|
4
|
+
|
|
5
|
+
Scalar constants in Akan.js serve as the foundation for complex data modeling by:
|
|
6
|
+
|
|
7
|
+
- Defining reusable value objects that can be embedded in other models
|
|
8
|
+
- Representing complex data types without creating database collections
|
|
9
|
+
- Providing standardized field definitions across the application
|
|
10
|
+
- Enabling type-safe data modeling and validation
|
|
11
|
+
- Serving as building blocks for larger domain models
|
|
12
|
+
|
|
13
|
+
## File Structure and Location
|
|
14
|
+
|
|
15
|
+
### Location Convention
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
{app,lib}/
|
|
19
|
+
└── */lib/__scalar/
|
|
20
|
+
└── <scalarName>/ # camelCase directory
|
|
21
|
+
└── <scalarName>.constant.ts # scalar definition file
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### Naming Standards
|
|
25
|
+
|
|
26
|
+
- **Directory**: `camelCase` (e.g., `encourageInfo`, `geoLocation`)
|
|
27
|
+
- **File**: `<scalarName>.constant.ts` (matches directory name)
|
|
28
|
+
- **Scalar Class**: `PascalCase` (e.g., `EncourageInfo`, `GeoLocation`)
|
|
29
|
+
- **Enum Class**: `PascalCase` (e.g., `Journey`, `NotiSetting`)
|
|
30
|
+
- **Enum Values**: `camelCase` (e.g., `firstJoin`, `waitPay`)
|
|
31
|
+
|
|
32
|
+
## Required Imports
|
|
33
|
+
|
|
34
|
+
### Essential Framework Imports
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
import { via } from "akanjs/constant";
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Common Base Types
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
import { ID, Int, Float, dayjs, enumOf } from "akanjs/base";
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Cross-Scalar References
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
import { OtherScalar } from "../otherScalar/otherScalar.constant";
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Basic Syntax with via()
|
|
53
|
+
|
|
54
|
+
The `via()` function is the foundation for defining scalars. It takes a callback that receives the `field()` function, which you use to define each field's type and options.
|
|
55
|
+
|
|
56
|
+
### Basic Structure
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
import { via } from "akanjs/constant";
|
|
60
|
+
|
|
61
|
+
export class ScalarName extends via((field) => ({
|
|
62
|
+
fieldName: field(FieldType),
|
|
63
|
+
fieldWithOptions: field(FieldType, { ...options }),
|
|
64
|
+
})) {
|
|
65
|
+
// Optional: Add instance methods here
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Simple Example
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
import { via } from "akanjs/constant";
|
|
73
|
+
|
|
74
|
+
export class RestrictInfo extends via((field) => ({
|
|
75
|
+
until: field(Date),
|
|
76
|
+
reason: field(String),
|
|
77
|
+
})) {}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Key Patterns
|
|
81
|
+
|
|
82
|
+
| Pattern | Description |
|
|
83
|
+
| -------------------------- | -------------------------------------------------------------------------------- |
|
|
84
|
+
| `via((field) => ({...}))` | Creates a class with typed fields. The callback receives the `field()` helper. |
|
|
85
|
+
| `field(Type)` | Defines a single field. First argument is the type (String, Number, Date, etc.). |
|
|
86
|
+
| `field(Type, { options })` | Optional second argument is an options object for defaults, validation, etc. |
|
|
87
|
+
|
|
88
|
+
## Available Field Types
|
|
89
|
+
|
|
90
|
+
### Primitive Types
|
|
91
|
+
|
|
92
|
+
```typescript
|
|
93
|
+
import { ID, Int, Float } from "akanjs/base";
|
|
94
|
+
import { via } from "akanjs/constant";
|
|
95
|
+
|
|
96
|
+
export class Example extends via((field) => ({
|
|
97
|
+
// String type
|
|
98
|
+
name: field(String),
|
|
99
|
+
|
|
100
|
+
// Number types
|
|
101
|
+
count: field(Int), // Integer
|
|
102
|
+
price: field(Float), // Floating point
|
|
103
|
+
|
|
104
|
+
// Boolean type
|
|
105
|
+
isActive: field(Boolean),
|
|
106
|
+
|
|
107
|
+
// Date type (internally uses Dayjs)
|
|
108
|
+
createdAt: field(Date),
|
|
109
|
+
|
|
110
|
+
// ID type (MongoDB ObjectId)
|
|
111
|
+
referenceId: field(ID),
|
|
112
|
+
})) {}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Array Types
|
|
116
|
+
|
|
117
|
+
Array types are defined by wrapping the type in square brackets:
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
export class Example extends via((field) => ({
|
|
121
|
+
// Array of strings
|
|
122
|
+
tags: field([String]),
|
|
123
|
+
|
|
124
|
+
// Array of numbers
|
|
125
|
+
scores: field([Int]),
|
|
126
|
+
|
|
127
|
+
// Array of other scalars
|
|
128
|
+
items: field([OtherScalar]),
|
|
129
|
+
|
|
130
|
+
// Nested arrays (2D matrix)
|
|
131
|
+
matrix: field([[Int]]),
|
|
132
|
+
})) {}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Optional Fields
|
|
136
|
+
|
|
137
|
+
Optional fields can be defined using the `.optional()` chain:
|
|
138
|
+
|
|
139
|
+
```typescript
|
|
140
|
+
import { ID, Int } from "akanjs/base";
|
|
141
|
+
import { via } from "akanjs/constant";
|
|
142
|
+
|
|
143
|
+
export class FileMeta extends via((field) => ({
|
|
144
|
+
fileId: field(ID).optional(), // Optional field
|
|
145
|
+
lastModifiedAt: field(Date),
|
|
146
|
+
size: field(Int),
|
|
147
|
+
})) {}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## Field Options Reference
|
|
151
|
+
|
|
152
|
+
| Option | Type | Default | Description | Example |
|
|
153
|
+
| ----------- | -------- | ----------- | ------------------------------------------------ | ----------------------------- |
|
|
154
|
+
| `default` | Any/Func | `undefined` | Default field value (static or factory function) | `{ default: 0 }` |
|
|
155
|
+
| `min` | Number | - | Minimum numeric value | `{ min: 0 }` |
|
|
156
|
+
| `max` | Number | - | Maximum numeric value | `{ max: 100 }` |
|
|
157
|
+
| `minlength` | Number | - | Minimum string length | `{ minlength: 3 }` |
|
|
158
|
+
| `maxlength` | Number | - | Maximum string length | `{ maxlength: 255 }` |
|
|
159
|
+
| `validate` | Function | - | Custom validation function | `{ validate: isPhoneNumber }` |
|
|
160
|
+
| `example` | Any | - | Example value for documentation | `{ example: [0, 0] }` |
|
|
161
|
+
|
|
162
|
+
### Field Options Examples
|
|
163
|
+
|
|
164
|
+
```typescript
|
|
165
|
+
import { dayjs, Int, Float } from "akanjs/base";
|
|
166
|
+
import { isPhoneNumber } from "akanjs/common";
|
|
167
|
+
import { via } from "akanjs/constant";
|
|
168
|
+
|
|
169
|
+
export class OrderInfo extends via((field) => ({
|
|
170
|
+
// Static default value
|
|
171
|
+
quantity: field(Int, { default: 1 }),
|
|
172
|
+
|
|
173
|
+
// Dynamic default using factory function
|
|
174
|
+
orderedAt: field(Date, { default: () => dayjs() }),
|
|
175
|
+
|
|
176
|
+
// Number range validation
|
|
177
|
+
rating: field(Float, { min: 0, max: 5 }),
|
|
178
|
+
|
|
179
|
+
// String length validation
|
|
180
|
+
description: field(String, { minlength: 10, maxlength: 500 }),
|
|
181
|
+
|
|
182
|
+
// Custom validation function
|
|
183
|
+
phone: field(String, { validate: isPhoneNumber }),
|
|
184
|
+
|
|
185
|
+
// Combined options
|
|
186
|
+
price: field(Float, {
|
|
187
|
+
default: 0,
|
|
188
|
+
min: 0,
|
|
189
|
+
example: 29.99,
|
|
190
|
+
}),
|
|
191
|
+
})) {}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### Static vs Dynamic Defaults
|
|
195
|
+
|
|
196
|
+
- Use **static values** for constants: `{ default: 0 }`, `{ default: "active" }`
|
|
197
|
+
- Use **factory functions** for values computed at creation time: `{ default: () => dayjs() }`, `{ default: () => new ObjectId() }`
|
|
198
|
+
|
|
199
|
+
## Enum Definition with enumOf()
|
|
200
|
+
|
|
201
|
+
The `enumOf()` function creates typed enum classes. Define enums before using them in your scalar fields.
|
|
202
|
+
|
|
203
|
+
### Basic Enum
|
|
204
|
+
|
|
205
|
+
```typescript
|
|
206
|
+
import { enumOf } from "akanjs/base";
|
|
207
|
+
import { via } from "akanjs/constant";
|
|
208
|
+
|
|
209
|
+
// Simple enum definition
|
|
210
|
+
export class NotiSetting extends enumOf("notiSetting", ["disagree", "fewer", "normal", "block"]) {}
|
|
211
|
+
|
|
212
|
+
// Using enum in a scalar
|
|
213
|
+
export class NotiInfo extends via((field) => ({
|
|
214
|
+
setting: field(NotiSetting, { default: "normal" }),
|
|
215
|
+
})) {}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### Enum with 'as const'
|
|
219
|
+
|
|
220
|
+
For better TypeScript type inference, use `as const`:
|
|
221
|
+
|
|
222
|
+
```typescript
|
|
223
|
+
import { dayjs, enumOf } from "akanjs/base";
|
|
224
|
+
import { via } from "akanjs/constant";
|
|
225
|
+
|
|
226
|
+
// Use "as const" for better type inference
|
|
227
|
+
export class Status extends enumOf("status", ["pending", "active", "completed", "cancelled"] as const) {}
|
|
228
|
+
|
|
229
|
+
export class Order extends via((field) => ({
|
|
230
|
+
status: field(Status, { default: "pending" }),
|
|
231
|
+
orderedAt: field(Date, { default: () => dayjs() }),
|
|
232
|
+
})) {}
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### Enum Key Points
|
|
236
|
+
|
|
237
|
+
| Point | Description |
|
|
238
|
+
| ---------------------- | ---------------------------------------------------------------------------------------- |
|
|
239
|
+
| `enumOf(name, values)` | First argument is the enum name (used in dictionary/GraphQL). Second is the value array. |
|
|
240
|
+
| camelCase Values | Always use camelCase for enum values (e.g., `"waitPay"`, not `"WAIT_PAY"`). |
|
|
241
|
+
| `as const` | Add `as const` to the values array for better TypeScript type inference. |
|
|
242
|
+
|
|
243
|
+
## Instance Methods
|
|
244
|
+
|
|
245
|
+
You can add instance methods directly to the scalar class for computed properties and utility functions:
|
|
246
|
+
|
|
247
|
+
```typescript
|
|
248
|
+
import { Int } from "akanjs/base";
|
|
249
|
+
import { via } from "akanjs/constant";
|
|
250
|
+
|
|
251
|
+
export class Stock extends via((field) => ({
|
|
252
|
+
total: field(Int, { default: 0, min: 0 }),
|
|
253
|
+
current: field(Int, { default: 0, min: 0 }),
|
|
254
|
+
})) {
|
|
255
|
+
getPercentage() {
|
|
256
|
+
if (this.total === 0) return 0;
|
|
257
|
+
return (this.current / this.total) * 100;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### Method Guidelines
|
|
263
|
+
|
|
264
|
+
- Instance methods have access to all fields via `this`
|
|
265
|
+
- Use them for calculations based on field values
|
|
266
|
+
- Methods defined in `constant.ts` are available on both server and client
|
|
267
|
+
- For server-only logic, use `document.ts` instead
|
|
268
|
+
|
|
269
|
+
## Static Methods
|
|
270
|
+
|
|
271
|
+
Scalar classes can include static methods for common operations:
|
|
272
|
+
|
|
273
|
+
```typescript
|
|
274
|
+
import { enumOf, Float } from "akanjs/base";
|
|
275
|
+
import { via } from "akanjs/constant";
|
|
276
|
+
|
|
277
|
+
export class CoordinateType extends enumOf("coordinateType", ["Point"] as const) {}
|
|
278
|
+
|
|
279
|
+
export class Coordinate extends via((field) => ({
|
|
280
|
+
type: field(CoordinateType, { default: "Point" }),
|
|
281
|
+
coordinates: field([Float], { default: [0, 0], example: [127.114367, 37.497114] }),
|
|
282
|
+
altitude: field(Float, { default: 0 }),
|
|
283
|
+
})) {
|
|
284
|
+
static getDistanceKm(loc1: Coordinate, loc2: Coordinate) {
|
|
285
|
+
const [lon1, lat1] = loc1.coordinates;
|
|
286
|
+
const [lon2, lat2] = loc2.coordinates;
|
|
287
|
+
const R = 6371; // Earth's radius in kilometers
|
|
288
|
+
// Distance calculation logic...
|
|
289
|
+
return distance;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
static moveMeters(loc: Coordinate, x: number, y: number): Coordinate {
|
|
293
|
+
// Calculate new position...
|
|
294
|
+
return { ...loc, coordinates: [newLon, newLat] };
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
## Common Mistakes and Fixes
|
|
300
|
+
|
|
301
|
+
| Issue | Wrong ❌ | Correct ✅ |
|
|
302
|
+
| --------------- | ---------------------------------- | ----------------------------------------- |
|
|
303
|
+
| Enum case | `enumOf("status", ["ACTIVE"])` | `enumOf("status", ["active"])` |
|
|
304
|
+
| Array syntax | `field(Array<Int>)` | `field([Int])` |
|
|
305
|
+
| Dynamic default | `{ default: dayjs() }` | `{ default: () => dayjs() }` |
|
|
306
|
+
| Missing export | `class Status extends enumOf(...)` | `export class Status extends enumOf(...)` |
|
|
307
|
+
| Optional field | `field(ID, { nullable: true })` | `field(ID).optional()` |
|
|
308
|
+
|
|
309
|
+
### Important Note
|
|
310
|
+
|
|
311
|
+
For Date defaults that should be computed at creation time, **always use a factory function**:
|
|
312
|
+
|
|
313
|
+
```typescript
|
|
314
|
+
// ❌ Wrong - creates a single fixed date at module load
|
|
315
|
+
{ default: dayjs() }
|
|
316
|
+
|
|
317
|
+
// ✅ Correct - creates a new date each time
|
|
318
|
+
{ default: () => dayjs() }
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
## Implementation Checklist
|
|
322
|
+
|
|
323
|
+
### File-Level
|
|
324
|
+
|
|
325
|
+
- [ ] File location: `__scalar/<camelCase>/<camelCase>.constant.ts`
|
|
326
|
+
- [ ] Import `via` from `akanjs/constant`
|
|
327
|
+
- [ ] Import `enumOf` from `akanjs/base` (if using enums)
|
|
328
|
+
- [ ] Export all classes (scalar and enums)
|
|
329
|
+
|
|
330
|
+
### Naming
|
|
331
|
+
|
|
332
|
+
- [ ] Use PascalCase for class names
|
|
333
|
+
- [ ] Use camelCase for enum values
|
|
334
|
+
- [ ] Class name matches directory name in PascalCase
|
|
335
|
+
|
|
336
|
+
### Field Definition
|
|
337
|
+
|
|
338
|
+
- [ ] Use `[Type]` syntax for arrays
|
|
339
|
+
- [ ] Use factory functions for dynamic defaults
|
|
340
|
+
- [ ] Use `.optional()` for nullable fields
|
|
341
|
+
- [ ] Add `as const` for large enum value arrays
|
|
342
|
+
|
|
343
|
+
## Full Examples
|
|
344
|
+
|
|
345
|
+
### Basic Scalar Example
|
|
346
|
+
|
|
347
|
+
```typescript
|
|
348
|
+
// libs/payment/lib/__scalar/amount/amount.constant.ts
|
|
349
|
+
import { Float } from "akanjs/base";
|
|
350
|
+
import { via } from "akanjs/constant";
|
|
351
|
+
|
|
352
|
+
export class Amount extends via((field) => ({
|
|
353
|
+
value: field(Float, { min: 0, default: 0 }),
|
|
354
|
+
currency: field(String, { default: "USD" }),
|
|
355
|
+
})) {}
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
### Scalar with Enum
|
|
359
|
+
|
|
360
|
+
```typescript
|
|
361
|
+
// apps/akasys/lib/__scalar/version/version.constant.ts
|
|
362
|
+
import { dayjs, enumOf } from "akanjs/base";
|
|
363
|
+
import { via } from "akanjs/constant";
|
|
364
|
+
|
|
365
|
+
export class VersionStatus extends enumOf("versionStatus", ["active", "expired"] as const) {}
|
|
366
|
+
|
|
367
|
+
export class Version extends via((field) => ({
|
|
368
|
+
source: field(File).optional(),
|
|
369
|
+
appBuild: field(File).optional(),
|
|
370
|
+
build: field(File).optional(),
|
|
371
|
+
status: field(VersionStatus, { default: "active" }),
|
|
372
|
+
at: field(Date, { default: () => dayjs() }),
|
|
373
|
+
})) {}
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
### Scalar with Optional Fields
|
|
377
|
+
|
|
378
|
+
```typescript
|
|
379
|
+
// apps/angelo/lib/__scalar/estimate/estimate.constant.ts
|
|
380
|
+
import { Float, Int } from "akanjs/base";
|
|
381
|
+
import { via } from "akanjs/constant";
|
|
382
|
+
|
|
383
|
+
export class Estimate extends via((field) => ({
|
|
384
|
+
name: field(String),
|
|
385
|
+
value: field(Float, { min: 0, default: 0 }),
|
|
386
|
+
num: field(Int, { min: 1, default: 1 }),
|
|
387
|
+
unit: field(String).optional(),
|
|
388
|
+
note: field(String).optional(),
|
|
389
|
+
})) {}
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
### Complex Scalar with Static Methods
|
|
393
|
+
|
|
394
|
+
```typescript
|
|
395
|
+
// libs/util/lib/__scalar/coordinate/coordinate.constant.ts
|
|
396
|
+
import { enumOf, Float } from "akanjs/base";
|
|
397
|
+
import { via } from "akanjs/constant";
|
|
398
|
+
|
|
399
|
+
export class CoordinateType extends enumOf("coordinateType", ["Point"] as const) {}
|
|
400
|
+
|
|
401
|
+
export class Coordinate extends via((field) => ({
|
|
402
|
+
type: field(CoordinateType, { default: "Point" }),
|
|
403
|
+
coordinates: field([Float], { default: [0, 0], example: [127.114367, 37.497114] }),
|
|
404
|
+
altitude: field(Float, { default: 0 }),
|
|
405
|
+
})) {
|
|
406
|
+
static getDistanceKm(loc1: Coordinate, loc2: Coordinate) {
|
|
407
|
+
const [lon1, lat1] = loc1.coordinates;
|
|
408
|
+
const [lon2, lat2] = loc2.coordinates;
|
|
409
|
+
const R = 6371;
|
|
410
|
+
// ... calculation logic
|
|
411
|
+
return distance;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
static moveMeters(loc: Coordinate, x: number, y: number, z: number = 0): Coordinate {
|
|
415
|
+
const [lon, lat] = loc.coordinates;
|
|
416
|
+
const dx = ((x / 1000 / 6371) * (180 / Math.PI)) / Math.cos(lat * (Math.PI / 180));
|
|
417
|
+
const dy = (y / 1000 / 6371) * (180 / Math.PI);
|
|
418
|
+
return { ...loc, coordinates: [lon + dx, lat + dy], altitude: loc.altitude + z };
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
## Pro Tips
|
|
424
|
+
|
|
425
|
+
- **Keep scalars focused**: If it grows too large, split it into multiple scalars
|
|
426
|
+
- **Value objects only**: Avoid adding ID or timestamp fields (use Models for that)
|
|
427
|
+
- **Define enums first**: Define enums before the scalar class that uses them
|
|
428
|
+
- **Dictionary support**: Don't forget to create `dictionary.ts` for i18n support
|
|
429
|
+
- **Reusability**: Create separate scalars for commonly used structures
|
|
430
|
+
|
|
431
|
+
## Summary
|
|
432
|
+
|
|
433
|
+
1. **Location**: `__scalar/<camelCase>/<camelCase>.constant.ts`
|
|
434
|
+
2. **Import**: `via` from `akanjs/constant`, `enumOf` from `akanjs/base`
|
|
435
|
+
3. **Scalar Class**: `export class Name extends via((field) => ({...})) {}`
|
|
436
|
+
4. **Enum Class**: `export class EnumName extends enumOf("enumName", [...] as const) {}`
|
|
437
|
+
5. **Fields**: `field(Type)` or `field(Type, { options })`
|
|
438
|
+
6. **Optional**: Use `.optional()` chain method
|
|
439
|
+
7. **Arrays**: Use `[Type]` syntax
|
|
440
|
+
8. **Enum Values**: Always camelCase
|
|
441
|
+
|
|
442
|
+
Following these patterns ensures type-safe, maintainable scalar definitions that integrate seamlessly with the Akan.js framework's data modeling layer.
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "Scalar Dictionary",
|
|
3
|
+
"description": "How to create and maintain scalar.dictionary.ts files in Akan.js",
|
|
4
|
+
"scans": [
|
|
5
|
+
{
|
|
6
|
+
"type": "source",
|
|
7
|
+
"description": "scalarDictionary builder function implementation",
|
|
8
|
+
"path": "pkgs/akanjs/dictionary/scalarDictionary.ts"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"type": "source",
|
|
12
|
+
"description": "Translation types and interfaces",
|
|
13
|
+
"path": "pkgs/akanjs/dictionary/trans.ts"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"type": "source",
|
|
17
|
+
"description": "Dictionary exports and types",
|
|
18
|
+
"path": "pkgs/akanjs/dictionary/index.ts"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"type": "example",
|
|
22
|
+
"description": "Simple scalar dictionary examples",
|
|
23
|
+
"path": "{apps,libs}/**/lib/__scalar/*/*.dictionary.ts",
|
|
24
|
+
"query": "lines < 30",
|
|
25
|
+
"sample": 3
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"type": "example",
|
|
29
|
+
"description": "Scalar dictionaries with enum translations",
|
|
30
|
+
"path": "{apps,libs}/**/lib/__scalar/*/*.dictionary.ts",
|
|
31
|
+
"query": "/\\.enum</",
|
|
32
|
+
"sample": 3
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"type": "example",
|
|
36
|
+
"description": "Complete scalar dictionary with field and enum translations",
|
|
37
|
+
"path": "{apps,libs}/**/lib/__scalar/*/*.dictionary.ts",
|
|
38
|
+
"query": "lines > 30",
|
|
39
|
+
"sample": 2
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"type": "example",
|
|
43
|
+
"description": "Scalar dictionaries with multiple enums",
|
|
44
|
+
"path": "{apps,libs}/**/lib/__scalar/*/*.dictionary.ts",
|
|
45
|
+
"query": "/\\.enum<.*\\.enum</",
|
|
46
|
+
"sample": 2
|
|
47
|
+
}
|
|
48
|
+
],
|
|
49
|
+
"update": {
|
|
50
|
+
"filePath": "./scalarDictionary.instruction.md",
|
|
51
|
+
"contents": [
|
|
52
|
+
"Purpose of scalar dictionary files",
|
|
53
|
+
"File structure and naming conventions",
|
|
54
|
+
"Required imports from akanjs/dictionary",
|
|
55
|
+
"scalarDictionary() builder pattern",
|
|
56
|
+
"Builder methods: .of(), .model<T>(), .enum<T>()",
|
|
57
|
+
"Translation format with t() function and .desc() method",
|
|
58
|
+
"Type imports from constant file using import type",
|
|
59
|
+
"Enum name matching with enumOf() name",
|
|
60
|
+
"Type safety through generic parameters",
|
|
61
|
+
"Common mistakes and fixes",
|
|
62
|
+
"Best practices for translations",
|
|
63
|
+
"Implementation checklist",
|
|
64
|
+
"Full examples with multiple enums"
|
|
65
|
+
],
|
|
66
|
+
"rules": [
|
|
67
|
+
"Import scalarDictionary from 'akanjs/dictionary'",
|
|
68
|
+
"Import types from constant file using 'import type' syntax",
|
|
69
|
+
"Initialize with language order array: scalarDictionary(['en', 'ko'])",
|
|
70
|
+
"Use .of() method to define scalar name and description",
|
|
71
|
+
"Use .model<Type>() method with generic to define field translations",
|
|
72
|
+
"Use .enum<Type>('enumName', ...) method to define enum translations",
|
|
73
|
+
"The enum name string in .enum() must exactly match the first argument of enumOf() in constant file",
|
|
74
|
+
"Always chain .desc() after t() to provide descriptions: t([...]).desc([...])",
|
|
75
|
+
"Use exactly two string elements in translation arrays: [English, Korean]",
|
|
76
|
+
"Export as 'dictionary': export const dictionary = scalarDictionary(...)...",
|
|
77
|
+
"Use type generics (.model<Type>, .enum<Type>) for TypeScript validation",
|
|
78
|
+
"Provide meaningful descriptions that explain purpose, not just repeat labels",
|
|
79
|
+
"Match language order consistently across all dictionaries in the project"
|
|
80
|
+
]
|
|
81
|
+
},
|
|
82
|
+
"page": "/akanjs/(docs)/docs/scalar/dictionary/_index.tsx"
|
|
83
|
+
}
|