@simplysm/sd-cli 10.0.21 → 10.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.
- package/dist/commons.d.ts +1 -0
- package/dist/entry/SdCliLocalUpdate.d.ts +7 -0
- package/dist/entry/SdCliLocalUpdate.js.map +1 -0
- package/dist/entry/SdCliLocalUpdate.mjs +55 -0
- package/dist/sd-cli.js.map +1 -1
- package/dist/sd-cli.mjs +15 -0
- package/package.json +5 -5
- package/src/commons.ts +1 -0
- package/src/entry/SdCliLocalUpdate.ts +70 -0
- package/src/sd-cli.ts +19 -0
package/dist/commons.d.ts
CHANGED
|
@@ -35,6 +35,7 @@ export interface ISdCliPackageBuildResult {
|
|
|
35
35
|
}
|
|
36
36
|
export interface ISdCliConfig {
|
|
37
37
|
packages: Record<string, TSdCliPackageConfig | undefined>;
|
|
38
|
+
localUpdates?: Record<string, string>;
|
|
38
39
|
}
|
|
39
40
|
export type TSdCliPackageConfig = ISdCliLibPackageConfig | ISdCliServerPackageConfig | ISdCliClientPackageConfig;
|
|
40
41
|
export interface ISdCliLibPackageConfig {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SdCliLocalUpdate.js","sourceRoot":"","sources":["../../../../src/entry/SdCliLocalUpdate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import { FsUtil, Logger } from "@simplysm/sd-core-node";
|
|
3
|
+
import { SdCliConfigUtil } from "../utils/SdCliConfigUtil";
|
|
4
|
+
export class SdCliLocalUpdate {
|
|
5
|
+
static async runAsync(opt) {
|
|
6
|
+
const logger = Logger.get(["simplysm", "sd-cli", "SdCliLocalUpdate", "runAsync"]);
|
|
7
|
+
logger.debug("프로젝트 설정 가져오기...");
|
|
8
|
+
const conf = await SdCliConfigUtil.loadConfigAsync(path.resolve(opt.rootPath, opt.confFileRelPath), false);
|
|
9
|
+
if (!conf.localUpdates)
|
|
10
|
+
return;
|
|
11
|
+
logger.debug("로컬 업데이트 구성...");
|
|
12
|
+
const updatePathInfos = await this._getUpdatePathInfosAsync(opt.rootPath, conf.localUpdates);
|
|
13
|
+
logger.debug("로컬 업데이트 구성 완료", updatePathInfos);
|
|
14
|
+
logger.log("로컬 라이브러리 업데이트 시작...");
|
|
15
|
+
for (const updatePathInfo of updatePathInfos) {
|
|
16
|
+
if (!FsUtil.exists(updatePathInfo.source)) {
|
|
17
|
+
logger.warn(`소스경로를 찾을 수 없어 무시됩니다(${updatePathInfo.source})`);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
// 소스경로에서 대상경로로 파일 복사
|
|
21
|
+
await FsUtil.copyAsync(updatePathInfo.source, updatePathInfo.target, (src) => {
|
|
22
|
+
return !src.includes("node_modules") && !src.endsWith("package.json");
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
logger.info("로컬 라이브러리 업데이트 완료");
|
|
26
|
+
}
|
|
27
|
+
static async _getUpdatePathInfosAsync(rootPath, record) {
|
|
28
|
+
const result = [];
|
|
29
|
+
for (const pkgGlobPath of Object.keys(record)) {
|
|
30
|
+
// "node_modules'에서 로컬업데이트 설정에 맞는 패키지를 "glob"하여 대상 패키지경로 목록 가져오기
|
|
31
|
+
const targetPaths = [
|
|
32
|
+
...await FsUtil.globAsync(path.resolve(rootPath, "node_modules", pkgGlobPath)),
|
|
33
|
+
...await FsUtil.globAsync(path.resolve(rootPath, "**", "node_modules", pkgGlobPath))
|
|
34
|
+
];
|
|
35
|
+
result.push(...targetPaths
|
|
36
|
+
.map((targetPath) => {
|
|
37
|
+
// 대상의 명칭 추출
|
|
38
|
+
const regexpText = pkgGlobPath.replace(/[\\/.*]/g, (item) => (item === "/" ? "[\\\\\\/]"
|
|
39
|
+
: item === "." ? "\\."
|
|
40
|
+
: item === "*" ? "(.*)"
|
|
41
|
+
: item));
|
|
42
|
+
const targetNameMatch = new RegExp(regexpText).exec(targetPath);
|
|
43
|
+
if (!targetNameMatch || typeof targetNameMatch[1] === "undefined")
|
|
44
|
+
return undefined;
|
|
45
|
+
const targetName = targetNameMatch[1];
|
|
46
|
+
// 가져올 소스 경로 추출
|
|
47
|
+
const sourcePath = path.resolve(record[pkgGlobPath].replace(/\*/g, targetName));
|
|
48
|
+
return { source: sourcePath, target: targetPath };
|
|
49
|
+
})
|
|
50
|
+
.filterExists());
|
|
51
|
+
}
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=SdCliLocalUpdate.js.map
|
package/dist/sd-cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sd-cli.js","sourceRoot":"","sources":["../../../src/sd-cli.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"sd-cli.js","sourceRoot":"","sources":["../../../src/sd-cli.ts"],"names":[],"mappings":"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"}
|
package/dist/sd-cli.mjs
CHANGED
|
@@ -3,6 +3,7 @@ import { hideBin } from "yargs/helpers";
|
|
|
3
3
|
import { SdCliProject } from "./entry/SdCliProject";
|
|
4
4
|
import { Logger, LoggerSeverity } from "@simplysm/sd-core-node";
|
|
5
5
|
import { EventEmitter } from "events";
|
|
6
|
+
import { SdCliLocalUpdate } from "./entry/SdCliLocalUpdate";
|
|
6
7
|
Error.stackTraceLimit = Infinity;
|
|
7
8
|
EventEmitter.defaultMaxListeners = 0;
|
|
8
9
|
const argv = (await yargs(hideBin(process.argv))
|
|
@@ -70,6 +71,13 @@ const argv = (await yargs(hideBin(process.argv))
|
|
|
70
71
|
array: true,
|
|
71
72
|
describe: "수행할 패키지 설정"
|
|
72
73
|
}
|
|
74
|
+
}))
|
|
75
|
+
.command("local-update", "로컬 라이브러리 업데이트를 수행합니다.", (cmd) => cmd.version(false).hide("help").hide("debug")
|
|
76
|
+
.options({
|
|
77
|
+
config: {
|
|
78
|
+
type: "string",
|
|
79
|
+
describe: "simplysm.json 파일 경로"
|
|
80
|
+
}
|
|
73
81
|
}))
|
|
74
82
|
.parseAsync());
|
|
75
83
|
if (Boolean(argv.debug)) {
|
|
@@ -113,6 +121,13 @@ else if (argv._[0] === "publish") {
|
|
|
113
121
|
pkgNames: argv.packages ?? []
|
|
114
122
|
});
|
|
115
123
|
}
|
|
124
|
+
else if (argv._[0] === "local-update") {
|
|
125
|
+
await SdCliLocalUpdate
|
|
126
|
+
.runAsync({
|
|
127
|
+
rootPath: process.cwd(),
|
|
128
|
+
confFileRelPath: argv.config ?? "simplysm.json"
|
|
129
|
+
});
|
|
130
|
+
}
|
|
116
131
|
else {
|
|
117
132
|
throw new Error(`명령어가 잘못 되었습니다.\n\t${argv._[0]}\n`);
|
|
118
133
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simplysm/sd-cli",
|
|
3
|
-
"version": "10.0.
|
|
3
|
+
"version": "10.0.22",
|
|
4
4
|
"description": "심플리즘 패키지 - CLI",
|
|
5
5
|
"author": "김석래",
|
|
6
6
|
"repository": {
|
|
@@ -9,15 +9,15 @@
|
|
|
9
9
|
"directory": "packages/sd-cli"
|
|
10
10
|
},
|
|
11
11
|
"license": "MIT",
|
|
12
|
-
"bin": "./dist/
|
|
12
|
+
"bin": "./dist/sd-cli.mjs",
|
|
13
13
|
"type": "module",
|
|
14
14
|
"engines": {
|
|
15
15
|
"node": "^20"
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@simplysm/sd-core-common": "10.0.
|
|
19
|
-
"@simplysm/sd-core-node": "10.0.
|
|
20
|
-
"@simplysm/sd-service-server": "10.0.
|
|
18
|
+
"@simplysm/sd-core-common": "10.0.22",
|
|
19
|
+
"@simplysm/sd-core-node": "10.0.22",
|
|
20
|
+
"@simplysm/sd-service-server": "10.0.22",
|
|
21
21
|
"@vitejs/plugin-react": "^4.0.2",
|
|
22
22
|
"esbuild": "^0.18.11",
|
|
23
23
|
"eslint": "^8.44.0",
|
package/src/commons.ts
CHANGED
|
@@ -39,6 +39,7 @@ export interface ISdCliPackageBuildResult {
|
|
|
39
39
|
|
|
40
40
|
export interface ISdCliConfig {
|
|
41
41
|
packages: Record<string, TSdCliPackageConfig | undefined>;
|
|
42
|
+
localUpdates?: Record<string, string>;
|
|
42
43
|
}
|
|
43
44
|
|
|
44
45
|
export type TSdCliPackageConfig = ISdCliLibPackageConfig | ISdCliServerPackageConfig | ISdCliClientPackageConfig;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import { FsUtil, Logger } from "@simplysm/sd-core-node";
|
|
3
|
+
import { SdCliConfigUtil } from "../utils/SdCliConfigUtil";
|
|
4
|
+
|
|
5
|
+
export class SdCliLocalUpdate {
|
|
6
|
+
public static async runAsync(opt: { rootPath: string; confFileRelPath: string; }): Promise<void> {
|
|
7
|
+
const logger = Logger.get(["simplysm", "sd-cli", "SdCliLocalUpdate", "runAsync"]);
|
|
8
|
+
|
|
9
|
+
logger.debug("프로젝트 설정 가져오기...");
|
|
10
|
+
const conf = await SdCliConfigUtil.loadConfigAsync(path.resolve(opt.rootPath, opt.confFileRelPath), false);
|
|
11
|
+
if (!conf.localUpdates) return;
|
|
12
|
+
|
|
13
|
+
logger.debug("로컬 업데이트 구성...");
|
|
14
|
+
const updatePathInfos = await this._getUpdatePathInfosAsync(opt.rootPath, conf.localUpdates);
|
|
15
|
+
logger.debug("로컬 업데이트 구성 완료", updatePathInfos);
|
|
16
|
+
|
|
17
|
+
logger.log("로컬 라이브러리 업데이트 시작...");
|
|
18
|
+
for (const updatePathInfo of updatePathInfos) {
|
|
19
|
+
if (!FsUtil.exists(updatePathInfo.source)) {
|
|
20
|
+
logger.warn(`소스경로를 찾을 수 없어 무시됩니다(${updatePathInfo.source})`);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// 소스경로에서 대상경로로 파일 복사
|
|
25
|
+
await FsUtil.copyAsync(updatePathInfo.source, updatePathInfo.target, (src) => {
|
|
26
|
+
return !src.includes("node_modules") && !src.endsWith("package.json");
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
logger.info("로컬 라이브러리 업데이트 완료");
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
private static async _getUpdatePathInfosAsync(rootPath: string, record: Record<string, string>): Promise<IUpdatePathInfo[]> {
|
|
33
|
+
const result: IUpdatePathInfo[] = [];
|
|
34
|
+
for (const pkgGlobPath of Object.keys(record)) {
|
|
35
|
+
// "node_modules'에서 로컬업데이트 설정에 맞는 패키지를 "glob"하여 대상 패키지경로 목록 가져오기
|
|
36
|
+
const targetPaths = [
|
|
37
|
+
...await FsUtil.globAsync(path.resolve(rootPath, "node_modules", pkgGlobPath)),
|
|
38
|
+
...await FsUtil.globAsync(path.resolve(rootPath, "**", "node_modules", pkgGlobPath))
|
|
39
|
+
];
|
|
40
|
+
|
|
41
|
+
result.push(
|
|
42
|
+
...targetPaths
|
|
43
|
+
.map((targetPath) => {
|
|
44
|
+
// 대상의 명칭 추출
|
|
45
|
+
const regexpText = pkgGlobPath.replace(/[\\/.*]/g, (item) => (
|
|
46
|
+
item === "/" ? "[\\\\\\/]"
|
|
47
|
+
: item === "." ? "\\."
|
|
48
|
+
: item === "*" ? "(.*)"
|
|
49
|
+
: item
|
|
50
|
+
));
|
|
51
|
+
const targetNameMatch = new RegExp(regexpText).exec(targetPath);
|
|
52
|
+
if (!targetNameMatch || typeof targetNameMatch[1] === "undefined") return undefined;
|
|
53
|
+
const targetName = targetNameMatch[1];
|
|
54
|
+
|
|
55
|
+
// 가져올 소스 경로 추출
|
|
56
|
+
const sourcePath = path.resolve(record[pkgGlobPath].replace(/\*/g, targetName));
|
|
57
|
+
return { source: sourcePath, target: targetPath };
|
|
58
|
+
})
|
|
59
|
+
.filterExists()
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return result;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
interface IUpdatePathInfo {
|
|
68
|
+
source: string;
|
|
69
|
+
target: string;
|
|
70
|
+
}
|
package/src/sd-cli.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { hideBin } from "yargs/helpers";
|
|
|
3
3
|
import { SdCliProject } from "./entry/SdCliProject";
|
|
4
4
|
import { Logger, LoggerSeverity } from "@simplysm/sd-core-node";
|
|
5
5
|
import { EventEmitter } from "events";
|
|
6
|
+
import { SdCliLocalUpdate } from "./entry/SdCliLocalUpdate";
|
|
6
7
|
|
|
7
8
|
Error.stackTraceLimit = Infinity;
|
|
8
9
|
EventEmitter.defaultMaxListeners = 0;
|
|
@@ -86,6 +87,17 @@ const argv = (
|
|
|
86
87
|
}
|
|
87
88
|
})
|
|
88
89
|
)
|
|
90
|
+
.command(
|
|
91
|
+
"local-update",
|
|
92
|
+
"로컬 라이브러리 업데이트를 수행합니다.",
|
|
93
|
+
(cmd) => cmd.version(false).hide("help").hide("debug")
|
|
94
|
+
.options({
|
|
95
|
+
config: {
|
|
96
|
+
type: "string",
|
|
97
|
+
describe: "simplysm.json 파일 경로"
|
|
98
|
+
}
|
|
99
|
+
})
|
|
100
|
+
)
|
|
89
101
|
.parseAsync()
|
|
90
102
|
) as any;
|
|
91
103
|
|
|
@@ -131,6 +143,13 @@ else if (argv._[0] === "publish") {
|
|
|
131
143
|
pkgNames: argv.packages ?? []
|
|
132
144
|
});
|
|
133
145
|
}
|
|
146
|
+
else if (argv._[0] === "local-update") {
|
|
147
|
+
await SdCliLocalUpdate
|
|
148
|
+
.runAsync({
|
|
149
|
+
rootPath: process.cwd(),
|
|
150
|
+
confFileRelPath: argv.config ?? "simplysm.json"
|
|
151
|
+
});
|
|
152
|
+
}
|
|
134
153
|
else {
|
|
135
154
|
throw new Error(`명령어가 잘못 되었습니다.\n\t${argv._[0]}\n`);
|
|
136
155
|
}
|