@akanjs/cli 0.9.21 → 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 -296
  2. package/esm/index.js +274 -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);
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,231 +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", "main.js"], {
3816
- stdio: ["ignore", "pipe", "pipe"],
3817
- // stdin은 무시
3818
- env: backendEnv,
3819
- detached: true,
3820
- cwd: `${app.dist.cwdPath}/backend`
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];
3821
3737
  });
3822
- const frontend = app.spawnSync("npx", ["next", "dev", "-p", "4200"], {
3823
- stdio: ["ignore", "pipe", "pipe"],
3824
- // stdin은 무시
3825
- env: frontendEnv,
3826
- detached: true
3738
+ };
3739
+ (0, import_react3.useEffect)(() => {
3740
+ bcp.stdout?.on("data", (data) => {
3741
+ saveLog("stdout", data, setBackendLogs);
3827
3742
  });
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
- ]);
3743
+ bcp.stderr?.on("data", (data) => {
3744
+ saveLog("stderr", data, setBackendLogs);
3834
3745
  });
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
- ]);
3746
+ fcp.stdout?.on("data", (data) => {
3747
+ saveLog("stdout", data, setFrontendLogs);
3841
3748
  });
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
- ]);
3749
+ fcp.stderr?.on("data", (data) => {
3750
+ saveLog("stderr", data, setFrontendLogs);
3848
3751
  });
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
- ]);
3752
+ csr.on("info", (msg) => {
3753
+ saveLog("info", msg, setCsrLogs);
3855
3754
  });
3856
- void onLoadCsr({
3857
- onLog: (log) => {
3858
- setCsrLogs((prevLogs) => [...prevLogs, { type: "stdout", content: log }]);
3859
- }
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);
3860
3763
  });
3861
3764
  return () => {
3862
- backend.kill();
3863
- 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
+ })();
3864
3775
  };
3865
3776
  }, []);
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(
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(
3867
3778
  MultiScrollList,
3868
3779
  {
3869
3780
  logList: [
3870
3781
  {
3871
- title: `${app.name} frontend`,
3782
+ title: `${appName} frontend`,
3872
3783
  logs: frontendLogs.map((log) => log.content),
3873
3784
  color: "#ff493b"
3874
3785
  },
3875
3786
  {
3876
- title: `${app.name} backend`,
3787
+ title: `${appName} backend`,
3877
3788
  logs: backendLogs.map((log) => log.content),
3878
3789
  color: "#e535ab"
3879
3790
  },
3880
3791
  {
3881
- title: `${app.name} react`,
3792
+ title: `${appName} react`,
3882
3793
  logs: csrLogs.map((log) => log.content),
3883
3794
  color: "#7cc5d9"
3884
3795
  }
3885
- ]
3796
+ ],
3797
+ maxLength
3886
3798
  }
3887
3799
  )));
3888
3800
  };
3889
3801
  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 }))
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;
3894
3841
  };
3895
3842
 
