@simplysm/sd-cli 7.0.268 → 7.0.271
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/bin/sd-cli.mjs +5 -5
- package/dist/build-tool/SdCliElectron.mjs +2 -2
- package/dist/builder/SdCliClientBuilder.d.ts +2 -2
- package/dist/builder/SdCliClientBuilder.mjs +26 -26
- package/dist/builder/SdCliServerBuilder.d.ts +2 -2
- package/dist/builder/SdCliServerBuilder.mjs +18 -18
- package/dist/builder/SdCliTsLibBuilder.d.ts +2 -2
- package/dist/builder/SdCliTsLibBuilder.mjs +7 -7
- package/dist/entry-points/{SdCliWorkspace.d.ts → SdCliProject.d.ts} +1 -1
- package/dist/entry-points/SdCliProject.mjs +416 -0
- package/dist/entry-points/SdCliProjectGenerator.mjs +3 -3
- package/dist/index.d.ts +1 -1
- package/dist/index.mjs +2 -2
- package/dist/packages/SdCliPackage.d.ts +2 -2
- package/dist/packages/SdCliPackage.mjs +5 -5
- package/dist/worker/build-worker.mjs +5 -5
- package/package.json +6 -6
- package/src/bin/sd-cli.ts +4 -4
- package/src/build-tool/SdCliElectron.ts +1 -1
- package/src/builder/SdCliClientBuilder.ts +27 -26
- package/src/builder/SdCliServerBuilder.ts +16 -16
- package/src/builder/SdCliTsLibBuilder.ts +5 -5
- package/src/entry-points/{SdCliWorkspace.ts → SdCliProject.ts} +3 -1
- package/src/entry-points/SdCliProjectGenerator.ts +2 -2
- package/src/index.ts +1 -1
- package/src/packages/SdCliPackage.ts +3 -3
- package/src/worker/build-worker.ts +4 -4
- package/dist/entry-points/SdCliWorkspace.mjs +0 -414
|
@@ -1,414 +0,0 @@
|
|
|
1
|
-
import { FsUtil, Logger, SdProcess } from "@simplysm/sd-core-node";
|
|
2
|
-
import path from "path";
|
|
3
|
-
import { SdCliPackage } from "../packages/SdCliPackage";
|
|
4
|
-
import { JsonConvert, Wait } from "@simplysm/sd-core-common";
|
|
5
|
-
import os from "os";
|
|
6
|
-
import { SdCliBuildResultUtil } from "../utils/SdCliBuildResultUtil";
|
|
7
|
-
import semver from "semver/preload";
|
|
8
|
-
import { SdCliConfigUtil } from "../utils/SdCliConfigUtil";
|
|
9
|
-
import { SdCliLocalUpdate } from "./SdCliLocalUpdate";
|
|
10
|
-
import { fileURLToPath } from "url";
|
|
11
|
-
import cp from "child_process";
|
|
12
|
-
export class SdCliWorkspace {
|
|
13
|
-
constructor(_rootPath) {
|
|
14
|
-
this._rootPath = _rootPath;
|
|
15
|
-
this._logger = Logger.get(["simplysm", "sd-cli", this.constructor.name]);
|
|
16
|
-
this._serverInfoMap = new Map();
|
|
17
|
-
this._isServerRestarting = false;
|
|
18
|
-
const npmConfigFilePath = path.resolve(this._rootPath, "package.json");
|
|
19
|
-
this._npmConfig = FsUtil.readJson(npmConfigFilePath);
|
|
20
|
-
}
|
|
21
|
-
async watchAsync(opt) {
|
|
22
|
-
this._logger.debug("프로젝트 설정 가져오기...");
|
|
23
|
-
const config = await SdCliConfigUtil.loadConfigAsync(path.resolve(this._rootPath, opt.confFileRelPath), true, opt.optNames);
|
|
24
|
-
if (config.localUpdates) {
|
|
25
|
-
this._logger.debug("로컬 라이브러리 업데이트 변경감지 시작...");
|
|
26
|
-
await new SdCliLocalUpdate(this._rootPath).watchAsync({ confFileRelPath: opt.confFileRelPath });
|
|
27
|
-
}
|
|
28
|
-
this._logger.debug("패키지 목록 구성...");
|
|
29
|
-
const allPkgs = await this._getPackagesAsync(config);
|
|
30
|
-
const pkgs = allPkgs.filter((pkg) => opt.pkgs.length === 0 || opt.pkgs.includes(path.basename(pkg.rootPath)));
|
|
31
|
-
this._logger.debug("패키지 이벤트 설정...");
|
|
32
|
-
let changeCount = 0;
|
|
33
|
-
let changePkgs = [];
|
|
34
|
-
const totalResultMap = new Map();
|
|
35
|
-
for (const pkg of pkgs) {
|
|
36
|
-
pkg
|
|
37
|
-
.on("change", () => {
|
|
38
|
-
if (changeCount === 0) {
|
|
39
|
-
this._logger.log("빌드를 시작합니다...");
|
|
40
|
-
}
|
|
41
|
-
changeCount++;
|
|
42
|
-
this._logger.debug(`[${pkg.name}] 빌드를 시작합니다...`);
|
|
43
|
-
})
|
|
44
|
-
.on("complete", (results) => {
|
|
45
|
-
changePkgs.push(pkg);
|
|
46
|
-
this._logger.debug(`[${pkg.name}] 빌드가 완료되었습니다.`);
|
|
47
|
-
totalResultMap.set(pkg.name, results);
|
|
48
|
-
setTimeout(async () => {
|
|
49
|
-
changeCount--;
|
|
50
|
-
if (changeCount === 0) {
|
|
51
|
-
const currChangePkgs = [...changePkgs].distinct(true);
|
|
52
|
-
changePkgs = [];
|
|
53
|
-
for (const changePkg of currChangePkgs) {
|
|
54
|
-
if (changePkg.config.type === "server" && !results.some((item) => item.severity === "error")) {
|
|
55
|
-
await this._restartServerAsync(changePkg);
|
|
56
|
-
}
|
|
57
|
-
if (changePkg.config.type === "client") {
|
|
58
|
-
if (typeof changePkg.config.server === "string") {
|
|
59
|
-
const serverInfo = this._serverInfoMap.get(changePkg.config.server);
|
|
60
|
-
if (serverInfo) {
|
|
61
|
-
await this._sendServerWorkerBroadcastReloadAsync(serverInfo);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
else {
|
|
65
|
-
const serverInfo = this._serverInfoMap.get("PORT:" + changePkg.config.server.port);
|
|
66
|
-
if (serverInfo) {
|
|
67
|
-
await this._sendServerWorkerBroadcastReloadAsync(serverInfo);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
this._loggingResults(totalResultMap);
|
|
73
|
-
this._loggingOpenClientHrefs();
|
|
74
|
-
this._logger.info("모든 빌드가 완료되었습니다.");
|
|
75
|
-
}
|
|
76
|
-
}, 500);
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
if (changeCount === 0) {
|
|
80
|
-
this._logger.log("빌드를 시작합니다...");
|
|
81
|
-
}
|
|
82
|
-
changeCount++;
|
|
83
|
-
try {
|
|
84
|
-
const pkgNames = pkgs.map((item) => item.name);
|
|
85
|
-
const buildCompletedPackageNames = [];
|
|
86
|
-
await pkgs.parallelAsync(async (pkg) => {
|
|
87
|
-
await Wait.until(() => !pkg.allDependencies.some((dep) => pkgNames.includes(dep) && !buildCompletedPackageNames.includes(dep)));
|
|
88
|
-
if (pkg.config.type === "client") {
|
|
89
|
-
await pkg.watchAsync();
|
|
90
|
-
if (typeof pkg.config.server === "string") {
|
|
91
|
-
const serverInfo = this._serverInfoMap.getOrCreate(pkg.config.server, { pathProxy: [], clientInfos: [] });
|
|
92
|
-
serverInfo.pathProxy.push({
|
|
93
|
-
from: pkg.name.split("/").last(),
|
|
94
|
-
to: path.resolve(pkg.rootPath, "dist")
|
|
95
|
-
});
|
|
96
|
-
await this._reloadServerWorkerPathProxyAsync(serverInfo);
|
|
97
|
-
serverInfo.clientInfos.push({
|
|
98
|
-
pkgKey: pkg.name.split("/").last(),
|
|
99
|
-
platforms: pkg.config.builder ? Object.keys(pkg.config.builder) : ["web"],
|
|
100
|
-
cordovaTargets: pkg.config.builder?.cordova?.target ? Object.keys(pkg.config.builder.cordova.target) : ["browser"]
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
else { // DEV SERVER
|
|
104
|
-
const serverInfo = this._serverInfoMap.getOrCreate("PORT:" + pkg.config.server.port, {
|
|
105
|
-
pathProxy: [],
|
|
106
|
-
clientInfos: []
|
|
107
|
-
});
|
|
108
|
-
if (serverInfo.worker === undefined) {
|
|
109
|
-
const serverWorkerInfo = await this._runServerWorkerAsync(pkg.config.server);
|
|
110
|
-
serverInfo.worker = serverWorkerInfo.worker;
|
|
111
|
-
serverInfo.url = serverWorkerInfo.url;
|
|
112
|
-
serverInfo.pathProxy.push({
|
|
113
|
-
from: pkg.name.split("/").last(),
|
|
114
|
-
to: path.resolve(pkg.rootPath, "dist")
|
|
115
|
-
});
|
|
116
|
-
await this._reloadServerWorkerPathProxyAsync(serverInfo);
|
|
117
|
-
serverInfo.clientInfos.push({
|
|
118
|
-
pkgKey: pkg.name.split("/").last(),
|
|
119
|
-
platforms: pkg.config.builder ? Object.keys(pkg.config.builder) : ["web"],
|
|
120
|
-
cordovaTargets: pkg.config.builder?.cordova?.target ? Object.keys(pkg.config.builder.cordova.target) : ["browser"]
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
await pkg.watchAsync();
|
|
127
|
-
}
|
|
128
|
-
buildCompletedPackageNames.push(pkg.name);
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
catch (err) {
|
|
132
|
-
this._loggingResults(totalResultMap);
|
|
133
|
-
this._loggingOpenClientHrefs();
|
|
134
|
-
throw err;
|
|
135
|
-
}
|
|
136
|
-
changeCount--;
|
|
137
|
-
if (changeCount === 0) {
|
|
138
|
-
this._loggingResults(totalResultMap);
|
|
139
|
-
this._loggingOpenClientHrefs();
|
|
140
|
-
this._logger.info("모든 빌드가 완료되었습니다.");
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
async buildAsync(opt) {
|
|
144
|
-
this._logger.debug("프로젝트 설정 가져오기...");
|
|
145
|
-
const config = await SdCliConfigUtil.loadConfigAsync(path.resolve(this._rootPath, opt.confFileRelPath), false, opt.optNames);
|
|
146
|
-
this._logger.debug("패키지 목록 구성...");
|
|
147
|
-
const allPkgs = await this._getPackagesAsync(config);
|
|
148
|
-
const pkgs = allPkgs.filter((pkg) => opt.pkgs.length === 0 || opt.pkgs.includes(path.basename(pkg.rootPath)));
|
|
149
|
-
this._logger.debug("프로젝트 및 패키지 버전 설정...");
|
|
150
|
-
await this._upgradeVersionAsync(allPkgs);
|
|
151
|
-
// 빌드
|
|
152
|
-
await this._buildPkgsAsync(pkgs);
|
|
153
|
-
}
|
|
154
|
-
async publishAsync(opt) {
|
|
155
|
-
this._logger.debug("프로젝트 설정 가져오기...");
|
|
156
|
-
const config = await SdCliConfigUtil.loadConfigAsync(path.resolve(this._rootPath, opt.confFileRelPath), false, opt.optNames);
|
|
157
|
-
if (opt.noBuild) {
|
|
158
|
-
this._logger.warn("빌드하지 않고, 배포하는것은 상당히 위험합니다.");
|
|
159
|
-
await this._waitSecMessageAsync("프로세스를 중지하려면, 'CTRL+C'를 누르세요.", 5);
|
|
160
|
-
}
|
|
161
|
-
// GIT 사용중일 경우, 커밋되지 않은 수정사항이 있는지 확인
|
|
162
|
-
if (FsUtil.exists(path.resolve(process.cwd(), ".git"))) {
|
|
163
|
-
this._logger.debug("GIT 커밋여부 확인...");
|
|
164
|
-
const gitStatusResult = await SdProcess.spawnAsync("git status");
|
|
165
|
-
if (gitStatusResult.includes("Changes") || gitStatusResult.includes("Untracked")) {
|
|
166
|
-
throw new Error("커밋되지 않은 정보가 있습니다.\n" + gitStatusResult);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
this._logger.debug("패키지 목록 구성...");
|
|
170
|
-
const allPkgs = await this._getPackagesAsync(config);
|
|
171
|
-
const pkgs = allPkgs.filter((pkg) => opt.pkgs.length === 0 || opt.pkgs.includes(path.basename(pkg.rootPath)));
|
|
172
|
-
this._logger.debug("프로젝트 및 패키지 버전 설정...");
|
|
173
|
-
await this._upgradeVersionAsync(allPkgs);
|
|
174
|
-
// 빌드
|
|
175
|
-
if (!opt.noBuild) {
|
|
176
|
-
// this._logger.debug("노드패키지 업데이트...");
|
|
177
|
-
// await new SdCliNpm(this._rootPath).updateAsync();
|
|
178
|
-
this._logger.debug("빌드를 시작합니다...");
|
|
179
|
-
await this._buildPkgsAsync(pkgs);
|
|
180
|
-
}
|
|
181
|
-
// GIT 사용중일경우, 새 버전 커밋 및 TAG 생성
|
|
182
|
-
if (FsUtil.exists(path.resolve(process.cwd(), ".git"))) {
|
|
183
|
-
this._logger.debug("새 버전 커밋 및 TAG 생성...");
|
|
184
|
-
await SdProcess.spawnAsync("git add .");
|
|
185
|
-
await SdProcess.spawnAsync(`git commit -m "v${this._npmConfig.version}"`);
|
|
186
|
-
await SdProcess.spawnAsync(`git tag -a "v${this._npmConfig.version}" -m "v${this._npmConfig.version}"`);
|
|
187
|
-
this._logger.debug("새 버전 푸쉬...");
|
|
188
|
-
await SdProcess.spawnAsync("git push");
|
|
189
|
-
await SdProcess.spawnAsync("git push --tags");
|
|
190
|
-
}
|
|
191
|
-
this._logger.debug("배포 시작...");
|
|
192
|
-
await pkgs.parallelAsync(async (pkg) => {
|
|
193
|
-
this._logger.debug(`[${pkg.name}] 배포를 시작합니다...`);
|
|
194
|
-
await pkg.publishAsync();
|
|
195
|
-
this._logger.debug(`[${pkg.name}] 배포가 완료되었습니다.`);
|
|
196
|
-
});
|
|
197
|
-
this._logger.info(`모든 배포가 완료되었습니다. (v${this._npmConfig.version})`);
|
|
198
|
-
}
|
|
199
|
-
async _runServerWorkerAsync(filePathOrOpt) {
|
|
200
|
-
const workerPath = fileURLToPath(await import.meta.resolve("../worker/server-worker"));
|
|
201
|
-
return await new Promise((resolve, reject) => {
|
|
202
|
-
const worker = cp.fork(workerPath, [
|
|
203
|
-
JsonConvert.stringify(filePathOrOpt)
|
|
204
|
-
], {
|
|
205
|
-
stdio: ["pipe", "pipe", "pipe", "ipc"],
|
|
206
|
-
env: process.env
|
|
207
|
-
});
|
|
208
|
-
worker.on("error", (err) => {
|
|
209
|
-
reject(err);
|
|
210
|
-
});
|
|
211
|
-
worker.stdout.pipe(process.stdout);
|
|
212
|
-
worker.stderr.pipe(process.stderr);
|
|
213
|
-
worker.on("message", (url) => {
|
|
214
|
-
resolve({ worker, url });
|
|
215
|
-
});
|
|
216
|
-
});
|
|
217
|
-
}
|
|
218
|
-
async _reloadServerWorkerPathProxyAsync(serverInfo) {
|
|
219
|
-
if (!serverInfo.worker)
|
|
220
|
-
return;
|
|
221
|
-
await new Promise((resolve, reject) => {
|
|
222
|
-
serverInfo.worker.send(JsonConvert.stringify(serverInfo.pathProxy), (err) => {
|
|
223
|
-
if (err) {
|
|
224
|
-
reject(err);
|
|
225
|
-
return;
|
|
226
|
-
}
|
|
227
|
-
resolve();
|
|
228
|
-
});
|
|
229
|
-
});
|
|
230
|
-
}
|
|
231
|
-
async _sendServerWorkerBroadcastReloadAsync(serverInfo) {
|
|
232
|
-
if (!serverInfo.worker)
|
|
233
|
-
return;
|
|
234
|
-
await new Promise((resolve, reject) => {
|
|
235
|
-
serverInfo.worker.send("broadcastReload", (err) => {
|
|
236
|
-
if (err) {
|
|
237
|
-
reject(err);
|
|
238
|
-
return;
|
|
239
|
-
}
|
|
240
|
-
resolve();
|
|
241
|
-
});
|
|
242
|
-
});
|
|
243
|
-
}
|
|
244
|
-
async _restartServerAsync(pkg) {
|
|
245
|
-
await Wait.until(() => !this._isServerRestarting);
|
|
246
|
-
this._isServerRestarting = true;
|
|
247
|
-
const entryFileRelPath = pkg.main;
|
|
248
|
-
if (entryFileRelPath === undefined) {
|
|
249
|
-
this._logger.error(`서버패키지(${pkg.name})의 'package.json'에서 'main'필드를 찾을 수 없습니다.`);
|
|
250
|
-
this._isServerRestarting = false;
|
|
251
|
-
return;
|
|
252
|
-
}
|
|
253
|
-
const entryFilePath = path.resolve(pkg.rootPath, entryFileRelPath);
|
|
254
|
-
try {
|
|
255
|
-
const serverInfo = this._serverInfoMap.getOrCreate(path.basename(pkg.rootPath), {
|
|
256
|
-
pathProxy: [],
|
|
257
|
-
clientInfos: []
|
|
258
|
-
});
|
|
259
|
-
if (serverInfo.worker) {
|
|
260
|
-
this._logger.log(`[${pkg.name}] 기존 서버 중지...`);
|
|
261
|
-
cp.exec(`taskkill /pid ${serverInfo.worker.pid} /F /T`);
|
|
262
|
-
delete serverInfo.worker;
|
|
263
|
-
delete serverInfo.url;
|
|
264
|
-
}
|
|
265
|
-
this._logger.log(`[${pkg.name}] 서버 시작중...`);
|
|
266
|
-
const serverWorkerInfo = await this._runServerWorkerAsync(entryFilePath);
|
|
267
|
-
serverInfo.worker = serverWorkerInfo.worker;
|
|
268
|
-
serverInfo.url = serverWorkerInfo.url;
|
|
269
|
-
await this._reloadServerWorkerPathProxyAsync(serverInfo);
|
|
270
|
-
this._logger.log(`[${pkg.name}] 서버가 시작되었습니다.`);
|
|
271
|
-
}
|
|
272
|
-
catch (err) {
|
|
273
|
-
this._logger.error(`서버(${pkg.name}) 재시작중 오류 발생`, err);
|
|
274
|
-
}
|
|
275
|
-
this._isServerRestarting = false;
|
|
276
|
-
}
|
|
277
|
-
async _buildPkgsAsync(pkgs) {
|
|
278
|
-
this._logger.debug("빌드를 시작합니다...");
|
|
279
|
-
const pkgNames = pkgs.map((item) => item.name);
|
|
280
|
-
const buildCompletedPackageNames = [];
|
|
281
|
-
const totalResultMap = new Map();
|
|
282
|
-
try {
|
|
283
|
-
await pkgs.parallelAsync(async (pkg) => {
|
|
284
|
-
await Wait.until(() => !pkg.allDependencies.some((dep) => pkgNames.includes(dep) && !buildCompletedPackageNames.includes(dep)));
|
|
285
|
-
this._logger.debug(`[${pkg.name}] 빌드를 시작합니다...`);
|
|
286
|
-
totalResultMap.set(pkg.name, await pkg.buildAsync());
|
|
287
|
-
this._logger.debug(`[${pkg.name}] 빌드가 완료되었습니다.`);
|
|
288
|
-
buildCompletedPackageNames.push(pkg.name);
|
|
289
|
-
});
|
|
290
|
-
this._loggingResults(totalResultMap);
|
|
291
|
-
if (Array.from(totalResultMap.values()).mapMany().some((item) => item.severity === "error")) {
|
|
292
|
-
throw new Error("빌드중 오류가 발생하였습니다.");
|
|
293
|
-
}
|
|
294
|
-
else {
|
|
295
|
-
this._logger.info("모든 빌드가 완료되었습니다.");
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
catch (err) {
|
|
299
|
-
this._loggingResults(totalResultMap);
|
|
300
|
-
throw err;
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
async _upgradeVersionAsync(pkgs) {
|
|
304
|
-
// 작업공간 package.json 버전 설정
|
|
305
|
-
const newVersion = semver.inc(this._npmConfig.version, "patch");
|
|
306
|
-
this._npmConfig.version = newVersion;
|
|
307
|
-
const pkgNames = pkgs.map((item) => item.name);
|
|
308
|
-
const updateDepVersion = (deps) => {
|
|
309
|
-
if (!deps)
|
|
310
|
-
return;
|
|
311
|
-
for (const depName of Object.keys(deps)) {
|
|
312
|
-
if (pkgNames.includes(depName)) {
|
|
313
|
-
deps[depName] = newVersion;
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
};
|
|
317
|
-
updateDepVersion(this._npmConfig.dependencies);
|
|
318
|
-
updateDepVersion(this._npmConfig.optionalDependencies);
|
|
319
|
-
updateDepVersion(this._npmConfig.devDependencies);
|
|
320
|
-
updateDepVersion(this._npmConfig.peerDependencies);
|
|
321
|
-
const npmConfigFilePath = path.resolve(this._rootPath, "package.json");
|
|
322
|
-
await FsUtil.writeJsonAsync(npmConfigFilePath, this._npmConfig, { space: 2 });
|
|
323
|
-
// 각 패키지 package.json 버전 설정
|
|
324
|
-
await pkgs.parallelAsync(async (pkg) => {
|
|
325
|
-
await pkg.setNewVersionAsync(newVersion, pkgNames);
|
|
326
|
-
});
|
|
327
|
-
}
|
|
328
|
-
async _waitSecMessageAsync(msg, sec) {
|
|
329
|
-
for (let i = sec; i > 0; i--) {
|
|
330
|
-
if (i !== sec) {
|
|
331
|
-
process.stdout.cursorTo(0);
|
|
332
|
-
}
|
|
333
|
-
process.stdout.write(`${msg} ${i}`);
|
|
334
|
-
await Wait.time(1000);
|
|
335
|
-
}
|
|
336
|
-
process.stdout.cursorTo(0);
|
|
337
|
-
process.stdout.clearLine(0);
|
|
338
|
-
}
|
|
339
|
-
async _getPackagesAsync(conf) {
|
|
340
|
-
const pkgRootPaths = await this._npmConfig.workspaces?.mapManyAsync(async (item) => await FsUtil.globAsync(item));
|
|
341
|
-
if (!pkgRootPaths) {
|
|
342
|
-
throw new Error("최상위 'package.json'에서 'workspaces'를 찾을 수 없습니다.");
|
|
343
|
-
}
|
|
344
|
-
return pkgRootPaths.map((pkgRootPath) => {
|
|
345
|
-
// if (pkgs.length > 0 && !pkgs.includes(path.basename(pkgRootPath))) return undefined;
|
|
346
|
-
const pkgConfig = conf.packages[path.basename(pkgRootPath)];
|
|
347
|
-
if (!pkgConfig)
|
|
348
|
-
return undefined;
|
|
349
|
-
return new SdCliPackage(this._rootPath, pkgRootPath, pkgConfig);
|
|
350
|
-
}).filterExists();
|
|
351
|
-
}
|
|
352
|
-
_loggingResults(totalResultMap) {
|
|
353
|
-
const totalResults = Array.from(totalResultMap.entries())
|
|
354
|
-
.mapMany((item) => item[1].map((item1) => ({
|
|
355
|
-
pkgName: item[0],
|
|
356
|
-
...item1
|
|
357
|
-
})))
|
|
358
|
-
.orderBy((item) => `${item.pkgName}_${item.filePath}`);
|
|
359
|
-
const warnings = totalResults
|
|
360
|
-
.filter((item) => item.severity === "warning")
|
|
361
|
-
.map((item) => `${SdCliBuildResultUtil.getMessage(item)} (${item.pkgName})`)
|
|
362
|
-
.distinct();
|
|
363
|
-
const errors = totalResults
|
|
364
|
-
.filter((item) => item.severity === "error")
|
|
365
|
-
.map((item) => `${SdCliBuildResultUtil.getMessage(item)} (${item.pkgName})`)
|
|
366
|
-
.distinct();
|
|
367
|
-
if (warnings.length > 0) {
|
|
368
|
-
this._logger.warn(`경고 발생${os.EOL}`, warnings.join(os.EOL));
|
|
369
|
-
}
|
|
370
|
-
if (errors.length > 0) {
|
|
371
|
-
this._logger.error(`오류 발생${os.EOL}`, errors.join(os.EOL));
|
|
372
|
-
}
|
|
373
|
-
if (errors.length > 0) {
|
|
374
|
-
this._logger.error(`경고: ${warnings.length}건, 오류: ${errors.length}건`);
|
|
375
|
-
}
|
|
376
|
-
else if (warnings.length > 0) {
|
|
377
|
-
this._logger.warn(`경고: ${warnings.length}건, 오류: ${errors.length}건`);
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
_loggingOpenClientHrefs() {
|
|
381
|
-
const clientHrefs = [];
|
|
382
|
-
const serverInfos = Array.from(this._serverInfoMap.values());
|
|
383
|
-
for (const serverInfo of serverInfos) {
|
|
384
|
-
if (!serverInfo.worker)
|
|
385
|
-
continue;
|
|
386
|
-
/*const protocolStr = serverInfo.server.options.ssl ? "https" : "http";
|
|
387
|
-
const portStr = serverInfo.server.options.port.toString();*/
|
|
388
|
-
for (const clientInfo of serverInfo.clientInfos) {
|
|
389
|
-
for (const platform of clientInfo.platforms) {
|
|
390
|
-
if (platform === "web") {
|
|
391
|
-
clientHrefs.push(`${serverInfo.url}/${clientInfo.pkgKey}/`);
|
|
392
|
-
}
|
|
393
|
-
else if (platform === "electron") {
|
|
394
|
-
clientHrefs.push(`sd-cli run-electron ${clientInfo.pkgKey} ${serverInfo.url}`);
|
|
395
|
-
}
|
|
396
|
-
else if (platform === "cordova") {
|
|
397
|
-
for (const target of clientInfo.cordovaTargets) {
|
|
398
|
-
if (target === "browser") {
|
|
399
|
-
clientHrefs.push(`${serverInfo.url}/${clientInfo.pkgKey}/${platform}/`);
|
|
400
|
-
}
|
|
401
|
-
else {
|
|
402
|
-
clientHrefs.push(`sd-cli run-cordova ${target} ${clientInfo.pkgKey} ${serverInfo.url}`);
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
if (clientHrefs.length > 0) {
|
|
410
|
-
this._logger.log(`오픈된 클라이언트:\n${clientHrefs.join("\n")}`);
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2RDbGlXb3Jrc3BhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZW50cnktcG9pbnRzL1NkQ2xpV29ya3NwYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ25FLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUV4QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDckUsT0FBTyxNQUFNLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDcEMsT0FBTyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9CLE1BQU0sT0FBTyxjQUFjO0lBTXpCLFlBQW9DLFNBQWlCO1FBQWpCLGNBQVMsR0FBVCxTQUFTLENBQVE7UUFMcEMsWUFBTyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUdwRSxtQkFBYyxHQUFHLElBQUksR0FBRyxFQUF1QixDQUFDO1FBNFF6RCx3QkFBbUIsR0FBRyxLQUFLLENBQUM7UUF6UWxDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxD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
|