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.
Files changed (682) hide show
  1. package/CODE_OF_CONDUCT.md +54 -0
  2. package/CONTRIBUTING.md +83 -0
  3. package/LICENSE +21 -0
  4. package/README.ko.md +244 -0
  5. package/README.md +237 -6
  6. package/base/base.ts +194 -0
  7. package/base/baseEnv.ts +162 -0
  8. package/base/index.ts +6 -0
  9. package/base/primitiveRegistry.ts +342 -0
  10. package/base/symbols.ts +11 -0
  11. package/base/types.ts +137 -0
  12. package/base/utils.ts +30 -0
  13. package/cli/application/application.command.ts +213 -0
  14. package/cli/application/application.interface.tsx +225 -0
  15. package/cli/application/application.runner.ts +359 -0
  16. package/cli/application/application.script.ts +244 -0
  17. package/cli/build.ts +25 -0
  18. package/cli/cloud/cloud.command.ts +48 -0
  19. package/cli/cloud/cloud.runner.ts +158 -0
  20. package/cli/cloud/cloud.script.ts +40 -0
  21. package/cli/guideline/guideline.command.ts +31 -0
  22. package/cli/guideline/guideline.prompt.ts +212 -0
  23. package/cli/guideline/guideline.runner.ts +53 -0
  24. package/cli/guideline/guideline.script.ts +33 -0
  25. package/cli/guidelines/___library/sharedUiStructureDescription.en.md +767 -0
  26. package/cli/guidelines/___library/utilUiStructureDescription.en.md +395 -0
  27. package/cli/guidelines/___lint/lintRuleDescription.en.md +64 -0
  28. package/cli/guidelines/___module/moduleStructureDescription.en.md +80 -0
  29. package/cli/guidelines/componentRule/componentRule.generate.json +131 -0
  30. package/cli/guidelines/componentRule/componentRule.instruction.md +637 -0
  31. package/cli/guidelines/cssRule/cssRule.generate.json +93 -0
  32. package/cli/guidelines/cssRule/cssRule.instruction.md +435 -0
  33. package/cli/guidelines/databaseModule/databaseModule.generate.json +51 -0
  34. package/cli/guidelines/databaseModule/databaseModule.instruction.md +612 -0
  35. package/cli/guidelines/docPageRule/docPageRule.generate.json +72 -0
  36. package/cli/guidelines/docPageRule/docPageRule.instruction.md +389 -0
  37. package/cli/guidelines/enumConstant/enumConstant.generate.json +24 -0
  38. package/cli/guidelines/enumConstant/enumConstant.instruction.md +232 -0
  39. package/cli/guidelines/framework/framework.generate.json +119 -0
  40. package/cli/guidelines/framework/framework.instruction.md +1110 -0
  41. package/cli/guidelines/howToUseStore/howToUseStore.generate.json +0 -0
  42. package/cli/guidelines/modelConstant/modelConstant.generate.json +128 -0
  43. package/cli/guidelines/modelConstant/modelConstant.instruction.md +506 -0
  44. package/cli/guidelines/modelDictionary/modelDictionary.generate.json +108 -0
  45. package/cli/guidelines/modelDictionary/modelDictionary.instruction.md +547 -0
  46. package/cli/guidelines/modelDocument/modelDocument.generate.json +129 -0
  47. package/cli/guidelines/modelDocument/modelDocument.instruction.md +536 -0
  48. package/cli/guidelines/modelService/modelService.generate.json +135 -0
  49. package/cli/guidelines/modelService/modelService.instruction.md +708 -0
  50. package/cli/guidelines/modelSignal/modelSignal.generate.json +201 -0
  51. package/cli/guidelines/modelSignal/modelSignal.instruction.md +552 -0
  52. package/cli/guidelines/modelStore/modelStore.generate.json +130 -0
  53. package/cli/guidelines/modelStore/modelStore.instruction.md +585 -0
  54. package/cli/guidelines/modelTemplate/modelTemplate.generate.json +104 -0
  55. package/cli/guidelines/modelTemplate/modelTemplate.instruction.md +604 -0
  56. package/cli/guidelines/modelUnit/modelUnit.generate.json +92 -0
  57. package/cli/guidelines/modelUnit/modelUnit.instruction.md +541 -0
  58. package/cli/guidelines/modelUtil/modelUtil.generate.json +93 -0
  59. package/cli/guidelines/modelUtil/modelUtil.instruction.md +752 -0
  60. package/cli/guidelines/modelView/modelView.generate.json +80 -0
  61. package/cli/guidelines/modelView/modelView.instruction.md +1005 -0
  62. package/cli/guidelines/modelZone/modelZone.generate.json +126 -0
  63. package/cli/guidelines/modelZone/modelZone.instruction.md +528 -0
  64. package/cli/guidelines/scalarConstant/scalarConstant.generate.json +106 -0
  65. package/cli/guidelines/scalarConstant/scalarConstant.instruction.md +442 -0
  66. package/cli/guidelines/scalarDictionary/scalarDictionary.generate.json +83 -0
  67. package/cli/guidelines/scalarDictionary/scalarDictionary.instruction.md +273 -0
  68. package/cli/guidelines/scalarModule/scalarModule.generate.json +35 -0
  69. package/cli/guidelines/scalarModule/scalarModule.instruction.md +81 -0
  70. package/cli/guidelines/sharedUiUsage/sharedUiUsage.generate.json +108 -0
  71. package/cli/guidelines/sharedUiUsage/sharedUiUsage.instruction.md +310 -0
  72. package/cli/guidelines/utilUiUsage/utilUiUsage.generate.json +140 -0
  73. package/cli/guidelines/utilUiUsage/utilUiUsage.instruction.md +339 -0
  74. package/cli/index.js +11401 -0
  75. package/cli/index.ts +24 -0
  76. package/cli/library/library.command.ts +28 -0
  77. package/cli/library/library.runner.ts +69 -0
  78. package/cli/library/library.script.ts +39 -0
  79. package/cli/module/module.command.ts +35 -0
  80. package/cli/module/module.prompt.ts +18 -0
  81. package/cli/module/module.request.ts +319 -0
  82. package/cli/module/module.runner.ts +76 -0
  83. package/cli/module/module.script.ts +161 -0
  84. package/cli/package/package.command.ts +32 -0
  85. package/cli/package/package.runner.ts +64 -0
  86. package/cli/package/package.script.ts +35 -0
  87. package/cli/page/page.command.ts +14 -0
  88. package/cli/page/page.runner.ts +14 -0
  89. package/cli/page/page.script.ts +12 -0
  90. package/cli/scalar/scalar.command.ts +21 -0
  91. package/cli/scalar/scalar.prompt.ts +131 -0
  92. package/cli/scalar/scalar.runner.ts +38 -0
  93. package/cli/scalar/scalar.script.ts +16 -0
  94. package/cli/templates/__scalar/__model__/__model__.constant.ts +15 -0
  95. package/cli/templates/__scalar/__model__/__model__.dictionary.ts +19 -0
  96. package/cli/templates/__scalar/__model__/__model__.document.ts +15 -0
  97. package/cli/templates/app/akan.config.ts +14 -0
  98. package/cli/templates/app/capacitor.config.ts.template +8 -0
  99. package/cli/templates/app/common/commonLogic.ts +12 -0
  100. package/cli/templates/app/common/index.ts +10 -0
  101. package/cli/templates/app/env/env.client.debug.ts.template +7 -0
  102. package/cli/templates/app/env/env.client.develop.ts.template +7 -0
  103. package/cli/templates/app/env/env.client.local.ts.template +7 -0
  104. package/cli/templates/app/env/env.client.main.ts.template +7 -0
  105. package/cli/templates/app/env/env.client.testing.ts.template +7 -0
  106. package/cli/templates/app/env/env.client.ts +21 -0
  107. package/cli/templates/app/env/env.client.type.ts +16 -0
  108. package/cli/templates/app/env/env.server.debug.ts.template +7 -0
  109. package/cli/templates/app/env/env.server.develop.ts.template +9 -0
  110. package/cli/templates/app/env/env.server.local.ts.template +14 -0
  111. package/cli/templates/app/env/env.server.main.ts.template +9 -0
  112. package/cli/templates/app/env/env.server.testing.ts.template +6 -0
  113. package/cli/templates/app/env/env.server.ts +20 -0
  114. package/cli/templates/app/lib/___appName__/__appName__.dictionary.ts +17 -0
  115. package/cli/templates/app/lib/___appName__/__appName__.service.ts +13 -0
  116. package/cli/templates/app/lib/___appName__/__appName__.signal.ts +17 -0
  117. package/cli/templates/app/lib/___appName__/__appName__.store.ts +15 -0
  118. package/cli/templates/app/lib/option.ts +17 -0
  119. package/cli/templates/app/main.ts +16 -0
  120. package/cli/templates/app/package.json.template +5 -0
  121. package/cli/templates/app/page/_index.tsx +172 -0
  122. package/cli/templates/app/page/_layout.tsx +32 -0
  123. package/cli/templates/app/page/styles.css.template +53 -0
  124. package/cli/templates/app/public/favicon.ico +0 -0
  125. package/cli/templates/app/public/logo.png +0 -0
  126. package/cli/templates/app/srvkit/backendLogic.ts +12 -0
  127. package/cli/templates/app/srvkit/index.ts +10 -0
  128. package/cli/templates/app/tsconfig.json.template +21 -0
  129. package/cli/templates/app/ui/UiComponent.ts +16 -0
  130. package/cli/templates/app/ui/index.ts +10 -0
  131. package/cli/templates/app/webkit/frontendLogic.ts +12 -0
  132. package/cli/templates/app/webkit/index.ts +10 -0
  133. package/cli/templates/client.ts +46 -0
  134. package/cli/templates/crudPages/[__model__Id]/edit/page.tsx +47 -0
  135. package/cli/templates/crudPages/[__model__Id]/page.tsx +52 -0
  136. package/cli/templates/crudPages/new/page.tsx +42 -0
  137. package/cli/templates/crudPages/page.tsx +43 -0
  138. package/cli/templates/crudSinglePage/page.tsx +37 -0
  139. package/cli/templates/env/_env.server.type.ts +16 -0
  140. package/cli/templates/facetIndex/index.ts +32 -0
  141. package/cli/templates/index.ts +10 -0
  142. package/cli/templates/lib/__lib/lib.constant.ts +38 -0
  143. package/cli/templates/lib/__lib/lib.dictionary.ts +33 -0
  144. package/cli/templates/lib/__lib/lib.document.ts +35 -0
  145. package/cli/templates/lib/__lib/lib.service.ts +33 -0
  146. package/cli/templates/lib/__lib/lib.signal.ts +34 -0
  147. package/cli/templates/lib/__lib/lib.store.ts +33 -0
  148. package/cli/templates/lib/cnst.ts +29 -0
  149. package/cli/templates/lib/db.ts +32 -0
  150. package/cli/templates/lib/dict.ts +49 -0
  151. package/cli/templates/lib/sig.ts +60 -0
  152. package/cli/templates/lib/srv.ts +34 -0
  153. package/cli/templates/lib/st.ts +31 -0
  154. package/cli/templates/lib/useClient.ts +19 -0
  155. package/cli/templates/lib/useServer.ts +7 -0
  156. package/cli/templates/libRoot/.gitignore.template +16 -0
  157. package/cli/templates/libRoot/akan.config.ts +12 -0
  158. package/cli/templates/libRoot/base/baseLogic.ts +10 -0
  159. package/cli/templates/libRoot/base/index.ts +8 -0
  160. package/cli/templates/libRoot/common/commonLogic.ts +10 -0
  161. package/cli/templates/libRoot/common/index.ts +8 -0
  162. package/cli/templates/libRoot/env/env.server.example.ts.template +6 -0
  163. package/cli/templates/libRoot/env/env.server.testing.ts.template +6 -0
  164. package/cli/templates/libRoot/lib/___libName__/__libName__.dictionary.ts +15 -0
  165. package/cli/templates/libRoot/lib/___libName__/__libName__.service.ts +11 -0
  166. package/cli/templates/libRoot/lib/___libName__/__libName__.store.ts +13 -0
  167. package/cli/templates/libRoot/lib/option.ts +17 -0
  168. package/cli/templates/libRoot/package.json.template +5 -0
  169. package/cli/templates/libRoot/srvkit/backendLogic.ts +10 -0
  170. package/cli/templates/libRoot/srvkit/index.ts +8 -0
  171. package/cli/templates/libRoot/tsconfig.json.template +11 -0
  172. package/cli/templates/libRoot/ui/index.ts +7 -0
  173. package/cli/templates/libRoot/webkit/frontendLogic.ts +10 -0
  174. package/cli/templates/libRoot/webkit/index.ts +8 -0
  175. package/cli/templates/localDev/docker-compose.yaml.template +37 -0
  176. package/cli/templates/module/__Model__.Template.tsx +36 -0
  177. package/cli/templates/module/__Model__.Unit.tsx +26 -0
  178. package/cli/templates/module/__Model__.Util.tsx +30 -0
  179. package/cli/templates/module/__Model__.View.tsx +29 -0
  180. package/cli/templates/module/__Model__.Zone.tsx +43 -0
  181. package/cli/templates/module/__model__.constant.ts +24 -0
  182. package/cli/templates/module/__model__.dictionary.ts +30 -0
  183. package/cli/templates/module/__model__.document.ts +23 -0
  184. package/cli/templates/module/__model__.service.ts +16 -0
  185. package/cli/templates/module/__model__.signal.ts +27 -0
  186. package/cli/templates/module/__model__.store.ts +19 -0
  187. package/cli/templates/module/index.tsx +44 -0
  188. package/cli/templates/moduleRoot/index.tsx +31 -0
  189. package/cli/templates/pkgRoot/tsconfig.json.template +10 -0
  190. package/cli/templates/server.ts +45 -0
  191. package/cli/templates/workspaceRoot/.env.template +14 -0
  192. package/cli/templates/workspaceRoot/.gitignore.template +130 -0
  193. package/cli/templates/workspaceRoot/.vscode/settings.json.template +23 -0
  194. package/cli/templates/workspaceRoot/biome.json.template +175 -0
  195. package/cli/templates/workspaceRoot/bunfig.toml +4 -0
  196. package/cli/templates/workspaceRoot/infra/app/Chart.yaml.template +6 -0
  197. package/cli/templates/workspaceRoot/infra/app/templates/frontend.yaml.template +182 -0
  198. package/cli/templates/workspaceRoot/infra/app/values/_common-values.yaml.template +183 -0
  199. package/cli/templates/workspaceRoot/package.json.template +7 -0
  200. package/cli/templates/workspaceRoot/tsconfig.json.template +26 -0
  201. package/cli/testHelpers.ts +171 -0
  202. package/cli/workspace/workspace.command.ts +60 -0
  203. package/cli/workspace/workspace.runner.ts +57 -0
  204. package/cli/workspace/workspace.script.ts +68 -0
  205. package/client/capacitor.ts +68 -0
  206. package/client/clientRuntime.ts +141 -0
  207. package/client/cookie.ts +121 -0
  208. package/client/createFont.ts +8 -0
  209. package/client/csrTypes.ts +259 -0
  210. package/client/decorators.ts +25 -0
  211. package/client/device.ts +147 -0
  212. package/client/fetch.ts +1 -0
  213. package/client/index.ts +15 -0
  214. package/client/locale.ts +4 -0
  215. package/client/makePageProto.tsx +178 -0
  216. package/client/router.ts +286 -0
  217. package/client/rscNavigation.ts +19 -0
  218. package/client/storage.ts +33 -0
  219. package/client/translator.ts +43 -0
  220. package/client/types.ts +228 -0
  221. package/client/useClient.ts +1 -0
  222. package/common/Logger.ts +177 -0
  223. package/common/applyMixins.ts +14 -0
  224. package/common/capitalize.ts +4 -0
  225. package/common/deepObjectify.ts +27 -0
  226. package/common/formatNumber.ts +14 -0
  227. package/common/formatPhone.ts +7 -0
  228. package/common/getAllPropertyDescriptors.ts +13 -0
  229. package/common/hmrPhase.ts +17 -0
  230. package/common/httpClient.ts +101 -0
  231. package/common/index.ts +50 -0
  232. package/common/isDayjs.ts +3 -0
  233. package/common/isEmail.ts +2 -0
  234. package/common/isPhoneNumber.ts +8 -0
  235. package/common/isQueryEqual.ts +23 -0
  236. package/common/isValidDate.ts +14 -0
  237. package/common/localeConfig.ts +41 -0
  238. package/common/lowerlize.ts +4 -0
  239. package/common/mergeVersion.ts +10 -0
  240. package/common/objectify.ts +7 -0
  241. package/common/pathGet.ts +13 -0
  242. package/common/pathSet.ts +16 -0
  243. package/common/randomPick.ts +1 -0
  244. package/common/randomPicks.ts +12 -0
  245. package/common/routeConvention.ts +203 -0
  246. package/common/sleep.ts +8 -0
  247. package/common/splitVersion.ts +11 -0
  248. package/common/subRoute.ts +34 -0
  249. package/common/types.ts +15 -0
  250. package/constant/constantRegistry.ts +334 -0
  251. package/constant/crystalize.ts +45 -0
  252. package/constant/deserialize.ts +70 -0
  253. package/constant/fieldInfo.ts +415 -0
  254. package/constant/getDefault.ts +18 -0
  255. package/constant/immerify.ts +16 -0
  256. package/constant/index.ts +10 -0
  257. package/constant/purify.ts +118 -0
  258. package/constant/serialize.ts +87 -0
  259. package/constant/types.ts +105 -0
  260. package/constant/via.ts +360 -0
  261. package/devkit/aiEditor.ts +299 -0
  262. package/devkit/akanApp/akanApp.host.ts +356 -0
  263. package/devkit/akanApp/index.ts +1 -0
  264. package/devkit/akanConfig/akanConfig.ts +332 -0
  265. package/devkit/akanConfig/index.ts +2 -0
  266. package/devkit/akanConfig/types.ts +187 -0
  267. package/devkit/applicationBuildReporter.ts +69 -0
  268. package/devkit/applicationBuildRunner.ts +302 -0
  269. package/devkit/applicationReleasePackager.ts +205 -0
  270. package/devkit/artifact/implicitRootLayout.ts +155 -0
  271. package/devkit/artifact/index.ts +1 -0
  272. package/devkit/artifact/routeSeedIndex.ts +128 -0
  273. package/devkit/auth.ts +41 -0
  274. package/devkit/builder.ts +164 -0
  275. package/devkit/capacitor.base.config.ts +74 -0
  276. package/devkit/capacitorApp.ts +385 -0
  277. package/devkit/commandDecorators/argMeta.ts +88 -0
  278. package/devkit/commandDecorators/command.ts +314 -0
  279. package/devkit/commandDecorators/commandBuilder.ts +188 -0
  280. package/devkit/commandDecorators/commandMeta.ts +6 -0
  281. package/devkit/commandDecorators/dependencyBuilder.ts +100 -0
  282. package/devkit/commandDecorators/helpFormatter.ts +217 -0
  283. package/devkit/commandDecorators/index.ts +8 -0
  284. package/devkit/commandDecorators/targetMeta.ts +31 -0
  285. package/devkit/commandDecorators/types.ts +10 -0
  286. package/devkit/constants.ts +25 -0
  287. package/devkit/createTunnel.ts +36 -0
  288. package/devkit/dependencyScanner.ts +339 -0
  289. package/devkit/executors.ts +1326 -0
  290. package/devkit/extractDeps.ts +85 -0
  291. package/devkit/fileEditor.ts +106 -0
  292. package/devkit/fileSys.ts +39 -0
  293. package/devkit/frontendBuild/allRoutesBuilder.ts +103 -0
  294. package/devkit/frontendBuild/clientBuildTypes.ts +114 -0
  295. package/devkit/frontendBuild/clientEntriesBundler.ts +300 -0
  296. package/devkit/frontendBuild/clientEntryDiscovery.ts +196 -0
  297. package/devkit/frontendBuild/csrArtifactBuilder.ts +237 -0
  298. package/devkit/frontendBuild/cssCompiler.ts +279 -0
  299. package/devkit/frontendBuild/cssImportResolver.ts +116 -0
  300. package/devkit/frontendBuild/fontOptimizer.ts +427 -0
  301. package/devkit/frontendBuild/hmrChangeClassifier.ts +28 -0
  302. package/devkit/frontendBuild/hmrWatcher.ts +101 -0
  303. package/devkit/frontendBuild/index.ts +18 -0
  304. package/devkit/frontendBuild/pagesBundleBuilder.ts +137 -0
  305. package/devkit/frontendBuild/pagesEntrySourceGenerator.ts +37 -0
  306. package/devkit/frontendBuild/precompressArtifacts.ts +59 -0
  307. package/devkit/frontendBuild/routeClientBuilder.ts +290 -0
  308. package/devkit/frontendBuild/routesManifestArtifactSerializer.ts +62 -0
  309. package/devkit/frontendBuild/ssrBaseArtifactBuilder.ts +139 -0
  310. package/devkit/frontendBuild/vendorSpecifiers.ts +16 -0
  311. package/devkit/frontendBuild/watchRootResolver.ts +28 -0
  312. package/devkit/getCredentials.ts +19 -0
  313. package/devkit/getDirname.ts +3 -0
  314. package/devkit/getModelFileData.ts +59 -0
  315. package/devkit/getRelatedCnsts.ts +300 -0
  316. package/devkit/guideline.ts +19 -0
  317. package/devkit/incrementalBuilder/incrementalBuilder.host.ts +78 -0
  318. package/devkit/incrementalBuilder/incrementalBuilder.proc.ts +330 -0
  319. package/devkit/incrementalBuilder/index.ts +1 -0
  320. package/devkit/index.ts +36 -0
  321. package/devkit/lint/no-import-client-functions.grit +32 -0
  322. package/devkit/lint/no-import-external-library.grit +21 -0
  323. package/devkit/lint/no-js-private-class-method.grit +42 -0
  324. package/devkit/lint/no-use-client-in-server.grit +7 -0
  325. package/devkit/lint/non-scalar-props-restricted.grit +13 -0
  326. package/devkit/linter.ts +248 -0
  327. package/devkit/mobile/index.ts +1 -0
  328. package/devkit/mobile/mobileTarget.ts +47 -0
  329. package/devkit/prompter.ts +71 -0
  330. package/devkit/scanInfo.ts +605 -0
  331. package/devkit/selectModel.ts +11 -0
  332. package/devkit/spinner.ts +54 -0
  333. package/devkit/sshTunnel.ts +151 -0
  334. package/devkit/streamAi.ts +45 -0
  335. package/devkit/transforms/barrelAnalyzer.ts +249 -0
  336. package/devkit/transforms/barrelImportsPlugin.ts +451 -0
  337. package/devkit/transforms/externalizeFrameworkPlugin.ts +159 -0
  338. package/devkit/transforms/index.ts +5 -0
  339. package/devkit/transforms/rscUseClientTransform.ts +52 -0
  340. package/devkit/transforms/useClientBundlePlugin.ts +47 -0
  341. package/devkit/typeChecker.ts +260 -0
  342. package/devkit/types.ts +42 -0
  343. package/devkit/ui/MultiScrollList.tsx +228 -0
  344. package/devkit/ui/ScrollList.tsx +106 -0
  345. package/devkit/ui/index.ts +2 -0
  346. package/devkit/uploadRelease.ts +95 -0
  347. package/devkit/useStdoutDimensions.ts +20 -0
  348. package/dictionary/base.dictionary.ts +91 -0
  349. package/dictionary/dictInfo.ts +1079 -0
  350. package/dictionary/dictionary.ts +10 -0
  351. package/dictionary/index.ts +12 -0
  352. package/dictionary/locale.ts +230 -0
  353. package/dictionary/trans.ts +196 -0
  354. package/document/by.ts +39 -0
  355. package/document/dataLoader.ts +91 -0
  356. package/document/database.ts +168 -0
  357. package/document/databaseRegistry.ts +113 -0
  358. package/document/documentQuery.ts +143 -0
  359. package/document/documentSchema.ts +91 -0
  360. package/document/filterMeta.ts +210 -0
  361. package/document/index.ts +11 -0
  362. package/document/into.ts +169 -0
  363. package/document/loaderInfo.ts +50 -0
  364. package/document/schema.ts +24 -0
  365. package/document/types.ts +41 -0
  366. package/fetch/client/fetchClient.ts +600 -0
  367. package/fetch/client/httpClient.ts +157 -0
  368. package/fetch/client/index.ts +3 -0
  369. package/fetch/client/wsClient.ts +246 -0
  370. package/fetch/fetchType/appliedReturn.type.ts +108 -0
  371. package/fetch/fetchType/buildFetch.type.ts +24 -0
  372. package/fetch/fetchType/clientSignal.type.ts +22 -0
  373. package/fetch/fetchType/endpointFetch.type.ts +56 -0
  374. package/fetch/fetchType/index.ts +5 -0
  375. package/fetch/fetchType/sliceFetch.type.ts +173 -0
  376. package/fetch/index.ts +4 -0
  377. package/fetch/requestStorage.ts +127 -0
  378. package/fetch/serializer/fetch.serializer.ts +131 -0
  379. package/fetch/serializer/index.ts +1 -0
  380. package/fetch/types.ts +28 -0
  381. package/package.json +202 -5
  382. package/server/SSR_MEMORY_DIAGNOSIS.md +107 -0
  383. package/server/akanApp.ts +855 -0
  384. package/server/akanLib.ts +43 -0
  385. package/server/akanOption.ts +42 -0
  386. package/server/akanServer.ts +369 -0
  387. package/server/artifact/builderRpc.ts +124 -0
  388. package/server/artifact/index.ts +6 -0
  389. package/server/artifact/ipcTypes.ts +46 -0
  390. package/server/artifact/manifestTypes.ts +19 -0
  391. package/server/artifact/routeClientCache.ts +224 -0
  392. package/server/artifact/routeSeedIndexStore.ts +89 -0
  393. package/server/artifact/routesManifestStore.ts +120 -0
  394. package/server/decorators.ts +95 -0
  395. package/server/di/diLifecycle.ts +520 -0
  396. package/server/di/index.ts +4 -0
  397. package/server/di/predefinedAdaptor.ts +77 -0
  398. package/server/di/resolveAdaptorHierarchy.ts +82 -0
  399. package/server/di/resolveHierarchy.ts +89 -0
  400. package/server/di/resolveServiceHierarchy.ts +47 -0
  401. package/server/di/utils.ts +40 -0
  402. package/server/hmr/changeBatch.ts +14 -0
  403. package/server/hmr/clientScript.ts +310 -0
  404. package/server/hmr/devHmrController.ts +395 -0
  405. package/server/hmr/index.ts +4 -0
  406. package/server/hmr/wsHub.ts +56 -0
  407. package/server/imageOptimizer.ts +427 -0
  408. package/server/imageOptimizerError.ts +8 -0
  409. package/server/index.ts +14 -0
  410. package/server/lifecycle/shutdownManager.ts +52 -0
  411. package/server/logging/rotatingLogWriter.ts +190 -0
  412. package/server/processMetricsCollector.ts +78 -0
  413. package/server/proxy/akanResponse.ts +16 -0
  414. package/server/proxy/bunRequestFields.ts +12 -0
  415. package/server/proxy/hostBasePathWebProxy.ts +112 -0
  416. package/server/proxy/index.ts +15 -0
  417. package/server/proxy/localeWebProxy.ts +71 -0
  418. package/server/proxy/types.ts +41 -0
  419. package/server/proxy/webProxyRunner.ts +90 -0
  420. package/server/resolver/database.resolver.ts +340 -0
  421. package/server/resolver/index.ts +3 -0
  422. package/server/resolver/resolver.contract.fixture.ts +222 -0
  423. package/server/resolver/service.resolver.ts +176 -0
  424. package/server/resolver/signal.resolver.ts +386 -0
  425. package/server/robots.ts +32 -0
  426. package/server/routeElementComposer.tsx +91 -0
  427. package/server/routeTreeBuilder.ts +279 -0
  428. package/server/routing/apiRouter.ts +226 -0
  429. package/server/rscClient.tsx +140 -0
  430. package/server/rscWorker.tsx +625 -0
  431. package/server/rscWorkerHost.ts +616 -0
  432. package/server/sitemap.ts +90 -0
  433. package/server/ssrFromRscRenderer.tsx +285 -0
  434. package/server/ssrTypes.ts +48 -0
  435. package/server/types/react-server-dom-webpack.d.ts +91 -0
  436. package/server/types.tsx +109 -0
  437. package/server/vendor/akanjs-base.ts +1 -0
  438. package/server/vendor/akanjs-common.ts +1 -0
  439. package/server/vendor/akanjs-constant.ts +1 -0
  440. package/server/vendor/akanjs-store.ts +1 -0
  441. package/server/vendor/react-dom-client.ts +5 -0
  442. package/server/vendor/react-dom.ts +21 -0
  443. package/server/vendor/react-jsx-dev-runtime.ts +5 -0
  444. package/server/vendor/react-jsx-runtime.ts +5 -0
  445. package/server/vendor/react-refresh-runtime.ts +6 -0
  446. package/server/vendor/react-server-dom-webpack-client-browser.ts +12 -0
  447. package/server/vendor/react.ts +51 -0
  448. package/server/vendor/scheduler.ts +23 -0
  449. package/server/webRouter.ts +712 -0
  450. package/service/adapt.ts +47 -0
  451. package/service/base.service.ts +18 -0
  452. package/service/index.ts +10 -0
  453. package/service/injectInfo.ts +393 -0
  454. package/service/ipcTypes.ts +127 -0
  455. package/service/predefinedAdaptor/cache.adaptor.ts +105 -0
  456. package/service/predefinedAdaptor/compress.adaptor.ts +357 -0
  457. package/service/predefinedAdaptor/database.adaptor.ts +1310 -0
  458. package/service/predefinedAdaptor/index.ts +13 -0
  459. package/service/predefinedAdaptor/logging.adaptor.ts +36 -0
  460. package/service/predefinedAdaptor/queue.adaptor.ts +42 -0
  461. package/service/predefinedAdaptor/role.adaptor.ts +18 -0
  462. package/service/predefinedAdaptor/schedule.adaptor.ts +188 -0
  463. package/service/predefinedAdaptor/solidCache.adaptor.ts +143 -0
  464. package/service/predefinedAdaptor/solidPubsub.adaptor.ts +98 -0
  465. package/service/predefinedAdaptor/solidQueue.adaptor.ts +203 -0
  466. package/service/predefinedAdaptor/solidSqlite.ts +85 -0
  467. package/service/predefinedAdaptor/sqlitePath.ts +20 -0
  468. package/service/predefinedAdaptor/storage.adaptor.ts +121 -0
  469. package/service/predefinedAdaptor/websocket.adaptor.ts +313 -0
  470. package/service/serve.ts +223 -0
  471. package/service/serviceModule.ts +221 -0
  472. package/service/serviceRegistry.ts +26 -0
  473. package/service/types.ts +113 -0
  474. package/signal/base.signal.ts +46 -0
  475. package/signal/endpoint.ts +122 -0
  476. package/signal/endpointInfo.ts +374 -0
  477. package/signal/exception.ts +50 -0
  478. package/signal/guard.ts +18 -0
  479. package/signal/guards.ts +16 -0
  480. package/signal/index.ts +18 -0
  481. package/signal/intercept.ts +39 -0
  482. package/signal/internal.ts +56 -0
  483. package/signal/internalArg.ts +38 -0
  484. package/signal/internalInfo.ts +208 -0
  485. package/signal/middleware.ts +108 -0
  486. package/signal/serializer/fetch.serializer.ts +128 -0
  487. package/signal/serializer/index.ts +1 -0
  488. package/signal/serverSignal.ts +114 -0
  489. package/signal/signalContext.ts +446 -0
  490. package/signal/signalRegistry.ts +82 -0
  491. package/signal/slice.ts +158 -0
  492. package/signal/sliceInfo.ts +254 -0
  493. package/signal/types.ts +131 -0
  494. package/store/action.ts +1067 -0
  495. package/store/baseSt.ts +81 -0
  496. package/store/hooks.ts +2 -0
  497. package/store/index.ts +8 -0
  498. package/store/rootStore.ts +26 -0
  499. package/store/state.ts +226 -0
  500. package/store/stateBuilder.ts +429 -0
  501. package/store/stateInfo.ts +66 -0
  502. package/store/store.ts +194 -0
  503. package/store/storeInstance.ts +382 -0
  504. package/store/storeRegistry.ts +84 -0
  505. package/store/types.ts +69 -0
  506. package/store/withSelector.ts +62 -0
  507. package/test/index.ts +16 -0
  508. package/test/playwright.config.base.ts +48 -0
  509. package/test/playwright.pageAgent.ts +41 -0
  510. package/test/sample.ts +19 -0
  511. package/test/sampleOf.ts +70 -0
  512. package/test/signalTest.preload.ts +10 -0
  513. package/test/signalTestRuntime.ts +126 -0
  514. package/test/testServer.ts +187 -0
  515. package/ui/BottomSheet.tsx +103 -0
  516. package/ui/Button.tsx +70 -0
  517. package/ui/ClientSide.tsx +11 -0
  518. package/ui/Clipboard.tsx +49 -0
  519. package/ui/Constant/Doc.tsx +696 -0
  520. package/ui/Constant/Mermaid.tsx +149 -0
  521. package/ui/Constant/index.ts +6 -0
  522. package/ui/Constant/schemaDoc.ts +324 -0
  523. package/ui/Copy.tsx +27 -0
  524. package/ui/CsrImage.tsx +38 -0
  525. package/ui/Data/CardList.tsx +141 -0
  526. package/ui/Data/Dashboard.tsx +72 -0
  527. package/ui/Data/Insight.tsx +35 -0
  528. package/ui/Data/Item.tsx +285 -0
  529. package/ui/Data/ListContainer.tsx +320 -0
  530. package/ui/Data/Pagination.tsx +54 -0
  531. package/ui/Data/QueryMaker.tsx +21 -0
  532. package/ui/Data/TableList.tsx +161 -0
  533. package/ui/Data/index.ts +11 -0
  534. package/ui/Data/index_.tsx +11 -0
  535. package/ui/DatePicker.tsx +184 -0
  536. package/ui/Dialog/Action.tsx +15 -0
  537. package/ui/Dialog/Close.tsx +22 -0
  538. package/ui/Dialog/Content.tsx +11 -0
  539. package/ui/Dialog/Modal.tsx +137 -0
  540. package/ui/Dialog/Provider.tsx +33 -0
  541. package/ui/Dialog/Title.tsx +15 -0
  542. package/ui/Dialog/Trigger.tsx +22 -0
  543. package/ui/Dialog/context.ts +20 -0
  544. package/ui/Dialog/index.tsx +15 -0
  545. package/ui/DragAction.tsx +129 -0
  546. package/ui/DraggableList.tsx +230 -0
  547. package/ui/Dropdown.tsx +51 -0
  548. package/ui/Empty.tsx +32 -0
  549. package/ui/Field.tsx +1556 -0
  550. package/ui/FontFace.tsx +26 -0
  551. package/ui/Image.tsx +185 -0
  552. package/ui/InfiniteScroll.tsx +67 -0
  553. package/ui/Input.tsx +636 -0
  554. package/ui/KeyboardAvoiding.tsx +62 -0
  555. package/ui/Layout/BottomAction.tsx +15 -0
  556. package/ui/Layout/BottomInset.tsx +42 -0
  557. package/ui/Layout/BottomTab.tsx +71 -0
  558. package/ui/Layout/Header.tsx +38 -0
  559. package/ui/Layout/LeftSider.tsx +34 -0
  560. package/ui/Layout/Navbar.tsx +46 -0
  561. package/ui/Layout/RightSider.tsx +41 -0
  562. package/ui/Layout/Sider.tsx +69 -0
  563. package/ui/Layout/Template.tsx +11 -0
  564. package/ui/Layout/TopLeftAction.tsx +28 -0
  565. package/ui/Layout/Unit.tsx +19 -0
  566. package/ui/Layout/View.tsx +12 -0
  567. package/ui/Layout/Zone.tsx +10 -0
  568. package/ui/Layout/index.ts +27 -0
  569. package/ui/Link/Back.tsx +15 -0
  570. package/ui/Link/Close.tsx +20 -0
  571. package/ui/Link/CsrLink.tsx +41 -0
  572. package/ui/Link/Lang.tsx +16 -0
  573. package/ui/Link/SsrLink.tsx +68 -0
  574. package/ui/Link/index.tsx +32 -0
  575. package/ui/Link/types.ts +47 -0
  576. package/ui/Load/Edit.tsx +19 -0
  577. package/ui/Load/Edit_Client.tsx +120 -0
  578. package/ui/Load/Page.tsx +40 -0
  579. package/ui/Load/PageCSR.tsx +39 -0
  580. package/ui/Load/Pagination.tsx +89 -0
  581. package/ui/Load/Units.tsx +330 -0
  582. package/ui/Load/View.tsx +115 -0
  583. package/ui/Load/index.ts +11 -0
  584. package/ui/Load/index_.tsx +6 -0
  585. package/ui/Loading/Area.tsx +10 -0
  586. package/ui/Loading/Button.tsx +17 -0
  587. package/ui/Loading/Input.tsx +17 -0
  588. package/ui/Loading/ProgressBar.tsx +14 -0
  589. package/ui/Loading/Skeleton.tsx +22 -0
  590. package/ui/Loading/Spin.tsx +22 -0
  591. package/ui/Loading/index.tsx +8 -0
  592. package/ui/Menu.tsx +273 -0
  593. package/ui/Modal.tsx +87 -0
  594. package/ui/Model/AdminPanel.tsx +51 -0
  595. package/ui/Model/Edit.tsx +46 -0
  596. package/ui/Model/EditModal.tsx +301 -0
  597. package/ui/Model/EditWrapper.tsx +48 -0
  598. package/ui/Model/LoadInit.tsx +11 -0
  599. package/ui/Model/New.tsx +46 -0
  600. package/ui/Model/NewWrapper.tsx +20 -0
  601. package/ui/Model/NewWrapper_Client.tsx +57 -0
  602. package/ui/Model/Remove.tsx +75 -0
  603. package/ui/Model/RemoveWrapper.tsx +38 -0
  604. package/ui/Model/SureToRemove.tsx +108 -0
  605. package/ui/Model/View.tsx +65 -0
  606. package/ui/Model/ViewEditModal.tsx +125 -0
  607. package/ui/Model/ViewModal.tsx +71 -0
  608. package/ui/Model/ViewWrapper.tsx +38 -0
  609. package/ui/Model/index.ts +33 -0
  610. package/ui/Model/index_.tsx +16 -0
  611. package/ui/More.tsx +56 -0
  612. package/ui/ObjectId.tsx +29 -0
  613. package/ui/Pagination.tsx +120 -0
  614. package/ui/Popconfirm.tsx +135 -0
  615. package/ui/Portal.tsx +10 -0
  616. package/ui/Radio.tsx +53 -0
  617. package/ui/RecentTime.tsx +123 -0
  618. package/ui/Refresh.tsx +24 -0
  619. package/ui/ScreenNavigator.tsx +129 -0
  620. package/ui/Select.tsx +322 -0
  621. package/ui/Signal/Arg.tsx +352 -0
  622. package/ui/Signal/Doc.tsx +231 -0
  623. package/ui/Signal/Listener.tsx +74 -0
  624. package/ui/Signal/Message.tsx +267 -0
  625. package/ui/Signal/Object.tsx +131 -0
  626. package/ui/Signal/PubSub.tsx +247 -0
  627. package/ui/Signal/Request.tsx +30 -0
  628. package/ui/Signal/Response.tsx +76 -0
  629. package/ui/Signal/RestApi.tsx +390 -0
  630. package/ui/Signal/WebSocket.tsx +47 -0
  631. package/ui/Signal/index.ts +10 -0
  632. package/ui/Signal/makeExample.ts +75 -0
  633. package/ui/System/CSR.tsx +420 -0
  634. package/ui/System/Client.tsx +296 -0
  635. package/ui/System/Common.tsx +83 -0
  636. package/ui/System/DevModeToggle.tsx +21 -0
  637. package/ui/System/Gtag.tsx +69 -0
  638. package/ui/System/Messages.tsx +175 -0
  639. package/ui/System/Reconnect.tsx +156 -0
  640. package/ui/System/Root.tsx +10 -0
  641. package/ui/System/SSR.tsx +163 -0
  642. package/ui/System/SelectLanguage.tsx +47 -0
  643. package/ui/System/ThemeToggle.tsx +98 -0
  644. package/ui/System/index.tsx +23 -0
  645. package/ui/Tab/Menu.tsx +56 -0
  646. package/ui/Tab/Menus.tsx +10 -0
  647. package/ui/Tab/Panel.tsx +25 -0
  648. package/ui/Tab/Provider.tsx +25 -0
  649. package/ui/Tab/context.ts +16 -0
  650. package/ui/Tab/index.tsx +11 -0
  651. package/ui/Table.tsx +131 -0
  652. package/ui/ToggleSelect.tsx +144 -0
  653. package/ui/Unauthorized.tsx +29 -0
  654. package/ui/animated.tsx +8 -0
  655. package/ui/fontCss.ts +86 -0
  656. package/ui/index.ts +44 -0
  657. package/ui/styles.css +617 -0
  658. package/webkit/bootCsr.tsx +275 -0
  659. package/webkit/createRobotPage.ts +15 -0
  660. package/webkit/createSitemapPage.ts +4 -0
  661. package/webkit/index.ts +19 -0
  662. package/webkit/lazy.tsx +37 -0
  663. package/webkit/types.ts +7 -0
  664. package/webkit/useCamera.tsx +99 -0
  665. package/webkit/useCodepush.tsx +99 -0
  666. package/webkit/useContact.tsx +48 -0
  667. package/webkit/useCsrValues.ts +661 -0
  668. package/webkit/useDebounce.ts +24 -0
  669. package/webkit/useFetch.ts +48 -0
  670. package/webkit/useGeoLocation.tsx +24 -0
  671. package/webkit/useHistory.ts +76 -0
  672. package/webkit/useInterval.ts +21 -0
  673. package/webkit/useLocation.ts +69 -0
  674. package/webkit/usePurchase.tsx +156 -0
  675. package/webkit/usePushNoti.tsx +48 -0
  676. package/webkit/useThrottle.ts +22 -0
  677. package/src/index.js +0 -2
  678. package/src/index.js.map +0 -1
  679. package/src/lib/akan2.js +0 -4
  680. package/src/lib/akan2.js.map +0 -1
  681. package/src/run.js +0 -4
  682. package/src/run.js.map +0 -1
