@simplysm/sd-cli 14.0.64 → 14.0.66

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 (79) hide show
  1. package/dist/capacitor/capacitor-android.d.ts +2 -0
  2. package/dist/capacitor/capacitor-android.d.ts.map +1 -1
  3. package/dist/capacitor/capacitor-android.js +13 -0
  4. package/dist/capacitor/capacitor-android.js.map +1 -1
  5. package/dist/capacitor/capacitor-npm-config.d.ts.map +1 -1
  6. package/dist/capacitor/capacitor-npm-config.js +2 -6
  7. package/dist/capacitor/capacitor-npm-config.js.map +1 -1
  8. package/dist/electron/electron.d.ts.map +1 -1
  9. package/dist/electron/electron.js +1 -2
  10. package/dist/electron/electron.js.map +1 -1
  11. package/package.json +13 -13
  12. package/src/capacitor/capacitor-android.ts +14 -0
  13. package/src/capacitor/capacitor-npm-config.ts +2 -6
  14. package/src/electron/electron.ts +1 -2
  15. package/tests/angular/ngtsc-build-core.acc.spec.ts +36 -94
  16. package/tests/capacitor/capacitor-android.spec.ts +65 -28
  17. package/tests/capacitor/capacitor-build.spec.ts +40 -385
  18. package/tests/capacitor/capacitor-config-writer.acc.spec.ts +3 -17
  19. package/tests/capacitor/capacitor-config-writer.spec.ts +3 -17
  20. package/tests/capacitor/capacitor-init.spec.ts +40 -636
  21. package/tests/capacitor/capacitor-npm-config.acc.spec.ts +38 -168
  22. package/tests/capacitor/capacitor-npm-config.spec.ts +33 -71
  23. package/tests/commands/check.spec.ts +25 -36
  24. package/tests/commands/deployment-phase.acc.spec.ts +17 -26
  25. package/tests/commands/git-phase.acc.spec.ts +13 -112
  26. package/tests/commands/lint.spec.ts +7 -24
  27. package/tests/commands/post-publish-phase.acc.spec.ts +5 -10
  28. package/tests/commands/typecheck.spec.ts +43 -65
  29. package/tests/electron/electron.spec.ts +22 -46
  30. package/tests/engines/base-engine.spec.ts +4 -13
  31. package/tests/engines/engine-selection.spec.ts +14 -17
  32. package/tests/engines/engine-typecheck-selection.acc.spec.ts +13 -16
  33. package/tests/engines/esbuild-client-engine.acc.spec.ts +36 -40
  34. package/tests/engines/esbuild-client-engine.spec.ts +4 -23
  35. package/tests/engines/ngtsc-engine.spec.ts +3 -10
  36. package/tests/engines/server-esbuild-engine.spec.ts +3 -10
  37. package/tests/engines/tsc-engine.spec.ts +3 -10
  38. package/tests/esbuild/esbuild-tsc-plugin.acc.spec.ts +3 -8
  39. package/tests/esbuild/esbuild-tsc-plugin.spec.ts +3 -8
  40. package/tests/orchestrators/build-orchestrator.spec.ts +57 -102
  41. package/tests/orchestrators/dev-orchestrator.spec.ts +68 -109
  42. package/tests/orchestrators/typecheck-orchestrator.spec.ts +25 -57
  43. package/tests/orchestrators/watch-orchestrator.spec.ts +73 -99
  44. package/tests/sd-cli-entry.spec.ts +17 -20
  45. package/tests/utils/angular-source-file-cache.spec.ts +4 -8
  46. package/tests/utils/copy-src.spec.ts +9 -20
  47. package/tests/utils/esbuild-client-config.acc.spec.ts +9 -15
  48. package/tests/utils/esbuild-client-config.spec.ts +12 -24
  49. package/tests/utils/esbuild-config.spec.ts +51 -42
  50. package/tests/utils/lint-core.spec.ts +13 -19
  51. package/tests/utils/lint-utils.spec.ts +8 -15
  52. package/tests/utils/lint-with-program.spec.ts +3 -7
  53. package/tests/utils/ngtsc-build-core.spec.ts +2 -99
  54. package/tests/utils/orchestrator-utils.spec.ts +7 -20
  55. package/tests/utils/output-utils.spec.ts +5 -11
  56. package/tests/utils/sd-config.spec.ts +4 -12
  57. package/tests/utils/typecheck-env.spec.ts +49 -77
  58. package/tests/utils/typecheck-non-package.spec.ts +23 -16
  59. package/tests/workers/build-watch-paths.acc.spec.ts +4 -10
  60. package/tests/workers/build-watch-paths.spec.ts +4 -9
  61. package/tests/workers/client-worker.acc.spec.ts +64 -137
  62. package/tests/workers/client-worker.spec.ts +63 -89
  63. package/tests/workers/library-build-lint.spec.ts +19 -30
  64. package/tests/workers/library-build-worker.spec.ts +28 -55
  65. package/tests/workers/server-esbuild-context.acc.spec.ts +6 -15
  66. package/tests/workers/server-esbuild-context.spec.ts +7 -16
  67. package/tests/workers/server-runtime-worker.spec.ts +8 -10
  68. package/tests/workers/shared-worker-lifecycle.acc.spec.ts +3 -5
  69. package/tests/workers/shared-worker-lifecycle.spec.ts +4 -5
  70. package/tests/capacitor/capacitor-icon.spec.ts +0 -285
  71. package/tests/capacitor/capacitor-run.spec.ts +0 -256
  72. package/tests/capacitor/capacitor-workspace.spec.ts +0 -203
  73. package/tests/commands/device.spec.ts +0 -237
  74. package/tests/commands/publish.spec.ts +0 -1183
  75. package/tests/utils/external-modules.spec.ts +0 -217
  76. package/tests/workers/server-build-lint.spec.ts +0 -201
  77. package/tests/workers/server-build-worker.spec.ts +0 -765
  78. package/tests/workers/server-watch-manager.acc.spec.ts +0 -162
  79. package/tests/workers/server-watch-manager.spec.ts +0 -199