3896
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);
3897
3863
  var ApplicationRunner = class {
3898
3864
  async createApplication(appName, workspace) {
3899
3865
  await workspace.applyTemplate({
@@ -3921,34 +3887,6 @@ var ApplicationRunner = class {
3921
3887
  await app.syncAssets(scanResult.akanConfig.libs);
3922
3888
  return scanResult;
3923
3889
  }
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
3890
  async getScriptFilename(app) {
3953
3891
  if (!app.exists("scripts")) {
3954
3892
  app.mkdir("scripts");
@@ -4028,7 +3966,7 @@ var ApplicationRunner = class {
4028
3966
  app.dist.writeJson("backend/package.json", appPackageJson);
4029
3967
  app.dist.writeFile(import_path4.default.join(app.dist.cwdPath, "backend", "Dockerfile"), akanConfig.backend.docker.content);
4030
3968
  }
4031
- async startBackend(app, { open: open2 = false, onStart } = {}) {
3969
+ async startBackend(app, { open: open2 = false, onStart, withInk = false } = {}) {
4032
3970
  const { env } = await this.#prepareCommand(app, "start", "backend");
4033
3971
  const ctx = await esbuild2.context({
4034
3972
  write: true,
@@ -4045,7 +3983,11 @@ var ApplicationRunner = class {
4045
3983
  onStart?.();
4046
3984
  if (open2)
4047
3985
  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` });
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
+ });
4049
3991
  }
4050
3992
  async buildFrontend(app, { spawnOptions } = {}) {
4051
3993
  const { env } = await this.#prepareCommand(app, "build", "frontend");
@@ -4079,12 +4021,20 @@ var ApplicationRunner = class {
4079
4021
  ]);
4080
4022
  app.dist.writeFile("frontend/Dockerfile", akanConfig.frontend.docker.content);
4081
4023
  }
4082
- 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
+ } = {}) {
4083
4030
  const { env } = await this.#prepareCommand(app, "start", "frontend");
4084
4031
  if (open2)
4085
4032
  setTimeout(() => (0, import_open.default)("http://localhost:4200"), 3e3);
4086
4033
  onStart?.();
4087
- 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
+ });
4088
4038
  }
4089
4039
  async #getViteConfig(app, command, viteConfig = {}) {
4090
4040
  const { env } = await this.#prepareCommand(app, command, "csr");
@@ -4172,38 +4122,41 @@ var ApplicationRunner = class {
4172
4122
  const config = await this.#getViteConfig(app, "build");
4173
4123
  await vite.build(config);
4174
4124
  }
4175
- startCsr(app, { open: open2 = false, onStart } = {}) {
4176
- Interface.Csr(app, async ({ onLog }) => {
4177
- 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 ? {
4178
4131
  customLogger: {
4179
4132
  info: (msg) => {
4180
- onLog(msg);
4133
+ eventEmitter.emit("info", msg);
4181
4134
  },
4182
4135
  warn: (msg) => {
4183
- onLog(msg);
4136
+ eventEmitter.emit("warn", msg);
4184
4137
  },
4185
4138
  warnOnce: (msg) => {
4186
- onLog(msg);
4139
+ eventEmitter.emit("warnOnce", msg);
4187
4140
  },
4188
4141
  error: (msg) => {
4189
- onLog(msg);
4142
+ eventEmitter.emit("error", msg);
4190
4143
  },
4191
4144
  clearScreen: (type) => {
4192
- onLog(type);
4145
+ eventEmitter.emit("clearScreen", type);
4193
4146
  },
4194
4147
  hasErrorLogged: (error) => {
4195
4148
  return false;
4196
4149
  },
4197
4150
  hasWarned: false
4198
4151
  }
4199
- });
4200
- const env = this.#prepareCommand(app, "start", "csr");
4201
- const server = await vite.createServer(config);
4202
- await server.listen(4201);
4203
- });
4152
+ } : {}
4153
+ );
4154
+ const server = await vite.createServer(config);
4155
+ await server.listen(4201);
4204
4156
  onStart?.();
4205
4157
  if (open2)
4206
4158
  setTimeout(() => (0, import_open.default)("http://localhost:4201"), 3e3);
4159
+ return { server, eventEmitter };
4207
4160
  }
4208
4161
  async buildIos(app) {
4209
4162
  const capacitorApp = await new CapacitorApp(app).init();
@@ -4497,7 +4450,16 @@ var ApplicationScript = class {
4497
4450
  await this.syncApplication(app);
4498
4451
  if (app.workspace.getBaseDevEnv().env === "local")
4499
4452
  await this.dbup(app.workspace);
4500
- 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
+ });
4501
4463
  }
4502
4464
  async buildBackend(app, { sync = true } = {}) {
4503
4465
  if (sync)
@@ -4506,7 +4468,12 @@ var ApplicationScript = class {
4506
4468
  await this.#runner.buildBackend(app);
4507
4469
  spinner.succeed(`Backend built in dist/apps/${app.name}/backend`);
4508
4470
  }
4509
- 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
+ } = {}) {
4510
4477
  if (app.getEnv() === "local" && dbup) {
4511
4478
  await this.dbup(app.workspace);
4512
4479
  process.on("SIGINT", async () => {
@@ -4517,12 +4484,14 @@ var ApplicationScript = class {
4517
4484
  if (sync)
4518
4485
  await this.syncApplication(app);
4519
4486
  const spinner = app.spinning("Preparing backend...");
4520
- await this.#runner.startBackend(app, {
4487
+ const childProcess = await this.#runner.startBackend(app, {
4521
4488
  open: open2,
4522
4489
  onStart: () => {
4523
4490
  spinner.succeed(`Backend prepared, ready to start`);
4524
- }
4491
+ },
4492
+ withInk
4525
4493
  });
4494
+ return childProcess;
4526
4495
  }
4527
4496
  async buildFrontend(app, { sync = true, standalone = false } = {}) {
4528
4497
  if (sync)
@@ -4535,17 +4504,24 @@ var ApplicationScript = class {
4535
4504
  spinner.succeed(`Frontend built in dist/apps/${app.name}/frontend`);
4536
4505
  }
4537
4506
  }
4538
- 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
+ } = {}) {
4539
4513
  if (sync)
4540
4514
  await this.syncApplication(app);
4541
4515
  const spinner = app.spinning("Preparing frontend...");
4542
- await this.#runner.startFrontend(app, {
4516
+ const childProcess = await this.#runner.startFrontend(app, {
4543
4517
  open: open2,
4544
4518
  turbo,
4545
4519
  onStart: () => {
4546
4520
  spinner.succeed(`Frontend prepared, ready to start`);
4547
- }
4521
+ },
4522
+ withInk
4548
4523
  });
4524
+ return childProcess;
4549
4525
  }
4550
4526
  async buildCsr(app, { sync = true } = {}) {
4551
4527
  if (sync)
@@ -4554,14 +4530,16 @@ var ApplicationScript = class {
4554
4530
  await this.#runner.buildCsr(app);
4555
4531
  spinner.succeed(`Successfully built in dist/apps/${app.name}/csr`);
4556
4532
  }
4557
- async startCsr(app, { open: open2 = false, sync = true } = {}) {
4533
+ async startCsr(app, { open: open2 = false, sync = true, withInk = false } = {}) {
4558
4534
  if (sync)
4559
4535
  await this.syncApplication(app);
4560
- this.#runner.startCsr(app, {
4536
+ const { eventEmitter, server } = await this.#runner.startCsr(app, {
4561
4537
  open: open2,
4562
4538
  onStart: () => {
4563
- }
4539
+ },
4540
+ withInk
4564
4541
  });
4542
+ return { eventEmitter, server };
4565
4543
  }
4566
4544
  async buildIos(app, { sync = true } = {}) {
4567
4545
  if (sync)