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,314 @@
1
+ import { confirm, input, select } from "@inquirer/prompts";
2
+ import { Logger } from "akanjs/common";
3
+ import chalk from "chalk";
4
+ import { type Command, program } from "commander";
5
+
6
+ import { FileSys, getDirname, type PackageJson } from "..";
7
+ import { AppExecutor, Executor, LibExecutor, ModuleExecutor, PkgExecutor, WorkspaceExecutor } from "../executors";
8
+ import { type ArgMeta, getArgMetas, type InternalArgMeta } from "./argMeta";
9
+ import { CommandContainer } from "./dependencyBuilder";
10
+ import { formatCommandHelp, formatHelp } from "./helpFormatter";
11
+ import { type CommandCls, getTargetMetas } from "./targetMeta";
12
+
13
+ const camelToKebabCase = (str: string) => str.replace(/([A-Z])/g, "-$1").toLowerCase();
14
+
15
+ const handleOption = (programCommand: Command, argMeta: ArgMeta) => {
16
+ const {
17
+ type,
18
+ flag = argMeta.name.slice(0, 1).toLowerCase(),
19
+ desc = argMeta.name,
20
+ example,
21
+ enum: enumChoices,
22
+ ask,
23
+ } = argMeta.argsOption;
24
+ const kebabName = camelToKebabCase(argMeta.name);
25
+ const choices = enumChoices?.map((choice: string | number | { label: string; value: string | number | boolean }) =>
26
+ typeof choice === "object"
27
+ ? { value: choice.value, name: choice.label }
28
+ : { value: choice, name: choice.toString() },
29
+ );
30
+ programCommand.option(
31
+ `-${flag}, --${kebabName}${type === "boolean" ? " [boolean]" : ` <${kebabName}>`}`,
32
+ `${desc}${ask ? ` (${ask})` : ""}${example ? ` (example: ${example})` : ""}${choices ? ` (choices: ${choices.map((choice) => choice.name).join(", ")})` : ""}`,
33
+ );
34
+ return programCommand;
35
+ };
36
+ const handleArgument = (programCommand: Command, argMeta: ArgMeta) => {
37
+ const kebabName = camelToKebabCase(argMeta.name);
38
+ programCommand.argument(
39
+ `[${kebabName}]`,
40
+ `${argMeta.argsOption.desc}${argMeta.argsOption.example ? ` (example: ${argMeta.argsOption.example})` : ""}`,
41
+ );
42
+ return programCommand;
43
+ };
44
+
45
+ const convertArgValue = (value: string | boolean, type: "string" | "number" | "boolean") => {
46
+ if (type === "string") return value as string;
47
+ else if (type === "number") return Number(value);
48
+ else return value === true || value === "true";
49
+ };
50
+
51
+ const getOptionValue = async (argMeta: ArgMeta, opt: Record<string, unknown>) => {
52
+ const {
53
+ name,
54
+ argsOption: { enum: enumChoices, default: defaultValue, type, desc, nullable, example, ask },
55
+ } = argMeta;
56
+ if (opt[argMeta.name] !== undefined) return convertArgValue(opt[argMeta.name] as string, type ?? "string");
57
+ else if (defaultValue !== undefined) return defaultValue;
58
+ else if (nullable) return null;
59
+
60
+ if (enumChoices) {
61
+ const choices = enumChoices.map((choice: string | number | { label: string; value: string | number | boolean }) =>
62
+ typeof choice === "object"
63
+ ? { value: choice.value, name: choice.label }
64
+ : { value: choice, name: choice.toString() },
65
+ );
66
+ const choice = await select({ message: ask ?? desc ?? `Select the ${name} value`, choices });
67
+ return choice;
68
+ } else if (type === "boolean") {
69
+ const message = ask ?? desc ?? `Do you want to set ${name}? ${desc ? ` (${desc})` : ""}: `;
70
+ return await confirm({ message });
71
+ } else {
72
+ const message = ask
73
+ ? `${ask}: `
74
+ : desc
75
+ ? `${desc}: `
76
+ : `Enter the ${name} value${example ? ` (example: ${example})` : ""}: `;
77
+ if (argMeta.argsOption.nullable) return await input({ message });
78
+ else return convertArgValue(await input({ message }), type ?? "string");
79
+ }
80
+ };
81
+
82
+ const getArgumentValue = async (argMeta: ArgMeta, value: string | undefined) => {
83
+ const {
84
+ name,
85
+ argsOption: { default: defaultValue, type, desc, nullable, example, ask },
86
+ } = argMeta;
87
+ if (value !== undefined) return convertArgValue(value, type ?? "string");
88
+ else if (defaultValue !== undefined) return defaultValue;
89
+ else if (nullable) return null;
90
+
91
+ const message = ask
92
+ ? `${ask}: `
93
+ : desc
94
+ ? `${desc}: `
95
+ : `Enter the ${name} value${example ? ` (example: ${example})` : ""}: `;
96
+ return convertArgValue(await input({ message }), type ?? "string");
97
+ };
98
+
99
+ const assertCurrentDirectoryIsWorkspaceRoot = async () => {
100
+ const cwd = process.cwd();
101
+ const [hasPackageJson, hasTsConfig, hasEnv] = await Promise.all([
102
+ FileSys.fileExists(`${cwd}/package.json`),
103
+ FileSys.fileExists(`${cwd}/tsconfig.json`),
104
+ FileSys.fileExists(`${cwd}/.env`),
105
+ ]);
106
+ if (hasPackageJson && hasTsConfig && hasEnv) return;
107
+
108
+ throw new Error(
109
+ [
110
+ "Akan CLI commands must be run from the workspace root.",
111
+ `Current directory: ${cwd}`,
112
+ "Move to the directory that contains package.json, tsconfig.json, and .env, then run the command again.",
113
+ ].join("\n"),
114
+ );
115
+ };
116
+
117
+ const getInternalArgumentValue = async (
118
+ argMeta: InternalArgMeta,
119
+ value: string | undefined,
120
+ workspace: WorkspaceExecutor,
121
+ ) => {
122
+ if (argMeta.type === "Workspace") return workspace;
123
+ const sysType = argMeta.type.toLowerCase();
124
+ const [appNames, libNames, pkgNames] = await workspace.getExecs();
125
+ if (sysType === "sys") {
126
+ if (value && appNames.includes(value)) return AppExecutor.from(workspace, value);
127
+ else if (value && libNames.includes(value)) return LibExecutor.from(workspace, value);
128
+ else {
129
+ const sysName = await select<string>({
130
+ message: `Select the App or Lib name`,
131
+ choices: [...appNames, ...libNames],
132
+ });
133
+ if (appNames.includes(sysName)) return AppExecutor.from(workspace, sysName);
134
+ else if (libNames.includes(sysName)) return LibExecutor.from(workspace, sysName);
135
+ else throw new Error(`Invalid system name: ${sysName}`);
136
+ }
137
+ } else if (sysType === "exec") {
138
+ if (value && appNames.includes(value)) return AppExecutor.from(workspace, value);
139
+ else if (value && libNames.includes(value)) return LibExecutor.from(workspace, value);
140
+ else if (value && pkgNames.includes(value)) return PkgExecutor.from(workspace, value);
141
+ else {
142
+ const execName = await select<string>({
143
+ message: `Select the App or Lib or Pkg name`,
144
+ choices: [...appNames, ...libNames, ...pkgNames],
145
+ });
146
+ if (appNames.includes(execName)) return AppExecutor.from(workspace, execName);
147
+ else if (libNames.includes(execName)) return LibExecutor.from(workspace, execName);
148
+ else if (pkgNames.includes(execName)) return PkgExecutor.from(workspace, execName);
149
+ else throw new Error(`Invalid system name: ${execName}`);
150
+ }
151
+ } else if (sysType === "app") {
152
+ if (value && appNames.includes(value)) return AppExecutor.from(workspace, value);
153
+ const appName = await select<string>({ message: `Select the ${sysType} name`, choices: appNames });
154
+ return AppExecutor.from(workspace, appName);
155
+ } else if (sysType === "lib") {
156
+ if (value && libNames.includes(value)) return LibExecutor.from(workspace, value);
157
+ const libName = await select<string>({ message: `Select the ${sysType} name`, choices: libNames });
158
+ return LibExecutor.from(workspace, libName);
159
+ } else if (sysType === "pkg") {
160
+ const pkgs = await workspace.getPkgs();
161
+ if (value && pkgs.includes(value)) return PkgExecutor.from(workspace, value);
162
+ const pkgName = await select<string>({ message: `Select the ${sysType} name`, choices: pkgs });
163
+ return PkgExecutor.from(workspace, pkgName);
164
+ } else if (sysType === "module") {
165
+ if (value) {
166
+ const [sysName, moduleName] = value.split(":");
167
+ if (!sysName || !moduleName) throw new Error(`Invalid module name: ${value}`);
168
+ if (appNames.includes(sysName)) {
169
+ const app = AppExecutor.from(workspace, sysName);
170
+ const modules = await app.getModules();
171
+ if (modules.includes(moduleName)) return ModuleExecutor.from(app, moduleName);
172
+ else throw new Error(`Invalid module name: ${moduleName}`);
173
+ } else if (libNames.includes(sysName)) {
174
+ const lib = LibExecutor.from(workspace, sysName);
175
+ const modules = await lib.getModules();
176
+ if (modules.includes(moduleName)) return ModuleExecutor.from(lib, moduleName);
177
+ } else throw new Error(`Invalid system name: ${sysName}`);
178
+ }
179
+ const { type, name } = await select<{ type: "app" | "lib"; name: string }>({
180
+ message: `select the App or Lib name`,
181
+ choices: [
182
+ ...appNames.map((name) => ({ name, value: { type: "app" as const, name } })),
183
+ ...libNames.map((name) => ({ name, value: { type: "lib" as const, name } })),
184
+ ],
185
+ });
186
+ const executor = type === "app" ? AppExecutor.from(workspace, name) : LibExecutor.from(workspace, name);
187
+ const modules = await executor.getModules();
188
+ const moduleName = await select<string>({
189
+ message: `Select the module name`,
190
+ choices: modules.map((name) => ({ name: `${executor.name}:${name}`, value: name })),
191
+ });
192
+ return ModuleExecutor.from(executor, moduleName);
193
+ } else throw new Error(`Invalid system type: ${argMeta.type}`);
194
+ };
195
+
196
+ export const runCommands = async (...commands: CommandCls[]) => {
197
+ process.on("unhandledRejection", (error) => {
198
+ process.exit(1);
199
+ });
200
+ const __dirname = getDirname(import.meta.url);
201
+ const hasPackageJson = await FileSys.fileExists(`${__dirname}/../package.json`);
202
+ process.env.AKAN_VERSION = hasPackageJson
203
+ ? (await FileSys.readJson<PackageJson>(`${__dirname}/../package.json`)).version
204
+ : "0.0.1";
205
+
206
+ const hasHelpFlag = process.argv.includes("--help") || process.argv.includes("-h");
207
+ const hasCommand = process.argv.length > 2 && !process.argv[2]?.startsWith("-");
208
+
209
+ if (hasHelpFlag || !hasCommand) {
210
+ if (process.argv.length === 2 || (process.argv.length === 3 && hasHelpFlag)) {
211
+
212
+ Logger.rawLog(formatHelp(commands, process.env.AKAN_VERSION));
213
+ process.exit(0);
214
+ }
215
+ }
216
+
217
+ program.version(process.env.AKAN_VERSION).description("Akan CLI").configureHelp({
218
+ helpWidth: 100,
219
+ });
220
+ const installedAkanPackageJson = (await FileSys.fileExists("./node_modules/akanjs/package.json"))
221
+ ? await FileSys.readJson<PackageJson>("./node_modules/akanjs/package.json")
222
+ : null;
223
+ if (installedAkanPackageJson && installedAkanPackageJson.version !== process.env.AKAN_VERSION) {
224
+ Logger.rawLog(
225
+ chalk.yellow(
226
+ `
227
+ Akan CLI version is mismatch with installed package. ${process.env.AKAN_VERSION} (global) vs ${installedAkanPackageJson.version} (akanjs)
228
+ It may cause unexpected behavior. Run \`akan update\` to update latest akanjs.`,
229
+ ),
230
+ );
231
+ }
232
+
233
+ for (const command of commands) {
234
+ const targetMetas = getTargetMetas(command);
235
+ for (const targetMeta of targetMetas) {
236
+ const kebabKey = camelToKebabCase(targetMeta.key);
237
+ const commandNames =
238
+ targetMeta.targetOption.short === true
239
+ ? [
240
+ kebabKey,
241
+ typeof targetMeta.targetOption.short === "string"
242
+ ? targetMeta.targetOption.short
243
+ : kebabKey
244
+ .split("-")
245
+ .map((s) => s.slice(0, 1))
246
+ .join(""),
247
+ ]
248
+ : [kebabKey];
249
+ for (const commandName of commandNames) {
250
+ let programCommand = program.command(commandName, {
251
+ hidden: targetMeta.targetOption.devOnly,
252
+ });
253
+ const [allArgMetas] = getArgMetas(command, targetMeta.key);
254
+ for (const argMeta of allArgMetas) {
255
+ if (argMeta.type === "Option") programCommand = handleOption(programCommand, argMeta);
256
+ else if (argMeta.type === "Argument") programCommand = handleArgument(programCommand, argMeta);
257
+ else if (argMeta.type === "Workspace") continue;
258
+ else if (argMeta.type === "Module") {
259
+ programCommand = programCommand.argument(
260
+ `[sys-name:module-name]`,
261
+ `${argMeta.type} in this workspace (apps|libs)/<sys-name>/lib/<module-name>`,
262
+ );
263
+ } else {
264
+ const sysType = argMeta.type.toLowerCase();
265
+ programCommand = programCommand.argument(
266
+ `[${sysType}]`,
267
+ `${sysType} in this workspace ${sysType}s/<${sysType}Name>`,
268
+ );
269
+ }
270
+ }
271
+ programCommand = programCommand.option(`-v, --verbose [boolean]`, `verbose output`);
272
+
273
+ programCommand.helpInformation = () => {
274
+ return formatCommandHelp(command, targetMeta.key);
275
+ };
276
+
277
+ programCommand.action(async (...args: unknown[]) => {
278
+ Logger.rawLog();
279
+ const cmdArgs = args.slice(0, args.length - 2);
280
+ const opt = args[args.length - 2] as Record<string, unknown>;
281
+ const commandArgs = [] as unknown[];
282
+ if (targetMeta.targetOption.runsOnWorkspaceRoot) await assertCurrentDirectoryIsWorkspaceRoot();
283
+ const workspace = WorkspaceExecutor.fromRoot();
284
+ for (const argMeta of allArgMetas) {
285
+ if (argMeta.type === "Option") commandArgs[argMeta.idx] = await getOptionValue(argMeta, opt);
286
+ else if (argMeta.type === "Argument")
287
+ commandArgs[argMeta.idx] = await getArgumentValue(argMeta, cmdArgs[argMeta.idx] as string);
288
+ else
289
+ commandArgs[argMeta.idx] = await getInternalArgumentValue(
290
+ argMeta as InternalArgMeta,
291
+ cmdArgs[argMeta.idx] as string,
292
+ workspace,
293
+ );
294
+
295
+ if (commandArgs[argMeta.idx] instanceof AppExecutor)
296
+ process.env.AKAN_PUBLIC_APP_NAME = (commandArgs[argMeta.idx] as AppExecutor).name;
297
+ if ((opt as { verbose?: boolean }).verbose) Executor.setVerbose(true);
298
+ }
299
+ const cmd = CommandContainer.get(command);
300
+
301
+ try {
302
+ await targetMeta.handler.call(cmd, ...commandArgs);
303
+ Logger.rawLog();
304
+ } catch (e) {
305
+ const errMsg = e instanceof Error ? e.message : typeof e === "string" ? e : JSON.stringify(e);
306
+ Logger.rawLog(`\n${chalk.red(errMsg)}`);
307
+ throw e;
308
+ }
309
+ });
310
+ }
311
+ }
312
+ }
313
+ await program.parseAsync(process.argv);
314
+ };
@@ -0,0 +1,188 @@
1
+ import type { ArgMeta, ArgsOption, InternalArgMeta, InternalArgToken, PrimitiveArgType } from "./argMeta";
2
+ import { normalizePrimitiveArgType } from "./argMeta";
3
+ import { assertUniqueDependencies, type DependencyInstanceMap, injectDependencies } from "./dependencyBuilder";
4
+ import { COMMAND_META, type CommandCls, type TargetMeta, type TargetOption } from "./targetMeta";
5
+ import type { DependencyCls, DependencyKey } from "./types";
6
+
7
+ type PrimitiveValue<T extends PrimitiveArgType> = T extends StringConstructor
8
+ ? string
9
+ : T extends NumberConstructor
10
+ ? number
11
+ : boolean;
12
+ type ArgsOptionInput = Record<string, never> | ArgsOption;
13
+ type MaybeNullable<Value, Option extends ArgsOptionInput> = Option extends { nullable: true } ? Value | null : Value;
14
+ type AddArg<Params extends unknown[], Type extends PrimitiveArgType, Option extends ArgsOptionInput> = [
15
+ ...Params,
16
+ MaybeNullable<PrimitiveValue<Type>, Option>,
17
+ ];
18
+ type AddInternalArg<Params extends unknown[], Token extends InternalArgToken> = [...Params, Token["_value"]];
19
+ type AddInternalArgs<Params extends unknown[], Tokens extends readonly InternalArgToken[]> = Tokens extends readonly [
20
+ infer Head extends InternalArgToken,
21
+ ...infer Rest extends InternalArgToken[],
22
+ ]
23
+ ? AddInternalArgs<AddInternalArg<Params, Head>, Rest>
24
+ : Params;
25
+ type CommandHandler<Deps extends readonly DependencyCls[], Params extends unknown[]> = (
26
+ this: DependencyInstanceMap<Deps>,
27
+ ...args: Params
28
+ ) => unknown | Promise<unknown>;
29
+
30
+ class TargetBuilder<Deps extends readonly DependencyCls[], Params extends unknown[] = []> {
31
+ readonly #args: (ArgMeta | InternalArgMeta)[];
32
+
33
+ constructor(
34
+ private readonly targetOption: TargetOption,
35
+ args: (ArgMeta | InternalArgMeta)[] = [],
36
+ ) {
37
+ this.#args = args;
38
+ }
39
+
40
+ arg<Type extends PrimitiveArgType, Option extends ArgsOptionInput = Record<string, never>>(
41
+ name: string,
42
+ type: Type,
43
+ argsOption: Option = {} as Option,
44
+ ): TargetBuilder<Deps, AddArg<Params, Type, Option>> {
45
+ return new TargetBuilder(this.targetOption, [
46
+ ...this.#args,
47
+ {
48
+ name,
49
+ argsOption: { ...argsOption, type: normalizePrimitiveArgType(type) },
50
+ key: "",
51
+ idx: this.#args.length,
52
+ type: "Argument",
53
+ },
54
+ ]);
55
+ }
56
+
57
+ option<Type extends PrimitiveArgType, Option extends ArgsOptionInput = Record<string, never>>(
58
+ name: string,
59
+ type: Type,
60
+ argsOption: Option = {} as Option,
61
+ ): TargetBuilder<Deps, AddArg<Params, Type, Option>> {
62
+ return new TargetBuilder(this.targetOption, [
63
+ ...this.#args,
64
+ {
65
+ name,
66
+ argsOption: { ...argsOption, type: normalizePrimitiveArgType(type) },
67
+ key: "",
68
+ idx: this.#args.length,
69
+ type: "Option",
70
+ },
71
+ ]);
72
+ }
73
+
74
+ with<Tokens extends readonly InternalArgToken[]>(
75
+ ...tokens: Tokens
76
+ ): TargetBuilder<Deps, AddInternalArgs<Params, Tokens>> {
77
+ return new TargetBuilder(this.targetOption, [
78
+ ...this.#args,
79
+ ...tokens.map(
80
+ (token, offset) =>
81
+ ({
82
+ key: "",
83
+ idx: this.#args.length + offset,
84
+ type: token.type,
85
+ }) satisfies InternalArgMeta,
86
+ ),
87
+ ]);
88
+ }
89
+
90
+ exec(handler: CommandHandler<Deps, Params>) {
91
+ return {
92
+ args: this.#args,
93
+ handler: handler as TargetMeta["handler"],
94
+ targetOption: this.targetOption,
95
+ };
96
+ }
97
+ }
98
+
99
+ type TargetDefinition = ReturnType<TargetBuilder<readonly DependencyCls[], unknown[]>["exec"]>;
100
+ type CommandBuilderContext<Deps extends readonly DependencyCls[]> = {
101
+ public: (targetOption?: Omit<TargetOption, "type">) => TargetBuilder<Deps>;
102
+ cloud: (targetOption?: Omit<TargetOption, "type">) => TargetBuilder<Deps>;
103
+ dev: (targetOption?: Omit<TargetOption, "type">) => TargetBuilder<Deps>;
104
+ arg: <Type extends PrimitiveArgType, Option extends ArgsOptionInput = Record<string, never>>(
105
+ name: string,
106
+ type: Type,
107
+ argsOption?: Option,
108
+ ) => ArgMeta;
109
+ option: <Type extends PrimitiveArgType, Option extends ArgsOptionInput = Record<string, never>>(
110
+ name: string,
111
+ type: Type,
112
+ argsOption?: Option,
113
+ ) => ArgMeta;
114
+ };
115
+ type CommandBuilder<Deps extends readonly DependencyCls[]> = (
116
+ context: CommandBuilderContext<Deps>,
117
+ ) => Record<string, TargetDefinition>;
118
+
119
+ const createTarget =
120
+ <Deps extends readonly DependencyCls[]>(type: TargetOption["type"]) =>
121
+ (targetOption: Omit<TargetOption, "type"> = {}) =>
122
+ new TargetBuilder<Deps>({ runsOnWorkspaceRoot: true, ...targetOption, type });
123
+
124
+ const createContext = <Deps extends readonly DependencyCls[]>(): CommandBuilderContext<Deps> => ({
125
+ public: createTarget<Deps>("public"),
126
+ cloud: createTarget<Deps>("cloud"),
127
+ dev: createTarget<Deps>("dev"),
128
+ arg: (name, type, argsOption) => ({
129
+ name,
130
+ argsOption: { ...(argsOption ?? {}), type: normalizePrimitiveArgType(type) },
131
+ key: "",
132
+ idx: -1,
133
+ type: "Argument",
134
+ }),
135
+ option: (name, type, argsOption) => ({
136
+ name,
137
+ argsOption: { ...(argsOption ?? {}), type: normalizePrimitiveArgType(type) },
138
+ key: "",
139
+ idx: -1,
140
+ type: "Option",
141
+ }),
142
+ });
143
+
144
+ const buildCommandMeta = (definitions: Record<string, TargetDefinition>) => {
145
+ const commandMeta = new Map<string, TargetMeta>();
146
+ for (const [key, definition] of Object.entries(definitions)) {
147
+ commandMeta.set(key, {
148
+ key,
149
+ args: definition.args.map((arg) => ({ ...arg, key })),
150
+ handler: definition.handler,
151
+ targetOption: definition.targetOption,
152
+ });
153
+ }
154
+ return commandMeta;
155
+ };
156
+
157
+ export function command<RefName extends string, Deps extends readonly DependencyCls[]>(
158
+ refName: RefName,
159
+ deps: Deps,
160
+ builder: CommandBuilder<Deps>,
161
+ ): CommandCls<DependencyInstanceMap<Deps>, DependencyKey<RefName, "command">>;
162
+ export function command<RefName extends string>(
163
+ refName: RefName,
164
+ builder: CommandBuilder<[]>,
165
+ ): CommandCls<DependencyInstanceMap<[]>, DependencyKey<RefName, "command">>;
166
+ export function command<RefName extends string, Deps extends readonly DependencyCls[]>(
167
+ refName: RefName,
168
+ depsOrBuilder: Deps | CommandBuilder<[]>,
169
+ builder?: CommandBuilder<Deps>,
170
+ ) {
171
+ const deps = (Array.isArray(depsOrBuilder) ? depsOrBuilder : []) as unknown as Deps;
172
+ const commandBuilder = (Array.isArray(depsOrBuilder) ? builder : depsOrBuilder) as CommandBuilder<Deps>;
173
+ assertUniqueDependencies(deps);
174
+ const commandMeta = buildCommandMeta(commandBuilder(createContext<Deps>()));
175
+
176
+ class CommandBase {
177
+ static readonly refName = refName;
178
+ static readonly dependencyKind = "command";
179
+ static readonly dependencyKey = `${refName}Command` as const;
180
+ static readonly [COMMAND_META] = commandMeta;
181
+
182
+ constructor() {
183
+ injectDependencies(this, deps);
184
+ }
185
+ }
186
+
187
+ return CommandBase as unknown as CommandCls<DependencyInstanceMap<Deps>, DependencyKey<RefName, "command">>;
188
+ }
@@ -0,0 +1,6 @@
1
+ import type { Cls } from "./types";
2
+
3
+ export const Commands = () => {
4
+ return (target: Cls) => {
5
+ };
6
+ };
@@ -0,0 +1,100 @@
1
+ import type { DependencyCls, DependencyKey, DependencyKind } from "./types";
2
+
3
+ type UnionToIntersection<Union> = (Union extends unknown ? (value: Union) => void : never) extends (
4
+ value: infer Intersection,
5
+ ) => void
6
+ ? Intersection
7
+ : never;
8
+
9
+ type DependencyToField<Dep> = Dep extends DependencyCls<infer Instance, infer Key> ? { [K in Key]: Instance } : never;
10
+
11
+ export type DependencyInstanceMap<Deps extends readonly DependencyCls[]> = [Deps[number]] extends [never]
12
+ ? Record<PropertyKey, never>
13
+ : UnionToIntersection<DependencyToField<Deps[number]>>;
14
+
15
+ const capitalize = (value: string) => value.slice(0, 1).toUpperCase() + value.slice(1);
16
+
17
+ const createDependencyKey = <RefName extends string, Kind extends DependencyKind>(
18
+ refName: RefName,
19
+ kind: Kind,
20
+ ): DependencyKey<RefName, Kind> => `${refName}${capitalize(kind)}` as DependencyKey<RefName, Kind>;
21
+
22
+ export class CommandContainer {
23
+ static #instances = new Map<DependencyCls, unknown>();
24
+ static #resolving = new Set<DependencyCls>();
25
+
26
+ static get<T>(dep: DependencyCls<T>): T {
27
+ const instance = CommandContainer.#instances.get(dep);
28
+ if (instance) return instance as T;
29
+ if (CommandContainer.#resolving.has(dep)) throw new Error(`Circular command dependency: ${dep.name}`);
30
+ CommandContainer.#resolving.add(dep);
31
+ try {
32
+ const nextInstance = new dep();
33
+ CommandContainer.#instances.set(dep, nextInstance);
34
+ return nextInstance;
35
+ } finally {
36
+ CommandContainer.#resolving.delete(dep);
37
+ }
38
+ }
39
+
40
+ static clear() {
41
+ CommandContainer.#instances.clear();
42
+ CommandContainer.#resolving.clear();
43
+ }
44
+ }
45
+
46
+ export const getDependencyKey = (dep: DependencyCls) => dep.dependencyKey;
47
+
48
+ export const assertUniqueDependencies = (deps: readonly DependencyCls[]) => {
49
+ const keys = new Map<string, DependencyCls>();
50
+ const classes = new Set<DependencyCls>();
51
+ for (const dep of deps) {
52
+ if (classes.has(dep)) throw new Error(`Duplicate command dependency class: ${dep.name}`);
53
+ classes.add(dep);
54
+ const key = getDependencyKey(dep);
55
+ const existing = keys.get(key);
56
+ if (existing) throw new Error(`Duplicate command dependency key "${key}": ${existing.name}, ${dep.name}`);
57
+ keys.set(key, dep);
58
+ }
59
+ };
60
+
61
+ export const injectDependencies = <Deps extends readonly DependencyCls[]>(target: object, deps: Deps) => {
62
+ assertUniqueDependencies(deps);
63
+ for (const dep of deps) {
64
+ Object.defineProperty(target, getDependencyKey(dep), {
65
+ configurable: true,
66
+ enumerable: false,
67
+ value: CommandContainer.get(dep),
68
+ writable: false,
69
+ });
70
+ }
71
+ return target as typeof target & DependencyInstanceMap<Deps>;
72
+ };
73
+
74
+ export const runner = <RefName extends string>(refName: RefName) => {
75
+ class RunnerBase {
76
+ static readonly refName = refName;
77
+ static readonly dependencyKind = "runner";
78
+ static readonly dependencyKey = createDependencyKey(refName, "runner");
79
+ }
80
+
81
+ return RunnerBase as unknown as DependencyCls<InstanceType<typeof RunnerBase>, DependencyKey<RefName, "runner">>;
82
+ };
83
+
84
+ export const script = <RefName extends string, Deps extends readonly DependencyCls[]>(
85
+ refName: RefName,
86
+ deps: Deps = [] as unknown as Deps,
87
+ ) => {
88
+ assertUniqueDependencies(deps);
89
+ class ScriptBase {
90
+ static readonly refName = refName;
91
+ static readonly dependencyKind = "script";
92
+ static readonly dependencyKey = createDependencyKey(refName, "script");
93
+
94
+ constructor() {
95
+ injectDependencies(this, deps);
96
+ }
97
+ }
98
+
99
+ return ScriptBase as unknown as DependencyCls<DependencyInstanceMap<Deps>, DependencyKey<RefName, "script">>;
100
+ };