@@ -1,6 +1,8 @@
1
1
  import { describe, it, expect, vi, beforeEach } from "vitest";
2
-
3
- // --- Mock factories (vi.mock is hoisted) ---
2
+ import { existsSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import path from "node:path";
5
+ import { Worker } from "@simplysm/core-node";
4
6
 
5
7
  const mockWorker = {
6
8
  build: vi.fn(),
@@ -10,24 +12,9 @@ const mockWorker = {
10
12
  on: vi.fn(),
11
13
  };
12
14
 
13
- vi.mock("@simplysm/core-node", () => ({
14
- Worker: {
15
- create: vi.fn(() => mockWorker),
16
- },
17
- }));
18
-
19
- // fs mock for .dev-port deletion in stop()
20
- const mockUnlinkSync = vi.fn();
21
- vi.mock("node:fs", () => ({
22
- default: {
23
- unlinkSync: (...args: any[]) => mockUnlinkSync(...args),
24
- },
25
- unlinkSync: (...args: any[]) => mockUnlinkSync(...args),
26
- }));
15
+ vi.spyOn(Worker, "create").mockReturnValue(mockWorker as any);
27
16
 
28
- // --- Dynamic imports after mocking ---
29
-
30
- const { EsbuildClientEngine } = await import("../../src/engines/EsbuildClientEngine");
17
+ import { EsbuildClientEngine } from "../../src/engines/EsbuildClientEngine";
31
18
 
32
19
  import type { ClientPackageInfo } from "../../src/engines/types";
33
20
 
@@ -244,26 +231,35 @@ describe("EsbuildClientEngine Acceptance", () => {
244
231
 
245
232
  // Scenario: 엔진 중지
246
233
  it("stop()으로 worker를 종료하고 .dev-port를 삭제한다", async () => {
247
- // Given: dev watch 모드가 실행 중이다
248
- mockWorker.startWatch.mockResolvedValue({ success: true });
249
-
250
- const engine = new EsbuildClientEngine({
251
- cwd: "/root",
252
- pkg: createMockPkg({ dir: "/packages/my-client" }),
253
- });
254
-
255
- await engine.startWatch({ js: true, dts: false });
256
-
257
- // When: stop()이 호출된다
258
- await engine.stop();
259
-
260
- // Then: worker가 종료된다
261
- expect(mockWorker.stopWatch).toHaveBeenCalled();
262
- expect(mockWorker.terminate).toHaveBeenCalled();
263
-
264
- // And: .dev-port 파일 삭제가 시도된다
265
- expect(mockUnlinkSync).toHaveBeenCalledWith(
266
- expect.stringContaining(".dev-port"),
267
- );
234
+ // Given: dev watch 모드가 실행 중이고 .dev-port 파일이 존재한다
235
+ const tmpRoot = mkdtempSync(path.join(tmpdir(), "esbuild-client-engine-"));
236
+ try {
237
+ const pkgDir = path.join(tmpRoot, "my-client");
238
+ const distDir = path.join(pkgDir, "dist");
239
+ mkdirSync(distDir, { recursive: true });
240
+ const portFile = path.join(distDir, ".dev-port");
241
+ writeFileSync(portFile, "4200");
242
+
243
+ mockWorker.startWatch.mockResolvedValue({ success: true });
244
+
245
+ const engine = new EsbuildClientEngine({
246
+ cwd: tmpRoot,
247
+ pkg: createMockPkg({ dir: pkgDir }),
248
+ });
249
+
250
+ await engine.startWatch({ js: true, dts: false });
251
+
252
+ // When: stop()이 호출된다
253
+ await engine.stop();
254
+
255
+ // Then: worker가 종료된다
256
+ expect(mockWorker.stopWatch).toHaveBeenCalled();
257
+ expect(mockWorker.terminate).toHaveBeenCalled();
258
+
259
+ // And: .dev-port 파일이 삭제된다
260
+ expect(existsSync(portFile)).toBe(false);
261
+ } finally {
262
+ rmSync(tmpRoot, { recursive: true, force: true });
263
+ }
268
264
  });
269
265
  });
@@ -1,6 +1,5 @@
1
1
  import { describe, it, expect, vi, beforeEach } from "vitest";
2
-
3
- // --- Mock factories (vi.mock is hoisted) ---
2
+ import { Worker } from "@simplysm/core-node";
4
3
 
5
4
  const mockWorker = {
6
5
  build: vi.fn(),
@@ -10,24 +9,9 @@ const mockWorker = {
10
9
  on: vi.fn(),
11
10
  };
12
11
 
13
- vi.mock("@simplysm/core-node", () => ({
14
- Worker: {
15
- create: vi.fn(() => mockWorker),
16
- },
17
- }));
18
-
19
- // fs mock
20
- const mockUnlinkSync = vi.fn();
21
- vi.mock("node:fs", () => ({
22
- default: {
23
- unlinkSync: (...args: any[]) => mockUnlinkSync(...args),
24
- },
25
- unlinkSync: (...args: any[]) => mockUnlinkSync(...args),
26
- }));
27
-
28
- // --- Dynamic imports after mocking ---
12
+ vi.spyOn(Worker, "create").mockReturnValue(mockWorker as any);
29
13
 
30
- const { EsbuildClientEngine } = await import("../../src/engines/EsbuildClientEngine");
14
+ import { EsbuildClientEngine } from "../../src/engines/EsbuildClientEngine";
31
15
 
32
16
  import type { ClientPackageInfo } from "../../src/engines/types";
33
17
 
@@ -400,12 +384,9 @@ describe("EsbuildClientEngine", () => {
400
384
  });
401
385
 
402
386
  it(".dev-port 파일 삭제 실패를 무시한다", async () => {
403
- mockUnlinkSync.mockImplementation(() => {
404
- throw new Error("ENOENT");
405
- });
406
-
407
387
  mockWorker.build.mockResolvedValue({ success: true });
408
388
 
389
+ // pkg.dir이 실재하지 않는 경로이므로 unlinkSync는 ENOENT를 throw한다
409
390
  const engine = new EsbuildClientEngine({ cwd: "/root", pkg: createMockPkg() });
410
391
  await engine.run({ js: true, dts: false });
411
392
 
@@ -1,6 +1,5 @@
1
1
  import { describe, it, expect, vi, beforeEach } from "vitest";
2
-
3
- // --- Mock factories (vi.mock is hoisted) ---
2
+ import { Worker } from "@simplysm/core-node";
4
3
 
5
4
  const mockWorker = {
6
5
  build: vi.fn(),
@@ -10,15 +9,9 @@ const mockWorker = {
10
9
  on: vi.fn(),
11
10
  };
12
11
 
13
- vi.mock("@simplysm/core-node", () => ({
14
- Worker: {
15
- create: vi.fn(() => mockWorker),
16
- },
17
- }));
18
-
19
- // --- Dynamic imports after mocking ---
12
+ vi.spyOn(Worker, "create").mockReturnValue(mockWorker as any);
20
13
 
21
- const { NgtscEngine } = await import("../../src/engines/NgtscEngine");
14
+ import { NgtscEngine } from "../../src/engines/NgtscEngine";
22
15
 
23
16
  import type { BuildPackageInfo } from "../../src/engines/types";
24
17
 
@@ -1,6 +1,5 @@
1
1
  import { describe, it, expect, vi, beforeEach } from "vitest";
2
-
3
- // --- Mock factories ---
2
+ import { Worker } from "@simplysm/core-node";
4
3
 
5
4
  const mockWorker = {
6
5
  build: vi.fn(),
@@ -10,15 +9,9 @@ const mockWorker = {
10
9
  on: vi.fn(),
11
10
  };
12
11
 
13
- vi.mock("@simplysm/core-node", () => ({
14
- Worker: {
15
- create: vi.fn(() => mockWorker),
16
- },
17
- }));
18
-
19
- // --- Dynamic imports ---
12
+ vi.spyOn(Worker, "create").mockReturnValue(mockWorker as any);
20
13
 
21
- const { ServerEsbuildEngine } = await import("../../src/engines/ServerEsbuildEngine");
14
+ import { ServerEsbuildEngine } from "../../src/engines/ServerEsbuildEngine";
22
15
 
23
16
  import type { ServerPackageInfo } from "../../src/engines/types";
24
17
 
@@ -1,6 +1,5 @@
1
1
  import { describe, it, expect, vi, beforeEach } from "vitest";
2
-
3
- // --- Mock factories (vi.mock is hoisted) ---
2
+ import { Worker } from "@simplysm/core-node";
4
3
 
5
4
  const mockWorker = {
6
5
  build: vi.fn(),
@@ -10,15 +9,9 @@ const mockWorker = {
10
9
  on: vi.fn(),
11
10
  };
12
11
 
13
- vi.mock("@simplysm/core-node", () => ({
14
- Worker: {
15
- create: vi.fn(() => mockWorker),
16
- },
17
- }));
18
-
19
- // --- Dynamic imports after mocking ---
12
+ vi.spyOn(Worker, "create").mockReturnValue(mockWorker as any);
20
13
 
21
- const { TscEngine } = await import("../../src/engines/TscEngine");
14
+ import { TscEngine } from "../../src/engines/TscEngine";
22
15
 
23
16
  import type { BuildPackageInfo } from "../../src/engines/types";
24
17
 
@@ -1,21 +1,16 @@
1
1
  import { describe, it, expect, vi, beforeEach } from "vitest";
2
2
  import type esbuild from "esbuild";
3
3
  import type { ISdTsCompilerResult } from "../../src/ts-compiler/sd-ts-compiler-result";
4
-
5
- //#region Mocks
4
+ import * as sdTsCompilerMod from "../../src/ts-compiler/SdTsCompiler";
6
5
 
7
6
  const mockCompileAsync = vi.fn<() => Promise<ISdTsCompilerResult>>();
8
7
  const MockSdTsCompiler = vi.fn().mockImplementation(function () {
9
8
  return { compileAsync: mockCompileAsync };
10
9
  });
11
10
 
12
- vi.mock("../../src/ts-compiler/SdTsCompiler", () => ({
13
- SdTsCompiler: MockSdTsCompiler,
14
- }));
15
-
16
- //#endregion
11
+ vi.spyOn(sdTsCompilerMod, "SdTsCompiler" as any).mockImplementation(MockSdTsCompiler as any);
17
12
 
18
- const { createTscPlugin } = await import("../../src/esbuild/esbuild-tsc-plugin");
13
+ import { createTscPlugin } from "../../src/esbuild/esbuild-tsc-plugin";
19
14
 
20
15
  /** esbuild 플러그인 lifecycle을 시뮬레이션하는 헬퍼 */
21
16
  function setupPlugin(plugin: esbuild.Plugin) {
@@ -1,21 +1,16 @@
1
1
  import { describe, it, expect, vi, beforeEach } from "vitest";
2
2
  import type esbuild from "esbuild";
3
3
  import type { ISdTsCompilerResult } from "../../src/ts-compiler/sd-ts-compiler-result";
4
-
5
- //#region Mocks
4
+ import * as sdTsCompilerMod from "../../src/ts-compiler/SdTsCompiler";
6
5
 
7
6
  const mockCompileAsync = vi.fn<() => Promise<ISdTsCompilerResult>>();
8
7
  const MockSdTsCompiler = vi.fn().mockImplementation(function () {
9
8
  return { compileAsync: mockCompileAsync };
10
9
  });
11
10
 
12
- vi.mock("../../src/ts-compiler/SdTsCompiler", () => ({
13
- SdTsCompiler: MockSdTsCompiler,
14
- }));
15
-
16
- //#endregion
11
+ vi.spyOn(sdTsCompilerMod, "SdTsCompiler" as any).mockImplementation(MockSdTsCompiler as any);
17
12
 
18
- const { createTscPlugin } = await import("../../src/esbuild/esbuild-tsc-plugin");
13
+ import { createTscPlugin } from "../../src/esbuild/esbuild-tsc-plugin";
19
14
 
20
15
  /** esbuild 플러그인 lifecycle을 시뮬레이션하는 헬퍼 */
21
16
  function setupPlugin(plugin: esbuild.Plugin) {
@@ -1,9 +1,29 @@
1
1
  import { describe, it, expect, vi, beforeEach } from "vitest";
2
-
3
- // --- Mock factories (vi.mock is hoisted) ---
4
-
5
2
  import { consola } from "consola";
6
3
 
4
+ import * as sdConfig from "../../src/utils/sd-config";
5
+ import * as buildEnv from "../../src/utils/build-env";
6
+ import * as copySrc from "../../src/utils/copy-src";
7
+ import * as lintUtils from "../../src/lint/lint-utils";
8
+ import * as outputUtils from "../../src/utils/output-utils";
9
+ import * as typecheckSerialization from "../../src/typecheck/typecheck-serialization";
10
+ import * as coreNode from "@simplysm/core-node";
11
+ import * as engineFactory from "../../src/engines/engine-factory";
12
+ import * as capacitorMod from "../../src/capacitor/capacitor";
13
+ import * as electronMod from "../../src/electron/electron";
14
+
15
+ import { loadSdConfig } from "../../src/utils/sd-config";
16
+ import { getVersion } from "../../src/utils/build-env";
17
+ import { copySrcFiles } from "../../src/utils/copy-src";
18
+ import { runLintInWorker } from "../../src/lint/lint-utils";
19
+ import { Worker, fsx } from "@simplysm/core-node";
20
+ import { createBuildEngine } from "../../src/engines/engine-factory";
21
+ import { Capacitor } from "../../src/capacitor/capacitor";
22
+ import { Electron } from "../../src/electron/electron";
23
+
24
+ import { BuildOrchestrator, classifyPackages } from "../../src/orchestrators/BuildOrchestrator";
25
+ import type { SdConfig } from "../../src/sd-config.types";
26
+
7
27
  const mockLogger = {
8
28
  debug: vi.fn(),
9
29
  info: vi.fn(),
@@ -13,106 +33,24 @@ const mockLogger = {
13
33
  success: vi.fn(),
14
34
  };
15
35
 
16
- vi.spyOn(consola, "withTag").mockReturnValue(mockLogger as any);
17
-
18
- vi.mock("../../src/utils/sd-config", () => ({
19
- loadSdConfig: vi.fn(),
20
- }));
21
-
22
- vi.mock("../../src/utils/build-env", () => ({
23
- getVersion: vi.fn(),
24
- }));
25
-
26
- vi.mock("../../src/utils/copy-src", () => ({
27
- copySrcFiles: vi.fn().mockResolvedValue(undefined),
28
- }));
29
-
30
- vi.mock("../../src/lint/lint-utils", () => ({
31
- runLintInWorker: vi.fn().mockResolvedValue({ success: true, errorCount: 0, warningCount: 0, formattedOutput: "" }),
32
- }));
33
-
34
- vi.mock("../../src/utils/output-utils", () => ({
35
- formatBuildMessages: vi.fn(
36
- (name: string, target: string, msgs: string[]) => `${name} (${target}): ${msgs.join(", ")}`,
37
- ),
38
- }));
39
-
40
- vi.mock("../../src/typecheck/typecheck-serialization", () => ({
41
- deserializeDiagnostic: vi.fn((d: any) => d),
42
- }));
43
-
44
- vi.mock("@simplysm/core-node", () => ({
45
- Worker: {
46
- create: vi.fn(),
47
- },
48
- fsx: {
49
- rm: vi.fn().mockResolvedValue(undefined),
50
- },
51
- pathx: {
52
- posixResolve: vi.fn((...args: string[]) => args.join("/").replace(/\\/g, "/")),
53
- },
54
- }));
55
-
56
36
  const mockEngines: Array<{
57
37
  run: ReturnType<typeof vi.fn>;
58
38
  startWatch: ReturnType<typeof vi.fn>;
59
39
  stop: ReturnType<typeof vi.fn>;
60
40
  }> = [];
61
41
 
62
- vi.mock("../../src/engines/engine-factory", () => ({
63
- createBuildEngine: vi.fn(() => {
64
- const engine = {
65
- run: vi.fn().mockResolvedValue({
66
- build: { success: true, errors: [], warnings: [], diagnostics: [] },
67
- }),
68
- startWatch: vi.fn().mockResolvedValue(undefined),
69
- stop: vi.fn().mockResolvedValue(undefined),
70
- };
71
- mockEngines.push(engine);
72
- return engine;
73
- }),
74
- }));
75
-
76
- // Capacitor mock
77
42
  const mockCapacitorInstance = {
78
43
  initialize: vi.fn().mockResolvedValue(undefined),
79
44
  build: vi.fn().mockResolvedValue(undefined),
80
45
  run: vi.fn().mockResolvedValue(undefined),
81
46
  };
82
47
 
83
- vi.mock("../../src/capacitor/capacitor", () => ({
84
- Capacitor: {
85
- create: vi.fn().mockResolvedValue(mockCapacitorInstance),
86
- },
87
- }));
88
-
89
- // Electron mock
90
48
  const mockElectronInstance = {
91
49
  initialize: vi.fn().mockResolvedValue(undefined),
92
50
  build: vi.fn().mockResolvedValue(undefined),
93
51
  run: vi.fn().mockResolvedValue(undefined),
94
52
  };
95
53
 
96
- vi.mock("../../src/electron/electron", () => ({
97
- Electron: {
98
- create: vi.fn().mockResolvedValue(mockElectronInstance),
99
- },
100
- }));
101
-
102
- // --- Dynamic imports after mocking ---
103
-
104
- const { BuildOrchestrator, classifyPackages } = await import("../../src/orchestrators/BuildOrchestrator");
105
- const { loadSdConfig } = await import("../../src/utils/sd-config");
106
- const { getVersion } = await import("../../src/utils/build-env");
107
- const { copySrcFiles } = await import("../../src/utils/copy-src");
108
- const { Worker, fsx } = await import("@simplysm/core-node");
109
- const { createBuildEngine } = await import("../../src/engines/engine-factory");
110
-
111
- const { Capacitor } = await import("../../src/capacitor/capacitor");
112
- const { Electron } = await import("../../src/electron/electron");
113
-
114
- import type { SdConfig } from "../../src/sd-config.types";
115
-
116
54
  // --- Helpers ---
117
55
 
118
56
  interface MockWorkerProxy {
@@ -136,27 +74,46 @@ function setupDefaults(config: Partial<SdConfig> = {}): void {
136
74
  // --- Tests ---
137
75
 
138
76
  beforeEach(() => {
139
- vi.clearAllMocks();
77
+ vi.restoreAllMocks();
140
78
  mockEngines.length = 0;
141
- // Reset process.exitCode
142
79
  process.exitCode = undefined;
143
- // Mock process.stdout.write
80
+
81
+ vi.spyOn(consola, "withTag").mockReturnValue(mockLogger as any);
82
+ Object.values(mockLogger).forEach((m) => m.mockReset());
83
+
84
+ mockCapacitorInstance.initialize.mockReset().mockResolvedValue(undefined);
85
+ mockCapacitorInstance.build.mockReset().mockResolvedValue(undefined);
86
+ mockCapacitorInstance.run.mockReset().mockResolvedValue(undefined);
87
+ mockElectronInstance.initialize.mockReset().mockResolvedValue(undefined);
88
+ mockElectronInstance.build.mockReset().mockResolvedValue(undefined);
89
+ mockElectronInstance.run.mockReset().mockResolvedValue(undefined);
90
+
144
91
  vi.spyOn(process.stdout, "write").mockReturnValue(true);
145
- // Reset Capacitor/Electron instance mocks
146
- mockCapacitorInstance.initialize.mockResolvedValue(undefined);
147
- mockCapacitorInstance.build.mockResolvedValue(undefined);
148
- mockCapacitorInstance.run.mockResolvedValue(undefined);
149
- mockElectronInstance.initialize.mockResolvedValue(undefined);
150
- mockElectronInstance.build.mockResolvedValue(undefined);
151
- mockElectronInstance.run.mockResolvedValue(undefined);
152
- vi.mocked(Capacitor.create).mockResolvedValue(mockCapacitorInstance as any);
153
- vi.mocked(Electron.create).mockResolvedValue(mockElectronInstance as any);
154
- // Restore default createBuildEngine mock implementation
155
- vi.mocked(createBuildEngine).mockImplementation(() => {
92
+
93
+ vi.spyOn(sdConfig, "loadSdConfig").mockResolvedValue({ packages: {} });
94
+ vi.spyOn(buildEnv, "getVersion").mockResolvedValue("1.0.0");
95
+ vi.spyOn(copySrc, "copySrcFiles").mockResolvedValue(undefined);
96
+ vi.spyOn(lintUtils, "runLintInWorker").mockResolvedValue({
97
+ success: true, errorCount: 0, warningCount: 0, formattedOutput: "",
98
+ });
99
+ vi.spyOn(outputUtils, "formatBuildMessages").mockImplementation(
100
+ (name: string, target: string, msgs: string[]) => `${name} (${target}): ${msgs.join(", ")}`,
101
+ );
102
+ vi.spyOn(typecheckSerialization, "deserializeDiagnostic").mockImplementation((d: any) => d);
103
+
104
+ vi.spyOn(coreNode.fsx, "rm").mockResolvedValue(undefined);
105
+ vi.spyOn(coreNode.pathx, "posixResolve").mockImplementation(
106
+ (...args: string[]) => args.join("/").replace(/\\/g, "/") as coreNode.pathx.PosixPath,
107
+ );
108
+ vi.spyOn(coreNode.Worker, "create").mockReturnValue(undefined as any);
109
+
110
+ vi.spyOn(capacitorMod.Capacitor, "create").mockResolvedValue(mockCapacitorInstance as any);
111
+ vi.spyOn(electronMod.Electron, "create").mockResolvedValue(mockElectronInstance as any);
112
+
113
+ vi.spyOn(engineFactory, "createBuildEngine").mockImplementation(() => {
156
114
  const engine = {
157
115
  run: vi.fn().mockResolvedValue({
158
116
  build: { success: true, errors: [], warnings: [], diagnostics: [] },
159
-
160
117
  }),
161
118
  startWatch: vi.fn().mockResolvedValue(undefined),
162
119
  stop: vi.fn().mockResolvedValue(undefined),
@@ -969,8 +926,6 @@ describe("BuildOrchestrator native build integration (Slice 1)", () => {
969
926
 
970
927
  //#region Slice 3: build 명령어 lint 통합 (Feature 3.2)
971
928
 
972
- const { runLintInWorker } = await import("../../src/lint/lint-utils");
973
-
974
929
  describe("BuildOrchestrator lint integration", () => {
975
930
  // build에서 lint를 실행하지 않는다 (lint는 check에서만 실행)
976
931
  it("passes lint:false to engine.run for all package types", async () => {