@simplysm/sd-cli 6.4.3 → 7.0.6

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 (182) hide show
  1. package/.eslintrc.cjs +11 -0
  2. package/dist/bin/sd-cli.d.ts +1 -0
  3. package/dist/bin/sd-cli.mjs +60 -0
  4. package/dist/build-tool/SdCliCacheCompilerHost.d.ts +10 -0
  5. package/dist/build-tool/SdCliCacheCompilerHost.mjs +44 -0
  6. package/dist/build-tool/SdCliNgCacheCompilerHost.d.ts +11 -0
  7. package/dist/build-tool/SdCliNgCacheCompilerHost.mjs +36 -0
  8. package/dist/build-tool/SdCliPackageLinter.d.ts +8 -0
  9. package/dist/build-tool/SdCliPackageLinter.mjs +41 -0
  10. package/dist/builder/SdCliJsLibBuilder.d.ts +14 -0
  11. package/dist/builder/SdCliJsLibBuilder.mjs +50 -0
  12. package/dist/builder/SdCliTsLibBuilder.d.ts +27 -0
  13. package/dist/builder/SdCliTsLibBuilder.mjs +226 -0
  14. package/dist/commons.d.ts +43 -0
  15. package/dist/commons.mjs +2 -0
  16. package/dist/entry-points/SdCliWorkspace.d.ts +17 -0
  17. package/dist/entry-points/SdCliWorkspace.mjs +186 -0
  18. package/dist/packages/SdCliPackage.d.ts +19 -0
  19. package/dist/packages/SdCliPackage.mjs +89 -0
  20. package/dist/utils/SdBuildResultUtil.d.ts +6 -0
  21. package/dist/utils/SdBuildResultUtil.mjs +38 -0
  22. package/lib/ts-node-esm-paths.mjs +15 -0
  23. package/package.json +27 -58
  24. package/src/bin/sd-cli.ts +54 -220
  25. package/src/build-tool/SdCliCacheCompilerHost.ts +71 -0
  26. package/src/build-tool/SdCliNgCacheCompilerHost.ts +50 -0
  27. package/src/build-tool/SdCliPackageLinter.ts +54 -0
  28. package/src/builder/SdCliJsLibBuilder.ts +66 -0
  29. package/src/builder/SdCliTsLibBuilder.ts +335 -0
  30. package/src/commons.ts +15 -124
  31. package/src/entry-points/SdCliWorkspace.ts +222 -0
  32. package/src/packages/SdCliPackage.ts +111 -0
  33. package/src/utils/SdBuildResultUtil.ts +43 -0
  34. package/tsconfig-build.json +9 -0
  35. package/tsconfig.json +7 -18
  36. package/.eslintrc.js +0 -19
  37. package/dist-node/bin/sd-cli.js +0 -197
  38. package/dist-node/bin/sd-cli.js.map +0 -1
  39. package/dist-node/build-tools/SdCliCordova.js +0 -144
  40. package/dist-node/build-tools/SdCliCordova.js.map +0 -1
  41. package/dist-node/build-tools/SdCliIndexFileGenerator.js +0 -51
  42. package/dist-node/build-tools/SdCliIndexFileGenerator.js.map +0 -1
  43. package/dist-node/build-tools/SdCliNgModuleFilesGenerator.js +0 -675
  44. package/dist-node/build-tools/SdCliNgModuleFilesGenerator.js.map +0 -1
  45. package/dist-node/build-tools/metadata/SdAotMetadataReader.js +0 -274
  46. package/dist-node/build-tools/metadata/SdAotMetadataReader.js.map +0 -1
  47. package/dist-node/build-tools/metadata/SdIvyMetadataReader.js +0 -124
  48. package/dist-node/build-tools/metadata/SdIvyMetadataReader.js.map +0 -1
  49. package/dist-node/build-tools/metadata/SdMetadataError.js +0 -13
  50. package/dist-node/build-tools/metadata/SdMetadataError.js.map +0 -1
  51. package/dist-node/build-tools/metadata/SdMyMetadataReader.js +0 -321
  52. package/dist-node/build-tools/metadata/SdMyMetadataReader.js.map +0 -1
  53. package/dist-node/builders/SdCliJavascriptLinter.js +0 -65
  54. package/dist-node/builders/SdCliJavascriptLinter.js.map +0 -1
  55. package/dist-node/builders/SdCliNgClientBuilder.js +0 -637
  56. package/dist-node/builders/SdCliNgClientBuilder.js.map +0 -1
  57. package/dist-node/builders/SdCliNgLibraryBuilder.js +0 -217
  58. package/dist-node/builders/SdCliNgLibraryBuilder.js.map +0 -1
  59. package/dist-node/builders/SdCliPublisher.js +0 -129
  60. package/dist-node/builders/SdCliPublisher.js.map +0 -1
  61. package/dist-node/builders/SdCliServerBuilder.js +0 -452
  62. package/dist-node/builders/SdCliServerBuilder.js.map +0 -1
  63. package/dist-node/builders/SdCliTypescriptBuilder.js +0 -347
  64. package/dist-node/builders/SdCliTypescriptBuilder.js.map +0 -1
  65. package/dist-node/commons.js +0 -3
  66. package/dist-node/commons.js.map +0 -1
  67. package/dist-node/entry-points/SdCliLocalUpdater.js +0 -88
  68. package/dist-node/entry-points/SdCliLocalUpdater.js.map +0 -1
  69. package/dist-node/entry-points/SdCliPrepare.js +0 -56
  70. package/dist-node/entry-points/SdCliPrepare.js.map +0 -1
  71. package/dist-node/entry-points/SdCliProject.js +0 -302
  72. package/dist-node/entry-points/SdCliProject.js.map +0 -1
  73. package/dist-node/packages/SdCliClientPackage.js +0 -91
  74. package/dist-node/packages/SdCliClientPackage.js.map +0 -1
  75. package/dist-node/packages/SdCliLibraryPackage.js +0 -99
  76. package/dist-node/packages/SdCliLibraryPackage.js.map +0 -1
  77. package/dist-node/packages/SdCliPackageBase.js +0 -33
  78. package/dist-node/packages/SdCliPackageBase.js.map +0 -1
  79. package/dist-node/packages/SdCliServerPackage.js +0 -69
  80. package/dist-node/packages/SdCliServerPackage.js.map +0 -1
  81. package/dist-node/packages/SdCliUnknownPackage.js +0 -15
  82. package/dist-node/packages/SdCliUnknownPackage.js.map +0 -1
  83. package/dist-node/utils/SdCliFileCrypto.js +0 -76
  84. package/dist-node/utils/SdCliFileCrypto.js.map +0 -1
  85. package/dist-node/utils/SdProjectConfigUtil.js +0 -62
  86. package/dist-node/utils/SdProjectConfigUtil.js.map +0 -1
  87. package/dist-node/utils/SdTsDiagnosticUtil.js +0 -45
  88. package/dist-node/utils/SdTsDiagnosticUtil.js.map +0 -1
  89. package/dist-node/utils/SdWebpackUtil.js +0 -63
  90. package/dist-node/utils/SdWebpackUtil.js.map +0 -1
  91. package/dist-node/workers/client-ng-gen-worker.js +0 -57
  92. package/dist-node/workers/client-ng-gen-worker.js.map +0 -1
  93. package/dist-node/workers/lib-build-worker.js +0 -88
  94. package/dist-node/workers/lib-build-worker.js.map +0 -1
  95. package/dist-types/bin/sd-cli.d.ts +0 -3
  96. package/dist-types/bin/sd-cli.d.ts.map +0 -1
  97. package/dist-types/build-tools/SdCliCordova.d.ts +0 -15
  98. package/dist-types/build-tools/SdCliCordova.d.ts.map +0 -1
  99. package/dist-types/build-tools/SdCliIndexFileGenerator.d.ts +0 -13
  100. package/dist-types/build-tools/SdCliIndexFileGenerator.d.ts.map +0 -1
  101. package/dist-types/build-tools/SdCliNgModuleFilesGenerator.d.ts +0 -43
  102. package/dist-types/build-tools/SdCliNgModuleFilesGenerator.d.ts.map +0 -1
  103. package/dist-types/build-tools/metadata/SdAotMetadataReader.d.ts +0 -58
  104. package/dist-types/build-tools/metadata/SdAotMetadataReader.d.ts.map +0 -1
  105. package/dist-types/build-tools/metadata/SdIvyMetadataReader.d.ts +0 -43
  106. package/dist-types/build-tools/metadata/SdIvyMetadataReader.d.ts.map +0 -1
  107. package/dist-types/build-tools/metadata/SdMetadataError.d.ts +0 -7
  108. package/dist-types/build-tools/metadata/SdMetadataError.d.ts.map +0 -1
  109. package/dist-types/build-tools/metadata/SdMyMetadataReader.d.ts +0 -59
  110. package/dist-types/build-tools/metadata/SdMyMetadataReader.d.ts.map +0 -1
  111. package/dist-types/builders/SdCliJavascriptLinter.d.ts +0 -14
  112. package/dist-types/builders/SdCliJavascriptLinter.d.ts.map +0 -1
  113. package/dist-types/builders/SdCliNgClientBuilder.d.ts +0 -29
  114. package/dist-types/builders/SdCliNgClientBuilder.d.ts.map +0 -1
  115. package/dist-types/builders/SdCliNgLibraryBuilder.d.ts +0 -30
  116. package/dist-types/builders/SdCliNgLibraryBuilder.d.ts.map +0 -1
  117. package/dist-types/builders/SdCliPublisher.d.ts +0 -9
  118. package/dist-types/builders/SdCliPublisher.d.ts.map +0 -1
  119. package/dist-types/builders/SdCliServerBuilder.d.ts +0 -31
  120. package/dist-types/builders/SdCliServerBuilder.d.ts.map +0 -1
  121. package/dist-types/builders/SdCliTypescriptBuilder.d.ts +0 -56
  122. package/dist-types/builders/SdCliTypescriptBuilder.d.ts.map +0 -1
  123. package/dist-types/commons.d.ts +0 -134
  124. package/dist-types/commons.d.ts.map +0 -1
  125. package/dist-types/entry-points/SdCliLocalUpdater.d.ts +0 -12
  126. package/dist-types/entry-points/SdCliLocalUpdater.d.ts.map +0 -1
  127. package/dist-types/entry-points/SdCliPrepare.d.ts +0 -6
  128. package/dist-types/entry-points/SdCliPrepare.d.ts.map +0 -1
  129. package/dist-types/entry-points/SdCliProject.d.ts +0 -32
  130. package/dist-types/entry-points/SdCliProject.d.ts.map +0 -1
  131. package/dist-types/packages/SdCliClientPackage.d.ts +0 -17
  132. package/dist-types/packages/SdCliClientPackage.d.ts.map +0 -1
  133. package/dist-types/packages/SdCliLibraryPackage.d.ts +0 -20
  134. package/dist-types/packages/SdCliLibraryPackage.d.ts.map +0 -1
  135. package/dist-types/packages/SdCliPackageBase.d.ts +0 -11
  136. package/dist-types/packages/SdCliPackageBase.d.ts.map +0 -1
  137. package/dist-types/packages/SdCliServerPackage.d.ts +0 -16
  138. package/dist-types/packages/SdCliServerPackage.d.ts.map +0 -1
  139. package/dist-types/packages/SdCliUnknownPackage.d.ts +0 -9
  140. package/dist-types/packages/SdCliUnknownPackage.d.ts.map +0 -1
  141. package/dist-types/utils/SdCliFileCrypto.d.ts +0 -8
  142. package/dist-types/utils/SdCliFileCrypto.d.ts.map +0 -1
  143. package/dist-types/utils/SdProjectConfigUtil.d.ts +0 -7
  144. package/dist-types/utils/SdProjectConfigUtil.d.ts.map +0 -1
  145. package/dist-types/utils/SdTsDiagnosticUtil.d.ts +0 -6
  146. package/dist-types/utils/SdTsDiagnosticUtil.d.ts.map +0 -1
  147. package/dist-types/utils/SdWebpackUtil.d.ts +0 -7
  148. package/dist-types/utils/SdWebpackUtil.d.ts.map +0 -1
  149. package/dist-types/workers/client-ng-gen-worker.d.ts +0 -2
  150. package/dist-types/workers/client-ng-gen-worker.d.ts.map +0 -1
  151. package/dist-types/workers/lib-build-worker.d.ts +0 -2
  152. package/dist-types/workers/lib-build-worker.d.ts.map +0 -1
  153. package/schema/schema.json +0 -447
  154. package/sd-tsconfig.node.json +0 -18
  155. package/src/build-tools/SdCliCordova.ts +0 -240
  156. package/src/build-tools/SdCliIndexFileGenerator.ts +0 -61
  157. package/src/build-tools/SdCliNgModuleFilesGenerator.ts +0 -894
  158. package/src/build-tools/metadata/SdAotMetadataReader.ts +0 -374
  159. package/src/build-tools/metadata/SdIvyMetadataReader.ts +0 -183
  160. package/src/build-tools/metadata/SdMetadataError.ts +0 -7
  161. package/src/build-tools/metadata/SdMyMetadataReader.ts +0 -407
  162. package/src/builders/SdCliJavascriptLinter.ts +0 -81
  163. package/src/builders/SdCliNgClientBuilder.ts +0 -794
  164. package/src/builders/SdCliNgLibraryBuilder.ts +0 -301
  165. package/src/builders/SdCliPublisher.ts +0 -144
  166. package/src/builders/SdCliServerBuilder.ts +0 -555
  167. package/src/builders/SdCliTypescriptBuilder.ts +0 -552
  168. package/src/entry-points/SdCliLocalUpdater.ts +0 -114
  169. package/src/entry-points/SdCliPrepare.ts +0 -104
  170. package/src/entry-points/SdCliProject.ts +0 -405
  171. package/src/packages/SdCliClientPackage.ts +0 -111
  172. package/src/packages/SdCliLibraryPackage.ts +0 -118
  173. package/src/packages/SdCliPackageBase.ts +0 -34
  174. package/src/packages/SdCliServerPackage.ts +0 -85
  175. package/src/packages/SdCliUnknownPackage.ts +0 -14
  176. package/src/utils/SdCliFileCrypto.ts +0 -87
  177. package/src/utils/SdCliUtils.ts +0 -56
  178. package/src/utils/SdProjectConfigUtil.ts +0 -145
  179. package/src/utils/SdTsDiagnosticUtil.ts +0 -46
  180. package/src/utils/SdWebpackUtil.ts +0 -71
  181. package/src/workers/client-ng-gen-worker.ts +0 -63
  182. package/src/workers/lib-build-worker.ts +0 -97
