@simplysm/sd-cli 14.0.48 → 14.0.51
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/README.md +22 -679
- 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.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/docs/angular-vite-plugin/sd-angular-plugin.md +54 -0
- package/docs/config/build-target.md +31 -0
- package/docs/config/npm-config.md +27 -0
- package/docs/config/sd-browser-support-config.md +19 -0
- package/docs/config/sd-build-package-config.md +21 -0
- package/docs/config/sd-capacitor-config.md +109 -0
- package/docs/config/sd-client-package-config.md +33 -0
- package/docs/config/sd-config.md +73 -0
- package/docs/config/sd-electron-config.md +27 -0
- package/docs/config/sd-package-config.md +18 -0
- package/docs/config/sd-post-publish-script-config.md +19 -0
- package/docs/config/sd-publish-config.md +72 -0
- package/docs/config/sd-pwa-config.md +41 -0
- package/docs/config/sd-scripts-package-config.md +19 -0
- package/docs/config/sd-server-package-config.md +32 -0
- package/docs/config/sd-watch-hook-config.md +19 -0
- package/docs/ts-compiler/sd-ts-compiler.md +152 -0
- package/package.json +7 -6
- package/src/engines/EsbuildClientEngine.ts +1 -2
- package/src/esbuild/esbuild-angular-compiler-plugin.ts +1 -1
- 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/tests/angular/angular-compiler-hmr-removal.verify.md +12 -12
- package/tests/angular/onbuild-lint-removal.verify.md +4 -4
- package/tests/angular/vite-angular-plugin-sdtscompiler.verify.md +9 -9
- package/tests/angular/vite-angular-plugin-vitest.verify.md +16 -16
- package/tests/capacitor/capacitor-android-exports.verify.md +7 -7
- package/tests/commands/publish-npm-local-split.verify.md +5 -5
- package/tests/commands/publish-responsibility-split.verify.md +9 -9
- package/tests/commands/publish-set.verify.md +3 -3
- package/tests/commands/publish-storage-split.verify.md +4 -4
- package/tests/commands/slice3-severity-cleanup.verify.md +8 -8
- package/tests/deps/deps-directory-separation.verify.md +11 -11
- package/tests/deps/replace-deps/replace-deps-perf.verify.md +6 -6
- package/tests/deps/server-externals/mise-toml-parse-intent.verify.md +8 -8
- package/tests/electron/electron-symlink-cleanup.verify.md +4 -4
- package/tests/engines/engine-duplicate-output-removal.verify.md +6 -6
- package/tests/engines/engine-typecheck-selection.verify.md +4 -4
- package/tests/engines/esbuild-client-engine.verify.md +11 -11
- package/tests/engines/normalize-result.verify.md +5 -5
- package/tests/engines/vite-dependency-cleanup.verify.md +11 -11
- package/tests/esbuild/esbuild-angular-compiler-plugin-hmr.verify.md +10 -10
- package/tests/esbuild/esbuild-angular-compiler-plugin-onload.verify.md +17 -17
- package/tests/esbuild/esbuild-angular-compiler-plugin-onstart-extraction.verify.md +12 -12
- package/tests/esbuild/esbuild-angular-compiler-plugin-sdtscompiler.verify.md +11 -11
- package/tests/esbuild/esbuild-angular-compiler-plugin-stylesheet.verify.md +13 -13
- package/tests/esbuild/esbuild-angular-compiler-plugin-worker.verify.md +32 -32
- package/tests/esbuild/esbuild-angular-compiler-plugin.spec.ts +1 -1
- package/tests/esbuild/esbuild-angular-compiler-plugin.verify.md +9 -9
- package/tests/esbuild/esbuild-postcss-plugin-chunking.verify.md +3 -3
- package/tests/esbuild/esbuild-postcss-plugin.acc.spec.ts +1 -1
- package/tests/esbuild/esbuild-tsc-plugin-imports.verify.md +9 -9
- 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-node.verify.md +7 -7
- package/tests/esbuild/esbuild-worker-plugin.spec.ts +1 -1
- package/tests/esbuild/esbuild-worker-plugin.verify.md +3 -3
- package/tests/orchestrators/build-orchestrator.spec.ts +9 -9
- package/tests/orchestrators/dev-orchestrator.spec.ts +4 -4
- package/tests/orchestrators/dist-delete-watcher.verify.md +6 -6
- package/tests/orchestrators/orchestrator-baseenv.verify.md +6 -6
- package/tests/orchestrators/orchestrator-diagnostic-formatting.verify.md +6 -6
- package/tests/orchestrators/orchestrator-initializemode-signature.verify.md +5 -5
- package/tests/orchestrators/slice1-stdout-to-consola.verify.md +6 -6
- package/tests/orchestrators/watch-orchestrator.spec.ts +2 -2
- package/tests/sd-cli-catch-all.verify.md +3 -3
- package/tests/sd-cli-log-tag.verify.md +7 -7
- package/tests/ts-compiler/SdTsCompiler-affected-files.verify.md +4 -4
- package/tests/ts-compiler/SdTsCompiler-crash-handling.verify.md +24 -0
- package/tests/ts-compiler/SdTsCompiler-diagnostics.verify.md +8 -8
- package/tests/ts-compiler/SdTsCompiler-emit.verify.md +5 -5
- package/tests/ts-compiler/SdTsCompiler.verify.md +20 -20
- package/tests/ts-compiler/scss-lint-integration.verify.md +10 -10
- package/tests/utils/copy-public-outdir.verify.md +4 -4
- package/tests/utils/copy-src.spec.ts +5 -5
- package/tests/utils/dev-http-server.verify.md +4 -4
- package/tests/utils/engine-watch-events.verify.md +8 -8
- package/tests/utils/esbuild-client-config-integration.verify.md +5 -5
- package/tests/utils/esbuild-client-config-postcss.verify.md +2 -2
- 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-client-config.verify.md +16 -16
- package/tests/utils/esbuild-config.spec.ts +3 -3
- package/tests/utils/esbuild-index-html.verify.md +6 -6
- package/tests/utils/esbuild-postcss-plugin.spec.ts +1 -1
- package/tests/utils/esbuild-pwa.verify.md +5 -5
- package/tests/utils/esbuild-scss-plugin.verify.md +4 -4
- package/tests/utils/hmr-client-script.acc.spec.ts +1 -1
- package/tests/utils/hmr-service.verify.md +10 -10
- package/tests/utils/lint-core-import-paths.verify.md +6 -6
- package/tests/utils/ngtsc-build-core.spec.ts +1 -1
- package/tests/utils/package-utils.spec.ts +6 -6
- package/tests/utils/replace-deps-split.verify.md +11 -11
- package/tests/utils/replace-deps-watch.verify.md +5 -5
- package/tests/utils/server-production-files-import-paths.verify.md +10 -10
- package/tests/utils/vite-config-cleanup.verify.md +3 -3
- package/tests/workers/build-watch-paths-library.verify.md +6 -6
- package/tests/workers/build-watch-paths-ngtsc-server.verify.md +8 -8
- package/tests/workers/client-worker-browser-support.verify.md +3 -3
- package/tests/workers/client-worker-cleanup.verify.md +4 -4
- package/tests/workers/client-worker-initial-build-error.verify.md +3 -3
- package/tests/workers/client-worker-initial-build-warnings.verify.md +3 -3
- package/tests/workers/client-worker-mtime-incremental.verify.md +6 -6
- package/tests/workers/client-worker-onend-sync.verify.md +3 -3
- package/tests/workers/client-worker-refactor.verify.md +18 -18
- package/tests/workers/client-worker-ts-cache-invalidation.verify.md +8 -8
- package/tests/workers/dev-port-file.verify.md +3 -3
- package/tests/workers/ngtsc-build-rootnames-refresh.verify.md +4 -4
- package/tests/workers/server-build-context-dispose.verify.md +4 -4
- package/tests/workers/server-build-worker-plugin.verify.md +5 -5
- package/tests/workers/server-build-worker-refactoring.verify.md +10 -10
- package/tests/workers/server-build-worker.spec.ts +1 -1
- package/tests/workers/server-esbuild-context-integration.verify.md +6 -6
- package/tests/workers/server-esbuild-context-tsc.verify.md +3 -3
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
## 검증 항목
|
|
4
4
|
|
|
5
|
-
-
|
|
6
|
-
-
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
5
|
+
- replace-deps/ 서브디렉토리에 3개 파일 존재: `collect-deps.ts`, `replace-deps.ts`, `replace-deps-resolve.ts` — glob으로 확인
|
|
6
|
+
- server-externals/ 서브디렉토리에 1개 파일 존재: `server-production-files.ts` — glob으로 확인
|
|
7
|
+
- deps/ 루트에 이전 파일 없음: `replace-deps/`, `server-externals/` 서브디렉토리만 존재
|
|
8
|
+
- collect-deps.ts 내부 import 수정: `../../utils/package-utils` — 코드 확인
|
|
9
|
+
- server-production-files.ts 내부 import 수정: `../../workers/server-build.worker`, `../../esbuild/esbuild-config` — 코드 확인
|
|
10
|
+
- replace-deps.ts → replace-deps-resolve.ts 상대 import 변경 없음: 같은 디렉토리 이동으로 `./replace-deps-resolve` 유지 — 코드 확인
|
|
11
|
+
- src/ 소비자 7건 import 경로 업데이트: grep으로 이전 경로 참조 0건 확인
|
|
12
|
+
- tests/ 소비자 전체 import 경로 업데이트: grep으로 이전 경로 참조 0건 확인
|
|
13
|
+
- typecheck 통과 (기존 에러 4건 제외): `pnpm typecheck` 실행 확인
|
|
14
|
+
- lint 통과: `pnpm lint sd-cli` 0 에러 확인
|
|
15
|
+
- 관련 테스트 통과: replace-deps-watch 2개 파일 5개 테스트 전체 통과 확인
|
|
@@ -4,12 +4,12 @@
|
|
|
4
4
|
|
|
5
5
|
### Slice 1: Set 중복 검사 + glob 병렬화
|
|
6
6
|
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
7
|
+
- `resolveAllReplaceDepEntries`에서 `entries.some()` 대신 `Set<string>` 사용 확인: `replace-deps-resolve.ts:143`에 `seenTargetPaths = new Set<string>()` 선언, `:205`에서 `seenTargetPaths.has(actualTargetPath)` + `seenTargetPaths.add(actualTargetPath)` 사용. 기존 `entries.some()` 제거됨.
|
|
8
|
+
- glob 병렬화 확인: `replace-deps-resolve.ts:167-171`에서 `Promise.all(Object.keys(replaceDeps).map(...))` 사용. 기존 순차 `for` 루프 제거됨. `:172-174`에서 `flatMap`으로 결과를 합침.
|
|
9
|
+
- `seenTargetPaths`가 while 루프 바깥에 선언되어 재귀 탐색 전체에 걸쳐 중복 방지가 유지됨 확인.
|
|
10
10
|
|
|
11
11
|
### Slice 2: watch onChange entries 사전 필터링
|
|
12
12
|
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
13
|
+
- `watchReplaceDeps`에서 사전 필터링 확인: `replace-deps.ts:240-242`에 `sourceEntries = entries.filter(e => e.resolvedSourcePath === entry.resolvedSourcePath)` 선언. watcher 생성 전에 필터링되어 클로저에 캡처됨.
|
|
14
|
+
- onChange 내부에서 `sourceEntries`만 순회 확인: `replace-deps.ts:252`에서 `for (const e of sourceEntries)` 사용. 기존 `for (const e of entries)` + `if (e.resolvedSourcePath !== entry.resolvedSourcePath) continue;` 패턴이 제거됨.
|
|
15
|
+
- `entries` 배열은 `resolveAllReplaceDepEntries` 호출 후 불변이므로, 필터링 결과가 watcher 생명주기 동안 유효함 확인 (`replace-deps.ts:202`에서 `entries` 할당 후 수정 없음).
|
|
@@ -6,11 +6,11 @@
|
|
|
6
6
|
|
|
7
7
|
## 검증 항목
|
|
8
8
|
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
9
|
+
- **WHY 주석 존재**: `server-production-files.ts:114`에 `// mise.toml은 저장소에서 관리되는 설정 파일이므로, 파싱 실패 시 폴백하지 않고 예외를 전파하여 설정 오류를 즉시 드러낸다.` 주석이 `TOML.parse(miseContent)` 호출(`:115`) 직전에 존재함을 확인
|
|
10
|
+
- **명시적 크래시 의도 서술**: 주석이 "저장소에서 관리되는 설정 파일", "폴백하지 않고", "예외를 전파", "설정 오류를 즉시 드러낸다" 표현을 모두 포함하여 wbs에 명시된 WHY를 서술
|
|
11
|
+
- **WHAT 서술 지양**: "TOML을 파싱한다" 같은 코드 재서술이 아니라, 폴백을 의도적으로 하지 않는 이유(설정 오류 즉시 노출)를 설명
|
|
12
|
+
- **try-catch 미추가**: `:109-121` 블록 전체에 try 키워드 없음을 확인 — 파싱 예외는 상위로 전파됨
|
|
13
|
+
- **주석 스타일**: `//` 한 줄 주석 (JSDoc 아님)
|
|
14
|
+
- **주석 언어**: 한국어
|
|
15
|
+
- **기타 코드 미변경**: `git diff server-production-files.ts` 결과 라인 114의 주석 추가 1줄 외 변경 없음 (아래 명령 실행 결과 참조)
|
|
16
|
+
- **기존 테스트 통과**: `pnpm exec vitest run --project node packages/sd-cli/tests/workers/server-build-worker.spec.ts` 25/25 통과, 특히 `generates dist/mise.toml when packageManager=mise` 테스트(TOML.parse 경로 실행)가 통과하여 파싱 로직 회귀 없음을 확인. 참고: 전체 sd-cli 테스트(`packages/sd-cli/tests/`)에서 1건 실패(`esbuild-worker-plugin.acc.spec.ts:143`)가 있으나 이는 Feature 1.1 영역이며 본 Feature 1.3 변경(주석 1줄 추가)과 무관
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## 검증 항목
|
|
4
4
|
|
|
5
|
-
-
|
|
6
|
-
-
|
|
7
|
-
-
|
|
8
|
-
-
|
|
5
|
+
- try-catch-finally 구조 적용: `electron.ts:348-358` — try 블록에서 writeFile/symlink/lstat 수행, finally에서 정리
|
|
6
|
+
- finally에서 testLink, testTarget 각각 unlink: `finally { try { fs.unlinkSync(testLink); } catch {} try { fs.unlinkSync(testTarget); } catch {} }` 확인
|
|
7
|
+
- 성공 시에도 파일 정리: try 블록 return 후 finally가 실행되므로 정리 보장
|
|
8
|
+
- 실패 시에도 파일 정리: catch 블록 return 후 finally가 실행되므로 정리 보장
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
## 검증 항목
|
|
4
4
|
|
|
5
|
-
-
|
|
6
|
-
-
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
5
|
+
- esbuild-client-config.ts logLevel이 모든 모드에서 "silent"인지: `esbuild-client-config.ts:191` — `logLevel: "silent"` 확인. 기존 `isDev ? "warning" : "silent"` 삼항 연산자 제거됨
|
|
6
|
+
- EsbuildClientEngine에 중복 error 핸들러가 없는지: `EsbuildClientEngine.ts:103-110` — setupWatchEvents만 error 이벤트 처리. 기존 `worker.on("error", ...)` 핸들러(logger.error 호출) 제거됨
|
|
7
|
+
- EsbuildClientEngine 초기 빌드 실패 시 logger.error 미호출: `EsbuildClientEngine.ts:129-138` — `!result.success` 분기에서 `resultCollector.add()`만 호출. logger.error 줄 제거됨
|
|
8
|
+
- BaseEngine에 logger.warn() 블록이 없는지: `BaseEngine.ts:166-180` — build 이벤트 핸들러에 lint 결과 보고만 존재. warnings에 대한 logger.warn() 블록 제거됨
|
|
9
|
+
- BaseEngine startWatch 실패 시 logger.debug 사용: `BaseEngine.ts:182-183` — `logger.debug(...)` 확인. 기존 `logger.error(...)` → `logger.debug(...)` 변경됨
|
|
10
|
+
- BaseEngine lint 결과 보고 로직 유지: `BaseEngine.ts:170-179` — `event.lint != null` 조건의 ResultCollector 보고 로직이 그대로 유지됨
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## 검증 항목
|
|
4
4
|
|
|
5
|
-
-
|
|
6
|
-
-
|
|
7
|
-
-
|
|
8
|
-
-
|
|
5
|
+
- target 변환 로직 제거됨: `TypecheckOrchestrator.ts:133-142`에서 `config.target === "client" ? { target: "browser" as const } : config` 코드가 제거되고, 원본 `config`가 그대로 `_typecheckTasks`에 저장됨
|
|
6
|
+
- createTypecheckEngine 호출: `TypecheckOrchestrator.ts:209`에서 `createBuildEngine` 대신 `createTypecheckEngine`을 호출함
|
|
7
|
+
- import 변경: `TypecheckOrchestrator.ts:7`에서 `createBuildEngine` 대신 `createTypecheckEngine`을 import함
|
|
8
|
+
- createTypecheckEngine 내부 변환: `engines/index.ts`의 `createTypecheckEngine`이 client target을 `{ target: "browser" }`로 변환하여 `createBuildEngine`에 위임함
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
## 검증 항목
|
|
4
4
|
|
|
5
|
-
-
|
|
6
|
-
-
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
5
|
+
- legacy 프로덕션 빌드: client.worker.ts build()에서 `legacyModule` 플래그가 resolvePackageInfo()를 통해 sd.config.ts에서 읽히고 createClientEsbuildContext()에 전달됨 (line 100, 124). esbuild-client-config.ts에서 splitting:false, import-meta:false 적용 확인 (line 160, 171)
|
|
6
|
+
- legacy dev watch: startWatch()에서 동일하게 legacyModule이 전달되고 (line 224), legacyModule=true 시 templateUpdates를 undefined로 전달하여 Angular HMR banner를 비활성화 (line 227). CSS swap + full-reload만 동작
|
|
7
|
+
- device 호환성 (.dev-port): startWatch()에서 포트 할당 후 dist/.dev-port에 기록 (line 319). EsbuildClientEngine.stop()에서 .dev-port 삭제 (line 153-154)
|
|
8
|
+
- device 호환성 (dist/ 구조): esbuild가 dist/에 직접 write:true로 출력 (esbuild-client-config.ts line 163). Capacitor/Electron이 dist/에서 접근 가능한 구조 유지
|
|
9
|
+
- framework 필드 제거: SdClientPackageConfig에서 framework 필드 삭제됨 (sd-config.types.ts 확인). ClientBuildInfo에서 framework 필드 삭제됨 (client.worker.ts line 27-42). EsbuildClientEngine.run()에서 framework을 worker에 전달하지 않음
|
|
10
|
+
- ClientBuildInfo.exclude 제거: ClientBuildInfo에 exclude 필드 없음 (client.worker.ts line 27-42). SdClientPackageConfig.exclude는 Capacitor/Electron용으로 유지
|
|
11
|
+
- scopeRebuild 이벤트 제거: ClientWorkerEvents에 scopeRebuild 없음 (client.worker.ts line 53-58). EsbuildClientEngine에서 scopeRebuild 이벤트 구독 안 함 (자동 테스트로도 검증)
|
|
12
|
+
- .config.json 기록: build()에서 writeConfigJson() 호출 (line 169). startWatch()에서 writeConfigJson() 호출 (line 318)
|
|
13
|
+
- 팩토리 교체: engines/index.ts에서 ViteEngine → EsbuildClientEngine으로 교체 확인. import 및 생성자 호출 모두 EsbuildClientEngine 사용
|
|
14
|
+
- stopWatch 리소스 정리 순서: esbuild context dispose → HMR close → HTTP server close → public watcher close (line 332-360). 구현계획의 순서와 일치
|
|
15
|
+
- resolvePackageInfo의 dev 고정값: build()에서도 `dev: true`로 loadSdConfig를 호출함 (line 82). build 모드에서는 `dev: false`여야 할 수 있으나, 기존 ViteEngine도 동일한 패턴이므로 기존 동작 유지. 별도 수정 불요
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
## 검증 항목
|
|
4
4
|
|
|
5
|
-
-
|
|
6
|
-
-
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
5
|
+
- TscEngine._callBuild()가 this._normalizeResult(result)를 호출한다: TscEngine.ts:56 확인 — `return this._normalizeResult(result);`
|
|
6
|
+
- NgtscEngine._callBuild()가 this._normalizeResult(result)를 호출한다: NgtscEngine.ts:55 확인 — `return this._normalizeResult(result);`
|
|
7
|
+
- ServerEsbuildEngine._callBuild()가 this._normalizeResult(result)를 호출한다: ServerEsbuildEngine.ts:60 확인 — `return this._normalizeResult(result);`
|
|
8
|
+
- BaseEngine._normalizeResult()의 입력 타입이 Worker 반환 구조와 호환된다: build.errors?/warnings?가 optional이고, diagnostics가 SerializedDiagnostic[]로 일치
|
|
9
|
+
- 3개 서브클래스에서 인라인 normalization 코드가 완전히 제거되었다: 각 파일에서 `result.build.errors ??` 패턴이 더 이상 없음
|
|
@@ -3,22 +3,22 @@
|
|
|
3
3
|
## 검증 항목
|
|
4
4
|
|
|
5
5
|
### Scenario: 빌드 전용 Vite 플러그인 의존성 제거
|
|
6
|
-
-
|
|
7
|
-
-
|
|
6
|
+
- vite-plugin-pwa가 package.json dependencies에서 제거됨: package.json에 vite-plugin-pwa 미존재 확인
|
|
7
|
+
- vite-plugin-solid가 package.json dependencies에서 제거됨: package.json에 vite-plugin-solid 미존재 확인
|
|
8
8
|
|
|
9
9
|
### Scenario: Vitest용 Vite 의존성을 devDependencies로 이동
|
|
10
|
-
-
|
|
11
|
-
-
|
|
10
|
+
- vite가 devDependencies에 존재하고 dependencies에 없음: package.json:55 `"vite": "^7.3.2"` in devDependencies
|
|
11
|
+
- vite-tsconfig-paths가 devDependencies에 존재하고 dependencies에 없음: package.json:56 `"vite-tsconfig-paths": "^6.1.1"` in devDependencies
|
|
12
12
|
|
|
13
13
|
### Scenario: workbox 관련 타입 정리
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
14
|
+
- SdPwaWorkboxConfig 인터페이스가 sd-config.types.ts에서 삭제됨: grep "SdPwaWorkboxConfig" → No matches found
|
|
15
|
+
- SdPwaConfig에서 workbox 필드가 삭제됨: grep "workbox" → No matches found
|
|
16
|
+
- pnpm typecheck sd-cli 통과: 0개 에러, 0개 경고
|
|
17
17
|
|
|
18
18
|
### Scenario: ViteEngine.ts 삭제
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
-
|
|
19
|
+
- engines/ViteEngine.ts 파일이 존재하지 않음: `test -f` → DELETED
|
|
20
|
+
- engines/index.ts에서 ViteEngine 미참조: grep "ViteEngine" engines/index.ts → No matches found
|
|
21
|
+
- tests/engines/vite-engine.spec.ts 삭제됨: `test -f` → DELETED
|
|
22
22
|
|
|
23
23
|
### Scenario: 의존성 변경 �� lockfile 갱신
|
|
24
|
-
-
|
|
24
|
+
- pnpm install 성공: Packages: +1 -184, Done in 6.1s
|
|
@@ -2,22 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
## 검증 항목
|
|
4
4
|
|
|
5
|
-
-
|
|
5
|
+
- **증분 빌드 조건 판단**: `esbuild-angular-compiler-plugin.ts:200` — `angularCompiler != null && sourceFileCache != null && sourceFileCache.modifiedFiles.size > 0`으로 증분 빌드 감지. 첫 빌드는 `angularCompiler == null` 경로로 진입.
|
|
6
6
|
|
|
7
|
-
-
|
|
7
|
+
- **staleSourceFiles 캡처 타이밍**: `esbuild-angular-compiler-plugin.ts:208-219` — `invalidate()` 호출 전에 이전 `ts.Program`에서 stale source files를 캡처. `invalidate` 후에는 캐시에서 삭제되므로 순서가 중요.
|
|
8
8
|
|
|
9
|
-
-
|
|
9
|
+
- **FileReferenceTracker.update → sourceFileCache.invalidate**: `esbuild-angular-compiler-plugin.ts:221-224` — `referencedFileTracker.update()`로 전이적 의존성 확장 후 `invalidate()` 호출. 확장된 파일 집합이 전달됨.
|
|
10
10
|
|
|
11
|
-
-
|
|
11
|
+
- **stale additionalResults 제거**: `esbuild-angular-compiler-plugin.ts:226-229` — expandedModifiedFiles의 각 파일에 대해 `additionalResults.delete()` 호출.
|
|
12
12
|
|
|
13
|
-
-
|
|
13
|
+
- **HMR 활성화 조건**: `esbuild-angular-compiler-plugin.ts:204-206` — `templateUpdates != null && modifiedFiles.size <= 32`. 32개 초과 시 HMR 건너뜀.
|
|
14
14
|
|
|
15
|
-
-
|
|
15
|
+
- **collectHmrCandidates 호출**: `esbuild-angular-compiler-plugin.ts:235-239` — `ngtscProgram`과 `staleSourceFiles`를 전달. `sourceFileCache.modifiedFiles`(확장 전 원본)을 대상으로 분석.
|
|
16
16
|
|
|
17
|
-
-
|
|
17
|
+
- **emitHmrUpdateModule 호출 및 null 처리**: `esbuild-angular-compiler-plugin.ts:259-264` — `emitHmrUpdateModule`이 null/undefined 반환 시 break (templateUpdates 전파 중단). NgCompiler API를 Record 캐스팅으로 접근 (타입이 private이므로).
|
|
18
18
|
|
|
19
|
-
-
|
|
19
|
+
- **templateUpdates Map 전파**: `esbuild-angular-compiler-plugin.ts:266` — `pluginOptions.templateUpdates!.set(updateId, updateText)`로 외부 Map에 직접 기록.
|
|
20
20
|
|
|
21
|
-
-
|
|
21
|
+
- **updateId 형식**: `esbuild-angular-compiler-plugin.ts:256-258` — `encodeURIComponent("{relativePath}@{className}")`. relativePath는 hostDir 기준 상대경로, 백슬래시를 슬래시로 변환.
|
|
22
22
|
|
|
23
|
-
-
|
|
23
|
+
- **hmr-candidates.ts 구조**: `hmr-candidates.ts` — `collectHmrCandidates` 함수가 원본 `hmr-candidates.js`의 로직을 TypeScript로 이식. `analyzeFileUpdates`, `analyzeMetaUpdates`, `equalRangeText` 헬퍼 포함. SUPPORTED_FIELD_NAMES = {template, templateUrl, styles, styleUrl, stylesUrl}.
|
|
@@ -2,20 +2,20 @@
|
|
|
2
2
|
|
|
3
3
|
## 검증 항목
|
|
4
4
|
|
|
5
|
-
-
|
|
6
|
-
-
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
-
|
|
5
|
+
- TS onLoad 훅이 `/\.[cm]?[jt]sx?$/` 필터로 등록된다: :517 `build.onLoad({ filter: /\.[cm]?[jt]sx?$/ }, ...)`
|
|
6
|
+
- JS onLoad 훅이 `/\.[cm]?js$/` 필터로 등록된다: :584 `build.onLoad({ filter: /\.[cm]?js$/ }, ...)`
|
|
7
|
+
- TS onLoad: shouldTsIgnoreJs=true이고 JS 파일이면 undefined 반환: :522 `if (shouldTsIgnoreJs && isJS) return undefined`
|
|
8
|
+
- TS onLoad: 캐시 미스 + hasCompilationErrors이면 `{ contents: '', loader: 'js' }` 반환: :530
|
|
9
|
+
- TS onLoad: 캐시 미스 + allowJs + JS이면 undefined 반환: :535
|
|
10
|
+
- TS onLoad: 캐시 미스 + Angular 데코레이터 없으면 warning 반환: :541-547
|
|
11
|
+
- TS onLoad: 캐시 미스 + Angular 데코레이터 있으면 error 반환: :550-552
|
|
12
|
+
- TS onLoad: string 캐시 + (useTypeScriptTranspilation || isJS)이면 transformData 호출 → Uint8Array 재캐싱: :556-565
|
|
13
|
+
- TS onLoad: Uint8Array 캐시이면 재변환 없이 그대로 반환: :556 조건 `typeof contents === "string"` — Uint8Array는 조건 불일치로 통과
|
|
14
|
+
- TS onLoad: loader 결정 — (useTypeScriptTranspilation || isJS) → 'js', .tsx → 'tsx', 기타 → 'ts': :569-574
|
|
15
|
+
- JS onLoad: createCachedLoad(loadResultCache, callback)으로 래핑: :586
|
|
16
|
+
- JS onLoad: transformFile(request, false, sideEffects) 호출: :589
|
|
17
|
+
- hasSideEffects: advancedOptimizations=false → undefined 반환: :292-293
|
|
18
|
+
- hasSideEffects: advancedOptimizations=true → build.resolve() 호출: :295-298
|
|
19
|
+
- shouldTsIgnoreJs: onStart에서 !compilerOptions.allowJs로 결정: :405
|
|
20
|
+
- useTypeScriptTranspilation: !isolatedModules || !!sourceMap || !!inlineSourceMap으로 결정: :406-407
|
|
21
|
+
- loadResultCache 옵션이 AngularCompilerPluginOptions에 추가됨: :33
|
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
## 검증 항목
|
|
4
4
|
|
|
5
|
-
-
|
|
6
|
-
-
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
5
|
+
- **handleIncrementalBuild 클로저 변수 접근**: `pluginOptions.sourceFileCache!` (314줄), `pluginOptions.templateUpdates` (316줄), `angularCompiler!` (322, 342, 345, 353줄), `referencedFileTracker` (332줄), `additionalResults` (339줄), `cwd` (359줄) — 모두 setup 스코프(248-289줄)에서 선언된 변수를 파라미터 없이 직접 접근. 원본에서 `errors`/`warnings`를 사용하지 않아 파라미터 불필요 (lint 에러로 확인, 제거)
|
|
6
|
+
- **handleFirstBuild 클로저 변수 접근**: `pluginOptions` (378, 387-390줄), `preserveSymlinks` (381줄), `angularCompiler` (394줄 대입), `shouldTsIgnoreJs` (398줄 대입), `useTypeScriptTranspilation` (399줄 대입) — 모두 setup 스코프 변수 직접 접근. 파라미터 없음
|
|
7
|
+
- **createWebWorkerProcessor 클로저 변수 접근**: `build` (410줄), `pluginOptions.sourcemap` (410줄), `cwd` (422, 437줄), `referencedFileTracker` (417, 435줄), `additionalResults` (424, 428줄) — 모두 setup 스코프 변수 직접 접근. `errors`/`warnings`만 파라미터로 전달
|
|
8
|
+
- **onStart 반환값 동일**: onStart 콜백(456-526줄)이 동일한 `result` 객체를 반환 (`errors`/`warnings` 할당 로직 523-525줄 유지). 추출 전과 동일한 `{errors, warnings}` 구조
|
|
9
|
+
- **내부 상태 변화 동일**: `handleIncrementalBuild`에서 `sourceFileCache.invalidate()` (328줄), `additionalResults.delete()` (332줄), `angularCompiler.update()` (335줄), `templateUpdates.set()/clear()` (366, 370줄) — 원본 코드(316-383줄)와 동일한 mutation 순서와 로직
|
|
10
|
+
- **handleFirstBuild 상태 설정**: `angularCompiler = compiler` (394줄), `shouldTsIgnoreJs = !co.allowJs` (398줄), `useTypeScriptTranspilation` (399-400줄) — 원본 코드(384-409줄)와 동일
|
|
11
|
+
- **HMR 실패 시 templateUpdates 초기화**: `updateText === null || updateText === undefined` 조건(364줄) → `pluginOptions.templateUpdates!.clear()` (366줄) + `break` (367줄) — 원본과 동일
|
|
12
|
+
- **Worker 빌드 성공 경로**: `additionalResults.set(fullWorkerPath, {outputFiles, metafile})` (428-431줄) → `workerCodeFile` 찾기 (442-444줄) → 상대 경로 반환 (450-451줄) — 원본과 동일
|
|
13
|
+
- **Worker 빌드 실패 경로**: `errors.push(...workerResult.errors)` (415줄) → `referencedFileTracker.add()` (417-423줄) → `additionalResults.set()` (424줄) → `return workerFile` (425줄) — 원본과 동일
|
|
14
|
+
- **onStart 오케스트레이션 축소**: onStart 콜백이 456-526줄 = ~70줄로 축소됨. 구성: stylesheetErrors 리셋(4줄) + 분기 호출(5줄) + processWebWorker 생성(1줄) + emit(5줄) + diagnostics(8줄) + stylesheet 브릿징(12줄) + 에러 핸들링(13줄) + 결과 반환(3줄)
|
|
15
|
+
- **onLoad/onEnd/onDispose 미변경**: 528줄 이후의 onLoad(528-593줄), onEnd(615-625줄), onDispose(628-632줄) 핸들러가 변경되지 않음
|
|
16
|
+
- **기존 테스트 26개 통과**: vitest run 실행 결과 26 passed, 0 failed
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
## 검증 항목
|
|
4
4
|
|
|
5
|
-
-
|
|
6
|
-
-
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
5
|
+
- SdTsCompiler 인스턴스 생성: `:402-414` — `new SdTsCompiler({ pkgDir: path.dirname(pluginOptions.tsconfig), cwd, output: { js: true, dts: false }, sourceFileCache, transformStylesheet, externalStylesheets, compilerOptionsTransformer })` 올바르게 구성
|
|
6
|
+
- compileAsync 호출: `:422-425` — 첫 빌드 시 `compileAsync(undefined, { additionalTransformers })`, 증분 빌드 시 `compileAsync(expandedModifiedFiles, { additionalTransformers })`
|
|
7
|
+
- emitResults → typeScriptFileCache 매핑: `:428-430` — `compileResult.emitResults`를 순회하여 `path.normalize(sourceFileName)` 키로 저장
|
|
8
|
+
- diagnostics 변환: `:441-448` — `convertSerializedDiagnosticToEsbuild(d, compileResult.program, cwd)` 사용, `d.category` 기반 분류
|
|
9
|
+
- HMR staleSourceFiles 캡처: `:380-388` — `lastResult.program.getSourceFile(modifiedFile)` 사용, compileAsync 전에 수행
|
|
10
|
+
- HMR collectHmrCandidates: `:468-471` — `compileResult.ngtscProgram` 사용, staleSourceFiles 전달
|
|
11
|
+
- SCSS bridging: `:451-462` — `pluginOptions.stylesheetDependencies`/`stylesheetErrors` 직접 읽기 (plugin-owned maps)
|
|
12
|
+
- parseTsconfigFile 함수 제거 확인: 파일 전체에서 `parseTsconfigFile` 미발견
|
|
13
|
+
- AngularCompiler import 제거 확인: `:7` — `import type { AngularSourceFileCache }` (type import만 유지)
|
|
14
|
+
- onDispose에서 참조 해제: `sdTsCompiler = undefined; lastResult = undefined;` 확인
|
|
15
|
+
- onLoad 플래그 결정: `:432-438` — `lastResult == null` 조건으로 첫 빌드에서만 결정
|
|
@@ -4,28 +4,28 @@
|
|
|
4
4
|
|
|
5
5
|
### AngularCompilerPluginOptions 인터페이스 확장
|
|
6
6
|
|
|
7
|
-
-
|
|
8
|
-
-
|
|
7
|
+
- `stylesheetDependencies?: Map<string, Set<string>>` 필드 존재: `esbuild-angular-compiler-plugin.ts:42` — `Map<string, Set<string>>` 타입으로 선언됨. `createClientTransformStylesheet`의 `scssDependencies` 타입과 일치
|
|
8
|
+
- `stylesheetErrors?: string[]` 필드 존재: `esbuild-angular-compiler-plugin.ts:44` — `string[]` 타입으로 선언됨. `createClientTransformStylesheet`의 `scssErrors` 타입과 일치
|
|
9
9
|
|
|
10
10
|
### onStart — stylesheetErrors 리셋
|
|
11
11
|
|
|
12
|
-
-
|
|
13
|
-
-
|
|
12
|
+
- 리셋 코드가 try 블록 **앞**에 위치: `esbuild-angular-compiler-plugin.ts:204-207` — `if (pluginOptions.stylesheetErrors != null) { pluginOptions.stylesheetErrors.length = 0; }` 가 `try {` (`:209`) 이전에 위치. 컴파일 실패 시에도 리셋이 보장됨
|
|
13
|
+
- null guard 존재: `pluginOptions.stylesheetErrors != null` 체크로 미제공 시 TypeError 방지
|
|
14
14
|
|
|
15
15
|
### onStart — stylesheetDependencies → FileReferenceTracker 브릿징
|
|
16
16
|
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
-
-
|
|
17
|
+
- 브릿징 코드가 emit 후, additionalResults 수집 전에 위치: `esbuild-angular-compiler-plugin.ts:315-320` — `emitAffectedFiles` 루프(`:300-303`)와 `diagnostics 수집`(`:305-313`) 후, `additionalResults 에러 수집`(`:322`) 전에 위치
|
|
18
|
+
- `referencedFileTracker.add(containingFile, deps)` 호출: `:318` — Map의 각 엔트리에 대해 `referencedFileTracker.add(containingFile, deps)` 호출. `FileReferenceTracker.add()` 시그니처(`file-reference-tracker.ts:22`)와 일치
|
|
19
|
+
- null guard 존재: `:316` — `pluginOptions.stylesheetDependencies != null` 체크
|
|
20
20
|
|
|
21
21
|
### onStart — stylesheetErrors → esbuild errors 변환
|
|
22
22
|
|
|
23
|
-
-
|
|
24
|
-
-
|
|
25
|
-
-
|
|
26
|
-
-
|
|
23
|
+
- 변환 코드가 additionalResults 에러 수집 후에 위치: `esbuild-angular-compiler-plugin.ts:329-334` — `additionalResults` 루프(`:322-327`) 후에 위치
|
|
24
|
+
- `{ text: errText, location: null }` 형식으로 push: `:332` — `errors.push({ text: errText, location: null })`. esbuild `PartialMessage` 형식에 부합
|
|
25
|
+
- null guard 존재: `:330` — `pluginOptions.stylesheetErrors != null` 체크
|
|
26
|
+
- 빈 배열 시 push 없음: `for...of` 루프이므로 빈 배열일 때 자연스럽게 0회 실행
|
|
27
27
|
|
|
28
28
|
### 증분 빌드 전이적 재컴파일 경로
|
|
29
29
|
|
|
30
|
-
-
|
|
31
|
-
-
|
|
30
|
+
- `referencedFileTracker.update(sourceFileCache.modifiedFiles)` 호출: `:231-233` — 증분 빌드 경로에서 `referencedFileTracker.update()`가 호출됨. Feature 2.1에서 등록한 SCSS 의존성이 여기서 전이적으로 확장됨
|
|
31
|
+
- 확장된 파일이 `sourceFileCache.invalidate()`에 전달됨: `:234` — `sourceFileCache.invalidate(expandedModifiedFiles)`. SCSS 의존성 파일 변경 시 해당 스타일시트 파일도 무효화되어 Angular compiler가 컴포넌트를 재컴파일
|
|
@@ -4,56 +4,56 @@
|
|
|
4
4
|
|
|
5
5
|
### 제거된 코드
|
|
6
6
|
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
7
|
+
- `createWorkerTransformer` import가 제거됨: `esbuild-angular-compiler-plugin.ts`에 `web-worker-transformer.js`로부터의 import가 존재하지 않음
|
|
8
|
+
- `AdditionalResult` 인터페이스 선언이 제거됨
|
|
9
|
+
- `bundleWebWorker` 함수 및 `#region bundleWebWorker` 주석이 제거됨
|
|
10
|
+
- `additionalResults` Map 선언이 제거됨
|
|
11
|
+
- `createWebWorkerProcessor` 함수가 제거됨
|
|
12
|
+
- onStart 내부의 `processWebWorker` + `workerTransformer` 생성 코드가 제거됨
|
|
13
|
+
- `compileAsync` 호출에서 `additionalTransformers` 옵션이 제거됨
|
|
14
|
+
- 증분 빌드 루프에서 `additionalResults.delete(file)` 호출이 제거됨
|
|
15
15
|
|
|
16
16
|
### 추가된 코드
|
|
17
17
|
|
|
18
|
-
-
|
|
19
|
-
-
|
|
18
|
+
- `transformWorkerPatterns` import가 `./esbuild-worker-plugin`에서 추가됨 (같은 디렉토리, .js 확장자 미사용)
|
|
19
|
+
- setup 스코프에 `workerResultsByContainingFile = new Map<string, { outputFiles?: esbuild.OutputFile[]; metafile?: esbuild.Metafile }>()` 선언이 존재함 (증분 빌드 시 변경되지 않은 Worker metafile 유지 목적)
|
|
20
20
|
|
|
21
21
|
### onStart — TS 파일 Worker 패턴 처리 (Rule 1)
|
|
22
22
|
|
|
23
|
-
-
|
|
24
|
-
-
|
|
25
|
-
-
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
-
|
|
23
|
+
- 증분 빌드 시 `expandedModifiedFiles` 각 파일에 대해 `workerResultsByContainingFile.delete(file)` 호출 (선택적 제거)
|
|
24
|
+
- `emitResults` 루프에서 각 파일에 대해 `transformWorkerPatterns(contents, normalized, build)` 호출
|
|
25
|
+
- `workerResult != null`이면 `typeScriptFileCache.set(normalized, workerResult.contents)` 저장
|
|
26
|
+
- `workerResult.errors`/`workerResult.warnings`를 onStart의 `errors`/`warnings` 배열에 push
|
|
27
|
+
- `workerResult.workerMetafile != null`이면 `referencedFileTracker.add(normalized, Object.keys(workerResult.workerMetafile.inputs).map(input => path.join(cwd, input)))` 호출
|
|
28
|
+
- `workerMetafile` 또는 `workerOutputFiles`가 있으면 `workerResultsByContainingFile.set(normalized, { outputFiles, metafile })` 저장
|
|
29
|
+
- `workerResult == null`이면 기존처럼 `typeScriptFileCache.set(normalized, contents)` 저장
|
|
30
|
+
- Worker 번들 에러가 errors 배열에 포함되어 onStart 결과에 반영됨 (Scenario: 에러 전파)
|
|
31
31
|
|
|
32
32
|
### JS onLoad — .js 파일 Worker 패턴 처리 (Rule 2)
|
|
33
33
|
|
|
34
|
-
-
|
|
35
|
-
-
|
|
36
|
-
-
|
|
34
|
+
- `createCachedLoad` 콜백에서 `javascriptTransformer.transformFile` 호출 후 결과를 `TextDecoder`로 문자열로 변환
|
|
35
|
+
- 변환된 문자열에 `transformWorkerPatterns(textContents, request, build)` 적용
|
|
36
|
+
- `workerResult != null`일 때:
|
|
37
37
|
- `workerResult.workerMetafile`이 있으면 `referencedFileTracker.add` 호출
|
|
38
38
|
- `workerMetafile` 또는 `workerOutputFiles`가 있으면 `workerResultsByContainingFile.set(request, { outputFiles, metafile })` 저장
|
|
39
39
|
- 반환: `{ contents, loader: "js", resolveDir, errors (>0일때), warnings (>0일때) }` — TS/JS 에러 처리 일관성 확보 (L2 리뷰 반영)
|
|
40
|
-
-
|
|
40
|
+
- `workerResult == null`일 때 기존과 동일한 `{ contents, loader: "js", resolveDir }` 반환
|
|
41
41
|
|
|
42
42
|
### onEnd — metafile 병합 (Rule 3)
|
|
43
43
|
|
|
44
|
-
-
|
|
45
|
-
-
|
|
46
|
-
-
|
|
47
|
-
-
|
|
48
|
-
-
|
|
44
|
+
- onEnd에서 `workerResultsByContainingFile.values()` 순회
|
|
45
|
+
- 각 항목의 `outputFiles`가 있으면 `result.outputFiles?.push(...outputFiles)`
|
|
46
|
+
- 각 항목의 `metafile`이 있으면 `Object.assign(result.metafile.inputs, wr.metafile.inputs)` + `Object.assign(result.metafile.outputs, wr.metafile.outputs)`
|
|
47
|
+
- onEnd에서 Map 전체 리셋 없음 — 증분 빌드에서 변경되지 않은 Worker 결과가 다음 빌드에서도 병합됨
|
|
48
|
+
- 기존 `additionalResults` 순회 루프가 제거됨
|
|
49
49
|
|
|
50
50
|
### client config 무변경 (Rule 6)
|
|
51
51
|
|
|
52
|
-
-
|
|
53
|
-
-
|
|
52
|
+
- `esbuild-client-config.ts`에 Worker 플러그인 추가 코드가 존재하지 않음 (plugins 배열에 `createWorkerBundlePlugin` 또는 `sd-worker-bundle` 미포함)
|
|
53
|
+
- `esbuild-client-config.ts` 파일 자체가 Feature 1.2로 인해 변경되지 않음 (git diff 기준)
|
|
54
54
|
|
|
55
55
|
### 회귀 방지
|
|
56
56
|
|
|
57
|
-
-
|
|
58
|
-
-
|
|
59
|
-
-
|
|
57
|
+
- `pnpm test --run packages/sd-cli/tests/esbuild/esbuild-angular-compiler-plugin.spec.ts` 통과 (기존 plugin 구조 테스트)
|
|
58
|
+
- `pnpm test --run packages/sd-cli/tests/esbuild/esbuild-worker-plugin.spec.ts` 통과 (Feature 1.1 Unit 테스트)
|
|
59
|
+
- `pnpm test --run packages/sd-cli/tests/esbuild/esbuild-worker-plugin.acc.spec.ts` 통과 (Feature 1.1 Acceptance 테스트)
|
|
@@ -2,20 +2,20 @@
|
|
|
2
2
|
|
|
3
3
|
## 검증 항목
|
|
4
4
|
|
|
5
|
-
-
|
|
5
|
+
- **JavaScriptTransformer 초기화**: `esbuild-angular-compiler-plugin.ts:170-181` — `@angular/build/private`에서 import한 `JavaScriptTransformer`를 `{ sourcemap, thirdPartySourcemaps, advancedOptimizations, jit }` 옵션과 `maxWorkers`, `cacheStore?.createCache("jstransformer")`로 초기화. jit은 `includeTestMetadata`에 매핑됨.
|
|
6
6
|
|
|
7
|
-
-
|
|
7
|
+
- **AngularCompiler 생성 시 transformStylesheet 콜백 전달**: `esbuild-angular-compiler-plugin.ts:222-229` — `AngularCompiler` 생성자에 `pluginOptions.transformStylesheet`를 직접 전달. 미제공 시 undefined로 전달되어 AngularCompiler에서 무시됨.
|
|
8
8
|
|
|
9
|
-
-
|
|
9
|
+
- **AngularCompiler 생성 시 externalStylesheets 전달**: `esbuild-angular-compiler-plugin.ts:228` — `pluginOptions.externalStylesheets`가 AngularCompiler 옵션에 전달됨.
|
|
10
10
|
|
|
11
|
-
-
|
|
11
|
+
- **첫 빌드 시 tsconfig 파싱 → AngularCompiler 생성 → initialize()**: `esbuild-angular-compiler-plugin.ts:214-231` — `angularCompiler == null` 조건에서 `parseTsconfigFile()` → `new AngularCompiler()` → `initialize()` 순서로 호출. compilerOptionsTransformer도 전달됨.
|
|
12
12
|
|
|
13
|
-
-
|
|
13
|
+
- **emitAffectedFiles → typeScriptFileCache 저장**: `esbuild-angular-compiler-plugin.ts:235-238` — emit 결과를 `path.normalize(filename)` 키로 저장. 원본 compiler-plugin.js와 동일한 패턴.
|
|
14
14
|
|
|
15
|
-
-
|
|
15
|
+
- **onDispose에서 리소스 정리**: `esbuild-angular-compiler-plugin.ts:295-299` — `angularCompiler = undefined`, `javascriptTransformer.close()`, `cacheStore?.close()` 호출. void로 fire-and-forget 처리 (원본과 동일).
|
|
16
16
|
|
|
17
|
-
-
|
|
17
|
+
- **LMDB 캐시 초기화 실패 시 graceful degradation**: `esbuild-angular-compiler-plugin.ts:160-168` — try-catch로 감싸고 logger.warn 후 cacheStore = undefined 유지. JavaScriptTransformer에 cache 없이 초기화됨.
|
|
18
18
|
|
|
19
|
-
-
|
|
19
|
+
- **onEnd에서 additionalResults 병합**: `esbuild-angular-compiler-plugin.ts:282-292` — outputFiles push + metafile Object.assign. result.outputFiles가 undefined일 수 있으므로 optional chaining 사용.
|
|
20
20
|
|
|
21
|
-
-
|
|
21
|
+
- **onStart 에러 처리**: `esbuild-angular-compiler-plugin.ts:262-274` — catch에서 "Angular compilation failed." 에러 메시지 + stack trace를 notes에 포함. hasCompilationErrors = true 설정.
|
|
@@ -2,16 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
## 검증 항목
|
|
4
4
|
|
|
5
|
-
-
|
|
5
|
+
- 정방향 청크 배열 + join이 역순 slice와 수학적으로 동일한 결과를 생성하는가:
|
|
6
6
|
역순 slice 방식은 `code[0..start_n] + rep_n + code[end_n..start_{n-1}] + rep_{n-1} + ... + code[end_1..]` 순서로 최종 문자열을 구성한다.
|
|
7
7
|
정방향 청크 방식은 `code[0..start_1] + rep_1 + code[end_1..start_2] + rep_2 + ... + code[end_n..]` 순서로 청크를 수집하고 join한다.
|
|
8
8
|
두 방식 모두 원본 텍스트의 비교체 구간과 PostCSS 처리된 교체 텍스트를 동일한 순서로 결합하므로, replacements가 비중첩(acorn AST 노드 보장)인 한 결과가 동일하다.
|
|
9
9
|
검증 결과: **동일성 보장됨**
|
|
10
10
|
|
|
11
|
-
-
|
|
11
|
+
- cursor 초기값 0과 마지막 `code.slice(cursor)` 호출이 파일 전체를 커버하는가:
|
|
12
12
|
cursor는 0에서 시작하여 각 replacement의 end로 갱신된다. 마지막 `chunks.push(code.slice(cursor))`가 마지막 replacement 이후의 원본 텍스트를 수집한다. replacements가 0건이면 `code.slice(0)` = 전체 코드가 되지만, 이 경우 `replacements.length === 0`에서 continue되므로 도달하지 않는다.
|
|
13
13
|
검증 결과: **전체 커버됨**
|
|
14
14
|
|
|
15
|
-
-
|
|
15
|
+
- `replacements.sort()`가 원본 배열을 변경하는 것이 문제되지 않는가:
|
|
16
16
|
`replacements`는 각 파일 처리 시 새로 생성되는 로컬 배열이므로 in-place sort가 안전하다. 기존 코드도 동일하게 in-place sort를 사용했다.
|
|
17
17
|
검증 결과: **문제 없음**
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
## 검증 항목
|
|
4
4
|
|
|
5
|
-
-
|
|
6
|
-
-
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
5
|
+
- `esbuild-tsc-plugin.ts`에서 `runTscPackageBuild`/`parseTsconfig` import 제거됨: Grep 결과 0건
|
|
6
|
+
- `esbuild-tsc-plugin.ts`에서 `SdTsCompiler` import 존재: `import { SdTsCompiler } from "../ts-compiler/SdTsCompiler"` (line 4)
|
|
7
|
+
- `TscPluginOptions`에 `lint?: boolean` 필드 존재: `esbuild-tsc-plugin.ts` 인터페이스 확인
|
|
8
|
+
- `TscPluginResult`에 `getLintResult()` getter 존재: `esbuild-tsc-plugin.ts` 인터페이스 확인
|
|
9
|
+
- `server-build.worker.ts`에서 `runTscPackageBuild` import 제거됨: Grep 결과 0건
|
|
10
|
+
- `server-build.worker.ts`에서 `LintWithProgramRunner` import 제거됨: Grep 결과 0건
|
|
11
|
+
- `server-build.worker.ts`에서 `SdTsCompiler` import 존재: `import { SdTsCompiler } from "../ts-compiler/SdTsCompiler"` 확인
|
|
12
|
+
- `server-esbuild-context.ts`에 `getTscLintResult()` 위임 메서드 존재: 코드 확인
|
|
13
|
+
- `server-esbuild-context.ts`의 `EsbuildContextOptions.tsc`에 `lint?: boolean` 존재: 코드 확인
|