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,129 @@
1
+ {
2
+ "title": "Model Document",
3
+ "description": "How to create and implement model.document.ts files in Akan.js",
4
+ "scans": [
5
+ {
6
+ "type": "source",
7
+ "description": "Database decorator implementation",
8
+ "path": "pkgs/akanjs/document/dbDecorators.ts"
9
+ },
10
+ {
11
+ "type": "source",
12
+ "description": "Model loader implementation",
13
+ "path": "pkgs/akanjs/document/dataLoader.ts"
14
+ },
15
+ {
16
+ "type": "source",
17
+ "description": "Database model implementation",
18
+ "path": "pkgs/akanjs/document/database.ts"
19
+ },
20
+ {
21
+ "type": "example",
22
+ "description": "Simple document implementation",
23
+ "path": "libs/shared/lib/admin/admin.document.ts",
24
+ "sample": 1
25
+ },
26
+ {
27
+ "type": "example",
28
+ "description": "Complex document implementation",
29
+ "path": "libs/shared/lib/user/user.document.ts",
30
+ "sample": 1
31
+ },
32
+ {
33
+ "type": "example",
34
+ "description": "Document with DataLoader example",
35
+ "path": "libs/mint/lib/token/token.document.ts",
36
+ "sample": 1
37
+ },
38
+ {
39
+ "type": "example",
40
+ "description": "Document middleware examples",
41
+ "path": "{apps,libs}/*/lib/*/*.document.ts",
42
+ "filterText": "schema.pre",
43
+ "sample": 2
44
+ },
45
+ {
46
+ "type": "example",
47
+ "description": "Document index examples",
48
+ "path": "{apps,libs}/*/lib/*/*.document.ts",
49
+ "filterText": "schema.index",
50
+ "sample": 2
51
+ },
52
+ {
53
+ "type": "example",
54
+ "description": "Document dataloader examples",
55
+ "path": "{apps,libs}/*/lib/*/*.document.ts",
56
+ "filterText": "@Loader",
57
+ "sample": 2
58
+ },
59
+ {
60
+ "type": "example",
61
+ "description": "Document model statics examples",
62
+ "path": "{apps,libs}/*/lib/*/*.document.ts",
63
+ "filterText": "async",
64
+ "sample": 3
65
+ },
66
+ {
67
+ "type": "example",
68
+ "description": "Document model methods examples",
69
+ "path": "{apps,libs}/*/lib/*/*.document.ts",
70
+ "filterText": "return this",
71
+ "sample": 3
72
+ },
73
+ {
74
+ "type": "example",
75
+ "description": "Cache implementation examples",
76
+ "path": "{apps,libs}/*/lib/*/*.document.ts",
77
+ "filterText": "Cache.set",
78
+ "sample": 2
79
+ },
80
+ {
81
+ "type": "example",
82
+ "description": "Transaction examples",
83
+ "path": "{apps,libs}/*/lib/*/*.document.ts",
84
+ "filterText": "@Transaction",
85
+ "sample": 1
86
+ },
87
+ {
88
+ "type": "example",
89
+ "description": "Search implementation",
90
+ "path": "{apps,libs}/*/lib/*/*.document.ts",
91
+ "filterText": "search",
92
+ "sample": 1
93
+ }
94
+ ],
95
+ "update": {
96
+ "filePath": "./modelDocument.instruction.md",
97
+ "contents": [
98
+ "Purpose and role of model.document.ts files",
99
+ "File structure and class organization",
100
+ "Relationship with model.constant.ts files",
101
+ "How to use document methods (instance methods)",
102
+ "How to use model statics (static methods)",
103
+ "How to apply middleware (lifecycle hooks)",
104
+ "How to define and apply indexes",
105
+ "How to use MongoDB model (direct access)",
106
+ "How to use dataloader (batching and caching)",
107
+ "How to use cache with Redis",
108
+ "How to use search with Meilisearch",
109
+ "Built-in model functions",
110
+ "Transactions and atomic operations",
111
+ "Integration with NestJS",
112
+ "Client-side usage patterns",
113
+ "Soft delete functionality",
114
+ "Error handling patterns",
115
+ "Optimization techniques"
116
+ ],
117
+ "rules": [
118
+ "Document methods are typically synchronous and return 'this' for method chaining",
119
+ "Model statics are typically asynchronous and return Promises",
120
+ "Use DataLoader for efficient relationship loading",
121
+ "Apply proper indexes for query patterns used in your application",
122
+ "Use Redis cache for frequently accessed data",
123
+ "Use transactions for operations that need to be atomic",
124
+ "Follow naming conventions for consistency",
125
+ "Handle errors with appropriate domain-specific error classes"
126
+ ]
127
+ },
128
+ "page": "/akanjs/(docs)/docs/module/document/_index.tsx"
129
+ }
@@ -0,0 +1,536 @@
1
+ # Akan.js Model Document Implementation Guide
2
+
3
+ ## Purpose and Role of model.document.ts Files
4
+
5
+ `model.document.ts` files are essential components in the Akan.js framework that define MongoDB data models and their associated behaviors. These files serve as the bridge between your application's data structure and MongoDB, providing:
6
+
7
+ 1. **Schema Definition** - Define the structure and validation for MongoDB documents
8
+ 2. **Business Logic** - Implement domain-specific operations through document methods
9
+ 3. **Query Patterns** - Create reusable database queries with model statics
10
+ 4. **Lifecycle Hooks** - Add middleware for handling events during document operations
11
+ 5. **Performance Optimization** - Configure indexes and implement DataLoader for efficient querying
12
+ 6. **Caching Integration** - Seamlessly integrate with Redis for high-performance data access
13
+ 7. **Search Capabilities** - Connect with Meilisearch for full-text search functionality
14
+
15
+ ## File Structure
16
+
17
+ A `model.document.ts` file is structured into four distinct classes, each with a specific responsibility:
18
+
19
+ ### 2. Document Class
20
+
21
+ Represents a MongoDB document with instance methods:
22
+
23
+ ```typescript
24
+ export class Example extends by(cnst.Example) {
25
+ // Document methods here
26
+ }
27
+ ```
28
+
29
+ ### 3. Model Class
30
+
31
+ Represents the MongoDB collection with static methods:
32
+
33
+ ```typescript
34
+ export class ExampleModel extends into(Example, cnst.exampleCnst) {
35
+ // Model statics here
36
+ }
37
+ ```
38
+
39
+
40
+ ## How to Use Document Methods
41
+
42
+ Document methods operate on individual document instances and typically follow these patterns:
43
+
44
+ ### Characteristics of Document Methods:
45
+
46
+ - They operate on the current document instance (`this`)
47
+ - They typically return `this` to enable method chaining
48
+ - They're often synchronous, but can be asynchronous when needed
49
+ - They handle document-level operations and transformations
50
+
51
+ ### Example of Document Methods:
52
+
53
+ ```typescript
54
+ export class User extends by(cnst.User) {
55
+ // Simple transformation method (synchronous)
56
+ addRole(role: string) {
57
+ if (!this.roles.includes(role)) {
58
+ this.roles = [...this.roles, role];
59
+ }
60
+ return this;
61
+ }
62
+
63
+ // Remove item method (synchronous)
64
+ removeRole(role: string) {
65
+ this.roles = this.roles.filter((r) => r !== role);
66
+ return this;
67
+ }
68
+
69
+ // Complex operation with save (asynchronous)
70
+ async updateProfile(data: Partial<UserProfile>) {
71
+ Object.assign(this.profile, data);
72
+ this.lastUpdatedAt = new Date();
73
+ return await this.save();
74
+ }
75
+ }
76
+ ```
77
+
78
+ ## How to Use Model Statics
79
+
80
+ Model statics operate on the entire collection and are typically asynchronous. They implement reusable query patterns and business operations.
81
+
82
+ ### Characteristics of Model Statics:
83
+
84
+ - They operate on the entire collection, not a single document
85
+ - They're almost always asynchronous, returning Promises
86
+ - They often use built-in Mongoose methods like `find`, `findOne`, etc.
87
+ - They can implement complex business logic involving multiple documents
88
+
89
+ ### Example of Model Statics:
90
+
91
+ ```typescript
92
+ export class OrderModel extends into(Order, cnst.orderCnst) {
93
+ // Query by specific criteria
94
+ async findPendingOrders(userId: string) {
95
+ return this.Order.find({
96
+ user: userId,
97
+ status: "pending",
98
+ }).sort({ createdAt: -1 });
99
+ }
100
+
101
+ // Complex operation with multiple steps
102
+ async processRefund(orderId: string, amount: number) {
103
+ const order = await this.Order.pickById(orderId);
104
+
105
+ if (order.status !== "completed") {
106
+ throw new Error("Cannot refund an incomplete order");
107
+ }
108
+
109
+ if (order.totalAmount < amount) {
110
+ throw new Error("Refund amount exceeds order total");
111
+ }
112
+
113
+ return await order
114
+ .set({
115
+ refundAmount: amount,
116
+ status: "refunded",
117
+ })
118
+ .save();
119
+ }
120
+
121
+ // Aggregation example
122
+ async getOrderStatsByUser(userId: string) {
123
+ const result = await this.Order.aggregate([
124
+ { $match: { user: userId } },
125
+ {
126
+ $group: {
127
+ _id: "$status",
128
+ count: { $sum: 1 },
129
+ totalAmount: { $sum: "$totalAmount" },
130
+ },
131
+ },
132
+ ]);
133
+
134
+ return result.reduce((acc, item) => {
135
+ acc[item._id] = {
136
+ count: item.count,
137
+ totalAmount: item.totalAmount,
138
+ };
139
+ return acc;
140
+ }, {});
141
+ }
142
+ }
143
+ ```
144
+
145
+ ## Built-in Model Functions
146
+
147
+ Akan.js provides several built-in methods that are available on all models:
148
+
149
+ ```typescript
150
+ // Direct access to Mongoose model
151
+ await userModel.User.find({...});
152
+
153
+ // Common operations
154
+ const user = await userModel.getUser(userId); // Get by ID or throw error
155
+ const maybeUser = await userModel.loadUser(userId); // Get by ID or return null
156
+ const users = await userModel.loadUserMany([userId1, userId2]); // Get multiple by IDs
157
+
158
+ // CRUD operations
159
+ const newUser = await userModel.createUser(userData); // Create new document
160
+ const updated = await userModel.updateUser(userId, userData); // Update document
161
+ const removed = await userModel.removeUser(userId); // Soft delete (sets removedAt)
162
+
163
+ // Search operations (when Meilisearch is configured)
164
+ const { docs, count } = await userModel.searchUser("john"); // Full-text search
165
+ const users = await userModel.searchDocsUser("john"); // Just get documents
166
+ const total = await userModel.searchCountUser("john"); // Just get count
167
+ ```
168
+
169
+ ## How to Apply Middleware
170
+
171
+ Middleware allows you to intercept and modify document operations at various lifecycle stages.
172
+
173
+ ### Common Middleware Hooks:
174
+
175
+ - `pre('save')` - Before saving a document
176
+ - `post('save')` - After saving a document
177
+ - `pre('remove')` - Before removing a document
178
+ - `pre('validate')` - Before validation
179
+ - `pre('findOneAndUpdate')` - Before findOneAndUpdate operations
180
+
181
+
182
+ ## How to Apply Indexes
183
+
184
+ Indexes are crucial for query performance. Define them in the Middleware's `onSchema` method:
185
+
186
+ ### Types of Indexes:
187
+
188
+ - **Single field index** - Optimize queries on a single field
189
+ - **Compound index** - Optimize queries that filter or sort on multiple fields
190
+ - **Text index** - Enable full-text search on specified fields
191
+ - **Unique index** - Ensure field values are unique across the collection
192
+ - **Sparse index** - Only include documents that have the indexed field
193
+
194
+ ## How to Use MongoDB Model
195
+
196
+ The Akan.js framework provides direct access to the Mongoose model, allowing you to perform standard MongoDB operations:
197
+
198
+ ```typescript
199
+ // Find operations
200
+ const product = await productModel.Product.findById(id);
201
+ const activeProducts = await productModel.Product.find({ status: "active" });
202
+
203
+ // Update operations
204
+ await productModel.Product.updateMany({ category: "electronics" }, { $set: { onSale: true } });
205
+
206
+ // Aggregation
207
+ const stats = await productModel.Product.aggregate([
208
+ { $match: { status: "active" } },
209
+ {
210
+ $group: {
211
+ _id: "$category",
212
+ count: { $sum: 1 },
213
+ avgPrice: { $avg: "$price" },
214
+ },
215
+ },
216
+ ]);
217
+
218
+ // Advanced querying
219
+ const products = await productModel.Product.find({
220
+ price: { $gte: 100, $lte: 500 },
221
+ category: { $in: ["electronics", "gadgets"] },
222
+ })
223
+ .sort({ rating: -1 })
224
+ .limit(10);
225
+ ```
226
+
227
+ ## How to Use DataLoader
228
+
229
+ DataLoader batches and caches database requests to optimize performance, especially for resolving relationships between documents.
230
+
231
+ ### Types of Loaders:
232
+
233
+ - `@Loader.ByField(fieldName)` - Load documents by a specific field value
234
+ - `@Loader.ByArrayField(fieldName)` - Load documents that contain a value in an array field
235
+ - `@Loader.ByQuery(queryKeys)` - Load documents by complex query criteria
236
+
237
+ ### Example DataLoader Implementation:
238
+
239
+ ```typescript
240
+ export class OrderModel extends into(Order, cnst.orderCnst) {
241
+ // Load orders by user ID
242
+ @Loader.ByField("userId")
243
+ userOrdersLoader: Loader<string, Order[]>;
244
+
245
+ // Load orders by status
246
+ @Loader.ByField("status")
247
+ statusOrdersLoader: Loader<string, Order[]>;
248
+
249
+ // Load orders by tag (array field)
250
+ @Loader.ByArrayField("tags")
251
+ tagOrdersLoader: Loader<string, Order[]>;
252
+
253
+ // Load order by complex query
254
+ @Loader.ByQuery(["userId", "orderNumber"])
255
+ specificOrderLoader: Loader<{ userId: string; orderNumber: string }, Order>;
256
+ }
257
+
258
+ // Usage:
259
+ const userOrders = await orderModel.userOrdersLoader.load(userId);
260
+ const pendingOrders = await orderModel.statusOrdersLoader.load("pending");
261
+ const taggedOrders = await orderModel.tagOrdersLoader.load("priority");
262
+ const specificOrder = await orderModel.specificOrderLoader.load({
263
+ userId: "user123",
264
+ orderNumber: "ORD-12345",
265
+ });
266
+ ```
267
+
268
+ ## How to Use Cache with Redis
269
+
270
+ Akan.js integrates Redis caching through the model's cache instance, providing simple methods for storing and retrieving data:
271
+
272
+ ```typescript
273
+ // Set cache
274
+ await userModel.UserCache.set(
275
+ "session", // Topic/category
276
+ userId, // Key
277
+ sessionData, // Value
278
+ { expireAt: dayjs().add(1, "hour") } // Options
279
+ );
280
+
281
+ // Get cache
282
+ const session = await userModel.UserCache.get("session", userId);
283
+
284
+ // Delete cache
285
+ await userModel.UserCache.delete("session", userId);
286
+
287
+ // Example: Caching expensive computation
288
+ async function getUserStats(userId: string) {
289
+ // Try to get from cache first
290
+ const cachedStats = await userModel.UserCache.get("stats", userId);
291
+ if (cachedStats) return JSON.parse(cachedStats);
292
+
293
+ // If not in cache, compute and store
294
+ const stats = await computeExpensiveUserStats(userId);
295
+ await userModel.UserCache.set("stats", userId, JSON.stringify(stats), { expireAt: dayjs().add(30, "minute") });
296
+
297
+ return stats;
298
+ }
299
+ ```
300
+
301
+ ## How to Use Search with Meilisearch
302
+
303
+ Akan.js provides Meilisearch integration for full-text search capabilities:
304
+
305
+ ```typescript
306
+ // Basic search with pagination
307
+ const { docs, count } = await productModel.searchProduct("wireless headphones", {
308
+ skip: 0,
309
+ limit: 10,
310
+ });
311
+
312
+ // Search with filtering
313
+ const { docs, count } = await productModel.searchProduct("wireless headphones", {
314
+ filter: "category=electronics AND price<=100",
315
+ });
316
+
317
+ // Search with sorting
318
+ const { docs, count } = await productModel.searchProduct("wireless headphones", {
319
+ sort: ["rating:desc", "price:asc"],
320
+ });
321
+
322
+ // Just get the documents
323
+ const products = await productModel.searchDocsProduct("wireless headphones");
324
+
325
+ // Just get the count
326
+ const resultCount = await productModel.searchCountProduct("wireless headphones");
327
+ ```
328
+
329
+ ## Best Practices
330
+
331
+ ### 1. Document Methods vs. Model Statics
332
+
333
+ - Use **document methods** for operations on a single document
334
+ - Use **model statics** for operations on multiple documents or complex business logic
335
+
336
+ ### 2. Efficient Querying
337
+
338
+ - Add indexes for frequently used queries
339
+ - Use projection (`select`) to limit fields returned
340
+ - Use `lean()` when you don't need full Mongoose documents
341
+ - Implement DataLoader for relationship fields
342
+
343
+ ### 3. Error Handling
344
+
345
+ - Use `pickOne` and `pickById` when you expect a document to exist
346
+ - Implement custom error classes for domain-specific errors
347
+ - Validate inputs before database operations
348
+
349
+ ### 4. Transactions
350
+
351
+ Use transactions for operations that need to be atomic:
352
+
353
+ ```typescript
354
+ export class OrderModel extends into(Order, cnst.orderCnst) {
355
+ @Transaction()
356
+ async createOrderWithItems(orderData, items) {
357
+ const order = await this.createOrder(orderData);
358
+ await Promise.all(items.map((item) => itemModel.createItem({ ...item, orderId: order.id })));
359
+ return order;
360
+ }
361
+ }
362
+ ```
363
+
364
+ ### 5. Soft Deletes
365
+
366
+ Akan.js implements soft deletes by default:
367
+
368
+ ```typescript
369
+ // Soft delete (sets removedAt field)
370
+ await userModel.removeUser(userId);
371
+
372
+ // To query only non-deleted documents
373
+ const users = await userModel.User.find({ removedAt: { $exists: false } });
374
+
375
+ // To permanently delete (rarely needed)
376
+ await userModel.User.findByIdAndDelete(userId);
377
+ ```
378
+
379
+ ## Complete Example
380
+
381
+ Here's a complete example integrating multiple features:
382
+
383
+ ```typescript
384
+ // product.document.ts
385
+ import { dayjs } from "akanjs/base";
386
+ import { beyond, by, Database, into, Loader, SchemaOf } from "akanjs/document";
387
+ import * as cnst from "../cnst";
388
+
389
+ export class Product extends by(cnst.Product) {
390
+ applyDiscount(percentage: number) {
391
+ if (percentage < 0 || percentage > 100) {
392
+ throw new Error("Discount percentage must be between 0 and 100");
393
+ }
394
+
395
+ const discount = (this.price * percentage) / 100;
396
+ this.discountedPrice = this.price - discount;
397
+ this.discountPercentage = percentage;
398
+
399
+ return this;
400
+ }
401
+
402
+ isInStock() {
403
+ return this.stockCount > 0;
404
+ }
405
+
406
+ decreaseStock(quantity = 1) {
407
+ if (this.stockCount < quantity) {
408
+ throw new Error("Not enough stock");
409
+ }
410
+
411
+ this.stockCount -= quantity;
412
+
413
+ return this;
414
+ }
415
+ }
416
+
417
+ export class ProductModel extends into(Product, cnst.productCnst) {
418
+ @Loader.ByField("category")
419
+ categoryProductsLoader: Loader<string, Product[]>;
420
+
421
+ @Loader.ByArrayField("tags")
422
+ tagProductsLoader: Loader<string, Product[]>;
423
+
424
+ async findPopularProducts(limit = 10) {
425
+ return this.Product.find({
426
+ status: "active",
427
+ popularity: { $gte: 4 },
428
+ })
429
+ .sort({ popularity: -1 })
430
+ .limit(limit);
431
+ }
432
+
433
+ async updatePrices(categoryId: string, increasePercentage: number) {
434
+ const products = await this.Product.find({ category: categoryId });
435
+
436
+ const updates = products.map((product) => {
437
+ const newPrice = product.price * (1 + increasePercentage / 100);
438
+ return product.set({ price: newPrice }).save();
439
+ });
440
+
441
+ return Promise.all(updates);
442
+ }
443
+
444
+ async getCategoryStats() {
445
+ const result = await this.Product.aggregate([
446
+ { $match: { status: "active" } },
447
+ {
448
+ $group: {
449
+ _id: "$category",
450
+ count: { $sum: 1 },
451
+ avgPrice: { $avg: "$price" },
452
+ minPrice: { $min: "$price" },
453
+ maxPrice: { $max: "$price" },
454
+ },
455
+ },
456
+ { $sort: { count: -1 } },
457
+ ]);
458
+
459
+ // Cache the results
460
+ await this.ProductCache.set("stats", "categories", JSON.stringify(result), { expireAt: dayjs().add(1, "hour") });
461
+
462
+ return result;
463
+ }
464
+ }
465
+
466
+ ```
467
+
468
+ ## Integration with NestJS
469
+
470
+ When using Akan.js with NestJS, models are injected using the service provider system:
471
+
472
+ ```typescript
473
+ // product.service.ts
474
+ import { Injectable } from "@nestjs/common";
475
+ import { getModel } from "akanjs/server";
476
+ import { ProductModel } from "./product.document";
477
+
478
+ @Injectable()
479
+ export class ProductService {
480
+ private productModel = getModel(ProductModel);
481
+
482
+ async getProductById(id: string) {
483
+ return this.productModel.getProduct(id);
484
+ }
485
+
486
+ async searchProducts(query: string, options = {}) {
487
+ return this.productModel.searchProduct(query, options);
488
+ }
489
+
490
+ async createProduct(data) {
491
+ return this.productModel.createProduct(data);
492
+ }
493
+
494
+ async applyDiscount(productId: string, percentage: number) {
495
+ const product = await this.productModel.getProduct(productId);
496
+ return product.applyDiscount(percentage).save();
497
+ }
498
+ }
499
+ ```
500
+
501
+ ## Client-Side Usage
502
+
503
+ On the client side, you'll typically interact with models through GraphQL or REST APIs:
504
+
505
+ ```typescript
506
+ // Using model-generated GraphQL operations
507
+ const { data } = await client.query({
508
+ query: gql`
509
+ query GetProduct($id: ID!) {
510
+ getProduct(id: $id) {
511
+ id
512
+ name
513
+ price
514
+ description
515
+ category
516
+ status
517
+ stockCount
518
+ }
519
+ }
520
+ `,
521
+ variables: { id: productId },
522
+ });
523
+ ```
524
+
525
+ ## Summary
526
+
527
+ The `model.document.ts` files in Akan.js provide a comprehensive system for defining and working with MongoDB data. By properly implementing these files, you can:
528
+
529
+ 1. Define clear data structures with validation
530
+ 2. Implement business logic at both document and collection levels
531
+ 3. Optimize database performance with indexes and DataLoader
532
+ 4. Leverage caching for high-performance operations
533
+ 5. Implement full-text search capabilities
534
+ 6. Create a maintainable and scalable data layer
535
+
536
+ Following the patterns and best practices outlined in this guide will help you build robust and efficient data-driven applications with Akan.js.