akanjs 0.0.1 → 2.0.0-beta.1

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 +11399 -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 +59 -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 +1325 -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,637 @@
1
+ # Component Rule Instruction for Akan.js Framework
2
+
3
+ ## Table of Contents
4
+
5
+ 1. [Component Architecture](#component-architecture)
6
+ 2. [Component Types](#component-types)
7
+ 3. [File Naming Conventions](#file-naming-conventions)
8
+ 4. [Utility Functions](#utility-functions)
9
+ 5. [Best Practices](#best-practices)
10
+ 6. [Complete Examples](#complete-examples)
11
+
12
+ ---
13
+
14
+ ## Component Architecture
15
+
16
+ Akan.js framework uses a modular component architecture that separates UI elements by responsibility. Each feature or model in your application should follow a consistent pattern with standardized component types.
17
+
18
+ ### Core Structure
19
+
20
+ Every component in Akan.js follows this fundamental structure:
21
+
22
+ ```tsx
23
+ import { clsx } from "akanjs/client";
24
+ import { ModelType } from "@your-app/client";
25
+
26
+ interface ComponentProps {
27
+ className?: string;
28
+ // Feature-specific props
29
+ }
30
+
31
+ export const Component = ({ className, ...props }: ComponentProps) => {
32
+ return <div className={clsx("base-classes", className)}>{/* Component content */}</div>;
33
+ };
34
+ ```
35
+
36
+ ### Directory Organization
37
+
38
+ Features are organized in a consistent structure:
39
+
40
+ ```
41
+ {apps,libs}/
42
+ └── project-name/
43
+ └── lib/
44
+ └── feature-name/
45
+ ├── FeatureName.Unit.tsx
46
+ ├── FeatureName.View.tsx
47
+ ├── FeatureName.Template.tsx
48
+ ├── FeatureName.Util.tsx
49
+ ├── FeatureName.Zone.tsx
50
+ ├── featureName.constant.ts
51
+ ├── featureName.service.ts
52
+ ├── featureName.signal.ts
53
+ ├── featureName.store.ts
54
+ └── index.ts
55
+ ```
56
+
57
+ ---
58
+
59
+ ## Component Types
60
+
61
+ Akan.js components are categorized into five main types, each with a specific responsibility:
62
+
63
+ ### 1. Unit Components (\*.Unit.tsx)
64
+
65
+ - **Purpose**: Display individual items in lists or cards
66
+ - **Responsibility**: Compact display of model data
67
+ - **Props**: Model data + navigation/action props
68
+ - **Example Usage**: List items, cards, thumbnails
69
+
70
+ ```tsx
71
+ export const Card = ({ model, href }: ModelProps<"model", ModelType>) => {
72
+ return (
73
+ <Link href={href} className="rounded-lg shadow-sm hover:shadow-lg">
74
+ <div className="p-4">
75
+ <h3 className="font-medium">{model.title}</h3>
76
+ <p className="opacity-75">{model.description}</p>
77
+ </div>
78
+ </Link>
79
+ );
80
+ };
81
+ ```
82
+
83
+ ### 2. View Components (\*.View.tsx)
84
+
85
+ - **Purpose**: Display detailed model information
86
+ - **Responsibility**: Comprehensive view of a single model
87
+ - **Props**: Full model object and contextual data
88
+ - **Example Usage**: Detail pages, modals with complete model information
89
+
90
+ ```tsx
91
+ export const General = ({ model, className }: { model: ModelType; className?: string }) => {
92
+ return (
93
+ <div className={clsx("space-y-4 p-4", className)}>
94
+ <h1 className="text-2xl font-bold">{model.title}</h1>
95
+ <div className="flex gap-2 text-sm opacity-75">
96
+ <span>{model.category}</span>
97
+ <span>{new Date(model.createdAt).toLocaleDateString()}</span>
98
+ </div>
99
+ <p className="whitespace-pre-wrap">{model.content}</p>
100
+ </div>
101
+ );
102
+ };
103
+ ```
104
+
105
+ ### 3. Template Components (\*.Template.tsx)
106
+
107
+ - **Purpose**: Create/edit forms for models
108
+ - **Responsibility**: Input gathering and form state management
109
+ - **Props**: Form state handlers (typically from store)
110
+ - **Example Usage**: Create/edit forms, wizards, step-by-step flows
111
+
112
+ ```tsx
113
+ export const General = () => {
114
+ const form = st.use.modelForm();
115
+
116
+ return (
117
+ <div className="space-y-4">
118
+ <div>
119
+ <label className="text-sm opacity-75">Title</label>
120
+ <Input
121
+ value={form.title ?? ""}
122
+ onChange={st.do.setTitleOnModel}
123
+ placeholder="Enter title"
124
+ className="w-full rounded-md p-2"
125
+ />
126
+ </div>
127
+
128
+ <div>
129
+ <label className="text-sm opacity-75">Content</label>
130
+ <Input.TextArea
131
+ value={form.content ?? ""}
132
+ onChange={st.do.setContentOnModel}
133
+ placeholder="Enter content"
134
+ className="h-32 w-full rounded-md p-2"
135
+ />
136
+ </div>
137
+ </div>
138
+ );
139
+ };
140
+ ```
141
+
142
+ ### 4. Util Components (\*.Util.tsx)
143
+
144
+ - **Purpose**: Utility components specific to a feature
145
+ - **Responsibility**: Feature-specific UI helpers, buttons, toolbars
146
+ - **Props**: Action handlers, contextual data
147
+ - **Example Usage**: Toolbars, statistics, insights, action buttons
148
+
149
+ ```tsx
150
+ export const Toolbar = ({ model, className }: { model: ModelType; className?: string }) => {
151
+ return (
152
+ <div className={clsx("flex gap-2", className)}>
153
+ <Button onClick={() => st.do.duplicateModel(model.id)}>Duplicate</Button>
154
+ <Button variant="danger" onClick={() => st.do.deleteModel(model.id)}>
155
+ Delete
156
+ </Button>
157
+ </div>
158
+ );
159
+ };
160
+
161
+ export const Stats = ({ summary }: { summary: ModelSummary }) => {
162
+ return (
163
+ <div className="grid grid-cols-3 gap-4">
164
+ <div className="bg-base-100 rounded-lg p-3">
165
+ <div className="text-sm opacity-75">Total</div>
166
+ <div className="text-xl font-medium">{summary.total}</div>
167
+ </div>
168
+ <div className="bg-base-100 rounded-lg p-3">
169
+ <div className="text-sm opacity-75">Active</div>
170
+ <div className="text-xl font-medium">{summary.active}</div>
171
+ </div>
172
+ </div>
173
+ );
174
+ };
175
+ ```
176
+
177
+ ### 5. Zone Components (\*.Zone.tsx)
178
+
179
+ - **Purpose**: Container components with data loading
180
+ - **Responsibility**: Data fetching, layout, and wiring components together
181
+ - **Props**: Initialization data, query parameters
182
+ - **Example Usage**: Pages, sections, data-driven layout areas
183
+
184
+ ```tsx
185
+ export const List = ({
186
+ init,
187
+ query,
188
+ className,
189
+ }: {
190
+ init: ClientInit<"model">;
191
+ query?: QueryParams;
192
+ className?: string;
193
+ }) => {
194
+ return (
195
+ <Load.Units
196
+ init={init}
197
+ query={query}
198
+ className={className}
199
+ renderItem={(model: ModelType) => <Model.Unit.Card key={model.id} model={model} href={`/model/${model.id}`} />}
200
+ renderEmpty={() => <div>No items found</div>}
201
+ />
202
+ );
203
+ };
204
+
205
+ export const Admin = ({ init, query }: { init: ClientInit<"model">; query?: QueryParams }) => {
206
+ return (
207
+ <Data.ListContainer
208
+ init={init}
209
+ query={query}
210
+ sliceName="model"
211
+ renderItem={Model.Unit.Card}
212
+ renderTemplate={Model.Template.General}
213
+ renderView={(model: ModelType) => <Model.View.General model={model} />}
214
+ columns={["title", "status", "createdAt"]}
215
+ actions={(model) => ["edit", "delete", "view"]}
216
+ />
217
+ );
218
+ };
219
+ ```
220
+
221
+ ---
222
+
223
+ ## File Naming Conventions
224
+
225
+ Akan.js uses a strict naming convention to maintain consistency:
226
+
227
+ - **Model Components**:
228
+
229
+ - `{Model}.Unit.tsx` - Card/list item components
230
+ - `{Model}.View.tsx` - Detailed view components
231
+ - `{Model}.Template.tsx` - Form/edit components
232
+ - `{Model}.Util.tsx` - Utility components
233
+ - `{Model}.Zone.tsx` - Container components
234
+
235
+ - **Model Logic**:
236
+
237
+ - `{model}.constant.ts` - Types, GraphQL schema, enums
238
+ - `{model}.service.ts` - Business logic and database operations
239
+ - `{model}.signal.ts` - Client state management and API calls
240
+ - `{model}.store.ts` - Zustand store definitions
241
+ - `{model}.dictionary.ts` - i18n strings
242
+ - `{model}.document.ts` - Mongoose database schema
243
+
244
+ - **UI Components**:
245
+ - `ui/**/*.tsx` - Reusable UI components
246
+ - `ui/Button.tsx`, `ui/Card.tsx`, etc.
247
+
248
+ ---
249
+
250
+ ## Utility Functions
251
+
252
+ Akan.js provides several utility modules for common frontend tasks:
253
+
254
+ ### 1. Cookie Management (`akanjs/client/cookie`)
255
+
256
+ ```tsx
257
+ import { getCookie, setCookie, removeCookie } from "akanjs/client";
258
+
259
+ // Setting cookies
260
+ setCookie("session", "token123");
261
+
262
+ // Getting cookies
263
+ const session = getCookie("session");
264
+
265
+ // Authentication helpers
266
+ const user = getMe();
267
+ ```
268
+
269
+ ### 2. Storage Utilities (`akanjs/client/storage`)
270
+
271
+ Cross-platform storage that works in both web and mobile:
272
+
273
+ ```tsx
274
+ import { storage } from "akanjs/client";
275
+
276
+ // Store data
277
+ await storage.setItem("key", "value");
278
+
279
+ // Retrieve data
280
+ const value = await storage.getItem("key");
281
+
282
+ // Remove data
283
+ await storage.removeItem("key");
284
+ ```
285
+
286
+ ### 3. Device Capabilities (`akanjs/client/device`)
287
+
288
+ ```tsx
289
+ import { device } from "akanjs/client";
290
+
291
+ // Initialize device
292
+ await device.init();
293
+
294
+ // Haptic feedback
295
+ device.vibrate("medium");
296
+
297
+ // Keyboard control
298
+ device.keyboard.show();
299
+ device.keyboard.hide();
300
+ ```
301
+
302
+ ### 4. Routing (`akanjs/client/router`)
303
+
304
+ ```tsx
305
+ import { router } from "akanjs/client";
306
+
307
+ // Navigation
308
+ router.push("/dashboard");
309
+ router.replace("/login");
310
+ router.back();
311
+
312
+ // With query parameters
313
+ router.push("/search", { q: "term" });
314
+ ```
315
+
316
+ ### 5. CSS Utilities (`akanjs/client/types`)
317
+
318
+ ```tsx
319
+ import { clsx } from "akanjs/client";
320
+
321
+ // Combining class names
322
+ const className = clsx("base-class", isActive && "active-class", variant === "large" ? "text-lg" : "text-sm");
323
+ ```
324
+
325
+ ---
326
+
327
+ ## Best Practices
328
+
329
+ 1. **Separation of Concerns**
330
+
331
+ - Keep business logic in signal/store files
332
+ - Keep UI rendering in component files
333
+ - Use Zone components to wire everything together
334
+
335
+ 2. **Component Composition**
336
+
337
+ - Break complex UIs into smaller components
338
+ - Use composition over inheritance
339
+ - Always accept and forward `className` prop
340
+
341
+ 3. **Performance**
342
+
343
+ - Use `React.memo` for frequently re-rendered components
344
+ - Avoid inline function definitions in render methods
345
+ - Use useMemo/useCallback for expensive computations
346
+
347
+ 4. **Accessibility**
348
+
349
+ - Include proper ARIA attributes
350
+ - Ensure keyboard navigation works
351
+ - Maintain sufficient color contrast
352
+
353
+ 5. **Type Safety**
354
+
355
+ - Define clear interfaces for all component props
356
+ - Leverage TypeScript's discriminated unions where appropriate
357
+ - Use model types from constants files
358
+
359
+ 6. **State Management**
360
+ - Use framework-provided state utilities (signals, stores)
361
+ - Keep global state minimal and focused
362
+ - Follow the Akan.js state pattern (store + signal)
363
+
364
+ ---
365
+
366
+ ## Complete Examples
367
+
368
+ ### Full Model Module Components
369
+
370
+ Here's a complete example of components for a "Product" feature:
371
+
372
+ #### Product.Unit.tsx
373
+
374
+ ```tsx
375
+ import { clsx, ModelProps } from "akanjs/client";
376
+ import { cnst } from "@app/client";
377
+ import { Image, Link } from "akanjs/ui";
378
+
379
+ export const Card = ({ product, href }: ModelProps<"product", cnst.Product>) => {
380
+ return (
381
+ <Link href={href} className="animate-fadeIn flex rounded-lg shadow-sm duration-300 hover:shadow-lg">
382
+ <div className="p-4">
383
+ <h3 className="font-medium">{product.name}</h3>
384
+ <div className="text-primary">${product.price.toFixed(2)}</div>
385
+ {product.image && <Image src={product.image.url} className="h-32 w-full rounded object-cover" />}
386
+ <p className="text-sm opacity-75">{product.description}</p>
387
+ </div>
388
+ </Link>
389
+ );
390
+ };
391
+ ```
392
+
393
+ #### Product.View.tsx
394
+
395
+ ```tsx
396
+ import { clsx } from "akanjs/client";
397
+ import { cnst } from "@app/client";
398
+ import { Button, Image } from "akanjs/ui";
399
+
400
+ interface ProductViewProps {
401
+ className?: string;
402
+ product: cnst.Product;
403
+ }
404
+
405
+ export const General = ({ className, product }: ProductViewProps) => {
406
+ return (
407
+ <div className={clsx("animate-fadeIn space-y-6", className)}>
408
+ <div className="flex flex-col gap-6 md:flex-row">
409
+ {product.image && (
410
+ <div className="w-full md:w-1/2">
411
+ <Image src={product.image.url} className="w-full rounded-lg object-cover" />
412
+ </div>
413
+ )}
414
+
415
+ <div className="w-full space-y-4 md:w-1/2">
416
+ <h1 className="text-3xl font-bold">{product.name}</h1>
417
+ <div className="text-primary text-xl font-medium">${product.price.toFixed(2)}</div>
418
+ <p className="whitespace-pre-wrap">{product.description}</p>
419
+ <div className="flex gap-2">
420
+ <Button variant="primary">Add to Cart</Button>
421
+ <Button variant="outline">Save for Later</Button>
422
+ </div>
423
+ </div>
424
+ </div>
425
+
426
+ <div>
427
+ <h2 className="mb-2 text-xl font-medium">Specifications</h2>
428
+ <div className="grid grid-cols-2 gap-2">
429
+ {product.specifications.map((spec, idx) => (
430
+ <div key={idx} className="flex justify-between border-b p-2">
431
+ <span className="font-medium">{spec.name}</span>
432
+ <span>{spec.value}</span>
433
+ </div>
434
+ ))}
435
+ </div>
436
+ </div>
437
+ </div>
438
+ );
439
+ };
440
+ ```
441
+
442
+ #### Product.Template.tsx
443
+
444
+ ```tsx
445
+ "use client";
446
+ import { clsx } from "akanjs/client";
447
+ import { st } from "@app/client";
448
+ import { Button, Input } from "akanjs/ui";
449
+ import { Upload } from "@libs/util/ui";
450
+ import { AiOutlinePlus } from "react-icons/ai";
451
+
452
+ export const General = () => {
453
+ const productForm = st.use.productForm();
454
+
455
+ return (
456
+ <div className="space-y-6">
457
+ <div>
458
+ <label className="mb-1 block text-sm opacity-75">Product Name</label>
459
+ <Input
460
+ value={productForm.name ?? ""}
461
+ onChange={st.do.setNameOnProduct}
462
+ placeholder="Enter product name"
463
+ className="w-full rounded-md p-2"
464
+ />
465
+ </div>
466
+
467
+ <div>
468
+ <label className="mb-1 block text-sm opacity-75">Price</label>
469
+ <Input
470
+ type="number"
471
+ value={productForm.price?.toString() ?? ""}
472
+ onChange={(value) => st.do.setPriceOnProduct(Number(value))}
473
+ placeholder="0.00"
474
+ className="w-full rounded-md p-2"
475
+ />
476
+ </div>
477
+
478
+ <div>
479
+ <label className="mb-1 block text-sm opacity-75">Description</label>
480
+ <Input.TextArea
481
+ value={productForm.description ?? ""}
482
+ onChange={st.do.setDescriptionOnProduct}
483
+ placeholder="Product description"
484
+ className="h-32 w-full rounded-md p-2"
485
+ />
486
+ </div>
487
+
488
+ <div>
489
+ <label className="mb-1 block text-sm opacity-75">Product Image</label>
490
+ <Upload.Image
491
+ aspectRatio={[1, 1]}
492
+ type="crop"
493
+ styleType="square"
494
+ protoFile={productForm.image}
495
+ onRemove={() => st.do.setImageOnProduct(null)}
496
+ renderEmpty={() => (
497
+ <div className="border-base-200 bg-base-100 flex h-48 w-full items-center justify-center rounded-xl border drop-shadow-xl duration-300 hover:opacity-50">
498
+ <div>
499
+ <AiOutlinePlus className="text-primary text-6xl font-bold opacity-60" />
500
+ <p className="text-base-300 text-center text-xs">Upload Image</p>
501
+ </div>
502
+ </div>
503
+ )}
504
+ renderComplete={(file) => (
505
+ <div className="h-48 w-full rounded-md">
506
+ <Image file={file} className="size-full rounded-md object-cover" />
507
+ </div>
508
+ )}
509
+ onSave={(file) => st.do.uploadImageOnProduct([file] as unknown as FileList)}
510
+ />
511
+ </div>
512
+ </div>
513
+ );
514
+ };
515
+ ```
516
+
517
+ #### Product.Util.tsx
518
+
519
+ ```tsx
520
+ "use client";
521
+ import { ModelDashboardProps } from "akanjs/client";
522
+ import { cnst, st } from "@app/client";
523
+ import { Data } from "akanjs/ui";
524
+ import { Button } from "akanjs/ui";
525
+
526
+ export const AddToCart = ({ productId, className }: { productId: string; className?: string }) => {
527
+ return (
528
+ <Button className={clsx("bg-primary text-white", className)} onClick={() => st.do.addToCart(productId)}>
529
+ Add to Cart
530
+ </Button>
531
+ );
532
+ };
533
+
534
+ export const PriceFilter = ({
535
+ onChange,
536
+ value,
537
+ }: {
538
+ onChange: (range: [number, number]) => void;
539
+ value: [number, number];
540
+ }) => {
541
+ return (
542
+ <div className="space-y-2">
543
+ <div className="flex justify-between text-sm">
544
+ <span>Min: ${value[0]}</span>
545
+ <span>Max: ${value[1]}</span>
546
+ </div>
547
+ <div className="flex gap-4">
548
+ <input
549
+ type="range"
550
+ min="0"
551
+ max="1000"
552
+ value={value[0]}
553
+ onChange={(e) => onChange([Number(e.target.value), value[1]])}
554
+ className="range range-xs range-primary"
555
+ />
556
+ <input
557
+ type="range"
558
+ min="0"
559
+ max="1000"
560
+ value={value[1]}
561
+ onChange={(e) => onChange([value[0], Number(e.target.value)])}
562
+ className="range range-xs range-primary"
563
+ />
564
+ </div>
565
+ </div>
566
+ );
567
+ };
568
+ ```
569
+
570
+ #### Product.Zone.tsx
571
+
572
+ ```tsx
573
+ "use client";
574
+ import { ModelsProps } from "akanjs/client";
575
+ import { ClientInit, ClientView } from "akanjs/signal";
576
+ import { cnst, Product } from "@app/client";
577
+ import { Data, Load } from "akanjs/ui";
578
+
579
+ export const Admin = ({ sliceName = "product", init, query }: ModelsProps<cnst.Product>) => {
580
+ return (
581
+ <Data.ListContainer
582
+ init={init}
583
+ query={query}
584
+ sliceName={sliceName}
585
+ renderItem={Product.Unit.Card}
586
+ renderDashboard={Product.Util.Stat}
587
+ renderTemplate={Product.Template.General}
588
+ renderTitle={(product) => product.name}
589
+ renderView={(product) => <Product.View.General product={product} />}
590
+ columns={["name", "price", "status", "createdAt"]}
591
+ actions={(product) => ["edit", "remove", "view"]}
592
+ />
593
+ );
594
+ };
595
+
596
+ export const Catalog = ({
597
+ className,
598
+ init,
599
+ query,
600
+ }: {
601
+ className?: string;
602
+ init: ClientInit<"product", cnst.Product>;
603
+ query?: Record<string, any>;
604
+ }) => {
605
+ return (
606
+ <div className={className}>
607
+ <div className="flex flex-col gap-6 md:flex-row">
608
+ <div className="w-full md:w-1/4">
609
+ <Product.Util.Filters />
610
+ </div>
611
+
612
+ <div className="w-full md:w-3/4">
613
+ <Load.Units
614
+ init={init}
615
+ query={query}
616
+ renderItem={(product) => (
617
+ <Product.Unit.Card key={product.id} href={`/products/${product.id}`} product={product} />
618
+ )}
619
+ renderEmpty={() => <div className="p-8 text-center">No products found matching your criteria</div>}
620
+ renderList={(products) => (
621
+ <div className="grid grid-cols-1 gap-6 md:grid-cols-2 lg:grid-cols-3">
622
+ {products.map((product) => (
623
+ <Product.Unit.Card key={product.id} href={`/products/${product.id}`} product={product} />
624
+ ))}
625
+ </div>
626
+ )}
627
+ />
628
+ </div>
629
+ </div>
630
+ </div>
631
+ );
632
+ };
633
+
634
+ export const View = ({ view }: { view: ClientView<"product", cnst.Product> }) => {
635
+ return <Load.View view={view} renderView={(product) => <Product.View.General product={product} />} />;
636
+ };
637
+ ```