@simplysm/sd-cli 13.0.69 → 13.0.71

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 (201) hide show
  1. package/README.md +10 -957
  2. package/dist/builders/BaseBuilder.d.ts +23 -23
  3. package/dist/builders/BaseBuilder.d.ts.map +1 -1
  4. package/dist/builders/BaseBuilder.js +15 -15
  5. package/dist/builders/DtsBuilder.d.ts +4 -4
  6. package/dist/builders/DtsBuilder.js +1 -1
  7. package/dist/builders/LibraryBuilder.d.ts +3 -3
  8. package/dist/builders/types.d.ts +10 -10
  9. package/dist/capacitor/capacitor.d.ts +36 -36
  10. package/dist/capacitor/capacitor.js +63 -63
  11. package/dist/capacitor/capacitor.js.map +1 -1
  12. package/dist/commands/add-client.d.ts +8 -8
  13. package/dist/commands/add-client.js +15 -15
  14. package/dist/commands/add-client.js.map +1 -1
  15. package/dist/commands/add-server.d.ts +9 -9
  16. package/dist/commands/add-server.js +13 -13
  17. package/dist/commands/add-server.js.map +1 -1
  18. package/dist/commands/build.d.ts +9 -9
  19. package/dist/commands/check.js +3 -3
  20. package/dist/commands/check.js.map +1 -1
  21. package/dist/commands/dev.d.ts +9 -9
  22. package/dist/commands/device.d.ts +9 -9
  23. package/dist/commands/device.d.ts.map +1 -1
  24. package/dist/commands/device.js +17 -17
  25. package/dist/commands/device.js.map +1 -1
  26. package/dist/commands/init.d.ts +6 -6
  27. package/dist/commands/init.js +12 -12
  28. package/dist/commands/init.js.map +1 -1
  29. package/dist/commands/lint.d.ts +23 -23
  30. package/dist/commands/lint.d.ts.map +1 -1
  31. package/dist/commands/lint.js +25 -25
  32. package/dist/commands/lint.js.map +1 -1
  33. package/dist/commands/publish.d.ts +13 -13
  34. package/dist/commands/publish.d.ts.map +1 -1
  35. package/dist/commands/publish.js +61 -61
  36. package/dist/commands/publish.js.map +1 -1
  37. package/dist/commands/replace-deps.d.ts +3 -3
  38. package/dist/commands/replace-deps.d.ts.map +1 -1
  39. package/dist/commands/replace-deps.js +1 -1
  40. package/dist/commands/replace-deps.js.map +1 -1
  41. package/dist/commands/typecheck.d.ts +20 -20
  42. package/dist/commands/typecheck.d.ts.map +1 -1
  43. package/dist/commands/typecheck.js +20 -20
  44. package/dist/commands/typecheck.js.map +1 -1
  45. package/dist/commands/watch.d.ts +7 -7
  46. package/dist/electron/electron.d.ts +27 -27
  47. package/dist/electron/electron.js +32 -32
  48. package/dist/electron/electron.js.map +1 -1
  49. package/dist/infra/ResultCollector.d.ts +9 -9
  50. package/dist/infra/ResultCollector.js +5 -5
  51. package/dist/infra/SignalHandler.d.ts +7 -7
  52. package/dist/infra/SignalHandler.js +4 -4
  53. package/dist/infra/WorkerManager.d.ts +14 -14
  54. package/dist/infra/WorkerManager.js +11 -11
  55. package/dist/orchestrators/BuildOrchestrator.d.ts +19 -19
  56. package/dist/orchestrators/BuildOrchestrator.d.ts.map +1 -1
  57. package/dist/orchestrators/BuildOrchestrator.js +26 -26
  58. package/dist/orchestrators/BuildOrchestrator.js.map +1 -1
  59. package/dist/orchestrators/DevOrchestrator.d.ts +25 -25
  60. package/dist/orchestrators/DevOrchestrator.d.ts.map +1 -1
  61. package/dist/orchestrators/DevOrchestrator.js +30 -30
  62. package/dist/orchestrators/DevOrchestrator.js.map +1 -1
  63. package/dist/orchestrators/WatchOrchestrator.d.ts +13 -13
  64. package/dist/orchestrators/WatchOrchestrator.js +17 -17
  65. package/dist/orchestrators/WatchOrchestrator.js.map +1 -1
  66. package/dist/sd-cli-entry.d.ts +2 -2
  67. package/dist/sd-cli-entry.js +38 -38
  68. package/dist/sd-cli-entry.js.map +1 -1
  69. package/dist/sd-cli.d.ts +2 -2
  70. package/dist/sd-cli.js +1 -1
  71. package/dist/sd-cli.js.map +1 -1
  72. package/dist/sd-config.types.d.ts +84 -84
  73. package/dist/sd-config.types.d.ts.map +1 -1
  74. package/dist/utils/build-env.d.ts +1 -1
  75. package/dist/utils/config-editor.d.ts +5 -5
  76. package/dist/utils/config-editor.js +2 -2
  77. package/dist/utils/config-editor.js.map +1 -1
  78. package/dist/utils/copy-public.d.ts +9 -9
  79. package/dist/utils/copy-src.d.ts +9 -9
  80. package/dist/utils/esbuild-config.d.ts +30 -30
  81. package/dist/utils/esbuild-config.d.ts.map +1 -1
  82. package/dist/utils/output-utils.d.ts +6 -6
  83. package/dist/utils/package-utils.d.ts +6 -6
  84. package/dist/utils/package-utils.js +1 -1
  85. package/dist/utils/package-utils.js.map +1 -1
  86. package/dist/utils/rebuild-manager.js +3 -3
  87. package/dist/utils/rebuild-manager.js.map +1 -1
  88. package/dist/utils/replace-deps.d.ts +25 -25
  89. package/dist/utils/replace-deps.js +3 -3
  90. package/dist/utils/replace-deps.js.map +1 -1
  91. package/dist/utils/sd-config.d.ts +3 -3
  92. package/dist/utils/sd-config.js +3 -3
  93. package/dist/utils/sd-config.js.map +1 -1
  94. package/dist/utils/tailwind-config-deps.d.ts +3 -3
  95. package/dist/utils/template.d.ts +8 -8
  96. package/dist/utils/tsconfig.d.ts +16 -16
  97. package/dist/utils/tsconfig.js +2 -2
  98. package/dist/utils/tsconfig.js.map +1 -1
  99. package/dist/utils/typecheck-serialization.d.ts +8 -8
  100. package/dist/utils/vite-config.d.ts +8 -8
  101. package/dist/utils/vite-config.d.ts.map +1 -1
  102. package/dist/utils/vite-config.js +3 -3
  103. package/dist/utils/worker-events.d.ts +12 -12
  104. package/dist/utils/worker-events.d.ts.map +1 -1
  105. package/dist/utils/worker-utils.d.ts +3 -3
  106. package/dist/utils/worker-utils.js +2 -2
  107. package/dist/utils/worker-utils.js.map +1 -1
  108. package/dist/workers/client.worker.d.ts +14 -14
  109. package/dist/workers/client.worker.d.ts.map +1 -1
  110. package/dist/workers/client.worker.js +1 -1
  111. package/dist/workers/client.worker.js.map +1 -1
  112. package/dist/workers/dts.worker.d.ts +13 -13
  113. package/dist/workers/dts.worker.d.ts.map +1 -1
  114. package/dist/workers/dts.worker.js +3 -3
  115. package/dist/workers/dts.worker.js.map +1 -1
  116. package/dist/workers/library.worker.d.ts +12 -12
  117. package/dist/workers/library.worker.js +1 -1
  118. package/dist/workers/library.worker.js.map +1 -1
  119. package/dist/workers/lint.worker.d.ts +1 -1
  120. package/dist/workers/server-runtime.worker.d.ts +6 -6
  121. package/dist/workers/server-runtime.worker.js +6 -6
  122. package/dist/workers/server-runtime.worker.js.map +1 -1
  123. package/dist/workers/server.worker.d.ts +20 -20
  124. package/dist/workers/server.worker.d.ts.map +1 -1
  125. package/dist/workers/server.worker.js +6 -6
  126. package/dist/workers/server.worker.js.map +1 -1
  127. package/package.json +8 -7
  128. package/src/builders/BaseBuilder.ts +33 -33
  129. package/src/builders/DtsBuilder.ts +5 -5
  130. package/src/builders/LibraryBuilder.ts +9 -9
  131. package/src/builders/types.ts +10 -10
  132. package/src/capacitor/capacitor.ts +119 -119
  133. package/src/commands/add-client.ts +31 -31
  134. package/src/commands/add-server.ts +34 -34
  135. package/src/commands/build.ts +9 -9
  136. package/src/commands/check.ts +5 -5
  137. package/src/commands/dev.ts +9 -9
  138. package/src/commands/device.ts +30 -30
  139. package/src/commands/init.ts +25 -25
  140. package/src/commands/lint.ts +64 -64
  141. package/src/commands/publish.ts +139 -139
  142. package/src/commands/replace-deps.ts +4 -4
  143. package/src/commands/typecheck.ts +74 -74
  144. package/src/commands/watch.ts +7 -7
  145. package/src/electron/electron.ts +51 -51
  146. package/src/infra/ResultCollector.ts +9 -9
  147. package/src/infra/SignalHandler.ts +7 -7
  148. package/src/infra/WorkerManager.ts +14 -14
  149. package/src/orchestrators/BuildOrchestrator.ts +76 -76
  150. package/src/orchestrators/DevOrchestrator.ts +88 -88
  151. package/src/orchestrators/WatchOrchestrator.ts +39 -39
  152. package/src/sd-cli-entry.ts +43 -43
  153. package/src/sd-cli.ts +15 -15
  154. package/src/sd-config.types.ts +85 -85
  155. package/src/utils/build-env.ts +1 -1
  156. package/src/utils/config-editor.ts +19 -19
  157. package/src/utils/copy-public.ts +17 -17
  158. package/src/utils/copy-src.ts +11 -11
  159. package/src/utils/esbuild-config.ts +33 -33
  160. package/src/utils/output-utils.ts +11 -11
  161. package/src/utils/package-utils.ts +12 -12
  162. package/src/utils/rebuild-manager.ts +3 -3
  163. package/src/utils/replace-deps.ts +361 -361
  164. package/src/utils/sd-config.ts +44 -44
  165. package/src/utils/tailwind-config-deps.ts +98 -98
  166. package/src/utils/template.ts +56 -56
  167. package/src/utils/tsconfig.ts +127 -127
  168. package/src/utils/typecheck-serialization.ts +86 -86
  169. package/src/utils/vite-config.ts +341 -341
  170. package/src/utils/worker-events.ts +16 -16
  171. package/src/utils/worker-utils.ts +45 -45
  172. package/src/workers/client.worker.ts +34 -34
  173. package/src/workers/dts.worker.ts +467 -467
  174. package/src/workers/library.worker.ts +314 -314
  175. package/src/workers/lint.worker.ts +16 -16
  176. package/src/workers/server-runtime.worker.ts +157 -157
  177. package/src/workers/server.worker.ts +572 -572
  178. package/templates/add-client/__CLIENT__/package.json.hbs +1 -1
  179. package/templates/add-server/__SERVER__/package.json.hbs +2 -2
  180. package/templates/init/package.json.hbs +3 -3
  181. package/tests/config-editor.spec.ts +160 -0
  182. package/tests/copy-src.spec.ts +50 -0
  183. package/tests/get-compiler-options-for-package.spec.ts +139 -0
  184. package/tests/get-package-source-files.spec.ts +181 -0
  185. package/tests/get-types-from-package-json.spec.ts +107 -0
  186. package/tests/infra/ResultCollector.spec.ts +39 -0
  187. package/tests/infra/SignalHandler.spec.ts +38 -0
  188. package/tests/infra/WorkerManager.spec.ts +97 -0
  189. package/tests/load-ignore-patterns.spec.ts +188 -0
  190. package/tests/load-sd-config.spec.ts +137 -0
  191. package/tests/package-utils.spec.ts +188 -0
  192. package/tests/parse-root-tsconfig.spec.ts +89 -0
  193. package/tests/replace-deps.spec.ts +308 -0
  194. package/tests/run-lint.spec.ts +415 -0
  195. package/tests/run-typecheck.spec.ts +653 -0
  196. package/tests/run-watch.spec.ts +75 -0
  197. package/tests/sd-cli.spec.ts +330 -0
  198. package/tests/tailwind-config-deps.spec.ts +30 -0
  199. package/tests/template.spec.ts +70 -0
  200. package/tests/utils/rebuild-manager.spec.ts +43 -0
  201. package/tests/write-changed-output-files.spec.ts +97 -0
