@simplysm/sd-cli 7.3.1 → 10.0.4

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 (217) hide show
  1. package/.eslintrc.cjs +18 -0
  2. package/dist/build-cluster.js +75 -0
  3. package/dist/build-cluster.js.map +1 -0
  4. package/dist/builders/SdCliJsLibLinter.d.ts +18 -0
  5. package/dist/builders/SdCliJsLibLinter.js +69 -0
  6. package/dist/builders/SdCliJsLibLinter.js.map +1 -0
  7. package/dist/builders/SdCliTsLibBuilder.d.ts +20 -0
  8. package/dist/builders/SdCliTsLibBuilder.js +205 -0
  9. package/dist/builders/SdCliTsLibBuilder.js.map +1 -0
  10. package/dist/commons.d.ts +3 -117
  11. package/dist/commons.js +2 -0
  12. package/dist/commons.js.map +1 -0
  13. package/dist/entry/SdCliProject.d.ts +28 -0
  14. package/dist/entry/SdCliProject.js +269 -0
  15. package/dist/entry/SdCliProject.js.map +1 -0
  16. package/dist/sd-cli.js +118 -0
  17. package/dist/sd-cli.js.map +1 -0
  18. package/dist/utils/SdCliBuildResultUtil.d.ts +1 -4
  19. package/dist/utils/SdCliBuildResultUtil.js +37 -0
  20. package/dist/utils/SdCliBuildResultUtil.js.map +1 -0
  21. package/dist/utils/SdCliConfigUtil.js +69 -0
  22. package/dist/utils/SdCliConfigUtil.js.map +1 -0
  23. package/package.json +10 -59
  24. package/src/build-cluster.ts +82 -0
  25. package/src/builders/SdCliJsLibLinter.ts +84 -0
  26. package/src/builders/SdCliTsLibBuilder.ts +265 -0
  27. package/src/commons.ts +3 -123
  28. package/src/entry/SdCliProject.ts +351 -0
  29. package/src/sd-cli.ts +135 -0
  30. package/src/utils/SdCliBuildResultUtil.ts +5 -38
  31. package/tsconfig.json +18 -0
  32. package/README.md +0 -105
  33. package/assets/client-files/assets/icons/icon-128x128.png +0 -0
  34. package/assets/client-files/assets/icons/icon-144x144.png +0 -0
  35. package/assets/client-files/assets/icons/icon-152x152.png +0 -0
  36. package/assets/client-files/assets/icons/icon-192x192.png +0 -0
  37. package/assets/client-files/assets/icons/icon-384x384.png +0 -0
  38. package/assets/client-files/assets/icons/icon-512x512.png +0 -0
  39. package/assets/client-files/assets/icons/icon-72x72.png +0 -0
  40. package/assets/client-files/assets/icons/icon-96x96.png +0 -0
  41. package/assets/client-files/favicon.ico +0 -0
  42. package/dist/SdCliBuildResultError.d.ts +0 -5
  43. package/dist/SdCliBuildResultError.mjs +0 -8
  44. package/dist/bin/sd-cli.d.ts +0 -2
  45. package/dist/bin/sd-cli.mjs +0 -410
  46. package/dist/build-tool/SdCliCacheCompilerHost.d.ts +0 -10
  47. package/dist/build-tool/SdCliCacheCompilerHost.mjs +0 -51
  48. package/dist/build-tool/SdCliCordova.d.ts +0 -16
  49. package/dist/build-tool/SdCliCordova.mjs +0 -212
  50. package/dist/build-tool/SdCliElectron.d.ts +0 -9
  51. package/dist/build-tool/SdCliElectron.mjs +0 -71
  52. package/dist/build-tool/SdCliGithubApi.d.ts +0 -13
  53. package/dist/build-tool/SdCliGithubApi.mjs +0 -92
  54. package/dist/build-tool/SdCliIndexFileGenerator.d.ts +0 -13
  55. package/dist/build-tool/SdCliIndexFileGenerator.mjs +0 -62
  56. package/dist/build-tool/SdCliNgCacheCompilerHost.d.ts +0 -12
  57. package/dist/build-tool/SdCliNgCacheCompilerHost.mjs +0 -43
  58. package/dist/build-tool/SdCliPackageLinter.d.ts +0 -8
  59. package/dist/build-tool/SdCliPackageLinter.mjs +0 -62
  60. package/dist/builder/SdCliClientBuilder.d.ts +0 -26
  61. package/dist/builder/SdCliClientBuilder.mjs +0 -761
  62. package/dist/builder/SdCliJsLibBuilder.d.ts +0 -14
  63. package/dist/builder/SdCliJsLibBuilder.mjs +0 -54
  64. package/dist/builder/SdCliServerBuilder.d.ts +0 -28
  65. package/dist/builder/SdCliServerBuilder.mjs +0 -482
  66. package/dist/builder/SdCliTsLibBuilder.d.ts +0 -35
  67. package/dist/builder/SdCliTsLibBuilder.mjs +0 -317
  68. package/dist/commons.mjs +0 -2
  69. package/dist/entry-points/SdCliFileCrypto.d.ts +0 -7
  70. package/dist/entry-points/SdCliFileCrypto.mjs +0 -72
  71. package/dist/entry-points/SdCliLocalUpdate.d.ts +0 -13
  72. package/dist/entry-points/SdCliLocalUpdate.mjs +0 -100
  73. package/dist/entry-points/SdCliPrepare.d.ts +0 -5
  74. package/dist/entry-points/SdCliPrepare.mjs +0 -86
  75. package/dist/entry-points/SdCliProject.d.ts +0 -34
  76. package/dist/entry-points/SdCliProject.mjs +0 -416
  77. package/dist/entry-points/SdCliProjectGenerator.d.ts +0 -44
  78. package/dist/entry-points/SdCliProjectGenerator.mjs +0 -326
  79. package/dist/entry-points/file/base/fc_package_eslintrc.d.ts +0 -3
  80. package/dist/entry-points/file/base/fc_package_eslintrc.mjs +0 -31
  81. package/dist/entry-points/file/base/fc_package_npmconfig.d.ts +0 -9
  82. package/dist/entry-points/file/base/fc_package_npmconfig.mjs +0 -32
  83. package/dist/entry-points/file/base/fc_package_tsconfig.d.ts +0 -5
  84. package/dist/entry-points/file/base/fc_package_tsconfig.mjs +0 -13
  85. package/dist/entry-points/file/client/fc_package_AppModule.d.ts +0 -1
  86. package/dist/entry-points/file/client/fc_package_AppModule.mjs +0 -37
  87. package/dist/entry-points/file/client/fc_package_AppPage.d.ts +0 -1
  88. package/dist/entry-points/file/client/fc_package_AppPage.mjs +0 -14
  89. package/dist/entry-points/file/client/fc_package_Page.d.ts +0 -4
  90. package/dist/entry-points/file/client/fc_package_Page.mjs +0 -19
  91. package/dist/entry-points/file/client/fc_package_client_main.d.ts +0 -1
  92. package/dist/entry-points/file/client/fc_package_client_main.mjs +0 -19
  93. package/dist/entry-points/file/client/fc_package_index.d.ts +0 -3
  94. package/dist/entry-points/file/client/fc_package_index.mjs +0 -88
  95. package/dist/entry-points/file/client/fc_package_manifest.d.ts +0 -5
  96. package/dist/entry-points/file/client/fc_package_manifest.mjs +0 -54
  97. package/dist/entry-points/file/client/fc_package_polyfills.d.ts +0 -1
  98. package/dist/entry-points/file/client/fc_package_polyfills.mjs +0 -11
  99. package/dist/entry-points/file/client/fc_package_styles.d.ts +0 -1
  100. package/dist/entry-points/file/client/fc_package_styles.mjs +0 -7
  101. package/dist/entry-points/file/db/fc_package_DbContext.d.ts +0 -3
  102. package/dist/entry-points/file/db/fc_package_DbContext.mjs +0 -14
  103. package/dist/entry-points/file/db/fc_package_DbModel.d.ts +0 -4
  104. package/dist/entry-points/file/db/fc_package_DbModel.mjs +0 -12
  105. package/dist/entry-points/file/project/fc_project_editor_config.d.ts +0 -1
  106. package/dist/entry-points/file/project/fc_project_editor_config.mjs +0 -22
  107. package/dist/entry-points/file/project/fc_project_eslintrc.d.ts +0 -1
  108. package/dist/entry-points/file/project/fc_project_eslintrc.mjs +0 -30
  109. package/dist/entry-points/file/project/fc_project_gitattributes.d.ts +0 -1
  110. package/dist/entry-points/file/project/fc_project_gitattributes.mjs +0 -6
  111. package/dist/entry-points/file/project/fc_project_gitignore.d.ts +0 -1
  112. package/dist/entry-points/file/project/fc_project_gitignore.mjs +0 -27
  113. package/dist/entry-points/file/project/fc_project_npmconfig.d.ts +0 -7
  114. package/dist/entry-points/file/project/fc_project_npmconfig.mjs +0 -37
  115. package/dist/entry-points/file/project/fc_project_readme.d.ts +0 -3
  116. package/dist/entry-points/file/project/fc_project_readme.mjs +0 -13
  117. package/dist/entry-points/file/project/fc_project_simplysm.d.ts +0 -1
  118. package/dist/entry-points/file/project/fc_project_simplysm.mjs +0 -2
  119. package/dist/entry-points/file/project/fc_project_tsconfig.d.ts +0 -1
  120. package/dist/entry-points/file/project/fc_project_tsconfig.mjs +0 -25
  121. package/dist/entry-points/file/server/fc_package_server_main.d.ts +0 -5
  122. package/dist/entry-points/file/server/fc_package_server_main.mjs +0 -60
  123. package/dist/index.d.ts +0 -54
  124. package/dist/index.mjs +0 -55
  125. package/dist/ng-tools/SdCliNgModuleGenerator.d.ts +0 -29
  126. package/dist/ng-tools/SdCliNgModuleGenerator.mjs +0 -502
  127. package/dist/ng-tools/babel/SdCliBbFileMetadata.d.ts +0 -25
  128. package/dist/ng-tools/babel/SdCliBbFileMetadata.mjs +0 -539
  129. package/dist/ng-tools/babel/SdCliBbRootMetadata.d.ts +0 -23
  130. package/dist/ng-tools/babel/SdCliBbRootMetadata.mjs +0 -247
  131. package/dist/ng-tools/babel/SdCliBbUtil.d.ts +0 -5
  132. package/dist/ng-tools/babel/SdCliBbUtil.mjs +0 -14
  133. package/dist/ng-tools/babel/TSdCliBbNgMetadata.d.ts +0 -42
  134. package/dist/ng-tools/babel/TSdCliBbNgMetadata.mjs +0 -216
  135. package/dist/ng-tools/babel/TSdCliBbTypeMetadata.d.ts +0 -55
  136. package/dist/ng-tools/babel/TSdCliBbTypeMetadata.mjs +0 -151
  137. package/dist/ng-tools/commons.d.ts +0 -9
  138. package/dist/ng-tools/commons.mjs +0 -2
  139. package/dist/ng-tools/typescript/SdCliTsFileMetadata.d.ts +0 -61
  140. package/dist/ng-tools/typescript/SdCliTsFileMetadata.mjs +0 -325
  141. package/dist/ng-tools/typescript/SdCliTsRootMetadata.d.ts +0 -8
  142. package/dist/ng-tools/typescript/SdCliTsRootMetadata.mjs +0 -28
  143. package/dist/ng-tools/typescript/SdCliTsUtil.d.ts +0 -5
  144. package/dist/ng-tools/typescript/SdCliTsUtil.mjs +0 -28
  145. package/dist/packages/SdCliPackage.d.ts +0 -22
  146. package/dist/packages/SdCliPackage.mjs +0 -206
  147. package/dist/utils/SdCliBuildResultUtil.mjs +0 -63
  148. package/dist/utils/SdCliConfigUtil.mjs +0 -69
  149. package/dist/utils/SdCliNpmConfigUtil.d.ts +0 -7
  150. package/dist/utils/SdCliNpmConfigUtil.mjs +0 -15
  151. package/dist/worker/build-worker.mjs +0 -67
  152. package/dist/worker/server-worker.mjs +0 -67
  153. package/docs/client-add-page.md +0 -8
  154. package/docs/client-router.md +0 -85
  155. package/docs/client-sw.md +0 -101
  156. package/docs/conf-orm.md +0 -81
  157. package/docs/conf-usage.md +0 -5
  158. package/docs/lib-local-update.md +0 -50
  159. package/docs/lib-ts-paths.md +0 -25
  160. package/lib/cordova-entry.js +0 -22
  161. package/src/SdCliBuildResultError.ts +0 -9
  162. package/src/bin/sd-cli.ts +0 -493
  163. package/src/build-tool/SdCliCacheCompilerHost.ts +0 -79
  164. package/src/build-tool/SdCliCordova.ts +0 -263
  165. package/src/build-tool/SdCliElectron.ts +0 -84
  166. package/src/build-tool/SdCliGithubApi.ts +0 -111
  167. package/src/build-tool/SdCliIndexFileGenerator.ts +0 -79
  168. package/src/build-tool/SdCliNgCacheCompilerHost.ts +0 -58
  169. package/src/build-tool/SdCliPackageLinter.ts +0 -74
  170. package/src/builder/SdCliClientBuilder.ts +0 -871
  171. package/src/builder/SdCliJsLibBuilder.ts +0 -70
  172. package/src/builder/SdCliServerBuilder.ts +0 -552
  173. package/src/builder/SdCliTsLibBuilder.ts +0 -450
  174. package/src/entry-points/SdCliFileCrypto.ts +0 -87
  175. package/src/entry-points/SdCliLocalUpdate.ts +0 -121
  176. package/src/entry-points/SdCliPrepare.ts +0 -86
  177. package/src/entry-points/SdCliProject.ts +0 -491
  178. package/src/entry-points/SdCliProjectGenerator.ts +0 -402
  179. package/src/entry-points/file/base/fc_package_eslintrc.ts +0 -30
  180. package/src/entry-points/file/base/fc_package_npmconfig.ts +0 -43
  181. package/src/entry-points/file/base/fc_package_tsconfig.ts +0 -12
  182. package/src/entry-points/file/client/fc_package_AppModule.ts +0 -36
  183. package/src/entry-points/file/client/fc_package_AppPage.ts +0 -13
  184. package/src/entry-points/file/client/fc_package_Page.ts +0 -19
  185. package/src/entry-points/file/client/fc_package_client_main.ts +0 -18
  186. package/src/entry-points/file/client/fc_package_index.ts +0 -87
  187. package/src/entry-points/file/client/fc_package_manifest.ts +0 -53
  188. package/src/entry-points/file/client/fc_package_polyfills.ts +0 -10
  189. package/src/entry-points/file/client/fc_package_styles.ts +0 -6
  190. package/src/entry-points/file/db/fc_package_DbContext.ts +0 -14
  191. package/src/entry-points/file/db/fc_package_DbModel.ts +0 -11
  192. package/src/entry-points/file/project/fc_project_editor_config.ts +0 -21
  193. package/src/entry-points/file/project/fc_project_eslintrc.ts +0 -29
  194. package/src/entry-points/file/project/fc_project_gitattributes.ts +0 -5
  195. package/src/entry-points/file/project/fc_project_gitignore.ts +0 -26
  196. package/src/entry-points/file/project/fc_project_npmconfig.ts +0 -36
  197. package/src/entry-points/file/project/fc_project_readme.ts +0 -12
  198. package/src/entry-points/file/project/fc_project_simplysm.ts +0 -1
  199. package/src/entry-points/file/project/fc_project_tsconfig.ts +0 -24
  200. package/src/entry-points/file/server/fc_package_server_main.ts +0 -62
  201. package/src/index.ts +0 -54
  202. package/src/ng-tools/SdCliNgModuleGenerator.ts +0 -672
  203. package/src/ng-tools/babel/SdCliBbFileMetadata.ts +0 -629
  204. package/src/ng-tools/babel/SdCliBbRootMetadata.ts +0 -292
  205. package/src/ng-tools/babel/SdCliBbUtil.ts +0 -15
  206. package/src/ng-tools/babel/TSdCliBbNgMetadata.ts +0 -251
  207. package/src/ng-tools/babel/TSdCliBbTypeMetadata.ts +0 -212
  208. package/src/ng-tools/commons.ts +0 -3
  209. package/src/ng-tools/typescript/SdCliTsFileMetadata.ts +0 -384
  210. package/src/ng-tools/typescript/SdCliTsRootMetadata.ts +0 -32
  211. package/src/ng-tools/typescript/SdCliTsUtil.ts +0 -29
  212. package/src/packages/SdCliPackage.ts +0 -259
  213. package/src/utils/SdCliNpmConfigUtil.ts +0 -16
  214. package/src/worker/build-worker.ts +0 -73
  215. package/src/worker/server-worker.ts +0 -72
  216. /package/dist/{worker/build-worker.d.ts → build-cluster.d.ts} +0 -0
  217. /package/dist/{worker/server-worker.d.ts → sd-cli.d.ts} +0 -0
