@simplysm/sd-cli 14.0.19 → 14.0.22

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.
Files changed (114) hide show
  1. package/dist/angular/vite-postcss-inline-plugin.d.ts.map +1 -1
  2. package/dist/angular/vite-postcss-inline-plugin.js +4 -1
  3. package/dist/angular/vite-postcss-inline-plugin.js.map +1 -1
  4. package/dist/capacitor/capacitor-android.d.ts +16 -0
  5. package/dist/capacitor/capacitor-android.d.ts.map +1 -0
  6. package/dist/capacitor/capacitor-android.js +289 -0
  7. package/dist/capacitor/capacitor-android.js.map +1 -0
  8. package/dist/capacitor/capacitor.d.ts +0 -49
  9. package/dist/capacitor/capacitor.d.ts.map +1 -1
  10. package/dist/capacitor/capacitor.js +4 -244
  11. package/dist/capacitor/capacitor.js.map +1 -1
  12. package/dist/commands/check.js +2 -2
  13. package/dist/commands/check.js.map +1 -1
  14. package/dist/commands/lint.d.ts +1 -42
  15. package/dist/commands/lint.d.ts.map +1 -1
  16. package/dist/commands/lint.js +1 -151
  17. package/dist/commands/lint.js.map +1 -1
  18. package/dist/commands/publish.d.ts.map +1 -1
  19. package/dist/commands/publish.js +2 -1
  20. package/dist/commands/publish.js.map +1 -1
  21. package/dist/commands/typecheck.d.ts +3 -40
  22. package/dist/commands/typecheck.d.ts.map +1 -1
  23. package/dist/commands/typecheck.js +3 -232
  24. package/dist/commands/typecheck.js.map +1 -1
  25. package/dist/electron/electron.js +11 -4
  26. package/dist/electron/electron.js.map +1 -1
  27. package/dist/engines/ViteEngine.js +1 -1
  28. package/dist/engines/ViteEngine.js.map +1 -1
  29. package/dist/engines/types.d.ts +2 -0
  30. package/dist/engines/types.d.ts.map +1 -1
  31. package/dist/infra/ResultCollector.d.ts +2 -2
  32. package/dist/infra/ResultCollector.d.ts.map +1 -1
  33. package/dist/infra/ResultCollector.js +1 -1
  34. package/dist/orchestrators/DevWatchOrchestrator.d.ts +2 -1
  35. package/dist/orchestrators/DevWatchOrchestrator.d.ts.map +1 -1
  36. package/dist/orchestrators/DevWatchOrchestrator.js +28 -16
  37. package/dist/orchestrators/DevWatchOrchestrator.js.map +1 -1
  38. package/dist/orchestrators/TypecheckOrchestrator.d.ts +74 -0
  39. package/dist/orchestrators/TypecheckOrchestrator.d.ts.map +1 -0
  40. package/dist/orchestrators/TypecheckOrchestrator.js +285 -0
  41. package/dist/orchestrators/TypecheckOrchestrator.js.map +1 -0
  42. package/dist/sd-cli.js +6 -1
  43. package/dist/sd-cli.js.map +1 -1
  44. package/dist/utils/lint-core.d.ts +43 -0
  45. package/dist/utils/lint-core.d.ts.map +1 -0
  46. package/dist/utils/lint-core.js +154 -0
  47. package/dist/utils/lint-core.js.map +1 -0
  48. package/dist/utils/lint-utils.d.ts +1 -1
  49. package/dist/utils/lint-utils.d.ts.map +1 -1
  50. package/dist/utils/output-utils.d.ts +2 -2
  51. package/dist/utils/output-utils.d.ts.map +1 -1
  52. package/dist/utils/output-utils.js.map +1 -1
  53. package/dist/utils/server-production-files.d.ts +22 -0
  54. package/dist/utils/server-production-files.d.ts.map +1 -0
  55. package/dist/utils/server-production-files.js +162 -0
  56. package/dist/utils/server-production-files.js.map +1 -0
  57. package/dist/utils/vite-config.js.map +1 -1
  58. package/dist/workers/client.worker.d.ts.map +1 -1
  59. package/dist/workers/client.worker.js +7 -1
  60. package/dist/workers/client.worker.js.map +1 -1
  61. package/dist/workers/lint.worker.d.ts +1 -1
  62. package/dist/workers/lint.worker.d.ts.map +1 -1
  63. package/dist/workers/lint.worker.js +1 -1
  64. package/dist/workers/lint.worker.js.map +1 -1
  65. package/dist/workers/server-build.worker.d.ts.map +1 -1
  66. package/dist/workers/server-build.worker.js +12 -161
  67. package/dist/workers/server-build.worker.js.map +1 -1
  68. package/package.json +4 -4
  69. package/src/angular/vite-postcss-inline-plugin.ts +5 -1
  70. package/src/capacitor/capacitor-android.ts +368 -0
  71. package/src/capacitor/capacitor.ts +4 -317
  72. package/src/commands/check.ts +2 -2
  73. package/src/commands/lint.ts +1 -201
  74. package/src/commands/publish.ts +2 -1
  75. package/src/commands/typecheck.ts +7 -292
  76. package/src/electron/electron.ts +4 -4
  77. package/src/engines/ViteEngine.ts +1 -1
  78. package/src/engines/types.ts +3 -0
  79. package/src/infra/ResultCollector.ts +2 -2
  80. package/src/orchestrators/DevWatchOrchestrator.ts +35 -20
  81. package/src/orchestrators/TypecheckOrchestrator.ts +364 -0
  82. package/src/sd-cli.ts +6 -1
  83. package/src/utils/lint-core.ts +205 -0
  84. package/src/utils/lint-utils.ts +1 -1
  85. package/src/utils/output-utils.ts +3 -3
  86. package/src/utils/server-production-files.ts +186 -0
  87. package/src/utils/vite-config.ts +1 -1
  88. package/src/workers/client.worker.ts +7 -1
  89. package/src/workers/lint.worker.ts +1 -1
  90. package/src/workers/server-build.worker.ts +11 -185
  91. package/tests/angular/vite-postcss-inline-plugin.spec.ts +10 -0
  92. package/tests/capacitor/capacitor-android-exports.verify.md +11 -0
  93. package/tests/capacitor/capacitor-android.spec.ts +219 -0
  94. package/tests/capacitor/capacitor-build.spec.ts +17 -21
  95. package/tests/capacitor/capacitor-icon.spec.ts +17 -19
  96. package/tests/capacitor/capacitor-init.spec.ts +18 -14
  97. package/tests/capacitor/capacitor-run.spec.ts +10 -24
  98. package/tests/capacitor/capacitor-workspace.spec.ts +10 -15
  99. package/tests/commands/check.spec.ts +2 -2
  100. package/tests/commands/lint.spec.ts +33 -194
  101. package/tests/commands/publish-set.verify.md +7 -0
  102. package/tests/electron/electron-symlink-cleanup.verify.md +8 -0
  103. package/tests/engines/vite-engine.spec.ts +29 -0
  104. package/tests/infra/result-collector.spec.ts +11 -0
  105. package/tests/orchestrators/dev-watch-orchestrator.spec.ts +70 -0
  106. package/tests/orchestrators/dist-delete-watcher.verify.md +10 -0
  107. package/tests/orchestrators/typecheck-orchestrator.spec.ts +180 -0
  108. package/tests/sd-cli-catch-all.verify.md +7 -0
  109. package/tests/utils/lint-core-import-paths.verify.md +10 -0
  110. package/tests/utils/lint-core.spec.ts +188 -0
  111. package/tests/utils/server-production-files-import-paths.verify.md +14 -0
  112. package/tests/workers/client-worker.spec.ts +92 -0
  113. package/tests/workers/server-build-context-dispose.verify.md +8 -0
  114. package/tests/workers/server-build-worker.spec.ts +39 -0
