akanjs 2.0.7 → 2.1.0-rc.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 (498) hide show
  1. package/README.ko.md +4 -4
  2. package/README.md +4 -4
  3. package/client/router.ts +10 -3
  4. package/document/documentSchema.ts +9 -1
  5. package/index.ts +187 -0
  6. package/package.json +6 -50
  7. package/server/akanApp.ts +2 -24
  8. package/server/akanAppHeaders.ts +30 -0
  9. package/server/di/predefinedAdaptor.ts +1 -1
  10. package/types/dictionary/base.dictionary.d.ts +1 -1
  11. package/types/dictionary/dictionary.d.ts +8 -8
  12. package/types/document/documentSchema.d.ts +33 -0
  13. package/types/document/index.d.ts +1 -1
  14. package/types/document/schema.d.ts +1 -1
  15. package/types/document/types.d.ts +1 -1
  16. package/types/{devkit/akanConfig/types.d.ts → index.d.ts} +45 -54
  17. package/types/server/akanAppHeaders.d.ts +1 -0
  18. package/types/server/di/predefinedAdaptor.d.ts +1 -1
  19. package/types/store/baseSt.d.ts +2 -2
  20. package/ui/Link/SsrLink.tsx +2 -2
  21. package/webkit/useCodepush.tsx +1 -1
  22. package/cli/application/application.command.ts +0 -224
  23. package/cli/application/application.interface.tsx +0 -225
  24. package/cli/application/application.runner.ts +0 -355
  25. package/cli/application/application.script.ts +0 -244
  26. package/cli/build.ts +0 -27
  27. package/cli/cloud/cloud.command.ts +0 -48
  28. package/cli/cloud/cloud.runner.ts +0 -157
  29. package/cli/cloud/cloud.script.ts +0 -40
  30. package/cli/guideline/guideline.command.ts +0 -31
  31. package/cli/guideline/guideline.prompt.ts +0 -212
  32. package/cli/guideline/guideline.runner.ts +0 -53
  33. package/cli/guideline/guideline.script.ts +0 -33
  34. package/cli/guidelines/___library/sharedUiStructureDescription.en.md +0 -767
  35. package/cli/guidelines/___library/utilUiStructureDescription.en.md +0 -395
  36. package/cli/guidelines/___lint/lintRuleDescription.en.md +0 -64
  37. package/cli/guidelines/___module/moduleStructureDescription.en.md +0 -80
  38. package/cli/guidelines/componentRule/componentRule.generate.json +0 -131
  39. package/cli/guidelines/componentRule/componentRule.instruction.md +0 -637
  40. package/cli/guidelines/cssRule/cssRule.generate.json +0 -93
  41. package/cli/guidelines/cssRule/cssRule.instruction.md +0 -435
  42. package/cli/guidelines/databaseModule/databaseModule.generate.json +0 -51
  43. package/cli/guidelines/databaseModule/databaseModule.instruction.md +0 -612
  44. package/cli/guidelines/docPageRule/docPageRule.generate.json +0 -72
  45. package/cli/guidelines/docPageRule/docPageRule.instruction.md +0 -389
  46. package/cli/guidelines/enumConstant/enumConstant.generate.json +0 -24
  47. package/cli/guidelines/enumConstant/enumConstant.instruction.md +0 -232
  48. package/cli/guidelines/framework/framework.generate.json +0 -119
  49. package/cli/guidelines/framework/framework.instruction.md +0 -1110
  50. package/cli/guidelines/howToUseStore/howToUseStore.generate.json +0 -0
  51. package/cli/guidelines/modelConstant/modelConstant.generate.json +0 -128
  52. package/cli/guidelines/modelConstant/modelConstant.instruction.md +0 -506
  53. package/cli/guidelines/modelDictionary/modelDictionary.generate.json +0 -108
  54. package/cli/guidelines/modelDictionary/modelDictionary.instruction.md +0 -547
  55. package/cli/guidelines/modelDocument/modelDocument.generate.json +0 -129
  56. package/cli/guidelines/modelDocument/modelDocument.instruction.md +0 -509
  57. package/cli/guidelines/modelService/modelService.generate.json +0 -135
  58. package/cli/guidelines/modelService/modelService.instruction.md +0 -708
  59. package/cli/guidelines/modelSignal/modelSignal.generate.json +0 -201
  60. package/cli/guidelines/modelSignal/modelSignal.instruction.md +0 -552
  61. package/cli/guidelines/modelStore/modelStore.generate.json +0 -130
  62. package/cli/guidelines/modelStore/modelStore.instruction.md +0 -585
  63. package/cli/guidelines/modelTemplate/modelTemplate.generate.json +0 -104
  64. package/cli/guidelines/modelTemplate/modelTemplate.instruction.md +0 -604
  65. package/cli/guidelines/modelUnit/modelUnit.generate.json +0 -92
  66. package/cli/guidelines/modelUnit/modelUnit.instruction.md +0 -541
  67. package/cli/guidelines/modelUtil/modelUtil.generate.json +0 -93
  68. package/cli/guidelines/modelUtil/modelUtil.instruction.md +0 -752
  69. package/cli/guidelines/modelView/modelView.generate.json +0 -80
  70. package/cli/guidelines/modelView/modelView.instruction.md +0 -1005
  71. package/cli/guidelines/modelZone/modelZone.generate.json +0 -126
  72. package/cli/guidelines/modelZone/modelZone.instruction.md +0 -528
  73. package/cli/guidelines/scalarConstant/scalarConstant.generate.json +0 -106
  74. package/cli/guidelines/scalarConstant/scalarConstant.instruction.md +0 -442
  75. package/cli/guidelines/scalarDictionary/scalarDictionary.generate.json +0 -83
  76. package/cli/guidelines/scalarDictionary/scalarDictionary.instruction.md +0 -273
  77. package/cli/guidelines/scalarModule/scalarModule.generate.json +0 -35
  78. package/cli/guidelines/scalarModule/scalarModule.instruction.md +0 -81
  79. package/cli/guidelines/sharedUiUsage/sharedUiUsage.generate.json +0 -108
  80. package/cli/guidelines/sharedUiUsage/sharedUiUsage.instruction.md +0 -310
  81. package/cli/guidelines/utilUiUsage/utilUiUsage.generate.json +0 -140
  82. package/cli/guidelines/utilUiUsage/utilUiUsage.instruction.md +0 -339
  83. package/cli/index.js +0 -184444
  84. package/cli/index.ts +0 -24
  85. package/cli/library/library.command.ts +0 -28
  86. package/cli/library/library.runner.ts +0 -66
  87. package/cli/library/library.script.ts +0 -39
  88. package/cli/module/module.command.ts +0 -35
  89. package/cli/module/module.prompt.ts +0 -18
  90. package/cli/module/module.request.ts +0 -319
  91. package/cli/module/module.runner.ts +0 -76
  92. package/cli/module/module.script.ts +0 -161
  93. package/cli/npmRegistry.ts +0 -13
  94. package/cli/openBrowser.ts +0 -15
  95. package/cli/package/package.command.ts +0 -32
  96. package/cli/package/package.runner.ts +0 -94
  97. package/cli/package/package.script.ts +0 -35
  98. package/cli/page/page.command.ts +0 -14
  99. package/cli/page/page.runner.ts +0 -14
  100. package/cli/page/page.script.ts +0 -12
  101. package/cli/pluralizeName.ts +0 -5
  102. package/cli/scalar/scalar.command.ts +0 -21
  103. package/cli/scalar/scalar.prompt.ts +0 -131
  104. package/cli/scalar/scalar.runner.ts +0 -38
  105. package/cli/scalar/scalar.script.ts +0 -16
  106. package/cli/semver.ts +0 -18
  107. package/cli/templates/__scalar/__model__/__model__.constant.ts +0 -15
  108. package/cli/templates/__scalar/__model__/__model__.dictionary.ts +0 -19
  109. package/cli/templates/__scalar/__model__/__model__.document.ts +0 -15
  110. package/cli/templates/app/akan.config.ts +0 -14
  111. package/cli/templates/app/env/env.client.debug.ts.template +0 -7
  112. package/cli/templates/app/env/env.client.develop.ts.template +0 -7
  113. package/cli/templates/app/env/env.client.local.ts.template +0 -7
  114. package/cli/templates/app/env/env.client.main.ts.template +0 -7
  115. package/cli/templates/app/env/env.client.testing.ts.template +0 -7
  116. package/cli/templates/app/env/env.client.ts +0 -21
  117. package/cli/templates/app/env/env.client.type.ts +0 -16
  118. package/cli/templates/app/env/env.server.debug.ts.template +0 -7
  119. package/cli/templates/app/env/env.server.develop.ts.template +0 -7
  120. package/cli/templates/app/env/env.server.local.ts.template +0 -7
  121. package/cli/templates/app/env/env.server.main.ts.template +0 -7
  122. package/cli/templates/app/env/env.server.testing.ts.template +0 -6
  123. package/cli/templates/app/env/env.server.ts +0 -20
  124. package/cli/templates/app/lib/___appName__/__appName__.dictionary.ts +0 -17
  125. package/cli/templates/app/lib/___appName__/__appName__.service.ts +0 -13
  126. package/cli/templates/app/lib/___appName__/__appName__.signal.ts +0 -17
  127. package/cli/templates/app/lib/___appName__/__appName__.store.ts +0 -15
  128. package/cli/templates/app/lib/option.ts +0 -17
  129. package/cli/templates/app/main.ts +0 -16
  130. package/cli/templates/app/package.json.template +0 -5
  131. package/cli/templates/app/page/_index.tsx +0 -296
  132. package/cli/templates/app/page/_layout.tsx +0 -31
  133. package/cli/templates/app/page/styles.css.template +0 -53
  134. package/cli/templates/app/public/favicon.ico +0 -0
  135. package/cli/templates/app/public/logo.png +0 -0
  136. package/cli/templates/app/tsconfig.json.template +0 -21
  137. package/cli/templates/client.ts +0 -46
  138. package/cli/templates/crudPages/[__model__Id]/edit/page.tsx +0 -47
  139. package/cli/templates/crudPages/[__model__Id]/page.tsx +0 -52
  140. package/cli/templates/crudPages/new/page.tsx +0 -42
  141. package/cli/templates/crudPages/page.tsx +0 -43
  142. package/cli/templates/crudSinglePage/page.tsx +0 -37
  143. package/cli/templates/env/_env.server.type.ts +0 -16
  144. package/cli/templates/facetIndex/index.ts +0 -32
  145. package/cli/templates/index.ts +0 -10
  146. package/cli/templates/lib/__lib/lib.constant.ts +0 -38
  147. package/cli/templates/lib/__lib/lib.dictionary.ts +0 -33
  148. package/cli/templates/lib/__lib/lib.document.ts +0 -35
  149. package/cli/templates/lib/__lib/lib.service.ts +0 -33
  150. package/cli/templates/lib/__lib/lib.signal.ts +0 -34
  151. package/cli/templates/lib/__lib/lib.store.ts +0 -33
  152. package/cli/templates/lib/cnst.ts +0 -29
  153. package/cli/templates/lib/db.ts +0 -32
  154. package/cli/templates/lib/dict.ts +0 -49
  155. package/cli/templates/lib/sig.ts +0 -60
  156. package/cli/templates/lib/srv.ts +0 -34
  157. package/cli/templates/lib/st.ts +0 -31
  158. package/cli/templates/lib/useClient.ts +0 -19
  159. package/cli/templates/lib/useServer.ts +0 -7
  160. package/cli/templates/libRoot/.gitignore.template +0 -16
  161. package/cli/templates/libRoot/akan.config.ts +0 -12
  162. package/cli/templates/libRoot/base/baseLogic.ts +0 -10
  163. package/cli/templates/libRoot/base/index.ts +0 -8
  164. package/cli/templates/libRoot/common/commonLogic.ts +0 -10
  165. package/cli/templates/libRoot/common/index.ts +0 -8
  166. package/cli/templates/libRoot/env/env.server.example.ts.template +0 -6
  167. package/cli/templates/libRoot/env/env.server.testing.ts.template +0 -6
  168. package/cli/templates/libRoot/lib/___libName__/__libName__.dictionary.ts +0 -15
  169. package/cli/templates/libRoot/lib/___libName__/__libName__.service.ts +0 -11
  170. package/cli/templates/libRoot/lib/___libName__/__libName__.store.ts +0 -13
  171. package/cli/templates/libRoot/lib/option.ts +0 -17
  172. package/cli/templates/libRoot/package.json.template +0 -5
  173. package/cli/templates/libRoot/srvkit/backendLogic.ts +0 -10
  174. package/cli/templates/libRoot/srvkit/index.ts +0 -8
  175. package/cli/templates/libRoot/tsconfig.json.template +0 -11
  176. package/cli/templates/libRoot/ui/index.ts +0 -7
  177. package/cli/templates/libRoot/webkit/frontendLogic.ts +0 -10
  178. package/cli/templates/libRoot/webkit/index.ts +0 -8
  179. package/cli/templates/localDev/docker-compose.yaml.template +0 -37
  180. package/cli/templates/module/__Model__.Template.tsx +0 -36
  181. package/cli/templates/module/__Model__.Unit.tsx +0 -26
  182. package/cli/templates/module/__Model__.Util.tsx +0 -30
  183. package/cli/templates/module/__Model__.View.tsx +0 -29
  184. package/cli/templates/module/__Model__.Zone.tsx +0 -43
  185. package/cli/templates/module/__model__.constant.ts +0 -24
  186. package/cli/templates/module/__model__.dictionary.ts +0 -30
  187. package/cli/templates/module/__model__.document.ts +0 -23
  188. package/cli/templates/module/__model__.service.ts +0 -16
  189. package/cli/templates/module/__model__.signal.ts +0 -27
  190. package/cli/templates/module/__model__.store.ts +0 -19
  191. package/cli/templates/moduleRoot/index.tsx +0 -31
  192. package/cli/templates/pkgRoot/tsconfig.json.template +0 -10
  193. package/cli/templates/server.ts +0 -45
  194. package/cli/templates/workspaceRoot/.env.template +0 -14
  195. package/cli/templates/workspaceRoot/.gitignore.template +0 -120
  196. package/cli/templates/workspaceRoot/.vscode/settings.json.template +0 -23
  197. package/cli/templates/workspaceRoot/biome.json.template +0 -191
  198. package/cli/templates/workspaceRoot/bunfig.toml +0 -4
  199. package/cli/templates/workspaceRoot/package.json.template +0 -7
  200. package/cli/templates/workspaceRoot/tsconfig.json.template +0 -29
  201. package/cli/testHelpers.ts +0 -171
  202. package/cli/workspace/workspace.command.ts +0 -55
  203. package/cli/workspace/workspace.runner.ts +0 -79
  204. package/cli/workspace/workspace.script.ts +0 -74
  205. package/devkit/aiEditor.ts +0 -299
  206. package/devkit/akanApp/akanApp.host.ts +0 -393
  207. package/devkit/akanApp/index.ts +0 -1
  208. package/devkit/akanConfig/akanConfig.ts +0 -360
  209. package/devkit/akanConfig/index.ts +0 -2
  210. package/devkit/akanConfig/types.ts +0 -187
  211. package/devkit/applicationBuildReporter.ts +0 -69
  212. package/devkit/applicationBuildRunner.ts +0 -302
  213. package/devkit/applicationReleasePackager.ts +0 -205
  214. package/devkit/artifact/implicitRootLayout.ts +0 -155
  215. package/devkit/artifact/index.ts +0 -1
  216. package/devkit/artifact/routeSeedIndex.ts +0 -128
  217. package/devkit/auth.ts +0 -41
  218. package/devkit/builder.ts +0 -164
  219. package/devkit/capacitor.base.config.ts +0 -88
  220. package/devkit/capacitorApp.ts +0 -443
  221. package/devkit/commandDecorators/argMeta.ts +0 -102
  222. package/devkit/commandDecorators/command.ts +0 -340
  223. package/devkit/commandDecorators/commandBuilder.ts +0 -224
  224. package/devkit/commandDecorators/commandMeta.ts +0 -6
  225. package/devkit/commandDecorators/dependencyBuilder.ts +0 -100
  226. package/devkit/commandDecorators/helpFormatter.ts +0 -220
  227. package/devkit/commandDecorators/index.ts +0 -8
  228. package/devkit/commandDecorators/targetMeta.ts +0 -31
  229. package/devkit/commandDecorators/types.ts +0 -10
  230. package/devkit/constants.ts +0 -25
  231. package/devkit/createTunnel.ts +0 -36
  232. package/devkit/dependencyScanner.ts +0 -339
  233. package/devkit/executors.ts +0 -1362
  234. package/devkit/extractDeps.ts +0 -85
  235. package/devkit/fileEditor.ts +0 -106
  236. package/devkit/fileSys.ts +0 -39
  237. package/devkit/frontendBuild/allRoutesBuilder.ts +0 -103
  238. package/devkit/frontendBuild/clientBuildTypes.ts +0 -114
  239. package/devkit/frontendBuild/clientEntriesBundler.ts +0 -300
  240. package/devkit/frontendBuild/clientEntryDiscovery.ts +0 -196
  241. package/devkit/frontendBuild/csrArtifactBuilder.ts +0 -237
  242. package/devkit/frontendBuild/cssCompiler.ts +0 -285
  243. package/devkit/frontendBuild/cssImportResolver.ts +0 -116
  244. package/devkit/frontendBuild/fontOptimizer.ts +0 -427
  245. package/devkit/frontendBuild/hmrChangeClassifier.ts +0 -28
  246. package/devkit/frontendBuild/hmrWatcher.ts +0 -101
  247. package/devkit/frontendBuild/index.ts +0 -18
  248. package/devkit/frontendBuild/pagesBundleBuilder.ts +0 -137
  249. package/devkit/frontendBuild/pagesEntrySourceGenerator.ts +0 -37
  250. package/devkit/frontendBuild/precompressArtifacts.ts +0 -59
  251. package/devkit/frontendBuild/routeClientBuilder.ts +0 -290
  252. package/devkit/frontendBuild/routesManifestArtifactSerializer.ts +0 -62
  253. package/devkit/frontendBuild/ssrBaseArtifactBuilder.ts +0 -139
  254. package/devkit/frontendBuild/vendorSpecifiers.ts +0 -16
  255. package/devkit/frontendBuild/watchRootResolver.ts +0 -28
  256. package/devkit/getCredentials.ts +0 -19
  257. package/devkit/getDirname.ts +0 -3
  258. package/devkit/getModelFileData.ts +0 -59
  259. package/devkit/getRelatedCnsts.ts +0 -300
  260. package/devkit/guideline.ts +0 -19
  261. package/devkit/incrementalBuilder/incrementalBuilder.host.ts +0 -152
  262. package/devkit/incrementalBuilder/incrementalBuilder.proc.ts +0 -331
  263. package/devkit/incrementalBuilder/index.ts +0 -1
  264. package/devkit/index.ts +0 -36
  265. package/devkit/lint/no-deep-internal-import.grit +0 -25
  266. package/devkit/lint/no-import-client-functions.grit +0 -32
  267. package/devkit/lint/no-import-external-library.grit +0 -21
  268. package/devkit/lint/no-js-private-class-method.grit +0 -42
  269. package/devkit/lint/no-use-client-in-server.grit +0 -7
  270. package/devkit/lint/non-scalar-props-restricted.grit +0 -13
  271. package/devkit/linter.ts +0 -248
  272. package/devkit/mobile/index.ts +0 -1
  273. package/devkit/mobile/mobileTarget.ts +0 -88
  274. package/devkit/prompter.ts +0 -71
  275. package/devkit/scanInfo.ts +0 -606
  276. package/devkit/selectModel.ts +0 -11
  277. package/devkit/spinner.ts +0 -54
  278. package/devkit/src/capacitorApp.ts +0 -277
  279. package/devkit/sshTunnel.ts +0 -151
  280. package/devkit/streamAi.ts +0 -45
  281. package/devkit/transforms/barrelAnalyzer.ts +0 -249
  282. package/devkit/transforms/barrelImportsPlugin.ts +0 -457
  283. package/devkit/transforms/externalizeFrameworkPlugin.ts +0 -159
  284. package/devkit/transforms/index.ts +0 -5
  285. package/devkit/transforms/rscUseClientTransform.ts +0 -52
  286. package/devkit/transforms/useClientBundlePlugin.ts +0 -47
  287. package/devkit/typeChecker.ts +0 -260
  288. package/devkit/types.ts +0 -44
  289. package/devkit/ui/MultiScrollList.tsx +0 -228
  290. package/devkit/ui/ScrollList.tsx +0 -106
  291. package/devkit/ui/index.ts +0 -2
  292. package/devkit/uploadRelease.ts +0 -95
  293. package/devkit/useStdoutDimensions.ts +0 -20
  294. package/types/cli/application/application.command.d.ts +0 -7
  295. package/types/cli/application/application.interface.d.ts +0 -40
  296. package/types/cli/application/application.runner.d.ts +0 -66
  297. package/types/cli/application/application.script.d.ts +0 -72
  298. package/types/cli/build.d.ts +0 -1
  299. package/types/cli/cloud/cloud.command.d.ts +0 -7
  300. package/types/cli/cloud/cloud.runner.d.ts +0 -13
  301. package/types/cli/cloud/cloud.script.d.ts +0 -23
  302. package/types/cli/guideline/guideline.command.d.ts +0 -7
  303. package/types/cli/guideline/guideline.prompt.d.ts +0 -29
  304. package/types/cli/guideline/guideline.runner.d.ts +0 -21
  305. package/types/cli/guideline/guideline.script.d.ts +0 -16
  306. package/types/cli/index.d.ts +0 -2
  307. package/types/cli/library/library.command.d.ts +0 -7
  308. package/types/cli/library/library.runner.d.ts +0 -11
  309. package/types/cli/library/library.script.d.ts +0 -13
  310. package/types/cli/module/module.command.d.ts +0 -7
  311. package/types/cli/module/module.prompt.d.ts +0 -13
  312. package/types/cli/module/module.request.d.ts +0 -63
  313. package/types/cli/module/module.runner.d.ts +0 -55
  314. package/types/cli/module/module.script.d.ts +0 -22
  315. package/types/cli/npmRegistry.d.ts +0 -1
  316. package/types/cli/openBrowser.d.ts +0 -1
  317. package/types/cli/package/package.command.d.ts +0 -7
  318. package/types/cli/package/package.runner.d.ts +0 -13
  319. package/types/cli/package/package.script.d.ts +0 -18
  320. package/types/cli/page/page.command.d.ts +0 -7
  321. package/types/cli/page/page.runner.d.ts +0 -10
  322. package/types/cli/page/page.script.d.ts +0 -13
  323. package/types/cli/pluralizeName.d.ts +0 -1
  324. package/types/cli/scalar/scalar.command.d.ts +0 -7
  325. package/types/cli/scalar/scalar.prompt.d.ts +0 -23
  326. package/types/cli/scalar/scalar.runner.d.ts +0 -16
  327. package/types/cli/scalar/scalar.script.d.ts +0 -11
  328. package/types/cli/semver.d.ts +0 -1
  329. package/types/cli/templates/__scalar/__model__/__model__.constant.d.ts +0 -7
  330. package/types/cli/templates/__scalar/__model__/__model__.dictionary.d.ts +0 -7
  331. package/types/cli/templates/__scalar/__model__/__model__.document.d.ts +0 -7
  332. package/types/cli/templates/app/akan.config.d.ts +0 -6
  333. package/types/cli/templates/app/env/env.client.d.ts +0 -6
  334. package/types/cli/templates/app/env/env.client.type.d.ts +0 -6
  335. package/types/cli/templates/app/env/env.server.d.ts +0 -6
  336. package/types/cli/templates/app/lib/___appName__/__appName__.dictionary.d.ts +0 -7
  337. package/types/cli/templates/app/lib/___appName__/__appName__.service.d.ts +0 -7
  338. package/types/cli/templates/app/lib/___appName__/__appName__.signal.d.ts +0 -7
  339. package/types/cli/templates/app/lib/___appName__/__appName__.store.d.ts +0 -7
  340. package/types/cli/templates/app/lib/option.d.ts +0 -6
  341. package/types/cli/templates/app/main.d.ts +0 -6
  342. package/types/cli/templates/app/page/_index.d.ts +0 -9
  343. package/types/cli/templates/app/page/_layout.d.ts +0 -11
  344. package/types/cli/templates/client.d.ts +0 -4
  345. package/types/cli/templates/crudPages/[__model__Id]/edit/page.d.ts +0 -11
  346. package/types/cli/templates/crudPages/[__model__Id]/page.d.ts +0 -11
  347. package/types/cli/templates/crudPages/new/page.d.ts +0 -11
  348. package/types/cli/templates/crudPages/page.d.ts +0 -11
  349. package/types/cli/templates/crudSinglePage/page.d.ts +0 -11
  350. package/types/cli/templates/env/_env.server.type.d.ts +0 -7
  351. package/types/cli/templates/facetIndex/index.d.ts +0 -13
  352. package/types/cli/templates/facetIndex.d.ts +0 -1
  353. package/types/cli/templates/index.d.ts +0 -6
  354. package/types/cli/templates/lib/__lib/lib.constant.d.ts +0 -4
  355. package/types/cli/templates/lib/__lib/lib.dictionary.d.ts +0 -4
  356. package/types/cli/templates/lib/__lib/lib.document.d.ts +0 -4
  357. package/types/cli/templates/lib/__lib/lib.service.d.ts +0 -4
  358. package/types/cli/templates/lib/__lib/lib.signal.d.ts +0 -4
  359. package/types/cli/templates/lib/__lib/lib.store.d.ts +0 -4
  360. package/types/cli/templates/lib/cnst.d.ts +0 -4
  361. package/types/cli/templates/lib/db.d.ts +0 -4
  362. package/types/cli/templates/lib/dict.d.ts +0 -4
  363. package/types/cli/templates/lib/sig.d.ts +0 -4
  364. package/types/cli/templates/lib/srv.d.ts +0 -4
  365. package/types/cli/templates/lib/st.d.ts +0 -4
  366. package/types/cli/templates/lib/useClient.d.ts +0 -4
  367. package/types/cli/templates/lib/useServer.d.ts +0 -4
  368. package/types/cli/templates/libRoot/akan.config.d.ts +0 -5
  369. package/types/cli/templates/libRoot/base/baseLogic.d.ts +0 -5
  370. package/types/cli/templates/libRoot/base/index.d.ts +0 -5
  371. package/types/cli/templates/libRoot/base.d.ts +0 -1
  372. package/types/cli/templates/libRoot/common/commonLogic.d.ts +0 -5
  373. package/types/cli/templates/libRoot/common/index.d.ts +0 -5
  374. package/types/cli/templates/libRoot/common.d.ts +0 -1
  375. package/types/cli/templates/libRoot/lib/___libName__/__libName__.dictionary.d.ts +0 -6
  376. package/types/cli/templates/libRoot/lib/___libName__/__libName__.service.d.ts +0 -6
  377. package/types/cli/templates/libRoot/lib/___libName__/__libName__.store.d.ts +0 -6
  378. package/types/cli/templates/libRoot/lib/option.d.ts +0 -6
  379. package/types/cli/templates/libRoot/srvkit/backendLogic.d.ts +0 -5
  380. package/types/cli/templates/libRoot/srvkit/index.d.ts +0 -5
  381. package/types/cli/templates/libRoot/srvkit.d.ts +0 -1
  382. package/types/cli/templates/libRoot/ui/index.d.ts +0 -5
  383. package/types/cli/templates/libRoot/ui.d.ts +0 -1
  384. package/types/cli/templates/libRoot/webkit/frontendLogic.d.ts +0 -5
  385. package/types/cli/templates/libRoot/webkit/index.d.ts +0 -5
  386. package/types/cli/templates/libRoot/webkit.d.ts +0 -1
  387. package/types/cli/templates/module/__Model__.Template.d.ts +0 -11
  388. package/types/cli/templates/module/__Model__.Unit.d.ts +0 -11
  389. package/types/cli/templates/module/__Model__.Util.d.ts +0 -11
  390. package/types/cli/templates/module/__Model__.View.d.ts +0 -11
  391. package/types/cli/templates/module/__Model__.Zone.d.ts +0 -11
  392. package/types/cli/templates/module/__model__.constant.d.ts +0 -8
  393. package/types/cli/templates/module/__model__.dictionary.d.ts +0 -8
  394. package/types/cli/templates/module/__model__.document.d.ts +0 -8
  395. package/types/cli/templates/module/__model__.service.d.ts +0 -8
  396. package/types/cli/templates/module/__model__.signal.d.ts +0 -9
  397. package/types/cli/templates/module/__model__.store.d.ts +0 -8
  398. package/types/cli/templates/moduleRoot/index.d.ts +0 -11
  399. package/types/cli/templates/moduleRoot.d.ts +0 -1
  400. package/types/cli/templates/server.d.ts +0 -4
  401. package/types/cli/templates.d.ts +0 -1
  402. package/types/cli/testHelpers.d.ts +0 -64
  403. package/types/cli/workspace/workspace.command.d.ts +0 -7
  404. package/types/cli/workspace/workspace.runner.d.ts +0 -14
  405. package/types/cli/workspace/workspace.script.d.ts +0 -29
  406. package/types/cli.d.ts +0 -1
  407. package/types/devkit/aiEditor.d.ts +0 -50
  408. package/types/devkit/akanApp/akanApp.host.d.ts +0 -16
  409. package/types/devkit/akanApp/index.d.ts +0 -1
  410. package/types/devkit/akanApp.d.ts +0 -1
  411. package/types/devkit/akanConfig/akanConfig.d.ts +0 -36
  412. package/types/devkit/akanConfig/index.d.ts +0 -2
  413. package/types/devkit/akanConfig.d.ts +0 -1
  414. package/types/devkit/applicationBuildReporter.d.ts +0 -25
  415. package/types/devkit/applicationBuildRunner.d.ts +0 -29
  416. package/types/devkit/applicationReleasePackager.d.ts +0 -17
  417. package/types/devkit/artifact/implicitRootLayout.d.ts +0 -17
  418. package/types/devkit/artifact/index.d.ts +0 -1
  419. package/types/devkit/artifact/routeSeedIndex.d.ts +0 -38
  420. package/types/devkit/artifact.d.ts +0 -1
  421. package/types/devkit/auth.d.ts +0 -9
  422. package/types/devkit/builder.d.ts +0 -18
  423. package/types/devkit/capacitor.base.config.d.ts +0 -3
  424. package/types/devkit/capacitorApp.d.ts +0 -58
  425. package/types/devkit/commandDecorators/argMeta.d.ts +0 -68
  426. package/types/devkit/commandDecorators/command.d.ts +0 -2
  427. package/types/devkit/commandDecorators/commandBuilder.d.ts +0 -60
  428. package/types/devkit/commandDecorators/commandMeta.d.ts +0 -2
  429. package/types/devkit/commandDecorators/dependencyBuilder.d.ts +0 -22
  430. package/types/devkit/commandDecorators/helpFormatter.d.ts +0 -3
  431. package/types/devkit/commandDecorators/index.d.ts +0 -8
  432. package/types/devkit/commandDecorators/targetMeta.d.ts +0 -21
  433. package/types/devkit/commandDecorators/types.d.ts +0 -8
  434. package/types/devkit/commandDecorators.d.ts +0 -1
  435. package/types/devkit/constants.d.ts +0 -25
  436. package/types/devkit/createTunnel.d.ts +0 -8
  437. package/types/devkit/dependencyScanner.d.ts +0 -33
  438. package/types/devkit/executors.d.ts +0 -320
  439. package/types/devkit/extractDeps.d.ts +0 -7
  440. package/types/devkit/fileEditor.d.ts +0 -16
  441. package/types/devkit/fileSys.d.ts +0 -12
  442. package/types/devkit/frontendBuild/allRoutesBuilder.d.ts +0 -18
  443. package/types/devkit/frontendBuild/clientBuildTypes.d.ts +0 -107
  444. package/types/devkit/frontendBuild/clientEntriesBundler.d.ts +0 -12
  445. package/types/devkit/frontendBuild/clientEntryDiscovery.d.ts +0 -19
  446. package/types/devkit/frontendBuild/csrArtifactBuilder.d.ts +0 -16
  447. package/types/devkit/frontendBuild/cssCompiler.d.ts +0 -25
  448. package/types/devkit/frontendBuild/cssImportResolver.d.ts +0 -9
  449. package/types/devkit/frontendBuild/fontOptimizer.d.ts +0 -14
  450. package/types/devkit/frontendBuild/hmrChangeClassifier.d.ts +0 -5
  451. package/types/devkit/frontendBuild/hmrWatcher.d.ts +0 -21
  452. package/types/devkit/frontendBuild/index.d.ts +0 -18
  453. package/types/devkit/frontendBuild/pagesBundleBuilder.d.ts +0 -28
  454. package/types/devkit/frontendBuild/pagesEntrySourceGenerator.d.ts +0 -9
  455. package/types/devkit/frontendBuild/precompressArtifacts.d.ts +0 -7
  456. package/types/devkit/frontendBuild/routeClientBuilder.d.ts +0 -50
  457. package/types/devkit/frontendBuild/routesManifestArtifactSerializer.d.ts +0 -12
  458. package/types/devkit/frontendBuild/ssrBaseArtifactBuilder.d.ts +0 -16
  459. package/types/devkit/frontendBuild/vendorSpecifiers.d.ts +0 -2
  460. package/types/devkit/frontendBuild/watchRootResolver.d.ts +0 -6
  461. package/types/devkit/frontendBuild.d.ts +0 -1
  462. package/types/devkit/getCredentials.d.ts +0 -12
  463. package/types/devkit/getDirname.d.ts +0 -1
  464. package/types/devkit/getModelFileData.d.ts +0 -16
  465. package/types/devkit/getRelatedCnsts.d.ts +0 -53
  466. package/types/devkit/guideline.d.ts +0 -19
  467. package/types/devkit/incrementalBuilder/incrementalBuilder.host.d.ts +0 -30
  468. package/types/devkit/incrementalBuilder/incrementalBuilder.proc.d.ts +0 -1
  469. package/types/devkit/incrementalBuilder/index.d.ts +0 -1
  470. package/types/devkit/incrementalBuilder.d.ts +0 -1
  471. package/types/devkit/index.d.ts +0 -36
  472. package/types/devkit/linter.d.ts +0 -108
  473. package/types/devkit/mobile/index.d.ts +0 -1
  474. package/types/devkit/mobile/mobileTarget.d.ts +0 -14
  475. package/types/devkit/mobile.d.ts +0 -1
  476. package/types/devkit/prompter.d.ts +0 -15
  477. package/types/devkit/scanInfo.d.ts +0 -82
  478. package/types/devkit/selectModel.d.ts +0 -1
  479. package/types/devkit/spinner.d.ts +0 -20
  480. package/types/devkit/src/capacitorApp.d.ts +0 -39
  481. package/types/devkit/sshTunnel.d.ts +0 -14
  482. package/types/devkit/streamAi.d.ts +0 -6
  483. package/types/devkit/transforms/barrelAnalyzer.d.ts +0 -27
  484. package/types/devkit/transforms/barrelImportsPlugin.d.ts +0 -26
  485. package/types/devkit/transforms/externalizeFrameworkPlugin.d.ts +0 -49
  486. package/types/devkit/transforms/index.d.ts +0 -5
  487. package/types/devkit/transforms/rscUseClientTransform.d.ts +0 -10
  488. package/types/devkit/transforms/useClientBundlePlugin.d.ts +0 -19
  489. package/types/devkit/transforms.d.ts +0 -1
  490. package/types/devkit/typeChecker.d.ts +0 -62
  491. package/types/devkit/types.d.ts +0 -43
  492. package/types/devkit/ui/MultiScrollList.d.ts +0 -13
  493. package/types/devkit/ui/ScrollList.d.ts +0 -7
  494. package/types/devkit/ui/index.d.ts +0 -2
  495. package/types/devkit/ui.d.ts +0 -1
  496. package/types/devkit/uploadRelease.d.ts +0 -10
  497. package/types/devkit/useStdoutDimensions.d.ts +0 -1
  498. package/types/devkit.d.ts +0 -1
