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,541 @@
1
+ # Model.Unit.tsx Files in Akan.js - Implementation Guide
2
+
3
+ ## Purpose and Role of Model.Unit.tsx Files
4
+
5
+ Model.Unit.tsx files are foundational server components in the Akan.js framework that provide reusable presentation elements for domain models. They serve several critical purposes:
6
+
7
+ 1. **Consistent Model Representation**: Create standardized visual representations of domain entities
8
+ 2. **UI Building Blocks**: Serve as atomic components for building complex interfaces
9
+ 3. **Presentation Layer**: Encapsulate rendering logic for `cnst.LightModel` data objects
10
+ 4. **Cross-Component Reuse**: Enable consistent usage across pages, zones, templates, and utilities
11
+ 5. **Server-Side Rendering**: Optimize for Next.js server components architecture
12
+
13
+ Key characteristics:
14
+
15
+ - **Server Components**: Do not use client-side hooks (useState, useEffect, etc.)
16
+ - **Model-Focused**: Primarily render `cnst.LightModel` data structures
17
+ - **Presentation-Only**: Contain no business logic, state management, or data fetching
18
+ - **Prop-Configurable**: Accept standardized props for customization
19
+ - **Composable**: Designed to work seamlessly with other Akan.js components
20
+
21
+ ## How to Create Model.Unit.tsx Files
22
+
23
+ ### 1. File Location and Naming
24
+
25
+ Model Unit files follow strict naming conventions:
26
+
27
+ ```
28
+ libs/
29
+ your-lib/
30
+ lib/
31
+ feature-name/
32
+ FeatureName.Unit.tsx # PascalCase for file name
33
+ ```
34
+
35
+ ### 2. Basic Structure and Exports
36
+
37
+ A typical Model.Unit.tsx file exports multiple component variations:
38
+
39
+ ```tsx
40
+ import { clsx } from "clsx";
41
+ import { cnst } from "@your-lib/client";
42
+ import { Image, Link } from "akanjs/ui";
43
+
44
+ // Compact representation (minimal details)
45
+ export const Abstract = ({
46
+ product,
47
+ className,
48
+ href,
49
+ }: {
50
+ product: cnst.LightProduct;
51
+ className?: string;
52
+ href?: string;
53
+ }) => {
54
+ const Content = (
55
+ <div className={clsx("flex items-center gap-3 rounded border p-2", className)}>
56
+ {product.thumbnail && <Image file={product.thumbnail} className="h-12 w-12 rounded" alt={product.name} />}
57
+ <div>
58
+ <h3 className="font-medium">{product.name}</h3>
59
+ <p className="text-sm text-gray-500">{product.price.toLocaleString()} KRW</p>
60
+ </div>
61
+ </div>
62
+ );
63
+
64
+ return href ? <Link href={href}>{Content}</Link> : Content;
65
+ };
66
+
67
+ // Medium detail representation (card style)
68
+ export const Card = ({ product, className }: { product: cnst.LightProduct; className?: string }) => (
69
+ <div className={clsx("card bg-base-100 shadow-sm", className)}>
70
+ {product.image && (
71
+ <figure>
72
+ <Image file={product.image} className="h-48 w-full object-cover" alt={product.name} />
73
+ </figure>
74
+ )}
75
+ <div className="card-body p-4">
76
+ <h2 className="card-title text-lg">{product.name}</h2>
77
+ <p className="line-clamp-2 text-sm">{product.description}</p>
78
+ <div className="mt-2 flex items-center justify-between">
79
+ <span className="font-bold">{product.price.toLocaleString()} KRW</span>
80
+ <span className={clsx("badge", product.inStock ? "badge-success" : "badge-error")}>
81
+ {product.inStock ? "In Stock" : "Out of Stock"}
82
+ </span>
83
+ </div>
84
+ </div>
85
+ </div>
86
+ );
87
+
88
+ // Full detailed representation
89
+ export const Full = ({ product, className }: { product: cnst.LightProduct; className?: string }) => (
90
+ <div className={clsx("overflow-hidden rounded-lg border", className)}>
91
+ {product.image && <Image file={product.image} className="h-64 w-full object-cover" alt={product.name} />}
92
+ <div className="p-4">
93
+ <div className="mb-2 flex justify-between">
94
+ <h2 className="text-xl font-bold">{product.name}</h2>
95
+ <span className="text-lg font-bold">{product.price.toLocaleString()} KRW</span>
96
+ </div>
97
+ <p className="my-3">{product.description}</p>
98
+ <div className="grid grid-cols-2 gap-2 text-sm">
99
+ <div>
100
+ Category: <span className="font-medium">{product.category}</span>
101
+ </div>
102
+ <div>
103
+ SKU: <span className="font-medium">{product.sku}</span>
104
+ </div>
105
+ <div>
106
+ Manufacturer: <span className="font-medium">{product.manufacturer}</span>
107
+ </div>
108
+ <div>
109
+ Stock: <span className="font-medium">{product.stockQuantity}</span>
110
+ </div>
111
+ </div>
112
+ {product.tags?.length > 0 && (
113
+ <div className="mt-3 flex flex-wrap gap-1">
114
+ {product.tags.map((tag) => (
115
+ <span key={tag} className="badge badge-outline">
116
+ {tag}
117
+ </span>
118
+ ))}
119
+ </div>
120
+ )}
121
+ </div>
122
+ </div>
123
+ );
124
+
125
+ // Additional specialized variations as needed
126
+ export const Row = ({ product, className }: { product: cnst.LightProduct; className?: string }) => (
127
+ <div className={clsx("flex items-center justify-between border-b p-3", className)}>
128
+ <div className="flex items-center gap-3">
129
+ {product.thumbnail && <Image file={product.thumbnail} className="h-10 w-10 rounded" alt={product.name} />}
130
+ <div>
131
+ <h3 className="font-medium">{product.name}</h3>
132
+ <div className="text-xs text-gray-500">SKU: {product.sku}</div>
133
+ </div>
134
+ </div>
135
+ <div className="text-right">
136
+ <div className="font-bold">{product.price.toLocaleString()} KRW</div>
137
+ <div className={clsx("text-xs", product.inStock ? "text-green-600" : "text-red-600")}>
138
+ {product.inStock ? `${product.stockQuantity} in stock` : "Out of stock"}
139
+ </div>
140
+ </div>
141
+ </div>
142
+ );
143
+ ```
144
+
145
+ ### 3. Integration with LightModel Types
146
+
147
+ Model Units work with LightModel types defined in constant files:
148
+
149
+ ```tsx
150
+ // In your constant.ts file
151
+
152
+ export class LightProduct extends via(ProductObject, ["name", "price", "sku", "inStock"] as const) {
153
+ get displayPrice() {
154
+ return `${this.price.toLocaleString()} KRW`;
155
+ }
156
+ }
157
+
158
+ // In your Unit.tsx file
159
+ import { cnst } from "@your-lib/client";
160
+
161
+ export const Abstract = ({ product }: { product: cnst.LightProduct }) => (
162
+ <div>
163
+ <h3>{product.name}</h3>
164
+ <p>{product.displayPrice}</p>
165
+ </div>
166
+ );
167
+ ```
168
+
169
+ ### 4. Implementation Guidelines
170
+
171
+ 1. **Server Component Requirements**:
172
+
173
+ - No client-side hooks (`useState`, `useEffect`, `useRouter`, etc.)
174
+ - No browser-only APIs (`localStorage`, `window`, etc.)
175
+ - No `"use client"` directive in the file
176
+
177
+ 2. **Props Design**:
178
+
179
+ - Primary prop should be the model object (e.g., `product`, `user`, `story`)
180
+ - Always include `className` prop for styling customization
181
+ - Include `href` prop when the component might be used for navigation
182
+ - Keep prop interface consistent across export variations
183
+
184
+ 3. **Component Variations**:
185
+
186
+ - `Abstract`: Compact representation with minimal information
187
+ - `Card`: Medium-detail representation in a card format
188
+ - `Full`: Complete representation with all relevant details
189
+ - Additional variations as needed (List, Row, Grid, etc.)
190
+
191
+ 4. **Accessibility**:
192
+ - Use semantic HTML elements (`<article>`, `<section>`, `<h2>`, etc.)
193
+ - Include appropriate ARIA attributes
194
+ - Ensure proper image alt text
195
+ - Maintain keyboard navigability
196
+
197
+ ## Best Practices
198
+
199
+ ### 1. Component Variations and Consistent Exports
200
+
201
+ Define multiple components for different presentation contexts:
202
+
203
+ ```tsx
204
+ // User.Unit.tsx - Consistent naming pattern
205
+ export const Abstract = ({ user }) => {}; // Minimal view
206
+ export const Card = ({ user }) => {}; // Card view
207
+ export const Full = ({ user }) => {}; // Complete view
208
+ export const Row = ({ user }) => {}; // Table row view
209
+ export const Avatar = ({ user }) => {}; // Avatar-only view
210
+ ```
211
+
212
+ ### 2. Prop Handling and Styling
213
+
214
+ ```tsx
215
+ // Best practice: Accept and forward className
216
+ export const Abstract = ({
217
+ user,
218
+ className,
219
+ ...props
220
+ }: {
221
+ user: cnst.LightUser;
222
+ className?: string;
223
+ [key: string]: any;
224
+ }) => (
225
+ <div className={clsx("user-abstract rounded border p-3", className)} {...props}>
226
+ {/* content */}
227
+ </div>
228
+ );
229
+
230
+ // Best practice: Conditional rendering based on available data
231
+ export const Card = ({ user, className }: { user: cnst.LightUser; className?: string }) => (
232
+ <div className={clsx("card", className)}>
233
+ <div className="card-body">
234
+ <h3 className="card-title">{user.name}</h3>
235
+ {user.title && <p className="text-sm text-gray-600">{user.title}</p>}
236
+ {user.bio && <p className="mt-2">{user.bio}</p>}
237
+ {user.tags?.length > 0 && (
238
+ <div className="mt-2 flex gap-1">
239
+ {user.tags.map((tag) => (
240
+ <span key={tag} className="badge">
241
+ {tag}
242
+ </span>
243
+ ))}
244
+ </div>
245
+ )}
246
+ </div>
247
+ </div>
248
+ );
249
+ ```
250
+
251
+ ### 3. Image Handling
252
+
253
+ Always use the optimized `Image` component from `@util/ui` with proper attributes:
254
+
255
+ ```tsx
256
+ import { Image } from "akanjs/ui";
257
+
258
+ export const Card = ({ product }: { product: cnst.LightProduct }) => (
259
+ <div className="card">
260
+ {product.image ? (
261
+ <Image
262
+ file={product.image}
263
+ alt={product.name}
264
+ className="h-40 w-full object-cover"
265
+ sizes="(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw"
266
+ />
267
+ ) : (
268
+ <div className="flex h-40 w-full items-center justify-center bg-gray-200">
269
+ <span className="text-gray-400">No image</span>
270
+ </div>
271
+ )}
272
+ {/* Other content */}
273
+ </div>
274
+ );
275
+ ```
276
+
277
+ ### 4. Conditional Rendering and Link Handling
278
+
279
+ ```tsx
280
+ export const Abstract = ({ post, href, className }: { post: cnst.LightPost; href?: string; className?: string }) => {
281
+ const Content = (
282
+ <div className={clsx("post-abstract p-3", className)}>
283
+ <h3 className="font-bold">{post.title}</h3>
284
+ <p className="line-clamp-2 text-sm text-gray-600">{post.summary}</p>
285
+ </div>
286
+ );
287
+
288
+ // Conditionally wrap with Link if href is provided
289
+ return href ? (
290
+ <Link href={href} className="block transition hover:bg-gray-50">
291
+ {Content}
292
+ </Link>
293
+ ) : (
294
+ Content
295
+ );
296
+ };
297
+ ```
298
+
299
+ ### 5. Responsive Design
300
+
301
+ ```tsx
302
+ export const Card = ({ event }: { event: cnst.LightEvent }) => (
303
+ <div className="card">
304
+ <div className="card-body">
305
+ <h3 className="text-lg font-bold md:text-xl">{event.title}</h3>
306
+ <div className="flex flex-col sm:flex-row sm:justify-between">
307
+ <div className="text-sm">{formatDate(event.startDate)}</div>
308
+ <div className="mt-1 text-sm sm:mt-0">{event.location}</div>
309
+ </div>
310
+ <p className="mt-2 line-clamp-3 text-sm md:text-base">{event.description}</p>
311
+ </div>
312
+ </div>
313
+ );
314
+ ```
315
+
316
+ ## Common Component Patterns and Variations
317
+
318
+ ### 1. Hierarchical Components
319
+
320
+ ```tsx
321
+ // Department.Unit.tsx
322
+ export const Tree = ({ department }: { department: cnst.LightDepartment }) => (
323
+ <div className="rounded border p-3">
324
+ <h3 className="font-bold">{department.name}</h3>
325
+ {department.children?.length > 0 && (
326
+ <div className="mt-2 border-l pl-4">
327
+ {department.children.map((child) => (
328
+ <Tree key={child.id} department={child} />
329
+ ))}
330
+ </div>
331
+ )}
332
+ </div>
333
+ );
334
+ ```
335
+
336
+ ### 2. Status-Based Styling
337
+
338
+ ```tsx
339
+ // Order.Unit.tsx
340
+ export const Card = ({ order }: { order: cnst.LightOrder }) => (
341
+ <div className="rounded border p-4">
342
+ <div className="flex justify-between">
343
+ <h3 className="font-bold">#{order.orderNumber}</h3>
344
+ <span
345
+ className={clsx(
346
+ "badge",
347
+ order.status === "completed" && "badge-success",
348
+ order.status === "processing" && "badge-info",
349
+ order.status === "cancelled" && "badge-error",
350
+ order.status === "pending" && "badge-warning"
351
+ )}
352
+ >
353
+ {order.status}
354
+ </span>
355
+ </div>
356
+ <div className="mt-2">
357
+ <div>Customer: {order.customerName}</div>
358
+ <div>Items: {order.itemCount}</div>
359
+ <div>Total: {order.totalAmount.toLocaleString()} KRW</div>
360
+ </div>
361
+ </div>
362
+ );
363
+ ```
364
+
365
+ ### 3. Detail and Summary Pattern
366
+
367
+ ```tsx
368
+ // FAQ.Unit.tsx
369
+ export const Item = ({ faq }: { faq: cnst.LightFAQ }) => (
370
+ <details className="mb-2 overflow-hidden rounded border">
371
+ <summary className="cursor-pointer bg-gray-50 p-3 font-medium hover:bg-gray-100">{faq.question}</summary>
372
+ <div className="mt-2 p-3 pt-0">{faq.answer}</div>
373
+ </details>
374
+ );
375
+ ```
376
+
377
+ ### 4. Grid and List Variations
378
+
379
+ ```tsx
380
+ // Product.Unit.tsx
381
+ // For grid layouts
382
+ export const Grid = ({ product }: { product: cnst.LightProduct }) => (
383
+ <div className="overflow-hidden rounded border">
384
+ {product.image && <Image file={product.image} className="h-40 w-full object-cover" alt={product.name} />}
385
+ <div className="p-3">
386
+ <h3 className="truncate font-bold">{product.name}</h3>
387
+ <p className="mt-1 font-bold">{product.price.toLocaleString()} KRW</p>
388
+ </div>
389
+ </div>
390
+ );
391
+
392
+ // For list layouts
393
+ export const List = ({ product }: { product: cnst.LightProduct }) => (
394
+ <div className="flex border-b py-3">
395
+ {product.thumbnail && <Image file={product.thumbnail} className="h-16 w-16 object-cover" alt={product.name} />}
396
+ <div className="ml-3 flex-grow">
397
+ <h3 className="font-medium">{product.name}</h3>
398
+ <p className="line-clamp-1 text-sm text-gray-600">{product.description}</p>
399
+ </div>
400
+ <div className="ml-3 text-right">
401
+ <p className="font-bold">{product.price.toLocaleString()} KRW</p>
402
+ <p className="text-xs text-gray-500">SKU: {product.sku}</p>
403
+ </div>
404
+ </div>
405
+ );
406
+ ```
407
+
408
+ ## Troubleshooting Common Issues
409
+
410
+ ### 1. Server Component Errors
411
+
412
+ ```
413
+ Error: useState is not defined in Model.Unit.tsx
414
+ ```
415
+
416
+ **Solution**: Keep Model.Unit.tsx as server components without client-side hooks:
417
+
418
+ ```tsx
419
+ // ❌ INCORRECT: Don't use client hooks in Unit components
420
+ export const Card = ({ product }) => {
421
+ const [expanded, setExpanded] = useState(false); // Error: client hook in server component
422
+ return (/* ... */);
423
+ };
424
+
425
+ // ✅ CORRECT: Keep Unit components as pure presentation components
426
+ export const Card = ({ product, expanded = false }) => {
427
+ return (/* Render based on expanded prop */);
428
+ };
429
+
430
+ // If you need interactivity, handle it in a client component that wraps the Unit:
431
+ // In a client component file:
432
+ "use client";
433
+ import { useState } from "react";
434
+ import { Product } from "@libs/shared/client";
435
+
436
+ export const ExpandableProductCard = ({ product }) => {
437
+ const [expanded, setExpanded] = useState(false);
438
+ return (
439
+ <div>
440
+ <Product.Unit.Card product={product} expanded={expanded} />
441
+ <button onClick={() => setExpanded(!expanded)}>
442
+ {expanded ? "Show Less" : "Show More"}
443
+ </button>
444
+ </div>
445
+ );
446
+ };
447
+ ```
448
+
449
+ ### 2. Image Handling Errors
450
+
451
+ ```
452
+ Error: Image component requires "alt" prop
453
+ ```
454
+
455
+ **Solution**: Always include alt text for images:
456
+
457
+ ```tsx
458
+ // ❌ INCORRECT
459
+ <Image file={product.image} className="w-full" />
460
+
461
+ // ✅ CORRECT
462
+ <Image
463
+ file={product.image}
464
+ alt={product.name || "Product image"}
465
+ className="w-full"
466
+ />
467
+ ```
468
+
469
+ ### 3. Conditional Rendering Issues
470
+
471
+ ```
472
+ Error: Cannot read properties of undefined (reading 'url')
473
+ ```
474
+
475
+ **Solution**: Always check for existence before accessing nested properties:
476
+
477
+ ```tsx
478
+ // ❌ INCORRECT
479
+ <Image file={user.avatar.url} alt={user.name} />;
480
+
481
+ // ✅ CORRECT
482
+ {
483
+ user.avatar?.url && <Image file={user.avatar} alt={user.name} />;
484
+ }
485
+
486
+ // Alternative approach with default/fallback
487
+ {
488
+ user.avatar?.url ? (
489
+ <Image file={user.avatar} alt={user.name} />
490
+ ) : (
491
+ <div className="avatar-placeholder">{user.name.charAt(0).toUpperCase()}</div>
492
+ );
493
+ }
494
+ ```
495
+
496
+ ### 4. Type Safety Issues
497
+
498
+ ```
499
+ Type error: Property 'description' does not exist on type 'LightProduct'
500
+ ```
501
+
502
+ **Solution**: Ensure you're only accessing properties defined in the LightModel:
503
+
504
+ ```tsx
505
+ // In constant.ts
506
+
507
+ export class LightProduct extends via(ProductObject, ["name", "price", "sku"] as const) {
508
+ // Only these fields are guaranteed to be available
509
+ }
510
+
511
+ // ❌ INCORRECT: Accessing properties not in the LightModel
512
+ export const Card = ({ product }: { product: cnst.LightProduct }) => (
513
+ <div>
514
+ <h3>{product.name}</h3>
515
+ <p>{product.description}</p> // Error: description is not in LightProduct
516
+ </div>
517
+ );
518
+
519
+ // ✅ CORRECT: Check for optional properties
520
+ export const Card = ({ product }: { product: cnst.LightProduct }) => (
521
+ <div>
522
+ <h3>{product.name}</h3>
523
+ {/* Use optional chaining for properties that might not exist */}
524
+ {product.description && <p>{product.description}</p>}
525
+ </div>
526
+ );
527
+ ```
528
+
529
+ ## Conclusion
530
+
531
+ Model.Unit.tsx files are essential building blocks in the Akan.js framework, providing consistent, reusable presentation components for your domain models. By following these guidelines, you'll create well-structured, performant, and maintainable UI components that work seamlessly across your application.
532
+
533
+ Key takeaways:
534
+
535
+ - Create multiple component variations (Abstract, Card, Full, etc.) for different use cases
536
+ - Keep components as server components without client-side hooks
537
+ - Focus on presentation only, leaving business logic to Service files
538
+ - Follow consistent prop patterns with className and href support
539
+ - Ensure type safety by respecting LightModel type definitions
540
+
541
+ Well-designed Model.Unit components improve development velocity, maintain UI consistency, and enable seamless component reuse throughout your Akan.js applications.
@@ -0,0 +1,93 @@
1
+ {
2
+ "title": "Model Util",
3
+ "description": "How to create and implement Model.Util.ts files in Akan.js",
4
+ "scans": [
5
+ {
6
+ "type": "example",
7
+ "description": "Model Util examples",
8
+ "path": "{apps,libs}/*/lib/*/*.Util.ts{,x}",
9
+ "sample": 5
10
+ },
11
+ {
12
+ "type": "source",
13
+ "description": "Example of high-quality Model.Util implementation",
14
+ "path": "libs/shared/lib/admin/Admin.Util.tsx"
15
+ },
16
+ {
17
+ "type": "source",
18
+ "description": "Example of complex Model.Util implementation",
19
+ "path": "libs/shared/lib/user/User.Util.tsx"
20
+ },
21
+ {
22
+ "type": "usage",
23
+ "description": "Model Util usage in pages",
24
+ "path": "apps/*/page/**/_index.tsx",
25
+ "filterText": ".Util.",
26
+ "sample": 3
27
+ },
28
+ {
29
+ "type": "usage",
30
+ "description": "Model Util usage in Units",
31
+ "path": "{apps,libs}/*/lib/*/*.Unit.tsx",
32
+ "filterText": ".Util.",
33
+ "sample": 3
34
+ },
35
+ {
36
+ "type": "usage",
37
+ "description": "Model Util usage in Templates",
38
+ "path": "{apps,libs}/*/lib/*/*.Template.tsx",
39
+ "filterText": ".Util.",
40
+ "sample": 2
41
+ },
42
+ {
43
+ "type": "usage",
44
+ "description": "Model Util usage in Views",
45
+ "path": "{apps,libs}/*/lib/*/*.View.tsx",
46
+ "filterText": ".Util.",
47
+ "sample": 3
48
+ },
49
+ {
50
+ "type": "usage",
51
+ "description": "Model Util usage in Zones",
52
+ "path": "{apps,libs}/*/lib/*/*.Zone.tsx",
53
+ "filterText": ".Util.",
54
+ "sample": 3
55
+ },
56
+ {
57
+ "type": "related",
58
+ "description": "Relationship with model.store.ts",
59
+ "path": "{apps,libs}/*/lib/*/*.{store,signal}.ts",
60
+ "sample": 2
61
+ }
62
+ ],
63
+ "update": {
64
+ "filePath": "./modelUtil.instruction.md",
65
+ "contents": [
66
+ "Purpose and role of Model.Util.ts files",
67
+ "How to create Model.Util.ts files",
68
+ "Common patterns and implementations",
69
+ "Using with store actions and state",
70
+ "Using with signal API calls",
71
+ "Performance optimization techniques",
72
+ "How to use Model.Util.ts files in pages",
73
+ "How to use Model.Util.ts files in Units",
74
+ "How to use Model.Util.ts files in Templates",
75
+ "How to use Model.Util.ts files in Views",
76
+ "How to use Model.Util.ts files in Zones",
77
+ "Best practices and error handling"
78
+ ],
79
+ "rules": [
80
+ "Model.Util.tsx is a client component, so it can use client-side hooks like useEffect, useState, etc.",
81
+ "Model.Util.tsx is a utility component to reuse in pages, Units, Templates, Views, and Zones, etc.",
82
+ "Util components should be focused on a single responsibility",
83
+ "Util can be a wrapper component for using in server components",
84
+ "Util can be a wrapper component for store actions or signal api calls",
85
+ "Util components should handle their own loading and error states",
86
+ "Always use TypeScript for type safety in props and returned values",
87
+ "Consider memoization for performance-critical components",
88
+ "Follow consistent naming conventions (e.g., ActionButton, FilterPanel)",
89
+ "Document props with JSDoc comments for better IDE support"
90
+ ]
91
+ },
92
+ "page": "/akanjs/(docs)/docs/module/util/_index.tsx"
93
+ }