@simplysm/sd-cli 14.0.49 → 14.0.52
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/angular/angular-compiler.d.ts +3 -0
- package/dist/angular/angular-compiler.d.ts.map +1 -1
- package/dist/angular/angular-compiler.js +3 -0
- package/dist/angular/angular-compiler.js.map +1 -1
- package/dist/dev-server/hmr-service.d.ts.map +1 -1
- package/dist/dev-server/hmr-service.js +10 -5
- package/dist/dev-server/hmr-service.js.map +1 -1
- package/dist/engines/EsbuildClientEngine.d.ts.map +1 -1
- package/dist/engines/EsbuildClientEngine.js +1 -2
- package/dist/engines/EsbuildClientEngine.js.map +1 -1
- package/dist/esbuild/esbuild-angular-compiler-plugin.js +5 -5
- package/dist/esbuild/esbuild-angular-compiler-plugin.js.map +1 -1
- package/dist/esbuild/esbuild-client-config.d.ts.map +1 -1
- package/dist/esbuild/esbuild-client-config.js +10 -5
- package/dist/esbuild/esbuild-client-config.js.map +1 -1
- package/dist/lint/lint-core.js.map +1 -1
- package/dist/orchestrators/DevOrchestrator.js.map +1 -1
- package/dist/orchestrators/ServerRuntimeManager.d.ts.map +1 -1
- package/dist/orchestrators/ServerRuntimeManager.js +2 -4
- package/dist/orchestrators/ServerRuntimeManager.js.map +1 -1
- package/dist/ts-compiler/SdTsCompiler.d.ts +1 -7
- package/dist/ts-compiler/SdTsCompiler.d.ts.map +1 -1
- package/dist/ts-compiler/SdTsCompiler.js +109 -116
- package/dist/ts-compiler/SdTsCompiler.js.map +1 -1
- package/dist/utils/package-utils.d.ts.map +1 -1
- package/dist/utils/package-utils.js.map +1 -1
- package/dist/workers/client.worker.d.ts.map +1 -1
- package/dist/workers/client.worker.js +6 -1
- package/dist/workers/client.worker.js.map +1 -1
- package/package.json +5 -5
- package/src/angular/angular-compiler.ts +3 -0
- package/src/dev-server/hmr-service.ts +10 -5
- package/src/engines/EsbuildClientEngine.ts +1 -2
- package/src/esbuild/esbuild-angular-compiler-plugin.ts +6 -6
- package/src/esbuild/esbuild-client-config.ts +17 -12
- package/src/lint/lint-core.ts +1 -1
- package/src/orchestrators/DevOrchestrator.ts +3 -3
- package/src/orchestrators/ServerRuntimeManager.ts +2 -5
- package/src/ts-compiler/SdTsCompiler.ts +136 -154
- package/src/utils/package-utils.ts +1 -2
- package/src/workers/client.worker.ts +6 -1
- package/tests/esbuild/esbuild-angular-compiler-plugin.spec.ts +1 -1
- package/tests/esbuild/esbuild-postcss-plugin.acc.spec.ts +1 -1
- package/tests/esbuild/esbuild-tsc-plugin.acc.spec.ts +2 -2
- package/tests/esbuild/esbuild-tsc-plugin.spec.ts +3 -3
- package/tests/esbuild/esbuild-worker-plugin.spec.ts +1 -1
- package/tests/orchestrators/build-orchestrator.spec.ts +9 -9
- package/tests/orchestrators/dev-orchestrator.spec.ts +4 -4
- package/tests/orchestrators/watch-orchestrator.spec.ts +2 -2
- package/tests/ts-compiler/SdTsCompiler-crash-handling.verify.md +24 -0
- package/tests/utils/copy-src.spec.ts +5 -5
- package/tests/utils/esbuild-client-config.acc.spec.ts +1 -1
- package/tests/utils/esbuild-client-config.spec.ts +4 -4
- package/tests/utils/esbuild-config.spec.ts +3 -3
- package/tests/utils/esbuild-postcss-plugin.spec.ts +1 -1
- package/tests/utils/hmr-client-script.acc.spec.ts +1 -1
- package/tests/utils/ngtsc-build-core.spec.ts +1 -1
- package/tests/utils/package-utils.spec.ts +6 -6
- package/tests/workers/server-build-worker.spec.ts +1 -1
- package/README.md +0 -782
|
@@ -41,7 +41,7 @@ function setupPlugin(plugin: esbuild.Plugin) {
|
|
|
41
41
|
outputFiles: [],
|
|
42
42
|
metafile: { inputs: {}, outputs: {} },
|
|
43
43
|
...result,
|
|
44
|
-
}
|
|
44
|
+
})) ?? null;
|
|
45
45
|
},
|
|
46
46
|
};
|
|
47
47
|
}
|
|
@@ -73,7 +73,7 @@ function createErrorCompileResult(): ISdTsCompilerResult {
|
|
|
73
73
|
return {
|
|
74
74
|
...createSuccessCompileResult(),
|
|
75
75
|
errors: ["TS2322: Type 'string' is not assignable to type 'number'"],
|
|
76
|
-
diagnostics: [{ category: 1, code: 2322, messageText: "Type mismatch" }]
|
|
76
|
+
diagnostics: [{ category: 1, code: 2322, messageText: "Type mismatch" }],
|
|
77
77
|
errorCount: 1,
|
|
78
78
|
};
|
|
79
79
|
}
|
|
@@ -41,7 +41,7 @@ function setupPlugin(plugin: esbuild.Plugin) {
|
|
|
41
41
|
outputFiles: [],
|
|
42
42
|
metafile: { inputs: {}, outputs: {} },
|
|
43
43
|
...result,
|
|
44
|
-
}
|
|
44
|
+
})) ?? null;
|
|
45
45
|
},
|
|
46
46
|
};
|
|
47
47
|
}
|
|
@@ -147,7 +147,7 @@ describe("createTscPlugin — Unit Tests", () => {
|
|
|
147
147
|
it("env, includeTests 옵션을 SdTsCompiler에 전달한다", async () => {
|
|
148
148
|
const result = createTscPlugin({
|
|
149
149
|
...baseOptions,
|
|
150
|
-
env: "node"
|
|
150
|
+
env: "node",
|
|
151
151
|
includeTests: true,
|
|
152
152
|
});
|
|
153
153
|
const lifecycle = setupPlugin(result.plugin);
|
|
@@ -172,7 +172,7 @@ describe("createTscPlugin — Unit Tests", () => {
|
|
|
172
172
|
];
|
|
173
173
|
mockCompileAsync.mockResolvedValue({
|
|
174
174
|
...createSuccessCompileResult(),
|
|
175
|
-
diagnostics: diagnostics
|
|
175
|
+
diagnostics: diagnostics,
|
|
176
176
|
});
|
|
177
177
|
|
|
178
178
|
const result = createTscPlugin(baseOptions);
|
|
@@ -129,7 +129,7 @@ function createMockWorkerProxy(overrides: Partial<MockWorkerProxy> = {}): MockWo
|
|
|
129
129
|
}
|
|
130
130
|
|
|
131
131
|
function setupDefaults(config: Partial<SdConfig> = {}): void {
|
|
132
|
-
vi.mocked(loadSdConfig).mockResolvedValue({ packages: {}, ...config }
|
|
132
|
+
vi.mocked(loadSdConfig).mockResolvedValue({ packages: {}, ...config });
|
|
133
133
|
vi.mocked(getVersion).mockResolvedValue("1.0.0");
|
|
134
134
|
}
|
|
135
135
|
|
|
@@ -372,7 +372,7 @@ describe("BuildOrchestrator.start", () => {
|
|
|
372
372
|
run: vi.fn().mockRejectedValue(new Error("build failed")),
|
|
373
373
|
startWatch: vi.fn(),
|
|
374
374
|
stop: vi.fn().mockResolvedValue(undefined),
|
|
375
|
-
}
|
|
375
|
+
});
|
|
376
376
|
const mockProxy = createMockWorkerProxy();
|
|
377
377
|
vi.mocked(Worker.create).mockReturnValue(mockProxy as any);
|
|
378
378
|
|
|
@@ -413,7 +413,7 @@ describe("BuildOrchestrator.start", () => {
|
|
|
413
413
|
}),
|
|
414
414
|
startWatch: vi.fn(),
|
|
415
415
|
stop: vi.fn().mockResolvedValue(undefined),
|
|
416
|
-
}
|
|
416
|
+
});
|
|
417
417
|
const mockProxy = createMockWorkerProxy();
|
|
418
418
|
vi.mocked(Worker.create).mockReturnValue(mockProxy as any);
|
|
419
419
|
|
|
@@ -466,7 +466,7 @@ describe("BuildOrchestrator.start", () => {
|
|
|
466
466
|
stop: vi.fn().mockResolvedValue(undefined),
|
|
467
467
|
};
|
|
468
468
|
mockEngines.push(engine);
|
|
469
|
-
return engine
|
|
469
|
+
return engine;
|
|
470
470
|
});
|
|
471
471
|
const mockProxy = createMockWorkerProxy();
|
|
472
472
|
vi.mocked(Worker.create).mockReturnValue(mockProxy as any);
|
|
@@ -496,7 +496,7 @@ describe("BuildOrchestrator.start", () => {
|
|
|
496
496
|
}),
|
|
497
497
|
startWatch: vi.fn(),
|
|
498
498
|
stop: vi.fn().mockResolvedValue(undefined),
|
|
499
|
-
}
|
|
499
|
+
});
|
|
500
500
|
const mockProxy = createMockWorkerProxy();
|
|
501
501
|
vi.mocked(Worker.create).mockReturnValue(mockProxy as any);
|
|
502
502
|
|
|
@@ -602,7 +602,7 @@ describe("BuildOrchestrator client build", () => {
|
|
|
602
602
|
}),
|
|
603
603
|
startWatch: vi.fn(),
|
|
604
604
|
stop: vi.fn().mockResolvedValue(undefined),
|
|
605
|
-
}
|
|
605
|
+
});
|
|
606
606
|
const mockProxy = createMockWorkerProxy();
|
|
607
607
|
vi.mocked(Worker.create).mockReturnValue(mockProxy as any);
|
|
608
608
|
|
|
@@ -635,7 +635,7 @@ describe("BuildOrchestrator client build", () => {
|
|
|
635
635
|
}),
|
|
636
636
|
startWatch: vi.fn(),
|
|
637
637
|
stop: vi.fn().mockResolvedValue(undefined),
|
|
638
|
-
}
|
|
638
|
+
});
|
|
639
639
|
const mockProxy = createMockWorkerProxy();
|
|
640
640
|
vi.mocked(Worker.create).mockReturnValue(mockProxy as any);
|
|
641
641
|
|
|
@@ -720,7 +720,7 @@ describe("BuildOrchestrator client build", () => {
|
|
|
720
720
|
run: vi.fn().mockRejectedValue(new Error("build crashed")),
|
|
721
721
|
startWatch: vi.fn(),
|
|
722
722
|
stop: vi.fn().mockResolvedValue(undefined),
|
|
723
|
-
}
|
|
723
|
+
});
|
|
724
724
|
const mockProxy = createMockWorkerProxy();
|
|
725
725
|
vi.mocked(Worker.create).mockReturnValue(mockProxy as any);
|
|
726
726
|
|
|
@@ -954,7 +954,7 @@ describe("BuildOrchestrator native build integration (Slice 1)", () => {
|
|
|
954
954
|
}),
|
|
955
955
|
startWatch: vi.fn(),
|
|
956
956
|
stop: vi.fn().mockResolvedValue(undefined),
|
|
957
|
-
}
|
|
957
|
+
});
|
|
958
958
|
const mockProxy = createMockWorkerProxy();
|
|
959
959
|
vi.mocked(Worker.create).mockReturnValue(mockProxy as any);
|
|
960
960
|
|
|
@@ -187,7 +187,7 @@ function setupEngineWithResult(status: "success" | "error" = "success"): void {
|
|
|
187
187
|
_pkgName: pkg.name,
|
|
188
188
|
};
|
|
189
189
|
mockBuildEngines.push(engine);
|
|
190
|
-
return engine
|
|
190
|
+
return engine;
|
|
191
191
|
});
|
|
192
192
|
}
|
|
193
193
|
|
|
@@ -275,7 +275,7 @@ describe("DevOrchestrator", () => {
|
|
|
275
275
|
_pkgName: pkg.name,
|
|
276
276
|
};
|
|
277
277
|
mockBuildEngines.push(engine);
|
|
278
|
-
return engine
|
|
278
|
+
return engine;
|
|
279
279
|
});
|
|
280
280
|
});
|
|
281
281
|
|
|
@@ -471,13 +471,13 @@ describe("DevOrchestrator", () => {
|
|
|
471
471
|
// --- Unit: disposes replaceDeps on shutdown ---
|
|
472
472
|
it("disposes replaceDeps watcher on dev shutdown", async () => {
|
|
473
473
|
const mockDispose = vi.fn();
|
|
474
|
-
vi.mocked(watchReplaceDeps).mockResolvedValue({ entries: [], dispose: mockDispose }
|
|
474
|
+
vi.mocked(watchReplaceDeps).mockResolvedValue({ entries: [], dispose: mockDispose });
|
|
475
475
|
|
|
476
476
|
setupDefaults(createConfig({
|
|
477
477
|
packages: { "service-server": { target: "server" } },
|
|
478
478
|
replaceDeps: { "@simplysm/*": "packages/*/src" },
|
|
479
479
|
}));
|
|
480
|
-
vi.mocked(watchReplaceDeps).mockResolvedValue({ entries: [], dispose: mockDispose }
|
|
480
|
+
vi.mocked(watchReplaceDeps).mockResolvedValue({ entries: [], dispose: mockDispose });
|
|
481
481
|
setupEngineWithResult("success");
|
|
482
482
|
|
|
483
483
|
const orchestrator = new DevOrchestrator({ targets: [], options: [] });
|
|
@@ -156,7 +156,7 @@ describe("WatchOrchestrator", () => {
|
|
|
156
156
|
_pkgName: pkg.name,
|
|
157
157
|
};
|
|
158
158
|
mockBuildEngines.push(engine);
|
|
159
|
-
return engine
|
|
159
|
+
return engine;
|
|
160
160
|
});
|
|
161
161
|
});
|
|
162
162
|
|
|
@@ -494,7 +494,7 @@ describe("WatchOrchestrator", () => {
|
|
|
494
494
|
|
|
495
495
|
it("disposes replaceDepWatcher even when initialize fails after watchReplaceDeps", async () => {
|
|
496
496
|
const mockDispose = vi.fn();
|
|
497
|
-
vi.mocked(watchReplaceDeps).mockResolvedValue({ entries: [], dispose: mockDispose }
|
|
497
|
+
vi.mocked(watchReplaceDeps).mockResolvedValue({ entries: [], dispose: mockDispose });
|
|
498
498
|
|
|
499
499
|
// loadSdConfig succeeds but we'll make classifyWatchPackages fail
|
|
500
500
|
// by having watchReplaceDeps succeed first, then causing a later failure
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# SdTsCompiler 크래시 핸들링 — LLM 검증
|
|
2
|
+
|
|
3
|
+
## 검증 항목
|
|
4
|
+
|
|
5
|
+
### 구조적 검증
|
|
6
|
+
|
|
7
|
+
- 단계별 try-catch: compileAsync 내 analyzeAsync, findAffectedFiles, emit, collectDiagnostics, lintAndGlobalScss 각각이 개별 try-catch로 감싸져 있는지 확인
|
|
8
|
+
- 바깥 try-catch 유지: 단계별 try-catch를 감싸는 최종 안전망 try-catch가 존재하는지 확인
|
|
9
|
+
- SdError 사용: catch 블록에서 SdError(원본에러, context)로 감싸는지 확인
|
|
10
|
+
- crashDiagnostics 누적: 각 단계 catch에서 SerializedDiagnostic을 배열에 누적하고, 최종 결과에 합산하는지 확인
|
|
11
|
+
- per-file 프로브 제거: _probeCrashPerFileAngular, _probeCrashPerFileTsc 메서드가 삭제되었는지 확인
|
|
12
|
+
|
|
13
|
+
### 파일 추적 검증
|
|
14
|
+
|
|
15
|
+
- _findAffectedFilesForTsc: ignoreSourceFile 콜백으로 _setCrashContext("findAffectedFiles", sourceFile.fileName)를 호출하는지 확인
|
|
16
|
+
- _findAffectedFilesForAngular: 기존 콜백에 _setCrashContext("findAffectedFiles", sourceFile.fileName) 추가, 기존 ngtypecheck 필터링 로직 유지 확인
|
|
17
|
+
- _collectDiagnosticsForTsc: 파일 단위 루프로 분리되어 _setCrashContext("collectDiagnostics", sourceFile.fileName)를 호출하는지 확인
|
|
18
|
+
- _collectDiagnosticsForAngular: 기존 파일 추적 유지 확인
|
|
19
|
+
|
|
20
|
+
### 단계 간 의존성 검증
|
|
21
|
+
|
|
22
|
+
- analyzeAsync 크래시 시: _ngtscProgram 미설정 → Angular emit/diagnostics에서 null 체크로 스킵하는지 확인
|
|
23
|
+
- findAffectedFiles 크래시 시: affectedFiles=undefined(전체), _affectedSourceFiles 빈 Set → emit/diagnostics가 전체 대상으로 동작하는지 확인
|
|
24
|
+
- _createCrashDiagnostic: SdError cause chain으로 원본 에러 메시지+스택이 보존되는지 확인
|
|
@@ -35,8 +35,8 @@ const distDir = toPosix(path.join(pkgDir, "dist"));
|
|
|
35
35
|
describe("copySrcFiles", () => {
|
|
36
36
|
beforeEach(() => {
|
|
37
37
|
vi.clearAllMocks();
|
|
38
|
-
vi.mocked(fsx.mkdir).mockResolvedValue(undefined
|
|
39
|
-
vi.mocked(fsx.copy).mockResolvedValue(undefined
|
|
38
|
+
vi.mocked(fsx.mkdir).mockResolvedValue(undefined);
|
|
39
|
+
vi.mocked(fsx.copy).mockResolvedValue(undefined);
|
|
40
40
|
});
|
|
41
41
|
|
|
42
42
|
it("copies files matching glob patterns preserving relative paths", async () => {
|
|
@@ -84,9 +84,9 @@ describe("watchCopySrcFiles", () => {
|
|
|
84
84
|
beforeEach(() => {
|
|
85
85
|
vi.clearAllMocks();
|
|
86
86
|
vi.mocked(fsx.glob).mockResolvedValue([]);
|
|
87
|
-
vi.mocked(fsx.mkdir).mockResolvedValue(undefined
|
|
88
|
-
vi.mocked(fsx.copy).mockResolvedValue(undefined
|
|
89
|
-
vi.mocked(fsx.rm).mockResolvedValue(undefined
|
|
87
|
+
vi.mocked(fsx.mkdir).mockResolvedValue(undefined);
|
|
88
|
+
vi.mocked(fsx.copy).mockResolvedValue(undefined);
|
|
89
|
+
vi.mocked(fsx.rm).mockResolvedValue(undefined);
|
|
90
90
|
});
|
|
91
91
|
|
|
92
92
|
it("performs initial copy then starts watch", async () => {
|
|
@@ -215,7 +215,7 @@ describe("createClientEsbuildContext — PostCSS 플러그인 통합", () => {
|
|
|
215
215
|
await createClientEsbuildContext({
|
|
216
216
|
...baseBuild,
|
|
217
217
|
postcssPlugins: [["autoprefixer"]],
|
|
218
|
-
plugins: [customPlugin
|
|
218
|
+
plugins: [customPlugin],
|
|
219
219
|
legacyModule: true,
|
|
220
220
|
onEnd: vi.fn(),
|
|
221
221
|
});
|
|
@@ -294,7 +294,7 @@ describe("createClientEsbuildContext — 추가 옵션", () => {
|
|
|
294
294
|
const customPlugin = { name: "custom", setup: vi.fn() };
|
|
295
295
|
await createClientEsbuildContext({
|
|
296
296
|
...baseDev,
|
|
297
|
-
plugins: [customPlugin
|
|
297
|
+
plugins: [customPlugin],
|
|
298
298
|
});
|
|
299
299
|
const opts = vi.mocked(esbuild.context).mock.calls[0][0];
|
|
300
300
|
expect(opts.plugins).toContainEqual(customPlugin);
|
|
@@ -460,7 +460,7 @@ describe("createClientEsbuildContext — onEnd 플러그인", () => {
|
|
|
460
460
|
it("customPlugins가 angularPlugin 이전에 위치 (onStart에서 sourceFileCache 무효화 선행)", async () => {
|
|
461
461
|
await createClientEsbuildContext({
|
|
462
462
|
...baseDev,
|
|
463
|
-
plugins: [{ name: "custom", setup: vi.fn() }
|
|
463
|
+
plugins: [{ name: "custom", setup: vi.fn() }],
|
|
464
464
|
onEnd: vi.fn(),
|
|
465
465
|
});
|
|
466
466
|
const opts = vi.mocked(esbuild.context).mock.calls[0][0];
|
|
@@ -506,7 +506,7 @@ describe("createClientEsbuildContext — SCSS 플러그인 통합", () => {
|
|
|
506
506
|
const customPlugin = { name: "custom", setup: vi.fn() };
|
|
507
507
|
await createClientEsbuildContext({
|
|
508
508
|
...baseDev,
|
|
509
|
-
plugins: [customPlugin
|
|
509
|
+
plugins: [customPlugin],
|
|
510
510
|
});
|
|
511
511
|
const opts = vi.mocked(esbuild.context).mock.calls[0][0];
|
|
512
512
|
const pluginNames = opts.plugins!.map((p: any) => p.name);
|
|
@@ -123,7 +123,7 @@ describe("createEnvBanner", () => {
|
|
|
123
123
|
describe("writeChangedOutputFiles", () => {
|
|
124
124
|
beforeEach(() => {
|
|
125
125
|
vi.clearAllMocks();
|
|
126
|
-
vi.mocked(mockFs.mkdir).mockResolvedValue(undefined
|
|
126
|
+
vi.mocked(mockFs.mkdir).mockResolvedValue(undefined);
|
|
127
127
|
vi.mocked(mockFs.writeFile).mockResolvedValue();
|
|
128
128
|
});
|
|
129
129
|
|
|
@@ -160,7 +160,7 @@ describe("writeChangedOutputFiles", () => {
|
|
|
160
160
|
});
|
|
161
161
|
|
|
162
162
|
it("skips writing when transformed content matches existing file", async () => {
|
|
163
|
-
vi.mocked(mockFs.readFile).mockResolvedValue('import { bar } from "./bar.js";'
|
|
163
|
+
vi.mocked(mockFs.readFile).mockResolvedValue('import { bar } from "./bar.js";');
|
|
164
164
|
|
|
165
165
|
await writeChangedOutputFiles([
|
|
166
166
|
{
|
|
@@ -173,7 +173,7 @@ describe("writeChangedOutputFiles", () => {
|
|
|
173
173
|
});
|
|
174
174
|
|
|
175
175
|
it("writes file when content changed", async () => {
|
|
176
|
-
vi.mocked(mockFs.readFile).mockResolvedValue('import { old } from "./old.js";'
|
|
176
|
+
vi.mocked(mockFs.readFile).mockResolvedValue('import { old } from "./old.js";');
|
|
177
177
|
|
|
178
178
|
await writeChangedOutputFiles([
|
|
179
179
|
{
|
|
@@ -8,7 +8,7 @@ const mockCollectDiagnostics = vi.fn().mockReturnValue([]);
|
|
|
8
8
|
const mockEmitAffectedFiles = vi.fn().mockReturnValue([]);
|
|
9
9
|
const mockGetTsProgram = vi.fn().mockReturnValue({
|
|
10
10
|
getSourceFiles: () => [],
|
|
11
|
-
}
|
|
11
|
+
});
|
|
12
12
|
|
|
13
13
|
const angularCompilerConstructorSpy = vi.fn();
|
|
14
14
|
|
|
@@ -97,8 +97,8 @@ describe("mergeTestsPackagesIntoConfig", () => {
|
|
|
97
97
|
// Acceptance: targets 없이 watch 실행 시 tests 패키지가 포함된다
|
|
98
98
|
it("merges tests packages into config packages with target node", () => {
|
|
99
99
|
const configPackages: Record<string, SdPackageConfig | undefined> = {
|
|
100
|
-
"core-common": { target: "neutral" }
|
|
101
|
-
"core-node": { target: "node" }
|
|
100
|
+
"core-common": { target: "neutral" },
|
|
101
|
+
"core-node": { target: "node" },
|
|
102
102
|
};
|
|
103
103
|
const workspacePackages = new Map([
|
|
104
104
|
["core-common", "packages/core-common"],
|
|
@@ -124,7 +124,7 @@ describe("mergeTestsPackagesIntoConfig", () => {
|
|
|
124
124
|
// Acceptance: tests 패키지를 target으로 지정하여 watch 실행 (validateTargets에서 통합 맵 사용)
|
|
125
125
|
it("makes tests packages available for validateTargets", () => {
|
|
126
126
|
const configPackages: Record<string, SdPackageConfig | undefined> = {
|
|
127
|
-
"core-common": { target: "neutral" }
|
|
127
|
+
"core-common": { target: "neutral" },
|
|
128
128
|
};
|
|
129
129
|
const workspacePackages = new Map([
|
|
130
130
|
["core-common", "packages/core-common"],
|
|
@@ -140,7 +140,7 @@ describe("mergeTestsPackagesIntoConfig", () => {
|
|
|
140
140
|
// Unit: packages/ entries in workspacePackages are not added to merged (already in config)
|
|
141
141
|
it("does not duplicate packages/ entries from workspacePackages", () => {
|
|
142
142
|
const configPackages: Record<string, SdPackageConfig | undefined> = {
|
|
143
|
-
"core-common": { target: "neutral" }
|
|
143
|
+
"core-common": { target: "neutral" },
|
|
144
144
|
};
|
|
145
145
|
const workspacePackages = new Map([
|
|
146
146
|
["core-common", "packages/core-common"],
|
|
@@ -156,7 +156,7 @@ describe("mergeTestsPackagesIntoConfig", () => {
|
|
|
156
156
|
// Unit: empty workspacePackages returns config as-is
|
|
157
157
|
it("returns config unchanged when no workspace packages", () => {
|
|
158
158
|
const configPackages: Record<string, SdPackageConfig | undefined> = {
|
|
159
|
-
"core-common": { target: "neutral" }
|
|
159
|
+
"core-common": { target: "neutral" },
|
|
160
160
|
};
|
|
161
161
|
const workspacePackages = new Map<string, string>();
|
|
162
162
|
|
|
@@ -169,7 +169,7 @@ describe("mergeTestsPackagesIntoConfig", () => {
|
|
|
169
169
|
// Acceptance: 이름 충돌 시 에러 발생
|
|
170
170
|
it("throws when config package name collides with tests package name", () => {
|
|
171
171
|
const configPackages: Record<string, SdPackageConfig | undefined> = {
|
|
172
|
-
"orm": { target: "node" }
|
|
172
|
+
"orm": { target: "node" },
|
|
173
173
|
};
|
|
174
174
|
const workspacePackages = new Map([
|
|
175
175
|
["orm", "tests/orm"],
|
|
@@ -317,7 +317,7 @@ describe("server-build.worker build()", () => {
|
|
|
317
317
|
builderProgram: {},
|
|
318
318
|
isForAngular: false,
|
|
319
319
|
affectedFiles: undefined,
|
|
320
|
-
diagnostics: [{ code: 2345, category: 1 }]
|
|
320
|
+
diagnostics: [{ code: 2345, category: 1 }],
|
|
321
321
|
errorCount: 1,
|
|
322
322
|
warningCount: 0,
|
|
323
323
|
errors: ["TS2345: type error"],
|