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,604 @@
1
+ # Model.Template.tsx Implementation Guide
2
+
3
+ ## Purpose and Role of Model.Template.tsx Files
4
+
5
+ Model.Template.tsx files are client-side React components that define the form structure for creating/editing models in Akan.js applications. They serve as:
6
+
7
+ 1. **Form Blueprints**: Provide reusable form structures for model CRUD operations
8
+ 2. **State Management**: Connect form inputs to Zustand store slices
9
+ 3. **Validation**: Implement field-level validation rules
10
+ 4. **UI Consistency**: Ensure uniform form design across the application
11
+ 5. **Type Safety**: Enforce data types based on Model.Constant definitions
12
+ 6. **Internationalization**: Support multi-language form fields with dictionary integration
13
+ 7. **Component Reusability**: Enable form sections to be used in multiple contexts (pages, modals, utilities)
14
+
15
+ ## File Location and Naming Convention
16
+
17
+ ### Standard Path
18
+
19
+ ```
20
+ {apps,libs}/*/lib/[model]/[Model].Template.tsx
21
+ ```
22
+
23
+ ### Examples:
24
+
25
+ - `libs/game/lib/map/Map.Template.tsx`
26
+ - `apps/lu/lib/feeling/Feeling.Template.tsx`
27
+ - `libs/shared/lib/user/User.Template.tsx`
28
+
29
+ ### Naming Rules:
30
+
31
+ - PascalCase for model names (e.g., `Map.Template.tsx`)
32
+ - Place in the same directory as other model files (`[Model].store.ts`, `[Model].constant.ts`)
33
+ - Export named components (typically `General`, `Advanced`, `Compact`)
34
+
35
+ ## Basic Structure and Component Patterns
36
+
37
+ ### Minimum Structure
38
+
39
+ ```tsx
40
+ "use client";
41
+ import { Field } from "@libs/shared/ui";
42
+ import { st } from "@[project]/client";
43
+ import { usePage } from "@[project]/lib/useClient";
44
+
45
+ export const General = ({ id }: { id?: string }) => {
46
+ const form = st.use.[model]Form();
47
+ const { l } = usePage();
48
+
49
+ return (
50
+ <div className="grid grid-cols-1 gap-4">
51
+ <Field.Text
52
+ label={l("model.fieldName")}
53
+ value={form.fieldName}
54
+ onChange={(v) => st.do.setFieldNameOn[Model](v)}
55
+ />
56
+ </div>
57
+ );
58
+ };
59
+ ```
60
+
61
+ ### Component Organization Patterns
62
+
63
+ ```tsx
64
+ // Single-file pattern
65
+ export const General = () => { /* main form */ }
66
+ export const Advanced = () => { /* advanced fields */ }
67
+
68
+ // Multi-file pattern (recommended)
69
+ [Model].Template/
70
+ ├─ General.tsx
71
+ ├─ Sections/
72
+ │ ├─ BasicInfo.tsx
73
+ │ ├─ ContactDetails.tsx
74
+ ```
75
+
76
+ ## Integration with Store State Management
77
+
78
+ ### Connecting to Zustand Store
79
+
80
+ ```tsx
81
+ // Access form state
82
+ const form = st.use.[model]Form();
83
+
84
+ // Update fields
85
+ <Field.Text
86
+ value={form.name}
87
+ onChange={st.do.setNameOn[Model]}
88
+ />
89
+ ```
90
+
91
+ ### Store Action Patterns
92
+
93
+ ```tsx
94
+ // Simple field update
95
+ st.do.setNameOn[Model](value);
96
+
97
+ // Nested field update
98
+ st.do.writeOn[Model](["address", "city"], value);
99
+
100
+ // List operations
101
+ st.do.addItemOn[Model](newItem);
102
+ st.do.removeItemOn[Model](index);
103
+ ```
104
+
105
+ ### Initialization and Cleanup
106
+
107
+ ```tsx
108
+ useEffect(() => {
109
+ if (id) {
110
+ // Load existing data
111
+ void st.do.load[Model](id);
112
+ }
113
+
114
+ return () => {
115
+ // Reset form on unmount
116
+ st.do.reset[Model]Form();
117
+ };
118
+ }, [id]);
119
+ ```
120
+
121
+ ## Field Types and Form Components
122
+
123
+ ### Core Field Components
124
+
125
+ | Component | Usage | Example |
126
+ | -------------------- | --------------------- | ------------------------------------------- |
127
+ | `Field.Text` | Text input | `<Field.Text value={form.name} />` |
128
+ | `Field.TextArea` | Multi-line text | `<Field.TextArea value={form.desc} />` |
129
+ | `Field.Number` | Numeric input | `<Field.Number value={form.age} />` |
130
+ | `Field.Select` | Dropdown selection | `<Field.Select options={statusOptions} />` |
131
+ | `Field.ToggleSelect` | Toggleable options | `<Field.ToggleSelect items={types} />` |
132
+ | `Field.Tags` | Tag input | `<Field.Tags value={form.tags} />` |
133
+ | `Field.Img` | Image upload | `<Field.Img sliceName="model" />` |
134
+ | `Field.Date` | Date picker | `<Field.Date value={form.dueDate} />` |
135
+ | `Field.Parent` | Relationship selector | `<Field.Parent sliceName="relatedModel" />` |
136
+ | `Field.Slate` | Rich text editor | `<Field.Slate valuePath="content" />` |
137
+
138
+ ### Complex Field Example
139
+
140
+ ```tsx
141
+ <Field.List
142
+ label={l("map.spawnPositions")}
143
+ value={form.spawnPositions}
144
+ onAdd={() => st.do.addSpawnPosition(defaultPosition)}
145
+ renderItem={(position, idx) => (
146
+ <div className="flex gap-4">
147
+ <Field.Text value={position.key} onChange={(v) => st.do.writeOnMap(["spawnPositions", idx, "key"], v)} />
148
+ <Field.DoubleNumber
149
+ value={position.position}
150
+ onChange={(v) => st.do.writeOnMap(["spawnPositions", idx, "position"], v)}
151
+ />
152
+ </div>
153
+ )}
154
+ />
155
+ ```
156
+
157
+ ## Form Validation Approaches
158
+
159
+ ### Field-Level Validation
160
+
161
+ ```tsx
162
+ <Field.Email
163
+ value={form.email}
164
+ validate={(v) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v)}
165
+ errorMessage="Invalid email format"
166
+ required
167
+ />
168
+ ```
169
+
170
+ ### Custom Validation Functions
171
+
172
+ ```tsx
173
+ // Phone validation
174
+ <Field.Phone
175
+ value={form.phone}
176
+ validate={(v) => isPhoneNumber(v)}
177
+ />
178
+
179
+ // Custom business rule
180
+ <Field.Number
181
+ value={form.quantity}
182
+ validate={(v) => v > 0 ? true : "Must be positive"}
183
+ />
184
+ ```
185
+
186
+ ### Validation Props
187
+
188
+ | Prop | Description | Example |
189
+ | ----------------------- | -------------------- | ------------------------------- |
190
+ | `required` | Mandatory field | `required` |
191
+ | `min`/`max` | Number range | `min={0} max={100}` |
192
+ | `minLength`/`maxLength` | Text length | `minLength={2}` |
193
+ | `validate` | Custom validation fn | `validate={(v) => isValid(v)}` |
194
+ | `errorMessage` | Custom error text | `errorMessage="Invalid format"` |
195
+
196
+ ## Internationalization with usePage
197
+
198
+ ### Dictionary Integration
199
+
200
+ ```tsx
201
+ const { l } = usePage();
202
+
203
+ // Basic field
204
+ <Field.Text label={l("model.name")} />
205
+
206
+ // With description
207
+ <Field.Text
208
+ label={l("model.email")}
209
+ desc={l("model.email.desc")}
210
+ />
211
+
212
+ // Dynamic content
213
+ <div>{l(`profileVerify.enum-type-${type}`)}</div>
214
+ ```
215
+
216
+ ### Dictionary Structure
217
+
218
+ ```tsx
219
+ // Example dictionary
220
+ export const dictionary = {
221
+ field: {
222
+ model: {
223
+ name: { en: "Name", ko: "이름" },
224
+ email: { en: "Email", ko: "이메일" },
225
+ },
226
+ },
227
+ desc: {
228
+ model: {
229
+ email: { en: "Your contact email", ko: "연락처 이메일" },
230
+ },
231
+ },
232
+ };
233
+ ```
234
+
235
+ ## Form Layout Patterns and Best Practices
236
+
237
+ ### Responsive Grid Layout
238
+
239
+ ```tsx
240
+ <div className="grid grid-cols-1 gap-4 md:grid-cols-2">
241
+ <Field.Text label="First Name" />
242
+ <Field.Text label="Last Name" />
243
+ <Field.Email label="Email" className="md:col-span-2" />
244
+ </div>
245
+ ```
246
+
247
+ ### Section Grouping
248
+
249
+ ```tsx
250
+ <section className="mb-6">
251
+ <h3 className="mb-3 text-xl font-semibold">Personal Information</h3>
252
+ <div className="space-y-4">
253
+ <Field.Text label="Full Name" />
254
+ <Field.Date label="Birth Date" />
255
+ </div>
256
+ </section>
257
+ ```
258
+
259
+ ### Conditional Sections
260
+
261
+ ```tsx
262
+ {
263
+ form.type === "business" && (
264
+ <section>
265
+ <h3>Business Details</h3>
266
+ <Field.Text label="Company Name" />
267
+ <Field.Text label="Tax ID" />
268
+ </section>
269
+ );
270
+ }
271
+ ```
272
+
273
+ ### Best Practices
274
+
275
+ 1. Use consistent spacing (`gap-4`, `mb-4`)
276
+ 2. Group related fields visually
277
+ 3. Place important fields above the fold
278
+ 4. Use appropriate field types for data
279
+ 5. Provide clear validation feedback
280
+ 6. Optimize for mobile-first experiences
281
+
282
+ ## Using Templates in Pages, Utilities, and Zones
283
+
284
+ ### In Page Components
285
+
286
+ ```tsx
287
+ // Creation page
288
+ <Model.Edit sliceName="model" type="form">
289
+ <Model.Template.General />
290
+ </Model.Edit>
291
+
292
+ // Edit page
293
+ <Model.Edit modelId={params.id} sliceName="model">
294
+ <Model.Template.General id={params.id} />
295
+ </Model.Edit>
296
+ ```
297
+
298
+ ### In Utility Components
299
+
300
+ ```tsx
301
+ // Modal-based editing
302
+ <Modal.Open opens={`edit-${id}`}>
303
+ <button>Edit</button>
304
+ </Modal.Open>
305
+
306
+ <Modal.Window name={`edit-${id}`}>
307
+ <Model.Edit modelId={id} sliceName="model">
308
+ <Model.Template.Compact />
309
+ </Model.Edit>
310
+ </Modal.Window>
311
+ ```
312
+
313
+ ### In Zone Components
314
+
315
+ ```tsx
316
+ // List view with create form
317
+ <Data.ListContainer
318
+ renderTemplate={() => <Model.Template.General />}
319
+ />
320
+
321
+ // Inline editor
322
+ <Zone.InlineEdit>
323
+ <Model.Template.Compact />
324
+ </Zone.InlineEdit>
325
+ ```
326
+
327
+ ## State Management and Lifecycle Methods
328
+
329
+ ### Lifecycle Hooks
330
+
331
+ ```tsx
332
+ useEffect(() => {
333
+ // Initialize form data
334
+ if (id) void st.do.loadModel(id);
335
+
336
+ // Initialize related data
337
+ void st.do.initRelatedData();
338
+
339
+ return () => {
340
+ // Cleanup on unmount
341
+ st.do.resetModelForm();
342
+ };
343
+ }, [id]);
344
+ ```
345
+
346
+ ### Form State Flow
347
+
348
+ 1. **Initialization**: Load data when component mounts
349
+ 2. **User Interaction**: Update state via store actions
350
+ 3. **Validation**: Validate on change/blur/submit
351
+ 4. **Submission**: Process form data
352
+ 5. **Cleanup**: Reset state on unmount
353
+
354
+ ## Performance Optimization Techniques
355
+
356
+ ### Memoization
357
+
358
+ ```tsx
359
+ const FormSection = React.memo(({ fields }) => {
360
+ // Component implementation
361
+ });
362
+ ```
363
+
364
+ ### Debounced Inputs
365
+
366
+ ```tsx
367
+ import { useDebounce } from "akanjs/hooks";
368
+
369
+ const [input, setInput] = useState("");
370
+ const debouncedInput = useDebounce(input, 300);
371
+
372
+ useEffect(() => {
373
+ st.do.search(debouncedInput);
374
+ }, [debouncedInput]);
375
+ ```
376
+
377
+ ### Lazy Loading
378
+
379
+ ```tsx
380
+ const HeavyEditor = React.lazy(() => import("./HeavyEditor"));
381
+
382
+ <Suspense fallback={<Loader />}>
383
+ <HeavyEditor />
384
+ </Suspense>;
385
+ ```
386
+
387
+ ## Accessibility Considerations
388
+
389
+ ### Accessible Form Patterns
390
+
391
+ ```tsx
392
+ // Proper labeling
393
+ <label htmlFor="email-field">Email</label>
394
+ <input id="email-field" type="email" />
395
+
396
+ // ARIA attributes
397
+ <div
398
+ role="alert"
399
+ aria-live="polite"
400
+ >
401
+ {error && <p>{error}</p>}
402
+ </div>
403
+
404
+ // Keyboard navigation
405
+ <button onKeyDown={handleKeyNavigation}>Submit</button>
406
+ ```
407
+
408
+ ### Accessibility Requirements
409
+
410
+ 1. Associate all inputs with labels
411
+ 2. Provide ARIA attributes for custom components
412
+ 3. Ensure proper focus management
413
+ 4. Support keyboard navigation
414
+ 5. Provide error messages as live regions
415
+ 6. Use sufficient color contrast
416
+
417
+ ## Common Patterns and Reusable Components
418
+
419
+ ### Reusable Form Sections
420
+
421
+ ```tsx
422
+ // AddressSection.tsx
423
+ export const AddressSection = () => (
424
+ <>
425
+ <Field.Text label="Street" />
426
+ <Field.Text label="City" />
427
+ <Field.Text label="Zip Code" />
428
+ </>
429
+ );
430
+
431
+ // Usage
432
+ <AddressSection />;
433
+ ```
434
+
435
+ ### Dynamic Field Arrays
436
+
437
+ ```tsx
438
+ <Field.List
439
+ value={form.items}
440
+ onAdd={() => st.do.addItem(defaultItem)}
441
+ renderItem={(item, index) => (
442
+ <div key={index}>
443
+ <Field.Text value={item.name} />
444
+ <Field.Number value={item.quantity} />
445
+ </div>
446
+ )}
447
+ />
448
+ ```
449
+
450
+ ### Compound Components
451
+
452
+ ```tsx
453
+ // DockerRegistryField.tsx
454
+ const DockerRegistry = ({ value, onChange }) => (
455
+ <>
456
+ <Field.Text label="URI" value={value.uri} />
457
+ <Field.Text label="Username" value={value.username} />
458
+ <Field.Text label="Password" value={value.password} />
459
+ </>
460
+ );
461
+ ```
462
+
463
+ ## Form State Integration with Database Models
464
+
465
+ ### Type Alignment
466
+
467
+ ```tsx
468
+ // Model.constant.ts
469
+
470
+ export class ProjectInput {
471
+ @Field.Prop(() => String)
472
+ name: string;
473
+ }
474
+
475
+ // Project.Template.tsx
476
+ const form = st.use.projectForm(); // Type: ProjectInput
477
+
478
+ <Field.Text value={form.name} onChange={st.do.setNameOnProject} />;
479
+ ```
480
+
481
+ ### Data Transformation
482
+
483
+ ```tsx
484
+ // Before submission
485
+ const handleSubmit = () => {
486
+ const dataToSend = transformFormData(form);
487
+ st.do.createProject(dataToSend);
488
+ };
489
+
490
+ // After load
491
+ useEffect(() => {
492
+ if (data) {
493
+ const formData = transformAPIData(data);
494
+ st.do.setProjectForm(formData);
495
+ }
496
+ }, [data]);
497
+ ```
498
+
499
+ ## Troubleshooting Common Issues
500
+
501
+ ### Common Problems and Solutions
502
+
503
+ | Issue | Solution |
504
+ | ----------------------- | ---------------------------------------------- |
505
+ | Form not updating | Verify Zustand actions are connected correctly |
506
+ | Validation not working | Check validate prop and error handling |
507
+ | Performance issues | Memoize components, debounce inputs |
508
+ | Type mismatches | Ensure constant types match form state |
509
+ | Missing translations | Verify dictionary keys and scopes |
510
+ | Form reset issues | Check cleanup useEffect dependencies |
511
+ | API submission failures | Validate server-side requirements |
512
+
513
+ ### Debugging Tips
514
+
515
+ 1. Check Zustand store state with Redux DevTools
516
+ 2. Verify prop drilling in complex forms
517
+ 3. Test validation rules independently
518
+ 4. Check network requests for API errors
519
+ 5. Verify dictionary key paths with `l()` function
520
+ 6. Ensure all required fields have `required` prop
521
+
522
+ ## Integration with API Calls and Form Submission
523
+
524
+ ### Submission Workflow
525
+
526
+ ```tsx
527
+ const handleSubmit = async () => {
528
+ try {
529
+ // Validate form
530
+ const errors = validateForm(form);
531
+ if (Object.keys(errors).length) throw errors;
532
+
533
+ // Submit data
534
+ if (id) {
535
+ await st.do.updateModel(id, form);
536
+ } else {
537
+ await st.do.createModel(form);
538
+ }
539
+
540
+ // Redirect on success
541
+ router.push("/success");
542
+ } catch (error) {
543
+ // Handle API errors
544
+ st.do.setFormErrors(error);
545
+ }
546
+ };
547
+
548
+ // In component
549
+ <Button onClick={handleSubmit}>Save</Button>;
550
+ ```
551
+
552
+ ### API Error Handling
553
+
554
+ ```tsx
555
+ // In store
556
+ createModel: async (form) => {
557
+ try {
558
+ return await fetch.createModel(form);
559
+ } catch (error) {
560
+ // Transform API errors to form errors
561
+ const formErrors = transformErrors(error);
562
+ set({ formErrors });
563
+ throw formErrors;
564
+ }
565
+ };
566
+ ```
567
+
568
+ ### Success/Failure Feedback
569
+
570
+ ```tsx
571
+ // Using toast notifications
572
+ toast.success(l("model.createdSuccess"));
573
+
574
+ // Inline messages
575
+ {
576
+ submitError && <div className="text-error">{submitError}</div>;
577
+ }
578
+ ```
579
+
580
+ ## Additional Best Practices
581
+
582
+ ### Component Design Principles
583
+
584
+ 1. **Single Responsibility**: Each template should focus on one model
585
+ 2. **Reusability**: Design components to work in different contexts
586
+ 3. **Composition**: Build complex forms from simple components
587
+ 4. **Consistency**: Follow established patterns across all templates
588
+ 5. **Accessibility**: Meet WCAG 2.1 standards for all form elements
589
+
590
+ ### Performance Guidelines
591
+
592
+ 1. Avoid unnecessary state updates
593
+ 2. Use React.memo for expensive components
594
+ 3. Virtualize long lists of fields
595
+ 4. Debounce rapid state updates
596
+ 5. Lazy load heavy form sections
597
+
598
+ ### Testing Recommendations
599
+
600
+ 1. Unit test validation functions
601
+ 2. Test form submission flows
602
+ 3. Verify internationalization coverage
603
+ 4. Test accessibility with screen readers
604
+ 5. Perform cross-browser testing
@@ -0,0 +1,92 @@
1
+ {
2
+ "title": "Model Unit",
3
+ "description": "How to create and implement Model.Unit.tsx files in Akan.js",
4
+ "scans": [
5
+ {
6
+ "type": "example",
7
+ "description": "Model Unit examples",
8
+ "path": "{apps,libs}/*/lib/*/*.Unit.tsx",
9
+ "sample": 5
10
+ },
11
+ {
12
+ "type": "implementation",
13
+ "description": "Model Unit typical implementations",
14
+ "path": "{apps,libs}/*/lib/**/*.Unit.tsx",
15
+ "filterText": "export const Abstract",
16
+ "sample": 3
17
+ },
18
+ {
19
+ "type": "implementation",
20
+ "description": "Model Unit Card implementations",
21
+ "path": "{apps,libs}/*/lib/**/*.Unit.tsx",
22
+ "filterText": "export const Card",
23
+ "sample": 2
24
+ },
25
+ {
26
+ "type": "usage",
27
+ "description": "Model Unit usage in pages",
28
+ "path": "apps/*/page/**/_index.tsx",
29
+ "filterText": ".Unit.",
30
+ "sample": 1
31
+ },
32
+ {
33
+ "type": "usage",
34
+ "description": "Model Unit usage in Utils",
35
+ "path": "{apps,libs}/*/lib/*/*.Util.tsx",
36
+ "filterText": ".Unit.",
37
+ "sample": 1
38
+ },
39
+ {
40
+ "type": "usage",
41
+ "description": "Model Unit usage in Templates",
42
+ "path": "{apps,libs}/*/lib/*/*.Template.tsx",
43
+ "filterText": ".Unit.",
44
+ "sample": 1
45
+ },
46
+ {
47
+ "type": "usage",
48
+ "description": "Model Unit usage in Zones",
49
+ "path": "{apps,libs}/*/lib/*/*.Zone.tsx",
50
+ "filterText": ".Unit.",
51
+ "sample": 3
52
+ },
53
+ {
54
+ "type": "reference",
55
+ "description": "Integration with database models",
56
+ "path": "{apps,libs}/*/lib/*/*.document.ts",
57
+ "sample": 1
58
+ },
59
+ {
60
+ "type": "reference",
61
+ "description": "Integration with model constants",
62
+ "path": "{apps,libs}/*/lib/*/*.constant.ts",
63
+ "sample": 1
64
+ }
65
+ ],
66
+ "update": {
67
+ "filePath": "./modelUnit.instruction.md",
68
+ "contents": [
69
+ "Purpose and role of Model.Unit.tsx files",
70
+ "How to create Model.Unit.tsx files",
71
+ "Common export patterns (Abstract, Card, Full, etc.)",
72
+ "Integration with LightModel types from constants",
73
+ "How to use Model.Unit.tsx files in pages",
74
+ "How to use Model.Unit.tsx files in Utils",
75
+ "How to use Model.Unit.tsx files in Zones",
76
+ "How to use Model.Unit.tsx files in Templates",
77
+ "Best practices for performance optimization",
78
+ "Common component patterns and variations"
79
+ ],
80
+ "rules": [
81
+ "Model.Unit.tsx is a server component, so it should not use client-side hooks like useEffect, useState, etc.",
82
+ "Model.Unit.tsx is a presentation component of cnst.LightModel to reuse in pages, Utils, Zones, and Templates, etc.",
83
+ "Always accept className prop for styling customization",
84
+ "Create multiple export variations (Abstract, Card, Full) for different use cases",
85
+ "Use semantic HTML and ensure accessibility",
86
+ "Focus on presentation only - do not include business logic",
87
+ "Include href prop for navigation when appropriate",
88
+ "Ensure proper image handling with the Image component from @util/ui"
89
+ ]
90
+ },
91
+ "page": "/akanjs/(docs)/docs/module/unit/_index.tsx"
92
+ }