@akanjs/cli 0.9.20 → 0.9.22

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 (192) hide show
  1. package/cjs/index.js +274 -295
  2. package/esm/index.js +274 -295
  3. package/esm/src/templates/__scalar/__model__/__model__.constant.js +1 -0
  4. package/esm/src/templates/__scalar/__model__/__model__.dictionary.js +1 -0
  5. package/esm/src/templates/__scalar/__model__/__model__.document.js +1 -0
  6. package/esm/src/templates/app/akan.config.js +1 -0
  7. package/esm/src/templates/app/app/[lang]/(__appName__)/(public)/page.js +1 -0
  8. package/esm/src/templates/app/app/[lang]/(__appName__)/(public)/unknown/page.js +1 -0
  9. package/esm/src/templates/app/app/[lang]/(__appName__)/layout.js +1 -0
  10. package/esm/src/templates/app/app/[lang]/admin/layout.js +1 -0
  11. package/esm/src/templates/app/app/[lang]/admin/page.js +1 -0
  12. package/esm/src/templates/app/app/csr.js +1 -0
  13. package/esm/src/templates/app/app/layout.js +1 -0
  14. package/esm/src/templates/app/app/robots.js +1 -0
  15. package/esm/src/templates/app/app/sitemap.js +1 -0
  16. package/esm/src/templates/app/base/baseLogic.js +1 -0
  17. package/esm/src/templates/app/base/index.js +1 -0
  18. package/esm/src/templates/app/common/commonLogic.js +1 -0
  19. package/esm/src/templates/app/common/index.js +1 -0
  20. package/esm/src/templates/app/env/env.client.debug.ts.template +0 -0
  21. package/esm/src/templates/app/env/env.client.develop.ts.template +0 -0
  22. package/esm/src/templates/app/env/env.client.js +1 -0
  23. package/esm/src/templates/app/env/env.client.local.ts.template +0 -0
  24. package/esm/src/templates/app/env/env.client.main.ts.template +0 -0
  25. package/esm/src/templates/app/env/env.client.testing.ts.template +0 -0
  26. package/esm/src/templates/app/env/env.client.type.js +1 -0
  27. package/esm/src/templates/app/env/env.server.debug.ts.template +0 -0
  28. package/esm/src/templates/app/env/env.server.develop.ts.template +0 -0
  29. package/esm/src/templates/app/env/env.server.js +1 -0
  30. package/esm/src/templates/app/env/env.server.local.ts.template +0 -0
  31. package/esm/src/templates/app/env/env.server.main.ts.template +0 -0
  32. package/esm/src/templates/app/env/env.server.testing.ts.template +0 -0
  33. package/esm/src/templates/app/jest.config.js +1 -0
  34. package/esm/src/templates/app/lib/___appName__/__appName__.dictionary.js +1 -0
  35. package/esm/src/templates/app/lib/___appName__/__appName__.service.js +1 -0
  36. package/esm/src/templates/app/lib/___appName__/__appName__.store.js +1 -0
  37. package/esm/src/templates/app/lib/___appName__/_server.js +1 -0
  38. package/esm/src/templates/app/lib/option.js +1 -0
  39. package/esm/src/templates/app/lib/setting/Setting.Template.js +1 -0
  40. package/esm/src/templates/app/lib/setting/Setting.Unit.js +1 -0
  41. package/esm/src/templates/app/lib/setting/Setting.Util.js +1 -0
  42. package/esm/src/templates/app/lib/setting/Setting.View.js +1 -0
  43. package/esm/src/templates/app/lib/setting/Setting.Zone.js +1 -0
  44. package/esm/src/templates/app/lib/setting/_server.js +1 -0
  45. package/esm/src/templates/app/lib/setting/index.js +1 -0
  46. package/esm/src/templates/app/lib/setting/setting.constant.js +1 -0
  47. package/esm/src/templates/app/lib/setting/setting.dictionary.js +1 -0
  48. package/esm/src/templates/app/lib/setting/setting.document.js +1 -0
  49. package/esm/src/templates/app/lib/setting/setting.service.js +1 -0
  50. package/esm/src/templates/app/lib/setting/setting.signal.js +1 -0
  51. package/esm/src/templates/app/lib/setting/setting.store.js +1 -0
  52. package/esm/src/templates/app/lib/summary/Summary.Template.js +1 -0
  53. package/esm/src/templates/app/lib/summary/Summary.Unit.js +1 -0
  54. package/esm/src/templates/app/lib/summary/Summary.Util.js +1 -0
  55. package/esm/src/templates/app/lib/summary/Summary.View.js +1 -0
  56. package/esm/src/templates/app/lib/summary/Summary.Zone.js +1 -0
  57. package/esm/src/templates/app/lib/summary/_server.js +1 -0
  58. package/esm/src/templates/app/lib/summary/index.js +1 -0
  59. package/esm/src/templates/app/lib/summary/summary.constant.js +1 -0
  60. package/esm/src/templates/app/lib/summary/summary.dictionary.js +1 -0
  61. package/esm/src/templates/app/lib/summary/summary.document.js +1 -0
  62. package/esm/src/templates/app/lib/summary/summary.service.js +1 -0
  63. package/esm/src/templates/app/lib/summary/summary.signal.js +1 -0
  64. package/esm/src/templates/app/lib/summary/summary.store.js +1 -0
  65. package/esm/src/templates/app/lib/user/User.Template.js +1 -0
  66. package/esm/src/templates/app/lib/user/User.Unit.js +1 -0
  67. package/esm/src/templates/app/lib/user/User.Util.js +1 -0
  68. package/esm/src/templates/app/lib/user/User.View.js +1 -0
  69. package/esm/src/templates/app/lib/user/User.Zone.js +1 -0
  70. package/esm/src/templates/app/lib/user/_server.js +1 -0
  71. package/esm/src/templates/app/lib/user/index.js +1 -0
  72. package/esm/src/templates/app/lib/user/user.constant.js +1 -0
  73. package/esm/src/templates/app/lib/user/user.dictionary.js +1 -0
  74. package/esm/src/templates/app/lib/user/user.document.js +1 -0
  75. package/esm/src/templates/app/lib/user/user.service.js +1 -0
  76. package/esm/src/templates/app/lib/user/user.signal.js +1 -0
  77. package/esm/src/templates/app/lib/user/user.signal.spec.js +1 -0
  78. package/esm/src/templates/app/lib/user/user.signal.test.js +1 -0
  79. package/esm/src/templates/app/lib/user/user.store.js +1 -0
  80. package/esm/src/templates/app/main.js +1 -0
  81. package/esm/src/templates/app/middleware.js +1 -0
  82. package/esm/src/templates/app/nest/backendLogic.js +1 -0
  83. package/esm/src/templates/app/nest/index.js +1 -0
  84. package/esm/src/templates/app/next/frontendLogic.js +1 -0
  85. package/esm/src/templates/app/next/index.js +1 -0
  86. package/esm/src/templates/app/ui/UiComponent.js +1 -0
  87. package/esm/src/templates/app/ui/index.js +1 -0
  88. package/esm/src/templates/client.js +2 -1
  89. package/esm/src/templates/crudPages/[__model__Id]/edit/page.js +1 -0
  90. package/esm/src/templates/crudPages/[__model__Id]/page.js +1 -0
  91. package/esm/src/templates/crudPages/new/page.js +1 -0
  92. package/esm/src/templates/crudPages/page.js +1 -0
  93. package/esm/src/templates/index.js +1 -0
  94. package/esm/src/templates/lib/__lib/extends/summary.constant.js +2 -1
  95. package/esm/src/templates/lib/__lib/lib.constant.js +1 -0
  96. package/esm/src/templates/lib/__lib/lib.dictionary.js +1 -0
  97. package/esm/src/templates/lib/__lib/lib.document.js +1 -0
  98. package/esm/src/templates/lib/__lib/lib.service.js +2 -1
  99. package/esm/src/templates/lib/__lib/lib.signal.js +1 -0
  100. package/esm/src/templates/lib/__lib/lib.store.js +1 -0
  101. package/esm/src/templates/lib/__scalar/_server.js +2 -1
  102. package/esm/src/templates/lib/cnst.js +1 -0
  103. package/esm/src/templates/lib/cnst_.js +1 -0
  104. package/esm/src/templates/lib/db.js +1 -0
  105. package/esm/src/templates/lib/dict.js +1 -0
  106. package/esm/src/templates/lib/fetch.js +2 -1
  107. package/esm/src/templates/lib/sig.js +2 -1
  108. package/esm/src/templates/lib/srv.js +2 -1
  109. package/esm/src/templates/lib/st.js +1 -0
  110. package/esm/src/templates/lib/store.js +2 -1
  111. package/esm/src/templates/lib/usePage.js +1 -0
  112. package/esm/src/templates/libRoot/akan.config.js +1 -0
  113. package/esm/src/templates/libRoot/base/baseLogic.js +1 -0
  114. package/esm/src/templates/libRoot/base/index.js +1 -0
  115. package/esm/src/templates/libRoot/common/commonLogic.js +1 -0
  116. package/esm/src/templates/libRoot/common/index.js +1 -0
  117. package/esm/src/templates/libRoot/jest.config.js +1 -0
  118. package/esm/src/templates/libRoot/lib/___libName__/__libName__.dictionary.js +1 -0
  119. package/esm/src/templates/libRoot/lib/___libName__/__libName__.service.js +1 -0
  120. package/esm/src/templates/libRoot/lib/___libName__/__libName__.store.js +1 -0
  121. package/esm/src/templates/libRoot/lib/___libName__/_server.js +1 -0
  122. package/esm/src/templates/libRoot/lib/option.js +1 -0
  123. package/esm/src/templates/libRoot/lib/setting/Setting.Template.js +1 -0
  124. package/esm/src/templates/libRoot/lib/setting/Setting.Unit.js +1 -0
  125. package/esm/src/templates/libRoot/lib/setting/Setting.Util.js +1 -0
  126. package/esm/src/templates/libRoot/lib/setting/Setting.View.js +1 -0
  127. package/esm/src/templates/libRoot/lib/setting/Setting.Zone.js +1 -0
  128. package/esm/src/templates/libRoot/lib/setting/_server.js +1 -0
  129. package/esm/src/templates/libRoot/lib/setting/index.js +1 -0
  130. package/esm/src/templates/libRoot/lib/setting/setting.constant.js +1 -0
  131. package/esm/src/templates/libRoot/lib/setting/setting.dictionary.js +1 -0
  132. package/esm/src/templates/libRoot/lib/setting/setting.document.js +1 -0
  133. package/esm/src/templates/libRoot/lib/setting/setting.service.js +1 -0
  134. package/esm/src/templates/libRoot/lib/setting/setting.signal.js +1 -0
  135. package/esm/src/templates/libRoot/lib/setting/setting.store.js +1 -0
  136. package/esm/src/templates/libRoot/lib/summary/Summary.Template.js +1 -0
  137. package/esm/src/templates/libRoot/lib/summary/Summary.Unit.js +1 -0
  138. package/esm/src/templates/libRoot/lib/summary/Summary.Util.js +1 -0
  139. package/esm/src/templates/libRoot/lib/summary/Summary.View.js +1 -0
  140. package/esm/src/templates/libRoot/lib/summary/Summary.Zone.js +1 -0
  141. package/esm/src/templates/libRoot/lib/summary/_server.js +1 -0
  142. package/esm/src/templates/libRoot/lib/summary/index.js +1 -0
  143. package/esm/src/templates/libRoot/lib/summary/summary.constant.js +1 -0
  144. package/esm/src/templates/libRoot/lib/summary/summary.dictionary.js +1 -0
  145. package/esm/src/templates/libRoot/lib/summary/summary.document.js +1 -0
  146. package/esm/src/templates/libRoot/lib/summary/summary.service.js +1 -0
  147. package/esm/src/templates/libRoot/lib/summary/summary.signal.js +1 -0
  148. package/esm/src/templates/libRoot/lib/summary/summary.store.js +1 -0
  149. package/esm/src/templates/libRoot/lib/user/User.Template.js +1 -0
  150. package/esm/src/templates/libRoot/lib/user/User.Unit.js +1 -0
  151. package/esm/src/templates/libRoot/lib/user/User.Util.js +1 -0
  152. package/esm/src/templates/libRoot/lib/user/User.View.js +1 -0
  153. package/esm/src/templates/libRoot/lib/user/User.Zone.js +1 -0
  154. package/esm/src/templates/libRoot/lib/user/_server.js +1 -0
  155. package/esm/src/templates/libRoot/lib/user/index.js +1 -0
  156. package/esm/src/templates/libRoot/lib/user/user.constant.js +1 -0
  157. package/esm/src/templates/libRoot/lib/user/user.dictionary.js +1 -0
  158. package/esm/src/templates/libRoot/lib/user/user.document.js +1 -0
  159. package/esm/src/templates/libRoot/lib/user/user.service.js +1 -0
  160. package/esm/src/templates/libRoot/lib/user/user.signal.js +1 -0
  161. package/esm/src/templates/libRoot/lib/user/user.signal.spec.js +1 -0
  162. package/esm/src/templates/libRoot/lib/user/user.signal.test.js +1 -0
  163. package/esm/src/templates/libRoot/lib/user/user.store.js +1 -0
  164. package/esm/src/templates/libRoot/nest/backendLogic.js +1 -0
  165. package/esm/src/templates/libRoot/nest/index.js +1 -0
  166. package/esm/src/templates/libRoot/next/frontendLogic.js +1 -0
  167. package/esm/src/templates/libRoot/next/index.js +1 -0
  168. package/esm/src/templates/libRoot/ui/index.js +1 -0
  169. package/esm/src/templates/module/__Model__.Template.js +1 -0
  170. package/esm/src/templates/module/__Model__.Unit.js +1 -0
  171. package/esm/src/templates/module/__Model__.Util.js +1 -0
  172. package/esm/src/templates/module/__Model__.View.js +1 -0
  173. package/esm/src/templates/module/__Model__.Zone.js +1 -0
  174. package/esm/src/templates/module/__model__.constant.js +1 -0
  175. package/esm/src/templates/module/__model__.dictionary.js +1 -0
  176. package/esm/src/templates/module/__model__.document.js +1 -0
  177. package/esm/src/templates/module/__model__.service.js +1 -0
  178. package/esm/src/templates/module/__model__.signal.js +1 -0
  179. package/esm/src/templates/module/__model__.signal.spec.js +1 -0
  180. package/esm/src/templates/module/__model__.signal.test.js +1 -0
  181. package/esm/src/templates/module/__model__.store.js +1 -0
  182. package/esm/src/templates/module/_server.js +1 -0
  183. package/esm/src/templates/module/index.js +1 -0
  184. package/esm/src/templates/server.js +2 -1
  185. package/package.json +1 -1
  186. package/src/application/application.interface.d.ts +40 -0
  187. package/src/application/application.runner.d.ts +14 -7
  188. package/src/application/application.script.d.ts +12 -6
  189. package/ui/MultiScrollList.d.ts +2 -1
  190. package/src/application/appilcation.interface.d.ts +0 -11
  191. package/ui/ScrollList.d.ts +0 -7
  192. package/ui/index.d.ts +0 -1