@@ -1,263 +0,0 @@
1
- import { INpmConfig, ISdCliClientBuilderCordovaConfig } from "../commons";
2
- import * as path from "path";
3
- import { FsUtil, Logger, SdProcess } from "@simplysm/sd-core-node";
4
- import xml2js from "xml2js";
5
-
6
- export class SdCliCordova {
7
- protected readonly _logger: Logger;
8
-
9
- private readonly _npmConfig: INpmConfig;
10
-
11
- public readonly cordovaPath = path.resolve(this._rootPath, ".cache", "cordova");
12
- private readonly _binPath = path.resolve(process.cwd(), "node_modules/.bin/cordova.cmd");
13
-
14
- public get platforms(): ("browser" | "android")[] {
15
- return [
16
- ...this._config.target?.browser ? ["browser" as const] : [],
17
- ...this._config.target?.android ? ["android" as const] : []
18
- ];
19
- }
20
-
21
- public constructor(private readonly _rootPath: string, private readonly _config: ISdCliClientBuilderCordovaConfig) {
22
- this._npmConfig = FsUtil.readJson(path.resolve(this._rootPath, "package.json"));
23
- this._logger = Logger.get(["simplysm", "sd-cli", this.constructor.name, this._npmConfig.name]);
24
- }
25
-
26
- private async _execAsync(cmd: string, cwd: string): Promise<void> {
27
- this._logger.debug(cmd);
28
- const msg = await SdProcess.spawnAsync(cmd, { cwd });
29
- this._logger.debug(msg);
30
- }
31
-
32
- public async initializeAsync(): Promise<void> {
33
- if (FsUtil.exists(this.cordovaPath)) {
34
- this._logger.log("이미 생성되어있는 '.cordova'를 사용합니다.");
35
- }
36
- else {
37
- await this._execAsync(`${this._binPath} telemetry on`, this._rootPath);
38
-
39
- // 프로젝트 생성
40
- await this._execAsync(`${this._binPath} create "${this.cordovaPath}" "${this._config.appId}" "${this._config.appName}"`, process.cwd());
41
- }
42
-
43
- // platforms 폴더 혹시 없으면 생성
44
- await FsUtil.mkdirsAsync(path.resolve(this.cordovaPath, "platforms"));
45
-
46
- // www 폴더 혹시 없으면 생성
47
- await FsUtil.mkdirsAsync(path.resolve(this.cordovaPath, "www"));
48
-
49
- // 미설치 빌드 플랫폼 신규 생성
50
- const alreadyPlatforms = await FsUtil.readdirAsync(path.resolve(this.cordovaPath, "platforms"));
51
- for (const platform of this.platforms) {
52
- if (!alreadyPlatforms.includes(platform)) {
53
- await this._execAsync(`${this._binPath} platform add ${platform}`, this.cordovaPath);
54
- }
55
- }
56
-
57
- // 설치 미빌드 플랫폼 삭제
58
- for (const alreadyPlatform of alreadyPlatforms) {
59
- if (this._config.target?.[alreadyPlatform] == null) {
60
- await this._execAsync(`${this._binPath} platform remove ${alreadyPlatform}`, this.cordovaPath);
61
- }
62
- }
63
-
64
- // 설치된 미사용 플러그인 삭제
65
- const pluginsFetch = FsUtil.exists(path.resolve(this.cordovaPath, "plugins/fetch.json"))
66
- ? await FsUtil.readJsonAsync(path.resolve(this.cordovaPath, "plugins/fetch.json"))
67
- : undefined;
68
- const alreadyPluginIds = pluginsFetch != undefined
69
- ? Object.values(pluginsFetch)
70
- .map((item: any) => (item.source.id !== undefined ? item.source.id : item.source.url))
71
- : [];
72
- const usePlugins = ["cordova-plugin-ionic-webview", ...this._config.plugins ?? []].distinct();
73
-
74
- for (const alreadyPluginId of alreadyPluginIds) {
75
- let hasPlugin = false;
76
- for (const usePlugin of usePlugins) {
77
- if (
78
- (usePlugin.includes("@") && alreadyPluginId === usePlugin) ||
79
- (!usePlugin.includes("@") && alreadyPluginId.replace(/@.*$/, "") === usePlugin)
80
- ) {
81
- hasPlugin = true;
82
- break;
83
- }
84
- }
85
-
86
- if (!hasPlugin) {
87
- await this._execAsync(`${this._binPath} plugin remove ${alreadyPluginId.replace(/@.*$/, "")}`, this.cordovaPath);
88
- }
89
- }
90
-
91
- // 미설치 플러그인들 설치
92
- for (const usePlugin of usePlugins) {
93
- if (
94
- (usePlugin.includes("@") && !alreadyPluginIds.includes(usePlugin)) ||
95
- (!usePlugin.includes("@") && !alreadyPluginIds.map((alreadyPluginId) => alreadyPluginId.replace(/@.*$/, "")).includes(usePlugin))
96
- ) {
97
- await this._execAsync(`${this._binPath} plugin add ${usePlugin}`, this.cordovaPath);
98
- }
99
- }
100
-
101
- // ANDROID SIGN 파일 복사
102
- if (this._config.target?.android?.sign) {
103
- await FsUtil.copyAsync(
104
- path.resolve(this._rootPath, this._config.target.android.sign.keystore),
105
- path.resolve(this.cordovaPath, "android.keystore")
106
- );
107
- }
108
- else {
109
- await FsUtil.removeAsync(path.resolve(this.cordovaPath, "android.keystore"));
110
- // SIGN을 안쓸경우 아래 파일이 생성되어 있으면 오류남
111
- await FsUtil.removeAsync(path.resolve(this.cordovaPath, "platforms/android/release-signing.properties"));
112
- }
113
-
114
- // 빌드 옵션 파일 생성
115
- await FsUtil.writeJsonAsync(
116
- path.resolve(this.cordovaPath, "build.json"),
117
- {
118
- ...this._config.target?.android ? {
119
- android: {
120
- release: {
121
- packageType: this._config.target.android.bundle ? "bundle" : "apk",
122
- ...this._config.target.android.sign ? {
123
- keystore: path.resolve(this.cordovaPath, "android.keystore"),
124
- storePassword: this._config.target.android.sign.storePassword,
125
- alias: this._config.target.android.sign.alias,
126
- password: this._config.target.android.sign.password,
127
- keystoreType: this._config.target.android.sign.keystoreType
128
- } : {}
129
- }
130
- }
131
- } : {}
132
- }
133
- );
134
-
135
- // ICON 파일 복사
136
- if (this._config.icon !== undefined) {
137
- await FsUtil.copyAsync(path.resolve(this._rootPath, this._config.icon), path.resolve(this.cordovaPath, "res", "icon.png"));
138
- }
139
- else {
140
- await FsUtil.removeAsync(path.resolve(this.cordovaPath, "res", "icon.png"));
141
- }
142
-
143
- // CONFIG: 초기값 백업
144
- const configFilePath = path.resolve(this.cordovaPath, "config.xml");
145
- const configBackFilePath = path.resolve(this.cordovaPath, "config.xml.bak");
146
- if (!FsUtil.exists(configBackFilePath)) {
147
- await FsUtil.copyAsync(configFilePath, configBackFilePath);
148
- }
149
-
150
- // CONFIG: 초기값 읽기
151
- const configFileContent = await FsUtil.readFileAsync(configBackFilePath);
152
- const configXml = await xml2js.parseStringPromise(configFileContent);
153
-
154
-
155
- // CONFIG: 버전 설정
156
- configXml.widget.$.version = this._npmConfig.version;
157
-
158
- // CONFIG: ICON 설정
159
- if (this._config.icon !== undefined) {
160
- configXml["widget"]["icon"] = [{ "$": { "src": "res/icon.png" } }];
161
- }
162
-
163
- // CONFIG: 접근허용 세팅
164
- configXml["widget"]["access"] = [{ "$": { "origin": "*" } }];
165
- configXml["widget"]["allow-navigation"] = [{ "$": { "href": "*" } }];
166
- configXml["widget"]["allow-intent"] = [{ "$": { "href": "*" } }];
167
- configXml["widget"]["preference"] = [{ "$": { "name": "MixedContentMode", "value": "0" } }];
168
-
169
- // CONFIG: ANDROID usesCleartextTraffic 설정
170
- if (this._config.target?.android) {
171
- configXml.widget.$["xmlns:android"] = "http://schemas.android.com/apk/res/android";
172
-
173
- configXml["widget"]["platform"] = configXml["widget"]["platform"] ?? [];
174
- configXml["widget"]["platform"].push({
175
- "$": {
176
- "name": "android"
177
- },
178
- "edit-config": [{
179
- "$": {
180
- "file": "app/src/main/AndroidManifest.xml",
181
- "mode": "merge",
182
- "target": "/manifest/application"
183
- },
184
- "application": [{
185
- "$": {
186
- "android:usesCleartextTraffic": "true"
187
- }
188
- }]
189
- }]
190
- });
191
- }
192
-
193
- // CONFIG: 파일 새로 쓰기
194
- const configResultContent = new xml2js.Builder().buildObject(configXml);
195
- await FsUtil.writeFileAsync(configFilePath, configResultContent);
196
-
197
- // 각 플랫폼 www 준비
198
- await this._execAsync(`${this._binPath} prepare`, this.cordovaPath);
199
- }
200
-
201
- public async buildAsync(outPath: string): Promise<void> {
202
- // 실행
203
- const buildType = this._config.debug ? "debug" : "release";
204
- for (const platform of this.platforms) {
205
- await this._execAsync(`${this._binPath} build ${platform} --${buildType}`, this.cordovaPath);
206
- }
207
-
208
- // 결과물 복사: ANDROID
209
- if (this._config.target?.android) {
210
- const targetOutPath = path.resolve(outPath, "android");
211
- const apkFileName = this._config.target.android.sign ? `app-${buildType}.apk` : `app-${buildType}-unsigned.apk`;
212
- // const distApkFileName = path.basename(`${this._config.appName}${this._config.target.android.sign ? "" : "-unsigned"}-v${this._npmConfig.version}.apk`);
213
- const latestDistApkFileName = path.basename(`${this._config.appName}${this._config.target.android.sign ? "" : "-unsigned"}-latest.apk`);
214
- await FsUtil.mkdirsAsync(targetOutPath);
215
- // await FsUtil.copyAsync(
216
- // path.resolve(this.cordovaPath, "platforms/android/app/build/outputs/apk", buildType, apkFileName),
217
- // path.resolve(targetOutPath, distApkFileName)
218
- // );
219
- await FsUtil.copyAsync(
220
- path.resolve(this.cordovaPath, "platforms/android/app/build/outputs/apk", buildType, apkFileName),
221
- path.resolve(targetOutPath, latestDistApkFileName)
222
- );
223
- // 자동업데이트를 위한 파일 쓰기
224
- await FsUtil.copyAsync(
225
- path.resolve(this.cordovaPath, "platforms/android/app/build/outputs/apk", buildType, apkFileName),
226
- path.resolve(path.resolve(targetOutPath, "updates"), this._npmConfig.version + ".apk")
227
- );
228
- }
229
-
230
- /*if (this._config.target?.android) {
231
- // 자동업데이트를 위한 zip 파일 쓰기
232
- const zip = new JSZip();
233
- const resultFiles = await FsUtil.globAsync(path.resolve(this.cordovaPath, "platforms", "android", "app", "src", "main", "assets", "www", "**!/!*"), {
234
- dot: true,
235
- nodir: true
236
- });
237
- for (const resultFile of resultFiles) {
238
- const contentBuffer = await FsUtil.readFileBufferAsync(resultFile);
239
- const relativePath = path.relative(path.resolve(this.cordovaPath, "platforms", "android", "app", "src", "main", "assets", "www"), resultFile);
240
- zip.file("/" + relativePath, contentBuffer);
241
- }
242
-
243
- const zipFileName = path.basename(`${this._npmConfig.version}.zip`);
244
- const resultBuffer = await zip.generateAsync({ type: "nodebuffer" });
245
-
246
- await FsUtil.writeFileAsync(path.resolve(outPath, "android/updates/", zipFileName), resultBuffer);
247
- }*/
248
- }
249
-
250
- public static async runWebviewOnDeviceAsync(rootPath: string, platform: "browser" | "android", pkgName: string, url?: string): Promise<void> {
251
- const cordovaPath = path.resolve(rootPath, `packages/${pkgName}/.cache/cordova/`);
252
-
253
- if (url !== undefined) {
254
- await FsUtil.removeAsync(path.resolve(cordovaPath, "www"));
255
- await FsUtil.mkdirsAsync(path.resolve(cordovaPath, "www"));
256
- await FsUtil.writeFileAsync(path.resolve(cordovaPath, "www/index.html"), `'${url}'로 이동중... <script>setTimeout(function () {window.location.href = "${url.replace(/\/$/, "")}/${pkgName}/cordova/"}, 3000);</script>`.trim());
257
- }
258
-
259
- const binPath = path.resolve(process.cwd(), "node_modules/.bin/cordova.cmd");
260
- // await SdProcess.spawnAsync(`${binPath} build ${platform}`, { cwd: cordovaPath }, true);
261
- await SdProcess.spawnAsync(`${binPath} run ${platform} --device`, { cwd: cordovaPath }, true);
262
- }
263
- }
@@ -1,84 +0,0 @@
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
-
6
- export class SdCliElectron {
7
- private readonly _logger = Logger.get(["simplysm", "sd-cli", this.constructor.name]);
8
-
9
- public constructor(private readonly _rootPath: string) {
10
- }
11
-
12
- public async runWebviewOnDeviceAsync(pkgName: string, url: string, opt: { confFileRelPath: string; optNames: string[] }): Promise<void> {
13
- this._logger.debug("프로젝트 설정 가져오기...");
14
- const config = await SdCliConfigUtil.loadConfigAsync(path.resolve(this._rootPath, opt.confFileRelPath), true, opt.optNames);
15
- const pkgConfig = config.packages[pkgName] as ISdCliClientPackageConfig | undefined;
16
- if (!pkgConfig) throw new Error("패키지 설정을 찾을 수 없습니다.");
17
-
18
- const electronConfig = pkgConfig.builder?.electron;
19
- if (!electronConfig) throw new Error("ELECTRON 설정을 찾을 수 없습니다.");
20
-
21
- const pkgRootPath = path.resolve(this._rootPath, `packages/${pkgName}`);
22
- const electronSrcPath = path.resolve(pkgRootPath, `dist/electron`);
23
-
24
- // await FsUtil.removeAsync(electronSrcPath);
25
-
26
- const npmConfig = (await FsUtil.readJsonAsync(path.resolve(pkgRootPath, `package.json`))) as INpmConfig;
27
- const electronVersion = npmConfig.dependencies?.["electron"];
28
- if (electronVersion === undefined) {
29
- throw new Error("ELECTRON 빌드 패키지의 'dependencies'에는 'electron'이 반드시 포함되어야 합니다.");
30
- }
31
-
32
- const dotenvVersion = npmConfig.dependencies?.["dotenv"];
33
- if (dotenvVersion === undefined) {
34
- throw new Error("ELECTRON 빌드 패키지의 'dependencies'에는 'dotenv'가 반드시 포함되어야 합니다.");
35
- }
36
-
37
- // const remoteVersion = npmConfig.dependencies?.["@electron/remote"];
38
-
39
- await FsUtil.writeJsonAsync(path.resolve(electronSrcPath, `package.json`), {
40
- name: npmConfig.name,
41
- version: npmConfig.version,
42
- description: npmConfig.description,
43
- main: "electron.js",
44
- author: npmConfig.author,
45
- license: npmConfig.license/*,
46
- devDependencies: {
47
- "electron": electronVersion.replace("^", "")
48
- },
49
- dependencies: {
50
- "dotenv": dotenvVersion,
51
- ...remoteVersion !== undefined ? {
52
- "@electron/remote": remoteVersion
53
- } : {}
54
- }*/
55
- });
56
-
57
- // await FsUtil.copyAsync(path.resolve(pkgRootPath, "dist", "electron"), path.resolve(electronSrcPath));
58
-
59
- // if (FsUtil.exists(path.resolve(pkgRootPath, "src/favicon.ico"))) {
60
- // await FsUtil.copyAsync(path.resolve(pkgRootPath, "src/favicon.ico"), path.resolve(electronSrcPath, "favicon.ico"));
61
- // }
62
- // if (FsUtil.exists(path.resolve(pkgRootPath, "src/assets"))) {
63
- // await FsUtil.copyAsync(path.resolve(pkgRootPath, "src/assets"), path.resolve(electronSrcPath, "assets"));
64
- // }
65
-
66
- await FsUtil.writeFileAsync(path.resolve(electronSrcPath, `.env`), [
67
- "NODE_ENV=development",
68
- `SD_TITLE=${npmConfig.description}`,
69
- `SD_VERSION=${npmConfig.version}`,
70
- `SD_ELECTRON_DEV_URL=${url.replace(/\/$/, "")}/${pkgName}/electron/`,
71
- (electronConfig.icon !== undefined) ? `SD_ELECTRON_ICON=${electronConfig.icon}` : `SD_ELECTRON_ICON=favicon.ico`,
72
- ...(pkgConfig.env !== undefined) ? Object.keys(pkgConfig.env).map((key) => `${key}=${pkgConfig.env![key]}`) : [],
73
- ...(electronConfig.env !== undefined) ? Object.keys(electronConfig.env).map((key) => `${key}=${electronConfig.env![key]}`) : [],
74
- ].filterExists().join("\n"));
75
-
76
- // const electronTsFileContent = await FsUtil.readFileAsync(path.resolve(pkgRootPath, `src/electron.ts`));
77
- // const result = ts.transpileModule(electronTsFileContent, { compilerOptions: { module: ts.ModuleKind.CommonJS } });
78
- // await FsUtil.writeFileAsync(path.resolve(electronSrcPath, "electron.js"), result.outputText);
79
-
80
- await SdProcess.spawnAsync("electron-rebuild", { cwd: pkgRootPath }, true);
81
-
82
- await SdProcess.spawnAsync(`electron .`, { cwd: electronSrcPath }, true);
83
- }
84
- }
@@ -1,111 +0,0 @@
1
- import https from "https";
2
- import { SdProcess } from "@simplysm/sd-core-node";
3
- import mime from "mime";
4
-
5
- export class SdCliGithubApi {
6
- public constructor(private readonly _apiKey: string,
7
- private readonly _repoOwner: string,
8
- private readonly _repoName: string) {
9
- }
10
-
11
- public async uploadAsync(version: string, files: { name: string; buffer: Buffer }[]): Promise<void> {
12
- const releaseId = await this._createReleaseTagAsync(version);
13
-
14
- for (const file of files) {
15
- await this._uploadFileAsync(releaseId, file.name, file.buffer);
16
- }
17
- }
18
-
19
- private async _uploadFileAsync(releaseId: number, fileName: string, buffer: Buffer): Promise<void> {
20
- const contentLength = buffer.length;
21
-
22
- await new Promise<void>((resolve, reject) => {
23
- const req = https.request(
24
- `https://uploads.github.com/repos/${this._repoOwner}/${this._repoName}/releases/${releaseId}/assets?name=${fileName}&label=${fileName}`,
25
- {
26
- method: "POST",
27
- headers: {
28
- "Authorization": `token ${this._apiKey}`,
29
- "Accept": "application/vnd.github.v3+json",
30
- "User-Agent": "@simplysm/sd-cli:publish",
31
- "Content-Length": contentLength,
32
- "Content-Type": mime.getType(fileName)!
33
- }
34
- },
35
- (res) => {
36
- let dataBuffer = Buffer.from([]);
37
- res.on("data", data => {
38
- dataBuffer = Buffer.concat([dataBuffer, data]);
39
- });
40
-
41
- res.on("end", () => {
42
- if (res.statusCode !== 201) {
43
- const errObj = JSON.parse(dataBuffer.toString());
44
- throw new Error(errObj.message + "(" + errObj.documentation_url + ")");
45
- }
46
- else {
47
- resolve();
48
- }
49
- });
50
- }
51
- );
52
-
53
- req.on("error", (error) => {
54
- reject(error);
55
- });
56
- req.write(buffer);
57
- req.end();
58
- });
59
- }
60
-
61
- private async _createReleaseTagAsync(ver: string): Promise<number> {
62
- const currentBranch = (await SdProcess.spawnAsync("git branch --show-current")).trim();
63
-
64
- return await new Promise<number>((resolve, reject) => {
65
- const req = https.request(
66
- `https://api.github.com/repos/${this._repoOwner}/${this._repoName}/releases`,
67
- {
68
- method: "POST",
69
- headers: {
70
- "Authorization": `token ${this._apiKey}`,
71
- "Accept": "application/vnd.github.v3+json",
72
- "User-Agent": "@simplysm/sd-cli:publish"
73
- }
74
- },
75
- (res) => {
76
- let dataBuffer = Buffer.from([]);
77
- res.on("data", data => {
78
- dataBuffer = Buffer.concat([dataBuffer, data]);
79
- });
80
-
81
- res.on("end", () => {
82
- if (res.statusCode !== 201) {
83
- const errObj = JSON.parse(dataBuffer.toString());
84
- throw new Error(errObj.message + "(" + errObj.documentation_url + ")");
85
- }
86
- else {
87
- // console.log(JSON.parse(dataBuffer.toString()));
88
- const resData = JSON.parse(dataBuffer.toString());
89
- resolve(resData.id);
90
- }
91
- });
92
- }
93
- );
94
-
95
- req.on("error", (error) => {
96
- reject(error);
97
- });
98
-
99
- req.write(JSON.stringify({
100
- tag_name: `v${ver}`,
101
- target_commitish: currentBranch,
102
- name: `v${ver}`,
103
- body: `v${ver}`,
104
- draft: false,
105
- prerelease: false
106
- }));
107
-
108
- req.end();
109
- });
110
- }
111
- }
@@ -1,79 +0,0 @@
1
- import { ITsconfig } from "../commons";
2
- import path from "path";
3
- import { FsUtil, PathUtil } from "@simplysm/sd-core-node";
4
- import chokidar from "chokidar";
5
-
6
- export class SdCliIndexFileGenerator {
7
- private readonly _indexFilePath = path.resolve(this.rootPath, "src/index.ts");
8
- private _contentCache: string | undefined;
9
-
10
- public constructor(public readonly rootPath: string,
11
- public readonly config: ISdAutoIndexConfig) {
12
- this._contentCache = FsUtil.exists(this._indexFilePath) ? FsUtil.readFile(this._indexFilePath) : undefined;
13
- }
14
-
15
- public async watchAsync(): Promise<void> {
16
- const watcher = chokidar.watch([path.resolve(this.rootPath, "src")], { persistent: true });
17
- watcher.on("add", async (filePath) => {
18
- if (filePath.endsWith(".ts")) {
19
- await this.runAsync();
20
- }
21
- });
22
- watcher.on("unlink", async (filePath) => {
23
- if (filePath.endsWith(".ts")) {
24
- await this.runAsync();
25
- }
26
- });
27
-
28
- await this.runAsync();
29
- }
30
-
31
- public async runAsync(): Promise<void> {
32
- const importTexts: string[] = [];
33
-
34
- // 옵션의 polyfills 를 모두 import
35
- if (this.config.polyfills) {
36
- for (const polyfill of this.config.polyfills) {
37
- importTexts.push(`import "${polyfill}";`);
38
- }
39
- }
40
-
41
- // 내부 파일들 import
42
- const filePaths = await this._getFilePathsAsync();
43
- for (const filePath of filePaths) {
44
- const requirePath = PathUtil.posix(path.relative(path.dirname(this._indexFilePath), filePath))
45
- .replace(/\.ts$/, "")
46
- .replace(/\/index$/, "");
47
-
48
- const sourceTsFileContent = await FsUtil.readFileAsync(filePath);
49
- if (sourceTsFileContent.split("\n").some((line) => line.startsWith("export "))) {
50
- importTexts.push(`export * from "./${requirePath}";`);
51
- }
52
- else {
53
- importTexts.push(`import "./${requirePath}";`);
54
- }
55
- }
56
-
57
- const content = importTexts.join("\n") + "\n";
58
- const prevContent = this._contentCache;
59
- this._contentCache = content;
60
- if (content.trim() !== prevContent?.trim()) {
61
- await FsUtil.writeFileAsync(this._indexFilePath, content);
62
- }
63
- }
64
-
65
- private async _getFilePathsAsync(): Promise<string[]> {
66
- const tsconfig: ITsconfig = await FsUtil.readJsonAsync(path.resolve(this.rootPath, "tsconfig.json"));
67
- const entryFilePaths = tsconfig.files?.map((item) => path.resolve(this.rootPath, item)) ?? [];
68
-
69
- return (await FsUtil.globAsync(path.resolve(this.rootPath, "src/**/*.ts"), { nodir: true }))
70
- .filter((item) => (
71
- !entryFilePaths.includes(item)
72
- && item !== this._indexFilePath
73
- ));
74
- }
75
- }
76
-
77
- export interface ISdAutoIndexConfig {
78
- polyfills?: string[];
79
- }
@@ -1,58 +0,0 @@
1
- import ts from "typescript";
2
- import { PathUtil } from "@simplysm/sd-core-node";
3
- import * as sass from "sass";
4
- import { fileURLToPath, pathToFileURL, URL } from "url";
5
-
6
- export class SdCliNgCacheCompilerHost {
7
- public static wrap(compilerHost: ts.CompilerHost,
8
- sourceFileCache: Map<string, IFileCache>): ts.CompilerHost {
9
- const cacheCompilerHost = { ...compilerHost };
10
-
11
- cacheCompilerHost["readResource"] = (fileName: string) => {
12
- const cache = sourceFileCache.getOrCreate(PathUtil.posix(fileName), {});
13
- if (cache.content === undefined) {
14
- cache.content = compilerHost.readFile.call(cacheCompilerHost, fileName);
15
- }
16
- return cache.content;
17
- };
18
-
19
- cacheCompilerHost["transformResource"] = async (data, context) => {
20
- if (context.resourceFile != null || context.type !== "style") {
21
- return null;
22
- }
23
-
24
- const cache = sourceFileCache.getOrCreate(PathUtil.posix(context.containingFile), {});
25
- if (cache.styleContent === undefined) {
26
- const scssResult = await sass.compileStringAsync(data, {
27
- url: new URL((context.containingFile as string) + ".sd.scss"),
28
- importer: {
29
- findFileUrl: (url) => {
30
- if (!url.startsWith("~")) return pathToFileURL(url);
31
- return new URL(url.substring(1), pathToFileURL("node_modules"));
32
- }
33
- }
34
- });
35
-
36
- cache.styleContent = scssResult.css.toString();
37
-
38
- const deps = scssResult.loadedUrls.slice(1).map((item) => PathUtil.posix(fileURLToPath(item.href)));
39
- for (const dep of deps) {
40
- const depCache = sourceFileCache.getOrCreate(dep, {});
41
- depCache.importerSet = depCache.importerSet ?? new Set<string>();
42
- depCache.importerSet.add(PathUtil.posix(context.containingFile));
43
- }
44
- }
45
- return { content: cache.styleContent };
46
- };
47
-
48
- return cacheCompilerHost;
49
- }
50
- }
51
-
52
- interface IFileCache {
53
- exists?: boolean;
54
- sourceFile?: ts.SourceFile;
55
- content?: string;
56
- styleContent?: string;
57
- importerSet?: Set<string>;
58
- }
@@ -1,74 +0,0 @@
1
- import { ISdCliPackageBuildResult } from "../commons";
2
- import ts from "typescript";
3
- import { FsUtil } from "@simplysm/sd-core-node";
4
- import path from "path";
5
- import { ESLint } from "eslint";
6
-
7
- export class SdCliPackageLinter {
8
- private readonly _lintResultCache = new Map<string, ISdCliPackageBuildResult[]>();
9
-
10
- public constructor(private readonly _rootPath: string) {
11
- }
12
-
13
- public async lintAsync(filePaths: string[], program?: ts.Program): Promise<ISdCliPackageBuildResult[]> {
14
- if (!FsUtil.exists(path.resolve(this._rootPath, ".eslintrc.cjs"))) return [];
15
-
16
- const linter = new ESLint(
17
- program && filePaths.some((item) => item.endsWith(".ts")) ? {
18
- overrideConfig: {
19
- overrides: [
20
- {
21
- files: ["*.ts"],
22
- parserOptions: {
23
- /*programs: [program],
24
- tsconfigRootDir: null,
25
- project: null*/
26
- tsconfigRootDir: this._rootPath,
27
- project: "tsconfig-build.json"
28
- },
29
- settings: {
30
- "import/resolver": {
31
- "typescript": {
32
- /*programs: [program],
33
- project: null*/
34
- project: path.resolve(this._rootPath, "tsconfig-build.json")
35
- }
36
- }
37
- }
38
- }
39
- ]
40
- }
41
- } : {}
42
- );
43
-
44
- const lintFilePaths = await filePaths
45
- .filterAsync(async (filePath) => (
46
- !filePath.endsWith(".d.ts") &&
47
- /\.[cm]?[tj]sx?$/.test(filePath) &&
48
- !(await linter.isPathIgnored(filePath))
49
- ));
50
- for (const lintFilePath of lintFilePaths) {
51
- this._lintResultCache.delete(lintFilePath);
52
- }
53
-
54
- const lintResults = await linter.lintFiles(lintFilePaths);
55
-
56
- const result = lintResults.map((lintResult) => ({
57
- filePath: lintResult.filePath,
58
- results: lintResult.messages.map((msg) => ({
59
- filePath: lintResult.filePath,
60
- line: msg.line,
61
- char: msg.column,
62
- code: msg.ruleId ?? undefined,
63
- severity: msg.severity === 1 ? "warning" as const : "error" as const,
64
- message: msg.message
65
- }))
66
- }));
67
-
68
- for (const resultItem of result) {
69
- this._lintResultCache.set(resultItem.filePath, resultItem.results);
70
- }
71
-
72
- return Array.from(this._lintResultCache.values()).mapMany();
73
- }
74
- }