@akanjs/cli 0.9.21 → 0.9.23

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 +282 -296
  2. package/esm/index.js +282 -296
  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);
3566
+ if (key.tab) {
3567
+ setTabIndex((prev) => (prev + 1) % logList.length);
3580
3568
  setScrollPos(0);
3581
- }
3582
- if (input6 === " " && isRunning) {
3583
3569
  setIsRunning(false);
3584
- 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
- setIsRunning(false);
3622
- }
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
3570
  }
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,231 +3589,285 @@ 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) => {
3653
+ return /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement(import_ink2.Text, { key: index }, index, ": ", log));
3654
+ }), /* @__PURE__ */ import_react2.default.createElement(import_ink2.Text, { backgroundColor: "green" }, "Scrolling... +", scrollPos)) : focusLog.map((log, index) => {
3655
+ return /* @__PURE__ */ import_react2.default.createElement(import_react2.default.Fragment, null, /* @__PURE__ */ import_react2.default.createElement(import_ink2.Text, { key: index }, index, ": ", log));
3656
+ })
3657
+ ))), /* @__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
3658
  };
3741
3659
 
3742
- // pkgs/@akanjs/cli/src/application/appilcation.interface.tsx
3743
- var Backend = ({ app, env }) => {
3744
- const [logs, setLogs] = (0, import_react4.useState)([]);
3660
+ // pkgs/@akanjs/cli/src/application/application.interface.tsx
3661
+ var Backend = ({ appName, childProcess, onExit }) => {
3662
+ const [logs, setLogs] = (0, import_react3.useState)([]);
3745
3663
  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) => {
3664
+ (0, import_react3.useEffect)(() => {
3665
+ childProcess.stdout?.on("data", (data) => {
3753
3666
  const newOutput = data.toString().split("\n");
3754
3667
  setLogs((prevLogs) => [...prevLogs, ...newOutput]);
3755
3668
  });
3756
- proc.stderr?.on("data", (data) => {
3669
+ childProcess.stderr?.on("data", (data) => {
3757
3670
  const newOutput = data.toString().split("\n");
3758
3671
  setLogs((prevLogs) => [...prevLogs, ...newOutput]);
3759
3672
  });
3760
3673
  return () => {
3761
- proc.kill();
3674
+ childProcess.kill();
3675
+ onExit();
3762
3676
  };
3763
3677
  }, []);
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"));
3678
+ 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
3679
  };
3766
- var Frontend = ({ app, env }) => {
3767
- const [logs, setLogs] = (0, import_react4.useState)([]);
3680
+ var Frontend = ({ appName, childProcess, onExit }) => {
3681
+ const [logs, setLogs] = (0, import_react3.useState)([]);
3768
3682
  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) => {
3683
+ (0, import_react3.useEffect)(() => {
3684
+ childProcess.stdout?.on("data", (data) => {
3776
3685
  const newOutput = data.toString().split("\n");
3777
3686
  setLogs((prevLogs) => [...prevLogs, ...newOutput]);
3778
3687
  });
3779
- proc.stderr?.on("data", (data) => {
3688
+ childProcess.stderr?.on("data", (data) => {
3780
3689
  const newOutput = data.toString().split("\n");
3781
3690
  setLogs((prevLogs) => [...prevLogs, ...newOutput]);
3782
3691
  });
3783
3692
  return () => {
3784
- proc.kill();
3693
+ childProcess.kill();
3694
+ onExit();
3785
3695
  };
3786
3696
  }, []);
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)));
3697
+ 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
3698
  };
3789
- var Csr = ({
3790
- app,
3791
- onLoad
3792
- }) => {
3793
- const [logs, setLogs] = (0, import_react4.useState)([]);
3699
+ var Csr = ({ app, event, onExit }) => {
3700
+ const [logs, setLogs] = (0, import_react3.useState)([]);
3794
3701
  const [width, height] = useStdoutDimensions();
3795
- (0, import_react4.useEffect)(() => {
3796
- void onLoad({
3797
- onLog: (log) => {
3798
- setLogs((prevLogs) => [...prevLogs, log]);
3799
- }
3702
+ const [test, setTest] = (0, import_react3.useState)(false);
3703
+ (0, import_react3.useEffect)(() => {
3704
+ event.on("info", (msg) => {
3705
+ setLogs((prevLogs) => [...prevLogs, msg]);
3706
+ });
3707
+ event.on("warn", (msg) => {
3708
+ setLogs((prevLogs) => [...prevLogs, msg]);
3709
+ });
3710
+ event.on("warnOnce", (msg) => {
3711
+ setLogs((prevLogs) => [...prevLogs, msg]);
3712
+ });
3713
+ event.on("error", (msg) => {
3714
+ setLogs((prevLogs) => [...prevLogs, msg]);
3715
+ });
3716
+ event.on("clearScreen", (type) => {
3717
+ setLogs((prevLogs) => [...prevLogs, type]);
3800
3718
  });
3801
3719
  }, []);
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 }));
3720
+ 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
3721
  };
3804
- var Start = ({
3805
- app,
3806
- backendEnv,
3807
- frontendEnv,
3808
- onLoadCsr
3809
- }) => {
3722
+ var Start = ({ appName, bcp, fcp, csr, onExit, maxLength = 100 }) => {
3810
3723
  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", "main.js"], {
3816
- stdio: ["ignore", "pipe", "pipe"],
3817
- // stdin은 무시
3818
- env: backendEnv,
3819
- detached: true,
3820
- cwd: `${app.dist.cwdPath}/backend`
3724
+ const [csrLogs, setCsrLogs] = (0, import_react3.useState)([]);
3725
+ const [backendLogs, setBackendLogs] = (0, import_react3.useState)([]);
3726
+ const [frontendLogs, setFrontendLogs] = (0, import_react3.useState)([]);
3727
+ const { exit } = (0, import_ink3.useApp)();
3728
+ const filterLogData = (data) => {
3729
+ return typeof data === "string" ? data.split(/\r?\n/).filter((line) => line !== "") : data.toString().split(/\r?\n/).filter((line) => line !== "");
3730
+ };
3731
+ const saveLog = (type, data, setLog) => {
3732
+ const newOutput = filterLogData(data);
3733
+ const logs = newOutput.map((line) => ({ type, content: line }));
3734
+ setLog((currentLogs) => {
3735
+ if (currentLogs.length >= maxLength) {
3736
+ return [...currentLogs.slice(logs.length, maxLength), ...logs];
3737
+ } else if (currentLogs.length < maxLength && currentLogs.length + logs.length > maxLength) {
3738
+ return [...currentLogs.slice(Math.abs(maxLength - currentLogs.length - logs.length), maxLength), ...logs];
3739
+ } else
3740
+ return [...currentLogs, ...logs];
3821
3741
  });
3822
- const frontend = app.spawnSync("npx", ["next", "dev", "-p", "4200"], {
3823
- stdio: ["ignore", "pipe", "pipe"],
3824
- // stdin은 무시
3825
- env: frontendEnv,
3826
- detached: true
3742
+ };
3743
+ (0, import_react3.useEffect)(() => {
3744
+ bcp.stdout?.on("data", (data) => {
3745
+ saveLog("stdout", data, setBackendLogs);
3827
3746
  });
3828
- backend.stdout?.on("data", (data) => {
3829
- const newOutput = data.toString().split("\n");
3830
- setBackendLogs((currentLogs) => [
3831
- ...currentLogs,
3832
- ...newOutput.map((line) => ({ type: "stdout", content: line }))
3833
- ]);
3747
+ bcp.stderr?.on("data", (data) => {
3748
+ saveLog("stderr", data, setBackendLogs);
3834
3749
  });
3835
- backend.stderr?.on("data", (data) => {
3836
- const newOutput = data.toString().split("\n");
3837
- setBackendLogs((currentLogs) => [
3838
- ...currentLogs,
3839
- ...newOutput.map((line) => ({ type: "stderr", content: line }))
3840
- ]);
3750
+ fcp.stdout?.on("data", (data) => {
3751
+ saveLog("stdout", data, setFrontendLogs);
3841
3752
  });
3842
- frontend.stdout?.on("data", (data) => {
3843
- const newOutput = data.toString().split("\n");
3844
- setFrontendLogs((currentLogs) => [
3845
- ...currentLogs,
3846
- ...newOutput.map((line) => ({ type: "stdout", content: line }))
3847
- ]);
3753
+ fcp.stderr?.on("data", (data) => {
3754
+ saveLog("stderr", data, setFrontendLogs);
3848
3755
  });
3849
- frontend.stderr?.on("data", (data) => {
3850
- const newOutput = data.toString().split("\n");
3851
- setFrontendLogs((currentLogs) => [
3852
- ...currentLogs,
3853
- ...newOutput.map((line) => ({ type: "stderr", content: line }))
3854
- ]);
3756
+ csr.on("info", (msg) => {
3757
+ saveLog("info", msg, setCsrLogs);
3855
3758
  });
3856
- void onLoadCsr({
3857
- onLog: (log) => {
3858
- setCsrLogs((prevLogs) => [...prevLogs, { type: "stdout", content: log }]);
3859
- }
3759
+ csr.on("warn", (msg) => {
3760
+ saveLog("warn", msg, setCsrLogs);
3761
+ });
3762
+ csr.on("error", (msg) => {
3763
+ saveLog("error", msg, setCsrLogs);
3764
+ });
3765
+ csr.on("clearScreen", (type) => {
3766
+ saveLog("clearScreen", type, setCsrLogs);
3767
+ });
3768
+ const destroy = async () => {
3769
+ bcp.kill();
3770
+ fcp.kill();
3771
+ bcp.stdin?.end();
3772
+ fcp.stdin?.end();
3773
+ csr.removeAllListeners();
3774
+ await onExit();
3775
+ exit();
3776
+ process.exit(0);
3777
+ };
3778
+ process.on("SIGINT", () => {
3779
+ void destroy();
3860
3780
  });
3861
3781
  return () => {
3862
- backend.kill();
3863
- frontend.kill();
3782
+ void destroy();
3864
3783
  };
3865
3784
  }, []);
3866
- 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(
3785
+ 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(
3867
3786
  MultiScrollList,
3868
3787
  {
3869
3788
  logList: [
3870
3789
  {
3871
- title: `${app.name} frontend`,
3790
+ title: `${appName} frontend`,
3872
3791
  logs: frontendLogs.map((log) => log.content),
3873
3792
  color: "#ff493b"
3874
3793
  },
3875
3794
  {
3876
- title: `${app.name} backend`,
3795
+ title: `${appName} backend`,
3877
3796
  logs: backendLogs.map((log) => log.content),
3878
3797
  color: "#e535ab"
3879
3798
  },
3880
3799
  {
3881
- title: `${app.name} react`,
3800
+ title: `${appName} react`,
3882
3801
  logs: csrLogs.map((log) => log.content),
3883
3802
  color: "#7cc5d9"
3884
3803
  }
3885
- ]
3804
+ ],
3805
+ maxLength
3886
3806
  }
3887
3807
  )));
3888
3808
  };
3889
3809
  var Interface = {
3890
- Csr: (app, onLoad) => (0, import_ink4.render)(/* @__PURE__ */ import_react4.default.createElement(Csr, { app, onLoad })),
3891
- Backend: (app, env) => (0, import_ink4.render)(/* @__PURE__ */ import_react4.default.createElement(Backend, { app, env })),
3892
- Frontend: (app, env) => (0, import_ink4.render)(/* @__PURE__ */ import_react4.default.createElement(Frontend, { app, env })),
3893
- Start: (app, backendEnv, frontendEnv, onLoadCsr) => (0, import_ink4.render)(/* @__PURE__ */ import_react4.default.createElement(Start, { app, backendEnv, frontendEnv, onLoadCsr }))
3810
+ /**
3811
+ * Akan CSR 실행 컴포넌트
3812
+ *
3813
+ * @param app 정보
3814
+ * @param event CSR 이벤트 발생기
3815
+ * @param onExit 종료 함수
3816
+ */
3817
+ Csr: (app, event, onExit) => renderManager(/* @__PURE__ */ import_react3.default.createElement(Csr, { app, event, onExit })),
3818
+ /**
3819
+ * Akan Backend 실행 컴포넌트
3820
+ *
3821
+ * @param appName 앱 이름
3822
+ * @param childProcess 백엔드 차일드 프로세스
3823
+ * @param onExit 종료 함수
3824
+ */
3825
+ Backend: (appName, childProcess, onExit) => renderManager(/* @__PURE__ */ import_react3.default.createElement(Backend, { appName, childProcess, onExit })),
3826
+ /**
3827
+ * Akan Frontend 실행 컴포넌트
3828
+ *
3829
+ * @param appName 앱 이름
3830
+ * @param childProcess 프론트엔드 차일드 프로세스
3831
+ * @param onExit 종료 함수
3832
+ */
3833
+ Frontend: (appName, childProcess, onExit) => renderManager(/* @__PURE__ */ import_react3.default.createElement(Frontend, { appName, childProcess, onExit })),
3834
+ /**
3835
+ * Akan application 통합 실행 컴포넌트 (백엔드, 프론트엔드, React(CSR))
3836
+ *
3837
+ * @param maxLength 로그 최대 길이
3838
+ * @param appName 앱 이름
3839
+ * @param bcp 백엔드 차일드 프로세스
3840
+ * @param fcp 프론트엔드 차일드 프로세스
3841
+ * @param csr CSR 이벤트 발생기
3842
+ * @param onExit 종료 함수
3843
+ */
3844
+ Start: (appName, bcp, fcp, csr, onExit) => renderManager(/* @__PURE__ */ import_react3.default.createElement(Start, { appName, bcp, fcp, csr, onExit }))
3845
+ };
3846
+ var renderManager = (component) => {
3847
+ const renderFn = (0, import_ink3.render)(component);
3848
+ return renderFn;
3894
3849
  };