@@ -0,0 +1,612 @@
1
+ # Database Module in Akan.js
2
+
3
+ ## Purpose of Database Modules
4
+
5
+ Database modules in Akan.js provide a structured approach to building domain-specific features with seamless integration between server and client:
6
+
7
+ 1. **Domain Encapsulation**: Encapsulate all domain-specific logic (models, services, signals) in a consistent structure
8
+ 2. **Full-Stack Integration**: Enable seamless integration between MongoDB, NestJS server, and React client
9
+ 3. **Type Safety**: Ensure type safety across the entire stack with auto-generated GraphQL types
10
+ 4. **Automated CRUD**: Provide automatic CRUD operations through standardized patterns
11
+ 5. **Real-time Capabilities**: Support for websockets, GraphQL subscriptions, and background processing
12
+ 6. **Security**: Implement role-based access control and validation at every level
13
+
14
+ ## File Structure and Location Conventions
15
+
16
+ A complete database module follows this structure:
17
+
18
+ ```
19
+ libs/shared/lib/[module-name]/
20
+ ├── [ModuleName].Template.tsx // Form components
21
+ ├── [ModuleName].Unit.tsx // Card/list view components
22
+ ├── [ModuleName].Util.tsx // Utility components (dashboard, insights)
23
+ ├── [ModuleName].View.tsx // Single item view components
24
+ ├── [ModuleName].Zone.tsx // Main zone layout and routing
25
+ ├── [module-name].constant.ts // Model definitions
26
+ ├── [module-name].dictionary.ts // Translations
27
+ ├── [module-name].document.ts // Database schema
28
+ ├── [module-name].service.ts // Business logic
29
+ ├── [module-name].signal.ts // API endpoints
30
+ ├── [module-name].store.ts // Client state management
31
+ └── index.tsx // Module exports
32
+ ```
33
+
34
+ ## How to Create Database Modules
35
+
36
+ ### 1. Define Model Schema (`[module-name].constant.ts`)
37
+
38
+ Start by defining your data model schema using the decorator pattern:
39
+
40
+ ```typescript
41
+ import { Dayjs, dayjs, enumOf, Int } from "akanjs/base";
42
+ import { Field, Filter, Model, sortOf, via } from "akanjs/constant";
43
+ import { validate } from "@libs/util/common";
44
+
45
+ // Define enums
46
+ export const UserRole = enumOf(["user", "admin"] as const);
47
+ export type UserRole = enumOf<typeof UserRole>;
48
+
49
+ // Define input model (for create/update operations)
50
+
51
+ export class UserInput {
52
+ @Field.Prop(() => String, { validate: validate.email, type: "email", example: "user@example.com" })
53
+ email: string;
54
+
55
+ @Field.Secret(() => String, { nullable: true, type: "password", example: "password123" })
56
+ password: string | null;
57
+ }
58
+
59
+ // Define object model (full data model)
60
+
61
+ export class UserObject extends via(UserInput) {
62
+ @Field.Prop(() => [String], [{ enum: UserRole, example: ["user"] }])
63
+ roles: (typeof UserRole.value)[];
64
+
65
+ @Field.Prop(() => Date, { default: () => dayjs(), example: dayjs() })
66
+ lastLoginAt: Dayjs;
67
+ }
68
+
69
+ // Define light model (client-side model with essential fields)
70
+
71
+ export class LightUser extends via(UserObject, ["email", "roles"] as const) {
72
+ hasAccess(role: UserRole) {
73
+ return this.roles.includes(role);
74
+ }
75
+ }
76
+
77
+ // Define full model (server-side model with all fields)
78
+
79
+ export class User extends via(UserObject, LightUser) {}
80
+
81
+ // Define filter model (for queries)
82
+
83
+ export class UserFilter extends sortOf(User, {}) {
84
+ @Filter.Mongo()
85
+ byEmail(@Filter.Arg("email", () => String) email: string) {
86
+ return { email };
87
+ }
88
+ }
89
+ ```
90
+
91
+ ### 2. Implement Database Schema (`[module-name].document.ts`)
92
+
93
+ Create the MongoDB schema with document methods and middleware:
94
+
95
+ ```typescript
96
+ import { dayjs } from "akanjs/base";
97
+ import { beyond, by, Database, into, Loader, type SchemaOf } from "akanjs/document";
98
+ import { hashPassword } from "@libs/shared/server";
99
+
100
+ import * as cnst from "../cnst";
101
+
102
+ // Document model with methods
103
+
104
+ export class User extends by(cnst.User) {
105
+ addRole(role: cnst.UserRole) {
106
+ if (!this.roles.includes(role)) this.roles = [...this.roles, role];
107
+ return this;
108
+ }
109
+
110
+ updateLastLogin() {
111
+ this.lastLoginAt = dayjs();
112
+ return this;
113
+ }
114
+ }
115
+
116
+ // Model with database operations
117
+
118
+ export class UserModel extends into(User, cnst.userCnst, ...user.models) {
119
+ @Loader.ByField("email") userEmailLoader: Loader<string, User>;
120
+
121
+ async findByEmail(email: string) {
122
+ return this.User.findOne({ email, removedAt: { $exists: false } });
123
+ }
124
+
125
+ async getUserSecret(email: string) {
126
+ return this.User.pickOne({ email, removedAt: { $exists: false } }, { roles: true, password: true });
127
+ }
128
+ }
129
+
130
+
131
+ ```
132
+
133
+ ### 3. Create Service (`[module-name].service.ts`)
134
+
135
+ Implement business logic in the service:
136
+
137
+ ```typescript
138
+ import { DbService, Srv, Use } from "akanjs/service";
139
+ import { Account, type Me } from "akanjs/signal";
140
+ import { isPasswordMatch } from "@libs/shared/server";
141
+
142
+ import * as cnst from "../cnst";
143
+ import * as db from "../db";
144
+ import type * as option from "../option";
145
+ import type * as srv from "../srv";
146
+
147
+ export class UserService extends DbService(db.userDb) {
148
+ @Use() protected readonly config: option.SecurityConfig;
149
+ @Srv() protected readonly securityService: srv.util.SecurityService;
150
+
151
+ async signin(email: string, password: string, account?: Account) {
152
+ const userSecret = await this.userModel.getUserSecret(email);
153
+ if (!userSecret) throw new Error("User not found");
154
+
155
+ const matched = await isPasswordMatch(password, userSecret.password || "");
156
+ if (!matched) throw new Error("Invalid credentials");
157
+
158
+ const user = await this.userModel.getUser(userSecret.id);
159
+ await user.updateLastLogin().save();
160
+
161
+ return this.securityService.addJwt({ me: user }, account);
162
+ }
163
+
164
+ async addRole(userId: string, role: cnst.UserRole) {
165
+ const user = await this.userModel.getUser(userId);
166
+ return await user.addRole(role).save();
167
+ }
168
+
169
+ async createUser(data: db.UserInput) {
170
+ const existingUser = await this.userModel.findByEmail(data.email);
171
+ if (existingUser) throw new Error("User already exists");
172
+
173
+ const user = await this.userModel.createUser(data);
174
+ return await user.set({ roles: ["user"] }).save();
175
+ }
176
+ }
177
+ ```
178
+
179
+ ### 4. Create Signal (`[module-name].signal.ts`)
180
+
181
+ Define GraphQL operations in the signal:
182
+
183
+ ```typescript
184
+ import { ID } from "akanjs/base";
185
+ import { Account, Arg, DbSignal, Me, Mutation, Query, resolve, Signal } from "akanjs/signal";
186
+
187
+ import * as cnst from "../cnst";
188
+ import type * as db from "../db";
189
+
190
+ export class UserSignal extends DbSignal(cnst.userCnst, cnst.Srvs, {
191
+ guards: { root: Admin, get: Query.Public, cru: Mutation.Admin },
192
+ }) {
193
+ @Mutation.Public(() => cnst.util.AccessToken)
194
+ async signin(
195
+ @Arg.Body("email", () => String, { example: "user@example.com" }) email: string,
196
+ @Arg.Body("password", () => String, { example: "password123" }) password: string,
197
+ @Account() account: Account
198
+ ) {
199
+ const accessToken = await this.userService.signin(email, password, account);
200
+ return resolve<cnst.util.AccessToken>(accessToken);
201
+ }
202
+
203
+ @Query.User(() => cnst.User)
204
+ async me(@Me() me: Me) {
205
+ const user = await this.userService.getUser(me.id);
206
+ return resolve<cnst.User>(user);
207
+ }
208
+
209
+ @Mutation.Admin(() => cnst.User)
210
+ async createUser(@Arg.Body("data", () => cnst.UserInput) data: db.UserInput) {
211
+ const user = await this.userService.createUser(data);
212
+ return resolve<cnst.User>(user);
213
+ }
214
+
215
+ @Mutation.Admin(() => cnst.User)
216
+ async addUserRole(
217
+ @Arg.Param("userId", () => ID) userId: string,
218
+ @Arg.Body("role", () => String) role: cnst.UserRole
219
+ ) {
220
+ const user = await this.userService.addRole(userId, role);
221
+ return resolve<cnst.User>(user);
222
+ }
223
+ }
224
+ ```
225
+
226
+ ### 5. Create Store (`[module-name].store.ts`)
227
+
228
+ Implement client-side state management:
229
+
230
+ ```typescript
231
+ import { StateCreator } from "zustand";
232
+ import { immer } from "zustand/middleware/immer";
233
+
234
+ import * as cnst from "../cnst";
235
+ import * as fetch from "../sig";
236
+
237
+ export interface UserState {
238
+ users: cnst.User[];
239
+ selectedUser?: cnst.User;
240
+ userForm: cnst.UserInput;
241
+ }
242
+
243
+ export interface UserAction {
244
+ setUsers: (users: cnst.User[]) => void;
245
+ selectUser: (user?: cnst.User) => void;
246
+ setUserForm: (form: Partial<cnst.UserInput>) => void;
247
+ resetUserForm: () => void;
248
+ signin: () => Promise<void>;
249
+ createUser: () => Promise<void>;
250
+ }
251
+
252
+ export type UserStore = UserState & UserAction;
253
+
254
+ export const createUserStore: StateCreator<UserStore, [["zustand/immer", never]], [], UserStore> = immer(
255
+ (set, get) => ({
256
+ users: [],
257
+ userForm: { email: "", password: null },
258
+
259
+ setUsers: (users) =>
260
+ set((state) => {
261
+ state.users = users;
262
+ }),
263
+ selectUser: (user) =>
264
+ set((state) => {
265
+ state.selectedUser = user;
266
+ }),
267
+ setUserForm: (form) =>
268
+ set((state) => {
269
+ state.userForm = { ...state.userForm, ...form };
270
+ }),
271
+ resetUserForm: () =>
272
+ set((state) => {
273
+ state.userForm = { email: "", password: null };
274
+ }),
275
+
276
+ signin: async () => {
277
+ const { email, password } = get().userForm;
278
+ if (!password) return;
279
+ await fetch.user.signin(email, password);
280
+ get().resetUserForm();
281
+ },
282
+
283
+ createUser: async () => {
284
+ const { userForm } = get();
285
+ const user = await fetch.user.createUser({ data: userForm });
286
+ set((state) => {
287
+ state.users = [...state.users, user];
288
+ state.userForm = { email: "", password: null };
289
+ });
290
+ },
291
+ })
292
+ );
293
+ ```
294
+
295
+ ### 6. Create Dictionary (`[module-name].dictionary.ts`)
296
+
297
+ Define internationalization strings:
298
+
299
+ ```typescript
300
+ export const userDict = {
301
+ email: {
302
+ ko: "이메일",
303
+ en: "Email",
304
+ },
305
+ password: {
306
+ ko: "비밀번호",
307
+ en: "Password",
308
+ },
309
+ signin: {
310
+ ko: "로그인",
311
+ en: "Sign In",
312
+ },
313
+ user_list: {
314
+ ko: "사용자 목록",
315
+ en: "User List",
316
+ },
317
+ add_user: {
318
+ ko: "사용자 추가",
319
+ en: "Add User",
320
+ },
321
+ };
322
+ ```
323
+
324
+ ### 7. Create UI Components
325
+
326
+ #### Template Component (`[ModuleName].Template.tsx`)
327
+
328
+ ```tsx
329
+ import { Button } from "akanjs/ui";
330
+
331
+ import { dict } from "../dict";
332
+ import { st } from "../st";
333
+
334
+ export const General = () => {
335
+ const { userForm } = st.use.userForm();
336
+
337
+ return (
338
+ // WIP
339
+ );
340
+ };
341
+ ```
342
+
343
+ #### Unit Component (`[ModuleName].Unit.tsx`)
344
+
345
+ ```tsx
346
+ import { Card, ModelProps } from "@libs/util/ui";
347
+
348
+ export const UserCard = ({ user }: ModelProps<"user">) => (
349
+ <Card>
350
+ <Card.Title>{user.email}</Card.Title>
351
+ <Card.Content>
352
+ <div>Roles: {user.roles.join(", ")}</div>
353
+ </Card.Content>
354
+ </Card>
355
+ );
356
+ ```
357
+
358
+ #### View Component (`[ModuleName].View.tsx`)
359
+
360
+ ```tsx
361
+ import { useEffect } from "react";
362
+ import { Container, ListContainer } from "@libs/util/ui";
363
+
364
+ import * as Unit from "./User.Unit";
365
+ import * as Template from "./User.Template";
366
+ import { st } from "../st";
367
+ import { sig } from "../sig";
368
+
369
+ export const List = () => {
370
+ const { users } = st.use.user();
371
+
372
+ useEffect(() => {
373
+ void sig.user.getUsers().then((data) => {
374
+ st.do.user().setUsers(data.users);
375
+ });
376
+ }, []);
377
+
378
+ return (
379
+ <Container>
380
+ <ListContainer items={users} renderItem={(user) => <Unit.UserCard user={user} />} emptyText="No users found" />
381
+ </Container>
382
+ );
383
+ };
384
+ ```
385
+
386
+ #### Zone Component (`[ModuleName].Zone.tsx`)
387
+
388
+ ```tsx
389
+ import { Zone } from "@libs/util/ui";
390
+
391
+ import * as View from "./User.View";
392
+ import * as Template from "./User.Template";
393
+ import { dict } from "../dict";
394
+
395
+ export const User = () => (
396
+ <Zone title={dict.user.user_list}>
397
+ <Zone.Section title={dict.user.add_user}>
398
+ <Template.General />
399
+ </Zone.Section>
400
+ <Zone.Section>
401
+ <View.List />
402
+ </Zone.Section>
403
+ </Zone>
404
+ );
405
+ ```
406
+
407
+ #### Client Exports (`index.tsx`)
408
+
409
+ ```tsx
410
+ import { Signal } from "akanjs/ui";
411
+ import { FaUser } from "react-icons/fa";
412
+
413
+ import * as Template from "./User.Template";
414
+ import * as Unit from "./User.Unit";
415
+ import * as Util from "./User.Util";
416
+ import * as View from "./User.View";
417
+ import * as Zone from "./User.Zone";
418
+
419
+ export const User = {
420
+ Menu: {
421
+ User: {
422
+ key: "user",
423
+ label: "Users",
424
+ icon: <FaUser />,
425
+ render: () => <Zone.User />,
426
+ },
427
+ },
428
+ Template,
429
+ Unit,
430
+ Util,
431
+ View,
432
+ Zone,
433
+ };
434
+ ```
435
+
436
+ ## How to Use Database Modules in Nest.js Server
437
+
438
+ ### 1. Register Module in Server Bootstrap
439
+
440
+ In your server bootstrap file:
441
+
442
+ ```typescript
443
+ import { createNestApp } from "akanjs/server";
444
+
445
+ ====== outdated, ned to be rewrited ======
446
+ ```
447
+
448
+ ### 2. Using Services in Controllers or Other Services
449
+
450
+ ```typescript
451
+ import { Controller, Get } from "@nestjs/common";
452
+ import { UserService } from "./user/user.service";
453
+
454
+ @Controller("auth")
455
+ export class AuthController {
456
+ constructor(private readonly userService: UserService) {}
457
+
458
+ @Get("users")
459
+ async getUsers() {
460
+ return this.userService.getUsers({});
461
+ }
462
+ }
463
+ ```
464
+
465
+ ## How to Use Components, Stores, and Signals in Client Side
466
+
467
+ ### 1. Using Components in Pages
468
+
469
+ ```tsx
470
+ import { User } from "@libs/shared/lib/user";
471
+
472
+ export default function UserPage() {
473
+ return (
474
+ <main>
475
+ <User.Zone.User />
476
+ </main>
477
+ );
478
+ }
479
+ ```
480
+
481
+ ### 2. Using Stores for State Management
482
+
483
+ ```tsx
484
+ import { st } from "@libs/shared/client";
485
+
486
+ const UserComponent = () => {
487
+ const { users, selectedUser } = st.use.user();
488
+ const { selectUser, setUsers } = st.do.user();
489
+
490
+ // Use the store state and actions
491
+ return (
492
+ <div>
493
+ {users.map((user) => (
494
+ <div key={user.id} onClick={() => selectUser(user)} className={selectedUser?.id === user.id ? "selected" : ""}>
495
+ {user.email}
496
+ </div>
497
+ ))}
498
+ </div>
499
+ );
500
+ };
501
+ ```
502
+
503
+ ### 3. Using Signals for API Calls
504
+
505
+ ```tsx
506
+ import { useEffect, useState } from "react";
507
+ import { sig } from "@libs/shared/client";
508
+
509
+ const UserData = () => {
510
+ const [loading, setLoading] = useState(true);
511
+ const [error, setError] = useState<string | null>(null);
512
+
513
+ useEffect(() => {
514
+ setLoading(true);
515
+ sig.user
516
+ .getUsers()
517
+ .then((data) => {
518
+ st.do.user().setUsers(data.users);
519
+ setLoading(false);
520
+ })
521
+ .catch((err) => {
522
+ setError(err.message);
523
+ setLoading(false);
524
+ });
525
+ }, []);
526
+
527
+ if (loading) return <div>Loading...</div>;
528
+ if (error) return <div>Error: {error}</div>;
529
+
530
+ return <User.View.List />;
531
+ };
532
+ ```
533
+
534
+ ### 4. Integrating with Menu System
535
+
536
+ ```tsx
537
+ import { AppLayout } from "@libs/util/ui";
538
+ import { User } from "@libs/shared/lib/user";
539
+ import { Admin } from "@libs/shared/lib/admin";
540
+
541
+ export const Layout = () => (
542
+ <AppLayout
543
+ pageMenus={[
544
+ {
545
+ key: "users",
546
+ title: "User Management",
547
+ menus: User.Menu,
548
+ },
549
+ {
550
+ key: "admin",
551
+ title: "Administration",
552
+ menus: Admin.Menu,
553
+ },
554
+ ]}
555
+ />
556
+ );
557
+ ```
558
+
559
+ ## Best Practices
560
+
561
+ 1. **Naming Conventions**
562
+
563
+ - Use PascalCase for classes and components (e.g., `UserService`, `User.Unit.tsx`)
564
+ - Use camelCase for files (e.g., `user.service.ts`, `user.document.ts`)
565
+
566
+ 2. **Security**
567
+
568
+ - Use `@Field.Secret` for sensitive data like passwords
569
+ - Apply proper permission guards to queries and mutations (`@Query.Admin`, `@Mutation.Public`)
570
+ - Validate input data using the `validate` option in `@Field.Prop`
571
+
572
+ 3. **Code Organization**
573
+
574
+ - Keep business logic in service files
575
+ - Use signals for API calls only, not for business logic
576
+ - Define reusable utility methods in document models
577
+
578
+ 4. **Performance**
579
+
580
+ - Use dataloader pattern (`@Loader.ByField`) for efficient database access
581
+ - Create proper indexes in the middleware
582
+ - Use projections to limit returned fields when appropriate
583
+
584
+ 5. **Testing**
585
+
586
+ - Create signal tests for each API endpoint
587
+ - Mock services for unit testing signals
588
+ - Use integration tests for testing complex workflows
589
+
590
+ 6. **UI Components**
591
+
592
+ - Follow the separation between Template, Unit, View, and Zone components
593
+ - Make components reusable across different parts of the application
594
+ - Use dictionary files for all UI text to support internationalization
595
+
596
+ 7. **Real-time Features**
597
+ - Use GraphQL subscriptions for real-time updates
598
+ - Use WebSockets for bidirectional communication
599
+ - Use Bull queues for background processing
600
+
601
+ ## Data Flow in Database Modules
602
+
603
+ 1. **User Interaction** → User interacts with a component (e.g., submits a form)
604
+ 2. **Store Action** → Action in store is triggered (e.g., `st.do.user().signin()`)
605
+ 3. **Signal Call** → Signal method is called (e.g., `sig.user.signin()`)
606
+ 4. **GraphQL Request** → GraphQL request is sent to the server
607
+ 5. **Resolver** → NestJS resolver (generated from Signal) handles the request
608
+ 6. **Service** → Service method processes the business logic
609
+ 7. **Database** → Database operations are performed
610
+ 8. **Response** → Result is returned through the GraphQL API
611
+ 9. **Store Update** → Client state is updated based on the response
612
+ 10. **UI Update** → Components re-render with the updated state
@@ -0,0 +1,72 @@
1
+ {
2
+ "title": "How to create doc page",
3
+ "description": "How to create documentation page of Akan.js framework",
4
+ "scans": [
5
+ {
6
+ "type": "example",
7
+ "description": "Example of a system architecture documentation page",
8
+ "path": "apps/angelo/page/akanjs/(docs)/docs/systemArch/frontend/_index.tsx"
9
+ },
10
+ {
11
+ "type": "example",
12
+ "description": "Example of a module documentation page with API reference",
13
+ "path": "apps/angelo/page/akanjs/(docs)/docs/module/signal/_index.tsx"
14
+ },
15
+ {
16
+ "type": "source",
17
+ "description": "Documentation utility components",
18
+ "path": "apps/angelo/ui/Docs/index.ts"
19
+ },
20
+ {
21
+ "type": "source",
22
+ "description": "Code snippet component for syntax highlighting",
23
+ "path": "apps/angelo/ui/Docs/CodeSnippet.tsx"
24
+ },
25
+ {
26
+ "type": "source",
27
+ "description": "Title component for main headings",
28
+ "path": "apps/angelo/ui/Docs/Title.tsx"
29
+ },
30
+ {
31
+ "type": "source",
32
+ "description": "Description component for explanatory text",
33
+ "path": "apps/angelo/ui/Docs/Description.tsx"
34
+ },
35
+ {
36
+ "type": "source",
37
+ "description": "Option table component for displaying parameters",
38
+ "path": "apps/angelo/ui/Docs/OptionTable.tsx"
39
+ },
40
+ {
41
+ "type": "source",
42
+ "description": "Introduction table component for listing features",
43
+ "path": "apps/angelo/ui/Docs/IntroTable.tsx"
44
+ }
45
+ ],
46
+ "update": {
47
+ "filePath": "./docPageRule.instruction.md",
48
+ "contents": [
49
+ "Purpose of doc page in Akan.js",
50
+ "How to create doc page",
51
+ "Page organization and structure",
52
+ "Utility components",
53
+ "Best practices for documentation",
54
+ "Internationalization guidelines",
55
+ "Code example guidelines",
56
+ "Complete example implementation",
57
+ "Troubleshooting common issues"
58
+ ],
59
+ "rules": [
60
+ "Docs.Layout is already set on the top of layout.tsx file in the root of the project, so you don't need to use it in your page",
61
+ "Docs utility should be used with `Docs` prefix, like <Docs.Title>, do not use object destructuring",
62
+ "Always wrap user-facing text in l.trans() with at least English and Korean translations",
63
+ "Use a logical hierarchy of headings (Title → SubTitle → SubSubTitle)",
64
+ "Include a divider (<div className=\"divider\"></div>) between major sections",
65
+ "For long pages, use anchor links with hidden divs for navigation",
66
+ "Code examples should be realistic and include proper comments",
67
+ "Tables should use the appropriate type (OptionTable for parameters, IntroTable for features)",
68
+ "Always specify the correct language for CodeSnippet components"
69
+ ]
70
+ },
71
+ "page": "/akanjs/(docs)/docs/[category]/[pageName]/_index"
72
+ }