@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.
- package/dist/capacitor/capacitor-android.d.ts +2 -0
- package/dist/capacitor/capacitor-android.d.ts.map +1 -1
- package/dist/capacitor/capacitor-android.js +13 -0
- package/dist/capacitor/capacitor-android.js.map +1 -1
- package/dist/capacitor/capacitor-npm-config.d.ts.map +1 -1
- package/dist/capacitor/capacitor-npm-config.js +2 -6
- package/dist/capacitor/capacitor-npm-config.js.map +1 -1
- package/dist/electron/electron.d.ts.map +1 -1
- package/dist/electron/electron.js +1 -2
- package/dist/electron/electron.js.map +1 -1
- package/package.json +13 -13
- package/src/capacitor/capacitor-android.ts +14 -0
- package/src/capacitor/capacitor-npm-config.ts +2 -6
- package/src/electron/electron.ts +1 -2
- package/tests/angular/ngtsc-build-core.acc.spec.ts +36 -94
- package/tests/capacitor/capacitor-android.spec.ts +65 -28
- package/tests/capacitor/capacitor-build.spec.ts +40 -385
- package/tests/capacitor/capacitor-config-writer.acc.spec.ts +3 -17
- package/tests/capacitor/capacitor-config-writer.spec.ts +3 -17
- package/tests/capacitor/capacitor-init.spec.ts +40 -636
- package/tests/capacitor/capacitor-npm-config.acc.spec.ts +38 -168
- package/tests/capacitor/capacitor-npm-config.spec.ts +33 -71
- package/tests/commands/check.spec.ts +25 -36
- package/tests/commands/deployment-phase.acc.spec.ts +17 -26
- package/tests/commands/git-phase.acc.spec.ts +13 -112
- package/tests/commands/lint.spec.ts +7 -24
- package/tests/commands/post-publish-phase.acc.spec.ts +5 -10
- package/tests/commands/typecheck.spec.ts +43 -65
- package/tests/electron/electron.spec.ts +22 -46
- package/tests/engines/base-engine.spec.ts +4 -13
- package/tests/engines/engine-selection.spec.ts +14 -17
- package/tests/engines/engine-typecheck-selection.acc.spec.ts +13 -16
- package/tests/engines/esbuild-client-engine.acc.spec.ts +36 -40
- package/tests/engines/esbuild-client-engine.spec.ts +4 -23
- package/tests/engines/ngtsc-engine.spec.ts +3 -10
- package/tests/engines/server-esbuild-engine.spec.ts +3 -10
- package/tests/engines/tsc-engine.spec.ts +3 -10
- package/tests/esbuild/esbuild-tsc-plugin.acc.spec.ts +3 -8
- package/tests/esbuild/esbuild-tsc-plugin.spec.ts +3 -8
- package/tests/orchestrators/build-orchestrator.spec.ts +57 -102
- package/tests/orchestrators/dev-orchestrator.spec.ts +68 -109
- package/tests/orchestrators/typecheck-orchestrator.spec.ts +25 -57
- package/tests/orchestrators/watch-orchestrator.spec.ts +73 -99
- package/tests/sd-cli-entry.spec.ts +17 -20
- package/tests/utils/angular-source-file-cache.spec.ts +4 -8
- package/tests/utils/copy-src.spec.ts +9 -20
- package/tests/utils/esbuild-client-config.acc.spec.ts +9 -15
- package/tests/utils/esbuild-client-config.spec.ts +12 -24
- package/tests/utils/esbuild-config.spec.ts +51 -42
- package/tests/utils/lint-core.spec.ts +13 -19
- package/tests/utils/lint-utils.spec.ts +8 -15
- package/tests/utils/lint-with-program.spec.ts +3 -7
- package/tests/utils/ngtsc-build-core.spec.ts +2 -99
- package/tests/utils/orchestrator-utils.spec.ts +7 -20
- package/tests/utils/output-utils.spec.ts +5 -11
- package/tests/utils/sd-config.spec.ts +4 -12
- package/tests/utils/typecheck-env.spec.ts +49 -77
- package/tests/utils/typecheck-non-package.spec.ts +23 -16
- package/tests/workers/build-watch-paths.acc.spec.ts +4 -10
- package/tests/workers/build-watch-paths.spec.ts +4 -9
- package/tests/workers/client-worker.acc.spec.ts +64 -137
- package/tests/workers/client-worker.spec.ts +63 -89
- package/tests/workers/library-build-lint.spec.ts +19 -30
- package/tests/workers/library-build-worker.spec.ts +28 -55
- package/tests/workers/server-esbuild-context.acc.spec.ts +6 -15
- package/tests/workers/server-esbuild-context.spec.ts +7 -16
- package/tests/workers/server-runtime-worker.spec.ts +8 -10
- package/tests/workers/shared-worker-lifecycle.acc.spec.ts +3 -5
- package/tests/workers/shared-worker-lifecycle.spec.ts +4 -5
- package/tests/capacitor/capacitor-icon.spec.ts +0 -285
- package/tests/capacitor/capacitor-run.spec.ts +0 -256
- package/tests/capacitor/capacitor-workspace.spec.ts +0 -203
- package/tests/commands/device.spec.ts +0 -237
- package/tests/commands/publish.spec.ts +0 -1183
- package/tests/utils/external-modules.spec.ts +0 -217
- package/tests/workers/server-build-lint.spec.ts +0 -201
- package/tests/workers/server-build-worker.spec.ts +0 -765
- package/tests/workers/server-watch-manager.acc.spec.ts +0 -162
- 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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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.
|
|
13
|
-
SdTsCompiler: MockSdTsCompiler,
|
|
14
|
-
}));
|
|
15
|
-
|
|
16
|
-
//#endregion
|
|
11
|
+
vi.spyOn(sdTsCompilerMod, "SdTsCompiler" as any).mockImplementation(MockSdTsCompiler as any);
|
|
17
12
|
|
|
18
|
-
|
|
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.
|
|
13
|
-
SdTsCompiler: MockSdTsCompiler,
|
|
14
|
-
}));
|
|
15
|
-
|
|
16
|
-
//#endregion
|
|
11
|
+
vi.spyOn(sdTsCompilerMod, "SdTsCompiler" as any).mockImplementation(MockSdTsCompiler as any);
|
|
17
12
|
|
|
18
|
-
|
|
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.
|
|
77
|
+
vi.restoreAllMocks();
|
|
140
78
|
mockEngines.length = 0;
|
|
141
|
-
// Reset process.exitCode
|
|
142
79
|
process.exitCode = undefined;
|
|
143
|
-
|
|
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
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
vi.
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
vi.
|
|
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 () => {
|