package/cjs/index.js CHANGED
@@ -3541,115 +3541,35 @@ var LibraryScript = class {
3541
3541
  }
3542
3542
  };
3543
3543
 
3544
- // pkgs/@akanjs/cli/src/application/application.runner.ts
3545
- var import_prompts6 = require("@inquirer/prompts");
3546
- var import_output_parsers = require("@langchain/core/output_parsers");
3547
- var import_prompts7 = require("@langchain/core/prompts");
3548
- var import_runnables2 = require("@langchain/core/runnables");
3549
- var import_openai3 = require("@langchain/openai");
3550
- var import_plugin_react = __toESM(require("@vitejs/plugin-react"), 1);
3551
- var import_dotenv3 = __toESM(require("dotenv"), 1);
3552
- var esbuild2 = __toESM(require("esbuild"), 1);
3553
- var import_fs10 = __toESM(require("fs"), 1);
3554
- var import_promises3 = __toESM(require("fs/promises"), 1);
3555
- var import_js_yaml2 = __toESM(require("js-yaml"), 1);
3556
- var import_open = __toESM(require("open"), 1);
3557
- var import_ora3 = __toESM(require("ora"), 1);
3558
- var import_path4 = __toESM(require("path"), 1);
3559
- var vite = __toESM(require("vite"), 1);
3560
- var import_vite_plugin_commonjs = __toESM(require("vite-plugin-commonjs"), 1);
3561
- var import_vite_plugin_node_polyfills = require("vite-plugin-node-polyfills");
3562
- var import_vite_tsconfig_paths = __toESM(require("vite-tsconfig-paths"), 1);
3563
-
3564
- // pkgs/@akanjs/cli/src/application/appilcation.interface.tsx
3565
- var import_ink4 = require("ink");
3566
- var import_react4 = __toESM(require("react"), 1);
3544
+ // pkgs/@akanjs/cli/src/application/application.interface.tsx
3545
+ var import_ink3 = require("ink");
3546
+ var import_react3 = __toESM(require("react"), 1);
3567
3547
 
