@simplysm/sd-cli 14.0.42 → 14.0.43
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 +0 -35
- package/dist/angular/angular-compiler.d.ts.map +1 -1
- package/dist/angular/angular-compiler.js +0 -374
- package/dist/angular/angular-compiler.js.map +1 -1
- package/dist/angular/hmr-candidates.d.ts +13 -0
- package/dist/angular/hmr-candidates.d.ts.map +1 -0
- package/dist/angular/hmr-candidates.js +230 -0
- package/dist/angular/hmr-candidates.js.map +1 -0
- package/dist/angular/ngtsc-build-core.d.ts +29 -34
- package/dist/angular/ngtsc-build-core.d.ts.map +1 -1
- package/dist/angular/ngtsc-build-core.js +90 -51
- package/dist/angular/ngtsc-build-core.js.map +1 -1
- package/dist/angular/vite-angular-plugin.d.ts +1 -1
- package/dist/angular/vite-angular-plugin.d.ts.map +1 -1
- package/dist/angular/vite-angular-plugin.js +63 -56
- package/dist/angular/vite-angular-plugin.js.map +1 -1
- package/dist/angular/web-worker-transformer.d.ts +9 -0
- package/dist/angular/web-worker-transformer.d.ts.map +1 -0
- package/dist/angular/web-worker-transformer.js +73 -0
- package/dist/angular/web-worker-transformer.js.map +1 -0
- package/dist/capacitor/capacitor.d.ts.map +1 -1
- package/dist/capacitor/capacitor.js +6 -4
- package/dist/capacitor/capacitor.js.map +1 -1
- package/dist/commands/check.d.ts +1 -1
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +15 -65
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/publish/deployment-phase.d.ts.map +1 -1
- package/dist/commands/publish/deployment-phase.js +13 -5
- package/dist/commands/publish/deployment-phase.js.map +1 -1
- package/dist/commands/publish/npm-publisher.js +1 -1
- package/dist/commands/publish/npm-publisher.js.map +1 -1
- package/dist/commands/publish/publish-command.js +1 -1
- package/dist/commands/publish/publish-command.js.map +1 -1
- package/dist/commands/publish/version-upgrade.js +1 -1
- package/dist/commands/publish/version-upgrade.js.map +1 -1
- package/dist/commands/replace-deps.d.ts.map +1 -1
- package/dist/commands/replace-deps.js +2 -1
- package/dist/commands/replace-deps.js.map +1 -1
- package/dist/deps/replace-deps/collect-deps.d.ts.map +1 -1
- package/dist/deps/replace-deps/collect-deps.js +5 -2
- package/dist/deps/replace-deps/collect-deps.js.map +1 -1
- package/dist/deps/replace-deps/replace-deps.d.ts +21 -3
- package/dist/deps/replace-deps/replace-deps.d.ts.map +1 -1
- package/dist/deps/replace-deps/replace-deps.js +107 -62
- package/dist/deps/replace-deps/replace-deps.js.map +1 -1
- package/dist/electron/electron.js +7 -7
- package/dist/electron/electron.js.map +1 -1
- package/dist/engines/BaseEngine.d.ts.map +1 -1
- package/dist/engines/BaseEngine.js +2 -5
- package/dist/engines/BaseEngine.js.map +1 -1
- package/dist/engines/EsbuildClientEngine.d.ts.map +1 -1
- package/dist/engines/EsbuildClientEngine.js +16 -9
- package/dist/engines/EsbuildClientEngine.js.map +1 -1
- package/dist/engines/NgtscEngine.d.ts +4 -4
- package/dist/engines/NgtscEngine.d.ts.map +1 -1
- package/dist/engines/NgtscEngine.js +5 -5
- package/dist/engines/NgtscEngine.js.map +1 -1
- package/dist/engines/TscEngine.d.ts.map +1 -1
- package/dist/engines/TscEngine.js +0 -2
- package/dist/engines/TscEngine.js.map +1 -1
- package/dist/engines/types.d.ts +2 -0
- package/dist/engines/types.d.ts.map +1 -1
- package/dist/esbuild/esbuild-angular-compiler-plugin.d.ts +36 -0
- package/dist/esbuild/esbuild-angular-compiler-plugin.d.ts.map +1 -0
- package/dist/esbuild/esbuild-angular-compiler-plugin.js +464 -0
- package/dist/esbuild/esbuild-angular-compiler-plugin.js.map +1 -0
- package/dist/esbuild/esbuild-client-config.d.ts +8 -2
- package/dist/esbuild/esbuild-client-config.d.ts.map +1 -1
- package/dist/esbuild/esbuild-client-config.js +48 -33
- package/dist/esbuild/esbuild-client-config.js.map +1 -1
- package/dist/esbuild/esbuild-tsc-plugin.d.ts +4 -1
- package/dist/esbuild/esbuild-tsc-plugin.d.ts.map +1 -1
- package/dist/esbuild/esbuild-tsc-plugin.js +27 -23
- package/dist/esbuild/esbuild-tsc-plugin.js.map +1 -1
- package/dist/esbuild/file-reference-tracker.d.ts +24 -0
- package/dist/esbuild/file-reference-tracker.d.ts.map +1 -0
- package/dist/esbuild/file-reference-tracker.js +57 -0
- package/dist/esbuild/file-reference-tracker.js.map +1 -0
- package/dist/esbuild/lmdb-cache-store.d.ts +18 -0
- package/dist/esbuild/lmdb-cache-store.d.ts.map +1 -0
- package/dist/esbuild/lmdb-cache-store.js +41 -0
- package/dist/esbuild/lmdb-cache-store.js.map +1 -0
- package/dist/esbuild/load-result-cache.d.ts +17 -0
- package/dist/esbuild/load-result-cache.d.ts.map +1 -0
- package/dist/esbuild/load-result-cache.js +61 -0
- package/dist/esbuild/load-result-cache.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/lint/lint-core.js +7 -7
- package/dist/lint/lint-core.js.map +1 -1
- package/dist/orchestrators/BaseOrchestrator.js +2 -2
- package/dist/orchestrators/BaseOrchestrator.js.map +1 -1
- package/dist/orchestrators/BuildOrchestrator.d.ts.map +1 -1
- package/dist/orchestrators/BuildOrchestrator.js +5 -19
- package/dist/orchestrators/BuildOrchestrator.js.map +1 -1
- package/dist/orchestrators/DevOrchestrator.js +5 -5
- package/dist/orchestrators/DevOrchestrator.js.map +1 -1
- package/dist/orchestrators/WatchOrchestrator.js +6 -6
- package/dist/orchestrators/WatchOrchestrator.js.map +1 -1
- package/dist/runtime/ResultCollector.d.ts +1 -0
- package/dist/runtime/ResultCollector.d.ts.map +1 -1
- package/dist/runtime/ResultCollector.js.map +1 -1
- package/dist/runtime/engine-watch-events.d.ts.map +1 -1
- package/dist/runtime/engine-watch-events.js +3 -0
- package/dist/runtime/engine-watch-events.js.map +1 -1
- package/dist/runtime/rebuild-manager.js +1 -1
- package/dist/runtime/rebuild-manager.js.map +1 -1
- package/dist/runtime/worker-utils.js +1 -1
- package/dist/runtime/worker-utils.js.map +1 -1
- package/dist/sd-cli-entry.d.ts.map +1 -1
- package/dist/sd-cli-entry.js +4 -3
- package/dist/sd-cli-entry.js.map +1 -1
- package/dist/sd-cli.js +3 -3
- package/dist/sd-cli.js.map +1 -1
- package/dist/ts-compiler/SdTsCompiler.d.ts +39 -0
- package/dist/ts-compiler/SdTsCompiler.d.ts.map +1 -0
- package/dist/ts-compiler/SdTsCompiler.js +593 -0
- package/dist/ts-compiler/SdTsCompiler.js.map +1 -0
- package/dist/ts-compiler/sd-ts-compiler-options.d.ts +40 -0
- package/dist/ts-compiler/sd-ts-compiler-options.d.ts.map +1 -0
- package/dist/ts-compiler/sd-ts-compiler-options.js +2 -0
- package/dist/ts-compiler/sd-ts-compiler-options.js.map +1 -0
- package/dist/ts-compiler/sd-ts-compiler-result.d.ts +34 -0
- package/dist/ts-compiler/sd-ts-compiler-result.d.ts.map +1 -0
- package/dist/ts-compiler/sd-ts-compiler-result.js +2 -0
- package/dist/ts-compiler/sd-ts-compiler-result.js.map +1 -0
- package/dist/utils/copy-public.d.ts +6 -4
- package/dist/utils/copy-public.d.ts.map +1 -1
- package/dist/utils/copy-public.js +9 -7
- package/dist/utils/copy-public.js.map +1 -1
- package/dist/utils/diagnostic-utils.d.ts +2 -3
- package/dist/utils/diagnostic-utils.d.ts.map +1 -1
- package/dist/utils/diagnostic-utils.js +8 -9
- package/dist/utils/diagnostic-utils.js.map +1 -1
- package/dist/utils/output-utils.d.ts +8 -2
- package/dist/utils/output-utils.d.ts.map +1 -1
- package/dist/utils/output-utils.js +32 -8
- package/dist/utils/output-utils.js.map +1 -1
- package/dist/workers/client.worker.d.ts +1 -1
- package/dist/workers/client.worker.d.ts.map +1 -1
- package/dist/workers/client.worker.js +136 -110
- package/dist/workers/client.worker.js.map +1 -1
- package/dist/workers/library-build.worker.d.ts +0 -2
- package/dist/workers/library-build.worker.d.ts.map +1 -1
- package/dist/workers/library-build.worker.js +147 -70
- package/dist/workers/library-build.worker.js.map +1 -1
- package/dist/workers/server-build.worker.d.ts.map +1 -1
- package/dist/workers/server-build.worker.js +30 -57
- package/dist/workers/server-build.worker.js.map +1 -1
- package/dist/workers/server-esbuild-context.d.ts +7 -0
- package/dist/workers/server-esbuild-context.d.ts.map +1 -1
- package/dist/workers/server-esbuild-context.js +11 -2
- package/dist/workers/server-esbuild-context.js.map +1 -1
- package/package.json +5 -4
- package/src/angular/angular-compiler.ts +0 -502
- package/src/angular/hmr-candidates.ts +295 -0
- package/src/angular/ngtsc-build-core.ts +125 -92
- package/src/angular/vite-angular-plugin.ts +71 -65
- package/src/angular/web-worker-transformer.ts +117 -0
- package/src/capacitor/capacitor.ts +6 -4
- package/src/commands/check.ts +17 -76
- package/src/commands/publish/deployment-phase.ts +11 -7
- package/src/commands/publish/npm-publisher.ts +1 -1
- package/src/commands/publish/publish-command.ts +1 -1
- package/src/commands/publish/version-upgrade.ts +1 -1
- package/src/commands/replace-deps.ts +3 -1
- package/src/deps/replace-deps/collect-deps.ts +4 -2
- package/src/deps/replace-deps/replace-deps.ts +114 -66
- package/src/electron/electron.ts +7 -7
- package/src/engines/BaseEngine.ts +2 -6
- package/src/engines/EsbuildClientEngine.ts +16 -10
- package/src/engines/NgtscEngine.ts +7 -7
- package/src/engines/TscEngine.ts +0 -2
- package/src/engines/types.ts +2 -0
- package/src/esbuild/esbuild-angular-compiler-plugin.ts +647 -0
- package/src/esbuild/esbuild-client-config.ts +57 -41
- package/src/esbuild/esbuild-tsc-plugin.ts +33 -23
- package/src/esbuild/file-reference-tracker.ts +61 -0
- package/src/esbuild/lmdb-cache-store.ts +46 -0
- package/src/esbuild/load-result-cache.ts +85 -0
- package/src/index.ts +5 -0
- package/src/lint/lint-core.ts +7 -7
- package/src/orchestrators/BaseOrchestrator.ts +2 -2
- package/src/orchestrators/BuildOrchestrator.ts +5 -24
- package/src/orchestrators/DevOrchestrator.ts +5 -5
- package/src/orchestrators/WatchOrchestrator.ts +6 -6
- package/src/runtime/ResultCollector.ts +1 -0
- package/src/runtime/engine-watch-events.ts +3 -0
- package/src/runtime/rebuild-manager.ts +1 -1
- package/src/runtime/worker-utils.ts +1 -1
- package/src/sd-cli-entry.ts +5 -3
- package/src/sd-cli.ts +4 -4
- package/src/ts-compiler/SdTsCompiler.ts +815 -0
- package/src/ts-compiler/sd-ts-compiler-options.ts +46 -0
- package/src/ts-compiler/sd-ts-compiler-result.ts +34 -0
- package/src/utils/copy-public.ts +9 -6
- package/src/utils/diagnostic-utils.ts +8 -9
- package/src/utils/output-utils.ts +38 -8
- package/src/workers/client.worker.ts +160 -126
- package/src/workers/library-build.worker.ts +187 -75
- package/src/workers/server-build.worker.ts +31 -61
- package/src/workers/server-esbuild-context.ts +14 -2
- package/tests/angular/fixtures/packages/basic-app/dist/styles.css +3 -0
- package/tests/angular/fixtures/packages/basic-app/scss/styles.scss +5 -0
- package/tests/angular/vite-angular-plugin-sdtscompiler.verify.md +13 -0
- package/tests/angular/web-worker-transformer.spec.ts +154 -0
- package/tests/capacitor/capacitor-build.spec.ts +1 -1
- package/tests/capacitor/capacitor-icon.spec.ts +1 -1
- package/tests/capacitor/capacitor-init.spec.ts +1 -1
- package/tests/commands/check.spec.ts +90 -104
- package/tests/commands/publish.spec.ts +12 -4
- package/tests/commands/slice3-severity-cleanup.verify.md +12 -0
- package/tests/deps/replace-deps/collect-deps.acc.spec.ts +62 -0
- package/tests/deps/replace-deps/collect-deps.spec.ts +49 -0
- package/tests/deps/replace-deps/replace-deps-filter.spec.ts +103 -0
- package/tests/deps/replace-deps/replace-deps-setup.acc.spec.ts +156 -0
- package/tests/electron/electron.spec.ts +4 -1
- package/tests/engines/engine-adapter-isolation.spec.ts +5 -6
- package/tests/engines/engine-duplicate-output-removal.verify.md +10 -0
- package/tests/engines/esbuild-client-engine.acc.spec.ts +79 -0
- package/tests/engines/esbuild-client-engine.spec.ts +73 -3
- package/tests/esbuild/esbuild-angular-compiler-plugin-hmr.verify.md +23 -0
- package/tests/esbuild/esbuild-angular-compiler-plugin-onload.verify.md +21 -0
- package/tests/esbuild/esbuild-angular-compiler-plugin-onstart-extraction.verify.md +16 -0
- package/tests/esbuild/esbuild-angular-compiler-plugin-sdtscompiler.verify.md +15 -0
- package/tests/esbuild/esbuild-angular-compiler-plugin-stylesheet.verify.md +31 -0
- package/tests/esbuild/esbuild-angular-compiler-plugin-worker.verify.md +31 -0
- package/tests/esbuild/esbuild-angular-compiler-plugin.spec.ts +397 -0
- package/tests/esbuild/esbuild-angular-compiler-plugin.verify.md +21 -0
- package/tests/esbuild/esbuild-tsc-plugin-imports.verify.md +13 -0
- package/tests/esbuild/esbuild-tsc-plugin.acc.spec.ts +56 -111
- package/tests/esbuild/esbuild-tsc-plugin.spec.ts +116 -52
- package/tests/esbuild/file-reference-tracker.spec.ts +99 -0
- package/tests/esbuild/lmdb-cache-store.spec.ts +58 -0
- package/tests/esbuild/load-result-cache.acc.spec.ts +55 -0
- package/tests/esbuild/load-result-cache.spec.ts +133 -0
- package/tests/orchestrators/build-orchestrator.spec.ts +4 -3
- package/tests/orchestrators/dev-orchestrator.spec.ts +5 -5
- package/tests/orchestrators/slice1-stdout-to-consola.verify.md +10 -0
- package/tests/orchestrators/typecheck-orchestrator.spec.ts +1 -1
- package/tests/orchestrators/watch-orchestrator.spec.ts +7 -7
- package/tests/runtime/result-collector.spec.ts +64 -0
- package/tests/sd-cli-entry.spec.ts +3 -4
- package/tests/sd-cli-log-tag.verify.md +11 -0
- package/tests/ts-compiler/SdTsCompiler-affected-files.verify.md +8 -0
- package/tests/ts-compiler/SdTsCompiler-diagnostics.verify.md +12 -0
- package/tests/ts-compiler/SdTsCompiler-emit.verify.md +9 -0
- package/tests/ts-compiler/SdTsCompiler.acc.spec.ts +603 -0
- package/tests/ts-compiler/SdTsCompiler.spec.ts +265 -0
- package/tests/ts-compiler/SdTsCompiler.verify.md +41 -0
- package/tests/ts-compiler/fixtures/non-angular-pkg/.cache/typecheck-browser.tsbuildinfo +1 -0
- package/tests/ts-compiler/fixtures/non-angular-pkg/.cache/typecheck-node.tsbuildinfo +1 -0
- package/tests/ts-compiler/fixtures/non-angular-pkg/.cache/typecheck.tsbuildinfo +1 -0
- package/tests/ts-compiler/fixtures/non-angular-pkg/dist/index.d.ts +2 -0
- package/tests/ts-compiler/fixtures/non-angular-pkg/dist/index.d.ts.map +1 -0
- package/tests/ts-compiler/fixtures/non-angular-pkg/dist/index.js +4 -0
- package/tests/ts-compiler/fixtures/non-angular-pkg/dist/index.js.map +1 -0
- package/tests/ts-compiler/fixtures/non-angular-pkg/dist/util.d.ts +2 -0
- package/tests/ts-compiler/fixtures/non-angular-pkg/dist/util.d.ts.map +1 -0
- package/tests/ts-compiler/fixtures/non-angular-pkg/dist/util.js +4 -0
- package/tests/ts-compiler/fixtures/non-angular-pkg/dist/util.js.map +1 -0
- package/tests/ts-compiler/fixtures/non-angular-pkg/src/index.ts +3 -0
- package/tests/ts-compiler/fixtures/non-angular-pkg/src/util.ts +3 -0
- package/tests/ts-compiler/fixtures/non-angular-pkg/tests/sample.test-file.ts +3 -0
- package/tests/ts-compiler/fixtures/non-angular-pkg/tsconfig.json +12 -0
- package/tests/ts-compiler/scss-lint-integration.verify.md +14 -0
- package/tests/utils/angular-build.spec.ts +1 -1
- package/tests/utils/copy-public-outdir.verify.md +8 -0
- package/tests/utils/copy-public.acc.spec.ts +52 -0
- package/tests/utils/copy-public.spec.ts +56 -0
- package/tests/utils/diagnostic-utils.spec.ts +24 -15
- package/tests/utils/engine-watch-events.acc.spec.ts +59 -0
- package/tests/utils/engine-watch-events.spec.ts +58 -0
- package/tests/utils/esbuild-client-config-integration.verify.md +9 -0
- package/tests/utils/esbuild-client-config.acc.spec.ts +45 -61
- package/tests/utils/esbuild-client-config.spec.ts +70 -52
- package/tests/utils/ngtsc-build-core-write-emit.spec.ts +12 -12
- package/tests/utils/ngtsc-build-core.spec.ts +1 -44
- package/tests/utils/output-utils.spec.ts +133 -13
- package/tests/utils/replace-deps-watch.acc.spec.ts +7 -1
- package/tests/utils/replace-deps-watch.spec.ts +57 -1
- package/tests/utils/worker-utils.spec.ts +8 -2
- package/tests/workers/client-worker-initial-build-error.verify.md +2 -3
- package/tests/workers/client-worker-initial-build-warnings.verify.md +7 -0
- package/tests/workers/client-worker-refactor.verify.md +22 -0
- package/tests/workers/client-worker-ts-cache-invalidation.verify.md +12 -0
- package/tests/workers/client-worker.acc.spec.ts +6 -3
- package/tests/workers/library-build-lint.spec.ts +40 -45
- package/tests/workers/library-build-worker.spec.ts +294 -40
- package/tests/workers/server-build-lint.spec.ts +59 -45
- package/tests/workers/server-build-worker.spec.ts +63 -24
- package/tests/workers/server-esbuild-context.acc.spec.ts +2 -0
- package/tests/workers/server-esbuild-context.spec.ts +2 -0
- package/tests/workers/server-runtime-worker.spec.ts +1 -1
- package/tests/workers/shared-worker-lifecycle.acc.spec.ts +1 -1
- package/dist/angular/angular-build-pipeline.d.ts +0 -97
- package/dist/angular/angular-build-pipeline.d.ts.map +0 -1
- package/dist/angular/angular-build-pipeline.js +0 -285
- package/dist/angular/angular-build-pipeline.js.map +0 -1
- package/dist/utils/tsc-build.d.ts +0 -51
- package/dist/utils/tsc-build.d.ts.map +0 -1
- package/dist/utils/tsc-build.js +0 -156
- package/dist/utils/tsc-build.js.map +0 -1
- package/dist/workers/ngtsc-build.worker.d.ts +0 -23
- package/dist/workers/ngtsc-build.worker.d.ts.map +0 -1
- package/dist/workers/ngtsc-build.worker.js +0 -267
- package/dist/workers/ngtsc-build.worker.js.map +0 -1
- package/src/angular/angular-build-pipeline.ts +0 -406
- package/src/utils/tsc-build.ts +0 -226
- package/src/workers/ngtsc-build.worker.ts +0 -351
- package/tests/angular/angular-build-pipeline.spec.ts +0 -247
- package/tests/angular/angular-compiler-aot.acc.spec.ts +0 -68
- package/tests/angular/angular-compiler-aot.spec.ts +0 -80
- package/tests/utils/angular-compiler-emit.spec.ts +0 -666
- package/tests/utils/angular-compiler.spec.ts +0 -707
- package/tests/utils/tsc-build.spec.ts +0 -527
- package/tests/workers/ngtsc-build-lint.spec.ts +0 -141
- package/tests/workers/ngtsc-build-worker.spec.ts +0 -199
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from "vitest";
|
|
2
|
+
import { FileReferenceTracker } from "../../src/esbuild/file-reference-tracker.js";
|
|
3
|
+
|
|
4
|
+
describe("FileReferenceTracker", () => {
|
|
5
|
+
let tracker: FileReferenceTracker;
|
|
6
|
+
|
|
7
|
+
beforeEach(() => {
|
|
8
|
+
tracker = new FileReferenceTracker();
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
//#region Acceptance Tests
|
|
12
|
+
|
|
13
|
+
describe("리소스 의존성 등록 및 조회", () => {
|
|
14
|
+
it("add로 등록된 참조 파일이 referencedFiles에 포함된다", () => {
|
|
15
|
+
tracker.add("comp.ts", ["style.scss", "template.html"]);
|
|
16
|
+
|
|
17
|
+
const refs = new Set(tracker.referencedFiles);
|
|
18
|
+
expect(refs.has("style.scss")).toBe(true);
|
|
19
|
+
expect(refs.has("template.html")).toBe(true);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it("자기 참조(containingFile)는 referencedFiles에 포함되지 않는다", () => {
|
|
23
|
+
tracker.add("comp.ts", ["comp.ts", "style.scss"]);
|
|
24
|
+
|
|
25
|
+
const refs = new Set(tracker.referencedFiles);
|
|
26
|
+
expect(refs.has("comp.ts")).toBe(false);
|
|
27
|
+
expect(refs.has("style.scss")).toBe(true);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
describe("변경 파일에 대한 전이적 영향 파일 확장", () => {
|
|
32
|
+
it("참조 파일 변경 시 containingFile도 반환한다", () => {
|
|
33
|
+
tracker.add("comp.ts", ["style.scss"]);
|
|
34
|
+
|
|
35
|
+
const changed = new Set(["style.scss"]);
|
|
36
|
+
const result = tracker.update(changed);
|
|
37
|
+
|
|
38
|
+
expect(result.has("style.scss")).toBe(true);
|
|
39
|
+
expect(result.has("comp.ts")).toBe(true);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it("update 후 stale 레코드가 정리된다", () => {
|
|
43
|
+
tracker.add("comp.ts", ["style.scss"]);
|
|
44
|
+
|
|
45
|
+
tracker.update(new Set(["style.scss"]));
|
|
46
|
+
|
|
47
|
+
// stale 레코드 정리 확인: style.scss가 더 이상 referencedFiles에 없어야 함
|
|
48
|
+
const refs = new Set(tracker.referencedFiles);
|
|
49
|
+
expect(refs.has("style.scss")).toBe(false);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
describe("변경되지 않은 파일은 원본 Set만 반환", () => {
|
|
54
|
+
it("의존성이 없는 파일 변경 시 원본 Set을 그대로 반환한다", () => {
|
|
55
|
+
tracker.add("comp.ts", ["style.scss"]);
|
|
56
|
+
|
|
57
|
+
const changed = new Set(["other.ts"]);
|
|
58
|
+
const result = tracker.update(changed);
|
|
59
|
+
|
|
60
|
+
// 원본 Set이 그대로 반환됨 (새 Set이 아님)
|
|
61
|
+
expect(result).toBe(changed);
|
|
62
|
+
expect(result.has("other.ts")).toBe(true);
|
|
63
|
+
expect(result.size).toBe(1);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
//#endregion
|
|
68
|
+
|
|
69
|
+
//#region Unit Tests — Edge Cases
|
|
70
|
+
|
|
71
|
+
it("경로가 normalize되어 저장된다", () => {
|
|
72
|
+
tracker.add("src\\comp.ts", ["src\\style.scss"]);
|
|
73
|
+
|
|
74
|
+
const refs = new Set(tracker.referencedFiles);
|
|
75
|
+
// path.normalize가 적용되어야 함
|
|
76
|
+
expect(refs.size).toBe(1);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it("동일 참조 파일을 여러 containingFile에서 등록할 수 있다", () => {
|
|
80
|
+
tracker.add("comp-a.ts", ["shared.scss"]);
|
|
81
|
+
tracker.add("comp-b.ts", ["shared.scss"]);
|
|
82
|
+
|
|
83
|
+
const changed = new Set(["shared.scss"]);
|
|
84
|
+
const result = tracker.update(changed);
|
|
85
|
+
|
|
86
|
+
expect(result.has("comp-a.ts")).toBe(true);
|
|
87
|
+
expect(result.has("comp-b.ts")).toBe(true);
|
|
88
|
+
expect(result.has("shared.scss")).toBe(true);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it("빈 referencedFiles로 add 호출 시 아무 것도 등록되지 않는다", () => {
|
|
92
|
+
tracker.add("comp.ts", []);
|
|
93
|
+
|
|
94
|
+
const refs = new Set(tracker.referencedFiles);
|
|
95
|
+
expect(refs.size).toBe(0);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
//#endregion
|
|
99
|
+
});
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { describe, it, expect, afterEach } from "vitest";
|
|
2
|
+
import fs from "fs";
|
|
3
|
+
import os from "os";
|
|
4
|
+
import path from "path";
|
|
5
|
+
import { LmdbCacheStore } from "../../src/esbuild/lmdb-cache-store.js";
|
|
6
|
+
|
|
7
|
+
describe("LmdbCacheStore", () => {
|
|
8
|
+
let tmpDir: string;
|
|
9
|
+
let store: LmdbCacheStore;
|
|
10
|
+
|
|
11
|
+
function createStore(): LmdbCacheStore {
|
|
12
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "lmdb-test-"));
|
|
13
|
+
store = new LmdbCacheStore(path.join(tmpDir, "test.db"));
|
|
14
|
+
return store;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
afterEach(async () => {
|
|
18
|
+
await store.close();
|
|
19
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
//#region Acceptance Tests
|
|
23
|
+
|
|
24
|
+
describe("값 저장 및 조회", () => {
|
|
25
|
+
it("set한 값을 get으로 조회할 수 있다", async () => {
|
|
26
|
+
createStore();
|
|
27
|
+
|
|
28
|
+
const value = new Uint8Array([1, 2, 3]);
|
|
29
|
+
await store.set("key1", value);
|
|
30
|
+
|
|
31
|
+
const result = store.get("key1");
|
|
32
|
+
// lmdb는 Uint8Array를 Buffer로 반환하므로 바이트 내용만 비교
|
|
33
|
+
expect(new Uint8Array(result as Uint8Array)).toEqual(value);
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
describe("close 후 리소스 해제", () => {
|
|
38
|
+
it("close 호출이 에러 없이 완료된다", async () => {
|
|
39
|
+
createStore();
|
|
40
|
+
await store.set("k", "v");
|
|
41
|
+
|
|
42
|
+
await expect(store.close()).resolves.toBeUndefined();
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
//#endregion
|
|
47
|
+
|
|
48
|
+
//#region Unit Tests — Edge Cases
|
|
49
|
+
|
|
50
|
+
it("존재하지 않는 키 조회 시 undefined를 반환한다", () => {
|
|
51
|
+
createStore();
|
|
52
|
+
|
|
53
|
+
const result = store.get("nonexistent");
|
|
54
|
+
expect(result).toBeUndefined();
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
//#endregion
|
|
58
|
+
});
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from "vitest";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import type { OnLoadResult } from "esbuild";
|
|
4
|
+
|
|
5
|
+
const { MemoryLoadResultCache, createCachedLoad } = await import(
|
|
6
|
+
"../../src/esbuild/load-result-cache.js"
|
|
7
|
+
);
|
|
8
|
+
|
|
9
|
+
describe("MemoryLoadResultCache — Acceptance", () => {
|
|
10
|
+
it("put → get 조회 후, invalidate로 캐시 제거", () => {
|
|
11
|
+
const cache = new MemoryLoadResultCache();
|
|
12
|
+
const depPath = "/workspace/dep.js";
|
|
13
|
+
const utilPath = "/workspace/util.js";
|
|
14
|
+
const result: OnLoadResult = {
|
|
15
|
+
contents: "console.log('hello');",
|
|
16
|
+
loader: "js",
|
|
17
|
+
watchFiles: [depPath, utilPath],
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
// put 후 get으로 조회
|
|
21
|
+
cache.put("file:/workspace/app.js", result);
|
|
22
|
+
expect(cache.get("file:/workspace/app.js")).toBe(result);
|
|
23
|
+
|
|
24
|
+
// watchFiles에 의존 파일이 포함됨 (normalize된 경로)
|
|
25
|
+
expect(cache.watchFiles).toContain(path.normalize(depPath));
|
|
26
|
+
expect(cache.watchFiles).toContain(path.normalize(utilPath));
|
|
27
|
+
|
|
28
|
+
// 의존 파일 변경 → invalidate (normalize된 경로로 호출) → 캐시 제거
|
|
29
|
+
const found = cache.invalidate(path.normalize(depPath));
|
|
30
|
+
expect(found).toBe(true);
|
|
31
|
+
expect(cache.get("file:/workspace/app.js")).toBeUndefined();
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it("createCachedLoad로 래핑된 콜백은 캐시 히트 시 원본을 호출하지 않는다", async () => {
|
|
35
|
+
const cache = new MemoryLoadResultCache();
|
|
36
|
+
const callback = vi.fn(() => ({
|
|
37
|
+
contents: "transformed",
|
|
38
|
+
loader: "js" as const,
|
|
39
|
+
}));
|
|
40
|
+
|
|
41
|
+
const cached = createCachedLoad(cache, callback) as (
|
|
42
|
+
args: { namespace: string; path: string },
|
|
43
|
+
) => Promise<OnLoadResult | null | undefined>;
|
|
44
|
+
|
|
45
|
+
// 첫 호출 — 원본 실행
|
|
46
|
+
const result1 = await cached({ namespace: "file", path: "/workspace/vendor.js" });
|
|
47
|
+
expect(result1?.contents).toBe("transformed");
|
|
48
|
+
expect(callback).toHaveBeenCalledTimes(1);
|
|
49
|
+
|
|
50
|
+
// 재호출 — 캐시 히트
|
|
51
|
+
const result2 = await cached({ namespace: "file", path: "/workspace/vendor.js" });
|
|
52
|
+
expect(result2?.contents).toBe("transformed");
|
|
53
|
+
expect(callback).toHaveBeenCalledTimes(1); // 추가 호출 없음
|
|
54
|
+
});
|
|
55
|
+
});
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from "vitest";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import type { OnLoadResult } from "esbuild";
|
|
4
|
+
|
|
5
|
+
const { MemoryLoadResultCache, createCachedLoad } = await import(
|
|
6
|
+
"../../src/esbuild/load-result-cache.js"
|
|
7
|
+
);
|
|
8
|
+
|
|
9
|
+
describe("MemoryLoadResultCache", () => {
|
|
10
|
+
it("put 후 get으로 동일한 결과를 반환한다", () => {
|
|
11
|
+
const cache = new MemoryLoadResultCache();
|
|
12
|
+
const result: OnLoadResult = { contents: "x", loader: "js" };
|
|
13
|
+
|
|
14
|
+
cache.put("key1", result);
|
|
15
|
+
expect(cache.get("key1")).toBe(result);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it("존재하지 않는 키에 대해 undefined를 반환한다", () => {
|
|
19
|
+
const cache = new MemoryLoadResultCache();
|
|
20
|
+
expect(cache.get("nonexistent")).toBeUndefined();
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it("watchFiles가 있는 결과를 put하면 fileDependencies가 추적된다", () => {
|
|
24
|
+
const cache = new MemoryLoadResultCache();
|
|
25
|
+
const depPath = "/workspace/dep.js";
|
|
26
|
+
cache.put("file:app.js", {
|
|
27
|
+
contents: "x",
|
|
28
|
+
loader: "js",
|
|
29
|
+
watchFiles: [depPath],
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
expect(cache.watchFiles).toContain(path.normalize(depPath));
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it("invalidate는 의존 파일에 연결된 캐시 항목을 제거한다", () => {
|
|
36
|
+
const cache = new MemoryLoadResultCache();
|
|
37
|
+
const depPath = "/workspace/dep.js";
|
|
38
|
+
cache.put("file:app.js", {
|
|
39
|
+
contents: "x",
|
|
40
|
+
loader: "js",
|
|
41
|
+
watchFiles: [depPath],
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
const found = cache.invalidate(path.normalize(depPath));
|
|
45
|
+
expect(found).toBe(true);
|
|
46
|
+
expect(cache.get("file:app.js")).toBeUndefined();
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it("invalidate는 의존성이 없는 파일에 대해 false를 반환한다", () => {
|
|
50
|
+
const cache = new MemoryLoadResultCache();
|
|
51
|
+
expect(cache.invalidate("/unknown.js")).toBe(false);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it("여러 항목이 같은 watchFile을 공유하면 모두 무효화된다", () => {
|
|
55
|
+
const cache = new MemoryLoadResultCache();
|
|
56
|
+
const sharedPath = "/workspace/shared.js";
|
|
57
|
+
const normalizedShared = path.normalize(sharedPath);
|
|
58
|
+
cache.put("file:a.js", { contents: "a", watchFiles: [sharedPath] });
|
|
59
|
+
cache.put("file:b.js", { contents: "b", watchFiles: [sharedPath] });
|
|
60
|
+
|
|
61
|
+
// invalidate는 normalize된 경로로 호출해야 한다 (호출자 책임, 원본 패턴)
|
|
62
|
+
cache.invalidate(normalizedShared);
|
|
63
|
+
expect(cache.get("file:a.js")).toBeUndefined();
|
|
64
|
+
expect(cache.get("file:b.js")).toBeUndefined();
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it("watchFiles는 경로를 정규화하여 추적한다", () => {
|
|
68
|
+
const cache = new MemoryLoadResultCache();
|
|
69
|
+
cache.put("file:app.js", {
|
|
70
|
+
contents: "x",
|
|
71
|
+
watchFiles: ["/workspace\\dep.js"],
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
// path.normalize 적용 결과에 따라 경로가 정규화됨
|
|
75
|
+
const watchFiles = cache.watchFiles;
|
|
76
|
+
expect(watchFiles.length).toBe(1);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
describe("createCachedLoad", () => {
|
|
81
|
+
it("cache가 undefined이면 원본 콜백을 그대로 반환한다", () => {
|
|
82
|
+
const callback = vi.fn();
|
|
83
|
+
const result = createCachedLoad(undefined, callback);
|
|
84
|
+
expect(result).toBe(callback);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it("캐시 미스 시 콜백을 호출하고 결과를 캐싱한다", async () => {
|
|
88
|
+
const cache = new MemoryLoadResultCache();
|
|
89
|
+
const callback = vi.fn(() => ({
|
|
90
|
+
contents: "result",
|
|
91
|
+
loader: "js" as const,
|
|
92
|
+
}));
|
|
93
|
+
|
|
94
|
+
const cached = createCachedLoad(cache, callback) as (
|
|
95
|
+
args: { namespace: string; path: string },
|
|
96
|
+
) => Promise<OnLoadResult | null | undefined>;
|
|
97
|
+
|
|
98
|
+
await cached({ namespace: "file", path: "/app.js" });
|
|
99
|
+
expect(callback).toHaveBeenCalledTimes(1);
|
|
100
|
+
|
|
101
|
+
// 캐시에 저장됨
|
|
102
|
+
expect(cache.get("file:/app.js")).toBeDefined();
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
it("콜백이 null을 반환하면 캐싱하지 않는다", async () => {
|
|
106
|
+
const cache = new MemoryLoadResultCache();
|
|
107
|
+
const callback = vi.fn(() => null);
|
|
108
|
+
|
|
109
|
+
const cached = createCachedLoad(cache, callback) as (
|
|
110
|
+
args: { namespace: string; path: string },
|
|
111
|
+
) => Promise<OnLoadResult | null | undefined>;
|
|
112
|
+
|
|
113
|
+
const result = await cached({ namespace: "file", path: "/skip.js" });
|
|
114
|
+
expect(result).toBeNull();
|
|
115
|
+
expect(cache.get("file:/skip.js")).toBeUndefined();
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it("file namespace일 때 watchFiles에 args.path가 자동 추가된다", async () => {
|
|
119
|
+
const cache = new MemoryLoadResultCache();
|
|
120
|
+
const callback = vi.fn(() => ({
|
|
121
|
+
contents: "result",
|
|
122
|
+
loader: "js" as const,
|
|
123
|
+
}));
|
|
124
|
+
|
|
125
|
+
const cached = createCachedLoad(cache, callback) as (
|
|
126
|
+
args: { namespace: string; path: string },
|
|
127
|
+
) => Promise<OnLoadResult | null | undefined>;
|
|
128
|
+
|
|
129
|
+
await cached({ namespace: "file", path: "/app.js" });
|
|
130
|
+
const stored = cache.get("file:/app.js");
|
|
131
|
+
expect(stored?.watchFiles).toContain("/app.js");
|
|
132
|
+
});
|
|
133
|
+
});
|
|
@@ -229,6 +229,7 @@ describe("BuildOrchestrator.initialize", () => {
|
|
|
229
229
|
const hasError = await orchestrator.start();
|
|
230
230
|
|
|
231
231
|
expect(hasError).toBe(false);
|
|
232
|
+
expect(mockLogger.info).toHaveBeenCalledWith("빌드할 패키지가 없습니다.");
|
|
232
233
|
});
|
|
233
234
|
});
|
|
234
235
|
|
|
@@ -266,7 +267,7 @@ describe("BuildOrchestrator.start", () => {
|
|
|
266
267
|
|
|
267
268
|
// BuildEngine should be created and run() called
|
|
268
269
|
expect(createBuildEngine).toHaveBeenCalledOnce();
|
|
269
|
-
expect(mockEngines[0].run).toHaveBeenCalledWith({ js: true, dts: true, lint: false });
|
|
270
|
+
expect(mockEngines[0].run).toHaveBeenCalledWith({ js: true, dts: true, lint: false, includeTests: false });
|
|
270
271
|
expect(mockEngines[0].stop).toHaveBeenCalled();
|
|
271
272
|
});
|
|
272
273
|
|
|
@@ -617,7 +618,7 @@ describe("BuildOrchestrator client build", () => {
|
|
|
617
618
|
expect.any(Object),
|
|
618
619
|
);
|
|
619
620
|
const engineMock = vi.mocked(createBuildEngine).mock.results[0].value;
|
|
620
|
-
expect(engineMock.run).toHaveBeenCalledWith({ js: true, dts: false, lint: false });
|
|
621
|
+
expect(engineMock.run).toHaveBeenCalledWith({ js: true, dts: false, lint: false, includeTests: false });
|
|
621
622
|
expect(engineMock.stop).toHaveBeenCalled();
|
|
622
623
|
});
|
|
623
624
|
|
|
@@ -844,7 +845,7 @@ describe("BuildOrchestrator native build integration (Slice 1)", () => {
|
|
|
844
845
|
// ViteEngine should have been called
|
|
845
846
|
expect(createBuildEngine).toHaveBeenCalled();
|
|
846
847
|
const engineMock = vi.mocked(createBuildEngine).mock.results[0].value;
|
|
847
|
-
expect(engineMock.run).toHaveBeenCalledWith({ js: true, dts: false, lint: false });
|
|
848
|
+
expect(engineMock.run).toHaveBeenCalledWith({ js: true, dts: false, lint: false, includeTests: false });
|
|
848
849
|
|
|
849
850
|
// Capacitor should have been created, initialized, and built
|
|
850
851
|
expect(Capacitor.create).toHaveBeenCalledWith(
|
|
@@ -18,7 +18,7 @@ vi.mock("../../src/utils/output-utils", async (importOriginal) => {
|
|
|
18
18
|
const actual = await importOriginal<typeof import("../../src/utils/output-utils")>();
|
|
19
19
|
return {
|
|
20
20
|
...actual,
|
|
21
|
-
|
|
21
|
+
printDiagnostics: vi.fn(),
|
|
22
22
|
printServers: vi.fn(),
|
|
23
23
|
};
|
|
24
24
|
});
|
|
@@ -117,7 +117,7 @@ vi.mock("../../src/electron/electron", () => ({
|
|
|
117
117
|
const { DevOrchestrator } = await import("../../src/orchestrators/DevOrchestrator");
|
|
118
118
|
const { loadSdConfig } = await import("../../src/utils/sd-config");
|
|
119
119
|
const { watchReplaceDeps } = await import("../../src/deps/replace-deps/replace-deps");
|
|
120
|
-
const {
|
|
120
|
+
const { printDiagnostics, printServers: _printServers } = await import("../../src/utils/output-utils");
|
|
121
121
|
const { createBuildEngine } = await import("../../src/engines/engine-factory");
|
|
122
122
|
const { Worker } = await import("@simplysm/core-node");
|
|
123
123
|
const { getVersion } = await import("../../src/utils/build-env");
|
|
@@ -302,7 +302,7 @@ describe("DevOrchestrator", () => {
|
|
|
302
302
|
|
|
303
303
|
expect(mockBuildEngines).toHaveLength(1);
|
|
304
304
|
expect(mockBuildEngines[0]._pkgName).toBe("service-server");
|
|
305
|
-
expect(mockBuildEngines[0].startWatch).toHaveBeenCalledWith({ js: true, dts: false, lint: false });
|
|
305
|
+
expect(mockBuildEngines[0].startWatch).toHaveBeenCalledWith({ js: true, dts: false, lint: false, includeTests: false });
|
|
306
306
|
expect(Worker.create).toHaveBeenCalled();
|
|
307
307
|
expect(mockRuntimeProxies[0].start).toHaveBeenCalled();
|
|
308
308
|
});
|
|
@@ -397,7 +397,7 @@ describe("DevOrchestrator", () => {
|
|
|
397
397
|
await orchestrator.start();
|
|
398
398
|
|
|
399
399
|
expect(Worker.create).not.toHaveBeenCalled();
|
|
400
|
-
expect(
|
|
400
|
+
expect(printDiagnostics).toHaveBeenCalled();
|
|
401
401
|
});
|
|
402
402
|
|
|
403
403
|
// --- Unit: excludes library packages ---
|
|
@@ -504,7 +504,7 @@ describe("DevOrchestrator", () => {
|
|
|
504
504
|
await orchestrator.start();
|
|
505
505
|
|
|
506
506
|
const clientEngine = mockBuildEngines.find((e) => e._pkgName === "my-client")!;
|
|
507
|
-
expect(clientEngine.startWatch).toHaveBeenCalledWith({ js: true, dts: false, lint: false });
|
|
507
|
+
expect(clientEngine.startWatch).toHaveBeenCalledWith({ js: true, dts: false, lint: false, includeTests: false });
|
|
508
508
|
});
|
|
509
509
|
|
|
510
510
|
it("passes clientPorts to server runtime for connected clients", async () => {
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Slice 1: process.stdout.write → consola 전환 — LLM 검증
|
|
2
|
+
|
|
3
|
+
## 검증 항목
|
|
4
|
+
|
|
5
|
+
- [x] BaseOrchestrator.ts:105 — `this._logger.start("종료 중...")` 사용 확인: `process.stdout.write("⏳ 종료 중...\n")` → `this._logger.start("종료 중...")` 변경 완료. 수동 아이콘 ⏳ 제거됨
|
|
6
|
+
- [x] BaseOrchestrator.ts:107 — `this._logger.success("종료 완료")` 사용 확인: `process.stdout.write("✔ 종료 완료\n")` → `this._logger.success("종료 완료")` 변경 완료. 수동 아이콘 ✔ 제거됨
|
|
7
|
+
- [x] BuildOrchestrator.ts:173 — `this._logger.info("빌드할 패키지가 없습니다.")` 사용 확인: `process.stdout.write("✔ 빌드할 패키지가 없습니다.\n")` → `this._logger.info(...)` 변경 완료. 자동 테스트에서도 검증됨
|
|
8
|
+
- [x] WatchOrchestrator.ts:69 — `this._logger.warn("워치 대상 패키지가 없습니다.")` 사용 확인: `process.stdout.write("⚠ 워치 대상 패키지가 없습니다.\n")` → `this._logger.warn(...)` 변경 완료. 수동 아이콘 ⚠ 제거됨
|
|
9
|
+
- [x] publish-command.ts:121 — `logger.info("배포할 패키지가 없습니다.")` 사용 확인: `process.stdout.write("✔ 배포할 패키지가 없습니다.\n")` → `logger.info(...)` 변경 완료. 수동 아이콘 ✔ 제거됨
|
|
10
|
+
- [x] 모든 대상 파일에서 process.stdout.write가 더 이상 사용되지 않음 확인 (output-utils.ts의 printServers 내 `"\n"` 출력은 Feature 1.2 범위 외)
|
|
@@ -123,7 +123,7 @@ describe("TypecheckOrchestrator", () => {
|
|
|
123
123
|
expect(mocks.createTypecheckEngine).toHaveBeenCalledTimes(3);
|
|
124
124
|
for (const engine of mockEngines) {
|
|
125
125
|
expect(engine.run).toHaveBeenCalledWith(
|
|
126
|
-
expect.objectContaining({ js: false, dts: false }),
|
|
126
|
+
expect.objectContaining({ js: false, dts: false, includeTests: true }),
|
|
127
127
|
);
|
|
128
128
|
}
|
|
129
129
|
});
|
|
@@ -18,7 +18,7 @@ vi.mock("../../src/utils/output-utils", async (importOriginal) => {
|
|
|
18
18
|
const actual = await importOriginal<typeof import("../../src/utils/output-utils")>();
|
|
19
19
|
return {
|
|
20
20
|
...actual,
|
|
21
|
-
|
|
21
|
+
printDiagnostics: vi.fn(),
|
|
22
22
|
printServers: vi.fn(),
|
|
23
23
|
};
|
|
24
24
|
});
|
|
@@ -104,7 +104,7 @@ vi.mock("child_process", () => ({
|
|
|
104
104
|
const { WatchOrchestrator } = await import("../../src/orchestrators/WatchOrchestrator");
|
|
105
105
|
const { loadSdConfig } = await import("../../src/utils/sd-config");
|
|
106
106
|
const { watchReplaceDeps } = await import("../../src/deps/replace-deps/replace-deps");
|
|
107
|
-
const {
|
|
107
|
+
const { printDiagnostics } = await import("../../src/utils/output-utils");
|
|
108
108
|
const { createBuildEngine } = await import("../../src/engines/engine-factory");
|
|
109
109
|
const { watchCopySrcFiles } = await import("../../src/utils/copy-src");
|
|
110
110
|
const { FsWatcher } = await import("@simplysm/core-node");
|
|
@@ -189,7 +189,7 @@ describe("WatchOrchestrator", () => {
|
|
|
189
189
|
|
|
190
190
|
// Library engine started with js+dts
|
|
191
191
|
expect(mockBuildEngines).toHaveLength(1);
|
|
192
|
-
expect(mockBuildEngines[0].startWatch).toHaveBeenCalledWith({ js: true, dts: true, lint: false });
|
|
192
|
+
expect(mockBuildEngines[0].startWatch).toHaveBeenCalledWith({ js: true, dts: true, lint: false, includeTests: false });
|
|
193
193
|
|
|
194
194
|
// copySrc watcher started
|
|
195
195
|
expect(watchCopySrcFiles).toHaveBeenCalledWith(
|
|
@@ -316,7 +316,7 @@ describe("WatchOrchestrator", () => {
|
|
|
316
316
|
expect(spawn).toHaveBeenCalled();
|
|
317
317
|
});
|
|
318
318
|
|
|
319
|
-
it("triggers
|
|
319
|
+
it("triggers printDiagnostics on batchComplete", async () => {
|
|
320
320
|
setupDefaults(createConfig({
|
|
321
321
|
packages: { "core-common": { target: "node" } },
|
|
322
322
|
}));
|
|
@@ -326,7 +326,7 @@ describe("WatchOrchestrator", () => {
|
|
|
326
326
|
await orchestrator.start();
|
|
327
327
|
|
|
328
328
|
await new Promise((r) => setTimeout(r, 50));
|
|
329
|
-
expect(
|
|
329
|
+
expect(printDiagnostics).toHaveBeenCalled();
|
|
330
330
|
});
|
|
331
331
|
|
|
332
332
|
it("delegates awaitTermination to SignalHandler", async () => {
|
|
@@ -425,7 +425,7 @@ describe("WatchOrchestrator", () => {
|
|
|
425
425
|
await orchestrator.start();
|
|
426
426
|
|
|
427
427
|
expect(mockBuildEngines).toHaveLength(1);
|
|
428
|
-
expect(mockBuildEngines[0].startWatch).toHaveBeenCalledWith({ js: true, dts: true, lint: false });
|
|
428
|
+
expect(mockBuildEngines[0].startWatch).toHaveBeenCalledWith({ js: true, dts: true, lint: false, includeTests: false });
|
|
429
429
|
expect(spawn).toHaveBeenCalledWith("node", ["sync.mjs"], expect.objectContaining({ shell: true }));
|
|
430
430
|
});
|
|
431
431
|
|
|
@@ -488,7 +488,7 @@ describe("WatchOrchestrator", () => {
|
|
|
488
488
|
await orchestrator.start();
|
|
489
489
|
|
|
490
490
|
for (const engine of mockBuildEngines) {
|
|
491
|
-
expect(engine.startWatch).toHaveBeenCalledWith({ js: true, dts: true, lint: false });
|
|
491
|
+
expect(engine.startWatch).toHaveBeenCalledWith({ js: true, dts: true, lint: false, includeTests: false });
|
|
492
492
|
}
|
|
493
493
|
});
|
|
494
494
|
|
|
@@ -52,4 +52,68 @@ describe("ResultCollector", () => {
|
|
|
52
52
|
expect(map.size).toBe(1);
|
|
53
53
|
expect(map.get("core:build")!.status).toBe("success");
|
|
54
54
|
});
|
|
55
|
+
|
|
56
|
+
//#region Feature 1.1 Slice 1: BuildResult warnings 필드
|
|
57
|
+
|
|
58
|
+
it("stores warnings alongside error message", () => {
|
|
59
|
+
const collector = new ResultCollector();
|
|
60
|
+
collector.add({
|
|
61
|
+
name: "client-pda",
|
|
62
|
+
target: "client",
|
|
63
|
+
type: "build",
|
|
64
|
+
status: "error",
|
|
65
|
+
message: "타입 에러",
|
|
66
|
+
warnings: "사용되지 않는 변수",
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
const result = collector.get("client-pda:build");
|
|
70
|
+
expect(result!.status).toBe("error");
|
|
71
|
+
expect(result!.message).toBe("타입 에러");
|
|
72
|
+
expect(result!.warnings).toBe("사용되지 않는 변수");
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it("stores warnings on success result", () => {
|
|
76
|
+
const collector = new ResultCollector();
|
|
77
|
+
collector.add({
|
|
78
|
+
name: "core",
|
|
79
|
+
target: "node",
|
|
80
|
+
type: "build",
|
|
81
|
+
status: "success",
|
|
82
|
+
warnings: "경고1\n경고2",
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
const result = collector.get("core:build");
|
|
86
|
+
expect(result!.status).toBe("success");
|
|
87
|
+
expect(result!.warnings).toBe("경고1\n경고2");
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it("warnings is undefined when not provided", () => {
|
|
91
|
+
const collector = new ResultCollector();
|
|
92
|
+
collector.add({ name: "core", target: "node", type: "build", status: "success" });
|
|
93
|
+
|
|
94
|
+
const result = collector.get("core:build");
|
|
95
|
+
expect(result!.warnings).toBeUndefined();
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it("overwrites warnings on re-add", () => {
|
|
99
|
+
const collector = new ResultCollector();
|
|
100
|
+
collector.add({
|
|
101
|
+
name: "core",
|
|
102
|
+
target: "node",
|
|
103
|
+
type: "build",
|
|
104
|
+
status: "success",
|
|
105
|
+
warnings: "old warning",
|
|
106
|
+
});
|
|
107
|
+
collector.add({
|
|
108
|
+
name: "core",
|
|
109
|
+
target: "node",
|
|
110
|
+
type: "build",
|
|
111
|
+
status: "success",
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
// 새 결과에 warnings가 없으면 이전 값은 덮어씌워짐
|
|
115
|
+
expect(collector.get("core:build")!.warnings).toBeUndefined();
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
//#endregion
|
|
55
119
|
});
|
|
@@ -64,12 +64,11 @@ describe("sd-cli-entry COMMAND_NAMES", () => {
|
|
|
64
64
|
).resolves.toBeDefined();
|
|
65
65
|
});
|
|
66
66
|
|
|
67
|
-
it("
|
|
67
|
+
it("throws on --type test (removed type)", async () => {
|
|
68
68
|
const { createCliParser } = await import("../src/sd-cli-entry");
|
|
69
69
|
|
|
70
|
-
// --type test 뒤의 --target angular가 type으로 먹히지 않아야 한다
|
|
71
70
|
await expect(
|
|
72
|
-
createCliParser(["check", "--type", "test"
|
|
73
|
-
).
|
|
71
|
+
createCliParser(["check", "--type", "test"]).exitProcess(false).parse(),
|
|
72
|
+
).rejects.toThrow("Invalid check type(s): test");
|
|
74
73
|
});
|
|
75
74
|
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# CLI 진입점 태그 로거 — LLM 검증
|
|
2
|
+
|
|
3
|
+
## 검증 항목
|
|
4
|
+
|
|
5
|
+
- [x] sd-cli.ts에 `consola.withTag("sd:cli")` 모듈-레벨 로거가 생성됨: `src/sd-cli.ts:18` — `const logger = consola.withTag("sd:cli");`
|
|
6
|
+
- [x] sd-cli.ts replaceDeps 경고에서 수동 `[sd-cli]` prefix가 제거됨: `src/sd-cli.ts:43` — `logger.warn("replaceDeps 사전 설정 실패:", ...)` (이전: `consola.warn("[sd-cli] replaceDeps ..."`)
|
|
7
|
+
- [x] sd-cli.ts CPU affinity 경고가 consola로 전환됨: `src/sd-cli.ts:104-108` — `logger.warn("CPU affinity/priority 설정 실패:", ...)` (이전: `console.warn("Failed to configure ..."`)
|
|
8
|
+
- [x] sd-cli.ts에서 `eslint-disable-next-line no-console` 주석이 제거됨: `src/sd-cli.ts:104` 부근에 해당 주석 없음
|
|
9
|
+
- [x] sd-cli-entry.ts에 `consola.withTag("sd:cli:entry")` 모듈-레벨 로거가 생성됨: `src/sd-cli-entry.ts:20` — `const logger = consola.withTag("sd:cli:entry");`
|
|
10
|
+
- [x] sd-cli-entry.ts .fail() 핸들러가 태그 로거를 사용함: `src/sd-cli-entry.ts:329` — `logger.error(msg);` (이전: `consola.error(msg)`)
|
|
11
|
+
- [x] sd-cli-entry.ts의 `/* eslint-disable no-console */`이 유지됨: `src/sd-cli-entry.ts:1` — `collectYargsHelp`의 `console.log` 사용 때문에 필요
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# affected files 추적 — LLM 검증
|
|
2
|
+
|
|
3
|
+
## 검증 항목
|
|
4
|
+
|
|
5
|
+
- [x] Non-Angular 전역 변경 시 affectedFiles=undefined: `_findAffectedFilesForTsc`에서 `result.affected`가 `ts.SourceFile`이 아닌 경우(`"fileName" in result.affected` 실패) `return undefined`를 반환. (`SdTsCompiler.ts:272-275`)
|
|
6
|
+
- [x] Angular TypeScript 5.9 크래시 방어: `_findAffectedFilesForAngular`에서 `getSemanticDiagnosticsOfNextAffectedFile`를 try-catch로 감싸고, catch 시 전체 소스를 affected로 처리 (`SdTsCompiler.ts:290-298`)
|
|
7
|
+
- [x] Angular 리소스 의존성 기반 추가 affected: `_findAffectedFilesForAngular`에서 `sourceFileCache.modifiedFiles`와 `angularCompiler.getResourceDependencies(sourceFile)`를 비교하여 매칭 시 `_diagnosticCache.delete(sourceFile)` + `affectedSourceFiles.add(sourceFile)` (`SdTsCompiler.ts:317-334`)
|
|
8
|
+
- [x] Angular .ngtypecheck.ts → 원본 .ts 매핑: `getSemanticDiagnosticsOfNextAffectedFile`의 두 번째 인자 콜백에서 `.ngtypecheck.ts` 파일을 원본 `.ts`로 매핑하여 affected에 추가 (`SdTsCompiler.ts:284-295`)
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# 진단 수집 — LLM 검증
|
|
2
|
+
|
|
3
|
+
## 검증 항목
|
|
4
|
+
|
|
5
|
+
- [x] Angular TS 5.9 getSemanticDiagnostics 크래시 방어: `_collectDiagnosticsForAngular`에서 `builderProgram.getSemanticDiagnostics(sourceFile)`를 try-catch로 감싸고, catch 시 빈 배열로 처리 (`SdTsCompiler.ts` `_collectDiagnosticsForAngular` 메서드 내 per-file 루프)
|
|
6
|
+
- [x] Angular diagnosticCache 갱신: affected 파일이면 `getDiagnosticsForFile` 호출 후 `this._diagnosticCache.set(sourceFile, angularDiagnostics)` 수행 (`SdTsCompiler.ts` `_collectDiagnosticsForAngular` 메서드)
|
|
7
|
+
- [x] Angular diagnosticCache 반환: 비-affected 파일이면 `this._diagnosticCache.get(sourceFile)` 캐시 결과 반환 (`SdTsCompiler.ts` `_collectDiagnosticsForAngular` 메서드)
|
|
8
|
+
- [x] Angular ignoreForDiagnostics 건너뜀: per-file 루프에서 `angularCompiler.ignoreForDiagnostics.has(sourceFile)` 체크 후 continue
|
|
9
|
+
- [x] Non-Angular 7종 진단 수집: `_collectDiagnosticsForTsc`에서 config + syntactic + options + global + semantic + declaration 진단 수집 (declaration은 `!output.dts` 조건)
|
|
10
|
+
- [x] isWorkspaceDiagnostic 필터링: `_finalizeDiagnostics`에서 `rawDiagnostics.filter(d => isWorkspaceDiagnostic(d, this._options.cwd))` 적용
|
|
11
|
+
- [x] serializeDiagnostic 직렬화: `_finalizeDiagnostics`에서 `filtered.map(serializeDiagnostic)` 적용
|
|
12
|
+
- [x] formatDiagnosticError 포맷: `_finalizeDiagnostics`에서 Error 카테고리 진단을 `formatDiagnosticError`로 포맷하여 `errors` 배열 생성
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# emit 처리 — LLM 검증
|
|
2
|
+
|
|
3
|
+
## 검증 항목
|
|
4
|
+
|
|
5
|
+
- [x] Angular emit — additionalTransformers 병합: `_emitAngular`에서 `emitOptions?.additionalTransformers`의 before/after를 `angularCompiler.prepareEmit().transformers`에 push 병합 (`SdTsCompiler.ts` `_emitAngular` 메서드)
|
|
6
|
+
- [x] Angular emit — tsbuildinfo 영속화 크래시 방어: `builderProgram.emit(undefined, () => {})` 호출이 try-catch로 감싸져 있음 (`SdTsCompiler.ts` `_emitAngular` 메서드 하단)
|
|
7
|
+
- [x] Angular emit — sourceFilter 적용: emitResults를 `emitOptions.sourceFilter`로 필터링하여 반환 (`SdTsCompiler.ts` `_emitAngular` 메서드 마지막)
|
|
8
|
+
- [x] Angular emit — incrementalCompilation.recordSuccessfulEmit 호출: writeFileCallback에서 각 sourceFile에 대해 호출됨
|
|
9
|
+
- [x] Angular emit — ignoreForEmit/isDeclarationFile/safeToSkipEmit 건너뜀: per-file emit 루프에서 세 조건 모두 continue 처리
|