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,1110 @@
1
+ # Akan.js Framework Guide
2
+
3
+ ## Introduction to Akan.js Framework
4
+
5
+ Akan.js is a comprehensive full-stack TypeScript framework designed to streamline application development across all layers of the technology stack. It enables developers to:
6
+
7
+ - Build complete, type-safe applications with minimal code
8
+ - Deploy simultaneously to web, mobile, server, database, and infrastructure
9
+ - Maintain consistent patterns and high performance throughout the application
10
+
11
+ Akan.js reduces development complexity by providing a unified interface for all development concerns, from database schema to UI components, with built-in best practices for architecture, security, and scalability.
12
+
13
+ ---
14
+
15
+ ## Key Features and Benefits
16
+
17
+ ### Unified Development Experience
18
+
19
+ - **Integral Interface**: Single cohesive system for schema design, service logic, API endpoints, state management, and UI components
20
+ - **Reduced Boilerplate**: Write once, deploy everywhere with automated code generation
21
+ - **Full Type Safety**: End-to-end TypeScript with automatic type inference between layers
22
+ - **Automated Synchronization**: Changes to models automatically propagate across the stack
23
+
24
+ ### Built-in Capabilities
25
+
26
+ - **Type-Safe API Layer**: Automatic API generation with proper typing
27
+ - **Internationalization**: Built-in i18n system with dictionary-based translations
28
+ - **Security**: Standardized authentication, authorization, and security practices
29
+ - **File Management**: Integrated system for uploads, storage, and delivery
30
+ - **Text Search**: Optimized search capabilities out of the box
31
+ - **Documentation**: Automatic API and model documentation
32
+ - **Admin Interface**: Generated admin panels for data management
33
+
34
+ ### Platform Support
35
+
36
+ - **Web**: Next.js-based SSR and CSR support
37
+ - **Mobile**: Native iOS and Android apps via Capacitor
38
+ - **Server**: NestJS-based backend with GraphQL and REST
39
+ - **Database**: MongoDB integration with Mongoose
40
+ - **Infrastructure**: Automated deployment to Akan Cloud
41
+
42
+ ---
43
+
44
+ ## Architecture Overview
45
+
46
+ ### Modular Architecture
47
+
48
+ ```
49
+ ├── apps/ # Application code
50
+ │ ├── app1/ # Individual application
51
+ │ │ ├── akan.config.ts # Application configuration
52
+ │ │ ├── app/ # Next.js app router
53
+ │ │ ├── lib/ # Domain modules
54
+ │ │ │ ├── moduleA/ # Feature module
55
+ │ │ │ │ ├── moduleA.constant.ts # Types and schemas
56
+ │ │ │ │ ├── moduleA.service.ts # Business logic
57
+ │ │ │ │ ├── moduleA.signal.ts # API endpoints
58
+ │ │ │ │ ├── moduleA.store.ts # State management
59
+ │ │ │ │ ├── moduleA.dictionary.ts # Translations
60
+ │ │ │ │ ├── moduleA.View.tsx # Page view component
61
+ │ │ │ │ ├── moduleA.Unit.tsx # List/card item component
62
+ │ │ │ │ └── moduleA.Template.tsx # Form template component
63
+ │ │ ├── env/ # Environment configurations
64
+ │ │ ├── main.ts # Application entry point
65
+ │ │ ├── client.ts # Client-side entry point
66
+ │ │ └── server.ts # Server-side entry point
67
+ ├── libs/ # Shared libraries
68
+ │ ├── shared/ # Core shared library
69
+ │ ├── util/ # Utility library
70
+ │ └── [other libs]/ # Domain-specific libraries
71
+ └── pkgs/ # Framework packages
72
+ └── akanjs/ # Core framework components
73
+ ```
74
+
75
+ ### Data Flow
76
+
77
+ 1. **Model Definition**: `model.constant.ts` defines types, schemas, and validations
78
+ 2. **Service Layer**: `model.service.ts` implements business logic and database operations
79
+ 3. **API Layer**: `model.signal.ts` exposes endpoints and handles client-server communication
80
+ 4. **State Management**: `model.store.ts` manages client-side state with Zustand
81
+ 5. **UI Components**: `.View.tsx`, `.Unit.tsx`, `.Template.tsx` render the UI
82
+
83
+ ### Multi-Environment Support
84
+
85
+ Configure and deploy to different environments with environment-specific settings:
86
+
87
+ ```
88
+ apps/yourapp/env/
89
+ ├── env.client.debug.ts # Debug client environment
90
+ ├── env.client.develop.ts # Development client environment
91
+ ├── env.client.main.ts # Production client environment
92
+ ├── env.server.debug.ts # Debug server environment
93
+ ├── env.server.develop.ts # Development server environment
94
+ └── env.server.main.ts # Production server environment
95
+ ```
96
+
97
+ ---
98
+
99
+ ## Domain-Driven Development Pattern
100
+
101
+ Akan.js embraces domain-driven design principles, organizing code around business domains rather than technical concerns.
102
+
103
+ ### Module Pattern
104
+
105
+ Each domain feature follows a consistent module pattern:
106
+
107
+ 1. **Constants**: Define types, interfaces, and schemas
108
+ 2. **Service**: Implement business logic and database interactions
109
+ 3. **Signal**: Create API endpoints and client-server communication
110
+ 4. **Store**: Manage client-side state for the module
111
+ 5. **Dictionary**: Provide translations for the module
112
+ 6. **UI Components**: Create specialized components for the module
113
+
114
+ ### Module Composition
115
+
116
+ Modules can interact and compose:
117
+
118
+ ```typescript
119
+ // Importing from another module
120
+ import { userService } from "../user/user.service";
121
+ import { projectStore } from "../project/project.store";
122
+
123
+ // Using in your service
124
+ export const taskService = {
125
+ async assignTask(taskId: string, userId: string) {
126
+ // Validate user exists
127
+ const user = await userService.getUser(userId);
128
+ if (!user) throw new Error("User not found");
129
+
130
+ // Update task
131
+ const task = await Task.findByIdAndUpdate(taskId, {
132
+ assignedTo: userId,
133
+ });
134
+
135
+ // Update client state
136
+ projectStore.getState().refreshTasks();
137
+
138
+ return task;
139
+ },
140
+ };
141
+ ```
142
+
143
+ ---
144
+
145
+ ## Full-Stack Development Workflow
146
+
147
+ ### Create a New Model
148
+
149
+ 1. Define the model in `model.constant.ts`:
150
+
151
+ ```typescript
152
+ import { Field, Model } from "akanjs/constant";
153
+
154
+ @Model()
155
+ export class Project {
156
+ @Field()
157
+ id: string;
158
+
159
+ @Field()
160
+ title: string;
161
+
162
+ @Field()
163
+ description: string;
164
+
165
+ @Field()
166
+ status: "active" | "completed" | "archived";
167
+
168
+ @Field()
169
+ createdAt: Date;
170
+
171
+ @Field()
172
+ updatedAt: Date;
173
+ }
174
+ ```
175
+
176
+ 2. Generate service, signal, and store files:
177
+
178
+ ```bash
179
+ akan generate:module project
180
+ ```
181
+
182
+ 3. Implement business logic in `project.service.ts`:
183
+
184
+ ```typescript
185
+ import { Project } from "./project.constant";
186
+
187
+ export const projectService = {
188
+ async getProjects() {
189
+ return Project.find().sort({ updatedAt: -1 });
190
+ },
191
+
192
+ async createProject(data: Partial<Project>) {
193
+ return Project.create(data);
194
+ },
195
+ };
196
+ ```
197
+
198
+ 4. Define API endpoints in `project.signal.ts`:
199
+
200
+ ```typescript
201
+ import { Signal } from "akanjs/signal";
202
+ import { Project } from "./project.constant";
203
+ import { projectService } from "./project.service";
204
+
205
+ export class ProjectSignal {
206
+ async projectList() {
207
+ return projectService.getProjects();
208
+ }
209
+
210
+ async createProject(data: Partial<Project>) {
211
+ return projectService.createProject(data);
212
+ }
213
+ }
214
+ ```
215
+
216
+ 5. Create UI components for your model:
217
+
218
+ ```tsx
219
+ // project.View.tsx
220
+ import { usePage } from "akanjs/client";
221
+ import { projectSignal } from "./project.signal";
222
+
223
+ export const ProjectView = () => {
224
+ const { data } = projectSignal.useProjectList();
225
+ const { l } = usePage();
226
+
227
+ return (
228
+ <div>
229
+ <h1>{l("project.modelName")}</h1>
230
+ <div className="grid gap-4">
231
+ {data?.map((project) => (
232
+ <ProjectUnit key={project.id} project={project} />
233
+ ))}
234
+ </div>
235
+ </div>
236
+ );
237
+ };
238
+ ```
239
+
240
+ ---
241
+
242
+ ## Model Architecture
243
+
244
+ ### Model Constants (`model.constant.ts`)
245
+
246
+ Defines the data structure, validation rules, and relationships:
247
+
248
+ ```typescript
249
+ import { Field, Model, FilterArg, Query } from "akanjs/constant";
250
+
251
+ @Model()
252
+ export class Task {
253
+ @Field()
254
+ id: string;
255
+
256
+ @Field()
257
+ title: string;
258
+
259
+ @Field({ required: false })
260
+ description?: string;
261
+
262
+ @Field()
263
+ status: "todo" | "in-progress" | "done";
264
+
265
+ @Field()
266
+ projectId: string;
267
+
268
+ @Field({ ref: () => User })
269
+ assignedTo: string;
270
+ }
271
+
272
+ export class TaskFilter {
273
+ @FilterArg()
274
+ statuses?: string[];
275
+
276
+ @Query("byProject")
277
+ byProject(projectId: string) {
278
+ return { projectId };
279
+ }
280
+ }
281
+ ```
282
+
283
+ ### Model Service (`model.service.ts`)
284
+
285
+ Implements business logic and database operations:
286
+
287
+ ```typescript
288
+ import { Task } from "./task.constant";
289
+ import { userService } from "../user/user.service";
290
+
291
+ export const taskService = {
292
+ async getTasks(query = {}) {
293
+ return Task.find(query).sort({ updatedAt: -1 });
294
+ },
295
+
296
+ async createTask(data: Partial<Task>) {
297
+ // Business logic validation
298
+ if (data.assignedTo) {
299
+ const userExists = await userService.userExists(data.assignedTo);
300
+ if (!userExists) {
301
+ throw new Error("Assigned user not found");
302
+ }
303
+ }
304
+
305
+ return Task.create({
306
+ ...data,
307
+ status: data.status || "todo",
308
+ });
309
+ },
310
+
311
+ async updateTaskStatus(taskId: string, status: Task["status"]) {
312
+ return Task.findByIdAndUpdate(taskId, { status });
313
+ },
314
+ };
315
+ ```
316
+
317
+ ### Model Signal (`model.signal.ts`)
318
+
319
+ Exposes API endpoints for client-server communication:
320
+
321
+ ```typescript
322
+ import { Signal } from "akanjs/signal";
323
+ import { Task, TaskFilter } from "./task.constant";
324
+ import { taskService } from "./task.service";
325
+
326
+ export class TaskSignal {
327
+ async taskList(query: TaskFilter, skip = 0, limit = 20) {
328
+ return taskService.getTasks(query);
329
+ }
330
+
331
+ async task(taskId: string) {
332
+ return taskService.getTask(taskId);
333
+ }
334
+
335
+ async createTask(data: Partial<Task>) {
336
+ return taskService.createTask(data);
337
+ }
338
+
339
+ async updateTaskStatus(taskId: string, status: Task["status"]) {
340
+ return taskService.updateTaskStatus(taskId, status);
341
+ }
342
+ }
343
+ ```
344
+
345
+ ### Model Store (`model.store.ts`)
346
+
347
+ Manages client-side state:
348
+
349
+ ```typescript
350
+ import { create } from "zustand";
351
+ import { Task } from "./task.constant";
352
+ import { taskSignal } from "./task.signal";
353
+
354
+ interface TaskStore {
355
+ tasks: Task[];
356
+ loading: boolean;
357
+ error: string | null;
358
+ fetchTasks: (projectId?: string) => Promise<void>;
359
+ addTask: (task: Task) => void;
360
+ updateTask: (taskId: string, data: Partial<Task>) => void;
361
+ }
362
+
363
+ export const taskStore = create<TaskStore>((set, get) => ({
364
+ tasks: [],
365
+ loading: false,
366
+ error: null,
367
+
368
+ fetchTasks: async (projectId) => {
369
+ set({ loading: true, error: null });
370
+ try {
371
+ const query = projectId ? { byProject: projectId } : {};
372
+ const tasks = await taskSignal.taskList(query);
373
+ set({ tasks, loading: false });
374
+ } catch (err) {
375
+ set({ error: err.message, loading: false });
376
+ }
377
+ },
378
+
379
+ addTask: (task) => {
380
+ set({ tasks: [...get().tasks, task] });
381
+ },
382
+
383
+ updateTask: (taskId, data) => {
384
+ set({
385
+ tasks: get().tasks.map((task) => (task.id === taskId ? { ...task, ...data } : task)),
386
+ });
387
+ },
388
+ }));
389
+ ```
390
+
391
+ ---
392
+
393
+ ## Component Architecture
394
+
395
+ Akan.js uses a specialized component pattern to ensure consistency and separation of concerns.
396
+
397
+ ### View Components (`model.View.tsx`)
398
+
399
+ Page-level components that display a full page or section:
400
+
401
+ ```tsx
402
+ import { usePage } from "akanjs/client";
403
+ import { taskStore } from "./task.store";
404
+ import { TaskUnit } from "./task.Unit";
405
+ import { TaskTemplate } from "./task.Template";
406
+
407
+ export const TaskView = () => {
408
+ const { l } = usePage();
409
+ const { tasks, loading, fetchTasks } = taskStore();
410
+
411
+ useEffect(() => {
412
+ fetchTasks();
413
+ }, [fetchTasks]);
414
+
415
+ return (
416
+ <div className="p-4">
417
+ <h1 className="mb-4 text-2xl font-bold">{l("task.modelName")}</h1>
418
+
419
+ <TaskTemplate className="mb-6" />
420
+
421
+ {loading ? (
422
+ <div>Loading tasks...</div>
423
+ ) : (
424
+ <div className="grid gap-4">
425
+ {tasks.map((task) => (
426
+ <TaskUnit key={task.id} task={task} />
427
+ ))}
428
+ </div>
429
+ )}
430
+ </div>
431
+ );
432
+ };
433
+ ```
434
+
435
+ ### Unit Components (`model.Unit.tsx`)
436
+
437
+ Card or list item components that display a single instance of a model:
438
+
439
+ ```tsx
440
+ import { usePage } from "akanjs/client";
441
+ import { Task } from "./task.constant";
442
+ import { taskSignal } from "./task.signal";
443
+
444
+ interface TaskUnitProps {
445
+ task: Task;
446
+ onStatusChange?: () => void;
447
+ }
448
+
449
+ export const TaskUnit = ({ task, onStatusChange }: TaskUnitProps) => {
450
+ const { l } = usePage();
451
+ const { mutate: updateStatus } = taskSignal.useUpdateTaskStatus();
452
+
453
+ const handleStatusChange = (status: Task["status"]) => {
454
+ updateStatus(task.id, status).then(() => {
455
+ onStatusChange?.();
456
+ });
457
+ };
458
+
459
+ return (
460
+ <div className="rounded border p-4">
461
+ <h3 className="font-bold">{task.title}</h3>
462
+ <p className="text-gray-700">{task.description}</p>
463
+ <div className="mt-2 flex justify-between">
464
+ <span className={`badge ${task.status}`}>{l(`enum-status-${task.status}`)}</span>
465
+ <select value={task.status} onChange={(e) => handleStatusChange(e.target.value as Task["status"])}>
466
+ <option value="todo">{l("enum-status-todo")}</option>
467
+ <option value="in-progress">{l("enum-status-in-progress")}</option>
468
+ <option value="done">{l("enum-status-done")}</option>
469
+ </select>
470
+ </div>
471
+ </div>
472
+ );
473
+ };
474
+ ```
475
+
476
+ ### Template Components (`model.Template.tsx`)
477
+
478
+ Form components for creating or editing a model:
479
+
480
+ ```tsx
481
+ import { useState } from "react";
482
+ import { usePage } from "akanjs/client";
483
+ import { Task } from "./task.constant";
484
+ import { taskSignal } from "./task.signal";
485
+ import { taskStore } from "./task.store";
486
+
487
+ interface TaskTemplateProps {
488
+ initialData?: Partial<Task>;
489
+ className?: string;
490
+ }
491
+
492
+ export const TaskTemplate = ({ initialData = {}, className }: TaskTemplateProps) => {
493
+ const { l } = usePage();
494
+ const { mutate: createTask, isLoading } = taskSignal.useCreateTask();
495
+ const addTask = taskStore((state) => state.addTask);
496
+
497
+ const [formData, setFormData] = useState({
498
+ title: initialData.title || "",
499
+ description: initialData.description || "",
500
+ status: initialData.status || "todo",
501
+ });
502
+
503
+ const handleSubmit = (e: React.FormEvent) => {
504
+ e.preventDefault();
505
+ createTask(formData).then((newTask) => {
506
+ addTask(newTask);
507
+ setFormData({ title: "", description: "", status: "todo" });
508
+ });
509
+ };
510
+
511
+ return (
512
+ <form className={`rounded border p-4 ${className}`} onSubmit={handleSubmit}>
513
+ <h2 className="mb-4 text-xl font-bold">{l("task.createTask")}</h2>
514
+
515
+ <div className="mb-4">
516
+ <label className="mb-1 block">{l("task.title")}</label>
517
+ <input
518
+ type="text"
519
+ className="w-full rounded border px-2 py-1"
520
+ value={formData.title}
521
+ onChange={(e) => setFormData({ ...formData, title: e.target.value })}
522
+ required
523
+ />
524
+ </div>
525
+
526
+ <div className="mb-4">
527
+ <label className="mb-1 block">{l("task.description")}</label>
528
+ <textarea
529
+ className="w-full rounded border px-2 py-1"
530
+ value={formData.description}
531
+ onChange={(e) => setFormData({ ...formData, description: e.target.value })}
532
+ />
533
+ </div>
534
+
535
+ <button type="submit" className="rounded bg-blue-500 px-4 py-2 text-white" disabled={isLoading}>
536
+ {isLoading ? l("loading") : l("submit")}
537
+ </button>
538
+ </form>
539
+ );
540
+ };
541
+ ```
542
+
543
+ ### Zone Components (`model.Zone.tsx`)
544
+
545
+ Layout containers that organize multiple components:
546
+
547
+ ```tsx
548
+ import { ReactNode } from "react";
549
+ import { usePage } from "akanjs/client";
550
+
551
+ interface TaskZoneProps {
552
+ title?: string;
553
+ children: ReactNode;
554
+ }
555
+
556
+ export const TaskZone = ({ title, children }: TaskZoneProps) => {
557
+ const { l } = usePage();
558
+
559
+ return (
560
+ <div className="rounded-lg border bg-gray-50 p-6">
561
+ {title && <h2 className="mb-4 text-xl font-bold">{title || l("task.tasks")}</h2>}
562
+ <div className="space-y-4">{children}</div>
563
+ </div>
564
+ );
565
+ };
566
+ ```
567
+
568
+ ---
569
+
570
+ ## API Integration Pattern
571
+
572
+ ### Defining API Endpoints
573
+
574
+ In your signal file:
575
+
576
+ ```typescript
577
+ import { Signal } from "akanjs/signal";
578
+ import { Product, ProductFilter } from "./product.constant";
579
+ import { productService } from "./product.service";
580
+
581
+ export class ProductSignal {
582
+ async productList(query: ProductFilter, skip = 0, limit = 20) {
583
+ return productService.getProducts(query, skip, limit);
584
+ }
585
+
586
+ async product(productId: string) {
587
+ return productService.getProduct(productId);
588
+ }
589
+
590
+ async createProduct(data: Partial<Product>) {
591
+ return productService.createProduct(data);
592
+ }
593
+
594
+ async updateProduct(productId: string, data: Partial<Product>) {
595
+ return productService.updateProduct(productId, data);
596
+ }
597
+ }
598
+ ```
599
+
600
+ ### Using API Endpoints in Components
601
+
602
+ With auto-generated React hooks:
603
+
604
+ ```tsx
605
+ import { productSignal } from "./product.signal";
606
+
607
+ export const ProductList = () => {
608
+ // Query hook with automatic caching and refetching
609
+ const { data: products, isLoading, error } = productSignal.useProductList();
610
+
611
+ // Mutation hook with automatic cache updating
612
+ const { mutate: createProduct, isLoading: isCreating } = productSignal.useCreateProduct();
613
+
614
+ // Access both data and mutation functions
615
+ return (
616
+ <div>
617
+ {isLoading ? (
618
+ <div>Loading...</div>
619
+ ) : error ? (
620
+ <div>Error: {error.message}</div>
621
+ ) : (
622
+ <ul>
623
+ {products?.map((product) => (
624
+ <li key={product.id}>{product.name}</li>
625
+ ))}
626
+ </ul>
627
+ )}
628
+
629
+ <button onClick={() => createProduct({ name: "New Product" })} disabled={isCreating}>
630
+ Add Product
631
+ </button>
632
+ </div>
633
+ );
634
+ };
635
+ ```
636
+
637
+ ---
638
+
639
+ ## State Management Pattern
640
+
641
+ Akan.js uses Zustand for state management, providing a simple but powerful store pattern:
642
+
643
+ ### Creating a Store
644
+
645
+ ```typescript
646
+ import { create } from "zustand";
647
+ import { Order } from "./order.constant";
648
+ import { orderSignal } from "./order.signal";
649
+
650
+ interface OrderStore {
651
+ // State
652
+ orders: Order[];
653
+ selectedOrderId: string | null;
654
+ loading: boolean;
655
+ error: string | null;
656
+
657
+ // Actions
658
+ fetchOrders: () => Promise<void>;
659
+ selectOrder: (orderId: string) => void;
660
+ addOrder: (order: Order) => void;
661
+ updateOrder: (orderId: string, data: Partial<Order>) => void;
662
+ deleteOrder: (orderId: string) => Promise<void>;
663
+ }
664
+
665
+ export const orderStore = create<OrderStore>((set, get) => ({
666
+ // Initial state
667
+ orders: [],
668
+ selectedOrderId: null,
669
+ loading: false,
670
+ error: null,
671
+
672
+ // Actions
673
+ fetchOrders: async () => {
674
+ set({ loading: true, error: null });
675
+ try {
676
+ const orders = await orderSignal.orderList();
677
+ set({ orders, loading: false });
678
+ } catch (err) {
679
+ set({ error: err.message, loading: false });
680
+ }
681
+ },
682
+
683
+ selectOrder: (orderId) => {
684
+ set({ selectedOrderId: orderId });
685
+ },
686
+
687
+ addOrder: (order) => {
688
+ set({ orders: [...get().orders, order] });
689
+ },
690
+
691
+ updateOrder: (orderId, data) => {
692
+ set({
693
+ orders: get().orders.map((order) => (order.id === orderId ? { ...order, ...data } : order)),
694
+ });
695
+ },
696
+
697
+ deleteOrder: async (orderId) => {
698
+ set({ loading: true, error: null });
699
+ try {
700
+ await orderSignal.removeOrder(orderId);
701
+ set({
702
+ orders: get().orders.filter((order) => order.id !== orderId),
703
+ loading: false,
704
+ });
705
+ } catch (err) {
706
+ set({ error: err.message, loading: false });
707
+ }
708
+ },
709
+ }));
710
+ ```
711
+
712
+ ### Using the Store in Components
713
+
714
+ ```tsx
715
+ import { orderStore } from "./order.store";
716
+ import { orderSignal } from "./order.signal";
717
+
718
+ export const OrderManager = () => {
719
+ // Access store state and actions
720
+ const { orders, selectedOrderId, loading, fetchOrders, selectOrder } = orderStore();
721
+
722
+ // Lifecycle hooks
723
+ useEffect(() => {
724
+ fetchOrders();
725
+ }, [fetchOrders]);
726
+
727
+ // Render UI based on state
728
+ return (
729
+ <div className="grid grid-cols-2 gap-4">
730
+ <div>
731
+ <h2>Orders</h2>
732
+ {loading ? (
733
+ <div>Loading...</div>
734
+ ) : (
735
+ <ul>
736
+ {orders.map((order) => (
737
+ <li
738
+ key={order.id}
739
+ className={order.id === selectedOrderId ? "selected" : ""}
740
+ onClick={() => selectOrder(order.id)}
741
+ >
742
+ {order.number} - {order.customerName}
743
+ </li>
744
+ ))}
745
+ </ul>
746
+ )}
747
+ </div>
748
+
749
+ <div>
750
+ <h2>Details</h2>
751
+ {selectedOrderId && <OrderDetails orderId={selectedOrderId} />}
752
+ </div>
753
+ </div>
754
+ );
755
+ };
756
+
757
+ // Another component using the same store
758
+ const OrderDetails = ({ orderId }) => {
759
+ // Selective state access
760
+ const order = orderStore((state) => state.orders.find((o) => o.id === orderId));
761
+
762
+ // API integration
763
+ const { mutate: updateOrder } = orderSignal.useUpdateOrder();
764
+
765
+ // UI based on store state
766
+ return order ? (
767
+ <div>
768
+ <h3>{order.number}</h3>
769
+ <p>Customer: {order.customerName}</p>
770
+ <p>Status: {order.status}</p>
771
+
772
+ <select value={order.status} onChange={(e) => updateOrder(order.id, { status: e.target.value })}>
773
+ <option value="pending">Pending</option>
774
+ <option value="processing">Processing</option>
775
+ <option value="shipped">Shipped</option>
776
+ <option value="delivered">Delivered</option>
777
+ </select>
778
+ </div>
779
+ ) : null;
780
+ };
781
+ ```
782
+
783
+ ---
784
+
785
+ ## Multi-Platform Support
786
+
787
+ Akan.js provides seamless support for various platforms:
788
+
789
+ ### Web Applications
790
+
791
+ SSR with Next.js:
792
+
793
+ ```tsx
794
+ // page/projects/_index.tsx
795
+ import { ProjectView } from "../../../lib/project/project.View";
796
+
797
+ export default function ProjectsPage() {
798
+ return <ProjectView />;
799
+ }
800
+ ```
801
+
802
+ ### Mobile Applications
803
+
804
+ Using Capacitor for iOS and Android:
805
+
806
+ ```typescript
807
+ // capacitor.config.ts
808
+ import { CapacitorConfig } from "@capacitor/cli";
809
+
810
+ const config: CapacitorConfig = {
811
+ appId: "com.example.myapp",
812
+ appName: "My App",
813
+ webDir: "dist",
814
+ bundledWebRuntime: false,
815
+ plugins: {
816
+ SplashScreen: {
817
+ launchShowDuration: 2000,
818
+ },
819
+ },
820
+ };
821
+
822
+ export default config;
823
+ ```
824
+
825
+ Then build and run:
826
+
827
+ ```bash
828
+ akan build
829
+ npx cap add ios
830
+ npx cap add android
831
+ npx cap copy
832
+ npx cap open ios # Open in Xcode
833
+ npx cap open android # Open in Android Studio
834
+ ```
835
+
836
+ ---
837
+
838
+ ## Type Safety and Code Generation
839
+
840
+ Akan.js provides end-to-end type safety:
841
+
842
+ ### Type-Safe Database Schema
843
+
844
+ ```typescript
845
+ import { Field, Model } from "akanjs/constant";
846
+
847
+ @Model()
848
+ export class Customer {
849
+ @Field()
850
+ id: string;
851
+
852
+ @Field({ required: true, maxLength: 100 })
853
+ name: string;
854
+
855
+ @Field({ required: true, isEmail: true })
856
+ email: string;
857
+
858
+ @Field({ required: false, minLength: 6 })
859
+ phone?: string;
860
+
861
+ @Field()
862
+ createdAt: Date;
863
+ }
864
+ ```
865
+
866
+ ### Type-Safe API Calls
867
+
868
+ ```typescript
869
+ // Generated types for API responses
870
+ const { data, isLoading, error } = customerSignal.useCustomerList();
871
+ if (data) {
872
+ // data is typed as Customer[]
873
+ data.forEach((customer) => {
874
+ // Type-safe access to customer properties
875
+ console.log(customer.name, customer.email);
876
+ });
877
+ }
878
+ ```
879
+
880
+ ### Type-Safe Form Handling
881
+
882
+ ```tsx
883
+ // Form with type checking
884
+ const { mutate: updateCustomer } = customerSignal.useUpdateCustomer();
885
+
886
+ // This will give a type error if fields don't match Customer model
887
+ updateCustomer(customerId, {
888
+ name: "John Doe",
889
+ email: "john@example.com",
890
+ invalidField: "value", // TypeScript error: Property 'invalidField' does not exist on type 'Customer'
891
+ });
892
+ ```
893
+
894
+ ---
895
+
896
+ ## Internationalization (i18n) System
897
+
898
+ Akan.js provides a robust i18n system:
899
+
900
+ ### Translation Dictionaries
901
+
902
+ ```typescript
903
+ // customer.dictionary.ts
904
+ import { ModelDictionary, baseTrans } from "akanjs/dictionary";
905
+ import { Customer, CustomerFilter } from "./customer.constant";
906
+
907
+ const modelDictionary = {
908
+ ...baseTrans,
909
+ modelName: ["Customer", "고객"],
910
+ modelDesc: ["Customer account information", "고객 계정 정보"],
911
+
912
+ // * ==================== Model ==================== * //
913
+ name: ["Name", "이름"],
914
+ "desc-name": ["Customer's full name", "고객의 전체 이름"],
915
+
916
+ email: ["Email", "이메일"],
917
+ "desc-email": ["Primary contact email", "주요 연락 이메일"],
918
+
919
+ phone: ["Phone", "전화번호"],
920
+ "desc-phone": ["Contact phone number", "연락처 전화번호"],
921
+ // * ==================== Model ==================== * //
922
+
923
+ // * ==================== Filter ==================== * //
924
+ "qry-byEmail": ["By Email", "이메일로 검색"],
925
+ "qrydesc-byEmail": ["Search customers by email", "이메일로 고객 검색"],
926
+ "qarg-byEmail-email": ["Email", "이메일"],
927
+ "qargdesc-byEmail-email": ["Email address to search", "검색할 이메일 주소"],
928
+ // * ==================== Filter ==================== * //
929
+
930
+ // * ==================== Etc ==================== * //
931
+ "enum-status-active": ["Active", "활성"],
932
+ "enumdesc-status-active": ["Active customer", "활성 고객"],
933
+
934
+ "enum-status-inactive": ["Inactive", "비활성"],
935
+ "enumdesc-status-inactive": ["Inactive customer", "비활성 고객"],
936
+ // * ==================== Etc ==================== * //
937
+ } satisfies ModelDictionary<Customer, any, CustomerFilter>;
938
+
939
+ export const customerDictionary = modelDictionary;
940
+ ```
941
+
942
+ ### Using Translations
943
+
944
+ ```tsx
945
+ import { usePage } from "akanjs/client";
946
+
947
+ export const CustomerForm = () => {
948
+ const { l, locale } = usePage();
949
+
950
+ return (
951
+ <form>
952
+ <h2>{l("customer.modelName")}</h2>
953
+
954
+ <div>
955
+ <label>{l("customer.name")}</label>
956
+ <input type="text" placeholder={l("customer.desc-name")} />
957
+ </div>
958
+
959
+ <div>
960
+ <label>{l("customer.email")}</label>
961
+ <input type="email" placeholder={l("customer.desc-email")} />
962
+ </div>
963
+
964
+ <div>
965
+ <label>{l("customer.phone")}</label>
966
+ <input type="tel" placeholder={l("customer.desc-phone")} />
967
+ </div>
968
+
969
+ <button type="submit">{l("submit")}</button>
970
+ </form>
971
+ );
972
+ };
973
+ ```
974
+
975
+ ---
976
+
977
+ ## Development Tools and Commands
978
+
979
+ Akan.js provides powerful CLI tools for development:
980
+
981
+ ### Starting Applications
982
+
983
+ ```bash
984
+ # Start frontend and backend
985
+ akan start my-app
986
+
987
+ # Start only the frontend
988
+ akan start-frontend my-app
989
+
990
+ # Start only the backend
991
+ akan start-backend my-app
992
+ ```
993
+
994
+ ### Code Generation
995
+
996
+ ```bash
997
+ # Generate a new module
998
+ akan generate:module customer
999
+
1000
+ # Generate a new component
1001
+ akan generate:component customer CustomerDetails
1002
+
1003
+ # Generate service from a model
1004
+ akan generate:service customer
1005
+ ```
1006
+
1007
+ ### Building and Deployment
1008
+
1009
+ ```bash
1010
+ # Build for production
1011
+ akan build my-app
1012
+
1013
+ # Deploy to Akan Cloud
1014
+ akan deploy my-app
1015
+ ```
1016
+
1017
+ ### Testing
1018
+
1019
+ ```bash
1020
+ # Run unit tests
1021
+ akan test my-app
1022
+
1023
+ # Run end-to-end tests
1024
+ akan test:e2e my-app
1025
+ ```
1026
+
1027
+ ---
1028
+
1029
+ ## Best Practices and Common Patterns
1030
+
1031
+ ### File Naming Conventions
1032
+
1033
+ - **Model Files**: `moduleName.constant.ts`, `moduleName.service.ts`, etc.
1034
+ - **Component Files**: `ModuleName.View.tsx`, `ModuleName.Unit.tsx`, etc.
1035
+ - **Utility Files**: `moduleName.util.ts`
1036
+
1037
+ ### Code Organization
1038
+
1039
+ - Group files by domain/module, not by technical function
1040
+ - Keep related code together in the same directory
1041
+ - Use absolute imports for cross-module dependencies
1042
+
1043
+ ### State Management
1044
+
1045
+ - Use stores for global state that needs to be shared between components
1046
+ - Use React's local state for component-specific state
1047
+ - Keep API data fetching in signal hooks
1048
+
1049
+ ### Error Handling
1050
+
1051
+ - Use the `Revert` class for business logic errors
1052
+ - Include proper error messages in dictionaries
1053
+ - Handle errors at the UI level for better user experience
1054
+
1055
+ ### Performance Optimization
1056
+
1057
+ - Use SSR for initial page loads
1058
+ - Implement code splitting for large applications
1059
+ - Optimize images and assets for faster loading
1060
+ - Use memoization for expensive calculations
1061
+
1062
+ ---
1063
+
1064
+ ## Troubleshooting and Common Issues
1065
+
1066
+ ### API Connection Issues
1067
+
1068
+ If you encounter API connection problems:
1069
+
1070
+ 1. Check that your backend is running (`akan start-backend`)
1071
+ 2. Verify environment variables in env files
1072
+ 3. Check network request in browser developer tools
1073
+ 4. Ensure signal files are properly imported
1074
+
1075
+ ### Type Errors
1076
+
1077
+ For TypeScript errors:
1078
+
1079
+ 1. Run `akan typecheck` to identify issues
1080
+ 2. Ensure models are properly defined in constant files
1081
+ 3. Check import paths for correctness
1082
+ 4. Update generated types if necessary: `akan generate:types`
1083
+
1084
+ ### Build Failures
1085
+
1086
+ If builds are failing:
1087
+
1088
+ 1. Check console errors for specific issues
1089
+ 2. Verify dependencies in package.json
1090
+ 3. Run `akan lint` to identify code issues
1091
+ 4. Clear cache with `akan clear-cache`
1092
+
1093
+ ### Component Rendering Issues
1094
+
1095
+ For UI rendering problems:
1096
+
1097
+ 1. Check component props and types
1098
+ 2. Verify data is being loaded correctly
1099
+ 3. Inspect component hierarchy with React DevTools
1100
+ 4. Check for conditional rendering issues
1101
+
1102
+ ---
1103
+
1104
+ ## Further Resources
1105
+
1106
+ - [Official Documentation](https://docs.akanjs.com)
1107
+ - [API Reference](https://docs.akanjs.com/api)
1108
+ - [Example Projects](https://github.com/akanjs/examples)
1109
+ - [Community Forum](https://community.akanjs.com)
1110
+ - [Video Tutorials](https://youtube.com/akanjs)