@@ -0,0 +1,222 @@
1
+ import { FsUtil, Logger, SdProcess } from "@simplysm/sd-core-node";
2
+ import path from "path";
3
+ import { INpmConfig, ISdCliPackageBuildResult, ISdCliWorkspaceConfig } from "../commons";
4
+ import { SdCliPackage } from "../packages/SdCliPackage";
5
+ import { Wait } from "@simplysm/sd-core-common";
6
+ import os from "os";
7
+ import { SdBuildResultUtil } from "../utils/SdBuildResultUtil";
8
+ import semver from "semver/preload";
9
+
10
+ export class SdCliWorkspace {
11
+ private readonly _logger = Logger.get(["simplysm", "sd-cli", this.constructor.name]);
12
+
13
+ private readonly _npmConfig: INpmConfig;
14
+ private readonly _config: ISdCliWorkspaceConfig;
15
+
16
+ public constructor(private readonly _rootPath: string) {
17
+ const npmConfigFilePath = path.resolve(this._rootPath, "package.json");
18
+ this._npmConfig = FsUtil.readJson(npmConfigFilePath);
19
+
20
+ this._config = FsUtil.readJson(path.resolve(this._rootPath, "simplysm.json"));
21
+ }
22
+
23
+ public async watchAsync(): Promise<void> {
24
+ this._logger.debug("패키지 목록 구성...");
25
+ const pkgs = await this._getPackagesAsync();
26
+
27
+ this._logger.debug("패키지 이벤트 설정...");
28
+ let changeCount = 0;
29
+ const totalResultMap = new Map<string, ISdCliPackageBuildResult[]>();
30
+ for (const pkg of pkgs) {
31
+ pkg
32
+ .on("change", () => {
33
+ if (changeCount === 0) {
34
+ this._logger.log("빌드를 시작합니다...");
35
+ }
36
+ changeCount++;
37
+ this._logger.debug(`[${pkg.name}] 빌드를 시작합니다...`);
38
+ })
39
+ .on("complete", (results) => {
40
+ this._logger.debug(`[${pkg.name}] 빌드가 완료되었습니다.`);
41
+ totalResultMap.set(pkg.name, results);
42
+
43
+ setTimeout(() => {
44
+ changeCount--;
45
+ if (changeCount === 0) {
46
+ this._loggingResults(totalResultMap);
47
+ this._logger.info("모든 빌드가 완료되었습니다.");
48
+ }
49
+ }, 500);
50
+ });
51
+ }
52
+
53
+ this._logger.debug("빌드를 시작합니다...");
54
+ const pkgNames = pkgs.map((item) => item.name);
55
+ const buildCompletedPackageNames: string[] = [];
56
+ await pkgs.parallelAsync(async (pkg) => {
57
+ await Wait.until(() => !pkg.allDependencies.some((dep) => pkgNames.includes(dep) && !buildCompletedPackageNames.includes(dep)));
58
+ await pkg.watchAsync();
59
+ buildCompletedPackageNames.push(pkg.name);
60
+ });
61
+ }
62
+
63
+ public async buildAsync(): Promise<void> {
64
+ this._logger.debug("패키지 목록 구성...");
65
+ const pkgs = await this._getPackagesAsync();
66
+
67
+ this._logger.debug("프로젝트 및 패키지 버전 설정...");
68
+ await this._upgradeVersionAsync(pkgs);
69
+
70
+ // 빌드
71
+ await this._buildPkgsAsync(pkgs);
72
+ }
73
+
74
+ private async _buildPkgsAsync(pkgs: SdCliPackage[]): Promise<void> {
75
+ this._logger.debug("빌드를 시작합니다...");
76
+ const pkgNames = pkgs.map((item) => item.name);
77
+ const buildCompletedPackageNames: string[] = [];
78
+ const totalResultMap = new Map<string, ISdCliPackageBuildResult[]>();
79
+ await pkgs.parallelAsync(async (pkg) => {
80
+ await Wait.until(() => !pkg.allDependencies.some((dep) => pkgNames.includes(dep) && !buildCompletedPackageNames.includes(dep)));
81
+
82
+ this._logger.debug(`[${pkg.name}] 빌드를 시작합니다...`);
83
+ totalResultMap.set(pkg.name, await pkg.buildAsync());
84
+ this._logger.debug(`[${pkg.name}] 빌드가 완료되었습니다.`);
85
+
86
+ buildCompletedPackageNames.push(pkg.name);
87
+ });
88
+
89
+ this._loggingResults(totalResultMap);
90
+ this._logger.info("모든 빌드가 완료되었습니다.");
91
+ }
92
+
93
+ public async publishAsync(opt: { noBuild: boolean }): Promise<void> {
94
+ if (opt.noBuild) {
95
+ this._logger.warn("빌드하지 않고, 배포하는것은 상당히 위험합니다.");
96
+ await this._waitSecMessageAsync("프로세스를 중지하려면, 'CTRL+C'를 누르세요.", 5);
97
+ }
98
+
99
+ // GIT 사용중일 경우, 커밋되지 않은 수정사항이 있는지 확인
100
+ if (FsUtil.exists(path.resolve(process.cwd(), ".git"))) {
101
+ this._logger.debug("GIT 커밋여부 확인...");
102
+ const gitStatusResult = await SdProcess.execAsync("git status");
103
+ if (gitStatusResult.includes("Changes") || gitStatusResult.includes("Untracked")) {
104
+ throw new Error("커밋되지 않은 정보가 있습니다.");
105
+ }
106
+ }
107
+
108
+ this._logger.debug("패키지 목록 구성...");
109
+ const pkgs = await this._getPackagesAsync();
110
+
111
+ this._logger.debug("프로젝트 및 패키지 버전 설정...");
112
+ await this._upgradeVersionAsync(pkgs);
113
+
114
+ // 빌드
115
+ if (!opt.noBuild) {
116
+ await this._buildPkgsAsync(pkgs);
117
+ }
118
+
119
+ // GIT 사용중일경우, 새 버전 커밋 및 TAG 생성
120
+ if (FsUtil.exists(path.resolve(process.cwd(), ".git"))) {
121
+ this._logger.debug("새 버전 커밋 및 TAG 생성...");
122
+ await SdProcess.execAsync("git add .");
123
+ await SdProcess.execAsync(`git commit -m "v${this._npmConfig.version}"`);
124
+ await SdProcess.execAsync(`git tag -a "v${this._npmConfig.version}" -m "v${this._npmConfig.version}"`);
125
+ }
126
+
127
+ this._logger.debug("배포 시작...");
128
+ await pkgs.parallelAsync(async (pkg) => {
129
+ this._logger.debug(`[${pkg.name}] 배포를 시작합니다...`);
130
+ await pkg.publishAsync();
131
+ this._logger.debug(`[${pkg.name}] 배포가 완료되었습니다.`);
132
+ });
133
+ this._logger.info("모든 배포가 완료되었습니다.");
134
+ }
135
+
136
+ private async _upgradeVersionAsync(pkgs: SdCliPackage[]): Promise<void> {
137
+ // 작업공간 package.json 버전 설정
138
+ const newVersion = semver.inc(this._npmConfig.version, "patch")!;
139
+ this._npmConfig.version = newVersion;
140
+
141
+ const pkgNames = pkgs.map((item) => item.name);
142
+
143
+ const updateDepVersion = (deps: Record<string, string> | undefined): void => {
144
+ if (!deps) return;
145
+ for (const depName of Object.keys(deps)) {
146
+ if (pkgNames.includes(depName)) {
147
+ deps[depName] = newVersion;
148
+ }
149
+ }
150
+ };
151
+ updateDepVersion(this._npmConfig.dependencies);
152
+ updateDepVersion(this._npmConfig.optionalDependencies);
153
+ updateDepVersion(this._npmConfig.devDependencies);
154
+ updateDepVersion(this._npmConfig.peerDependencies);
155
+
156
+ const npmConfigFilePath = path.resolve(this._rootPath, "package.json");
157
+ await FsUtil.writeJsonAsync(npmConfigFilePath, this._npmConfig, { space: 2 });
158
+
159
+ // 각 패키지 package.json 버전 설정
160
+ await pkgs.parallelAsync(async (pkg) => {
161
+ await pkg.setNewVersionAsync(newVersion, pkgNames);
162
+ });
163
+ }
164
+
165
+ private async _waitSecMessageAsync(msg: string, sec: number): Promise<void> {
166
+ for (let i = sec; i > 0; i--) {
167
+ if (i !== sec) {
168
+ process.stdout.cursorTo(0);
169
+ }
170
+ process.stdout.write(msg + " " + i);
171
+ await Wait.time(1000);
172
+ }
173
+
174
+ process.stdout.cursorTo(0);
175
+ process.stdout.clearLine(0);
176
+ }
177
+
178
+ private async _getPackagesAsync(): Promise<SdCliPackage[]> {
179
+ const pkgRootPaths = await this._npmConfig.workspaces?.mapManyAsync(async (item) => await FsUtil.globAsync(item));
180
+ if (!pkgRootPaths) {
181
+ throw new Error("최상위 'package.json'에서 'workspaces'를 찾을 수 없습니다.");
182
+ }
183
+
184
+ return pkgRootPaths.map((pkgRootPath) => {
185
+ const pkgConfig = this._config.packages[path.basename(pkgRootPath)];
186
+ return pkgConfig ? new SdCliPackage(this._rootPath, pkgRootPath, pkgConfig) : undefined;
187
+ }).filterExists();
188
+ }
189
+
190
+ private _loggingResults(totalResultMap: Map<string, ISdCliPackageBuildResult[]>): void {
191
+ const totalResults = Array.from(totalResultMap.entries())
192
+ .mapMany((item) => item[1].map((item1) => ({
193
+ pkgName: item[0],
194
+ ...item1
195
+ })))
196
+ .orderBy((item) => item.pkgName + "_" + item.filePath);
197
+
198
+ const warnings = totalResults
199
+ .filter((item) => item.severity === "warning")
200
+ .map((item) => `${SdBuildResultUtil.getMessage(item)} (${item.pkgName})`)
201
+ .distinct();
202
+
203
+ const errors = totalResults
204
+ .filter((item) => item.severity === "error")
205
+ .map((item) => `${SdBuildResultUtil.getMessage(item)} (${item.pkgName})`)
206
+ .distinct();
207
+
208
+ if (warnings.length > 0) {
209
+ this._logger.warn(`경고 발생${os.EOL}`, warnings.join(os.EOL));
210
+ }
211
+ if (errors.length > 0) {
212
+ this._logger.error(`오류 발생${os.EOL}`, errors.join(os.EOL));
213
+ }
214
+
215
+ if (errors.length > 0) {
216
+ this._logger.error(`경고: ${warnings.length}건, 오류: ${errors.length}건`);
217
+ }
218
+ else if (warnings.length > 0) {
219
+ this._logger.warn(`경고: ${warnings.length}건, 오류: ${errors.length}건`);
220
+ }
221
+ }
222
+ }
@@ -0,0 +1,111 @@
1
+ import { INpmConfig, ISdCliPackageBuildResult, ITsconfig, TSdCliPackageConfig } from "../commons";
2
+ import path from "path";
3
+ import { FsUtil, SdProcess } from "@simplysm/sd-core-node";
4
+ import { EventEmitter } from "events";
5
+ import { ObjectUtil } from "@simplysm/sd-core-common";
6
+ import { SdCliTsLibBuilder } from "../builder/SdCliTsLibBuilder";
7
+ import { SdCliJsLibBuilder } from "../builder/SdCliJsLibBuilder";
8
+
9
+ export class SdCliPackage extends EventEmitter {
10
+ private readonly _npmConfig: INpmConfig;
11
+
12
+ public get name(): string {
13
+ return this._npmConfig.name;
14
+ }
15
+
16
+ public get allDependencies(): string[] {
17
+ return [
18
+ ...Object.keys(this._npmConfig.dependencies ?? {}),
19
+ ...Object.keys(this._npmConfig.optionalDependencies ?? {}),
20
+ ...Object.keys(this._npmConfig.devDependencies ?? {}),
21
+ ...Object.keys(this._npmConfig.peerDependencies ?? {})
22
+ ].distinct();
23
+ }
24
+
25
+ public constructor(private readonly _workspaceRootPath: string,
26
+ private readonly _rootPath: string,
27
+ private readonly _config: TSdCliPackageConfig) {
28
+ super();
29
+
30
+ const npmConfigFilePath = path.resolve(this._rootPath, "package.json");
31
+ this._npmConfig = FsUtil.readJson(npmConfigFilePath);
32
+ }
33
+
34
+ public override on(event: "change", listener: () => void): this;
35
+ public override on(event: "complete", listener: (results: ISdCliPackageBuildResult[]) => void): this;
36
+ public override on(event: string | symbol, listener: (...args: any[]) => void): this {
37
+ return super.on(event, listener);
38
+ }
39
+
40
+ public async setNewVersionAsync(newVersion: string, pkgNames: string[]): Promise<void> {
41
+ this._npmConfig.version = newVersion;
42
+
43
+ const updateDepVersion = (deps: Record<string, string> | undefined): void => {
44
+ if (!deps) return;
45
+ for (const depName of Object.keys(deps)) {
46
+ if (pkgNames.includes(depName)) {
47
+ deps[depName] = newVersion;
48
+ }
49
+ }
50
+ };
51
+ updateDepVersion(this._npmConfig.dependencies);
52
+ updateDepVersion(this._npmConfig.optionalDependencies);
53
+ updateDepVersion(this._npmConfig.devDependencies);
54
+ updateDepVersion(this._npmConfig.peerDependencies);
55
+
56
+ const npmConfigFilePath = path.resolve(this._rootPath, "package.json");
57
+ await FsUtil.writeJsonAsync(npmConfigFilePath, this._npmConfig, { space: 2 });
58
+ }
59
+
60
+ public async watchAsync(): Promise<void> {
61
+ const isTs = FsUtil.exists(path.resolve(this._rootPath, "tsconfig.json"));
62
+
63
+ if (isTs) {
64
+ await this._genBuildTsconfigAsync();
65
+ }
66
+
67
+ const isAngular = isTs && this.allDependencies.includes("@angular/core");
68
+ const builder = isTs ? new SdCliTsLibBuilder(this._rootPath, isAngular) : new SdCliJsLibBuilder(this._rootPath);
69
+
70
+ await builder
71
+ .on("change", () => {
72
+ this.emit("change");
73
+ })
74
+ .on("complete", (results) => {
75
+ this.emit("complete", results);
76
+ })
77
+ .watchAsync();
78
+ }
79
+
80
+ public async buildAsync(): Promise<ISdCliPackageBuildResult[]> {
81
+ const isTs = FsUtil.exists(path.resolve(this._rootPath, "tsconfig.json"));
82
+
83
+ if (isTs) {
84
+ await this._genBuildTsconfigAsync();
85
+ }
86
+
87
+ const isAngular = isTs && this.allDependencies.includes("@angular/core");
88
+ const builder = isTs ? new SdCliTsLibBuilder(this._rootPath, isAngular) : new SdCliJsLibBuilder(this._rootPath);
89
+
90
+ return await builder.buildAsync();
91
+ }
92
+
93
+ public async publishAsync(): Promise<void> {
94
+ if (this._config.type === "library" && this._config.publish === "npm") {
95
+ await SdProcess.execAsync("npm publish --access public", { cwd: this._rootPath });
96
+ }
97
+ }
98
+
99
+ private async _genBuildTsconfigAsync(): Promise<void> {
100
+ const baseTsconfigFilePath = path.resolve(this._rootPath, "tsconfig.json");
101
+ const baseTsconfig: ITsconfig = await FsUtil.readJsonAsync(baseTsconfigFilePath);
102
+
103
+ const buildTsconfig: ITsconfig = ObjectUtil.clone(baseTsconfig);
104
+ buildTsconfig.compilerOptions = buildTsconfig.compilerOptions ?? {};
105
+ delete buildTsconfig.compilerOptions.baseUrl;
106
+ delete buildTsconfig.compilerOptions.paths;
107
+
108
+ const buildTsconfigFilePath = path.resolve(this._rootPath, "tsconfig-build.json");
109
+ await FsUtil.writeJsonAsync(buildTsconfigFilePath, buildTsconfig, { space: 2 });
110
+ }
111
+ }
@@ -0,0 +1,43 @@
1
+ import ts from "typescript";
2
+ import * as os from "os";
3
+ import * as path from "path";
4
+ import { ISdCliPackageBuildResult } from "../commons";
5
+
6
+ export class SdBuildResultUtil {
7
+ public static convertDiagsToResult(diag: ts.Diagnostic): ISdCliPackageBuildResult | undefined {
8
+ const severity = diag.category === ts.DiagnosticCategory.Error ? "error"
9
+ : diag.category === ts.DiagnosticCategory.Warning ? "warning"
10
+ : undefined;
11
+ if (!severity) return undefined;
12
+
13
+ const code = "TS" + diag.code;
14
+ const message = ts.flattenDiagnosticMessageText(diag.messageText, os.EOL);
15
+
16
+
17
+ const filePath = diag.file ? path.resolve(diag.file.fileName) : undefined;
18
+ const position = diag.file && diag.start !== undefined ? diag.file.getLineAndCharacterOfPosition(diag.start) : undefined;
19
+ const line = position ? position.line + 1 : undefined;
20
+ const char = position ? position.character + 1 : undefined;
21
+
22
+ return {
23
+ filePath,
24
+ line,
25
+ char,
26
+ code,
27
+ severity,
28
+ message
29
+ };
30
+ }
31
+
32
+ public static getMessage(result: ISdCliPackageBuildResult): string {
33
+ let str = "";
34
+ if (result.filePath !== undefined) {
35
+ str += `${result.filePath}(${result.line ?? 0}, ${result.char ?? 0}): `;
36
+ }
37
+ if (result.code !== undefined) {
38
+ str += `${result.code}: `;
39
+ }
40
+ str += `${result.severity} ${result.message}`;
41
+ return str;
42
+ }
43
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "extends": "../../tsconfig.json",
3
+ "compilerOptions": {
4
+ "lib": [
5
+ "ES2020"
6
+ ],
7
+ "outDir": "./dist"
8
+ }
9
+ }
package/tsconfig.json CHANGED
@@ -1,29 +1,18 @@
1
1
  {
2
- "extends": "../../tsconfig-base.json",
2
+ "extends": "../../tsconfig.json",
3
3
  "compilerOptions": {
4
- "target": "es2020",
5
4
  "lib": [
6
- "es2020"
5
+ "ES2020"
7
6
  ],
7
+ "outDir": "./dist",
8
8
  "baseUrl": ".",
9
9
  "paths": {
10
- "@simplysm/sd-core-common": [
11
- "../sd-core-common/src/index.ts"
12
- ],
13
10
  "@simplysm/sd-core-node": [
14
11
  "../sd-core-node/src/index.ts"
15
12
  ],
16
- "@simplysm/sd-server-node": [
17
- "../sd-server-node/src/index.ts"
18
- ],
19
- "@simplysm/sd-storage": [
20
- "../sd-storage/src/index.ts"
13
+ "@simplysm/sd-core-common": [
14
+ "../sd-core-common/src/index.ts"
21
15
  ]
22
16
  }
23
- },
24
- "files": [
25
- "src/bin/sd-cli.ts",
26
- "src/workers/lib-build-worker.ts",
27
- "src/workers/client-ng-gen-worker.ts"
28
- ]
29
- }
17
+ }
18
+ }
package/.eslintrc.js DELETED
@@ -1,19 +0,0 @@
1
- module.exports = {
2
- overrides: [
3
- {
4
- files: ["*.ts"],
5
- extends: ["../eslint-plugin/src/configs/typescript"],
6
- parserOptions: {
7
- tsconfigRootDir: __dirname,
8
- project: "tsconfig.json"
9
- },
10
- settings: {
11
- "import/resolver": {
12
- typescript: {
13
- project: require("path").join(__dirname, "tsconfig.json")
14
- }
15
- }
16
- }
17
- }
18
- ]
19
- };
@@ -1,197 +0,0 @@
1
- #!/usr/bin/env node
2
- "use strict";
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- process.setMaxListeners(0);
5
- const os = require("os");
6
- const yargs = require("yargs");
7
- const events_1 = require("events");
8
- const sd_core_node_1 = require("@simplysm/sd-core-node");
9
- const SdCliProject_1 = require("../entry-points/SdCliProject");
10
- const SdCliLocalUpdater_1 = require("../entry-points/SdCliLocalUpdater");
11
- const SdCliFileCrypto_1 = require("../utils/SdCliFileCrypto");
12
- const SdCliCordova_1 = require("../build-tools/SdCliCordova");
13
- const SdCliPrepare_1 = require("../entry-points/SdCliPrepare");
14
- events_1.EventEmitter.defaultMaxListeners = 0;
15
- const logger = sd_core_node_1.Logger.get(["simplysm", "sd-cli"]);
16
- (async () => {
17
- const argv = await yargs.version(false)
18
- .help("help", "도움말")
19
- .alias("help", "h")
20
- .options({
21
- debug: {
22
- type: "boolean",
23
- describe: "디버그 로그를 표시할 것인지 여부",
24
- default: false
25
- }
26
- })
27
- .command("watch", "프로젝트의 각 패키지에 대한 변경감지 빌드를 수행합니다.", (cmd) => cmd
28
- .options({
29
- packages: {
30
- type: "string",
31
- describe: "수행할 패키지 설정",
32
- array: true
33
- },
34
- config: {
35
- type: "string",
36
- describe: "simplysm.json 파일 경로"
37
- },
38
- noLint: {
39
- type: "boolean",
40
- describe: `lint 작업을 수행하지 않음`
41
- },
42
- options: {
43
- type: "string",
44
- describe: "옵션 설정 (설정파일에서 @로 시작하는 부분)",
45
- array: true
46
- }
47
- }))
48
- .command("run-device <cordovaPath> <target> <url>", "변경감지중인 플랫폼을 디바이스에 앱 형태로 띄웁니다.", (cmd) => cmd
49
- .positional("cordovaPath", {
50
- type: "string",
51
- describe: "CORDOVA 프로젝트 경로",
52
- demandOption: true
53
- })
54
- .positional("target", {
55
- type: "string",
56
- describe: "빌드타겟(android,...)",
57
- demandOption: true
58
- })
59
- .positional("url", {
60
- type: "string",
61
- describe: "Webview로 오픈할 URL",
62
- demandOption: true
63
- }))
64
- .command("build", "프로젝트의 각 패키지에 대한 빌드를 수행합니다.", (cmd) => cmd
65
- .options({
66
- packages: {
67
- type: "string",
68
- describe: "수행할 패키지 설정",
69
- array: true
70
- },
71
- config: {
72
- type: "string",
73
- describe: "simplysm.json 파일 경로"
74
- },
75
- noLint: {
76
- type: "boolean",
77
- describe: `lint 작업을 수행하지 않음`
78
- },
79
- options: {
80
- type: "string",
81
- describe: "옵션 설정 (설정파일에서 @로 시작하는 부분)",
82
- array: true
83
- }
84
- }))
85
- .command("publish", "프로젝트의 각 패키지를 배포합니다.", (cmd) => cmd.version(false)
86
- .options({
87
- build: {
88
- type: "boolean",
89
- describe: "새로 빌드한 후에 배포합니다",
90
- default: false
91
- },
92
- noLint: {
93
- type: "boolean",
94
- describe: `빌드시, lint 작업을 수행하지 않음`
95
- },
96
- packages: {
97
- type: "string",
98
- describe: "수행할 패키지 설정",
99
- array: true
100
- },
101
- config: {
102
- type: "string",
103
- describe: "simplysm.json 파일 경로"
104
- },
105
- options: {
106
- type: "string",
107
- describe: "옵션 설정 (설정파일에서 @로 시작하는 부분)",
108
- array: true
109
- }
110
- }))
111
- .command("local-update", "로컬 라이브러리 업데이트를 수행합니다.", (cmd) => cmd.version(false)
112
- .options({
113
- config: {
114
- type: "string",
115
- describe: "simplysm.json 파일 경로"
116
- }
117
- }))
118
- .command("enc-file <file>", "파일을 암호화 합니다.", (cmd) => cmd.version(false)
119
- .positional("file", {
120
- type: "string",
121
- describe: "암호화할 파일명"
122
- }))
123
- .command("dec-file <file>", "파일을 복호화 합니다.", (cmd) => cmd.version(false)
124
- .positional("file", {
125
- type: "string",
126
- describe: "암호화된 파일명"
127
- }))
128
- .command("prepare", "sd-cli 준비")
129
- .parse();
130
- if (argv.debug) {
131
- Error.stackTraceLimit = 100;
132
- process.env.SD_CLI_LOGGER_SEVERITY = "DEBUG";
133
- sd_core_node_1.Logger.setConfig(["simplysm", "sd-cli"], {
134
- console: {
135
- level: sd_core_node_1.LoggerSeverity.debug
136
- }
137
- });
138
- }
139
- else {
140
- sd_core_node_1.Logger.setConfig(["simplysm", "sd-cli"], {
141
- dot: true
142
- });
143
- }
144
- const args = argv._;
145
- if (args[0] === "build") {
146
- await new SdCliProject_1.SdCliProject(process.cwd())
147
- .buildAsync({
148
- packages: argv.packages,
149
- config: argv.config,
150
- options: argv.options,
151
- skipProcesses: argv.noLint ? ["lint"] : undefined
152
- });
153
- process.exit(0);
154
- }
155
- else if (args[0] === "watch") {
156
- await new SdCliProject_1.SdCliProject(process.cwd())
157
- .buildAsync({
158
- watch: true,
159
- packages: argv.packages,
160
- config: argv.config,
161
- options: argv.options,
162
- skipProcesses: argv.noLint ? ["lint"] : undefined
163
- });
164
- }
165
- else if (args[0] === "run-device") {
166
- await SdCliCordova_1.SdCliCordova.runWebviewOnDeviceAsync(argv.cordovaPath, argv.target, argv.url);
167
- }
168
- else if (args[0] === "local-update") {
169
- await new SdCliLocalUpdater_1.SdCliLocalUpdater(process.cwd()).localUpdateAsync(false, { config: argv.config });
170
- }
171
- else if (args[0] === "publish") {
172
- await new SdCliProject_1.SdCliProject(process.cwd())
173
- .publishAsync({
174
- build: argv.build,
175
- packages: argv.packages,
176
- config: argv.config,
177
- options: argv.options
178
- });
179
- process.exit(0);
180
- }
181
- else if (args[0] === "enc-file") {
182
- await new SdCliFileCrypto_1.SdCliFileCrypto().encryptAsync(argv.file);
183
- }
184
- else if (args[0] === "dec-file") {
185
- await new SdCliFileCrypto_1.SdCliFileCrypto().decryptAsync(argv.file);
186
- }
187
- else if (args[0] === "prepare") {
188
- await new SdCliPrepare_1.SdCliPrepare().prepareAsync();
189
- }
190
- else {
191
- throw new Error(`명령어가 잘못되었습니다.${os.EOL + os.EOL}\t${argv._[0]}${os.EOL}`);
192
- }
193
- })().catch((err) => {
194
- logger.error(err);
195
- process.exit(1);
196
- });
197
- //# sourceMappingURL=sd-cli.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sd-cli.js","sourceRoot":"","sources":["../../src/bin/sd-cli.ts"],"names":[],"mappings":"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"}