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,552 @@
1
+ # Model Signal Implementation Guide for Akan.js
2
+
3
+ ## Purpose and Role of Model Signal Files
4
+
5
+ `model.signal.ts` files serve as the communication bridge between client and server in Akan.js applications. They implement a declarative pattern that simplifies and standardizes data flow throughout your application, while providing strong typing and automatic code generation.
6
+
7
+ Signals provide five key functionalities:
8
+
9
+ 1. **Data Queries** (`@Query`) - Fetch data with typed parameters and responses
10
+ 2. **Data Mutations** (`@Mutation`) - Modify data with transactional safety
11
+ 3. **Real-time Messaging** (`@Message`) - Handle WebSocket communication
12
+ 4. **Background Processing** (`@Process`) - Execute long-running jobs
13
+ 5. **Publish/Subscribe** (`@Pubsub`) - Manage real-time data subscriptions
14
+
15
+ The Signal system abstracts away the underlying transport mechanisms (GraphQL, REST, WebSockets) while maintaining type safety across client and server.
16
+
17
+ ## Signal Class Structure
18
+
19
+ A typical model.signal.ts file follows this structure:
20
+
21
+ ```typescript
22
+ import { ID, Int } from "akanjs/base";
23
+ import { SortOf } from "akanjs/constant";
24
+ import { Arg, DbSignal, Mutation, Query, resolve, Self, Signal } from "akanjs/signal";
25
+
26
+ import * as cnst from "../cnst";
27
+ import type * as db from "../db";
28
+
29
+ export class ModelNameSignal extends DbSignal(cnst.modelNameCnst, cnst.Srvs, {
30
+ guards: { root: Admin, get: Query.Public, cru: Mutation.User },
31
+ }) {
32
+ // Signal methods here...
33
+ }
34
+ ```
35
+
36
+ Key components:
37
+
38
+ - `
39
+
40
+ ### 2. @Mutation Decorator
41
+
42
+ Used for operations that modify data, with similar access control:
43
+
44
+ ```typescript
45
+ @Mutation.User(() => cnst.ChatRoom) // User-level access, returns ChatRoom
46
+ async openChatRoom(
47
+ @Arg.Param("root", () => ID) root: string,
48
+ @Arg.Param("targetId", () => ID) targetId: string,
49
+ @Self() self: Self // Gets current user automatically
50
+ ) {
51
+ const chatRoom = await this.chatRoomService.open({
52
+ targetId,
53
+ userId: self.id,
54
+ root,
55
+ });
56
+ return resolve<cnst.ChatRoom>(chatRoom);
57
+ }
58
+ ```
59
+
60
+ ### 3. @Message Decorator
61
+
62
+ Handles real-time socket messages for instant communication:
63
+
64
+ ```typescript
65
+ @Message.User(() => Boolean) // User-level access, returns Boolean
66
+ async readChat(
67
+ @Arg.Msg("root", () => ID) root: string,
68
+ @Arg.Msg("userId", () => ID) userId: string
69
+ ) {
70
+ const chat = await this.chatRoomService.readChat(root, userId);
71
+ return resolve<boolean>(!!chat);
72
+ }
73
+ ```
74
+
75
+ ### 4. @Process Decorator
76
+
77
+ For background processing on the server:
78
+
79
+ ```typescript
80
+ @Process.Federation(() => Boolean) // Federation scope, returns Boolean
81
+ async archiveDbBackup(
82
+ @Arg.Msg("dbBackupId", () => String) dbBackupId: string
83
+ ) {
84
+ await this.dbBackupService.archiveDbBackup(dbBackupId);
85
+ return done(true); // Use done() for process completion
86
+ }
87
+ ```
88
+
89
+ Process scopes:
90
+
91
+ - `Process.Federation` - Run on federation servers
92
+ - `Process.Batch` - Run on batch processing servers
93
+ - `Process.All` - Run on all server types
94
+
95
+ ### 5. @Pubsub Decorator
96
+
97
+ Manages real-time subscriptions:
98
+
99
+ ```typescript
100
+ @Pubsub.Public(() => cnst.Chat) // Public subscription, emits Chat objects
101
+ chatAdded(
102
+ @Arg.Room("root", () => ID) root: string, // Room parameter for subscription
103
+ @Ws() ws: Ws // WebSocket context
104
+ ) {
105
+ return subscribe<cnst.Chat>(); // Subscribe to this type
106
+ }
107
+ ```
108
+
109
+ ## Parameter Decorators
110
+
111
+ Signals use parameter decorators to define how data is passed:
112
+
113
+ 1. **HTTP/GraphQL Parameters**
114
+
115
+ - `@Arg.Query()` - URL query parameters
116
+ - `@Arg.Param()` - URL path parameters
117
+ - `@Arg.Body()` - Request body data
118
+ - `@Arg.Upload()` - File uploads
119
+
120
+ 2. **WebSocket Parameters**
121
+
122
+ - `@Arg.Msg()` - Message data
123
+ - `@Arg.Room()` - Room for subscription
124
+
125
+ 3. **Context Parameters**
126
+ - `@Self()` - Current authenticated user
127
+ - `@Account()` - User account information
128
+ - `@UserIp()` - Client IP address
129
+ - `@Ws()` - WebSocket context
130
+
131
+ ## Slice Pattern for Data Access
132
+
133
+ The slice pattern standardizes data access with consistent naming and pagination:
134
+
135
+ ```typescript
136
+ // * /////////////////////////////////////
137
+ // * Self Slice
138
+ @Query.User(() => [cnst.ChatRoom])
139
+ async chatRoomListInSelf( // listIn<SliceName> pattern
140
+ @Arg.Query("skip", () => Int, { nullable: true }) skip: number | null,
141
+ @Arg.Query("limit", () => Int, { nullable: true }) limit: number | null,
142
+ @Arg.Query("sort", () => String, { nullable: true }) sort: SortOf<db.ChatRoomFilter> | null,
143
+ @Self() self: Self
144
+ ) {
145
+ const chatRooms = await this.chatRoomService.listInUser(self.id, { skip, limit, sort });
146
+ return resolve<cnst.ChatRoom[]>(chatRooms);
147
+ }
148
+
149
+ @Query.User(() => cnst.ChatRoomInsight)
150
+ async chatRoomInsightInSelf( // insightIn<SliceName> pattern
151
+ @Self() self: Self
152
+ ) {
153
+ const chatRoomInsight = await this.chatRoomService.insightInUser(self.id);
154
+ return resolve<cnst.ChatRoomInsight>(chatRoomInsight);
155
+ }
156
+ // * Self Slice
157
+ // * /////////////////////////////////////
158
+ ```
159
+
160
+ Common slices:
161
+
162
+ - `Self` - Data related to the current user
163
+ - `Public` - Publicly accessible data
164
+ - `Featured` - Highlighted items
165
+ - `Root/Parent` - Items within a parent container
166
+ - Custom domain slices (e.g., `DevApp`, `Init`)
167
+
168
+ ## Client-Side Signal Usage
169
+
170
+ ### 1. Direct API Calls
171
+
172
+ ```typescript
173
+ import { productGet, productListInFeatured } from "./product.signal";
174
+
175
+ // Fetch a single product
176
+ const product = await productGet("product-123");
177
+
178
+ // Fetch a list with parameters
179
+ const featuredProducts = await productListInFeatured(0, 10, "price-asc");
180
+ ```
181
+
182
+ ### 2. Store Integration
183
+
184
+ ```typescript
185
+ // product.store.ts
186
+ import { create } from "zustand";
187
+ import { productListInFeatured, productInsightInFeatured } from "./product.signal";
188
+
189
+ export const useProductStore = create<ProductStore>((set) => ({
190
+ featured: [],
191
+ insight: undefined,
192
+
193
+ loadFeatured: async (page = 1, limit = 10) => {
194
+ const [products, insight] = await Promise.all([
195
+ productListInFeatured((page - 1) * limit, limit, "popular"),
196
+ productInsightInFeatured(),
197
+ ]);
198
+
199
+ set({ featured: products, insight });
200
+ },
201
+ }));
202
+ ```
203
+
204
+ ### 3. React Component Integration
205
+
206
+ ```tsx
207
+ import { useEffect } from "react";
208
+ import { useProductStore } from "./product.store";
209
+
210
+ function FeaturedProducts() {
211
+ const { featured, insight, loadFeatured } = useProductStore();
212
+
213
+ useEffect(() => {
214
+ loadFeatured();
215
+ }, []);
216
+
217
+ return (
218
+ <div>
219
+ <h3>Featured Products ({insight?.count})</h3>
220
+ {featured.map((product) => (
221
+ <ProductCard key={product.id} product={product} />
222
+ ))}
223
+ </div>
224
+ );
225
+ }
226
+ ```
227
+
228
+ ### 4. Real-Time Subscriptions
229
+
230
+ ```tsx
231
+ import { useEffect } from "react";
232
+ import { subscribeChatAdded } from "./chatRoom.signal";
233
+ import { useChatStore } from "./chat.store";
234
+
235
+ function ChatRoom({ roomId }) {
236
+ const { addChat } = useChatStore();
237
+
238
+ useEffect(() => {
239
+ // Subscribe to real-time updates
240
+ const unsubscribe = subscribeChatAdded(roomId, (chat) => {
241
+ addChat(chat);
242
+ });
243
+
244
+ return () => {
245
+ // Cleanup subscription
246
+ unsubscribe();
247
+ };
248
+ }, [roomId]);
249
+
250
+ // Component JSX...
251
+ }
252
+ ```
253
+
254
+ ## Advanced Patterns
255
+
256
+ ### 1. DbSignal for Standard CRUD
257
+
258
+ DbSignal creates standard operations that you don't need to implement:
259
+
260
+ ```typescript
261
+ export class BoardSignal extends DbSignal(cnst.boardCnst, cnst.Srvs, {
262
+ guards: { root: Admin, get: Query.Public, cru: Mutation.Admin },
263
+ }) {
264
+ // Custom methods beyond CRUD go here
265
+ }
266
+ ```
267
+
268
+ This automatically provides:
269
+
270
+ - `getBoard(id)` - Get by ID
271
+ - `lightBoard(id)` - Get lightweight version
272
+ - `boardList(filter, options)` - List with pagination
273
+ - `boardInsight(filter)` - Get counts/statistics
274
+ - `boardExists(filter)` - Check existence
275
+ - `createBoard(data)` - Create new record
276
+ - `updateBoard(id, data)` - Update existing record
277
+ - `removeBoard(id)` - Soft-delete record
278
+
279
+ ### 2. Combined Queries
280
+
281
+ ```typescript
282
+ @Query.Public(() => cnst.DashboardData)
283
+ async getDashboard(@Self() self: Self) {
284
+ // Parallel data fetching
285
+ const [stats, notifications, activities] = await Promise.all([
286
+ this.statsService.getUserStats(self.id),
287
+ this.notificationService.getRecent(self.id, { limit: 5 }),
288
+ this.activityService.getRecent(self.id, { limit: 10 })
289
+ ]);
290
+
291
+ // Return combined result
292
+ return resolve<cnst.DashboardData>({
293
+ stats,
294
+ notifications,
295
+ activities
296
+ });
297
+ }
298
+ ```
299
+
300
+ ### 3. Batch Operations
301
+
302
+ ```typescript
303
+ @Mutation.Admin(() => [cnst.User])
304
+ async bulkUpdateUserStatus(
305
+ @Arg.Body("userIds", () => [ID]) userIds: string[],
306
+ @Arg.Body("status", () => String) status: cnst.UserStatus
307
+ ) {
308
+ const users = await this.userService.bulkUpdateStatus(userIds, status);
309
+ return resolve<cnst.User[]>(users);
310
+ }
311
+ ```
312
+
313
+ ### 4. Filtered Access Control
314
+
315
+ ```typescript
316
+ @Query.User(() => cnst.ProjectDetails)
317
+ async getProjectDetails(
318
+ @Arg.Param("projectId", () => ID) projectId: string,
319
+ @Self() self: Self
320
+ ) {
321
+ // Check permissions within the method
322
+ const hasAccess = await this.projectService.checkUserAccess(projectId, self.id);
323
+ if (!hasAccess) {
324
+ throw new Error("Access denied");
325
+ }
326
+
327
+ const project = await this.projectService.getDetails(projectId);
328
+ return resolve<cnst.ProjectDetails>(project);
329
+ }
330
+ ```
331
+
332
+ ## Best Practices
333
+
334
+ ### 1. Naming Conventions
335
+
336
+ - **Method Names**:
337
+
338
+ - Use `modelListIn<Slice>` for list queries
339
+ - Use `modelInsightIn<Slice>` for insight queries
340
+ - Prefix mutations with verbs (`createUser`, `updateProfile`)
341
+ - Use descriptive names that indicate functionality
342
+
343
+ - **Parameter Names**:
344
+ - Use consistent names across similar methods
345
+ - Match service method parameter names where possible
346
+
347
+ ### 2. Type Safety
348
+
349
+ - Always specify return types in decorators: `@Query.Public(() => ModelType)`
350
+ - Always use `resolve<Type>()` with explicit type
351
+ - Define parameter types with GraphQL scalar types: `() => ID`, `() => Int`
352
+ - Use nullability consistently: `{ nullable: true }`
353
+
354
+ ### 3. Performance
355
+
356
+ - Use pagination parameters consistently (`skip`/`limit` or `page`/`pageSize`)
357
+ - Implement slices for focused data retrieval
358
+ - Use parallel requests with `Promise.all` for combined data
359
+ - Consider implementing cursor-based pagination for large datasets
360
+
361
+ ### 4. Security
362
+
363
+ - Apply appropriate access control decorators
364
+ - Validate input data in signals or services
365
+ - Use the `@Self()` decorator to ensure user-scoped operations
366
+ - Implement rate limiting for public endpoints
367
+
368
+ ### 5. Error Handling
369
+
370
+ - Use try/catch blocks for operations that might fail
371
+ - Return standardized error formats
372
+ - Add logging for debugging purposes
373
+ - Handle database errors gracefully
374
+
375
+ ## Implementation Examples
376
+
377
+ ### Basic CRUD Signal with DbSignal
378
+
379
+ ```typescript
380
+ export class ProductSignal extends DbSignal(cnst.productCnst, cnst.Srvs, {
381
+ guards: { root: Admin, get: Query.Public, cru: Mutation.Admin },
382
+ }) {
383
+ // Custom methods beyond auto-generated CRUD
384
+ @Query.Public(() => [cnst.Product])
385
+ async productListInFeatured(
386
+ @Arg.Query("skip", () => Int, { nullable: true }) skip: number | null,
387
+ @Arg.Query("limit", () => Int, { nullable: true }) limit: number | null
388
+ ) {
389
+ const products = await this.productService.listFeatured({ skip, limit });
390
+ return resolve<cnst.Product[]>(products);
391
+ }
392
+
393
+ @Mutation.Admin(() => Boolean)
394
+ async toggleProductFeatured(
395
+ @Arg.Param("productId", () => ID) productId: string,
396
+ @Arg.Body("featured", () => Boolean) featured: boolean
397
+ ) {
398
+ await this.productService.setFeatured(productId, featured);
399
+ return resolve<boolean>(true);
400
+ }
401
+ }
402
+ ```
403
+
404
+ ### Real-Time Chat Signal
405
+
406
+ ```typescript
407
+ export class ChatSignal {
408
+ @Mutation.User(() => cnst.Chat)
409
+ async sendChat(
410
+ @Arg.Body("roomId", () => ID) roomId: string,
411
+ @Arg.Body("message", () => String) message: string,
412
+ @Self() self: Self
413
+ ) {
414
+ const chat = await this.chatService.create(roomId, self.id, message);
415
+ return resolve<cnst.Chat>(chat);
416
+ }
417
+
418
+ @Message.User(() => Boolean)
419
+ async markAsRead(@Arg.Msg("chatId", () => ID) chatId: string, @Self() self: Self) {
420
+ await this.chatService.markAsRead(chatId, self.id);
421
+ return resolve<boolean>(true);
422
+ }
423
+
424
+ @Pubsub.User(() => cnst.Chat)
425
+ chatReceived(@Arg.Room("roomId", () => ID) roomId: string, @Ws() ws: Ws) {
426
+ return subscribe<cnst.Chat>();
427
+ }
428
+ }
429
+ ```
430
+
431
+ ### Background Processing Signal
432
+
433
+ ```typescript
434
+ export class ReportSignal {
435
+ @Mutation.Admin(() => cnst.Report)
436
+ async generateReport(
437
+ @Arg.Body("type", () => String) type: cnst.ReportType,
438
+ @Arg.Body("parameters", () => cnst.ReportParameters) parameters: cnst.ReportParameters,
439
+ @Self() self: Self
440
+ ) {
441
+ // Create report record
442
+ const report = await this.reportService.initReport(type, parameters, self.id);
443
+
444
+ // Queue background process
445
+ await this.reportService.queueReportGeneration(report.id);
446
+
447
+ return resolve<cnst.Report>(report);
448
+ }
449
+
450
+ @Process.Batch(() => Boolean)
451
+ async processReport(@Arg.Msg("reportId", () => ID) reportId: string) {
452
+ await this.reportService.generateReport(reportId);
453
+ return done(true);
454
+ }
455
+ }
456
+ ```
457
+
458
+ ## Troubleshooting
459
+
460
+ ### Common Issues
461
+
462
+ 1. **Type Mismatch Errors**
463
+
464
+ - Ensure GraphQL types match TypeScript types
465
+ - Check nullable parameters and provide default values
466
+ - Verify service method return types match signal return types
467
+
468
+ 2. **Authentication Errors**
469
+
470
+ - Verify guard levels match your security requirements
471
+ - Check that @Self() is used in user-scoped operations
472
+ - Test with different user roles to verify access control
473
+
474
+ 3. **Real-Time Communication Issues**
475
+
476
+ - Ensure room names are consistent between subscriptions and messages
477
+ - Verify WebSocket connection is established
478
+ - Check that subscription events are being triggered correctly
479
+
480
+ 4. **Missing Data in Client**
481
+ - Verify signal method parameters match client call parameters
482
+ - Check that resolve<Type>() is being used correctly
483
+ - Ensure proper error handling on the client side
484
+
485
+ ### Debugging Tips
486
+
487
+ 1. Enable verbose logging in development
488
+ 2. Use network inspection tools to examine requests/responses
489
+ 3. Add temporary logging in signal methods
490
+ 4. Test signals directly in a backend-only environment
491
+ 5. Use GraphQL playground to test queries/mutations
492
+
493
+ ## Advanced Topics
494
+
495
+ ### Custom Signal Decorators
496
+
497
+ You can create custom decorators for reusable patterns:
498
+
499
+ ```typescript
500
+ // Create a custom slice decorator
501
+ export function SelfSlice<T>(returnType: () => T) {
502
+ return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
503
+ Query.User(returnType)(target, propertyKey, descriptor);
504
+ // Add additional metadata or behavior
505
+ };
506
+ }
507
+ ```
508
+
509
+ ### Signal Integration with External APIs
510
+
511
+ ```typescript
512
+ export class ExternalApiSignal {
513
+ @Query.Public(() => cnst.WeatherData)
514
+ async getWeatherData(@Arg.Query("location", () => String) location: string) {
515
+ // Call external API with proper error handling
516
+ try {
517
+ const data = await this.externalApiService.fetchWeather(location);
518
+ return resolve<cnst.WeatherData>(data);
519
+ } catch (error) {
520
+ // Handle and transform errors from external API
521
+ throw new Error(`Weather API error: ${error.message}`);
522
+ }
523
+ }
524
+ }
525
+ ```
526
+
527
+ ### Caching Strategies
528
+
529
+ Signals can implement caching for performance:
530
+
531
+ ```typescript
532
+ export class ProductSignal extends DbSignal(cnst.productCnst, Srvs) {
533
+ @Query.Public(() => cnst.Product)
534
+ async getProduct(@Arg.Param("productId", () => ID) productId: string) {
535
+ // Check cache first
536
+ const cached = await this.cacheService.get(`product:${productId}`);
537
+ if (cached) {
538
+ return resolve<cnst.Product>(cached);
539
+ }
540
+
541
+ // Fetch from database if not cached
542
+ const product = await this.productService.get(productId);
543
+
544
+ // Cache for future requests
545
+ await this.cacheService.set(`product:${productId}`, product, 3600);
546
+
547
+ return resolve<cnst.Product>(product);
548
+ }
549
+ }
550
+ ```
551
+
552
+ Remember that signals should be pure TypeScript with no framework-specific code, as they're used by both client and server. The Akan.js framework handles the conversion to the appropriate transport mechanism.
@@ -0,0 +1,130 @@
1
+ {
2
+ "title": "Model Store",
3
+ "description": "How to create and implement model.store.ts files in Akan.js",
4
+ "scans": [
5
+ {
6
+ "type": "source",
7
+ "description": "Core store implementation",
8
+ "path": "pkgs/akanjs/store/stateOf.ts"
9
+ },
10
+ {
11
+ "type": "source",
12
+ "description": "Store decorator implementation",
13
+ "path": "pkgs/akanjs/store/Store.ts"
14
+ },
15
+ {
16
+ "type": "source",
17
+ "description": "Toast decorator implementation",
18
+ "path": "pkgs/akanjs/store/Toast.ts"
19
+ },
20
+ {
21
+ "type": "source",
22
+ "description": "Store utility functions",
23
+ "path": "pkgs/akanjs/store/makeStore.ts"
24
+ },
25
+ {
26
+ "type": "example",
27
+ "description": "Basic store implementation examples",
28
+ "path": "{apps,libs}/*/lib/*/*.store.ts",
29
+ "filterText": "@Store",
30
+ "sample": 5
31
+ },
32
+ {
33
+ "type": "example",
34
+ "description": "Store examples with custom actions",
35
+ "path": "{apps,libs}/*/lib/*/*.store.ts",
36
+ "filterText": "async",
37
+ "sample": 5
38
+ },
39
+ {
40
+ "type": "example",
41
+ "description": "Store examples with toast notifications",
42
+ "path": "{apps,libs}/*/lib/*/*.store.ts",
43
+ "filterText": "@Toast",
44
+ "sample": 3
45
+ },
46
+ {
47
+ "type": "example",
48
+ "description": "Complex state management examples",
49
+ "path": "{apps,libs}/*/lib/*/*.store.ts",
50
+ "filterText": "this.pick",
51
+ "sample": 3
52
+ },
53
+ {
54
+ "type": "example",
55
+ "description": "Store composition examples",
56
+ "path": "{apps,libs}/*/lib/store.ts",
57
+ "filterText": "MixStore",
58
+ "sample": 3
59
+ },
60
+ {
61
+ "type": "usage",
62
+ "description": "Store usage in forms (Template files)",
63
+ "path": "{apps,libs}/*/lib/*/*.Template.ts{,x}",
64
+ "filterText": "st.use.modelForm",
65
+ "sample": 3
66
+ },
67
+ {
68
+ "type": "usage",
69
+ "description": "Store form submission examples",
70
+ "path": "{apps,libs}/*/lib/*/*.Template.ts{,x}",
71
+ "filterText": "submitModel",
72
+ "sample": 3
73
+ },
74
+ {
75
+ "type": "usage",
76
+ "description": "Store list rendering examples",
77
+ "path": "{apps,libs}/*/lib/*/*.Zone.ts{,x}",
78
+ "filterText": "st.use.modelList",
79
+ "sample": 3
80
+ },
81
+ {
82
+ "type": "usage",
83
+ "description": "Store pagination examples",
84
+ "path": "{apps,libs}/*/lib/*/*.Zone.ts{,x}",
85
+ "filterText": "setPageOf",
86
+ "sample": 3
87
+ },
88
+ {
89
+ "type": "usage",
90
+ "description": "Store filtering examples",
91
+ "path": "{apps,libs}/*/lib/*/*.Util.ts{,x}",
92
+ "filterText": "setQueryArgsOf",
93
+ "sample": 3
94
+ },
95
+ {
96
+ "type": "usage",
97
+ "description": "Store slice initialization examples",
98
+ "path": "{apps,libs}/*/lib/*/*.{View,Zone}.ts{,x}",
99
+ "filterText": "initModelList",
100
+ "sample": 3
101
+ }
102
+ ],
103
+ "update": {
104
+ "filePath": "./modelStore.instruction.md",
105
+ "contents": [
106
+ "Purpose and role of model.store.ts files",
107
+ "Store architecture overview and integration with other framework components",
108
+ "Basic store implementation with Store decorator and stateOf",
109
+ "State management: base state, custom state, and accessing state",
110
+ "Store actions: core CRUD operations and custom business logic",
111
+ "Using slices for contextual list operations",
112
+ "Form management: state handling, field updates, and submission",
113
+ "Advanced patterns: store composition, cross-store operations, optimistic updates, real-time",
114
+ "Best practices for naming, state management, performance, error handling, and testing",
115
+ "Complete example with comprehensive implementation",
116
+ "File structure conventions"
117
+ ],
118
+ "rules": [
119
+ "Include diagrams showing store architecture",
120
+ "Provide real-world examples for all major concepts",
121
+ "Explain both simple and advanced usage patterns",
122
+ "Cover form handling in detail",
123
+ "Include error handling and loading state management",
124
+ "Explain the relationship with model.signal.ts and GraphQL operations",
125
+ "Include performance optimization techniques",
126
+ "Provide testing strategies for stores"
127
+ ]
128
+ },
129
+ "page": "/akanjs/(docs)/docs/module/store/_index.tsx"
130
+ }