3895
3850
 
3896
3851
  // pkgs/@akanjs/cli/src/application/application.runner.ts
3852
+ var import_node_events = __toESM(require("node:events"), 1);
3853
+ var import_prompts6 = require("@inquirer/prompts");
3854
+ var import_output_parsers = require("@langchain/core/output_parsers");
3855
+ var import_prompts7 = require("@langchain/core/prompts");
3856
+ var import_runnables2 = require("@langchain/core/runnables");
3857
+ var import_openai3 = require("@langchain/openai");
3858
+ var import_plugin_react = __toESM(require("@vitejs/plugin-react"), 1);
3859
+ var import_dotenv3 = __toESM(require("dotenv"), 1);
3860
+ var esbuild2 = __toESM(require("esbuild"), 1);
3861
+ var import_fs10 = __toESM(require("fs"), 1);
3862
+ var import_promises3 = __toESM(require("fs/promises"), 1);
3863
+ var import_js_yaml2 = __toESM(require("js-yaml"), 1);
3864
+ var import_open = __toESM(require("open"), 1);
3865
+ var import_ora3 = __toESM(require("ora"), 1);
3866
+ var import_path4 = __toESM(require("path"), 1);
3867
+ var vite = __toESM(require("vite"), 1);
3868
+ var import_vite_plugin_commonjs = __toESM(require("vite-plugin-commonjs"), 1);
3869
+ var import_vite_plugin_node_polyfills = require("vite-plugin-node-polyfills");
3870
+ var import_vite_tsconfig_paths = __toESM(require("vite-tsconfig-paths"), 1);
3897
3871
  var ApplicationRunner = class {
3898
3872
  async createApplication(appName, workspace) {
3899
3873
  await workspace.applyTemplate({
@@ -3921,34 +3895,6 @@ var ApplicationRunner = class {
3921
3895
  await app.syncAssets(scanResult.akanConfig.libs);
3922
3896
  return scanResult;
3923
3897
  }
3924
- async start(app) {
3925
- const { env: frontendEnv } = await this.#prepareCommand(app, "start", "frontend");
3926
- const { env: backendEnv } = await this.#prepareCommand(app, "start", "backend");
3927
- Interface.Start(app, backendEnv, frontendEnv, async ({ onLog }) => {
3928
- const config = await this.#getViteConfig(app, "start", {
3929
- customLogger: {
3930
- info: (msg) => {
3931
- onLog(msg);
3932
- },
3933
- warn: (msg) => {
3934
- },
3935
- warnOnce: (msg) => {
3936
- },
3937
- error: (msg) => {
3938
- onLog(msg);
3939
- },
3940
- clearScreen: (type) => {
3941
- },
3942
- hasErrorLogged: (error) => {
3943
- return false;
3944
- },
3945
- hasWarned: false
3946
- }
3947
- });
3948
- const server = await vite.createServer(config);
3949
- await server.listen(4201);
3950
- });
3951
- }
3952
3898
  async getScriptFilename(app) {
3953
3899
  if (!app.exists("scripts")) {
3954
3900
  app.mkdir("scripts");
@@ -4028,7 +3974,7 @@ var ApplicationRunner = class {
4028
3974
  app.dist.writeJson("backend/package.json", appPackageJson);
4029
3975
  app.dist.writeFile(import_path4.default.join(app.dist.cwdPath, "backend", "Dockerfile"), akanConfig.backend.docker.content);
4030
3976
  }
4031
- async startBackend(app, { open: open2 = false, onStart } = {}) {
3977
+ async startBackend(app, { open: open2 = false, onStart, withInk = false } = {}) {
4032
3978
  const { env } = await this.#prepareCommand(app, "start", "backend");
4033
3979
  const ctx = await esbuild2.context({
4034
3980
  write: true,
@@ -4045,7 +3991,11 @@ var ApplicationRunner = class {
4045
3991
  onStart?.();
4046
3992
  if (open2)
4047
3993
  setTimeout(() => (0, import_open.default)("http://localhost:8080/backend/graphql"), 3e3);
4048
- await app.dist.spawn("node", ["--watch", "main.js"], { env, stdio: "inherit", cwd: `${app.dist.cwdPath}/backend` });
3994
+ return app.dist.spawnSync("node", ["--watch", "main.js"], {
3995
+ env,
3996
+ stdio: withInk ? ["ignore", "pipe", "pipe"] : "inherit",
3997
+ cwd: `${app.dist.cwdPath}/backend`
3998
+ });
4049
3999
  }
4050
4000
  async buildFrontend(app, { spawnOptions } = {}) {
4051
4001
  const { env } = await this.#prepareCommand(app, "build", "frontend");
@@ -4079,12 +4029,20 @@ var ApplicationRunner = class {
4079
4029
  ]);
4080
4030
  app.dist.writeFile("frontend/Dockerfile", akanConfig.frontend.docker.content);
4081
4031
  }
4082
- async startFrontend(app, { open: open2 = false, turbo = true, onStart } = {}) {
4032
+ async startFrontend(app, {
4033
+ open: open2 = false,
4034
+ turbo = true,
4035
+ onStart,
4036
+ withInk = false
4037
+ } = {}) {
4083
4038
  const { env } = await this.#prepareCommand(app, "start", "frontend");
4084
4039
  if (open2)
4085
4040
  setTimeout(() => (0, import_open.default)("http://localhost:4200"), 3e3);
4086
4041
  onStart?.();
4087
- await app.spawn("npx", ["next", "dev", "-p", "4200", ...turbo ? ["--turbo"] : []], { env, stdio: "inherit" });
4042
+ return app.spawnSync("npx", ["next", "dev", "-p", "4200", ...turbo ? ["--turbo"] : []], {
4043
+ env,
4044
+ stdio: withInk ? ["ignore", "pipe", "pipe"] : "inherit"
4045
+ });
4088
4046
  }
4089
4047
  async #getViteConfig(app, command, viteConfig = {}) {
4090
4048
  const { env } = await this.#prepareCommand(app, command, "csr");
@@ -4172,38 +4130,41 @@ var ApplicationRunner = class {
4172
4130
  const config = await this.#getViteConfig(app, "build");
4173
4131
  await vite.build(config);
4174
4132
  }
4175
- startCsr(app, { open: open2 = false, onStart } = {}) {
4176
- Interface.Csr(app, async ({ onLog }) => {
4177
- const config = await this.#getViteConfig(app, "start", {
4133
+ async startCsr(app, { open: open2 = false, onStart, withInk = false } = {}) {
4134
+ const eventEmitter = new import_node_events.default();
4135
+ const config = await this.#getViteConfig(
4136
+ app,
4137
+ "start",
4138
+ withInk ? {
4178
4139
  customLogger: {
4179
4140
  info: (msg) => {
4180
- onLog(msg);
4141
+ eventEmitter.emit("info", msg);
4181
4142
  },
4182
4143
  warn: (msg) => {
4183
- onLog(msg);
4144
+ eventEmitter.emit("warn", msg);
4184
4145
  },
4185
4146
  warnOnce: (msg) => {
4186
- onLog(msg);
4147
+ eventEmitter.emit("warnOnce", msg);
4187
4148
  },
4188
4149
  error: (msg) => {
4189
- onLog(msg);
4150
+ eventEmitter.emit("error", msg);
4190
4151
  },
4191
4152
  clearScreen: (type) => {
4192
- onLog(type);
4153
+ eventEmitter.emit("clearScreen", type);
4193
4154
  },
4194
4155
  hasErrorLogged: (error) => {
4195
4156
  return false;
4196
4157
  },
4197
4158
  hasWarned: false
4198
4159
  }
4199
- });
4200
- const env = this.#prepareCommand(app, "start", "csr");
4201
- const server = await vite.createServer(config);
4202
- await server.listen(4201);
4203
- });
4160
+ } : {}
4161
+ );
4162
+ const server = await vite.createServer(config);
4163
+ await server.listen(4201);
4204
4164
  onStart?.();
4205
4165
  if (open2)
4206
4166
  setTimeout(() => (0, import_open.default)("http://localhost:4201"), 3e3);
4167
+ return { server, eventEmitter };
4207
4168
  }
4208
4169
  async buildIos(app) {
4209
4170
  const capacitorApp = await new CapacitorApp(app).init();
@@ -4497,7 +4458,16 @@ var ApplicationScript = class {
4497
4458
  await this.syncApplication(app);
4498
4459
  if (app.workspace.getBaseDevEnv().env === "local")
4499
4460
  await this.dbup(app.workspace);
4500
- await this.#runner.start(app);
4461
+ const backend = await this.startBackend(app, { open: open2, withInk: true });
4462
+ const frontend = await this.startFrontend(app, { open: open2, withInk: true });
4463
+ const { server: csrServer, eventEmitter: csr } = await this.startCsr(app, { open: open2, withInk: true });
4464
+ Interface.Start(app.name, backend, frontend, csr, async () => {
4465
+ await csrServer.close();
4466
+ backend.kill();
4467
+ frontend.kill();
4468
+ csr.removeAllListeners();
4469
+ process.exit(0);
4470
+ });
4501
4471
  }
4502
4472
  async buildBackend(app, { sync = true } = {}) {
4503
4473
  if (sync)
@@ -4506,7 +4476,12 @@ var ApplicationScript = class {
4506
4476
  await this.#runner.buildBackend(app);
4507
4477
  spinner.succeed(`Backend built in dist/apps/${app.name}/backend`);
4508
4478
  }
4509
- async startBackend(app, { open: open2 = false, dbup = true, sync = true } = {}) {
4479
+ async startBackend(app, {
4480
+ open: open2 = false,
4481
+ dbup = true,
4482
+ sync = true,
4483
+ withInk = false
4484
+ } = {}) {
4510
4485
  if (app.getEnv() === "local" && dbup) {
4511
4486
  await this.dbup(app.workspace);
4512
4487
  process.on("SIGINT", async () => {
@@ -4517,12 +4492,14 @@ var ApplicationScript = class {
4517
4492
  if (sync)
4518
4493
  await this.syncApplication(app);
4519
4494
  const spinner = app.spinning("Preparing backend...");
4520
- await this.#runner.startBackend(app, {
4495
+ const childProcess = await this.#runner.startBackend(app, {
4521
4496
  open: open2,
4522
4497
  onStart: () => {
4523
4498
  spinner.succeed(`Backend prepared, ready to start`);
4524
- }
4499
+ },
4500
+ withInk
4525
4501
  });
4502
+ return childProcess;
4526
4503
  }
4527
4504
  async buildFrontend(app, { sync = true, standalone = false } = {}) {
4528
4505
  if (sync)
@@ -4535,17 +4512,24 @@ var ApplicationScript = class {
4535
4512
  spinner.succeed(`Frontend built in dist/apps/${app.name}/frontend`);
4536
4513
  }
4537
4514
  }
4538
- async startFrontend(app, { open: open2 = false, turbo = false, sync = true } = {}) {
4515
+ async startFrontend(app, {
4516
+ open: open2 = false,
4517
+ turbo = false,
4518
+ sync = true,
4519
+ withInk = false
4520
+ } = {}) {
4539
4521
  if (sync)
4540
4522
  await this.syncApplication(app);
4541
4523
  const spinner = app.spinning("Preparing frontend...");
4542
- await this.#runner.startFrontend(app, {
4524
+ const childProcess = await this.#runner.startFrontend(app, {
4543
4525
  open: open2,
4544
4526
  turbo,
4545
4527
  onStart: () => {
4546
4528
  spinner.succeed(`Frontend prepared, ready to start`);
4547
- }
4529
+ },
4530
+ withInk
4548
4531
  });
4532
+ return childProcess;
4549
4533
  }
4550
4534
  async buildCsr(app, { sync = true } = {}) {
4551
4535
  if (sync)
@@ -4554,14 +4538,16 @@ var ApplicationScript = class {
4554
4538
  await this.#runner.buildCsr(app);
4555
4539
  spinner.succeed(`Successfully built in dist/apps/${app.name}/csr`);
4556
4540
  }
4557
- async startCsr(app, { open: open2 = false, sync = true } = {}) {
4541
+ async startCsr(app, { open: open2 = false, sync = true, withInk = false } = {}) {
4558
4542
  if (sync)
4559
4543
  await this.syncApplication(app);
4560
- this.#runner.startCsr(app, {
4544
+ const { eventEmitter, server } = await this.#runner.startCsr(app, {
4561
4545
  open: open2,
4562
4546
  onStart: () => {
4563
- }
4547
+ },
4548
+ withInk
4564
4549
  });
4550
+ return { eventEmitter, server };
4565
4551
  }
4566
4552
  async buildIos(app, { sync = true } = {}) {
4567
4553
  if (sync)