@simplysm/sd-cli 7.0.81 → 7.0.146

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.
@@ -9,6 +9,7 @@ import { SdCliNpmConfigUtil } from "../utils/SdCliNpmConfigUtil";
9
9
  import { SdCliClientBuilder } from "../builder/SdCliClientBuilder";
10
10
  import { SdStorage } from "@simplysm/sd-storage";
11
11
  import ts from "typescript";
12
+ import { SdCliGithubApi } from "../build-tool/SdCliGithubApi";
12
13
  export class SdCliPackage extends EventEmitter {
13
14
  constructor(_workspaceRootPath, rootPath, config) {
14
15
  super();
@@ -79,7 +80,17 @@ export class SdCliPackage extends EventEmitter {
79
80
  }
80
81
  }
81
82
  else {
82
- if (this.config.publish.type === "ftp" || this.config.publish.type === "ftps" || this.config.publish.type === "sftp") {
83
+ if (this.config.publish.type === "github") {
84
+ const repoUrl = typeof this._npmConfig.repository === "string" ? this._npmConfig.repository : this._npmConfig.repository.url;
85
+ const repoOwner = repoUrl.split("/").slice(-2)[0];
86
+ const repoName = repoUrl.split("/").slice(-2)[1].replace(/\..*/g, "");
87
+ const github = new SdCliGithubApi(this.config.publish.apiKey, repoOwner, repoName);
88
+ await github.uploadAsync(this._npmConfig.version, this.config.publish.files.map((item) => ({
89
+ buffer: FsUtil.readFileBuffer(path.resolve(this.rootPath, "dist", item.from)),
90
+ name: item.to
91
+ })));
92
+ }
93
+ else if (this.config.publish.type === "ftp" || this.config.publish.type === "ftps" || this.config.publish.type === "sftp") {
83
94
  const tsconfigPath = path.resolve(this.rootPath, "tsconfig-build.json");
84
95
  const tsconfig = FsUtil.readJson(tsconfigPath);
85
96
  const parsedTsconfig = ts.parseJsonConfigFileContent(tsconfig, ts.sys, this.rootPath, tsconfig.angularCompilerOptions);
@@ -144,4 +155,4 @@ export class SdCliPackage extends EventEmitter {
144
155
  await FsUtil.writeJsonAsync(buildTsconfigFilePath, buildTsconfig, { space: 2 });
145
156
  }
146
157
  }
147
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2RDbGlQYWNrYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BhY2thZ2VzL1NkQ2xpUGFja2FnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUN0QyxPQUFPLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUVuRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRTVCLE1BQU0sT0FBTyxZQUFhLFNBQVEsWUFBWTtJQXNCNUMsWUFBb0Msa0JBQTBCLEVBQzNCLFFBQWdCLEVBQ2hCLE1BQTJCO1FBQzVELEtBQUssRUFBRSxDQUFDO1FBSDBCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBUTtRQUMzQixhQUFRLEdBQVIsUUFBUSxDQUFRO1FBQ2hCLFdBQU0sR0FBTixNQUFNLENBQXFCO1FBRzVELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxVQUFV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
158
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2RDbGlQYWNrYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BhY2thZ2VzL1NkQ2xpUGFja2FnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUN0QyxPQUFPLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUVuRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUU5RCxNQUFNLE9BQU8sWUFBYSxTQUFRLFlBQVk7SUFzQjVDLFlBQW9DLGtCQUEwQixFQUMzQixRQUFnQixFQUNoQixNQUEyQjtRQUM1RCxLQUFLLEVBQUUsQ0FBQztRQUgwQix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQVE7UUFDM0IsYUFBUSxHQUFSLFFBQVEsQ0FBUTtRQUNoQixXQUFNLEdBQU4sTUFBTSxDQUFxQjtRQUc1RCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFB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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@simplysm/sd-cli",
3
- "version": "7.0.81",
3
+ "version": "7.0.146",
4
4
  "description": "심플리즘 패키지 - CLI",
5
5
  "author": "김석래",
6
6
  "repository": {
@@ -52,11 +52,15 @@
52
52
  "jsdom": "^19.0.0",
53
53
  "cordova": "^11.0.0",
54
54
  "jszip": "^3.7.1",
55
- "@simplysm/sd-core-common": "7.0.81",
56
- "@simplysm/sd-core-node": "7.0.81",
57
- "@simplysm/sd-service-common": "7.0.81",
58
- "@simplysm/sd-service-server": "7.0.81",
59
- "@simplysm/sd-storage": "7.0.81"
55
+ "@simplysm/sd-core-common": "7.0.146",
56
+ "@simplysm/sd-core-node": "7.0.146",
57
+ "@simplysm/sd-service-common": "7.0.146",
58
+ "@simplysm/sd-service-server": "7.0.146",
59
+ "@simplysm/sd-storage": "7.0.146",
60
+ "electron": "^17.1.2",
61
+ "electron-builder": "^22.14.13",
62
+ "xml2js": "^0.4.23",
63
+ "mime": "^3.0.0"
60
64
  },
61
65
  "devDependencies": {
62
66
  "@types/semver": "^7.3.9",
@@ -64,6 +68,8 @@
64
68
  "@types/webpack-hot-middleware": "^2.25.5",
65
69
  "@types/connect": "^3.4.35",
66
70
  "@types/source-map-support": "^0.5.4",
67
- "@types/jsdom": "^16.2.14"
71
+ "@types/jsdom": "^16.2.14",
72
+ "@types/xml2js": "^0.4.9",
73
+ "@types/mime": "^2.0.3"
68
74
  }
69
75
  }
package/src/bin/sd-cli.ts CHANGED
@@ -9,6 +9,7 @@ import { SdCliNpm } from "../entry-points/SdCliNpm";
9
9
  import { SdCliPrepare } from "../entry-points/SdCliPrepare";
10
10
  import { SdCliFileCrypto } from "../entry-points/SdCliFileCrypto";
11
11
  import { SdCliCordova } from "../build-tool/SdCliCordova";
12
+ import { SdCliElectron } from "../build-tool/SdCliElectron";
12
13
 
13
14
  Error.stackTraceLimit = Infinity;
14
15
 
@@ -66,19 +67,45 @@ const argv = yargs(hideBin(process.argv))
66
67
  })