@@ -0,0 +1,285 @@
1
+ import ts from "typescript";
2
+ import { err as errNs } from "@simplysm/core-common";
3
+ import { pathx } from "@simplysm/core-node";
4
+ import { consola } from "consola";
5
+ import { loadSdConfig } from "../utils/sd-config.js";
6
+ import { deserializeDiagnostic } from "../utils/typecheck-serialization.js";
7
+ import { createBuildEngine } from "../engines/index.js";
8
+ import { typecheckNonPackageFiles } from "../utils/typecheck-non-package.js";
9
+ import { runWithConcurrency, getMaxConcurrency } from "../utils/concurrency.js";
10
+ import { discoverWorkspacePackages, mergeTestsPackagesIntoConfig } from "../utils/package-utils.js";
11
+ import { toTypecheckEnvs } from "../utils/tsconfig.js";
12
+ //#endregion
13
+ //#region Utilities
14
+ const TARGET_PATH_PATTERN = /^(?:packages|tests)\/([^/]+)/;
15
+ /**
16
+ * 대상 경로에서 패키지명을 추출한다.
17
+ * "packages/core-common" → "core-common"
18
+ * "tests/orm" → "orm"
19
+ */
20
+ function extractTargetPackageNames(targets) {
21
+ const names = new Set();
22
+ for (const target of targets) {
23
+ const match = target.match(TARGET_PATH_PATTERN);
24
+ if (match)
25
+ names.add(match[1]);
26
+ }
27
+ return names;
28
+ }
29
+ //#endregion
30
+ //#region TypecheckOrchestrator
31
+ /**
32
+ * 타입체크를 조율하는 Orchestrator
33
+ *
34
+ * BuildOrchestrator/DevWatchOrchestrator와 동일한 initialize() → start() → shutdown() 생명주기를 따른다.
35
+ * sd.config.ts 기반으로 패키지를 분류하고, BuildEngine을 사용하여 타입체크를 실행한다.
36
+ */
37
+ export class TypecheckOrchestrator {
38
+ _cwd;
39
+ _options;
40
+ _logger = consola.withTag("sd:cli:typecheck");
41
+ // initialize()에서 설정되는 내부 상태
42
+ _typecheckTasks = [];
43
+ _scriptsPackagePaths = [];
44
+ _includeNonPackage = false;
45
+ constructor(options) {
46
+ this._cwd = process.cwd();
47
+ this._options = options;
48
+ }
49
+ /**
50
+ * Initialize Orchestrator
51
+ * - Load sd.config.ts
52
+ * - Discover workspace packages and merge tests
53
+ * - Classify packages into typecheck tasks
54
+ * - Collect scripts package paths
55
+ */
56
+ async initialize() {
57
+ const { targets } = this._options;
58
+ const phaseLabel = this._options.lint === true ? "타입체크/린트" : "타입체크";
59
+ this._logger.debug(`${phaseLabel} 시작`, { targets, lint: this._options.lint });
60
+ // sd.config.ts 로드
61
+ const sdConfig = await loadSdConfig({ cwd: this._cwd, dev: false, opt: this._options.options });
62
+ this._logger.debug("sd.config.ts 로드 완료");
63
+ // 워크스페이스 패키지 탐색 및 tests/를 설정에 병합
64
+ const workspacePackages = discoverWorkspacePackages(this._cwd);
65
+ const { merged, pathMap } = mergeTestsPackagesIntoConfig(sdConfig.packages, workspacePackages);
66
+ // 경로 기반 대상에서 패키지명 결정
67
+ const targetNames = extractTargetPackageNames(targets);
68
+ // 타입체크할 패키지 수집 (scripts 제외), env별로 확장
69
+ for (const [name, config] of Object.entries(merged)) {
70
+ if (config == null)
71
+ continue;
72
+ if (config.target === "scripts") {
73
+ if (targets.length === 0 || targetNames.has(name)) {
74
+ const relPath = pathMap.get(name) ?? `packages/${name}`;
75
+ this._scriptsPackagePaths.push(relPath);
76
+ }
77
+ continue;
78
+ }
79
+ if (targets.length > 0 && !targetNames.has(name))
80
+ continue;
81
+ const relPath = pathMap.get(name) ?? `packages/${name}`;
82
+ // 클라이언트 패키지의 경우 browser 타겟을 사용하여 createBuildEngine이 ViteEngine 대신 NgtscEngine으로 라우팅되도록 함
83
+ const typecheckConfig = config.target === "client" ? { target: "browser" } : config;
84
+ const envs = toTypecheckEnvs(config.target);
85
+ for (const env of envs) {
86
+ this._typecheckTasks.push({
87
+ name,
88
+ dir: pathx.posixResolve(this._cwd, relPath),
89
+ config: typecheckConfig,
90
+ env,
91
+ });
92
+ }
93
+ }
94
+ // 비패키지 타입체크: 대상이 지정되지 않은 경우에만 (= 전체 검사)
95
+ this._includeNonPackage = targets.length === 0;
96
+ }
97
+ /**
98
+ * 타입체크 실행
99
+ * - 엔진 생성 및 동시성 제어된 실행
100
+ * - 비패키지 타입체크
101
+ * - 결과 집계 및 포맷 출력 생성
102
+ *
103
+ * @returns 타입체크 결과
104
+ */
105
+ async start() {
106
+ const phaseLabel = this._options.lint === true ? "타입체크/린트" : "타입체크";
107
+ const formatHost = {
108
+ getCanonicalFileName: (f) => f,
109
+ getCurrentDirectory: () => this._cwd,
110
+ getNewLine: () => ts.sys.newLine,
111
+ };
112
+ if (this._typecheckTasks.length === 0 && !this._includeNonPackage) {
113
+ this._logger.info(`${phaseLabel} 대상 없음`);
114
+ return {
115
+ success: true,
116
+ errorCount: 0,
117
+ warningCount: 0,
118
+ formattedOutput: `✔ ${phaseLabel} 대상 없음.\n`,
119
+ scriptsPackagePaths: this._scriptsPackagePaths.length > 0 ? this._scriptsPackagePaths : undefined,
120
+ };
121
+ }
122
+ // 동시성 제한이 있는 BuildEngine 작업 생성
123
+ const allDiagnostics = [];
124
+ let totalErrorCount = 0;
125
+ let totalWarningCount = 0;
126
+ const fileCache = new Map();
127
+ // Lint 결과 집계
128
+ let lintErrorCount = 0;
129
+ let lintWarningCount = 0;
130
+ let lintSuccess = true;
131
+ const lintOutputs = [];
132
+ if (this._typecheckTasks.length > 0) {
133
+ const tasks = this._typecheckTasks.map((task) => async () => {
134
+ const label = `${task.name}:${task.env}`;
135
+ const engine = createBuildEngine({ name: task.name, dir: task.dir, config: task.config }, { cwd: this._cwd });
136
+ try {
137
+ this._logger.debug(`[${label}] 타입체크 시작됨`);
138
+ const result = await engine.run({
139
+ js: false,
140
+ dts: false,
141
+ env: task.env,
142
+ includeTests: true,
143
+ ...(this._options.lint === true ? { lint: true } : {}),
144
+ });
145
+ this._logger.debug(`[${label}] 타입체크 ${result.build.success ? "완료" : "실패"}`);
146
+ return result;
147
+ }
148
+ catch (err) {
149
+ const message = errNs.message(err);
150
+ const stack = err instanceof Error ? err.stack : undefined;
151
+ this._logger.error(`[${label}] 엔진 작업 실패: ${message}`);
152
+ if (stack != null) {
153
+ this._logger.debug(`[${label}] 스택 트레이스:\n${stack}`);
154
+ }
155
+ return {
156
+ build: {
157
+ success: false,
158
+ errors: [`[${label}] ${message}`],
159
+ warnings: [],
160
+ diagnostics: [],
161
+ },
162
+ };
163
+ }
164
+ finally {
165
+ await engine.stop();
166
+ }
167
+ });
168
+ const concurrency = getMaxConcurrency();
169
+ this._logger.start(`${phaseLabel} 실행 중... (${tasks.length}개 작업, 동시성: ${concurrency})`);
170
+ const results = await runWithConcurrency(tasks, concurrency);
171
+ this._logger.success(`${phaseLabel} 실행 완료`);
172
+ // 엔진 결과 집계 (모든 task는 catch로 인해 항상 fulfilled)
173
+ for (const settled of results) {
174
+ if (settled.status !== "fulfilled")
175
+ continue;
176
+ const engineResult = settled.value;
177
+ const buildDiags = engineResult.build.diagnostics.map((d) => deserializeDiagnostic(d, fileCache));
178
+ allDiagnostics.push(...buildDiags);
179
+ // 역직렬화된 진단 정보에서 에러/경고 수 집계
180
+ // 숫자 카테고리 값 사용 (ts.DiagnosticCategory: Error=1, Warning=0)
181
+ totalErrorCount += buildDiags.filter((d) => d.category === 1).length;
182
+ totalWarningCount += buildDiags.filter((d) => d.category === 0).length;
183
+ if (!engineResult.build.success && buildDiags.length === 0) {
184
+ for (const errMsg of engineResult.build.errors) {
185
+ allDiagnostics.push({
186
+ category: 1,
187
+ code: 0,
188
+ messageText: errMsg,
189
+ file: undefined,
190
+ start: undefined,
191
+ length: undefined,
192
+ });
193
+ }
194
+ totalErrorCount += engineResult.build.errors.length || 1;
195
+ }
196
+ // Lint 결과 수집
197
+ if (engineResult.lint != null) {
198
+ lintErrorCount += engineResult.lint.errorCount;
199
+ lintWarningCount += engineResult.lint.warningCount;
200
+ if (!engineResult.lint.success)
201
+ lintSuccess = false;
202
+ if (engineResult.lint.formattedOutput !== "") {
203
+ lintOutputs.push(engineResult.lint.formattedOutput);
204
+ }
205
+ }
206
+ }
207
+ }
208
+ // 비패키지 타입체크
209
+ if (this._includeNonPackage) {
210
+ this._logger.debug("비패키지 타입체크 실행 중");
211
+ const nonPkgResult = typecheckNonPackageFiles(this._cwd);
212
+ totalErrorCount += nonPkgResult.errorCount;
213
+ totalWarningCount += nonPkgResult.warningCount;
214
+ const nonPkgDiags = nonPkgResult.diagnostics.map((d) => deserializeDiagnostic(d, fileCache));
215
+ allDiagnostics.push(...nonPkgDiags);
216
+ }
217
+ // 요약 로그
218
+ const resultMeta = {
219
+ errorCount: totalErrorCount,
220
+ warningCount: totalWarningCount,
221
+ };
222
+ if (this._options.lint === true) {
223
+ resultMeta["lintErrorCount"] = lintErrorCount;
224
+ resultMeta["lintWarningCount"] = lintWarningCount;
225
+ }
226
+ if (totalErrorCount > 0) {
227
+ this._logger.error(`${phaseLabel} 에러 발생`, resultMeta);
228
+ }
229
+ else {
230
+ this._logger.info(`${phaseLabel} 완료`, resultMeta);
231
+ }
232
+ // 진단 출력 포매팅
233
+ let formattedOutput = "";
234
+ if (allDiagnostics.length > 0) {
235
+ const uniqueDiagnostics = ts.sortAndDeduplicateDiagnostics(allDiagnostics);
236
+ formattedOutput = ts.formatDiagnosticsWithColorAndContext(uniqueDiagnostics, formatHost);
237
+ }
238
+ // lint가 요청된 경우 lint 결과 생성
239
+ const lintResult = this._options.lint === true
240
+ ? {
241
+ success: lintSuccess,
242
+ errorCount: lintErrorCount,
243
+ warningCount: lintWarningCount,
244
+ formattedOutput: lintOutputs.join("\n"),
245
+ }
246
+ : undefined;
247
+ return {
248
+ success: totalErrorCount === 0,
249
+ errorCount: totalErrorCount,
250
+ warningCount: totalWarningCount,
251
+ formattedOutput,
252
+ lint: lintResult,
253
+ scriptsPackagePaths: this._scriptsPackagePaths.length > 0 ? this._scriptsPackagePaths : undefined,
254
+ };
255
+ }
256
+ /**
257
+ * Orchestrator 종료 (현재 정리할 리소스 없음)
258
+ */
259
+ async shutdown() {
260
+ // 타입체크는 일회성 작업이므로 종료 시 정리할 리소스가 없음
261
+ // 엔진은 각 작업 내에서 stop()으로 정리됨
262
+ await Promise.resolve();
263
+ }
264
+ }
265
+ //#endregion
266
+ //#region Convenience Function
267
+ /**
268
+ * TypecheckOrchestrator의 전체 생명주기를 래핑한 편의 함수.
269
+ * initialize() → start() → shutdown() 순서로 호출한다.
270
+ *
271
+ * @param options - 타입체크 실행 옵션
272
+ * @returns 타입체크 결과
273
+ */
274
+ export async function executeTypecheck(options) {
275
+ const orchestrator = new TypecheckOrchestrator(options);
276
+ await orchestrator.initialize();
277
+ try {
278
+ return await orchestrator.start();
279
+ }
280
+ finally {
281
+ await orchestrator.shutdown();
282
+ }
283
+ }
284
+ //#endregion
285
+ //# sourceMappingURL=TypecheckOrchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TypecheckOrchestrator.js","sourceRoot":"","sources":["../../src/orchestrators/TypecheckOrchestrator.ts"],"names":[],"mappings":"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"}
package/dist/sd-cli.js CHANGED
@@ -6,6 +6,7 @@
6
6
  * .js 실행 (프로덕션): replaceDeps 실행 후 새 프로세스에서 sd-cli-entry 실행
