@simplysm/sd-cli 6.4.6 → 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 -59
  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 -145
  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 -636
  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 -242
  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 -793
  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,335 @@
1
+ import { ISdCliPackageBuildResult } from "../commons";
2
+ import { EventEmitter } from "events";
3
+ import ts from "typescript";
4
+ import { FsUtil, Logger, PathUtil, SdFsWatcher } from "@simplysm/sd-core-node";
5
+ import * as path from "path";
6
+ import { createHash } from "crypto";
7
+ import { SdBuildResultUtil } from "../utils/SdBuildResultUtil";
8
+ import { NgtscProgram } from "@angular/compiler-cli";
9
+ import sass from "sass";
10
+ import { SdCliPackageLinter } from "../build-tool/SdCliPackageLinter";
11
+ import { SdCliCacheCompilerHost } from "../build-tool/SdCliCacheCompilerHost";
12
+ import { SdCliNgCacheCompilerHost } from "../build-tool/SdCliNgCacheCompilerHost";
13
+ import { NgCompiler } from "@angular/compiler-cli/src/ngtsc/core";
14
+
15
+ export class SdCliTsLibBuilder extends EventEmitter {
16
+ private readonly _logger = Logger.get(["simplysm", "sd-cli", this.constructor.name]);
17
+
18
+ private _moduleResolutionCache?: ts.ModuleResolutionCache;
19
+
20
+ private readonly _linter: SdCliPackageLinter;
21
+
22
+ private readonly _fileCache = new Map<string, IFileCache>();
23
+ private readonly _writeFileCache = new Map<string, string>();
24
+
25
+ private _program?: ts.Program;
26
+ private _ngProgram?: NgtscProgram;
27
+ private _builder?: ts.EmitAndSemanticDiagnosticsBuilderProgram;
28
+
29
+ public constructor(private readonly _rootPath,
30
+ private readonly _isAngular: boolean) {
31
+ super();
32
+ this._linter = new SdCliPackageLinter(this._rootPath);
33
+ }
34
+
35
+ public override on(event: "change", listener: () => void): this;
36
+ public override on(event: "complete", listener: (results: ISdCliPackageBuildResult[]) => void): this;
37
+ public override on(event: string | symbol, listener: (...args: any[]) => void): this {
38
+ return super.on(event, listener);
39
+ }
40
+
41
+ public async watchAsync(): Promise<void> {
42
+ this.emit("change");
43
+
44
+ // TSCONFIG 읽기
45
+ const parsedTsconfig = await this._getParsedTsconfigAsync();
46
+
47
+ // DIST 비우기
48
+ await FsUtil.removeAsync(parsedTsconfig.options.outDir!);
49
+
50
+ // 프로그램 리로드
51
+ const buildPack = this._createSdBuildPack(parsedTsconfig);
52
+
53
+ const relatedPaths = await this.getAllRelatedPathsAsync();
54
+ const watcher = SdFsWatcher.watch(relatedPaths);
55
+ watcher.onChange(async (changeInfos) => {
56
+ const changeFilePaths = changeInfos.filter((item) => ["add", "change", "unlink"].includes(item.event)).map((item) => item.path);
57
+ if (changeFilePaths.length === 0) return;
58
+
59
+ this._logger.debug("파일 변경 감지", changeInfos);
60
+ this.emit("change");
61
+
62
+ // 캐쉬 삭제
63
+ for (const changeFilePath of changeFilePaths) {
64
+ this._fileCache.delete(PathUtil.posix(changeFilePath));
65
+ }
66
+
67
+ // 빌드
68
+ const watchBuildPack = this._createSdBuildPack(parsedTsconfig);
69
+
70
+ // 린트
71
+ const watchBuildResults = await this._runBuilderAsync(watchBuildPack.builder, watchBuildPack.ngCompiler);
72
+ watchBuildResults.push(...await this._linter.lintAsync([
73
+ ...watchBuildPack.affectedSourceFiles.map((item) => item.fileName),
74
+ ...changeFilePaths
75
+ ], watchBuildPack.program));
76
+
77
+ const watchRelatedPaths = await this.getAllRelatedPathsAsync();
78
+ watcher.add(watchRelatedPaths);
79
+
80
+ this.emit("complete", watchBuildResults);
81
+ });
82
+
83
+ // 빌드
84
+ const buildResults = await this._runBuilderAsync(buildPack.builder, buildPack.ngCompiler);
85
+
86
+ // 린트
87
+ buildResults.push(...await this._linter.lintAsync(relatedPaths, buildPack.program));
88
+
89
+ this.emit("complete", buildResults);
90
+ }
91
+
92
+ public async buildAsync(): Promise<ISdCliPackageBuildResult[]> {
93
+ // TSCONFIG 읽기
94
+ const parsedTsconfig = await this._getParsedTsconfigAsync();
95
+
96
+ // DIST 비우기
97
+ await FsUtil.removeAsync(parsedTsconfig.options.outDir!);
98
+
99
+ // 프로그램 리로드
100
+ const buildPack = this._createSdBuildPack(parsedTsconfig);
101
+
102
+ // 빌드
103
+ const buildResults = await this._runBuilderAsync(buildPack.builder, buildPack.ngCompiler);
104
+
105
+ // 린트
106
+ const relatedPaths = await this.getAllRelatedPathsAsync();
107
+ buildResults.push(...await this._linter.lintAsync(relatedPaths, buildPack.program));
108
+
109
+ return buildResults;
110
+ }
111
+
112
+ private async getAllRelatedPathsAsync(): Promise<string[]> {
113
+ const fileCachePaths = Array.from(this._fileCache.keys());
114
+ const mySourceGlobPath = path.resolve(this._rootPath, "**", "+(*.js|*.cjs|*.mjs|*.ts)");
115
+ const mySourceFilePaths = await FsUtil.globAsync(mySourceGlobPath, {
116
+ ignore: [
117
+ "**/node_modules/**",
118
+ "**/dist/**",
119
+ "**/.*/**"
120
+ ]
121
+ });
122
+
123
+ return [...fileCachePaths, ...mySourceFilePaths, path.resolve(this._rootPath, ".eslintrc.cjs")].distinct();
124
+ }
125
+
126
+ private async _runBuilderAsync(builder: ts.EmitAndSemanticDiagnosticsBuilderProgram, ngCompiler?: NgCompiler): Promise<ISdCliPackageBuildResult[]> {
127
+ try {
128
+ const results: ISdCliPackageBuildResult[] = [];
129
+
130
+ const diagnostics: ts.Diagnostic[] = [];
131
+
132
+ if (ngCompiler) {
133
+ diagnostics.push(...ngCompiler.getOptionDiagnostics());
134
+ }
135
+
136
+ diagnostics.push(
137
+ ...builder.getOptionsDiagnostics(),
138
+ ...builder.getGlobalDiagnostics()
139
+ );
140
+
141
+ if (ngCompiler) {
142
+ await ngCompiler.analyzeAsync();
143
+ }
144
+
145
+ for (const sourceFile of builder.getSourceFiles()) {
146
+ if (ngCompiler?.ignoreForDiagnostics.has(sourceFile)) continue;
147
+
148
+ diagnostics.push(
149
+ ...builder.getSyntacticDiagnostics(sourceFile),
150
+ ...builder.getSemanticDiagnostics(sourceFile)
151
+ );
152
+
153
+ if (
154
+ ngCompiler &&
155
+ !sourceFile.isDeclarationFile &&
156
+ !ngCompiler.ignoreForEmit.has(sourceFile) &&
157
+ !ngCompiler.incrementalDriver.safeToSkipEmit(sourceFile)
158
+ ) {
159
+ diagnostics.push(
160
+ ...ngCompiler.getDiagnosticsForFile(sourceFile, 1)
161
+ );
162
+ }
163
+ }
164
+
165
+ results.push(
166
+ ...diagnostics
167
+ .filter((item) => [ts.DiagnosticCategory.Error, ts.DiagnosticCategory.Warning].includes(item.category))
168
+ .map((item) => SdBuildResultUtil.convertDiagsToResult(item))
169
+ .filterExists()
170
+ );
171
+
172
+ if (results.some((item) => item.severity === "error")) {
173
+ return results;
174
+ }
175
+
176
+ const transformers = ngCompiler?.prepareEmit().transformers;
177
+ for (const sourceFile of builder.getSourceFiles()) {
178
+ if (ngCompiler?.ignoreForEmit.has(sourceFile)) continue;
179
+ builder.emit(sourceFile, undefined, undefined, undefined, transformers);
180
+ }
181
+
182
+ return results;
183
+ }
184
+ catch (err) {
185
+ if (err instanceof sass.Exception) {
186
+ const matches = err.sassStack.match(/^(.*\.sd\.scss) ([0-9]*):([0-9]*)/)!;
187
+ const filePath = path.resolve(matches[1].replace(/\.sd\.scss/, "").replace(/^\.:/, item => item.toUpperCase()));
188
+ const scssLine = matches[2];
189
+ const scssChar = matches[3];
190
+ const message = err.sassMessage;
191
+
192
+ return [{
193
+ filePath,
194
+ line: undefined,
195
+ char: undefined,
196
+ code: undefined,
197
+ severity: "error",
198
+ message: `스타일(${scssLine}:${scssChar}): ${message}`
199
+ }];
200
+ }
201
+
202
+ return [{
203
+ filePath: undefined,
204
+ line: undefined,
205
+ char: undefined,
206
+ code: undefined,
207
+ severity: "error",
208
+ message: err.message
209
+ }];
210
+ }
211
+ }
212
+
213
+ private _createSdBuildPack(parsedTsconfig: ts.ParsedCommandLine): ISdBuildPack {
214
+ const compilerHost = this._createCacheCompilerHost(parsedTsconfig);
215
+ const { program, ngCompiler } = this._createProgram(parsedTsconfig, compilerHost);
216
+
217
+ this._builder = ts.createEmitAndSemanticDiagnosticsBuilderProgram(
218
+ program,
219
+ compilerHost,
220
+ this._builder
221
+ );
222
+
223
+ const affectedSourceFileSet: Set<ts.SourceFile> = new Set<ts.SourceFile>();
224
+ while (true) {
225
+ const result = this._builder.getSemanticDiagnosticsOfNextAffectedFile(undefined, (sourceFile) => {
226
+ if (ngCompiler && ngCompiler.ignoreForDiagnostics.has(sourceFile) && sourceFile.fileName.endsWith(".ngtypecheck.ts")) {
227
+ const orgFileName = sourceFile.fileName.slice(0, -15) + ".ts";
228
+ const orgSourceFile = this._builder!.getSourceFile(orgFileName);
229
+ if (orgSourceFile) {
230
+ affectedSourceFileSet.add(orgSourceFile);
231
+ }
232
+
233
+ return true;
234
+ }
235
+
236
+ return false;
237
+ });
238
+ if (!result) break;
239
+
240
+ affectedSourceFileSet.add(result.affected as ts.SourceFile);
241
+ }
242
+
243
+ return {
244
+ program,
245
+ ngCompiler,
246
+ builder: this._builder,
247
+ affectedSourceFiles: Array.from(affectedSourceFileSet.values())
248
+ };
249
+ }
250
+
251
+ private _createProgram(parsedTsconfig: ts.ParsedCommandLine, compilerHost: ts.CompilerHost): { program: ts.Program; ngCompiler?: NgCompiler } {
252
+ if (this._isAngular) {
253
+ this._ngProgram = new NgtscProgram(
254
+ parsedTsconfig.fileNames,
255
+ parsedTsconfig.options,
256
+ compilerHost,
257
+ this._ngProgram
258
+ );
259
+ this._program = this._ngProgram.getTsProgram();
260
+
261
+ this._configProgramSourceFileVersions(this._program);
262
+ return {
263
+ program: this._program,
264
+ ngCompiler: this._ngProgram.compiler
265
+ };
266
+ }
267
+ else {
268
+ this._program = ts.createProgram(
269
+ parsedTsconfig.fileNames,
270
+ parsedTsconfig.options,
271
+ compilerHost,
272
+ this._program
273
+ );
274
+
275
+ this._configProgramSourceFileVersions(this._program);
276
+
277
+ return { program: this._program };
278
+ }
279
+ }
280
+
281
+ private _configProgramSourceFileVersions(program: ts.Program): void {
282
+ const baseGetSourceFiles = program.getSourceFiles;
283
+ program.getSourceFiles = function (...parameters) {
284
+ const files: readonly (ts.SourceFile & { version?: string })[] = baseGetSourceFiles(...parameters);
285
+
286
+ for (const file of files) {
287
+ if (file.version === undefined) {
288
+ file.version = createHash("sha256").update(file.text).digest("hex");
289
+ }
290
+ }
291
+
292
+ return files;
293
+ };
294
+ }
295
+
296
+ private _createCacheCompilerHost(parsedTsconfig: ts.ParsedCommandLine): ts.CompilerHost {
297
+ if (!this._moduleResolutionCache) {
298
+ this._moduleResolutionCache = ts.createModuleResolutionCache(this._rootPath, (s) => s, parsedTsconfig.options);
299
+ }
300
+
301
+ const compilerHost = SdCliCacheCompilerHost.create(
302
+ parsedTsconfig,
303
+ this._moduleResolutionCache,
304
+ this._fileCache,
305
+ this._writeFileCache
306
+ );
307
+
308
+ if (this._isAngular) {
309
+ return SdCliNgCacheCompilerHost.wrap(compilerHost, this._fileCache);
310
+ }
311
+ else {
312
+ return compilerHost;
313
+ }
314
+ }
315
+
316
+ private async _getParsedTsconfigAsync(): Promise<ts.ParsedCommandLine> {
317
+ const tsconfigFilePath = path.resolve(this._rootPath, "tsconfig-build.json");
318
+ const tsconfig = await FsUtil.readJsonAsync(tsconfigFilePath);
319
+ return ts.parseJsonConfigFileContent(tsconfig, ts.sys, this._rootPath);
320
+ }
321
+ }
322
+
323
+ interface IFileCache {
324
+ exists?: boolean;
325
+ sourceFile?: ts.SourceFile;
326
+ content?: string;
327
+ styleContent?: string;
328
+ }
329
+
330
+ interface ISdBuildPack {
331
+ program: ts.Program;
332
+ ngCompiler?: NgCompiler;
333
+ builder: ts.EmitAndSemanticDiagnosticsBuilderProgram;
334
+ affectedSourceFiles: ts.SourceFile[];
335
+ }
package/src/commons.ts CHANGED
@@ -1,49 +1,3 @@
1
- export interface ISdProjectConfig {
2
- packages: Record<string, TSdPackageConfig | undefined>;
3
- localUpdates?: Record<string, string>;
4
- }
5
-
6
- export type TSdPackageConfig =
7
- ISdLibraryPackageConfig |
8
- ISdClientPackageConfig |
9
- ISdServerPackageConfig |
10
- ISdNonePackageConfig;
11
-
12
- export interface ISdLibraryPackageConfig {
13
- type: "library";
14
- targets?: ("node" | "browser" | "angular")[];
15
- autoIndex?: ISdAutoIndexConfig | boolean;
16
- publish?: "npm";
17
- }
18
-
19
- export interface ISdClientPackageConfig {
20
- type: "client";
21
- platforms?: TSdClientPlatformConfig[];
22
- env?: Record<string, string>;
23
- server?: string;
24
- resolveFallback?: Record<string, string>;
25
- configs?: Record<string, any>;
26
- publish?: TSdPublishConfig;
27
- }
28
-
29
- export interface ISdServerPackageConfig {
30
- type: "server";
31
- env?: Record<string, string>;
32
- externalDependencies?: string[];
33
- configs?: Record<string, any>;
34
- pm2?: Record<string, any> | boolean;
35
- iis?: boolean | { serverExeFilePath?: string };
36
- publish?: TSdPublishConfig;
37
- }
38
-
39
- export interface ISdNonePackageConfig {
40
- type: "none";
41
- }
42
-
43
- export interface ISdAutoIndexConfig {
44
- polyfills?: string[];
45
- }
46
-
47
1
  export interface INpmConfig {
48
2
  name: string;
49
3
  version: string;
@@ -52,6 +6,9 @@ export interface INpmConfig {
52
6
  browser?: string;
53
7
  module?: string;
54
8
  main?: string;
9
+ exports?: Record<string, {
10
+ types?: string;
11
+ }>;
55
12
  scripts?: Record<string, string>;
56
13
 
57
14
  dependencies?: Record<string, string>;
@@ -62,98 +19,32 @@ export interface INpmConfig {
62
19
 
63
20
  export interface ITsconfig {
64
21
  compilerOptions?: {
65
- module?: "commonjs" | "es2020";
66
- target?: "es2015" | "es2020";
67
- lib?: ("dom" | "es2015" | "es2020")[];
68
22
  outDir?: string;
69
- declarationDir?: string;
70
- declaration?: boolean;
71
- declarationMap?: boolean;
72
23
  baseUrl?: string;
73
24
  paths?: Record<string, string[]>;
74
- generateTrace?: string;
75
25
  };
76
- angularCompilerOptions?: {
77
- enableI18nLegacyMessageIdFormat?: boolean;
78
- strictInjectionParameters?: boolean;
79
- strictInputAccessModifiers?: boolean;
80
- strictTemplates?: boolean;
81
- strictInputTypes?: boolean;
82
- strictOutputEventTypes?: boolean;
83
- enableIvy?: boolean;
84
- compilationMode?: "partial" | "full";
85
- disableTypeScriptVersionCheck?: boolean;
86
- };
87
- files?: string[];
88
- include?: string[];
89
26
  }
90
27
 
91
- export interface ISdPackageBuildResult {
28
+ export interface ISdCliPackageBuildResult {
92
29
  filePath: string | undefined;
30
+ line: number | undefined;
31
+ char: number | undefined;
32
+ code: string | undefined;
93
33
  severity: "error" | "warning";
94
34
  message: string;
95
35
  }
96
36
 
97
- export type TSdPublishConfig =
98
- ISdSFtpPublishConfig |
99
- ISdLocalDirectoryPublishConfig |
100
- ISdFtpPublishConfig |
101
- ISdAzureAppServicePublishConfig;
102
-
103
- export interface ISdSFtpPublishConfig {
104
- type: "sftp";
105
- host: string;
106
- port?: number;
107
- path: string;
108
- username: string;
109
- password: string;
37
+ export interface ISdCliWorkspaceConfig {
38
+ packages: Record<string, TSdCliPackageConfig | undefined>;
110
39
  }
111
40
 
112
- export interface ISdFtpPublishConfig {
113
- type: "ftp";
114
- host: string;
115
- port?: number;
116
- path: string;
117
- username: string;
118
- password: string;
119
- secure?: boolean;
120
- }
121
-
122
- export interface ISdAzureAppServicePublishConfig {
123
- type: "azure-app-service";
124
- username: string;
125
- password: string;
126
- subscriptionId: string;
127
- resourceGroupName: string;
128
- serviceName: string;
129
- path: string;
130
- }
41
+ export type TSdCliPackageConfig = ISdCliLibPackageConfig | ISdCliNgLibPackageConfig;
131
42
 
132
- export interface ISdLocalDirectoryPublishConfig {
133
- type: "local-directory";
134
- path: string;
135
- }
136
-
137
- export type TSdClientPlatformConfig =
138
- ISdClientBrowserPlatformConfig |
139
- ISdClientCordovaPlatformConfig;
140
-
141
- export interface ISdClientBrowserPlatformConfig {
142
- type: "browser";
43
+ export interface ISdCliLibPackageConfig {
44
+ type: "library";
45
+ publish?: "npm";
143
46
  }
144
47
 
145
- export interface ISdClientCordovaPlatformConfig {
146
- type: "cordova";
147
- targets: ("android")[];
148
- appId: string;
149
- appName: string;
150
- plugins?: string[];
151
- icon?: string;
152
- sign?: {
153
- keystore: string;
154
- storePassword: string;
155
- alias: string;
156
- password: string;
157
- keystoreType: string;
158
- };
48
+ export interface ISdCliNgLibPackageConfig {
49
+ type: "angular";
159
50
  }