3568
- // pkgs/@akanjs/cli/ui/ScrollList.tsx
3548
+ // pkgs/@akanjs/cli/ui/MultiScrollList.tsx
3569
3549
  var import_ink2 = require("ink");
3570
3550
  var import_react2 = __toESM(require("react"), 1);
3571
- var ScrollList = ({ list, ...props }) => {
3572
- const [renderLogs, setRenderLogs] = (0, import_react2.useState)(list);
3551
+ var HEADER_HEIGHT = 1;
3552
+ var FOOTER_HEIGHT = 5;
3553
+ var BORDER_HEIGHT = 2;
3554
+ var MultiScrollList = ({ logList, maxLength = 100 }) => {
3573
3555
  const [width, height] = useStdoutDimensions();
3556
+ const [focusLog, setFocusLog] = (0, import_react2.useState)([]);
3557
+ const [lengthMap, setLengthMap] = (0, import_react2.useState)(/* @__PURE__ */ new Map());
3574
3558
  const [scrollPos, setScrollPos] = (0, import_react2.useState)(0);
3559
+ const [tabIndex, setTabIndex] = (0, import_react2.useState)(0);
3575
3560
  const [isRunning, setIsRunning] = (0, import_react2.useState)(false);
3576
- const [boxHeight, setBoxHeight] = (0, import_react2.useState)(height - 3);
3561
+ const [boxHeight, setBoxHeight] = (0, import_react2.useState)(height - HEADER_HEIGHT - FOOTER_HEIGHT - BORDER_HEIGHT);
3562
+ const getLimitedLogs = (logs) => {
3563
+ return logs.length > maxLength ? logs.slice(logs.length - maxLength) : logs;
3564
+ };
3577
3565
  (0, import_ink2.useInput)((input6, key) => {
3578
- if (key.escape) {
3579
- setIsRunning(false);
3580
- setScrollPos(0);
3581
- }
3582
- if (input6 === " " && isRunning) {
3583
- setIsRunning(false);
3566
+ if (key.tab) {
3567
+ setTabIndex((prev) => (prev + 1) % logList.length);
3584
3568
  setScrollPos(0);
3585
- }
3586
- if (key.downArrow && scrollPos > 0) {
3587
- if (key.shift) {
3588
- setScrollPos(scrollPos - 10);
3589
- } else {
3590
- setScrollPos(scrollPos - 1);
3591
- }
3592
- }
3593
- if (key.upArrow && scrollPos < list.length - boxHeight) {
3594
- if (key.shift) {
3595
- setScrollPos(scrollPos + 10);
3596
- } else {
3597
- setScrollPos(scrollPos + 1);
3598
- }
3599
- }
3600
- });
3601
- (0, import_react2.useEffect)(() => {
3602
- if (isRunning) {
3603
- setScrollPos(scrollPos + 1);
3604
- return;
3605
- }
3606
- if (list.length > boxHeight) {
3607
- setRenderLogs(list.slice(list.length - boxHeight, list.length));
3608
- } else {
3609
- setRenderLogs(list);
3610
- }
3611
- }, [list, isRunning]);
3612
- (0, import_react2.useEffect)(() => {
3613
- setBoxHeight(Math.floor(height * 0.9));
3614
- }, [height]);
3615
- (0, import_react2.useEffect)(() => {
3616
- if (scrollPos > 0) {
3617
- setRenderLogs(list.slice(list.length - boxHeight - scrollPos, list.length - scrollPos));
3618
- setIsRunning(true);
3619
- } else {
3620
- setRenderLogs(list.slice(list.length - boxHeight, list.length));
3621
3569
  setIsRunning(false);
3622
3570
  }
3623
- }, [scrollPos]);
3624
- return /* @__PURE__ */ import_react2.default.createElement(import_ink2.Box, { ...props, width, height: "100%", flexDirection: "column" }, /* @__PURE__ */ import_react2.default.createElement(import_ink2.Box, { borderStyle: "round", width, height: height - 3 }, /* @__PURE__ */ import_react2.default.createElement(import_ink2.Newline, null), /* @__PURE__ */ import_react2.default.createElement(import_ink2.Text, null, isRunning ? /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, renderLogs.slice(0, renderLogs.length - 1).map((log, index) => /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement(import_ink2.Text, { key: index }, log), /* @__PURE__ */ import_react2.default.createElement(import_ink2.Newline, null))), /* @__PURE__ */ import_react2.default.createElement(import_ink2.Text, { backgroundColor: "green" }, "scrolling... + ", scrollPos)) : /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, renderLogs.map((log, index) => /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement(import_ink2.Text, { key: index }, log), /* @__PURE__ */ import_react2.default.createElement(import_ink2.Newline, null)))))), /* @__PURE__ */ import_react2.default.createElement(import_ink2.Box, null, /* @__PURE__ */ import_react2.default.createElement(import_ink2.Text, { dimColor: true }, "You can use the following shortcuts:", /* @__PURE__ */ import_react2.default.createElement(import_ink2.Newline, null), "* ", /* @__PURE__ */ import_react2.default.createElement(import_ink2.Text, { backgroundColor: "green" }, "up"), " and ", /* @__PURE__ */ import_react2.default.createElement(import_ink2.Text, { backgroundColor: "green" }, "down"), " to scroll.", " ", /* @__PURE__ */ import_react2.default.createElement(import_ink2.Text, { backgroundColor: "green" }, "shift"), " to scroll faster.", /* @__PURE__ */ import_react2.default.createElement(import_ink2.Newline, null), "* ", /* @__PURE__ */ import_react2.default.createElement(import_ink2.Text, { backgroundColor: "green" }, "escape"), " to stop scrolling.")));
3625
- };
3626
-
3627
- // pkgs/@akanjs/cli/ui/MultiScrollList.tsx
3628
- var import_ink3 = require("ink");
3629
- var import_react3 = __toESM(require("react"), 1);
3630
- var MultiScrollList = ({ logList }) => {
3631
- const [width, height] = useStdoutDimensions();
3632
- const [renderMultiLogs, setRenderMultiLogs] = (0, import_react3.useState)(
3633
- Array.from({ length: logList.length }, () => [])
3634
- );
3635
- const [lengthMap, setLengthMap] = (0, import_react3.useState)(/* @__PURE__ */ new Map());
3636
- const [scrollPos, setScrollPos] = (0, import_react3.useState)(0);
3637
- const [tabIndex, setTabIndex] = (0, import_react3.useState)(null);
3638
- const [isRunning, setIsRunning] = (0, import_react3.useState)(false);
3639
- const [boxHeight, setBoxHeight] = (0, import_react3.useState)(height - 7);
3640
- (0, import_ink3.useInput)((input6, key) => {
3641
- if (key.tab) {
3642
- if (tabIndex === null) {
3643
- setTabIndex(0);
3644
- } else {
3645
- setTabIndex((prev) => (prev + 1) % logList.length);
3646
- setIsRunning(false);
3647
- }
3648
- }
3649
3571
  if (key.escape) {
3650
3572
  setScrollPos(0);
3651
- if (tabIndex !== null)
3652
- setTabIndex(null);
3653
3573
  setIsRunning(false);
3654
3574
  }
3655
3575
  if (input6 === " ") {
@@ -3669,230 +3589,277 @@ var MultiScrollList = ({ logList }) => {
3669
3589
  setScrollPos(newScrollPos);
3670
3590
  }
3671
3591
  }
3672
- if (key.upArrow && tabIndex !== null && scrollPos < logList[tabIndex].logs.length - boxHeight) {
3673
- if (key.shift) {
3674
- const newScrollPos = scrollPos + 10;
3675
- if (newScrollPos > logList[tabIndex].logs.length - boxHeight) {
3676
- setScrollPos(logList[tabIndex].logs.length - boxHeight);
3592
+ if (key.upArrow && scrollPos < logList[tabIndex].logs.length - boxHeight) {
3593
+ const limitedLogs = getLimitedLogs(logList[tabIndex].logs);
3594
+ if (scrollPos < limitedLogs.length - boxHeight) {
3595
+ if (key.shift) {
3596
+ const newScrollPos = scrollPos + 10;
3597
+ if (newScrollPos > limitedLogs.length - boxHeight) {
3598
+ setScrollPos(limitedLogs.length - boxHeight);
3599
+ } else {
3600
+ setScrollPos(newScrollPos);
3601
+ }
3677
3602
  } else {
3678
- setScrollPos(newScrollPos);
3603
+ setScrollPos(scrollPos + 1);
3679
3604
  }
3680
- } else {
3681
- setScrollPos(scrollPos + 1);
3605
+ if (!isRunning)
3606
+ setIsRunning(true);
3682
3607
  }
3683
- if (!isRunning)
3684
- setIsRunning(true);
3685
3608
  }
3686
3609
  });
3687
- (0, import_react3.useEffect)(() => {
3610
+ (0, import_react2.useEffect)(() => {
3688
3611
  const getLogsToRender = (logs, index) => {
3612
+ const limitedLogs = getLimitedLogs(logs);
3689
3613
  if (scrollPos > 0 && tabIndex === index) {
3690
- return logs.slice(logs.length - boxHeight - scrollPos, logs.length - scrollPos);
3691
- } else if (logs.length > boxHeight) {
3692
- return logs.slice(logs.length - boxHeight, logs.length);
3614
+ return limitedLogs.slice(limitedLogs.length - boxHeight - scrollPos, limitedLogs.length - scrollPos);
3615
+ } else if (limitedLogs.length > boxHeight) {
3616
+ return limitedLogs.slice(limitedLogs.length - boxHeight, limitedLogs.length);
3693
3617
  } else {
3694
- return logs;
3618
+ return limitedLogs;
3695
3619
  }
3696
3620
  };
3697
3621
  if (isRunning) {
3698
- if (tabIndex !== null && lengthMap.has(tabIndex)) {
3622
+ if (lengthMap.has(tabIndex)) {
3699
3623
  const tabLength = lengthMap.get(tabIndex);
3700
- if (tabLength && tabLength < logList[tabIndex].logs.length) {
3624
+ const limitedLogsLength = Math.min(logList[tabIndex].logs.length, maxLength);
3625
+ if (tabLength && tabLength < limitedLogsLength) {
3701
3626
  setScrollPos(scrollPos + 1);
3702
- lengthMap.set(tabIndex, logList[tabIndex].logs.length);
3627
+ lengthMap.set(tabIndex, limitedLogsLength);
3703
3628
  }
3704
3629
  }
3705
- setRenderMultiLogs((prev) => {
3706
- const newState = [...prev];
3707
- logList.forEach((logData, index) => {
3708
- newState[index] = getLogsToRender(logData.logs, index);
3709
- });
3710
- return newState;
3711
- });
3630
+ setFocusLog(getLogsToRender(logList[tabIndex].logs, tabIndex));
3712
3631
  } else {
3713
- setRenderMultiLogs((prev) => {
3714
- const newState = [...prev];
3715
- logList.forEach((logData, index) => {
3716
- lengthMap.set(index, logData.logs.length);
3717
- newState[index] = getLogsToRender(logData.logs, index);
3718
- });
3719
- return newState;
3720
- });
3632
+ setFocusLog(getLogsToRender(logList[tabIndex].logs, tabIndex));
3721
3633
  }
3722
- }, [logList, isRunning, scrollPos, tabIndex, boxHeight]);
3723
- (0, import_react3.useEffect)(() => {
3724
- setBoxHeight(height - 7);
3634
+ }, [logList, isRunning, scrollPos, tabIndex, boxHeight, maxLength]);
3635
+ (0, import_react2.useEffect)(() => {
3636
+ setBoxHeight(height - HEADER_HEIGHT - FOOTER_HEIGHT - BORDER_HEIGHT);
3725
3637
  }, [height]);
3726
- (0, import_react3.useEffect)(() => {
3727
- setLengthMap(new Map(logList.map((log, index) => [index, log.logs.length])));
3728
- }, []);
3729
- return /* @__PURE__ */ import_react3.default.createElement(import_ink3.Box, { width, height, flexDirection: "column" }, /* @__PURE__ */ import_react3.default.createElement(import_ink3.Box, { width, height: "100%" }, renderMultiLogs.map((logData, index) => /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, /* @__PURE__ */ import_react3.default.createElement(import_ink3.Box, { width, height: "100%", flexDirection: "column", key: index }, /* @__PURE__ */ import_react3.default.createElement(import_ink3.Box, null, /* @__PURE__ */ import_react3.default.createElement(import_ink3.Text, { color: logList[index].color }, logList[index].title)), /* @__PURE__ */ import_react3.default.createElement(
3730
- import_ink3.Box,
3638
+ (0, import_react2.useEffect)(() => {
3639
+ setLengthMap(new Map(logList.map((log, index) => [index, Math.min(log.logs.length, maxLength)])));
3640
+ }, [logList, maxLength]);
3641
+ return /* @__PURE__ */ import_react2.default.createElement(import_ink2.Box, { width, height, flexDirection: "column" }, /* @__PURE__ */ import_react2.default.createElement(import_ink2.Box, { width, height: "80%", flexDirection: "row" }, /* @__PURE__ */ import_react2.default.createElement(import_ink2.Box, { width: 30, height: "100%", flexDirection: "column" }, /* @__PURE__ */ import_react2.default.createElement(import_ink2.Box, null, /* @__PURE__ */ import_react2.default.createElement(import_ink2.Text, null, "List ", tabIndex + 1, "/", logList.length)), /* @__PURE__ */ import_react2.default.createElement(import_ink2.Box, { borderStyle: "round", borderColor: "blackBright", width: "100%", height: "100%", flexDirection: "column" }, logList.map((log, index) => {
3642
+ return /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement(import_ink2.Text, { color: index === tabIndex ? "green" : "white" }, /* @__PURE__ */ import_react2.default.createElement(import_ink2.Text, null, "\u25CF"), "\xA0", log.title.length > 25 ? log.title.slice(0, 25) + "..." : log.title));
3643
+ }))), /* @__PURE__ */ import_react2.default.createElement(import_ink2.Box, { width, height: boxHeight + 3, flexDirection: "column" }, /* @__PURE__ */ import_react2.default.createElement(import_ink2.Text, null, logList[tabIndex].title), /* @__PURE__ */ import_react2.default.createElement(
3644
+ import_ink2.Box,
3731
3645
  {
3732
- flexWrap: "wrap",
3733
- height,
3734
- borderStyle: index === tabIndex ? "double" : "round",
3735
- borderDimColor: index !== tabIndex,
3736
- borderColor: index === tabIndex && isRunning ? "green" : logList[index].color
3646
+ borderStyle: isRunning ? "double" : "round",
3647
+ flexDirection: "column",
3648
+ borderColor: logList[tabIndex].color,
3649
+ width: "100%",
3650
+ height: "100%"
3737
3651
  },
3738
- /* @__PURE__ */ import_react3.default.createElement(import_ink3.Text, null, isRunning && tabIndex === index ? /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, logData.slice(0, logData.length - 1).map((log, index2) => /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, /* @__PURE__ */ import_react3.default.createElement(import_ink3.Text, { key: index2 }, log), /* @__PURE__ */ import_react3.default.createElement(import_ink3.Newline, null))), /* @__PURE__ */ import_react3.default.createElement(import_ink3.Text, { backgroundColor: "green" }, "scrolling... +", scrollPos)) : /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, logData.map((data, index2) => /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, /* @__PURE__ */ import_react3.default.createElement(import_ink3.Text, { key: index2 }, data), /* @__PURE__ */ import_react3.default.createElement(import_ink3.Newline, null)))))
3739
- ))))), /* @__PURE__ */ import_react3.default.createElement(import_ink3.Box, { width, height: "auto" }, /* @__PURE__ */ import_react3.default.createElement(import_ink3.Text, { dimColor: true }, /* @__PURE__ */ import_react3.default.createElement(import_ink3.Text, null, "You can use the following shortcuts:"), /* @__PURE__ */ import_react3.default.createElement(import_ink3.Newline, null), "* ", /* @__PURE__ */ import_react3.default.createElement(import_ink3.Text, { backgroundColor: "green" }, "tab"), " to switch tab.", /* @__PURE__ */ import_react3.default.createElement(import_ink3.Newline, null), "* ", /* @__PURE__ */ import_react3.default.createElement(import_ink3.Text, { backgroundColor: "green" }, "space"), " to scroll.", /* @__PURE__ */ import_react3.default.createElement(import_ink3.Newline, null), "* ", /* @__PURE__ */ import_react3.default.createElement(import_ink3.Text, { backgroundColor: "green" }, "up"), " and ", /* @__PURE__ */ import_react3.default.createElement(import_ink3.Text, { backgroundColor: "green" }, "down"), " to scroll.", " ", /* @__PURE__ */ import_react3.default.createElement(import_ink3.Text, { backgroundColor: "green" }, "shift"), " to scroll faster.", /* @__PURE__ */ import_react3.default.createElement(import_ink3.Newline, null), "* ", /* @__PURE__ */ import_react3.default.createElement(import_ink3.Text, { backgroundColor: "green" }, "escape"), " to stop scrolling.")));
3652
+ scrollPos > 0 ? /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, focusLog.slice(0, focusLog.length - 1).map((log, index) => /* @__PURE__ */ import_react2.default.createElement(import_ink2.Text, { key: index }, log)), /* @__PURE__ */ import_react2.default.createElement(import_ink2.Text, { backgroundColor: "green" }, "Scrolling... +", scrollPos)) : focusLog.map((log, index) => /* @__PURE__ */ import_react2.default.createElement(import_ink2.Text, { key: index }, log))
3653
+ ))), /* @__PURE__ */ import_react2.default.createElement(import_ink2.Box, { width }, /* @__PURE__ */ import_react2.default.createElement(import_ink2.Text, { dimColor: true }, /* @__PURE__ */ import_react2.default.createElement(import_ink2.Text, null, "You can use the following shortcuts:"), /* @__PURE__ */ import_react2.default.createElement(import_ink2.Newline, null), "* ", /* @__PURE__ */ import_react2.default.createElement(import_ink2.Text, { backgroundColor: "green" }, "tab"), " to switch tab.", /* @__PURE__ */ import_react2.default.createElement(import_ink2.Newline, null), "* ", /* @__PURE__ */ import_react2.default.createElement(import_ink2.Text, { backgroundColor: "green" }, "up"), " and ", /* @__PURE__ */ import_react2.default.createElement(import_ink2.Text, { backgroundColor: "green" }, "down"), " to scroll.", " ", /* @__PURE__ */ import_react2.default.createElement(import_ink2.Text, { backgroundColor: "green" }, "shift"), " to scroll faster.", /* @__PURE__ */ import_react2.default.createElement(import_ink2.Newline, null), "* ", /* @__PURE__ */ import_react2.default.createElement(import_ink2.Text, { backgroundColor: "green" }, "space"), " to scroll.", /* @__PURE__ */ import_react2.default.createElement(import_ink2.Newline, null), "* ", /* @__PURE__ */ import_react2.default.createElement(import_ink2.Text, { backgroundColor: "green" }, "escape"), " to stop scrolling.")));
3740
3654
  };