@@ -1,157 +1,157 @@
1
- import proxy from "@fastify/http-proxy";
2
- import { createWorker } from "@simplysm/core-node";
3
- import { errorMessage } from "@simplysm/core-common";
4
- import { consola } from "consola";
5
- import net from "net";
6
- import { pathToFileURL } from "url";
7
- import { registerCleanupHandlers } from "../utils/worker-utils";
8
-
9
- //#region Types
10
-
11
- /**
12
- * Server Runtime 시작 정보
13
- */
14
- export interface ServerRuntimeStartInfo {
15
- mainJsPath: string;
16
- clientPorts: Record<string, number>;
17
- }
18
-
19
- /**
20
- * 서버 준비 이벤트
21
- */
22
- export interface ServerRuntimeReadyEvent {
23
- port: number;
24
- }
25
-
26
- /**
27
- * 에러 이벤트
28
- */
29
- export interface ServerRuntimeErrorEvent {
30
- message: string;
31
- }
32
-
33
- /**
34
- * Worker 이벤트 타입
35
- */
36
- export interface ServerRuntimeWorkerEvents extends Record<string, unknown> {
37
- serverReady: ServerRuntimeReadyEvent;
38
- error: ServerRuntimeErrorEvent;
39
- }
40
-
41
- //#endregion
42
-
43
- const logger = consola.withTag("sd:cli:server-runtime:worker");
44
-
45
- /** 서버 인스턴스 (정리 대상) */
46
- let serverInstance: { close: () => Promise<void> } | undefined;
47
-
48
- /**
49
- * 리소스 정리
50
- */
51
- async function cleanup(): Promise<void> {
52
- const server = serverInstance;
53
- if (server != null) {
54
- await server.close();
55
- }
56
- serverInstance = undefined;
57
- }
58
-
59
- // 서버 listen() 이후 발생하는 런타임 에러를 잡아서 custom "error" 이벤트로 전송
60
- // ( 핸들러가 없으면 worker crash 하고, dev.ts buildResolver 호출되지 않아 listr 멈춤)
61
- process.on("uncaughtException", (err) => {
62
- logger.error("Server Runtime 미처리 오류", err);
63
- sender.send("error", {
64
- message: errorMessage(err),
65
- });
66
- });
67
-
68
- process.on("unhandledRejection", (reason) => {
69
- logger.error("Server Runtime 미처리 Promise 거부", reason);
70
- sender.send("error", {
71
- message: errorMessage(reason),
72
- });
73
- });
74
-
75
- registerCleanupHandlers(cleanup, logger);
76
-
77
- /**
78
- * 포트가 사용 가능한지 확인
79
- */
80
- function isPortAvailable(port: number): Promise<boolean> {
81
- return new Promise((resolve) => {
82
- const server = net.createServer();
83
- server.once("error", () => resolve(false));
84
- server.once("listening", () => {
85
- server.close(() => resolve(true));
86
- });
87
- server.listen(port, "0.0.0.0");
88
- });
89
- }
90
-
91
- /**
92
- * 시작 포트부터 사용 가능한 포트를 찾아 반환
93
- */
94
- async function findAvailablePort(startPort: number, maxRetries = 20): Promise<number> {
95
- for (let i = 0; i < maxRetries; i++) {
96
- const port = startPort + i;
97
- if (await isPortAvailable(port)) {
98
- return port;
99
- }
100
- }
101
- throw new Error(
102
- `포트 ${startPort}부터 ${startPort + maxRetries - 1}까지 사용 가능한 포트가 없습니다.`,
103
- );
104
- }
105
-
106
- /**
107
- * Server Runtime 시작
108
- * main.js import하고, Vite proxy 설정한 listen
109
- */
110
- async function start(info: ServerRuntimeStartInfo): Promise<void> {
111
- try {
112
- // main.js import (server 인스턴스를 export해야 )
113
- const module = await import(pathToFileURL(info.mainJsPath).href);
114
- const server = module.server;
115
-
116
- if (server == null) {
117
- throw new Error("main.js에서 server 인스턴스를 export해야 합니다.");
118
- }
119
-
120
- // 서버 인스턴스 저장 (cleanup)
121
- serverInstance = server;
122
-
123
- // 사용 가능한 포트 탐색 (포트 충돌 자동 증가)
124
- const originalPort = server.options.port;
125
- const availablePort = await findAvailablePort(originalPort);
126
- if (availablePort !== originalPort) {
127
- logger.info(`포트 ${originalPort} 사용 ${availablePort}로 변경`);
128
- server.options.port = availablePort;
129
- }
130
-
131
- // Vite proxy 설정 (clientPorts 있는 경우만)
132
- for (const [name, port] of Object.entries(info.clientPorts)) {
133
- await server.fastify.register(proxy, {
134
- prefix: `/${name}`,
135
- upstream: `http://127.0.0.1:${port}`,
136
- rewritePrefix: `/${name}`,
137
- websocket: true,
138
- });
139
- }
140
-
141
- // 서버 시작
142
- await server.listen();
143
-
144
- sender.send("serverReady", { port: server.options.port });
145
- } catch (err) {
146
- logger.error("Server Runtime 시작 실패", err);
147
- sender.send("error", {
148
- message: errorMessage(err),
149
- });
150
- }
151
- }
152
-
153
- const sender = createWorker<{ start: typeof start }, ServerRuntimeWorkerEvents>({
154
- start,
155
- });
156
-
157
- export default sender;
1
+ import proxy from "@fastify/http-proxy";
2
+ import { createWorker } from "@simplysm/core-node";
3
+ import { errorMessage } from "@simplysm/core-common";
4
+ import { consola } from "consola";
5
+ import net from "net";
6
+ import { pathToFileURL } from "url";
7
+ import { registerCleanupHandlers } from "../utils/worker-utils";
8
+
9
+ //#region Types
10
+
11
+ /**
12
+ * Server runtime start info
13
+ */
14
+ export interface ServerRuntimeStartInfo {
15
+ mainJsPath: string;
16
+ clientPorts: Record<string, number>;
17
+ }
18
+
19
+ /**
20
+ * Server ready event
21
+ */
22
+ export interface ServerRuntimeReadyEvent {
23
+ port: number;
24
+ }
25
+
26
+ /**
27
+ * Error event
28
+ */
29
+ export interface ServerRuntimeErrorEvent {
30
+ message: string;
31
+ }
32
+
33
+ /**
34
+ * Worker event types
35
+ */
36
+ export interface ServerRuntimeWorkerEvents extends Record<string, unknown> {
37
+ serverReady: ServerRuntimeReadyEvent;
38
+ error: ServerRuntimeErrorEvent;
39
+ }
40
+
41
+ //#endregion
42
+
43
+ const logger = consola.withTag("sd:cli:server-runtime:worker");
44
+
45
+ /** Server instance (to be cleaned up) */
46
+ let serverInstance: { close: () => Promise<void> } | undefined;
47
+
48
+ /**
49
+ * Clean up resources
50
+ */
51
+ async function cleanup(): Promise<void> {
52
+ const server = serverInstance;
53
+ if (server != null) {
54
+ await server.close();
55
+ }
56
+ serverInstance = undefined;
57
+ }
58
+
59
+ // Catch runtime errors that occur after server listen() and send them as a custom "error" event
60
+ // (Without this handler, the worker will crash but dev.ts's buildResolver won't be called, causing listr to hang)
61
+ process.on("uncaughtException", (err) => {
62
+ logger.error("Unhandled server runtime error", err);
63
+ sender.send("error", {
64
+ message: errorMessage(err),
65
+ });
66
+ });
67
+
68
+ process.on("unhandledRejection", (reason) => {
69
+ logger.error("Unhandled server runtime promise rejection", reason);
70
+ sender.send("error", {
71
+ message: errorMessage(reason),
72
+ });
73
+ });
74
+
75
+ registerCleanupHandlers(cleanup, logger);
76
+
77
+ /**
78
+ * Check if a port is available for use
79
+ */
80
+ function isPortAvailable(port: number): Promise<boolean> {
81
+ return new Promise((resolve) => {
82
+ const server = net.createServer();
83
+ server.once("error", () => resolve(false));
84
+ server.once("listening", () => {
85
+ server.close(() => resolve(true));
86
+ });
87
+ server.listen(port, "0.0.0.0");
88
+ });
89
+ }
90
+
91
+ /**
92
+ * Find and return an available port starting from the specified port
93
+ */
94
+ async function findAvailablePort(startPort: number, maxRetries = 20): Promise<number> {
95
+ for (let i = 0; i < maxRetries; i++) {
96
+ const port = startPort + i;
97
+ if (await isPortAvailable(port)) {
98
+ return port;
99
+ }
100
+ }
101
+ throw new Error(
102
+ `No available port found between ${startPort} and ${startPort + maxRetries - 1}.`,
103
+ );
104
+ }
105
+
106
+ /**
107
+ * Start Server Runtime
108
+ * Import main.js, configure Vite proxy, then listen
109
+ */
110
+ async function start(info: ServerRuntimeStartInfo): Promise<void> {
111
+ try {
112
+ // Import main.js (must export a server instance)
113
+ const module = await import(pathToFileURL(info.mainJsPath).href);
114
+ const server = module.server;
115
+
116
+ if (server == null) {
117
+ throw new Error("main.js must export a server instance.");
118
+ }
119
+
120
+ // Save server instance (for cleanup)
121
+ serverInstance = server;
122
+
123
+ // Find available port (auto-increment on port conflict)
124
+ const originalPort = server.options.port;
125
+ const availablePort = await findAvailablePort(originalPort);
126
+ if (availablePort !== originalPort) {
127
+ logger.info(`Port ${originalPort} in use, changing to ${availablePort}`);
128
+ server.options.port = availablePort;
129
+ }
130
+
131
+ // Configure Vite proxy (only if clientPorts exists)
132
+ for (const [name, port] of Object.entries(info.clientPorts)) {
133
+ await server.fastify.register(proxy, {
134
+ prefix: `/${name}`,
135
+ upstream: `http://127.0.0.1:${port}`,
136
+ rewritePrefix: `/${name}`,
137
+ websocket: true,
138
+ });
139
+ }
140
+
141
+ // Start server
142
+ await server.listen();
143
+
144
+ sender.send("serverReady", { port: server.options.port });
145
+ } catch (err) {
146
+ logger.error("Server Runtime startup failed", err);
147
+ sender.send("error", {
148
+ message: errorMessage(err),
149
+ });
150
+ }
151
+ }
152
+
153
+ const sender = createWorker<{ start: typeof start }, ServerRuntimeWorkerEvents>({
154
+ start,
155
+ });
156
+
157
+ export default sender;