@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,603 @@
|
|
|
1
|
+
import { describe, it, expect, afterEach } from "vitest";
|
|
2
|
+
import fs from "fs";
|
|
3
|
+
import path from "path";
|
|
4
|
+
import { SdTsCompiler } from "../../src/ts-compiler/SdTsCompiler";
|
|
5
|
+
|
|
6
|
+
const NON_ANGULAR_FIXTURE = path.resolve(import.meta.dirname, "fixtures/non-angular-pkg");
|
|
7
|
+
const ANGULAR_FIXTURE = path.resolve(import.meta.dirname, "../angular/fixtures/packages/basic-app");
|
|
8
|
+
const CWD = path.resolve(import.meta.dirname, "../..");
|
|
9
|
+
|
|
10
|
+
describe("SdTsCompiler — Acceptance", () => {
|
|
11
|
+
// ── Rule: tsconfig 파싱은 단일 내부 메서드로 통합 ──
|
|
12
|
+
|
|
13
|
+
describe("tsconfig 파싱", () => {
|
|
14
|
+
it("Non-Angular 패키지의 tsconfig를 파싱하고 프로그램을 생성한다", async () => {
|
|
15
|
+
const compiler = new SdTsCompiler({
|
|
16
|
+
pkgDir: NON_ANGULAR_FIXTURE,
|
|
17
|
+
cwd: CWD,
|
|
18
|
+
output: { js: false, dts: false },
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
const result = await compiler.compileAsync();
|
|
22
|
+
|
|
23
|
+
expect(result.program).toBeDefined();
|
|
24
|
+
expect(result.builderProgram).toBeDefined();
|
|
25
|
+
expect(result.isForAngular).toBe(false);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it("존재하지 않는 디렉토리의 tsconfig 파싱 시 에러를 throw한다", async () => {
|
|
29
|
+
const compiler = new SdTsCompiler({
|
|
30
|
+
pkgDir: path.join(NON_ANGULAR_FIXTURE, "nonexistent"),
|
|
31
|
+
cwd: CWD,
|
|
32
|
+
output: { js: false, dts: false },
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
await expect(compiler.compileAsync()).rejects.toThrow();
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
// ── Rule: rootNames 필터링은 includeTests 옵션에 따라 분기 ──
|
|
40
|
+
|
|
41
|
+
describe("rootNames 필터링", () => {
|
|
42
|
+
it("includeTests 미지정 시 src/ 파일만 포함한다", async () => {
|
|
43
|
+
const compiler = new SdTsCompiler({
|
|
44
|
+
pkgDir: NON_ANGULAR_FIXTURE,
|
|
45
|
+
cwd: CWD,
|
|
46
|
+
output: { js: false, dts: false },
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
const result = await compiler.compileAsync();
|
|
50
|
+
const rootFileNames = result.program.getRootFileNames();
|
|
51
|
+
const srcDir = path.join(NON_ANGULAR_FIXTURE, "src");
|
|
52
|
+
|
|
53
|
+
// src/ 파일은 포함
|
|
54
|
+
expect(rootFileNames.some((f) => f.includes("index.ts"))).toBe(true);
|
|
55
|
+
// tests/ 파일은 제외
|
|
56
|
+
expect(rootFileNames.some((f) => f.includes("sample.test-file.ts"))).toBe(false);
|
|
57
|
+
// 모든 root 파일이 src/ 하위
|
|
58
|
+
for (const f of rootFileNames) {
|
|
59
|
+
expect(path.resolve(f).startsWith(srcDir)).toBe(true);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it("includeTests=true 시 tests/ 파일도 포함한다", async () => {
|
|
64
|
+
const compiler = new SdTsCompiler({
|
|
65
|
+
pkgDir: NON_ANGULAR_FIXTURE,
|
|
66
|
+
cwd: CWD,
|
|
67
|
+
output: { js: false, dts: false },
|
|
68
|
+
includeTests: true,
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
const result = await compiler.compileAsync();
|
|
72
|
+
const rootFileNames = result.program.getRootFileNames();
|
|
73
|
+
|
|
74
|
+
expect(rootFileNames.some((f) => f.includes("index.ts"))).toBe(true);
|
|
75
|
+
expect(rootFileNames.some((f) => f.includes("sample.test-file.ts"))).toBe(true);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
// ── Rule: Angular 자동 감지는 tsconfig.angularCompilerOptions 존재 여부 ──
|
|
80
|
+
|
|
81
|
+
describe("Angular 감지", () => {
|
|
82
|
+
it("angularCompilerOptions가 있으면 isForAngular=true", async () => {
|
|
83
|
+
const compiler = new SdTsCompiler({
|
|
84
|
+
pkgDir: ANGULAR_FIXTURE,
|
|
85
|
+
cwd: CWD,
|
|
86
|
+
output: { js: false, dts: false },
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
const result = await compiler.compileAsync();
|
|
90
|
+
|
|
91
|
+
expect(result.isForAngular).toBe(true);
|
|
92
|
+
expect(result.program).toBeDefined();
|
|
93
|
+
expect(result.builderProgram).toBeDefined();
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
// ── Rule: compilerOptions는 출력 모드에 따라 자동 설정 ──
|
|
99
|
+
|
|
100
|
+
describe("compilerOptions 출력 모드", () => {
|
|
101
|
+
it("js+dts 모드에서 declaration=true, noEmit=false", async () => {
|
|
102
|
+
const compiler = new SdTsCompiler({
|
|
103
|
+
pkgDir: NON_ANGULAR_FIXTURE,
|
|
104
|
+
cwd: CWD,
|
|
105
|
+
output: { js: true, dts: true },
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
const result = await compiler.compileAsync();
|
|
109
|
+
const opts = result.program.getCompilerOptions();
|
|
110
|
+
|
|
111
|
+
expect(opts.noEmit).toBe(false);
|
|
112
|
+
expect(opts.declaration).toBe(true);
|
|
113
|
+
expect(opts.declarationMap).toBe(true);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it("타입체크 전용 모드에서 noEmit=true", async () => {
|
|
117
|
+
const compiler = new SdTsCompiler({
|
|
118
|
+
pkgDir: NON_ANGULAR_FIXTURE,
|
|
119
|
+
cwd: CWD,
|
|
120
|
+
output: { js: false, dts: false },
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
const result = await compiler.compileAsync();
|
|
124
|
+
const opts = result.program.getCompilerOptions();
|
|
125
|
+
|
|
126
|
+
expect(opts.noEmit).toBe(true);
|
|
127
|
+
expect(opts.declaration).toBe(false);
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it("env=node에서 DOM lib가 제거된다", async () => {
|
|
131
|
+
const compiler = new SdTsCompiler({
|
|
132
|
+
pkgDir: NON_ANGULAR_FIXTURE,
|
|
133
|
+
cwd: CWD,
|
|
134
|
+
output: { js: false, dts: false },
|
|
135
|
+
env: "node",
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
const result = await compiler.compileAsync();
|
|
139
|
+
const opts = result.program.getCompilerOptions();
|
|
140
|
+
|
|
141
|
+
// lib 배열에 "dom" 패턴이 포함되지 않아야 한다
|
|
142
|
+
if (opts.lib != null) {
|
|
143
|
+
for (const lib of opts.lib) {
|
|
144
|
+
expect(lib.toLowerCase()).not.toContain("dom");
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
it("compilerOptionsTransformer가 적용된다", async () => {
|
|
150
|
+
const compiler = new SdTsCompiler({
|
|
151
|
+
pkgDir: NON_ANGULAR_FIXTURE,
|
|
152
|
+
cwd: CWD,
|
|
153
|
+
output: { js: false, dts: false },
|
|
154
|
+
compilerOptionsTransformer: (opts) => ({
|
|
155
|
+
...opts,
|
|
156
|
+
removeComments: true,
|
|
157
|
+
}),
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
const result = await compiler.compileAsync();
|
|
161
|
+
const opts = result.program.getCompilerOptions();
|
|
162
|
+
|
|
163
|
+
expect(opts.removeComments).toBe(true);
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
// ── Rule: affected files 추적은 Non-Angular/Angular 통합 분기 ──
|
|
168
|
+
|
|
169
|
+
describe("affected files 추적", () => {
|
|
170
|
+
it("Non-Angular 첫 빌드에서 affectedFiles가 Set<string>으로 반환된다", async () => {
|
|
171
|
+
const compiler = new SdTsCompiler({
|
|
172
|
+
pkgDir: NON_ANGULAR_FIXTURE,
|
|
173
|
+
cwd: CWD,
|
|
174
|
+
output: { js: false, dts: false },
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
const result = await compiler.compileAsync();
|
|
178
|
+
|
|
179
|
+
expect(result.affectedFiles).toBeInstanceOf(Set);
|
|
180
|
+
// 첫 빌드이므로 모든 소스 파일이 affected
|
|
181
|
+
expect(result.affectedFiles!.size).toBeGreaterThan(0);
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
it("Non-Angular 증분 빌드에서 변경 없으면 affectedFiles가 비어있다", async () => {
|
|
185
|
+
const compiler = new SdTsCompiler({
|
|
186
|
+
pkgDir: NON_ANGULAR_FIXTURE,
|
|
187
|
+
cwd: CWD,
|
|
188
|
+
output: { js: false, dts: false },
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
await compiler.compileAsync();
|
|
192
|
+
const result2 = await compiler.compileAsync(new Set());
|
|
193
|
+
|
|
194
|
+
expect(result2.affectedFiles).toBeInstanceOf(Set);
|
|
195
|
+
expect(result2.affectedFiles!.size).toBe(0);
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
it("Angular 첫 빌드에서 affectedFiles가 Set<string>으로 반환된다", async () => {
|
|
199
|
+
const compiler = new SdTsCompiler({
|
|
200
|
+
pkgDir: ANGULAR_FIXTURE,
|
|
201
|
+
cwd: CWD,
|
|
202
|
+
output: { js: false, dts: false },
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
const result = await compiler.compileAsync();
|
|
206
|
+
|
|
207
|
+
expect(result.affectedFiles).toBeInstanceOf(Set);
|
|
208
|
+
expect(result.affectedFiles!.size).toBeGreaterThan(0);
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
// ── Rule: emit은 compileAsync 내부에서 수행, Non-Angular/Angular 분기 ──
|
|
213
|
+
|
|
214
|
+
describe("emit 처리", () => {
|
|
215
|
+
const NON_ANGULAR_DIST = path.join(NON_ANGULAR_FIXTURE, "dist");
|
|
216
|
+
|
|
217
|
+
afterEach(() => {
|
|
218
|
+
// dist/ 정리
|
|
219
|
+
if (fs.existsSync(NON_ANGULAR_DIST)) {
|
|
220
|
+
fs.rmSync(NON_ANGULAR_DIST, { recursive: true, force: true });
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
it("Non-Angular emit 모드에서 dist/ 파일이 생성된다", async () => {
|
|
225
|
+
const compiler = new SdTsCompiler({
|
|
226
|
+
pkgDir: NON_ANGULAR_FIXTURE,
|
|
227
|
+
cwd: CWD,
|
|
228
|
+
output: { js: true, dts: true },
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
const result = await compiler.compileAsync();
|
|
232
|
+
|
|
233
|
+
// Non-Angular emit은 writeFile 훅으로 디스크 직접 쓰기, emitResults는 undefined
|
|
234
|
+
expect(result.emitResults).toBeUndefined();
|
|
235
|
+
// dist 파일이 생성되어야 한다
|
|
236
|
+
expect(fs.existsSync(NON_ANGULAR_DIST)).toBe(true);
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
it("Non-Angular noEmit 모드에서 dist/ 파일이 생성되지 않는다", async () => {
|
|
240
|
+
const compiler = new SdTsCompiler({
|
|
241
|
+
pkgDir: NON_ANGULAR_FIXTURE,
|
|
242
|
+
cwd: CWD,
|
|
243
|
+
output: { js: false, dts: false },
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
const result = await compiler.compileAsync();
|
|
247
|
+
|
|
248
|
+
expect(result.emitResults).toBeUndefined();
|
|
249
|
+
expect(fs.existsSync(NON_ANGULAR_DIST)).toBe(false);
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
it("Angular emit 모드에서 emitResults가 EmitResult[]로 반환된다", async () => {
|
|
253
|
+
const compiler = new SdTsCompiler({
|
|
254
|
+
pkgDir: ANGULAR_FIXTURE,
|
|
255
|
+
cwd: CWD,
|
|
256
|
+
output: { js: true, dts: false },
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
const result = await compiler.compileAsync();
|
|
260
|
+
|
|
261
|
+
expect(result.emitResults).toBeInstanceOf(Array);
|
|
262
|
+
expect(result.emitResults!.length).toBeGreaterThan(0);
|
|
263
|
+
// 각 EmitResult에 filename, contents, sourceFileName이 있어야 한다
|
|
264
|
+
for (const emit of result.emitResults!) {
|
|
265
|
+
expect(typeof emit.filename).toBe("string");
|
|
266
|
+
expect(typeof emit.contents).toBe("string");
|
|
267
|
+
expect(typeof emit.sourceFileName).toBe("string");
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
it("Angular noEmit 모드에서 emitResults가 undefined이다", async () => {
|
|
272
|
+
const compiler = new SdTsCompiler({
|
|
273
|
+
pkgDir: ANGULAR_FIXTURE,
|
|
274
|
+
cwd: CWD,
|
|
275
|
+
output: { js: false, dts: false },
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
const result = await compiler.compileAsync();
|
|
279
|
+
|
|
280
|
+
expect(result.emitResults).toBeUndefined();
|
|
281
|
+
});
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
// ── Rule: 진단 수집은 emit 후 수행, SerializedDiagnostic[]으로 통일 ──
|
|
285
|
+
|
|
286
|
+
describe("진단 수집", () => {
|
|
287
|
+
it("Non-Angular 정상 패키지에서 에러 없이 diagnostics를 반환한다", async () => {
|
|
288
|
+
const compiler = new SdTsCompiler({
|
|
289
|
+
pkgDir: NON_ANGULAR_FIXTURE,
|
|
290
|
+
cwd: CWD,
|
|
291
|
+
output: { js: false, dts: false },
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
const result = await compiler.compileAsync();
|
|
295
|
+
|
|
296
|
+
expect(result.diagnostics).toBeInstanceOf(Array);
|
|
297
|
+
expect(result.errorCount).toBe(0);
|
|
298
|
+
expect(result.warningCount).toBe(0);
|
|
299
|
+
expect(result.errors).toBeUndefined();
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
it("Angular 정상 패키지에서 에러 없이 diagnostics를 반환한다", async () => {
|
|
303
|
+
const compiler = new SdTsCompiler({
|
|
304
|
+
pkgDir: ANGULAR_FIXTURE,
|
|
305
|
+
cwd: CWD,
|
|
306
|
+
output: { js: false, dts: false },
|
|
307
|
+
});
|
|
308
|
+
|
|
309
|
+
const result = await compiler.compileAsync();
|
|
310
|
+
|
|
311
|
+
expect(result.diagnostics).toBeInstanceOf(Array);
|
|
312
|
+
expect(result.errorCount).toBe(0);
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
it("diagnostics에 포함된 항목은 SerializedDiagnostic 형태이다", async () => {
|
|
316
|
+
const compiler = new SdTsCompiler({
|
|
317
|
+
pkgDir: NON_ANGULAR_FIXTURE,
|
|
318
|
+
cwd: CWD,
|
|
319
|
+
output: { js: false, dts: false },
|
|
320
|
+
});
|
|
321
|
+
|
|
322
|
+
const result = await compiler.compileAsync();
|
|
323
|
+
|
|
324
|
+
for (const diag of result.diagnostics) {
|
|
325
|
+
expect(typeof diag.category).toBe("number");
|
|
326
|
+
expect(typeof diag.code).toBe("number");
|
|
327
|
+
expect(typeof diag.messageText).toBe("string");
|
|
328
|
+
}
|
|
329
|
+
});
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
// ── Rule: Angular 라이브러리에서 transformStylesheet 미제공 시 내부 생성 ──
|
|
333
|
+
|
|
334
|
+
describe("SCSS 번들링 통합", () => {
|
|
335
|
+
it("Angular 패키지에서 transformStylesheet 미제공 시 라이브러리 모드 콜백이 자동 생성된다", async () => {
|
|
336
|
+
const compiler = new SdTsCompiler({
|
|
337
|
+
pkgDir: ANGULAR_FIXTURE,
|
|
338
|
+
cwd: CWD,
|
|
339
|
+
output: { js: false, dts: false },
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
const result = await compiler.compileAsync();
|
|
343
|
+
|
|
344
|
+
// SCSS 컴파일이 성공적으로 이루어져야 한다 (에러 없음)
|
|
345
|
+
expect(result.scssErrors).toEqual([]);
|
|
346
|
+
// styled.component.ts가 @use 'variables'를 사용하므로 SCSS 의존성이 수집된다
|
|
347
|
+
expect(result.scssDependencies.size).toBeGreaterThan(0);
|
|
348
|
+
expect(result.isForAngular).toBe(true);
|
|
349
|
+
});
|
|
350
|
+
|
|
351
|
+
it("Angular 패키지에서 transformStylesheet 제공 시 제공된 콜백이 사용된다", async () => {
|
|
352
|
+
let callCount = 0;
|
|
353
|
+
const customCallback = (
|
|
354
|
+
data: string,
|
|
355
|
+
_containingFile: string,
|
|
356
|
+
_stylesheetFile?: string,
|
|
357
|
+
): Promise<string | null> => {
|
|
358
|
+
callCount++;
|
|
359
|
+
return Promise.resolve(data);
|
|
360
|
+
};
|
|
361
|
+
|
|
362
|
+
const compiler = new SdTsCompiler({
|
|
363
|
+
pkgDir: ANGULAR_FIXTURE,
|
|
364
|
+
cwd: CWD,
|
|
365
|
+
output: { js: false, dts: false },
|
|
366
|
+
transformStylesheet: customCallback,
|
|
367
|
+
});
|
|
368
|
+
|
|
369
|
+
await compiler.compileAsync();
|
|
370
|
+
|
|
371
|
+
// Angular fixture에 인라인 스타일이 있으므로 콜백이 호출되어야 한다
|
|
372
|
+
expect(callCount).toBeGreaterThan(0);
|
|
373
|
+
});
|
|
374
|
+
|
|
375
|
+
it("Non-Angular 패키지에서는 scssErrors와 scssDependencies가 비어있다", async () => {
|
|
376
|
+
const compiler = new SdTsCompiler({
|
|
377
|
+
pkgDir: NON_ANGULAR_FIXTURE,
|
|
378
|
+
cwd: CWD,
|
|
379
|
+
output: { js: false, dts: false },
|
|
380
|
+
});
|
|
381
|
+
|
|
382
|
+
const result = await compiler.compileAsync();
|
|
383
|
+
|
|
384
|
+
expect(result.scssErrors).toEqual([]);
|
|
385
|
+
expect(result.scssDependencies.size).toBe(0);
|
|
386
|
+
});
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
// ── Rule: SCSS 상태는 매 compileAsync마다 리셋된다 ──
|
|
390
|
+
|
|
391
|
+
describe("SCSS 상태 리셋", () => {
|
|
392
|
+
it("증분 빌드 시 scssDependencies가 리셋 후 재수집된다", async () => {
|
|
393
|
+
const compiler = new SdTsCompiler({
|
|
394
|
+
pkgDir: ANGULAR_FIXTURE,
|
|
395
|
+
cwd: CWD,
|
|
396
|
+
output: { js: false, dts: false },
|
|
397
|
+
});
|
|
398
|
+
|
|
399
|
+
const result1 = await compiler.compileAsync();
|
|
400
|
+
const depsSize1 = result1.scssDependencies.size;
|
|
401
|
+
expect(depsSize1).toBeGreaterThan(0);
|
|
402
|
+
|
|
403
|
+
// 두 번째 호출 — 의존성이 리셋 후 다시 수집되어야 한다
|
|
404
|
+
const result2 = await compiler.compileAsync(new Set());
|
|
405
|
+
// 리셋되었으므로 이전 결과와 독립적 (축적되지 않음)
|
|
406
|
+
expect(result2.scssDependencies.size).toBeLessThanOrEqual(depsSize1);
|
|
407
|
+
});
|
|
408
|
+
});
|
|
409
|
+
|
|
410
|
+
// ── Rule: SCSS 의존성으로 역방향 탐색 가능 ──
|
|
411
|
+
|
|
412
|
+
describe("findAffectedByScss", () => {
|
|
413
|
+
it("SCSS 파일에 의존하는 컴포넌트 파일을 반환한다", async () => {
|
|
414
|
+
const compiler = new SdTsCompiler({
|
|
415
|
+
pkgDir: ANGULAR_FIXTURE,
|
|
416
|
+
cwd: CWD,
|
|
417
|
+
output: { js: false, dts: false },
|
|
418
|
+
});
|
|
419
|
+
|
|
420
|
+
await compiler.compileAsync();
|
|
421
|
+
|
|
422
|
+
// _variables.scss에 의존하는 파일을 찾는다
|
|
423
|
+
const variablesPath = path.join(ANGULAR_FIXTURE, "scss", "_variables.scss");
|
|
424
|
+
const affected = compiler.findAffectedByScss(variablesPath);
|
|
425
|
+
|
|
426
|
+
// styled.component.ts가 @use 'variables'를 사용하므로 영향받아야 한다
|
|
427
|
+
expect(affected.length).toBeGreaterThan(0);
|
|
428
|
+
expect(affected.some((f) => f.includes("styled.component"))).toBe(true);
|
|
429
|
+
});
|
|
430
|
+
});
|
|
431
|
+
|
|
432
|
+
// ── Rule: globalScss 옵션이 글로벌 SCSS 컴파일을 제어한다 ──
|
|
433
|
+
|
|
434
|
+
describe("글로벌 SCSS 컴파일", () => {
|
|
435
|
+
const DIST_STYLES = path.join(ANGULAR_FIXTURE, "dist", "styles.css");
|
|
436
|
+
|
|
437
|
+
afterEach(() => {
|
|
438
|
+
if (fs.existsSync(DIST_STYLES)) {
|
|
439
|
+
fs.unlinkSync(DIST_STYLES);
|
|
440
|
+
}
|
|
441
|
+
});
|
|
442
|
+
|
|
443
|
+
it("globalScss=true이고 styles.scss 존재 시 dist/styles.css가 생성된다", async () => {
|
|
444
|
+
const compiler = new SdTsCompiler({
|
|
445
|
+
pkgDir: ANGULAR_FIXTURE,
|
|
446
|
+
cwd: CWD,
|
|
447
|
+
output: { js: false, dts: false },
|
|
448
|
+
globalScss: true,
|
|
449
|
+
});
|
|
450
|
+
|
|
451
|
+
const result = await compiler.compileAsync();
|
|
452
|
+
|
|
453
|
+
expect(fs.existsSync(DIST_STYLES)).toBe(true);
|
|
454
|
+
const css = fs.readFileSync(DIST_STYLES, "utf-8");
|
|
455
|
+
expect(css).toContain("color:");
|
|
456
|
+
expect(result.scssErrors).toEqual([]);
|
|
457
|
+
});
|
|
458
|
+
|
|
459
|
+
it("globalScss=true이고 styles.scss 미존재 시 에러 없이 무시된다", async () => {
|
|
460
|
+
const compiler = new SdTsCompiler({
|
|
461
|
+
pkgDir: NON_ANGULAR_FIXTURE,
|
|
462
|
+
cwd: CWD,
|
|
463
|
+
output: { js: false, dts: false },
|
|
464
|
+
globalScss: true,
|
|
465
|
+
});
|
|
466
|
+
|
|
467
|
+
const result = await compiler.compileAsync();
|
|
468
|
+
|
|
469
|
+
expect(result.scssErrors).toEqual([]);
|
|
470
|
+
});
|
|
471
|
+
|
|
472
|
+
it("globalScss 미설정 시 글로벌 SCSS를 컴파일하지 않는다", async () => {
|
|
473
|
+
const compiler = new SdTsCompiler({
|
|
474
|
+
pkgDir: ANGULAR_FIXTURE,
|
|
475
|
+
cwd: CWD,
|
|
476
|
+
output: { js: false, dts: false },
|
|
477
|
+
});
|
|
478
|
+
|
|
479
|
+
await compiler.compileAsync();
|
|
480
|
+
|
|
481
|
+
expect(fs.existsSync(DIST_STYLES)).toBe(false);
|
|
482
|
+
});
|
|
483
|
+
});
|
|
484
|
+
|
|
485
|
+
// ── Rule: Side-effect SCSS 레지스트리는 compileAsync 간 유지된다 ──
|
|
486
|
+
|
|
487
|
+
describe("Side-effect SCSS 인프라", () => {
|
|
488
|
+
it("sideEffectScssRegistry에 항목 등록 후 compileSideEffectScss로 CSS 컴파일 가능", async () => {
|
|
489
|
+
const compiler = new SdTsCompiler({
|
|
490
|
+
pkgDir: ANGULAR_FIXTURE,
|
|
491
|
+
cwd: CWD,
|
|
492
|
+
output: { js: false, dts: false },
|
|
493
|
+
});
|
|
494
|
+
|
|
495
|
+
await compiler.compileAsync();
|
|
496
|
+
|
|
497
|
+
const scssPath = path.join(ANGULAR_FIXTURE, "scss", "_colors.scss");
|
|
498
|
+
const cssPath = path.join(ANGULAR_FIXTURE, "dist", "_test-side-effect.css");
|
|
499
|
+
compiler.sideEffectScssRegistry.set(scssPath, {
|
|
500
|
+
scssAbsPath: scssPath,
|
|
501
|
+
cssAbsPath: cssPath,
|
|
502
|
+
sourceFileName: "test.ts",
|
|
503
|
+
});
|
|
504
|
+
|
|
505
|
+
compiler.compileSideEffectScss();
|
|
506
|
+
|
|
507
|
+
expect(fs.existsSync(cssPath)).toBe(true);
|
|
508
|
+
|
|
509
|
+
// 정리
|
|
510
|
+
fs.unlinkSync(cssPath);
|
|
511
|
+
});
|
|
512
|
+
});
|
|
513
|
+
|
|
514
|
+
// ── Rule: lint 옵션이 lint 실행을 제어한다 ──
|
|
515
|
+
|
|
516
|
+
describe("Lint 통합", () => {
|
|
517
|
+
it("lint=true 시 결과에 lint 필드가 포함된다", async () => {
|
|
518
|
+
const compiler = new SdTsCompiler({
|
|
519
|
+
pkgDir: NON_ANGULAR_FIXTURE,
|
|
520
|
+
cwd: CWD,
|
|
521
|
+
output: { js: false, dts: false },
|
|
522
|
+
lint: true,
|
|
523
|
+
});
|
|
524
|
+
|
|
525
|
+
const result = await compiler.compileAsync();
|
|
526
|
+
|
|
527
|
+
expect(result.lint).toBeDefined();
|
|
528
|
+
expect(typeof result.lint!.success).toBe("boolean");
|
|
529
|
+
expect(typeof result.lint!.errorCount).toBe("number");
|
|
530
|
+
expect(typeof result.lint!.warningCount).toBe("number");
|
|
531
|
+
});
|
|
532
|
+
|
|
533
|
+
it("lint 미설정 시 lint 결과가 undefined이다", async () => {
|
|
534
|
+
const compiler = new SdTsCompiler({
|
|
535
|
+
pkgDir: NON_ANGULAR_FIXTURE,
|
|
536
|
+
cwd: CWD,
|
|
537
|
+
output: { js: false, dts: false },
|
|
538
|
+
});
|
|
539
|
+
|
|
540
|
+
const result = await compiler.compileAsync();
|
|
541
|
+
|
|
542
|
+
expect(result.lint).toBeUndefined();
|
|
543
|
+
});
|
|
544
|
+
|
|
545
|
+
it("lint=true + globalScss=true 동시 활성 시 모든 결과가 통합 반환된다", async () => {
|
|
546
|
+
const compiler = new SdTsCompiler({
|
|
547
|
+
pkgDir: ANGULAR_FIXTURE,
|
|
548
|
+
cwd: CWD,
|
|
549
|
+
output: { js: false, dts: false },
|
|
550
|
+
lint: true,
|
|
551
|
+
globalScss: true,
|
|
552
|
+
});
|
|
553
|
+
|
|
554
|
+
const result = await compiler.compileAsync();
|
|
555
|
+
|
|
556
|
+
// lint 결과 존재
|
|
557
|
+
expect(result.lint).toBeDefined();
|
|
558
|
+
// globalScss 결과: scssErrors가 빈 배열 (성공)
|
|
559
|
+
expect(result.scssErrors).toEqual([]);
|
|
560
|
+
// 프로그램 존재
|
|
561
|
+
expect(result.program).toBeDefined();
|
|
562
|
+
});
|
|
563
|
+
});
|
|
564
|
+
|
|
565
|
+
// ── Rule: compileAsync는 초기빌드와 증분 리빌드를 하나의 진입점으로 처리 ──
|
|
566
|
+
|
|
567
|
+
describe("compileAsync 증분 빌드", () => {
|
|
568
|
+
it("Non-Angular 패키지의 두 번째 호출이 성공한다 (증분)", async () => {
|
|
569
|
+
const compiler = new SdTsCompiler({
|
|
570
|
+
pkgDir: NON_ANGULAR_FIXTURE,
|
|
571
|
+
cwd: CWD,
|
|
572
|
+
output: { js: false, dts: false },
|
|
573
|
+
});
|
|
574
|
+
|
|
575
|
+
const result1 = await compiler.compileAsync();
|
|
576
|
+
expect(result1.program).toBeDefined();
|
|
577
|
+
|
|
578
|
+
// 두 번째 호출 (증분)
|
|
579
|
+
const modifiedFiles = new Set([path.join(NON_ANGULAR_FIXTURE, "src", "util.ts")]);
|
|
580
|
+
const result2 = await compiler.compileAsync(modifiedFiles);
|
|
581
|
+
|
|
582
|
+
expect(result2.program).toBeDefined();
|
|
583
|
+
expect(result2.isForAngular).toBe(false);
|
|
584
|
+
});
|
|
585
|
+
|
|
586
|
+
it("Angular 패키지의 두 번째 호출이 성공한다 (증분)", async () => {
|
|
587
|
+
const compiler = new SdTsCompiler({
|
|
588
|
+
pkgDir: ANGULAR_FIXTURE,
|
|
589
|
+
cwd: CWD,
|
|
590
|
+
output: { js: false, dts: false },
|
|
591
|
+
});
|
|
592
|
+
|
|
593
|
+
const result1 = await compiler.compileAsync();
|
|
594
|
+
expect(result1.isForAngular).toBe(true);
|
|
595
|
+
|
|
596
|
+
// 두 번째 호출 (증분, 변경 파일 없음)
|
|
597
|
+
const result2 = await compiler.compileAsync(new Set());
|
|
598
|
+
|
|
599
|
+
expect(result2.isForAngular).toBe(true);
|
|
600
|
+
expect(result2.program).toBeDefined();
|
|
601
|
+
});
|
|
602
|
+
});
|
|
603
|
+
});
|