3741
3655
 
3742
- // pkgs/@akanjs/cli/src/application/appilcation.interface.tsx
3743
- var Backend = ({ app, env }) => {
3744
- const [logs, setLogs] = (0, import_react4.useState)([]);
3656
+ // pkgs/@akanjs/cli/src/application/application.interface.tsx
3657
+ var Backend = ({ appName, childProcess, onExit }) => {
3658
+ const [logs, setLogs] = (0, import_react3.useState)([]);
3745
3659
  const [width, height] = useStdoutDimensions();
3746
- (0, import_react4.useEffect)(() => {
3747
- const proc = app.dist.spawnSync("node", ["--watch", "main.js"], {
3748
- env,
3749
- stdio: "pipe",
3750
- cwd: `${app.dist.cwdPath}/backend`
3751
- });
3752
- proc.stdout?.on("data", (data) => {
3660
+ (0, import_react3.useEffect)(() => {
3661
+ childProcess.stdout?.on("data", (data) => {
3753
3662
  const newOutput = data.toString().split("\n");
3754
3663
  setLogs((prevLogs) => [...prevLogs, ...newOutput]);
3755
3664
  });
3756
- proc.stderr?.on("data", (data) => {
3665
+ childProcess.stderr?.on("data", (data) => {
3757
3666
  const newOutput = data.toString().split("\n");
3758
3667
  setLogs((prevLogs) => [...prevLogs, ...newOutput]);
3759
3668
  });
3760
3669
  return () => {
3761
- proc.kill();
3670
+ childProcess.kill();
3671
+ onExit();
3762
3672
  };
3763
3673
  }, []);
3764
- return /* @__PURE__ */ import_react4.default.createElement(import_ink4.Box, { width, height }, /* @__PURE__ */ import_react4.default.createElement(import_ink4.Text, { bold: true }, "Akan.JS Backend"));
3674
+ return /* @__PURE__ */ import_react3.default.createElement(import_ink3.Box, { width, height }, /* @__PURE__ */ import_react3.default.createElement(import_ink3.Text, { bold: true }, "Akan.JS Backend"));
3765
3675
  };
3766
- var Frontend = ({ app, env }) => {
3767
- const [logs, setLogs] = (0, import_react4.useState)([]);
3676
+ var Frontend = ({ appName, childProcess, onExit }) => {
3677
+ const [logs, setLogs] = (0, import_react3.useState)([]);
3768
3678
  const [width, height] = useStdoutDimensions();
3769
- (0, import_react4.useEffect)(() => {
3770
- const proc = app.spawnSync("npx", ["next", "dev", "-p", "4200"], {
3771
- env,
3772
- stdio: ["ignore", "pipe", "pipe"],
3773
- detached: true
3774
- });
3775
- proc.stdout?.on("data", (data) => {
3679
+ (0, import_react3.useEffect)(() => {
3680
+ childProcess.stdout?.on("data", (data) => {
3776
3681
  const newOutput = data.toString().split("\n");
3777
3682
  setLogs((prevLogs) => [...prevLogs, ...newOutput]);
3778
3683
  });
3779
- proc.stderr?.on("data", (data) => {
3684
+ childProcess.stderr?.on("data", (data) => {
3780
3685
  const newOutput = data.toString().split("\n");
3781
3686
  setLogs((prevLogs) => [...prevLogs, ...newOutput]);
3782
3687
  });
3783
3688
  return () => {
3784
- proc.kill();
3689
+ childProcess.kill();
3690
+ onExit();
3785
3691
  };
3786
3692
  }, []);
3787
- return /* @__PURE__ */ import_react4.default.createElement(import_ink4.Box, { width, height, flexDirection: "column" }, /* @__PURE__ */ import_react4.default.createElement(import_ink4.Text, { bold: true }, "Akan.JS Frontend"), logs.map((log) => /* @__PURE__ */ import_react4.default.createElement(import_ink4.Text, { key: log }, log)));
3693
+ return /* @__PURE__ */ import_react3.default.createElement(import_ink3.Box, { width, height, flexDirection: "column" }, /* @__PURE__ */ import_react3.default.createElement(import_ink3.Text, { bold: true }, appName, " Frontend"), logs.map((log) => /* @__PURE__ */ import_react3.default.createElement(import_ink3.Text, { key: log }, log)));
3788
3694
  };
3789
- var Csr = ({
3790
- app,
3791
- onLoad
3792
- }) => {
3793
- const [logs, setLogs] = (0, import_react4.useState)([]);
3695
+ var Csr = ({ app, event, onExit }) => {
3696
+ const [logs, setLogs] = (0, import_react3.useState)([]);
3794
3697
  const [width, height] = useStdoutDimensions();
3795
- (0, import_react4.useEffect)(() => {
3796
- void onLoad({
3797
- onLog: (log) => {
3798
- setLogs((prevLogs) => [...prevLogs, log]);
3799
- }
3698
+ const [test, setTest] = (0, import_react3.useState)(false);
3699
+ (0, import_react3.useEffect)(() => {
3700
+ event.on("info", (msg) => {
3701
+ setLogs((prevLogs) => [...prevLogs, msg]);
3702
+ });
3703
+ event.on("warn", (msg) => {
3704
+ setLogs((prevLogs) => [...prevLogs, msg]);
3705
+ });
3706
+ event.on("warnOnce", (msg) => {
3707
+ setLogs((prevLogs) => [...prevLogs, msg]);
3708
+ });
3709
+ event.on("error", (msg) => {
3710
+ setLogs((prevLogs) => [...prevLogs, msg]);
3711
+ });
3712
+ event.on("clearScreen", (type) => {
3713
+ setLogs((prevLogs) => [...prevLogs, type]);
3800
3714
  });
3801
3715
  }, []);
3802
- return /* @__PURE__ */ import_react4.default.createElement(import_ink4.Box, { width, height, flexDirection: "column" }, /* @__PURE__ */ import_react4.default.createElement(import_ink4.Text, { bold: true }, "Akan.JS CSR"), /* @__PURE__ */ import_react4.default.createElement(ScrollList, { list: logs }));
3716
+ return /* @__PURE__ */ import_react3.default.createElement(import_ink3.Box, { width, height, flexDirection: "column" }, /* @__PURE__ */ import_react3.default.createElement(import_ink3.Text, null, test ? "true" : "false"), /* @__PURE__ */ import_react3.default.createElement(import_ink3.Text, { bold: true }, "Akan.JS CSR"), /* @__PURE__ */ import_react3.default.createElement(import_ink3.Text, null, logs));
3803
3717
  };
3804
- var Start = ({
3805
- app,
3806
- backendEnv,
3807
- frontendEnv,
3808
- onLoadCsr
3809
- }) => {
3718
+ var Start = ({ appName, bcp, fcp, csr, onExit, maxLength = 100 }) => {
3810
3719
  const [width, height] = useStdoutDimensions();
3811
- const [csrLogs, setCsrLogs] = (0, import_react4.useState)([]);
3812
- const [backendLogs, setBackendLogs] = (0, import_react4.useState)([]);
3813
- const [frontendLogs, setFrontendLogs] = (0, import_react4.useState)([]);
3814
- (0, import_react4.useEffect)(() => {
3815
- const backend = app.dist.spawnSync("node", ["--watch", "backend/main.js"], {
3816
- stdio: ["ignore", "pipe", "pipe"],
3817
- // stdin은 무시
3818
- env: backendEnv,
3819
- detached: true
3720
+ const [csrLogs, setCsrLogs] = (0, import_react3.useState)([]);
3721
+ const [backendLogs, setBackendLogs] = (0, import_react3.useState)([]);
3722
+ const [frontendLogs, setFrontendLogs] = (0, import_react3.useState)([]);
3723
+ const { exit } = (0, import_ink3.useApp)();
3724
+ const filterLogData = (data) => {
3725
+ return typeof data === "string" ? data.split(/\r?\n/).filter((line) => line !== "") : data.toString().split(/\r?\n/).filter((line) => line !== "");
3726
+ };
3727
+ const saveLog = (type, data, setLog) => {
3728
+ const newOutput = filterLogData(data);
3729
+ const logs = newOutput.map((line) => ({ type, content: line }));
3730
+ setLog((currentLogs) => {
3731
+ if (currentLogs.length >= maxLength) {
3732
+ return [...currentLogs.slice(logs.length, maxLength), ...logs];
3733
+ } else if (currentLogs.length < maxLength && currentLogs.length + logs.length > maxLength) {
3734
+ return [...currentLogs.slice(Math.abs(maxLength - currentLogs.length - logs.length), maxLength), ...logs];
3735
+ } else
3736
+ return [...currentLogs, ...logs];
3820
3737
  });
3821
- const frontend = app.spawnSync("npx", ["next", "dev", "-p", "4200"], {
3822
- stdio: ["ignore", "pipe", "pipe"],
3823
- // stdin은 무시
3824
- env: frontendEnv,
3825
- detached: true
3738
+ };
3739
+ (0, import_react3.useEffect)(() => {
3740
+ bcp.stdout?.on("data", (data) => {
3741
+ saveLog("stdout", data, setBackendLogs);
3826
3742
  });
3827
- backend.stdout?.on("data", (data) => {
3828
- const newOutput = data.toString().split("\n");
3829
- setBackendLogs((currentLogs) => [
3830
- ...currentLogs,
3831
- ...newOutput.map((line) => ({ type: "stdout", content: line }))
3832
- ]);
3743
+ bcp.stderr?.on("data", (data) => {
3744
+ saveLog("stderr", data, setBackendLogs);
3833
3745
  });
3834
- backend.stderr?.on("data", (data) => {
3835
- const newOutput = data.toString().split("\n");
3836
- setBackendLogs((currentLogs) => [
3837
- ...currentLogs,
3838
- ...newOutput.map((line) => ({ type: "stderr", content: line }))
3839
- ]);
3746
+ fcp.stdout?.on("data", (data) => {
3747
+ saveLog("stdout", data, setFrontendLogs);
3840
3748
  });
3841
- frontend.stdout?.on("data", (data) => {
3842
- const newOutput = data.toString().split("\n");
3843
- setFrontendLogs((currentLogs) => [
3844
- ...currentLogs,
3845
- ...newOutput.map((line) => ({ type: "stdout", content: line }))
3846
- ]);
3749
+ fcp.stderr?.on("data", (data) => {
3750
+ saveLog("stderr", data, setFrontendLogs);
3847
3751
  });
3848
- frontend.stderr?.on("data", (data) => {
3849
- const newOutput = data.toString().split("\n");
3850
- setFrontendLogs((currentLogs) => [
3851
- ...currentLogs,
3852
- ...newOutput.map((line) => ({ type: "stderr", content: line }))
3853
- ]);
3752
+ csr.on("info", (msg) => {
3753
+ saveLog("info", msg, setCsrLogs);
3854
3754
  });
3855
- void onLoadCsr({
3856
- onLog: (log) => {
3857
- setCsrLogs((prevLogs) => [...prevLogs, { type: "stdout", content: log }]);
3858
- }
3755
+ csr.on("warn", (msg) => {
3756
+ saveLog("warn", msg, setCsrLogs);
3757
+ });
3758
+ csr.on("error", (msg) => {
3759
+ saveLog("error", msg, setCsrLogs);
3760
+ });
3761
+ csr.on("clearScreen", (type) => {
3762
+ saveLog("clearScreen", type, setCsrLogs);
3859
3763
  });
3860
3764
  return () => {
3861
- backend.kill();
3862
- frontend.kill();
3765
+ bcp.kill();
3766
+ fcp.kill();
3767
+ bcp.stdin?.end();
3768
+ fcp.stdin?.end();
3769
+ csr.removeAllListeners();
3770
+ void (async () => {
3771
+ await onExit();
3772
+ exit();
3773
+ process.exit(0);
3774
+ })();
3863
3775
  };
3864
3776
  }, []);
3865
- return /* @__PURE__ */ import_react4.default.createElement(import_react4.default.Fragment, null, /* @__PURE__ */ import_react4.default.createElement(import_ink4.Box, { borderColor: "#ff493b", height, width, flexDirection: "row" }, /* @__PURE__ */ import_react4.default.createElement(
3777
+ return /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, /* @__PURE__ */ import_react3.default.createElement(import_ink3.Box, { borderColor: "#ff493b", height, width, flexDirection: "row" }, /* @__PURE__ */ import_react3.default.createElement(
3866
3778
  MultiScrollList,
3867
3779
  {
3868
3780
  logList: [
3869
3781
  {
3870
- title: `${app.name} frontend`,
3782
+ title: `${appName} frontend`,
3871
3783
  logs: frontendLogs.map((log) => log.content),
3872
3784
  color: "#ff493b"
3873
3785
  },
3874
3786
  {
3875
- title: `${app.name} backend`,
3787
+ title: `${appName} backend`,
3876
3788
  logs: backendLogs.map((log) => log.content),
3877
3789
  color: "#e535ab"
3878
3790
  },
3879
3791
  {
3880
- title: `${app.name} react`,
3792
+ title: `${appName} react`,
3881
3793
  logs: csrLogs.map((log) => log.content),
3882
3794
  color: "#7cc5d9"
3883
3795
  }
3884
- ]
3796
+ ],
3797
+ maxLength
3885
3798
  }
3886
3799
  )));
3887
3800
  };
3888
3801
  var Interface = {
3889
- Csr: (app, onLoad) => (0, import_ink4.render)(/* @__PURE__ */ import_react4.default.createElement(Csr, { app, onLoad })),
3890
- Backend: (app, env) => (0, import_ink4.render)(/* @__PURE__ */ import_react4.default.createElement(Backend, { app, env })),
3891
- Frontend: (app, env) => (0, import_ink4.render)(/* @__PURE__ */ import_react4.default.createElement(Frontend, { app, env })),
3892
- Start: (app, backendEnv, frontendEnv, onLoadCsr) => (0, import_ink4.render)(/* @__PURE__ */ import_react4.default.createElement(Start, { app, backendEnv, frontendEnv, onLoadCsr }))
3802
+ /**
3803
+ * Akan CSR 실행 컴포넌트
3804
+ *
3805
+ * @param app 정보
3806
+ * @param event CSR 이벤트 발생기
3807
+ * @param onExit 종료 함수
3808
+ */
3809
+ Csr: (app, event, onExit) => renderManager(/* @__PURE__ */ import_react3.default.createElement(Csr, { app, event, onExit })),
3810
+ /**
3811
+ * Akan Backend 실행 컴포넌트
3812
+ *
3813
+ * @param appName 앱 이름
3814
+ * @param childProcess 백엔드 차일드 프로세스
3815
+ * @param onExit 종료 함수
3816
+ */
3817
+ Backend: (appName, childProcess, onExit) => renderManager(/* @__PURE__ */ import_react3.default.createElement(Backend, { appName, childProcess, onExit })),
3818
+ /**
3819
+ * Akan Frontend 실행 컴포넌트
3820
+ *
3821
+ * @param appName 앱 이름
3822
+ * @param childProcess 프론트엔드 차일드 프로세스
3823
+ * @param onExit 종료 함수
3824
+ */
3825
+ Frontend: (appName, childProcess, onExit) => renderManager(/* @__PURE__ */ import_react3.default.createElement(Frontend, { appName, childProcess, onExit })),
3826
+ /**
3827
+ * Akan application 통합 실행 컴포넌트 (백엔드, 프론트엔드, React(CSR))
3828
+ *
3829
+ * @param maxLength 로그 최대 길이
3830
+ * @param appName 앱 이름
3831
+ * @param bcp 백엔드 차일드 프로세스
3832
+ * @param fcp 프론트엔드 차일드 프로세스
3833
+ * @param csr CSR 이벤트 발생기
3834
+ * @param onExit 종료 함수
3835
+ */
3836
+ Start: (appName, bcp, fcp, csr, onExit) => renderManager(/* @__PURE__ */ import_react3.default.createElement(Start, { appName, bcp, fcp, csr, onExit }))
3837
+ };
3838
+ var renderManager = (component) => {
3839
+ const renderFn = (0, import_ink3.render)(component);
3840
+ return renderFn;
3893
3841
  };
3894
3842
 
3895
3843
  // pkgs/@akanjs/cli/src/application/application.runner.ts
3844
+ var import_node_events = __toESM(require("node:events"), 1);
3845
+ var import_prompts6 = require("@inquirer/prompts");
3846
+ var import_output_parsers = require("@langchain/core/output_parsers");
3847
+ var import_prompts7 = require("@langchain/core/prompts");
3848
+ var import_runnables2 = require("@langchain/core/runnables");
3849
+ var import_openai3 = require("@langchain/openai");
3850
+ var import_plugin_react = __toESM(require("@vitejs/plugin-react"), 1);
3851
+ var import_dotenv3 = __toESM(require("dotenv"), 1);
3852
+ var esbuild2 = __toESM(require("esbuild"), 1);
3853
+ var import_fs10 = __toESM(require("fs"), 1);
3854
+ var import_promises3 = __toESM(require("fs/promises"), 1);
3855
+ var import_js_yaml2 = __toESM(require("js-yaml"), 1);
3856
+ var import_open = __toESM(require("open"), 1);
3857
+ var import_ora3 = __toESM(require("ora"), 1);
3858
+ var import_path4 = __toESM(require("path"), 1);
3859
+ var vite = __toESM(require("vite"), 1);
3860
+ var import_vite_plugin_commonjs = __toESM(require("vite-plugin-commonjs"), 1);
3861
+ var import_vite_plugin_node_polyfills = require("vite-plugin-node-polyfills");
3862
+ var import_vite_tsconfig_paths = __toESM(require("vite-tsconfig-paths"), 1);
3896
3863
  var ApplicationRunner = class {
3897
3864
  async createApplication(appName, workspace) {
3898
3865
  await workspace.applyTemplate({
@@ -3920,34 +3887,6 @@ var ApplicationRunner = class {
3920
3887
  await app.syncAssets(scanResult.akanConfig.libs);
3921
3888
  return scanResult;
3922
3889
  }
3923
- async start(app) {
3924
- const { env: frontendEnv } = await this.#prepareCommand(app, "start", "frontend");
3925
- const { env: backendEnv } = await this.#prepareCommand(app, "start", "backend");
3926
- Interface.Start(app, backendEnv, frontendEnv, async ({ onLog }) => {
3927
- const config = await this.#getViteConfig(app, "start", {
3928
- customLogger: {
3929
- info: (msg) => {
3930
- onLog(msg);
3931
- },
3932
- warn: (msg) => {
3933
- },
3934
- warnOnce: (msg) => {
3935
- },
3936
- error: (msg) => {
3937
- onLog(msg);
3938
- },
3939
- clearScreen: (type) => {
3940
- },
3941
- hasErrorLogged: (error) => {
3942
- return false;
3943
- },
3944
- hasWarned: false
3945
- }
3946
- });
3947
- const server = await vite.createServer(config);
3948
- await server.listen(4201);
3949
- });
3950
- }
3951
3890
  async getScriptFilename(app) {
3952
3891
  if (!app.exists("scripts")) {
3953
3892
  app.mkdir("scripts");
@@ -4027,7 +3966,7 @@ var ApplicationRunner = class {
4027
3966
  app.dist.writeJson("backend/package.json", appPackageJson);
4028
3967
  app.dist.writeFile(import_path4.default.join(app.dist.cwdPath, "backend", "Dockerfile"), akanConfig.backend.docker.content);
4029
3968
  }
4030
- async startBackend(app, { open: open2 = false, onStart } = {}) {
3969
+ async startBackend(app, { open: open2 = false, onStart, withInk = false } = {}) {
4031
3970
  const { env } = await this.#prepareCommand(app, "start", "backend");
4032
3971
  const ctx = await esbuild2.context({
4033
3972
  write: true,
@@ -4044,7 +3983,11 @@ var ApplicationRunner = class {
4044
3983
  onStart?.();
4045
3984
  if (open2)
4046
3985
  setTimeout(() => (0, import_open.default)("http://localhost:8080/backend/graphql"), 3e3);
4047
- await app.dist.spawn("node", ["--watch", "main.js"], { env, stdio: "inherit", cwd: `${app.dist.cwdPath}/backend` });
3986
+ return app.dist.spawnSync("node", ["--watch", "main.js"], {
3987
+ env,
3988
+ stdio: withInk ? ["ignore", "pipe", "pipe"] : "inherit",
3989
+ cwd: `${app.dist.cwdPath}/backend`
3990
+ });
4048
3991
  }
4049
3992
  async buildFrontend(app, { spawnOptions } = {}) {
4050
3993
  const { env } = await this.#prepareCommand(app, "build", "frontend");
@@ -4078,12 +4021,20 @@ var ApplicationRunner = class {
4078
4021
  ]);
4079
4022
  app.dist.writeFile("frontend/Dockerfile", akanConfig.frontend.docker.content);
4080
4023
  }
4081
- async startFrontend(app, { open: open2 = false, turbo = true, onStart } = {}) {
4024
+ async startFrontend(app, {
4025
+ open: open2 = false,
4026
+ turbo = true,
4027
+ onStart,
4028
+ withInk = false
4029
+ } = {}) {
4082
4030
  const { env } = await this.#prepareCommand(app, "start", "frontend");
4083
4031
  if (open2)
4084
4032
  setTimeout(() => (0, import_open.default)("http://localhost:4200"), 3e3);
4085
4033
  onStart?.();
4086
- await app.spawn("npx", ["next", "dev", "-p", "4200", ...turbo ? ["--turbo"] : []], { env, stdio: "inherit" });
4034
+ return app.spawnSync("npx", ["next", "dev", "-p", "4200", ...turbo ? ["--turbo"] : []], {
4035
+ env,
4036
+ stdio: withInk ? ["ignore", "pipe", "pipe"] : "inherit"
4037
+ });
4087
4038
  }
4088
4039
  async #getViteConfig(app, command, viteConfig = {}) {
4089
4040
  const { env } = await this.#prepareCommand(app, command, "csr");
@@ -4171,38 +4122,41 @@ var ApplicationRunner = class {
4171
4122
  const config = await this.#getViteConfig(app, "build");
4172
4123
  await vite.build(config);
4173
4124
  }
4174
- startCsr(app, { open: open2 = false, onStart } = {}) {
4175
- Interface.Csr(app, async ({ onLog }) => {
4176
- const config = await this.#getViteConfig(app, "start", {
4125
+ async startCsr(app, { open: open2 = false, onStart, withInk = false } = {}) {
4126
+ const eventEmitter = new import_node_events.default();
4127
+ const config = await this.#getViteConfig(
4128
+ app,
4129
+ "start",
4130
+ withInk ? {
4177
4131
  customLogger: {
4178
4132
  info: (msg) => {
4179
- onLog(msg);
4133
+ eventEmitter.emit("info", msg);
4180
4134
  },
4181
4135
  warn: (msg) => {
4182
- onLog(msg);
4136
+ eventEmitter.emit("warn", msg);
4183
4137
  },
4184
4138
  warnOnce: (msg) => {
4185
- onLog(msg);
4139
+ eventEmitter.emit("warnOnce", msg);
4186
4140
  },
4187
4141
  error: (msg) => {
4188
- onLog(msg);
4142
+ eventEmitter.emit("error", msg);
4189
4143
  },
4190
4144
  clearScreen: (type) => {
4191
- onLog(type);
4145
+ eventEmitter.emit("clearScreen", type);
4192
4146
  },
4193
4147
  hasErrorLogged: (error) => {
4194
4148
  return false;
4195
4149
  },
4196
4150
  hasWarned: false
4197
4151
  }
4198
- });
4199
- const env = this.#prepareCommand(app, "start", "csr");
4200
- const server = await vite.createServer(config);
4201
- await server.listen(4201);
4202
- });
4152
+ } : {}
4153
+ );
4154
+ const server = await vite.createServer(config);
4155
+ await server.listen(4201);
4203
4156
  onStart?.();
4204
4157
  if (open2)
4205
4158
  setTimeout(() => (0, import_open.default)("http://localhost:4201"), 3e3);
4159
+ return { server, eventEmitter };
4206
4160
  }
4207
4161
  async buildIos(app) {
4208
4162
  const capacitorApp = await new CapacitorApp(app).init();
@@ -4496,7 +4450,16 @@ var ApplicationScript = class {
4496
4450
  await this.syncApplication(app);
4497
4451
  if (app.workspace.getBaseDevEnv().env === "local")
4498
4452
  await this.dbup(app.workspace);
4499
- await this.#runner.start(app);
4453
+ const backend = await this.startBackend(app, { open: open2, withInk: true });
4454
+ const frontend = await this.startFrontend(app, { open: open2, withInk: true });
4455
+ const { server: csrServer, eventEmitter: csr } = await this.startCsr(app, { open: open2, withInk: true });
4456
+ Interface.Start(app.name, backend, frontend, csr, async () => {
4457
+ await csrServer.close();
4458
+ backend.kill();
4459
+ frontend.kill();
4460
+ csr.removeAllListeners();
4461
+ process.exit(0);
4462
+ });
4500
4463
  }
4501
4464
  async buildBackend(app, { sync = true } = {}) {
4502
4465
  if (sync)
@@ -4505,7 +4468,12 @@ var ApplicationScript = class {
4505
4468
  await this.#runner.buildBackend(app);
4506
4469
  spinner.succeed(`Backend built in dist/apps/${app.name}/backend`);
4507
4470
  }
4508
- async startBackend(app, { open: open2 = false, dbup = true, sync = true } = {}) {
4471
+ async startBackend(app, {
4472
+ open: open2 = false,
4473
+ dbup = true,
4474
+ sync = true,
4475
+ withInk = false
4476
+ } = {}) {
4509
4477
  if (app.getEnv() === "local" && dbup) {
4510
4478
  await this.dbup(app.workspace);
4511
4479
  process.on("SIGINT", async () => {
@@ -4516,12 +4484,14 @@ var ApplicationScript = class {
4516
4484
  if (sync)
4517
4485
  await this.syncApplication(app);
4518
4486
  const spinner = app.spinning("Preparing backend...");
4519
- await this.#runner.startBackend(app, {
4487
+ const childProcess = await this.#runner.startBackend(app, {
4520
4488
  open: open2,
4521
4489
  onStart: () => {
4522
4490
  spinner.succeed(`Backend prepared, ready to start`);
4523
- }
4491
+ },
4492
+ withInk
4524
4493
  });
4494
+ return childProcess;
4525
4495
  }
4526
4496
  async buildFrontend(app, { sync = true, standalone = false } = {}) {
4527
4497
  if (sync)
@@ -4534,17 +4504,24 @@ var ApplicationScript = class {
4534
4504
  spinner.succeed(`Frontend built in dist/apps/${app.name}/frontend`);
4535
4505
  }
4536
4506
  }
4537
- async startFrontend(app, { open: open2 = false, turbo = false, sync = true } = {}) {
4507
+ async startFrontend(app, {
4508
+ open: open2 = false,
4509
+ turbo = false,
4510
+ sync = true,
4511
+ withInk = false
4512
+ } = {}) {
4538
4513
  if (sync)
4539
4514
  await this.syncApplication(app);
4540
4515
  const spinner = app.spinning("Preparing frontend...");
4541
- await this.#runner.startFrontend(app, {
4516
+ const childProcess = await this.#runner.startFrontend(app, {
4542
4517
  open: open2,
4543
4518
  turbo,
4544
4519
  onStart: () => {
4545
4520
  spinner.succeed(`Frontend prepared, ready to start`);
4546
- }
4521
+ },
4522
+ withInk
4547
4523
  });
4524
+ return childProcess;
4548
4525
  }
4549
4526
  async buildCsr(app, { sync = true } = {}) {
4550
4527
  if (sync)
@@ -4553,14 +4530,16 @@ var ApplicationScript = class {
4553
4530
  await this.#runner.buildCsr(app);
4554
4531
  spinner.succeed(`Successfully built in dist/apps/${app.name}/csr`);
4555
4532
  }
4556
- async startCsr(app, { open: open2 = false, sync = true } = {}) {
4533
+ async startCsr(app, { open: open2 = false, sync = true, withInk = false } = {}) {
4557
4534
  if (sync)
4558
4535
  await this.syncApplication(app);
4559
- this.#runner.startCsr(app, {
4536
+ const { eventEmitter, server } = await this.#runner.startCsr(app, {
4560
4537
  open: open2,
4561
4538
  onStart: () => {
4562
- }
4539
+ },
4540
+ withInk
4563
4541
  });
4542
+ return { eventEmitter, server };
4564
4543
  }
4565
4544
  async buildIos(app, { sync = true } = {}) {
4566
4545
  if (sync)