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,158 @@
1
+ import { confirm } from "@inquirer/prompts";
2
+ import { Logger, sleep } from "akanjs/common";
3
+ import {
4
+ AiSession,
5
+ akanCloudHost,
6
+ akanCloudUrl,
7
+ getHostConfig,
8
+ getSelf,
9
+ runner,
10
+ setHostConfig,
11
+ type Workspace,
12
+ } from "akanjs/devkit";
13
+ import chalk from "chalk";
14
+ import latestVersion from "latest-version";
15
+ import open from "open";
16
+ import * as QRcode from "qrcode";
17
+ import { v4 as uuidv4 } from "uuid";
18
+
19
+ export class CloudRunner extends runner("cloud") {
20
+ async login() {
21
+ const config = await getHostConfig();
22
+ const self = config.auth ? await getSelf(config.auth.token) : null;
23
+ if (self) {
24
+ Logger.rawLog(chalk.green(`\n✓ Already logged in akan cloud as ${self.nickname}\n`));
25
+ return true;
26
+ }
27
+ const remoteId = uuidv4();
28
+ const signinUrl = `${akanCloudUrl}/signin?remoteId=${remoteId}`;
29
+
30
+ Logger.rawLog(chalk.bold(`\n${chalk.green("➤")} Authentication Required`));
31
+ Logger.rawLog(chalk.dim("Please visit or click the following URL:"));
32
+ Logger.rawLog(`${chalk.cyan.underline(signinUrl)}\n`);
33
+
34
+ try {
35
+ const qrcode = await new Promise<string>((resolve, reject) => {
36
+ QRcode.toString(signinUrl, { type: "terminal", small: true }, (err, data) => {
37
+ if (err) reject(err);
38
+ resolve(data);
39
+ });
40
+ });
41
+ Logger.rawLog(qrcode);
42
+ await open(signinUrl);
43
+ Logger.rawLog(chalk.dim("Opening browser..."));
44
+ } catch {
45
+ Logger.rawLog(chalk.yellow("Could not open browser. Please visit the URL manually."));
46
+ }
47
+
48
+ Logger.rawLog(chalk.dim("Waiting for authentication..."));
49
+ const MAX_RETRY = 300;
50
+ for (let i = 0; i < MAX_RETRY; i++) {
51
+ const res = await fetch(`${akanCloudUrl}/user/getRemoteAuthToken/${remoteId}`);
52
+ const { jwt } = (await res.json()) as { jwt: string | null };
53
+ const self = jwt ? await getSelf(jwt) : null;
54
+ if (jwt && self) {
55
+ setHostConfig(akanCloudHost, { auth: { token: jwt, self } });
56
+ Logger.rawLog(chalk.green(`\r✓ Authentication successful!`));
57
+ Logger.rawLog(chalk.green.bold(`\n✨ Welcome aboard, ${self.nickname}!`));
58
+ Logger.rawLog(chalk.dim("You're now ready to use Akan CLI!\n"));
59
+ return true;
60
+ }
61
+ await sleep(2000);
62
+ }
63
+ throw new Error(chalk.red("✖ Authentication timed out after 10 minutes. Please try again."));
64
+ }
65
+ async logout() {
66
+ const config = await getHostConfig();
67
+ if (config.auth) {
68
+ setHostConfig(akanCloudHost, {});
69
+ Logger.rawLog(chalk.magenta.bold(`\n👋 Goodbye, ${config.auth.self.nickname}!`));
70
+ Logger.rawLog(chalk.dim("───────────────────────────────────────────────\n"));
71
+ Logger.rawLog(chalk.cyan("You have been successfully logged out."));
72
+ Logger.rawLog(chalk.dim("Thank you for using Akan CLI. Come back soon! 🌟\n"));
73
+ } else {
74
+ Logger.rawLog(chalk.yellow.bold("\n⚠️ No active session found"));
75
+ Logger.rawLog(chalk.dim("You were not logged in to begin with\n"));
76
+ }
77
+ }
78
+ async setLlm() {
79
+ await AiSession.init({ useExisting: true });
80
+ }
81
+ resetLlm() {
82
+ AiSession.setLlmConfig(null);
83
+ Logger.rawLog(chalk.green("☑️ LLM model config is cleared. Please run `akan set-llm` to set a new LLM model."));
84
+ }
85
+ async getAkanPkgs(workspace: Workspace) {
86
+ const pkgs = await workspace.getPkgs();
87
+ return pkgs.filter((pkg) => pkg === "akanjs" || pkg === "create-akan-workspace");
88
+ }
89
+ async deployAkan(workspace: Workspace, akanPkgs: string[]) {
90
+ const akanPackageJson = (await workspace.readJson("pkgs/akanjs/package.json")) as { version: string };
91
+ const [majorVersion, minorVersion, patchVersion, devPatchVersion] = akanPackageJson.version.split(".");
92
+ const isOfficialRelease = !devPatchVersion;
93
+ const targetVersionPrefix = isOfficialRelease
94
+ ? `${majorVersion}.${minorVersion}`
95
+ : `${majorVersion}.${minorVersion}.${patchVersion}`;
96
+ const tag = isOfficialRelease ? "latest" : (patchVersion.split("-").at(1) ?? "dev");
97
+ const getNextVersion = async (prefix: string, tag: string) => {
98
+ try {
99
+ const latestPublishedVersion = await latestVersion("akanjs", { version: tag });
100
+ const latestPatch = latestPublishedVersion.startsWith(prefix)
101
+ ? parseInt(latestPublishedVersion.split(".").at(-1) ?? "-1")
102
+ : -1;
103
+ const nextVersion = `${prefix}.${latestPatch + 1}`;
104
+ return { nextVersion, latestPublishedVersion };
105
+ } catch (e) {
106
+ return { nextVersion: `${prefix}.0`, latestPublishedVersion: null };
107
+ }
108
+ };
109
+ const { nextVersion, latestPublishedVersion } = await getNextVersion(targetVersionPrefix, tag);
110
+ Logger.info(`Latest published version of akanjs: ${latestPublishedVersion ?? "none"}`);
111
+ Logger.info(`Next version of akanjs: ${nextVersion}`);
112
+ for (const library of akanPkgs) {
113
+ const packageJson = (await workspace.readJson(`pkgs/${library}/package.json`)) as { version: string };
114
+ const newPackageJsonStr = JSON.stringify({ ...packageJson, version: nextVersion }, null, 2);
115
+ await workspace.writeFile(`pkgs/${library}/package.json`, newPackageJsonStr);
116
+ const distPackageJson = (await workspace.readJson(`dist/pkgs/${library}/package.json`)) as {
117
+ version: string;
118
+ dependencies?: Record<string, string>;
119
+ };
120
+ const newDistPackageJson = { ...distPackageJson, version: nextVersion };
121
+ await workspace.writeJson(`dist/pkgs/${library}/package.json`, newDistPackageJson);
122
+ }
123
+ const isDeployConfirmed = await confirm({
124
+ message: "Are you sure you want to deploy the libraries?",
125
+ });
126
+ if (!isDeployConfirmed) {
127
+ Logger.error("Deployment cancelled");
128
+ return;
129
+ }
130
+
131
+ await Promise.all(
132
+ akanPkgs.map(async (library) => {
133
+ Logger.info(`Publishing ${library}@${nextVersion} to npm...`);
134
+ await workspace.exec(`npm publish --tag ${tag}`, { cwd: `dist/pkgs/${library}` });
135
+ Logger.info(`${library}@${nextVersion} is published to npm`);
136
+ }),
137
+ );
138
+ Logger.info("All libraries are published to npm");
139
+ }
140
+ async update(workspace: Workspace, tag: string = "latest") {
141
+ if (!(await workspace.exists("package.json")))
142
+ await workspace.spawn("npm", ["update", "-g", "akanjs", "--latest", `--tag=${tag}`]);
143
+ else
144
+ await Promise.all([
145
+ workspace.spawn("npm", ["update", "-g", "akanjs", "--latest", `--tag=${tag}`]),
146
+ this.#updateAkanPkgs(workspace, tag),
147
+ ]);
148
+ }
149
+ async #updateAkanPkgs(workspace: Workspace, tag: string = "latest") {
150
+ const latestPublishedVersion = await latestVersion("akanjs", { version: tag });
151
+ const rootPackageJson = await workspace.getPackageJson();
152
+ if (!rootPackageJson.dependencies) throw new Error("No dependencies found in package.json");
153
+ if (rootPackageJson.dependencies.akanjs) rootPackageJson.dependencies.akanjs = latestPublishedVersion;
154
+ if (rootPackageJson.devDependencies?.akanjs) rootPackageJson.devDependencies.akanjs = latestPublishedVersion;
155
+ workspace.setPackageJson(rootPackageJson);
156
+ await workspace.spawn("bun", ["install"]);
157
+ }
158
+ }
@@ -0,0 +1,40 @@
1
+ import { Logger } from "akanjs/common";
2
+ import { AiSession, PkgExecutor, script, type Workspace } from "akanjs/devkit";
3
+ import { ApplicationScript } from "../application/application.script";
4
+ import { PackageScript } from "../package/package.script";
5
+ import { CloudRunner } from "./cloud.runner";
6
+
7
+ export class CloudScript extends script("cloud", [CloudRunner, ApplicationScript, PackageScript]) {
8
+ async login(workspace: Workspace) {
9
+ await this.cloudRunner.login();
10
+ }
11
+ async logout(workspace: Workspace) {
12
+ await this.cloudRunner.logout();
13
+ }
14
+ async setLlm(workspace: Workspace) {
15
+ await this.cloudRunner.setLlm();
16
+ }
17
+ resetLlm(workspace: Workspace) {
18
+ this.cloudRunner.resetLlm();
19
+ }
20
+ async ask(question: string, workspace: Workspace) {
21
+ const session = new AiSession("general", { workspace, isContinued: true });
22
+ await session.ask(question);
23
+ }
24
+ async deployAkan(workspace: Workspace, { test = true }: { test?: boolean } = {}) {
25
+ const akanPkgs = await this.cloudRunner.getAkanPkgs(workspace);
26
+ await this.packageScript.updateWorskpaceRootPackageJson(workspace);
27
+ const pkgs = akanPkgs.map((pkgName) => PkgExecutor.from(workspace, pkgName));
28
+ if (test) for (const pkg of pkgs) if (pkg.name !== "@akanjs/test") await this.applicationScript.test(pkg);
29
+ for (const pkg of pkgs) await this.packageScript.buildPackage(pkg);
30
+
31
+ await this.cloudRunner.deployAkan(workspace, akanPkgs);
32
+ }
33
+ async update(workspace: Workspace, tag: string = "latest") {
34
+ const spinner = workspace.spinning("Updating Akan.js packages and CLI...");
35
+ await this.cloudRunner.update(workspace, tag);
36
+ spinner.succeed("Akan.js packages and CLI updated, global version is below");
37
+ Logger.raw("> Akan version: ");
38
+ await workspace.spawn("akan", ["--version"], { stdio: "inherit" });
39
+ }
40
+ }
@@ -0,0 +1,31 @@
1
+ import { command, Workspace } from "akanjs/devkit";
2
+
3
+ import { GuidelineScript } from "./guideline.script";
4
+
5
+ export class GuidelineCommand extends command("guideline", [GuidelineScript], ({ public: target }) => ({
6
+ generateInstruction: target({ devOnly: true, desc: "Generate AI development guideline/instruction for your project" })
7
+ .arg("name", String, { ask: "name of the instruction", nullable: true })
8
+ .with(Workspace)
9
+ .exec(async function (name, workspace) {
10
+ await this.guidelineScript.generateInstruction(workspace, name);
11
+ }),
12
+ updateInstruction: target({ devOnly: true, desc: "Update existing AI guideline/instruction" })
13
+ .arg("name", String, { ask: "name of the instruction", nullable: true })
14
+ .option("request", String, { ask: "What do you want to update?" })
15
+ .with(Workspace)
16
+ .exec(async function (name, request, workspace) {
17
+ await this.guidelineScript.updateInstruction(workspace, name, request);
18
+ }),
19
+ generateDocument: target({ devOnly: true, desc: "Generate documentation from guideline/instruction" })
20
+ .arg("name", String, { ask: "name of the instruction", nullable: true })
21
+ .with(Workspace)
22
+ .exec(async function (name, workspace) {
23
+ await this.guidelineScript.generateDocument(workspace, name);
24
+ }),
25
+ reapplyInstruction: target({ devOnly: true, desc: "Re-apply guideline/instruction to codebase" })
26
+ .arg("name", String, { ask: "name of the instruction", nullable: true })
27
+ .with(Workspace)
28
+ .exec(async function (name, workspace) {
29
+ await this.guidelineScript.reapplyInstruction(workspace, name);
30
+ }),
31
+ })) {}
@@ -0,0 +1,212 @@
1
+ import { randomPicks } from "akanjs/common";
2
+ import { type FileContent, FileSys, type GuideScan, getDirname, Prompter, type Workspace } from "akanjs/devkit";
3
+
4
+ export class GuidelinePrompt extends Prompter {
5
+ constructor(
6
+ readonly workspace: Workspace,
7
+ readonly name: string,
8
+ ) {
9
+ super();
10
+ }
11
+ async #getScanFilePaths(
12
+ matchPattern: string,
13
+ { avoidDirs = ["node_modules", ".next"], filterText }: { avoidDirs?: string[]; filterText?: string } = {},
14
+ ): Promise<string[]> {
15
+ const glob = new Bun.Glob(matchPattern);
16
+ const paths: string[] = [];
17
+ for await (const path of glob.scan({ cwd: this.workspace.workspaceRoot, absolute: true })) {
18
+ if (avoidDirs.some((dir) => path.includes(dir))) continue;
19
+ const fileContent = await FileSys.readText(path);
20
+ const textFilter = filterText ? new RegExp(filterText) : null;
21
+ if (filterText && !textFilter?.test(fileContent)) continue;
22
+ paths.push(path);
23
+ }
24
+ return paths;
25
+ }
26
+ async requestCreateInstruction() {
27
+ const guideJson = await Prompter.getGuideJson(this.name);
28
+ const scanFiles: (GuideScan & FileContent)[] = [];
29
+ for (const scan of guideJson.scans) {
30
+ const scanFilePaths = await this.#getScanFilePaths(scan.path, { filterText: scan.filterText });
31
+ const targetFilePaths = scan.sample ? randomPicks(scanFilePaths, scan.sample) : scanFilePaths;
32
+ const scanResult = await Promise.all(
33
+ targetFilePaths.map(async (filePath) => ({ ...scan, ...(await this.workspace.getLocalFile(filePath)) })),
34
+ );
35
+ scanFiles.push(...scanResult);
36
+ }
37
+ const resultPath = `${getDirname(import.meta.url)}/../guidelines/${this.name}/${guideJson.update.filePath}`;
38
+ const writePath = `${this.workspace.workspaceRoot}/pkgs/akanjs/cli/guidelines/${this.name}/${guideJson.update.filePath}`;
39
+ const isResultExists = await this.workspace.exists(writePath);
40
+ const existingResult = isResultExists ? await this.workspace.readFile(resultPath) : null;
41
+ const request = `
42
+ I am a developer of akanjs framework, a full-stack framework for building web applications.
43
+ I want to generate a ${guideJson.update.filePath} file for ${guideJson.description}.
44
+ This file is a programming guideline for Akan.js framwork users.
45
+
46
+ # ${guideJson.title} Workflow
47
+ - 1. Explore target files in ${guideJson.scans.map((scan) => scan.path).join(", ")}.
48
+ - 2. Read already-written ${guideJson.update.filePath} file if exists. There can be some outdated information, so you need to update the file and add new information, make it more accurate and more detailed.
49
+ - 3. Write the updated file content of the ${guideJson.update.filePath}. It should include the contents of ${guideJson.update.contents.join(",")}, and any other helpful information and contents for guiding. Also, you can rearrange the contents if you think it's more helpful.
50
+
51
+ ## 1. Explore target files in ${guideJson.scans.map((scan) => scan.path).join(", ")}.
52
+ ${scanFiles
53
+ .map(
54
+ ({ type, description, filePath, content, sample }) => `
55
+ \`\`\`${filePath.endsWith(".tsx") ? "tsx" : "typescript"}
56
+ ${content}
57
+ \`\`\`
58
+ `,
59
+ )
60
+ .join("\n")}
61
+
62
+ ## 2. Read already-written ${guideJson.update.filePath} file if exists. There can be some outdated information, so you need to update the file and add new information, make it more accurate and more detailed.
63
+ ${
64
+ existingResult
65
+ ? `\`\`\`markdown
66
+ ${existingResult}
67
+ \`\`\``
68
+ : "- No existing guideline file."
69
+ }
70
+
71
+ ## 3. Write the updated file content of the ${guideJson.update.filePath}. It should include the contents of ${guideJson.update.contents.join(",")}, and any other helpful information and contents for guiding. Also, you can rearrange the contents if you think it's more helpful.
72
+
73
+ Here's the last rules for writing the file content:
74
+ ${guideJson.update.rules.map((rule) => `- ${rule}`).join("\n")}
75
+
76
+ => Now, you need to write the file content here. Let's go.
77
+ `;
78
+ return { guideJson, request, writePath };
79
+ }
80
+ async requestUpdateInstruction(updateRequest: string) {
81
+ const guideJson = await Prompter.getGuideJson(this.name);
82
+ const resultPath = `${getDirname(import.meta.url)}/../guidelines/${this.name}/${guideJson.update.filePath}`;
83
+ const writePath = `${this.workspace.workspaceRoot}/pkgs/akanjs/cli/guidelines/${this.name}/${guideJson.update.filePath}`;
84
+ const isResultExists = await this.workspace.exists(writePath);
85
+ if (!isResultExists) throw new Error(`${guideJson.update.filePath} file does not exist. Please create it first.`);
86
+ const existingResult = await this.workspace.readFile(resultPath);
87
+ const request = `
88
+ I am a developer of akanjs framework, a full-stack framework for building web applications.
89
+ I want to update a ${guideJson.update.filePath} file for ${guideJson.description}.
90
+ This file is a programming guideline for Akan.js framwork users.
91
+
92
+ # ${guideJson.title} Workflow
93
+ - 1. Read already-written ${guideJson.update.filePath} file.
94
+ - 2. Write the updated file content of the ${guideJson.update.filePath} with the update request.
95
+
96
+ ## 1. Read already-written ${guideJson.update.filePath} file.
97
+ \`\`\`markdown
98
+ ${existingResult}
99
+ \`\`\`
100
+
101
+ ## 2. Write the updated file content of the ${guideJson.update.filePath} with the update request.
102
+ Request: ${updateRequest}
103
+
104
+ => Now, you need to write the file content here. Let's go.
105
+ `;
106
+ return { guideJson, request, writePath };
107
+ }
108
+ async requestCreateDocumentPage(page: string) {
109
+ const writePath = `apps/angelo/app${page}`;
110
+ if (!(await this.workspace.exists(writePath)))
111
+ await this.workspace.writeFile(
112
+ writePath,
113
+ `export default function Page() {
114
+ return <div>No Content</div>;
115
+ }
116
+ `,
117
+ );
118
+ const instruction = await Prompter.getInstruction(this.name);
119
+ const pageContent = await this.workspace.getLocalFile(writePath);
120
+ const request = `
121
+ I'm creating a documentation website for the Akan.js framework.
122
+
123
+ 1. Overview of the Akan.js framework
124
+ ${await this.getDocumentation("framework")}
125
+
126
+ 2. Documentation page writing method
127
+ ${await this.getDocumentation("docPageRule")}
128
+
129
+ 3. CSS rule with TailwindCSS and DaisyUI
130
+ ${await this.getDocumentation("cssRule")}
131
+
132
+ I want to update the Next.js server-side page located at ${writePath}.
133
+ Below is the content of the currently written page.
134
+ \`\`\`tsx
135
+ ${pageContent.content}
136
+ \`\`\`
137
+
138
+ Please update this page with the latest content below. A great design application is needed.
139
+ ${instruction}
140
+
141
+ Please follow these CSS rules when writing:
142
+ - Use tailwindcss
143
+ - Use className from the daisyui library
144
+
145
+ Please return only the file result in the following format for easy parsing.
146
+ \`\`\`tsx
147
+ ...pageContent
148
+ \`\`\`
149
+ `;
150
+ return { request, writePath };
151
+ }
152
+ async requestUpdateDocumentPage(page: string, updateRequest: string) {
153
+ const writePath = `apps/angelo/app${page}`;
154
+ if (!(await this.workspace.exists(writePath)))
155
+ await this.workspace.writeFile(
156
+ writePath,
157
+ `export default function Page() {
158
+ return <div>No Content</div>;
159
+ }
160
+ `,
161
+ );
162
+ const instruction = await Prompter.getInstruction(this.name);
163
+ const pageContent = await this.workspace.getLocalFile(writePath);
164
+ const request = `
165
+ I'm updating a documentation website for the Akan.js framework.
166
+
167
+ I want to update the Next.js server-side page located at ${writePath}.
168
+ Below is the content of the currently written page. You should update stale infos and preserve the existing content.
169
+ \`\`\`tsx
170
+ ${pageContent.content}
171
+ \`\`\`
172
+
173
+ The existing instruction is below.
174
+ \`\`\`markdown
175
+ ${instruction}
176
+ \`\`\`
177
+
178
+ Please update this page with the request below.
179
+ ${updateRequest}
180
+
181
+ Please return only the file result in the following format for easy parsing.
182
+ \`\`\`tsx
183
+ ...pageContent
184
+ \`\`\`
185
+ `;
186
+ return { request, writePath };
187
+ }
188
+ async requestReapplyInstruction(filePath: string) {
189
+ const guideJson = await Prompter.getGuideJson(this.name);
190
+ const writePath = `${this.workspace.workspaceRoot}/pkgs/akanjs/cli/guidelines/${this.name}/${guideJson.update.filePath}`;
191
+ if (!guideJson.page) throw new Error(`${this.name} does not have a page.`);
192
+ const pagePath = `apps/angelo/app${guideJson.page}`;
193
+ const pageFile = await this.workspace.getLocalFile(pagePath);
194
+
195
+ const request = `
196
+ I want to apply information in the Next.js page to markdown instruction file.
197
+
198
+ Here's the newest information in the Next.js page.
199
+ \`\`\`tsx
200
+ ${pageFile.content}
201
+ \`\`\`
202
+
203
+ Here's the existing instruction file.
204
+ \`\`\`markdown
205
+ ${await Prompter.getInstruction(this.name)}
206
+ \`\`\`
207
+
208
+ Please update the instruction file with the information in the Next.js page.
209
+ `;
210
+ return { request, writePath };
211
+ }
212
+ }
@@ -0,0 +1,53 @@
1
+ import { AiSession, Prompter, runner, type Workspace } from "akanjs/devkit";
2
+
3
+ import { GuidelinePrompt } from "./guideline.prompt";
4
+
5
+ export class GuidelineRunner extends runner("guideline") {
6
+ async generateInstruction(workspace: Workspace, guideName: string) {
7
+ const session = new AiSession("generateInstruction", { workspace, cacheKey: guideName });
8
+ const prompt = new GuidelinePrompt(workspace, guideName);
9
+ const { guideJson, request, writePath } = await prompt.requestCreateInstruction();
10
+ const guidelineContent = await session.editMarkdown(request);
11
+ await workspace.writeFile(writePath, guidelineContent);
12
+ return { guideJson, session };
13
+ }
14
+ async updateInstruction(workspace: Workspace, guideName: string, { updateRequest }: { updateRequest: string }) {
15
+ const session = new AiSession("updateInstruction", { workspace, cacheKey: guideName });
16
+ const prompt = new GuidelinePrompt(workspace, guideName);
17
+ const { guideJson, request, writePath } = await prompt.requestUpdateInstruction(updateRequest);
18
+ const guidelineContent = await session.editMarkdown(request);
19
+ await workspace.writeFile(writePath, guidelineContent);
20
+ return { guideJson, session };
21
+ }
22
+
23
+ async generateDocument(workspace: Workspace, guideName: string) {
24
+ const session = new AiSession("deployDocPages", { workspace, cacheKey: guideName });
25
+ const guideJson = await Prompter.getGuideJson(guideName);
26
+ const prompt = new GuidelinePrompt(workspace, guideName);
27
+ if (!guideJson.page) return Promise.resolve({});
28
+ const { request } = await prompt.requestCreateDocumentPage(guideJson.page);
29
+ await session.writeTypescripts(request, workspace);
30
+ }
31
+
32
+ async updateDocument(
33
+ workspace: Workspace,
34
+ guideName: string,
35
+ { updateRequest, session }: { updateRequest: string; session: AiSession },
36
+ ) {
37
+ const guideJson = await Prompter.getGuideJson(guideName);
38
+ if (!guideJson.page) throw new Error(`${guideName} does not have a page.`);
39
+ const prompt = new GuidelinePrompt(workspace, guideName);
40
+ const { request, writePath } = await prompt.requestUpdateDocumentPage(guideJson.page, updateRequest);
41
+ const guidelineContent = await session.editMarkdown(request);
42
+ await workspace.writeFile(writePath, guidelineContent);
43
+ }
44
+
45
+ async reapplyInstruction(workspace: Workspace, guideName: string) {
46
+ const session = new AiSession("reapplyInstruction", { workspace, cacheKey: guideName });
47
+ const guideJson = await Prompter.getGuideJson(guideName);
48
+ const prompt = new GuidelinePrompt(workspace, guideName);
49
+ const { request, writePath } = await prompt.requestReapplyInstruction(guideJson.update.filePath);
50
+ const guidelineContent = await session.editMarkdown(request);
51
+ await workspace.writeFile(writePath, guidelineContent);
52
+ }
53
+ }
@@ -0,0 +1,33 @@
1
+ import { type AiSession, Prompter, script, type Workspace } from "akanjs/devkit";
2
+
3
+ import { GuidelineRunner } from "./guideline.runner";
4
+
5
+ export class GuidelineScript extends script("guideline", [GuidelineRunner]) {
6
+ async generateInstruction(workspace: Workspace, name: string | null = null) {
7
+ const guideName = name ?? (await Prompter.selectGuideline());
8
+ await this.guidelineRunner.generateInstruction(workspace, guideName);
9
+ }
10
+ async updateInstruction(workspace: Workspace, name: string | null = null, updateRequest: string) {
11
+ const guideName = name ?? (await Prompter.selectGuideline());
12
+ const { guideJson, session } = await this.guidelineRunner.updateInstruction(workspace, guideName, {
13
+ updateRequest,
14
+ });
15
+ if (guideJson.page) await this.updateDocument(workspace, guideName, { updateRequest, session });
16
+ }
17
+ async generateDocument(workspace: Workspace, name: string | null = null) {
18
+ const guideName = name ?? (await Prompter.selectGuideline());
19
+ await this.guidelineRunner.generateDocument(workspace, guideName);
20
+ }
21
+ async updateDocument(
22
+ workspace: Workspace,
23
+ name: string | null = null,
24
+ { updateRequest, session }: { updateRequest: string; session: AiSession },
25
+ ) {
26
+ const guideName = name ?? (await Prompter.selectGuideline());
27
+ await this.guidelineRunner.updateDocument(workspace, guideName, { updateRequest, session });
28
+ }
29
+ async reapplyInstruction(workspace: Workspace, name: string | null = null) {
30
+ const guideName = name ?? (await Prompter.selectGuideline());
31
+ await this.guidelineRunner.reapplyInstruction(workspace, guideName);
32
+ }
33
+ }