67
68
  )
68
69
  .command(
69
- "run-device <cordovaPath> <platform> <url>",
70
- "변경감지중인 플랫폼을 디바이스에 앱 형태로 띄웁니다.",
70
+ "run-electron <package> <url>",
71
+ "변경감지중인 플랫폼을 ELECTRON 앱 형태로 띄웁니다.",
71
72
  (cmd) => cmd
72
- .positional("cordovaPath", {
73
+ .positional("package", {
73
74
  type: "string",
74
- describe: "CORDOVA 프로젝트 경로",
75
+ describe: "패키지명",
75
76
  demandOption: true
76
77
  })
78
+ .positional("url", {
79
+ type: "string",
80
+ describe: "Webview로 오픈할 URL",
81
+ demandOption: true
82
+ })
83
+ .options({
84
+ config: {
85
+ type: "string",
86
+ describe: "simplysm.json 파일 경로"
87
+ },
88
+ options: {
89
+ type: "string",
90
+ array: true,
91
+ describe: "옵션 설정 (설정파일에서 @로 시작하는 부분)"
92
+ }
93
+ })
94
+ )
95
+ .command(
96
+ "run-cordova <platform> <package> <url>",
97
+ "변경감지중인 플랫폼을 코도바 디바이스에 앱 형태로 띄웁니다.",
98
+ (cmd) => cmd
77
99
  .positional("platform", {
78
100
  type: "string",
79
101
  describe: "빌드 플랫폼(android,...)",
80
102
  demandOption: true
81
103
  })
104
+ .positional("package", {
105
+ type: "string",
106
+ describe: "패키지명",
107
+ demandOption: true
108
+ })
82
109
  .positional("url", {
83
110
  type: "string",
84
111
  describe: "Webview로 오픈할 URL",
@@ -192,10 +219,22 @@ const logger = Logger.get(["simplysm", "sd-cli", "bin", "sd-cli"]);
192
219
  pkgs: argv.packages ?? []
193
220
  });
194
221
  }
195
- else if (argv._[0] === "run-device") {
222
+ else if (argv._[0] === "run-electron") {
223
+ await new SdCliElectron(process.cwd())
224
+ .runWebviewOnDeviceAsync(
225
+ argv.package,
226
+ argv.url,
227
+ {
228
+ confFileRelPath: argv.config ?? "simplysm.json",
229
+ optNames: argv.options ?? []
230
+ }
231
+ );
232
+ }
233
+ else if (argv._[0] === "run-cordova") {
196
234
  await SdCliCordova.runWebviewOnDeviceAsync(
197
- argv.cordovaPath,
198
- argv.platform as "browser" | "ios" | "android" | "electron",
235
+ process.cwd(),
236
+ argv.platform as "browser" | "android",
237
+ argv.package,
199
238
  argv.url
200
239
  );
201
240
  }
@@ -1,8 +1,8 @@
1
- import { INpmConfig, ISdCliClientPackageCordovaConfig, TSdCliCordovaPlatform } from "../commons";
1
+ import { INpmConfig, ISdCliClientBuilderCordovaConfig } from "../commons";
2
2
  import * as path from "path";
3
3
  import { FsUtil, Logger, SdProcess } from "@simplysm/sd-core-node";
4
- import { NotImplementError } from "@simplysm/sd-core-common";
5
4
  import JSZip from "jszip";
5
+ import xml2js from "xml2js";
6
6
 
7
7
  export class SdCliCordova {
8
8
  protected readonly _logger: Logger;
@@ -12,11 +12,14 @@ export class SdCliCordova {
12
12
  public readonly cordovaPath = path.resolve(this._rootPath, ".cordova");
13
13
  private readonly _binPath = path.resolve(process.cwd(), "node_modules/.bin/cordova.cmd");
14
14
 
15
- public get platforms(): TSdCliCordovaPlatform[] {
16
- return this._config.platforms;
15
+ public get platforms(): ("browser" | "android")[] {
16
+ return [
17
+ ...this._config.target?.browser ? ["browser" as const] : [],
18
+ ...this._config.target?.android ? ["android" as const] : []
19
+ ];
17
20
  }
18
21
 
19
- public constructor(private readonly _rootPath: string, private readonly _config: ISdCliClientPackageCordovaConfig) {
22
+ public constructor(private readonly _rootPath: string, private readonly _config: ISdCliClientBuilderCordovaConfig) {
20
23
  this._npmConfig = FsUtil.readJson(path.resolve(this._rootPath, "package.json"));
21
24
  this._logger = Logger.get(["simplysm", "sd-cli", this.constructor.name, this._npmConfig.name]);
22
25
  }
@@ -52,156 +55,156 @@ export class SdCliCordova {
52
55
  }
53
56
  }
54
57
 
55
- // 미설치 플러그인들 설치
56
- if (this._config.plugins) {
57
- const pluginsFetch = FsUtil.exists(path.resolve(this.cordovaPath, "plugins/fetch.json"))
58
- ? await FsUtil.readJsonAsync(path.resolve(this.cordovaPath, "plugins/fetch.json"))
59
- : undefined;
60
- const alreadyPlugins = pluginsFetch != undefined
61
- ? Object.values(pluginsFetch)
62
- .map((item: any) => (item.source.id !== undefined ? item.source.id.replace(/@.*$/, "") : item.source.url))
63
- : [];
64
-
65
- for (const plugin of this._config.plugins.distinct()) {
66
- if (!alreadyPlugins.includes(plugin)) {
67
- await this._execAsync(`${this._binPath} plugin add ${plugin}`, this.cordovaPath);
68
- }
58
+ // 설치 미빌드 플랫폼 삭제
59
+ for (const alreadyPlatform of alreadyPlatforms) {
60
+ if (this._config.target?.[alreadyPlatform] == null) {
61
+ await this._execAsync(`${this._binPath} platform remove ${alreadyPlatform}`, this.cordovaPath);
69
62
  }
70
63
  }
71
64
 
72
- // ICON 파일 복사
73
- if (this._config.icon !== undefined) {
74
- await FsUtil.copyAsync(path.resolve(this._rootPath, this._config.icon), path.resolve(this.cordovaPath, "res", "icon", "icon.png"));
75
- }
76
-
77
- // CONFIG
78
- const configFilePath = path.resolve(this.cordovaPath, "config.xml");
79
- let configFileContent = await FsUtil.readFileAsync(configFilePath);
80
-
81
- // CONFIG: 버전 설정
82
- configFileContent = configFileContent.replace(/version="[^"]*"/g, `version="${this._npmConfig.version}"`);
83
-
84
- // CONFIG: ICON 설정
85
- if (this._config.icon !== undefined && !configFileContent.includes("<icon")) {
86
- configFileContent = configFileContent.replace("</widget>", " <icon src=\"res/icon/icon.png\" />\r\n</widget>");
65
+ // 미설치 플러그인들 설치
66
+ const pluginsFetch = FsUtil.exists(path.resolve(this.cordovaPath, "plugins/fetch.json"))
67
+ ? await FsUtil.readJsonAsync(path.resolve(this.cordovaPath, "plugins/fetch.json"))
68
+ : undefined;
69
+ const alreadyPlugins = pluginsFetch != undefined
70
+ ? Object.values(pluginsFetch)
71
+ .map((item: any) => (item.source.id !== undefined ? item.source.id.replace(/@.*$/, "") : item.source.url))
72
+ : [];
73
+
74
+ for (const plugin of this._config.plugins?.distinct() ?? []) {
75
+ if (!alreadyPlugins.includes(plugin)) {
76
+ await this._execAsync(`${this._binPath} plugin add ${plugin}`, this.cordovaPath);
77
+ }
87
78
  }
88
79
 
89
- // CONFIG: ANDROID usesCleartextTraffic 설정
90
- if (this._config.platforms.includes("android")) {
91
- if (!configFileContent.includes("xmlns:android=\"http://schemas.android.com/apk/res/android\"")) {
92
- configFileContent = configFileContent.replace(
93
- "xmlns=\"http://www.w3.org/ns/widgets\"",
94
- `xmlns="http://www.w3.org/ns/widgets" xmlns:android="http://schemas.android.com/apk/res/android"`
95
- );
96
- }
97
- if (!configFileContent.includes("application android:usesCleartextTraffic=\"true\" />")) {
98
- if (configFileContent.includes("<platform name=\"android\">")) {
99
- configFileContent = configFileContent.replace("<platform name=\"android\">", `<platform name="android">
100
- <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application">
101
- <application android:usesCleartextTraffic="true" />
102
- </edit-config>`);
103
- }
104
- else {
105
- configFileContent = configFileContent.replace("<content src=\"index.html\" />", `<content src="index.html" />
106
- <platform name="android">
107
- <edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application">
108
- <application android:usesCleartextTraffic="true" />
109
- </edit-config>
110
- </platform>`);
111
- }
80
+ // 설치된 미사용 플러그인 삭제
81
+ for (const alreadyPlugin of alreadyPlugins) {
82
+ if (!(this._config.plugins?.distinct() ?? []).includes(alreadyPlugin)) {
83
+ await this._execAsync(`${this._binPath} plugin remove ${alreadyPlugin}`, this.cordovaPath);
112
84
  }
113
85
  }
114
86
 
115
- // CONFIG: 파일쓰기
116
- await FsUtil.writeFileAsync(configFilePath, configFileContent);
117
- }
118
-
119
- public async buildAsync(outPath: string): Promise<void> {
120
- const packageType = this._config.buildOption?.bundle ? "bundle" : "apk";
121
-
122
- // ANDROID 서명 처리
123
- if (this._config.buildOption?.sign?.android) {
87
+ // ANDROID SIGN 파일 복사
88
+ if (this._config.target?.android?.sign) {
124
89
  await FsUtil.copyAsync(
125
- path.resolve(this._rootPath, this._config.buildOption.sign.android.keystore),
126
- path.resolve(this.cordovaPath, path.basename(this._config.buildOption.sign.android.keystore))
90
+ path.resolve(this._rootPath, this._config.target.android.sign.keystore),
91
+ path.resolve(this.cordovaPath, "android.keystore")
127
92
  );
128
- await FsUtil.writeJsonAsync(
129
- path.resolve(this.cordovaPath, "build.json"),
130
- {
93
+ }
94
+ else {
95
+ await FsUtil.removeAsync(path.resolve(this.cordovaPath, "android.keystore"));
96
+ }
97
+
98
+ // 빌드 옵션 파일 생성
99
+ await FsUtil.writeJsonAsync(
100
+ path.resolve(this.cordovaPath, "build.json"),
101
+ {
102
+ ...this._config.target?.android ? {
131
103
  android: {
132
104
  release: {
133
- keystore: path.basename(this._config.buildOption.sign.android.keystore),
134
- storePassword: this._config.buildOption.sign.android.storePassword,
135
- alias: this._config.buildOption.sign.android.alias,
136
- password: this._config.buildOption.sign.android.password,
137
- keystoreType: this._config.buildOption.sign.android.keystoreType,
138
- packageType
105
+ packageType: this._config.target.android.bundle ? "bundle" : "apk",
106
+ ...this._config.target.android.sign ? {
107
+ keystore: path.resolve(this.cordovaPath, "android.keystore"),
108
+ storePassword: this._config.target.android.sign.storePassword,
109
+ alias: this._config.target.android.sign.alias,
110
+ password: this._config.target.android.sign.password,
111
+ keystoreType: this._config.target.android.sign.keystoreType
112
+ } : {}
139
113
  }
140
114
  }
141
- }
142
- );
115
+ } : {}
116
+ }
117
+ );
118
+
119
+ // ICON 파일 복사
120
+ if (this._config.icon !== undefined) {
121
+ await FsUtil.copyAsync(path.resolve(this._rootPath, this._config.icon), path.resolve(this.cordovaPath, "res", "icon.png"));
122
+ }
123
+ else {
124
+ await FsUtil.removeAsync(path.resolve(this.cordovaPath, "res", "icon.png"));
143
125
  }
144
126
 
145
- // CONFIG
127
+ // CONFIG: 초기값 백업
146
128
  const configFilePath = path.resolve(this.cordovaPath, "config.xml");
147
- let configFileContent = await FsUtil.readFileAsync(configFilePath);
129
+ const configBackFilePath = path.resolve(this.cordovaPath, "config.xml.bak");
130
+ if (!FsUtil.exists(configBackFilePath)) {
131
+ await FsUtil.copyAsync(configFilePath, configBackFilePath);
132
+ }
133
+
134
+ // CONFIG: 초기값 읽기
135
+ const configFileContent = await FsUtil.readFileAsync(configBackFilePath);
136
+ const configXml = await xml2js.parseStringPromise(configFileContent);
137
+
138
+
139
+ // CONFIG: 버전 설정
140
+ configXml.widget.$.version = this._npmConfig.version;
141
+
142
+ // CONFIG: ICON 설정
143
+ if (this._config.icon !== undefined) {
144
+ configXml["widget"]["icon"] = [{ "$": { "src": "res/icon.png" } }];
145
+ }
148
146
 
149
- // CONFIG: 접근허용 일단 모두 지우기
150
- configFileContent = configFileContent.replace(/ {4}<allow-navigation href="[^"]*" \/>\n/g, "");
147
+ // CONFIG: 접근허용 세팅
148
+ configXml["widget"]["allow-navigation"] = [{ "$": { "href": "*://*/*" } }];
151
149
 
152
- // CONFIG: 접근허용 등록
153
- configFileContent = configFileContent.replace("</widget>", ` <allow-navigation href="*://*/*" />\n</widget>`);
150
+ // CONFIG: ANDROID usesCleartextTraffic 설정
151
+ if (this._config.target?.android) {
152
+ configXml.widget.$["xmlns:android"] = "http://schemas.android.com/apk/res/android";
153
+
154
+ configXml["widget"]["platform"] = configXml["widget"]["platform"] ?? [];
155
+ configXml["widget"]["platform"].push({
156
+ "$": {
157
+ "name": "android"
158
+ },
159
+ "edit-config": [{
160
+ "$": {
161
+ "file": "app/src/main/AndroidManifest.xml",
162
+ "mode": "merge",
163
+ "target": "/manifest/application"
164
+ },
165
+ "application": [{
166
+ "android:usesCleartextTraffic": "true"
167
+ }]
168
+ }]
169
+ });
170
+ }
171
+
172
+ // CONFIG: 파일 새로 쓰기
173
+ const configResultContent = new xml2js.Builder().buildObject(configXml);
174
+ await FsUtil.writeFileAsync(configFilePath, configResultContent);
154
175
 
155
- // CONFIG: 파일쓰기
156
- await FsUtil.writeFileAsync(configFilePath, configFileContent);
176
+ // 플랫폼 www 준비
177
+ await this._execAsync(`${this._binPath} prepare`, this.cordovaPath);
178
+ }
157
179
 
180
+ public async buildAsync(outPath: string): Promise<void> {
158
181
  // 실행
159
- const buildType = this._config.buildOption?.debug ? "debug" : "release";
182
+ const buildType = this._config.debug ? "debug" : "release";
160
183
  for (const platform of this.platforms) {
161
- await this._execAsync(`${this._binPath} build ${platform} --${buildType} --packageType=${packageType}`, this.cordovaPath);
184
+ await this._execAsync(`${this._binPath} build ${platform} --${buildType}`, this.cordovaPath);
162
185
  }
163
186
 
164
- // 결과물 복사
165
- for (const platform of this.platforms) {
166
- if (platform === "android") {
167
- const targetOutPath = path.resolve(outPath, platform);
168
- const apkFileName = this._config.buildOption?.sign?.android ? `app-${buildType}.apk` : `app-${buildType}-unsigned.apk`;
169
- const distApkFileName = path.basename(`${this._config.appName}${this._config.buildOption?.sign?.android ? "" : "-unsigned"}-v${this._npmConfig.version}.apk`);
170
- const latestDistApkFileName = path.basename(`${this._config.appName}${this._config.buildOption?.sign?.android ? "" : "-unsigned"}-latest.apk`);
171
- await FsUtil.mkdirsAsync(targetOutPath);
172
- await FsUtil.copyAsync(
173
- path.resolve(this.cordovaPath, "platforms/android/app/build/outputs/apk", buildType, apkFileName),
174
- path.resolve(targetOutPath, distApkFileName)
175
- );
176
- await FsUtil.copyAsync(
177
- path.resolve(this.cordovaPath, "platforms/android/app/build/outputs/apk", buildType, apkFileName),
178
- path.resolve(targetOutPath, latestDistApkFileName)
179
- );
180
- }
181
- else if (platform === "electron") {
182
- const targetOutPath = path.resolve(outPath, platform);
183
- const outFileName = `${this._config.appName} Setup ${this._npmConfig.version}.exe`;
184
- const distFileName = outFileName;
185
- const latestDistFileName = `${this._config.appName} Setup latest.exe`;
186
- await FsUtil.mkdirsAsync(targetOutPath);
187
- await FsUtil.copyAsync(
188
- path.resolve(this.cordovaPath, "platforms/electron/build/", outFileName),
189
- path.resolve(targetOutPath, distFileName)
190
- );
191
- await FsUtil.copyAsync(
192
- path.resolve(this.cordovaPath, "platforms/electron/build/", outFileName),
193
- path.resolve(targetOutPath, latestDistFileName)
194
- );
195
- }
196
- else {
197
- throw new NotImplementError();
198
- }
187
+ // 결과물 복사: ANDROID
188
+ if (this._config.target?.android) {
189
+ const targetOutPath = path.resolve(outPath, "android");
190
+ const apkFileName = this._config.target.android.sign ? `app-${buildType}.apk` : `app-${buildType}-unsigned.apk`;
191
+ const distApkFileName = path.basename(`${this._config.appName}${this._config.target.android.sign ? "" : "-unsigned"}-v${this._npmConfig.version}.apk`);
192
+ const latestDistApkFileName = path.basename(`${this._config.appName}${this._config.target.android.sign ? "" : "-unsigned"}-latest.apk`);
193
+ await FsUtil.mkdirsAsync(targetOutPath);
194
+ await FsUtil.copyAsync(
195
+ path.resolve(this.cordovaPath, "platforms/android/app/build/outputs/apk", buildType, apkFileName),
196
+ path.resolve(targetOutPath, distApkFileName)
197
+ );
198
+ await FsUtil.copyAsync(
199
+ path.resolve(this.cordovaPath, "platforms/android/app/build/outputs/apk", buildType, apkFileName),
200
+ path.resolve(targetOutPath, latestDistApkFileName)
201
+ );
199
202
  }
200
203
 
201
- if (this.platforms.includes("android")) {
204
+ if (this._config.target?.android) {
202
205
  // 자동업데이트를 위한 zip 파일 쓰기
203
206
  const zip = new JSZip();
204
- const resultFiles = await FsUtil.globAsync(path.resolve(this.cordovaPath, "www", "**/*"), {
207
+ const resultFiles = await FsUtil.globAsync(path.resolve(this.cordovaPath, "platforms", "android", "app", "src", "main", "assets", "www", "**/*"), {
205
208
  dot: true,
206
209
  nodir: true
207
210
  });
@@ -218,23 +221,12 @@ export class SdCliCordova {
218
221
  }
219
222
  }
220
223
 
221
- public static async runWebviewOnDeviceAsync(cordovaPath: string, platform: TSdCliCordovaPlatform, url: string): Promise<void> {
224
+ public static async runWebviewOnDeviceAsync(rootPath: string, platform: "browser" | "android", pkgName: string, url: string): Promise<void> {
225
+ const cordovaPath = path.resolve(rootPath, `packages/${pkgName}/.cordova/`);
226
+
222
227
  await FsUtil.removeAsync(path.resolve(cordovaPath, "www"));
223
228
  await FsUtil.mkdirsAsync(path.resolve(cordovaPath, "www"));
224
- await FsUtil.writeFileAsync(path.resolve(cordovaPath, "www/index.html"), `'${url}'로 이동중... <script>setTimeout(function () {window.location.href = "${url}"}, 3000);</script>`.trim());
225
-
226
- // CONFIG
227
- const configFilePath = path.resolve(cordovaPath, "config.xml");
228
- let configFileContent = await FsUtil.readFileAsync(configFilePath);
229
-
230
- // CONFIG: 접근허용 일단 모두 지우기
231
- configFileContent = configFileContent.replace(/ {4}<allow-navigation href="[^"]*" \/>\n/g, "");
232
-
233
- // CONFIG: 접근허용 등록
234
- configFileContent = configFileContent.replace("</widget>", ` <allow-navigation href="*://*/*" />\n</widget>`);
235
-
236
- // CONFIG: 파일쓰기
237
- await FsUtil.writeFileAsync(configFilePath, configFileContent);
229
+ await FsUtil.writeFileAsync(path.resolve(cordovaPath, "www/index.html"), `'${url}'로 이동중... <script>setTimeout(function () {window.location.href = "${url.replace(/\/$/, "")}/${pkgName}/cordova/"}, 3000);</script>`.trim());
238
230
 
239
231
  const binPath = path.resolve(process.cwd(), "node_modules/.bin/cordova.cmd");
240
232
  await SdProcess.spawnAsync(`${binPath} run ${platform} --device`, { cwd: cordovaPath }, true);
@@ -0,0 +1,76 @@
1
+ import { FsUtil, Logger, SdProcess } from "@simplysm/sd-core-node";
2
+ import { INpmConfig, ISdCliClientPackageConfig } from "../commons";
3
+ import path from "path";
4
+ import { SdCliConfigUtil } from "../utils/SdCliConfigUtil";
5
+ import ts from "typescript";
6
+
7
+ export class SdCliElectron {
8
+ private readonly _logger = Logger.get(["simplysm", "sd-cli", this.constructor.name]);
9
+
10
+ public constructor(private readonly _rootPath: string) {
11
+ }
12
+
13
+ public async runWebviewOnDeviceAsync(pkgName: string, url: string, opt: { confFileRelPath: string; optNames: string[] }): Promise<void> {
14
+ this._logger.debug("프로젝트 설정 가져오기...");
15
+ const config = await SdCliConfigUtil.loadConfigAsync(path.resolve(this._rootPath, opt.confFileRelPath), true, opt.optNames);
16
+ const pkgConfig = config.packages[pkgName] as ISdCliClientPackageConfig | undefined;
17
+ if (!pkgConfig) throw new Error("패키지 설정을 찾을 수 없습니다.");
18
+
19
+ const electronConfig = pkgConfig.builder?.electron;
20
+ if (!electronConfig) throw new Error("ELECTRON 설정을 찾을 수 없습니다.");
21
+
22
+ const pkgRootPath = path.resolve(this._rootPath, `packages/${pkgName}`);
23
+ const electronSrcPath = path.resolve(pkgRootPath, `.electron/src`);
24
+
25
+ await FsUtil.removeAsync(electronSrcPath);
26
+
27
+ const npmConfig = (await FsUtil.readJsonAsync(path.resolve(pkgRootPath, `package.json`))) as INpmConfig;
28
+ const electronVersion = npmConfig.dependencies?.["electron"];
29
+ if (electronVersion === undefined) {
30
+ throw new Error("ELECTRON 빌드 패키지의 'dependencies'에는 'electron'이 반드시 포함되어야 합니다.");
31
+ }
32
+
33
+ const dotenvVersion = npmConfig.dependencies?.["dotenv"];
34
+ if (dotenvVersion === undefined) {
35
+ throw new Error("ELECTRON 빌드 패키지의 'dependencies'에는 'dotenv'가 반드시 포함되어야 합니다.");
36
+ }
37
+
38
+ await FsUtil.writeJsonAsync(path.resolve(electronSrcPath, `package.json`), {
39
+ name: npmConfig.name,
40
+ version: npmConfig.version,
41
+ description: npmConfig.description,
42
+ main: "electron.js",
43
+ author: npmConfig.author,
44
+ license: npmConfig.license,
45
+ devDependencies: {
46
+ "electron": electronVersion.replace("^", "")
47
+ },
48
+ dependencies: {
49
+ "dotenv": dotenvVersion
50
+ }
51
+ });
52
+
53
+ if (FsUtil.exists(path.resolve(pkgRootPath, "src/favicon.ico"))) {
54
+ await FsUtil.copyAsync(path.resolve(pkgRootPath, "src/favicon.ico"), path.resolve(electronSrcPath, "favicon.ico"));
55
+ }
56
+ if (FsUtil.exists(path.resolve(pkgRootPath, "src/assets"))) {
57
+ await FsUtil.copyAsync(path.resolve(pkgRootPath, "src/assets"), path.resolve(electronSrcPath, "assets"));
58
+ }
59
+
60
+ await FsUtil.writeFileAsync(path.resolve(electronSrcPath, `.env`), [
61
+ "NODE_ENV=development",
62
+ `SD_TITLE=${npmConfig.description}`,
63
+ `SD_VERSION=${npmConfig.version}`,
64
+ `SD_ELECTRON_DEV_URL=${url.replace(/\/$/, "")}/${pkgName}/electron/`,
65
+ (electronConfig.icon !== undefined) ? `SD_ELECTRON_ICON=${electronConfig.icon}` : `SD_ELECTRON_ICON=favicon.ico`,
66
+ ...(pkgConfig.env !== undefined) ? Object.keys(pkgConfig.env).map((key) => `${key}=${pkgConfig.env![key]}`) : []
67
+ ].filterExists().join("\n"));
68
+
69
+ let electronTsFileContent = await FsUtil.readFileAsync(path.resolve(pkgRootPath, `src/electron.ts`));
70
+ electronTsFileContent = "require(\"dotenv\").config({ path: `${__dirname}\\\\.env` });\n" + electronTsFileContent;
71
+ const result = ts.transpileModule(electronTsFileContent, { compilerOptions: { module: ts.ModuleKind.CommonJS } });
72
+ await FsUtil.writeFileAsync(path.resolve(electronSrcPath, "electron.js"), result.outputText);
73
+
74
+ await SdProcess.spawnAsync(`${path.resolve(this._rootPath, "node_modules/.bin/electron.cmd")} ${electronSrcPath}`, { cwd: electronSrcPath }, true);
75
+ }
76
+ }