@@ -1,129 +0,0 @@
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
- }
@@ -1,509 +0,0 @@
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
- // Insight-style count example
122
- async getOrderStatsByUser(userId: string) {
123
- const baseQuery = { user: userId };
124
-
125
- return {
126
- active: await this.count({ ...baseQuery, status: "active" }),
127
- refunded: await this.count({ ...baseQuery, status: "refunded" }),
128
- };
129
- }
130
- }
131
- ```
132
-
133
- ## Built-in Model Functions
134
-
135
- Akan.js provides several built-in methods that are available on all models:
136
-
137
- ```typescript
138
- // Direct access to Mongoose model
139
- await userModel.User.find({...});
140
-
141
- // Common operations
142
- const user = await userModel.getUser(userId); // Get by ID or throw error
143
- const maybeUser = await userModel.loadUser(userId); // Get by ID or return null
144
- const users = await userModel.loadUserMany([userId1, userId2]); // Get multiple by IDs
145
-
146
- // CRUD operations
147
- const newUser = await userModel.createUser(userData); // Create new document
148
- const updated = await userModel.updateUser(userId, userData); // Update document
149
- const removed = await userModel.removeUser(userId); // Soft delete (sets removedAt)
150
-
151
- // Search operations (when Meilisearch is configured)
152
- const { docs, count } = await userModel.searchUser("john"); // Full-text search
153
- const users = await userModel.searchDocsUser("john"); // Just get documents
154
- const total = await userModel.searchCountUser("john"); // Just get count
155
- ```
156
-
157
- ## How to Apply Middleware
158
-
159
- Middleware allows you to intercept and modify document operations at various lifecycle stages.
160
-
161
- ### Common Middleware Hooks:
162
-
163
- - `pre('save')` - Before saving a document
164
- - `post('save')` - After saving a document
165
- - `pre('remove')` - Before removing a document
166
- - `pre('validate')` - Before validation
167
- - `pre('findOneAndUpdate')` - Before findOneAndUpdate operations
168
-
169
-
170
- ## How to Apply Indexes
171
-
172
- Indexes are crucial for query performance. Define them in the Middleware's `onSchema` method:
173
-
174
- ### Types of Indexes:
175
-
176
- - **Single field index** - Optimize queries on a single field
177
- - **Compound index** - Optimize queries that filter or sort on multiple fields
178
- - **Text index** - Enable full-text search on specified fields
179
- - **Unique index** - Ensure field values are unique across the collection
180
- - **Sparse index** - Only include documents that have the indexed field
181
-
182
- ## How to Query Documents
183
-
184
- The Akan.js framework uses document query objects for common filtering and counting:
185
-
186
- ```typescript
187
- // Find operations
188
- const product = await productModel.pickById(id);
189
- const activeProducts = await productModel.list({ status: "active" });
190
-
191
- // Update operations
192
- await productModel.updateManyByQuery({ category: "electronics" }, { set: { onSale: true } });
193
-
194
- // Insight counts
195
- const activeCount = await productModel.count({ status: "active" });
196
- const categoryCount = await productModel.count({ category: "electronics" });
197
-
198
- // Advanced querying
199
- const products = await productModel.list(
200
- {
201
- price: { gte: 100, lte: 500 },
202
- category: { oneOf: ["electronics", "gadgets"] },
203
- },
204
- { sort: { rating: -1 }, limit: 10 },
205
- );
206
- ```
207
-
208
- ## How to Use DataLoader
209
-
210
- DataLoader batches and caches database requests to optimize performance, especially for resolving relationships between documents.
211
-
212
- ### Types of Loaders:
213
-
214
- - `@Loader.ByField(fieldName)` - Load documents by a specific field value
215
- - `@Loader.ByArrayField(fieldName)` - Load documents that contain a value in an array field
216
- - `@Loader.ByQuery(queryKeys)` - Load documents by complex query criteria
217
-
218
- ### Example DataLoader Implementation:
219
-
220
- ```typescript
221
- export class OrderModel extends into(Order, cnst.orderCnst) {
222
- // Load orders by user ID
223
- @Loader.ByField("userId")
224
- userOrdersLoader: Loader<string, Order[]>;
225
-
226
- // Load orders by status
227
- @Loader.ByField("status")
228
- statusOrdersLoader: Loader<string, Order[]>;
229
-
230
- // Load orders by tag (array field)
231
- @Loader.ByArrayField("tags")
232
- tagOrdersLoader: Loader<string, Order[]>;
233
-
234
- // Load order by complex query
235
- @Loader.ByQuery(["userId", "orderNumber"])
236
- specificOrderLoader: Loader<{ userId: string; orderNumber: string }, Order>;
237
- }
238
-
239
- // Usage:
240
- const userOrders = await orderModel.userOrdersLoader.load(userId);
241
- const pendingOrders = await orderModel.statusOrdersLoader.load("pending");
242
- const taggedOrders = await orderModel.tagOrdersLoader.load("priority");
243
- const specificOrder = await orderModel.specificOrderLoader.load({
244
- userId: "user123",
245
- orderNumber: "ORD-12345",
246
- });
247
- ```
248
-
249
- ## How to Use Cache with Redis
250
-
251
- Akan.js integrates Redis caching through the model's cache instance, providing simple methods for storing and retrieving data:
252
-
253
- ```typescript
254
- // Set cache
255
- await userModel.UserCache.set(
256
- "session", // Topic/category
257
- userId, // Key
258
- sessionData, // Value
259
- { expireAt: dayjs().add(1, "hour") } // Options
260
- );
261
-
262
- // Get cache
263
- const session = await userModel.UserCache.get("session", userId);
264
-
265
- // Delete cache
266
- await userModel.UserCache.delete("session", userId);
267
-
268
- // Example: Caching expensive computation
269
- async function getUserStats(userId: string) {
270
- // Try to get from cache first
271
- const cachedStats = await userModel.UserCache.get("stats", userId);
272
- if (cachedStats) return JSON.parse(cachedStats);
273
-
274
- // If not in cache, compute and store
275
- const stats = await computeExpensiveUserStats(userId);
276
- await userModel.UserCache.set("stats", userId, JSON.stringify(stats), { expireAt: dayjs().add(30, "minute") });
277
-
278
- return stats;
279
- }
280
- ```
281
-
282
- ## How to Use Search with Meilisearch
283
-
284
- Akan.js provides Meilisearch integration for full-text search capabilities:
285
-
286
- ```typescript
287
- // Basic search with pagination
288
- const { docs, count } = await productModel.searchProduct("wireless headphones", {
289
- skip: 0,
290
- limit: 10,
291
- });
292
-
293
- // Search with filtering
294
- const { docs, count } = await productModel.searchProduct("wireless headphones", {
295
- filter: "category=electronics AND price<=100",
296
- });
297
-
298
- // Search with sorting
299
- const { docs, count } = await productModel.searchProduct("wireless headphones", {
300
- sort: ["rating:desc", "price:asc"],
301
- });
302
-
303
- // Just get the documents
304
- const products = await productModel.searchDocsProduct("wireless headphones");
305
-
306
- // Just get the count
307
- const resultCount = await productModel.searchCountProduct("wireless headphones");
308
- ```
309
-
310
- ## Best Practices
311
-
312
- ### 1. Document Methods vs. Model Statics
313
-
314
- - Use **document methods** for operations on a single document
315
- - Use **model statics** for operations on multiple documents or complex business logic
316
-
317
- ### 2. Efficient Querying
318
-
319
- - Add indexes for frequently used queries
320
- - Use projection (`select`) to limit fields returned
321
- - Use `lean()` when you don't need full Mongoose documents
322
- - Implement DataLoader for relationship fields
323
-
324
- ### 3. Error Handling
325
-
326
- - Use `pickOne` and `pickById` when you expect a document to exist
327
- - Implement custom error classes for domain-specific errors
328
- - Validate inputs before database operations
329
-
330
- ### 4. Transactions
331
-
332
- Use transactions for operations that need to be atomic:
333
-
334
- ```typescript
335
- export class OrderModel extends into(Order, cnst.orderCnst) {
336
- @Transaction()
337
- async createOrderWithItems(orderData, items) {
338
- const order = await this.createOrder(orderData);
339
- await Promise.all(items.map((item) => itemModel.createItem({ ...item, orderId: order.id })));
340
- return order;
341
- }
342
- }
343
- ```
344
-
345
- ### 5. Soft Deletes
346
-
347
- Akan.js implements soft deletes by default:
348
-
349
- ```typescript
350
- // Soft delete (sets removedAt field)
351
- await userModel.removeUser(userId);
352
-
353
- // To query only non-deleted documents
354
- const users = await userModel.User.find({ removedAt: { $exists: false } });
355
-
356
- // To permanently delete (rarely needed)
357
- await userModel.User.findByIdAndDelete(userId);
358
- ```
359
-
360
- ## Complete Example
361
-
362
- Here's a complete example integrating multiple features:
363
-
364
- ```typescript
365
- // product.document.ts
366
- import { dayjs } from "akanjs/base";
367
- import { beyond, by, Database, into, Loader, SchemaOf } from "akanjs/document";
368
- import * as cnst from "../cnst";
369
-
370
- export class Product extends by(cnst.Product) {
371
- applyDiscount(percentage: number) {
372
- if (percentage < 0 || percentage > 100) {
373
- throw new Error("Discount percentage must be between 0 and 100");
374
- }
375
-
376
- const discount = (this.price * percentage) / 100;
377
- this.discountedPrice = this.price - discount;
378
- this.discountPercentage = percentage;
379
-
380
- return this;
381
- }
382
-
383
- isInStock() {
384
- return this.stockCount > 0;
385
- }
386
-
387
- decreaseStock(quantity = 1) {
388
- if (this.stockCount < quantity) {
389
- throw new Error("Not enough stock");
390
- }
391
-
392
- this.stockCount -= quantity;
393
-
394
- return this;
395
- }
396
- }
397
-
398
- export class ProductModel extends into(Product, cnst.productCnst) {
399
- @Loader.ByField("category")
400
- categoryProductsLoader: Loader<string, Product[]>;
401
-
402
- @Loader.ByArrayField("tags")
403
- tagProductsLoader: Loader<string, Product[]>;
404
-
405
- async findPopularProducts(limit = 10) {
406
- return this.list(
407
- {
408
- status: "active",
409
- popularity: { gte: 4 },
410
- },
411
- { sort: { popularity: -1 }, limit },
412
- );
413
- }
414
-
415
- async updatePrices(categoryId: string, increasePercentage: number) {
416
- const products = await this.list({ category: categoryId });
417
-
418
- const updates = products.map((product) => {
419
- const newPrice = product.price * (1 + increasePercentage / 100);
420
- return product.set({ price: newPrice }).save();
421
- });
422
-
423
- return Promise.all(updates);
424
- }
425
-
426
- async getCategoryStats(categoryId: string) {
427
- const result = {
428
- activeCount: await this.count({ status: "active", category: categoryId }),
429
- popularCount: await this.count({ status: "active", category: categoryId, popularity: { gte: 4 } }),
430
- };
431
-
432
- // Cache the results
433
- await this.ProductCache.set("stats", "categories", JSON.stringify(result), { expireAt: dayjs().add(1, "hour") });
434
-
435
- return result;
436
- }
437
- }
438
-
439
- ```
440
-
441
- ## Integration with NestJS
442
-
443
- When using Akan.js with NestJS, models are injected using the service provider system:
444
-
445
- ```typescript
446
- // product.service.ts
447
- import { Injectable } from "@nestjs/common";
448
- import { getModel } from "akanjs/server";
449
- import { ProductModel } from "./product.document";
450
-
451
- @Injectable()
452
- export class ProductService {
453
- private productModel = getModel(ProductModel);
454
-
455
- async getProductById(id: string) {
456
- return this.productModel.getProduct(id);
457
- }
458
-
459
- async searchProducts(query: string, options = {}) {
460
- return this.productModel.searchProduct(query, options);
461
- }
462
-
463
- async createProduct(data) {
464
- return this.productModel.createProduct(data);
465
- }
466
-
467
- async applyDiscount(productId: string, percentage: number) {
468
- const product = await this.productModel.getProduct(productId);
469
- return product.applyDiscount(percentage).save();
470
- }
471
- }
472
- ```
473
-
474
- ## Client-Side Usage
475
-
476
- On the client side, you'll typically interact with models through GraphQL or REST APIs:
477
-
478
- ```typescript
479
- // Using model-generated GraphQL operations
480
- const { data } = await client.query({
481
- query: gql`
482
- query GetProduct($id: ID!) {
483
- getProduct(id: $id) {
484
- id
485
- name
486
- price
487
- description
488
- category
489
- status
490
- stockCount
491
- }
492
- }
493
- `,
494
- variables: { id: productId },
495
- });
496
- ```
497
-
498
- ## Summary
499
-
500
- 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:
501
-
502
- 1. Define clear data structures with validation
503
- 2. Implement business logic at both document and collection levels
504
- 3. Optimize database performance with indexes and DataLoader
505
- 4. Leverage caching for high-performance operations
506
- 5. Implement full-text search capabilities
507
- 6. Create a maintainable and scalable data layer
508
-
509
- Following the patterns and best practices outlined in this guide will help you build robust and efficient data-driven applications with Akan.js.