7
7
  */
8
8
  import { cpx } from "@simplysm/core-node";
9
+ import { consola } from "consola";
9
10
  import os from "os";
10
11
  import path from "path";
11
12
  import { fileURLToPath } from "url";
@@ -31,8 +32,12 @@ else {
31
32
  await setupReplaceDeps(process.cwd(), sdConfig.replaceDeps);
32
33
  }
33
34
  }
34
- catch {
35
+ catch (err) {
35
36
  // sd.config.ts가 없거나 replaceDeps가 설정되지 않으면 건너뜀
37
+ const code = err instanceof Error && "code" in err ? err.code : undefined;
38
+ if (code !== "MODULE_NOT_FOUND" && code !== "ERR_MODULE_NOT_FOUND") {
39
+ consola.warn("[sd-cli] replaceDeps 사전 설정 실패:", err instanceof Error ? err.message : err);
40
+ }
36
41
  }
37
42
  // Phase 2: 실제 CLI를 새 프로세스로 실행 (모듈 캐시 초기화)
38
43
  const cliEntryFilePath = path.join(__dirname, "sd-cli-entry.js");
@@ -1 +1 @@
1
- {"version":3,"file":"sd-cli.js","sourceRoot":"","sources":["../src/sd-cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sd-cli.js","sourceRoot":"","sources":["../src/sd-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * ESLint 실행 옵션
3
+ */
4
+ export interface LintOptions {
5
+ /** 린트 대상 경로 필터 (예: `packages/core-common`). 빈 배열이면 전체 대상 */
6
+ targets: string[];
7
+ /** 자동 수정 활성화 */
8
+ fix: boolean;
9
+ /** ESLint 규칙별 실행 시간 측정 활성화 (TIMING 환경변수 설정) */
10
+ timing: boolean;
11
+ }
12
+ /**
13
+ * executeLint()의 반환 타입
14
+ */
15
+ export interface LintResult {
16
+ /** 린트 에러가 없으면 true */
17
+ success: boolean;
18
+ /** ESLint 전체 에러 수 */
19
+ errorCount: number;
20
+ /** ESLint 전체 경고 수 */
21
+ warningCount: number;
22
+ /** 포매터 출력 문자열 (stdout에 출력할 내용) */
23
+ formattedOutput: string;
24
+ }
25
+ /**
26
+ * eslint.config.ts/js에서 globalIgnores 패턴을 추출한다.
27
+ * ignores만 있고 files가 없는 설정 객체가 globalIgnores이다.
28
+ * @internal 테스트용으로 export
29
+ */
30
+ export declare function loadIgnorePatterns(cwd: string): Promise<string[]>;
31
+ /**
32
+ * ESLint를 실행하고 결과를 반환한다.
33
+ *
34
+ * - `eslint.config.ts/js`에서 globalIgnores 패턴을 추출하여 glob 필터링에 적용
35
+ * - consola를 사용하여 진행 상황 표시
36
+ * - 캐시 활성화 (`.cache/eslint.cache`에 저장, 설정 변경 시 자동 무효화)
37
+ * - stdout 출력이나 process.exitCode 설정 없음 (호출자가 결정)
38
+ *
39
+ * @param options - 린트 실행 옵션
40
+ * @returns 린트 결과 (성공 여부, 에러/경고 수, 포매터 출력)
41
+ */
42
+ export declare function executeLint(options: LintOptions): Promise<LintResult>;
43
+ //# sourceMappingURL=lint-core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint-core.d.ts","sourceRoot":"","sources":["../../src/utils/lint-core.ts"],"names":[],"mappings":"AASA;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,4DAA4D;IAC5D,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,gBAAgB;IAChB,GAAG,EAAE,OAAO,CAAC;IACb,+CAA+C;IAC/C,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,sBAAsB;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,qBAAqB;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,qBAAqB;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,kCAAkC;IAClC,eAAe,EAAE,MAAM,CAAC;CACzB;AA0BD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAuCvE;AAMD;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAkF3E"}
@@ -0,0 +1,154 @@
1
+ import { ESLint } from "eslint";
2
+ import { createJiti } from "jiti";
3
+ import path from "path";
4
+ import { fsx, pathx } from "@simplysm/core-node";
5
+ import { env, SdError } from "@simplysm/core-common";
6
+ import { consola } from "consola";
7
+ //#endregion
8
+ //#region Utilities
9
+ /** ESLint 설정 파일 검색 순서 */
10
+ const ESLINT_CONFIG_FILES = [
11
+ "eslint.config.ts",
12
+ "eslint.config.mts",
13
+ "eslint.config.js",
14
+ "eslint.config.mjs",
15
+ ];
16
+ /**
17
+ * ESLint 설정 객체가 ignores 속성만 가지고 있는지 확인하는 타입 가드
18
+ */
19
+ function isGlobalIgnoresConfig(item) {
20
+ if (item == null || typeof item !== "object")
21
+ return false;
22
+ if (!("ignores" in item))
23
+ return false;
24
+ if ("files" in item)
25
+ return false; // files가 있으면 globalIgnores가 아님
26
+ const ignores = item.ignores;
27
+ if (!Array.isArray(ignores))
28
+ return false;
29
+ return ignores.every((i) => typeof i === "string");
30
+ }
31
+ /**
32
+ * eslint.config.ts/js에서 globalIgnores 패턴을 추출한다.
33
+ * ignores만 있고 files가 없는 설정 객체가 globalIgnores이다.
34
+ * @internal 테스트용으로 export
35
+ */
36
+ export async function loadIgnorePatterns(cwd) {
37
+ let configPath;
38
+ for (const f of ESLINT_CONFIG_FILES) {
39
+ const p = path.join(cwd, f);
40
+ if (await fsx.exists(p)) {
41
+ configPath = p;
42
+ break;
43
+ }
44
+ }
45
+ if (configPath == null) {
46
+ throw new SdError(`ESLint 설정 파일을 찾을 수 없습니다 (cwd: ${cwd}): ${ESLINT_CONFIG_FILES.join(", ")}`);
47
+ }
48
+ const jiti = createJiti(import.meta.url);
49
+ const configModule = await jiti.import(configPath);
50
+ let configs;
51
+ if (Array.isArray(configModule)) {
52
+ configs = configModule;
53
+ }
54
+ else if (configModule != null &&
55
+ typeof configModule === "object" &&
56
+ "default" in configModule) {
57
+ configs = configModule.default;
58
+ }
59
+ else {
60
+ throw new SdError(`ESLint 설정 파일의 형식이 올바르지 않습니다: ${configPath}`);
61
+ }
62
+ if (!Array.isArray(configs)) {
63
+ throw new SdError(`ESLint 설정이 배열이 아닙니다: ${configPath}`);
64
+ }
65
+ return configs.filter(isGlobalIgnoresConfig).flatMap((item) => item.ignores);
66
+ }
67
+ //#endregion
68
+ //#region Main
69
+ /**
70
+ * ESLint를 실행하고 결과를 반환한다.
71
+ *
72
+ * - `eslint.config.ts/js`에서 globalIgnores 패턴을 추출하여 glob 필터링에 적용
73
+ * - consola를 사용하여 진행 상황 표시
74
+ * - 캐시 활성화 (`.cache/eslint.cache`에 저장, 설정 변경 시 자동 무효화)
75
+ * - stdout 출력이나 process.exitCode 설정 없음 (호출자가 결정)
76
+ *
77
+ * @param options - 린트 실행 옵션
78
+ * @returns 린트 결과 (성공 여부, 에러/경고 수, 포매터 출력)
79
+ */
80
+ export async function executeLint(options) {
81
+ const { targets, fix, timing } = options;
82
+ const cwd = process.cwd();
83
+ const logger = consola.withTag("sd:cli:lint");
84
+ logger.debug("린트 시작", { targets, fix, timing });
85
+ // TIMING 환경변수 설정
86
+ if (timing) {
87
+ env("TIMING", "1");
88
+ }
89
+ // ESLint 설정 로드
90
+ logger.start("ESLint 설정 로딩 중");
91
+ const ignorePatterns = await loadIgnorePatterns(cwd);
92
+ logger.debug("무시 패턴 로드 완료", { ignorePatternCount: ignorePatterns.length });
93
+ logger.success(`ESLint 설정 로드 완료 (${ignorePatterns.length}개 무시 패턴)`);
94
+ // 린트 대상 파일 수집
95
+ logger.start("린트 대상 파일 수집 중");
96
+ let files = await fsx.glob("**/*.{ts,js,mjs,cjs}", {
97
+ cwd,
98
+ ignore: ignorePatterns,
99
+ nodir: true,
100
+ absolute: true,
101
+ });
102
+ files = pathx.filterByTargets(files, targets, cwd);
103
+ logger.debug("파일 수집 완료", { fileCount: files.length });
104
+ logger.success(`린트 대상 파일 수집 완료 (${files.length}개 파일)`);
105
+ // 린트 실행
106
+ let eslint;
107
+ let eslintResults;
108
+ if (files.length > 0) {
109
+ logger.start(`린트 실행 중... (${files.length}개 파일)`);
110
+ eslint = new ESLint({
111
+ cwd,
112
+ fix,
113
+ cache: true,
114
+ cacheLocation: path.join(cwd, ".cache", "eslint.cache"),
115
+ });
116
+ eslintResults = await eslint.lintFiles(files);
117
+ logger.success("린트 실행 완료");
118
+ // 자동 수정 적용
119
+ if (fix) {
120
+ logger.debug("자동 수정 적용 중...");
121
+ await ESLint.outputFixes(eslintResults);
122
+ logger.debug("자동 수정 적용 완료");
123
+ }
124
+ }
125
+ // 파일이 없거나 린트가 실행되지 않은 경우 성공 결과 반환
126
+ if (files.length === 0 || eslintResults == null || eslint == null) {
127
+ logger.info("린트할 파일 없음");
128
+ return { success: true, errorCount: 0, warningCount: 0, formattedOutput: "" };
129
+ }
130
+ // 결과 집계
131
+ let errorCount = eslintResults.sum((r) => r.errorCount);
132
+ let warningCount = eslintResults.sum((r) => r.warningCount);
133
+ if (errorCount > 0) {
134
+ logger.error("린트 에러 발생", { errorCount, warningCount });
135
+ }
136
+ else {
137
+ logger.info("린트 완료", { errorCount, warningCount });
138
+ }
139
+ // 포매터 출력 수집
140
+ let formattedOutput = "";
141
+ const formatter = await eslint.loadFormatter("stylish");
142
+ const resultText = await formatter.format(eslintResults);
143
+ if (resultText) {
144
+ formattedOutput += resultText;
145
+ }
146
+ return {
147
+ success: errorCount === 0,
148
+ errorCount,
149
+ warningCount,
150
+ formattedOutput,
151
+ };
152
+ }
153
+ //#endregion
154
+ //# sourceMappingURL=lint-core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint-core.js","sourceRoot":"","sources":["../../src/utils/lint-core.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { LintOptions, LintResult } from "../commands/lint";
1
+ import type { LintOptions, LintResult } from "./lint-core";
2
2
  /**
3
3
  * lint Worker를 생성하고 실행한 뒤 terminate하는 공통 유틸.
4
4
  * BuildOrchestrator.start()와 check.ts에서 호출한다.
@@ -1 +1 @@
1
- {"version":3,"file":"lint-utils.d.ts","sourceRoot":"","sources":["../../src/utils/lint-utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGhE;;;GAGG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAQ/E"}
1
+ {"version":3,"file":"lint-utils.d.ts","sourceRoot":"","sources":["../../src/utils/lint-utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG3D;;;GAGG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAQ/E"}
@@ -7,11 +7,11 @@ export declare function formatBuildMessages(name: string, label: string, message
7
7
  * 에러만 출력한다.
8
8
  * @param results 패키지별 빌드 결과 상태
9
9
  */
10
- export declare function printErrors(results: Map<string, BuildResult>): void;
10
+ export declare function printErrors(results: ReadonlyMap<string, BuildResult>): void;
11
11
  /**
12
12
  * 서버 URL만 출력한다.
13
13
  * @param results 패키지별 빌드 결과 상태
14
14
  * @param serverClientsMap 서버별 연결된 클라이언트 목록
15
15
  */
16
- export declare function printServers(results: Map<string, BuildResult>, serverClientsMap?: Map<string, string[]>): void;
16
+ export declare function printServers(results: ReadonlyMap<string, BuildResult>, serverClientsMap?: ReadonlyMap<string, string[]>): void;
17
17
  //# sourceMappingURL=output-utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"output-utils.d.ts","sourceRoot":"","sources":["../../src/utils/output-utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAQ3F;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,IAAI,CAWnE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EACjC,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GACvC,IAAI,CAyBN"}
1
+ {"version":3,"file":"output-utils.d.ts","sourceRoot":"","sources":["../../src/utils/output-utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAQ3F;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,IAAI,CAW3E;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,EACzC,gBAAgB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAC/C,IAAI,CAyBN"}
@@ -1 +1 @@
1
- {"version":3,"file":"output-utils.js","sourceRoot":"","sources":["../../src/utils/output-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGlC;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,KAAa,EAAE,QAAkB;IACjF,MAAM,KAAK,GAAa,CAAC,GAAG,IAAI,KAAK,KAAK,GAAG,CAAC,CAAC;IAC/C,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,OAAiC;IAC3D,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QACtC,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;YAClE,IAAI,MAAM,CAAC,OAAO,IAAI,IAAI,IAAI,MAAM,CAAC,OAAO,KAAK,EAAE,EAAE,CAAC;gBACpD,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC/E,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,MAAM,SAAS,MAAM,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAC1B,OAAiC,EACjC,gBAAwC;IAExC,WAAW;IACX,MAAM,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;IAE9F,2BAA2B;IAC3B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,mCAAmC;gBACnC,MAAM,OAAO,GAAG,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACzD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,KAAK,MAAM,UAAU,IAAI,OAAO,EAAE,CAAC;wBACjC,OAAO,CAAC,IAAI,CAAC,6BAA6B,MAAM,CAAC,IAAI,IAAI,UAAU,GAAG,CAAC,CAAC;oBAC1E,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,8BAA8B;oBAC9B,OAAO,CAAC,IAAI,CAAC,6BAA6B,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;gBAC5D,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,wBAAwB;gBACxB,OAAO,CAAC,IAAI,CAAC,6BAA6B,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"output-utils.js","sourceRoot":"","sources":["../../src/utils/output-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGlC;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,KAAa,EAAE,QAAkB;IACjF,MAAM,KAAK,GAAa,CAAC,GAAG,IAAI,KAAK,KAAK,GAAG,CAAC,CAAC;IAC/C,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,OAAyC;IACnE,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QACtC,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;YAClE,IAAI,MAAM,CAAC,OAAO,IAAI,IAAI,IAAI,MAAM,CAAC,OAAO,KAAK,EAAE,EAAE,CAAC;gBACpD,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC/E,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,MAAM,SAAS,MAAM,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAC1B,OAAyC,EACzC,gBAAgD;IAEhD,WAAW;IACX,MAAM,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;IAE9F,2BAA2B;IAC3B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,mCAAmC;gBACnC,MAAM,OAAO,GAAG,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACzD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,KAAK,MAAM,UAAU,IAAI,OAAO,EAAE,CAAC;wBACjC,OAAO,CAAC,IAAI,CAAC,6BAA6B,MAAM,CAAC,IAAI,IAAI,UAAU,GAAG,CAAC,CAAC;oBAC1E,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,8BAA8B;oBAC9B,OAAO,CAAC,IAAI,CAAC,6BAA6B,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;gBAC5D,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,wBAAwB;gBACxB,OAAO,CAAC,IAAI,CAAC,6BAA6B,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { ServerBuildInfo } from "../workers/server-build.worker";
2
+ /**
3
+ * 세 가지 소스에서 외부 모듈을 수집하고 병합한다.
4
+ * collectAllDependencyExternals를 통한 단일 패스 의존성 트리 순회를 사용한다.
5
+ */
6
+ export declare function collectAllExternals(pkgDir: string, manualExternals?: string[]): string[];
7
+ /**
8
+ * pnpm-lock.yaml의 packages 섹션을 파싱하여 name→version 맵을 생성한다.
9
+ * Lockfile v9 형식: `packages:` 섹션의 `'name@version':` 키를 파싱한다.
10
+ * YAML 파서 의존성을 피하기 위해 단순 라인 기반 파싱을 사용한다.
11
+ */
12
+ export declare function parseLockfileVersions(cwd: string): Map<string, string>;
13
+ /**
14
+ * pnpm-lock.yaml에서 주어진 모든 패키지의 잠긴 버전을 확인한다.
15
+ * lockfile에서 패키지를 찾을 수 없으면 에러를 던진다.
16
+ */
17
+ export declare function resolveLockedVersions(cwd: string, pkgNames: string[]): Record<string, string>;
18
+ /**
19
+ * 프로덕션 배포용 파일을 생성한다
20
+ */
21
+ export declare function generateProductionFiles(info: ServerBuildInfo, externals: string[]): void;
22
+ //# sourceMappingURL=server-production-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-production-files.d.ts","sourceRoot":"","sources":["../../src/utils/server-production-files.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAStE;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAMxF;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAmCtE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAc7F;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,eAAe,EACrB,SAAS,EAAE,MAAM,EAAE,GAClB,IAAI,CAgGN"}