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,708 @@
1
+ # Akan.js Model Service Implementation Guide
2
+
3
+ ## Purpose and Role of model.service.ts Files
4
+
5
+ In the Akan.js framework, `model.service.ts` files are central components that implement business logic and manage interactions with data models. These services serve multiple critical purposes:
6
+
7
+ 1. **Business Logic Layer** - Encapsulate domain-specific operations and rules
8
+ 2. **Data Orchestration** - Coordinate operations between different models and external systems
9
+ 3. **Transaction Management** - Handle complex multi-step operations that may involve multiple models
10
+ 4. **Lifecycle Management** - Initialize resources and clean up when the application starts or stops
11
+ 5. **Scheduled Tasks** - Execute recurring operations using cron jobs and intervals
12
+ 6. **Security** - Implement authorization and permission checks
13
+ 7. **Integration** - Connect with external APIs, message queues, and other services
14
+
15
+ Services in Akan.js follow a stateless design pattern, where any persistent state should be managed through MongoDB and Redis, not within the service instance itself.
16
+
17
+ ## Service Structure and Inheritance
18
+
19
+ Akan.js services typically extend base service classes provided by the framework:
20
+
21
+ ### DbService
22
+
23
+ Most services extend `DbService` to work with MongoDB models:
24
+
25
+ ```typescript
26
+ export class ProductService extends DbService(db.productDb) {
27
+ // Service methods here
28
+ }
29
+ ```
30
+
31
+ The `DbService` function automatically injects the database model and provides numerous convenience methods for CRUD operations.
32
+
33
+ ### serve
34
+
35
+ For utility services that don't directly work with a database model:
36
+
37
+ ```typescript
38
+ export class SecurityService extends serve("security" as const) {
39
+ // Utility methods here
40
+ }
41
+ ```
42
+
43
+ ### Custom Service Base Classes
44
+
45
+ For specific domain services with shared functionality:
46
+
47
+ ```typescript
48
+ // In _libName/libName.service.ts
49
+ export const LibService = MixSrvs(SharedService, PlatformService, SocialService);
50
+
51
+ // In another service
52
+
53
+ export class CustomService extends LibService {
54
+ // Custom methods here
55
+ }
56
+ ```
57
+
58
+ ## Core Decorators
59
+
60
+ Options:
61
+
62
+ - `enabled`: Boolean flag to conditionally disable a service (default: true)
63
+ - `serverMode`: Restricts the service to run only in specific server modes:
64
+ - `"federation"`: For API/GraphQL servers
65
+ - `"batch"`: For background processing servers
66
+ - Not specified: Runs in all modes
67
+
68
+ ### @Srv Decorator
69
+
70
+ Injects another service by name:
71
+
72
+ ```typescript
73
+ @Srv()
74
+ protected readonly userService: UserService; // Injects using capitalized property name
75
+
76
+ @Srv("CustomName")
77
+ protected readonly customService: SomeService; // Injects using specified name
78
+ ```
79
+
80
+ The `@Srv` decorator automatically capitalizes the property name if no explicit name is provided. For example, `@Srv() userService` will look for a service named "UserService".
81
+
82
+ ### @Use Decorator
83
+
84
+ Injects non-service dependencies like APIs, configurations, or utilities:
85
+
86
+ ```typescript
87
+ @Use()
88
+ protected readonly emailApi: EmailApi; // Injects using capitalized property name
89
+
90
+ @Use("CustomKey")
91
+ protected readonly customConfig: SomeConfig; // Injects using specified name
92
+ ```
93
+
94
+ Similar to `@Srv`, the `@Use` decorator capitalizes property names by default.
95
+
96
+ ### @Db Decorator
97
+
98
+ Injects a specific database model directly (rarely needed since `DbService` already provides this):
99
+
100
+ ```typescript
101
+ @Db("User")
102
+ protected readonly userModel: UserModel;
103
+ ```
104
+
105
+ ### @Queue Decorator
106
+
107
+ Injects a Bull queue for background processing:
108
+
109
+ ```typescript
110
+ @Queue()
111
+ protected readonly userQueue: Queue<UserSignal>;
112
+ ```
113
+
114
+ ### @Websocket Decorator
115
+
116
+ Injects a websocket server instance for real-time communication:
117
+
118
+ ```typescript
119
+ @Websocket()
120
+ protected readonly websocket: Websocket<ChatSignal>;
121
+ ```
122
+
123
+ ## Database Operations
124
+
125
+ When extending `DbService`, your service automatically inherits numerous methods for working with the database model.
126
+
127
+ ### Basic CRUD Operations
128
+
129
+ ```typescript
130
+ // Create
131
+ const newProduct = await this.createProduct(productData);
132
+
133
+ // Read
134
+ const product = await this.getProduct(productId); // Throws if not found
135
+ const maybeProduct = await this.loadProduct(productId); // Returns null if not found
136
+ const products = await this.loadProductMany([id1, id2, id3]); // Load multiple by IDs
137
+
138
+ // Update
139
+ const updatedProduct = await this.updateProduct(productId, updateData);
140
+
141
+ // Delete (soft delete)
142
+ const removedProduct = await this.removeProduct(productId);
143
+ ```
144
+
145
+ ### Query Operations
146
+
147
+ ```typescript
148
+ // List with filtering, sorting, and pagination
149
+ const products = await this.listActiveProducts(categoryId, {
150
+ skip: 0,
151
+ limit: 10,
152
+ sort: "priceAsc",
153
+ });
154
+
155
+ // Get IDs only
156
+ const productIds = await this.listIdsActiveProducts(categoryId);
157
+
158
+ // Find a single item (returns null if not found)
159
+ const product = await this.findActiveProduct(categoryId);
160
+
161
+ // Pick a single item (throws if not found)
162
+ const product = await this.pickActiveProduct(categoryId);
163
+
164
+ // Check existence
165
+ const exists = await this.existsActiveProduct(categoryId);
166
+
167
+ // Count
168
+ const count = await this.countActiveProducts(categoryId);
169
+
170
+ // Insight (aggregate statistics)
171
+ const stats = await this.insightActiveProducts(categoryId);
172
+ ```
173
+
174
+ ### Search Operations (with Meilisearch)
175
+
176
+ ```typescript
177
+ // Full-text search with pagination
178
+ const { docs, count } = await this.searchProduct("wireless headphones", {
179
+ skip: 0,
180
+ limit: 10,
181
+ });
182
+
183
+ // Just get documents
184
+ const products = await this.searchDocsProduct("wireless headphones");
185
+
186
+ // Just get count
187
+ const total = await this.searchCountProduct("wireless headphones");
188
+ ```
189
+
190
+ ## Customizing Database Operations
191
+
192
+ `DbService` provides hooks for customizing database operations:
193
+
194
+ ```typescript
195
+ // Called before document creation
196
+ async _preCreate(data: ProductInput): Promise<ProductInput> {
197
+ // Validate or transform input data
198
+ if (!data.slug && data.name) {
199
+ data.slug = this.generateSlug(data.name);
200
+ }
201
+ return data;
202
+ }
203
+
204
+ // Called after document creation
205
+ async _postCreate(doc: Product): Promise<Product> {
206
+ // Perform additional actions after creation
207
+ await this.notificationService.notifyNewProduct(doc);
208
+ return doc;
209
+ }
210
+
211
+ // Called before document update
212
+ async _preUpdate(id: string, data: Partial<Product>): Promise<Partial<Product>> {
213
+ // Validate update data
214
+ const product = await this.getProduct(id);
215
+ if (product.status === 'published' && data.status === 'draft') {
216
+ throw new Error('Cannot revert published product to draft');
217
+ }
218
+ return data;
219
+ }
220
+
221
+ // Called after document update
222
+ async _postUpdate(doc: Product): Promise<Product> {
223
+ // Perform additional actions after update
224
+ await this.cacheService.invalidateProduct(doc.id);
225
+ return doc;
226
+ }
227
+
228
+ // Called before document removal
229
+ async _preRemove(id: string): Promise<void> {
230
+ // Validate removal
231
+ const product = await this.getProduct(id);
232
+ if (product.hasActiveOrders) {
233
+ throw new Error('Cannot remove product with active orders');
234
+ }
235
+ }
236
+
237
+ // Called after document removal
238
+ async _postRemove(doc: Product): Promise<Product> {
239
+ // Perform additional actions after removal
240
+ await this.searchService.removeProductFromIndex(doc.id);
241
+ return doc;
242
+ }
243
+ ```
244
+
245
+ ## Working with Other Services
246
+
247
+ Services often work together to implement complex operations:
248
+
249
+ ```typescript
250
+ export class OrderService extends DbService(db.orderDb) {
251
+ @Srv() productService: ProductService;
252
+ @Srv() userService: UserService;
253
+ @Srv() paymentService: PaymentService;
254
+ @Use() emailApi: EmailApi;
255
+
256
+ async createOrder(userId: string, items: OrderItemInput[]): Promise<Order> {
257
+ // Get user information
258
+ const user = await this.userService.getUser(userId);
259
+
260
+ // Verify product availability and calculate total
261
+ let total = 0;
262
+ const orderItems = [];
263
+
264
+ for (const item of items) {
265
+ const product = await this.productService.getProduct(item.productId);
266
+
267
+ if (product.stock < item.quantity) {
268
+ throw new Error(`Not enough stock for ${product.name}`);
269
+ }
270
+
271
+ const itemTotal = product.price * item.quantity;
272
+ total += itemTotal;
273
+
274
+ orderItems.push({
275
+ product: product.id,
276
+ quantity: item.quantity,
277
+ price: product.price,
278
+ total: itemTotal,
279
+ });
280
+
281
+ // Update product stock
282
+ await this.productService.updateProduct(product.id, {
283
+ stock: product.stock - item.quantity,
284
+ });
285
+ }
286
+
287
+ // Create order
288
+ const order = await this.createOrder({
289
+ user: user.id,
290
+ items: orderItems,
291
+ total,
292
+ status: "pending",
293
+ });
294
+
295
+ // Send confirmation email
296
+ await this.emailApi.sendOrderConfirmation(user.email, order);
297
+
298
+ return order;
299
+ }
300
+ }
301
+ ```
302
+
303
+ ## Websocket Integration
304
+
305
+ For real-time features:
306
+
307
+ ```typescript
308
+ export class ChatService extends DbService(db.chatDb) {
309
+ @Websocket()
310
+ websocket: Websocket<ChatSignal>;
311
+
312
+ async sendMessage(roomId: string, userId: string, content: string) {
313
+ // Create message in database
314
+ const message = await this.createMessage({
315
+ room: roomId,
316
+ sender: userId,
317
+ content,
318
+ sentAt: new Date(),
319
+ });
320
+
321
+ // Broadcast to room subscribers
322
+ this.websocket.pubsubNewMessage(roomId, {
323
+ id: message.id,
324
+ sender: message.sender,
325
+ content: message.content,
326
+ sentAt: message.sentAt,
327
+ });
328
+
329
+ return message;
330
+ }
331
+ }
332
+ ```
333
+
334
+ ## Queue Integration
335
+
336
+ For background processing:
337
+
338
+ ```typescript
339
+ export class EmailService extends serve("email" as const) {
340
+ @Queue()
341
+ emailQueue: Queue<EmailSignal>;
342
+ @Use()
343
+ emailApi: EmailApi;
344
+
345
+ async sendWelcomeEmail(userId: string, email: string) {
346
+ // Add to background queue
347
+ await this.emailQueue.add("sendWelcomeEmail", { userId, email });
348
+ }
349
+
350
+ // Process queue job
351
+ async processSendWelcomeEmail(userId: string, email: string) {
352
+ const template = await this.getWelcomeTemplate();
353
+ await this.emailApi.send(email, "Welcome!", template);
354
+ await this.userService.updateUser(userId, { emailSent: true });
355
+ }
356
+ }
357
+ ```
358
+
359
+ ## Error Handling
360
+
361
+ Akan.js services should implement proper error handling:
362
+
363
+ ```typescript
364
+ async transferFunds(fromAccountId: string, toAccountId: string, amount: number) {
365
+ try {
366
+ // Validate accounts
367
+ const [fromAccount, toAccount] = await Promise.all([
368
+ this.getAccount(fromAccountId),
369
+ this.getAccount(toAccountId)
370
+ ]);
371
+
372
+ // Check balance
373
+ if (fromAccount.balance < amount) {
374
+ throw new InsufficientFundsError(
375
+ `Account ${fromAccountId} has insufficient funds: ${fromAccount.balance} < ${amount}`
376
+ );
377
+ }
378
+
379
+ // Perform transfer
380
+ await Promise.all([
381
+ this.updateAccount(fromAccountId, { balance: fromAccount.balance - amount }),
382
+ this.updateAccount(toAccountId, { balance: toAccount.balance + amount })
383
+ ]);
384
+
385
+ // Log transaction
386
+ await this.createTransaction({
387
+ from: fromAccountId,
388
+ to: toAccountId,
389
+ amount,
390
+ status: 'completed'
391
+ });
392
+
393
+ return true;
394
+ } catch (error) {
395
+ // Log error
396
+ this.logger.error(`Transfer failed: ${error.message}`, error.stack);
397
+
398
+ // Create failed transaction record
399
+ await this.createTransaction({
400
+ from: fromAccountId,
401
+ to: toAccountId,
402
+ amount,
403
+ status: 'failed',
404
+ error: error.message
405
+ });
406
+
407
+ // Rethrow domain-specific errors, wrap others
408
+ if (error instanceof DomainError) {
409
+ throw error;
410
+ }
411
+
412
+ throw new TransferFailedError(`Transfer failed: ${error.message}`, { cause: error });
413
+ }
414
+ }
415
+ ```
416
+
417
+ ## Best Practices
418
+
419
+ ### 1. Stateless Design
420
+
421
+ Services should not maintain internal state between requests:
422
+
423
+ ```typescript
424
+ // BAD - maintains state in the service
425
+
426
+ class CounterService {
427
+ private count = 0; // This state is lost on server restart
428
+
429
+ increment() {
430
+ this.count++;
431
+ }
432
+ getCount() {
433
+ return this.count;
434
+ }
435
+ }
436
+
437
+ // GOOD - uses database for state
438
+
439
+ class CounterService extends DbService(db.counterDb) {
440
+ async increment(counterId: string) {
441
+ const counter = await this.getCounter(counterId);
442
+ return await counter.set({ count: counter.count + 1 }).save();
443
+ }
444
+
445
+ async getCount(counterId: string) {
446
+ const counter = await this.getCounter(counterId);
447
+ return counter.count;
448
+ }
449
+ }
450
+ ```
451
+
452
+ ### 2. Single Responsibility
453
+
454
+ Each service should focus on a specific domain:
455
+
456
+ ```typescript
457
+ // BAD - mixing concerns
458
+
459
+ class UserService extends DbService(db.userDb) {
460
+ async createUser(data) {
461
+ // User creation logic
462
+ }
463
+
464
+ async sendEmail(userId, subject, content) {
465
+ // Email sending logic
466
+ }
467
+
468
+ async processPayment(userId, amount) {
469
+ // Payment processing logic
470
+ }
471
+ }
472
+
473
+ // GOOD - separate services
474
+
475
+ class UserService extends DbService(db.userDb) {
476
+ @Srv() emailService: EmailService;
477
+ @Srv() paymentService: PaymentService;
478
+
479
+ async createUser(data) {
480
+ // User creation logic
481
+ }
482
+ }
483
+
484
+ class EmailService extends serve("email" as const) {
485
+ async sendEmail(userId, subject, content) {
486
+ // Email sending logic
487
+ }
488
+ }
489
+
490
+ class PaymentService extends DbService(db.paymentDb) {
491
+ async processPayment(userId, amount) {
492
+ // Payment processing logic
493
+ }
494
+ }
495
+ ```
496
+
497
+ ### 4. Transaction Safety
498
+
499
+ Use hooks for validating operations:
500
+
501
+ ```typescript
502
+ async _preUpdate(id: string, data: Partial<Product>) {
503
+ // Validate that product exists
504
+ const product = await this.getProduct(id);
505
+
506
+ // Check authorization
507
+ if (product.owner !== this.currentUser.id) {
508
+ throw new UnauthorizedError('You do not own this product');
509
+ }
510
+
511
+ // Validate business rules
512
+ if (product.status === 'published' && data.price < product.price) {
513
+ throw new ValidationError('Cannot reduce price of published product');
514
+ }
515
+
516
+ return data;
517
+ }
518
+ ```
519
+
520
+ ### 5. Service Dependency Injection
521
+
522
+ Inject other services using decorators, not direct imports:
523
+
524
+ ```typescript
525
+ // BAD - direct import
526
+ import { UserService } from "../user/user.service";
527
+
528
+ class OrderService extends DbService(db.orderDb) {
529
+ private userService = new UserService(); // Hard-coded dependency
530
+ }
531
+
532
+ // GOOD - dependency injection
533
+
534
+ class OrderService extends DbService(db.orderDb) {
535
+ @Srv() userService: UserService; // Injected dependency
536
+ }
537
+ ```
538
+
539
+ ### 6. Logging
540
+
541
+ Use the built-in logger for consistent logging:
542
+
543
+ ```typescript
544
+ class PaymentService extends DbService(db.paymentDb) {
545
+ async processPayment(orderId: string, amount: number) {
546
+ this.logger.log(`Processing payment of ${amount} for order ${orderId}`);
547
+
548
+ try {
549
+ // Payment processing logic
550
+ this.logger.debug("Payment gateway response", response);
551
+
552
+ return result;
553
+ } catch (error) {
554
+ this.logger.error(`Payment failed for order ${orderId}: ${error.message}`, error.stack);
555
+ throw error;
556
+ }
557
+ }
558
+ }
559
+ ```
560
+
561
+ ## Complete Example
562
+
563
+ Here's a complete example of a service implementation:
564
+
565
+ ```typescript
566
+ import { Dayjs } from "akanjs/base";
567
+ import { Cron } from "akanjs/server";
568
+ import { DbService, Srv, Use } from "akanjs/service";
569
+ import type { EmailApi } from "@libs/util/server";
570
+
571
+ import * as cnst from "../cnst";
572
+ import * as db from "../db";
573
+ import { Revert } from "../dict";
574
+ import type * as srv from "../srv";
575
+
576
+ export class OrderService extends DbService(db.orderDb) {
577
+ @Srv() userService: srv.UserService;
578
+ @Srv() productService: srv.ProductService;
579
+ @Srv() paymentService: srv.PaymentService;
580
+ @Use() emailApi: EmailApi;
581
+
582
+ async onModuleInit() {
583
+ await this.syncPendingOrders();
584
+ this.logger.log("Order service initialized");
585
+ }
586
+
587
+ // Custom business logic
588
+ async createOrder(userId: string, items: OrderItemInput[]): Promise<Order> {
589
+ const user = await this.userService.getUser(userId);
590
+
591
+ // Calculate total and check stock
592
+ let total = 0;
593
+ const orderItems = [];
594
+
595
+ for (const item of items) {
596
+ const product = await this.productService.getProduct(item.productId);
597
+
598
+ if (product.stock < item.quantity) {
599
+ throw new Revert("order.insufficientStock", { product: product.name });
600
+ }
601
+
602
+ const itemTotal = product.price * item.quantity;
603
+ total += itemTotal;
604
+
605
+ orderItems.push({
606
+ product: product.id,
607
+ name: product.name,
608
+ quantity: item.quantity,
609
+ price: product.price,
610
+ total: itemTotal,
611
+ });
612
+
613
+ // Update product stock
614
+ await this.productService.updateProduct(product.id, {
615
+ stock: product.stock - item.quantity,
616
+ });
617
+ }
618
+
619
+ // Create order
620
+ const order = await this.createOrder({
621
+ user: user.id,
622
+ items: orderItems,
623
+ total,
624
+ status: "pending",
625
+ });
626
+
627
+ // Send confirmation email
628
+ await this.emailApi.sendOrderConfirmation(user.email, {
629
+ orderId: order.id,
630
+ items: orderItems,
631
+ total,
632
+ });
633
+
634
+ return order;
635
+ }
636
+
637
+ async cancelOrder(orderId: string) {
638
+ const order = await this.getOrder(orderId);
639
+
640
+ if (order.status !== "pending") {
641
+ throw new Revert("order.cannotCancelProcessedOrder");
642
+ }
643
+
644
+ // Return stock to inventory
645
+ for (const item of order.items) {
646
+ await this.productService.updateProduct(item.product, {
647
+ $inc: { stock: item.quantity },
648
+ });
649
+ }
650
+
651
+ return await order.set({ status: "cancelled" }).save();
652
+ }
653
+
654
+ // Lifecycle hooks
655
+ async _preUpdate(id: string, data: Partial<db.Order>) {
656
+ const order = await this.getOrder(id);
657
+
658
+ if (order.status === "completed" && data.status === "pending") {
659
+ throw new Revert("order.cannotRevertCompletedOrder");
660
+ }
661
+
662
+ return data;
663
+ }
664
+ }
665
+ ```
666
+
667
+ ## Troubleshooting
668
+
669
+ ### Database Operations Failing
670
+
671
+ 1. Check model definition and schema:
672
+
673
+ ```typescript
674
+ // Is the schema defined correctly?
675
+ console.log(db.userDb);
676
+ ```
677
+
678
+ 2. Verify input data format:
679
+
680
+ ```typescript
681
+ this.logger.debug("Creating user with data:", userData);
682
+ ```
683
+
684
+ 3. Check for middleware or hook errors:
685
+ ```typescript
686
+ async _preCreate(data) {
687
+ try {
688
+ return await validateUser(data); // This might be throwing
689
+ } catch (error) {
690
+ this.logger.error('Validation error:', error);
691
+ throw error;
692
+ }
693
+ }
694
+ ```
695
+
696
+ ## Summary
697
+
698
+ Model services in Akan.js are powerful components that encapsulate business logic and data operations. By following the patterns and best practices outlined in this guide, you can create maintainable, scalable services that effectively implement your application's domain logic while maintaining clean separation of concerns.
699
+
700
+ Key takeaways:
701
+
702
+ - Services should be stateless, with persistent state managed in the database
703
+ - Use the appropriate decorator (@Srv, @Use, etc.) for dependency injection
704
+ - Implement lifecycle hooks for proper resource management
705
+ - Use scheduled tasks for recurring operations
706
+ - Follow single responsibility principle
707
+ - Use proper error handling and logging
708
+ - Leverage the built-in database operations from DbService