@simplysm/sd-cli 12.15.62 → 12.15.64

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.
@@ -86,6 +86,27 @@ export class SdCliProject {
86
86
  const logger = SdLogger.get(["simplysm", "sd-cli", "SdCliProject", "publishAsync"]);
87
87
  logger.debug("프로젝트 설정 가져오기...");
88
88
  const projConf = await loadProjConfAsync(process.cwd(), false, opt);
89
+ if (Object.values(projConf.packages).some((item) => item?.publish === "npm")) {
90
+ logger.debug("npm/yarn 토큰 유효성 체크...");
91
+ try {
92
+ const npmWhoami = await SdProcess.spawnAsync("npm", ["whoami"]);
93
+ if (StringUtils.isNullOrEmpty(npmWhoami.trim())) {
94
+ throw new Error();
95
+ }
96
+ logger.debug(`npm 로그인 확인: ${npmWhoami.trim()}`);
97
+ const yarnWhoami = await SdProcess.spawnAsync("yarn", ["npm", "whoami"]);
98
+ if (StringUtils.isNullOrEmpty(yarnWhoami.trim())) {
99
+ throw new Error();
100
+ }
101
+ logger.debug(`yarn 로그인 확인: ${yarnWhoami.trim()}`);
102
+ }
103
+ catch {
104
+ throw new Error("npm 토큰이 유효하지 않거나 만료되었습니다.\n" +
105
+ "https://www.npmjs.com/settings/~/tokens 에서 Granular Access Token 생성 후:\n" +
106
+ " npm config set //registry.npmjs.org/:_authToken <토큰>\n" +
107
+ " yarn config set npmAuthToken <토큰> --home");
108
+ }
109
+ }
89
110
  logger.debug("프로젝트 package.json 가져오기...");
90
111
  const projNpmConf = FsUtils.readJson(path.resolve(process.cwd(), "package.json"));
91
112
  if (opt.noBuild) {
@@ -232,27 +232,33 @@ export class SdProjectBuildRunner {
232
232
  return new Set([...workspacePaths, ...localUpdatePaths].map((item) => PathUtils.norm(item)));
233
233
  }
234
234
  static async _restartServerAsync(prevWorker, pkgPath, pkgConfOrPort) {
235
- if (prevWorker) {
236
- await prevWorker.killAsync();
235
+ try {
236
+ if (prevWorker) {
237
+ await prevWorker.killAsync();
238
+ }
239
+ const npmConf = FsUtils.readJson(path.resolve(pkgPath, "package.json"));
240
+ const worker = new SdWorker(import.meta.resolve("../workers/server.worker"), {
241
+ env: {
242
+ NODE_ENV: "development",
243
+ TZ: "Asia/Seoul",
244
+ SD_VERSION: npmConf.version,
245
+ ...(typeof pkgConfOrPort === "number" ? {} : pkgConfOrPort.env),
246
+ },
247
+ resourceLimits: {
248
+ maxOldGenerationSizeMb: 2048,
249
+ maxYoungGenerationSizeMb: 8,
250
+ stackSizeMb: 2,
251
+ },
252
+ });
253
+ const port = await worker.run("listen", [
254
+ typeof pkgConfOrPort === "number" ? pkgConfOrPort : pkgPath,
255
+ ]);
256
+ this._logger.debug("서버가 시작되었습니다.");
257
+ return { worker, port };
258
+ }
259
+ catch (err) {
260
+ this._logger.error("서버 재시작 실패: ", err);
261
+ return {};
237
262
  }
238
- const npmConf = FsUtils.readJson(path.resolve(pkgPath, "package.json"));
239
- const worker = new SdWorker(import.meta.resolve("../workers/server.worker"), {
240
- env: {
241
- NODE_ENV: "development",
242
- TZ: "Asia/Seoul",
243
- SD_VERSION: npmConf.version,
244
- ...(typeof pkgConfOrPort === "number" ? {} : pkgConfOrPort.env),
245
- },
246
- resourceLimits: {
247
- maxOldGenerationSizeMb: 2048,
248
- maxYoungGenerationSizeMb: 8,
249
- stackSizeMb: 2,
250
- },
251
- });
252
- const port = await worker.run("listen", [
253
- typeof pkgConfOrPort === "number" ? pkgConfOrPort : pkgPath,
254
- ]);
255
- this._logger.debug("서버가 시작되었습니다.");
256
- return { worker, port };
257
263
  }
258
264
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@simplysm/sd-cli",
3
- "version": "12.15.62",
3
+ "version": "12.15.64",
4
4
  "description": "심플리즘 패키지 - CLI",
5
5
  "author": "김석래",
6
6
  "repository": {
@@ -17,10 +17,10 @@
17
17
  "@angular/compiler-cli": "^20.3.15",
18
18
  "@anthropic-ai/sdk": "^0.71.2",
19
19
  "@electron/rebuild": "^4.0.2",
20
- "@simplysm/sd-core-common": "12.15.62",
21
- "@simplysm/sd-core-node": "12.15.62",
22
- "@simplysm/sd-service-server": "12.15.62",
23
- "@simplysm/sd-storage": "12.15.62",
20
+ "@simplysm/sd-core-common": "12.15.64",
21
+ "@simplysm/sd-core-node": "12.15.64",
22
+ "@simplysm/sd-service-server": "12.15.64",
23
+ "@simplysm/sd-storage": "12.15.64",
24
24
  "browserslist": "^4.28.1",
25
25
  "cordova": "^13.0.0",
26
26
  "electron": "^33.4.11",
@@ -133,6 +133,30 @@ export class SdCliProject {
133
133
  logger.debug("프로젝트 설정 가져오기...");
134
134
  const projConf = await loadProjConfAsync(process.cwd(), false, opt);
135
135
 
136
+ if (Object.values(projConf.packages).some((item) => item?.publish === "npm")) {
137
+ logger.debug("npm/yarn 토큰 유효성 체크...");
138
+ try {
139
+ const npmWhoami = await SdProcess.spawnAsync("npm", ["whoami"]);
140
+ if (StringUtils.isNullOrEmpty(npmWhoami.trim())) {
141
+ throw new Error();
142
+ }
143
+ logger.debug(`npm 로그인 확인: ${npmWhoami.trim()}`);
144
+
145
+ const yarnWhoami = await SdProcess.spawnAsync("yarn", ["npm", "whoami"]);
146
+ if (StringUtils.isNullOrEmpty(yarnWhoami.trim())) {
147
+ throw new Error();
148
+ }
149
+ logger.debug(`yarn 로그인 확인: ${yarnWhoami.trim()}`);
150
+ } catch {
151
+ throw new Error(
152
+ "npm 토큰이 유효하지 않거나 만료되었습니다.\n" +
153
+ "https://www.npmjs.com/settings/~/tokens 에서 Granular Access Token 생성 후:\n" +
154
+ " npm config set //registry.npmjs.org/:_authToken <토큰>\n" +
155
+ " yarn config set npmAuthToken <토큰> --home",
156
+ );
157
+ }
158
+ }
159
+
136
160
  logger.debug("프로젝트 package.json 가져오기...");
137
161
  const projNpmConf = FsUtils.readJson(path.resolve(process.cwd(), "package.json")) as INpmConfig;
138
162
 
@@ -358,36 +358,41 @@ export class SdProjectBuildRunner {
358
358
  pkgPath: string,
359
359
  pkgConfOrPort: ISdServerPackageConfig | number,
360
360
  ): Promise<{
361
- worker: SdWorker<IServerWorkerType>;
362
- port: number;
361
+ worker?: SdWorker<IServerWorkerType>;
362
+ port?: number;
363
363
  }> {
364
- if (prevWorker) {
365
- await prevWorker.killAsync();
366
- }
364
+ try {
365
+ if (prevWorker) {
366
+ await prevWorker.killAsync();
367
+ }
367
368
 
368
- const npmConf = FsUtils.readJson(path.resolve(pkgPath, "package.json")) as INpmConfig;
369
+ const npmConf = FsUtils.readJson(path.resolve(pkgPath, "package.json")) as INpmConfig;
369
370
 
370
- const worker = new SdWorker<IServerWorkerType>(
371
- import.meta.resolve("../workers/server.worker"),
372
- {
373
- env: {
374
- NODE_ENV: "development",
375
- TZ: "Asia/Seoul",
376
- SD_VERSION: npmConf.version,
377
- ...(typeof pkgConfOrPort === "number" ? {} : pkgConfOrPort.env),
378
- },
379
- resourceLimits: {
380
- maxOldGenerationSizeMb: 2048,
381
- maxYoungGenerationSizeMb: 8,
382
- stackSizeMb: 2,
371
+ const worker = new SdWorker<IServerWorkerType>(
372
+ import.meta.resolve("../workers/server.worker"),
373
+ {
374
+ env: {
375
+ NODE_ENV: "development",
376
+ TZ: "Asia/Seoul",
377
+ SD_VERSION: npmConf.version,
378
+ ...(typeof pkgConfOrPort === "number" ? {} : pkgConfOrPort.env),
379
+ },
380
+ resourceLimits: {
381
+ maxOldGenerationSizeMb: 2048,
382
+ maxYoungGenerationSizeMb: 8,
383
+ stackSizeMb: 2,
384
+ },
383
385
  },
384
- },
385
- );
386
- const port = await worker.run("listen", [
387
- typeof pkgConfOrPort === "number" ? pkgConfOrPort : pkgPath,
388
- ]);
389
- this._logger.debug("서버가 시작되었습니다.");
386
+ );
387
+ const port = await worker.run("listen", [
388
+ typeof pkgConfOrPort === "number" ? pkgConfOrPort : pkgPath,
389
+ ]);
390
+ this._logger.debug("서버가 시작되었습니다.");
390
391
 
391
- return { worker, port };
392
+ return { worker, port };
393
+ } catch (err) {
394
+ this._logger.error("서버 재시작 실패: ", err);
395
+ return {};
396
+ }
392
397
  }
393
398
  }