@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
@@ -1,374 +0,0 @@
1
- import {
2
- ClassMetadata,
3
- isClassMetadata,
4
- isMetadataGlobalReferenceExpression,
5
- isMetadataImportedSymbolReferenceExpression,
6
- isMetadataSymbolicCallExpression,
7
- isMetadataSymbolicIfExpression,
8
- isMetadataSymbolicReferenceExpression,
9
- MetadataEntry,
10
- MetadataObject,
11
- MetadataSymbolicCallExpression,
12
- ModuleMetadata
13
- } from "@angular/compiler-cli/src/metadata/schema";
14
- import { NeverEntryError, StringUtil } from "@simplysm/sd-core-common";
15
-
16
- export class SdAotMetadataReader {
17
- public constructor(private readonly _metadataRoot: ModuleMetadata) {
18
- }
19
-
20
- public getMetadatas(): IAotModuleDefMetadata {
21
- if (StringUtil.isNullOrEmpty(this._metadataRoot.importAs)) {
22
- throw new NeverEntryError();
23
- }
24
-
25
- const result: IAotModuleDefMetadata = {
26
- moduleName: this._metadataRoot.importAs,
27
- exports: [],
28
- metadata: []
29
- };
30
-
31
- for (const metadataName of Object.keys(this._metadataRoot.metadata)) {
32
- const metadata = this._metadataRoot.metadata[metadataName];
33
- if (!isClassMetadata(metadata)) continue;
34
- const className = metadataName;
35
-
36
- // BrowserModule, ApplicationModule 두가지는 무시함
37
- if (className === "BrowserModule" || className === "ApplicationModule") {
38
- continue;
39
- }
40
-
41
- const ngModuleDec = this._getDecorator(metadata, "NgModule");
42
- if (ngModuleDec) {
43
- const decParam = this._getNgModuleDecoratorParam(ngModuleDec);
44
- const staticProviders = this.getNgModuleStaticProviders(metadata);
45
- result.metadata.push({
46
- type: "NgModule",
47
- className,
48
- exports: decParam.exports,
49
- providers: [
50
- ...decParam.providers,
51
- ...staticProviders
52
- ]
53
- });
54
- }
55
-
56
- const injectableDec = this._getDecorator(metadata, "Injectable");
57
- if (injectableDec) {
58
- result.metadata.push({
59
- type: "Injectable",
60
- className,
61
- ...this._getInjectableDecoratorParam(injectableDec)
62
- });
63
- }
64
-
65
- const directiveDec = this._getDecorator(metadata, "Directive");
66
- if (directiveDec) {
67
- result.metadata.push({
68
- type: "Directive",
69
- className,
70
- ...this._getDirectiveDecoratorParam(directiveDec)
71
- });
72
- }
73
-
74
- const pipeDec = this._getDecorator(metadata, "Pipe");
75
- if (pipeDec) {
76
- result.metadata.push({
77
- type: "Pipe",
78
- className,
79
- ...this._getPipeDecoratorParam(pipeDec)
80
- });
81
- }
82
-
83
- const componentDec = this._getDecorator(metadata, "Component");
84
- if (componentDec) {
85
- result.metadata.push({
86
- type: "Component",
87
- className,
88
- ...this._getComponentDecoratorParam(componentDec)
89
- });
90
- }
91
- }
92
-
93
- result.exports.push(...this._getModuleExports());
94
-
95
- return result;
96
- }
97
-
98
- private _getDecorator(metadata: ClassMetadata, name: string): MetadataSymbolicCallExpression | undefined {
99
- if (!metadata.decorators) return undefined;
100
-
101
- for (const dec of metadata.decorators) {
102
- if (!isMetadataSymbolicCallExpression(dec)) throw new NeverEntryError();
103
- if (!isMetadataSymbolicReferenceExpression(dec.expression)) throw new NeverEntryError();
104
- const decTargets = this._getReferenceTargets(dec.expression);
105
- if (decTargets.length !== 1) throw new NeverEntryError();
106
-
107
- if (decTargets[0].lastName === name) return dec;
108
- }
109
-
110
- return undefined;
111
- }
112
-
113
- private _getModuleExports(): IAotModuleExport[] {
114
- const exports: IAotModuleExport[] = [];
115
-
116
- for (const metadataName of Object.keys(this._metadataRoot.metadata)) {
117
- exports.push({ moduleName: undefined, name: metadataName, as: undefined });
118
- }
119
-
120
- if (this._metadataRoot.exports) {
121
- for (const exp of this._metadataRoot.exports) {
122
- if (exp.export) {
123
- for (const expexp of exp.export) {
124
- if (typeof expexp === "string") {
125
- exports.push({ moduleName: exp.from, name: expexp, as: undefined });
126
- }
127
- else {
128
- exports.push({ moduleName: exp.from, name: expexp.name, as: expexp.as });
129
- }
130
- }
131
- }
132
- else {
133
- exports.push({ moduleName: exp.from, name: undefined, as: undefined });
134
- }
135
- }
136
- }
137
-
138
- return exports;
139
- }
140
-
141
- private _getDirectiveDecoratorParam(dec: MetadataSymbolicCallExpression): { selector?: string } {
142
- const result: { selector?: string } = {};
143
-
144
- if (!dec.arguments || dec.arguments.length === 0) throw new NeverEntryError();
145
-
146
- const paramObj = dec.arguments[0] as MetadataObject;
147
-
148
- if (paramObj.selector !== undefined) {
149
- if (typeof paramObj.selector !== "string") throw new NeverEntryError();
150
- result.selector = paramObj.selector;
151
- }
152
-
153
- return result;
154
- }
155
-
156
- private _getPipeDecoratorParam(dec: MetadataSymbolicCallExpression): { name?: string } {
157
- const result: { name?: string } = {};
158
-
159
- if (!dec.arguments || dec.arguments.length === 0) throw new NeverEntryError();
160
-
161
- const paramObj = dec.arguments[0] as MetadataObject;
162
-
163
- if (paramObj.name !== undefined) {
164
- if (typeof paramObj.name !== "string") throw new NeverEntryError();
165
- result.name = paramObj.name;
166
- }
167
-
168
- return result;
169
- }
170
-
171
- private _getComponentDecoratorParam(dec: MetadataSymbolicCallExpression): { selector?: string } {
172
- const result: { selector?: string } = {};
173
-
174
- if (!dec.arguments || dec.arguments.length === 0) throw new NeverEntryError();
175
-
176
- const paramObj = dec.arguments[0] as MetadataObject;
177
-
178
- if (paramObj.selector !== undefined) {
179
- if (typeof paramObj.selector !== "string") throw new NeverEntryError();
180
- result.selector = paramObj.selector;
181
- }
182
-
183
- return result;
184
- }
185
-
186
- private _getInjectableDecoratorParam(dec: MetadataSymbolicCallExpression): { providedIn?: string } {
187
- const result: { providedIn?: string } = {};
188
-
189
- if (dec.arguments && dec.arguments.length !== 0) {
190
- const paramObj = dec.arguments[0] as MetadataObject;
191
-
192
- if (paramObj.providedIn != null) {
193
- if (typeof paramObj.providedIn !== "string") throw new NeverEntryError();
194
- result.providedIn = paramObj.providedIn;
195
- }
196
- }
197
-
198
- return result;
199
- }
200
-
201
- private _getReferenceTargets(metadata: MetadataEntry | MetadataEntry[]): ({ lastModule?: string; lastName?: string; metadata: MetadataEntry })[] {
202
- if (isMetadataSymbolicReferenceExpression(metadata)) {
203
- if (isMetadataGlobalReferenceExpression(metadata)) {
204
- const subMetadata = this._metadataRoot.metadata[metadata.name];
205
- if (isMetadataSymbolicReferenceExpression(subMetadata)) {
206
- return this._getReferenceTargets(subMetadata);
207
- }
208
- if (subMetadata instanceof Array) {
209
- return this._getReferenceTargets(subMetadata);
210
- }
211
- else {
212
- return [{ lastName: metadata.name, metadata: subMetadata }];
213
- }
214
- }
215
- else if (isMetadataImportedSymbolReferenceExpression(metadata)) {
216
- return [{ lastModule: metadata.module, lastName: metadata.name, metadata }];
217
- }
218
- else {
219
- return [{ lastModule: metadata.module, metadata }];
220
- }
221
- }
222
- else if (metadata instanceof Array) {
223
- const result: ({ lastModule?: string; lastName?: string; metadata: MetadataEntry })[] = [];
224
-
225
- for (const metadataItem of metadata) {
226
- if (isMetadataSymbolicReferenceExpression(metadataItem)) {
227
- result.push(...this._getReferenceTargets(metadataItem));
228
- }
229
- else if (metadataItem instanceof Array) {
230
- result.push(...this._getReferenceTargets(metadataItem));
231
- }
232
- else {
233
- result.push({ metadata: metadataItem });
234
- }
235
- }
236
-
237
- return result;
238
- }
239
- else {
240
- return [{ metadata }];
241
- }
242
- }
243
-
244
- private _getProviderReferenceTargets(metadata: MetadataEntry | MetadataEntry[]): ({ lastModule?: string; lastName?: string; metadata: MetadataEntry })[] {
245
- const result: ({ lastModule?: string; lastName?: string; metadata: MetadataEntry })[] = [];
246
-
247
- const refTargets = this._getReferenceTargets(metadata);
248
- for (const refTarget of refTargets) {
249
- if (refTarget.metadata !== undefined && (refTarget.metadata as any).provide !== undefined) {
250
- result.push(...this._getProviderReferenceTargets((refTarget.metadata as any).provide));
251
- }
252
- else if (!StringUtil.isNullOrEmpty(refTarget.lastName)) {
253
- result.push(refTarget);
254
- }
255
- else if (isMetadataSymbolicCallExpression(refTarget.metadata)) {
256
- const subProvRefTargets = this._getProviderReferenceTargets(
257
- this._getProviderReferenceTargets(refTarget.metadata.expression).mapMany((item) => (item.metadata as any).value ?? [])
258
- );
259
- result.push(...subProvRefTargets);
260
- }
261
- else if (isMetadataSymbolicIfExpression(refTarget.metadata)) {
262
- result.push(...this._getProviderReferenceTargets([refTarget.metadata.thenExpression, refTarget.metadata.elseExpression]));
263
- }
264
- else {
265
- throw new NeverEntryError();
266
- }
267
- }
268
-
269
- return result;
270
- }
271
-
272
- private _getNgModuleDecoratorParam(dec: MetadataSymbolicCallExpression): { exports: IAotModuleImport[]; providers: IAotModuleImport[] } {
273
- const result: { exports: IAotModuleImport[]; providers: IAotModuleImport[] } = {
274
- exports: [],
275
- providers: []
276
- };
277
-
278
- if (!dec.arguments || dec.arguments.length === 0) throw new NeverEntryError();
279
-
280
- const paramObj = dec.arguments[0] as MetadataObject;
281
- if (paramObj.exports !== undefined) {
282
- if (!(paramObj.exports instanceof Array)) throw new NeverEntryError();
283
-
284
- for (const exp of paramObj.exports) {
285
- if (!isMetadataSymbolicReferenceExpression(exp)) throw new NeverEntryError();
286
- const expRefTargets = this._getReferenceTargets(exp);
287
- for (const expRefTarget of expRefTargets) {
288
- if (expRefTarget.lastName === undefined) throw new NeverEntryError();
289
- result.exports.push({ moduleName: expRefTarget.lastModule, name: expRefTarget.lastName });
290
- }
291
- }
292
- }
293
-
294
- if (paramObj.providers !== undefined) {
295
- const provRefTargets = this._getProviderReferenceTargets(paramObj.providers);
296
- for (const provRefTarget of provRefTargets) {
297
- if (provRefTarget.lastName === undefined) throw new NeverEntryError();
298
- result.providers.push({ moduleName: provRefTarget.lastModule, name: provRefTarget.lastName });
299
- }
300
- }
301
-
302
- return result;
303
- }
304
-
305
- private getNgModuleStaticProviders(metadata: ClassMetadata): IAotModuleImport[] {
306
- const result: IAotModuleImport[] = [];
307
-
308
- if (metadata.statics) {
309
- const provRefTargets = this._getProviderReferenceTargets(Object.values(metadata.statics).mapMany((item: any) => item.value?.providers ?? []));
310
- for (const provRefTarget of provRefTargets) {
311
- if (provRefTarget.lastName === undefined) throw new NeverEntryError();
312
- result.push({ moduleName: provRefTarget.lastModule, name: provRefTarget.lastName });
313
- }
314
- }
315
-
316
- return result;
317
- }
318
- }
319
-
320
-
321
- export interface IAotModuleDefMetadata {
322
- moduleName: string;
323
- exports: IAotModuleExport[];
324
- metadata: TAotNgMetadata[];
325
- }
326
-
327
- export interface IAotModuleExport {
328
- moduleName: string | undefined;
329
- name: string | undefined;
330
- as: string | undefined;
331
- }
332
-
333
- export type TAotNgMetadata =
334
- IAotNgModuleMetadata
335
- | IAotInjectableMetadata
336
- | IAotDirectiveMetadata
337
- | IAotPipeMetadata
338
- | IAotComponentMetadata;
339
-
340
- export interface IAotNgModuleMetadata {
341
- type: "NgModule";
342
- className: string;
343
- exports: IAotModuleImport[];
344
- providers: IAotModuleImport[];
345
- }
346
-
347
- export interface IAotInjectableMetadata {
348
- type: "Injectable";
349
- className: string;
350
- providedIn?: string;
351
- }
352
-
353
- export interface IAotDirectiveMetadata {
354
- type: "Directive";
355
- className: string;
356
- selector?: string;
357
- }
358
-
359
- export interface IAotPipeMetadata {
360
- type: "Pipe";
361
- className: string;
362
- name?: string;
363
- }
364
-
365
- export interface IAotComponentMetadata {
366
- type: "Component";
367
- className: string;
368
- selector?: string;
369
- }
370
-
371
- export interface IAotModuleImport {
372
- moduleName: string | undefined;
373
- name: string;
374
- }
@@ -1,183 +0,0 @@
1
- import * as ts from "typescript";
2
- import { NeverEntryError } from "@simplysm/sd-core-common";
3
- import { FsUtil, PathUtil } from "@simplysm/sd-core-node";
4
- import { isNamedClassDeclaration } from "@angular/compiler-cli/src/ngtsc/reflection";
5
- import { MetadataReader } from "@angular/compiler-cli/src/ngtsc/metadata";
6
- import { Reference } from "@angular/compiler-cli/src/ngtsc/imports";
7
- import { NgtscProgram } from "@angular/compiler-cli";
8
- import * as path from "path";
9
- import { INpmConfig } from "../../commons";
10
- import { IMyModuleImport } from "./SdMyMetadataReader";
11
- import { SdMetadataError } from "./SdMetadataError";
12
-
13
- export class SdIvyMetadataReader {
14
- private readonly _typeChecker: ts.TypeChecker;
15
- private readonly _metaReader: MetadataReader;
16
-
17
- public constructor(private readonly _sourceFile: ts.SourceFile,
18
- private readonly _ngProgram: NgtscProgram) {
19
- const program = this._ngProgram.getTsProgram();
20
- const ngCompiler = this._ngProgram.compiler;
21
-
22
- this._typeChecker = program.getTypeChecker();
23
- this._metaReader = ngCompiler["ensureAnalyzed"]().metaReader;
24
- }
25
-
26
- public getMetadatas(): IIvyModuleDefMetadata {
27
- const result: IIvyModuleDefMetadata = {
28
- moduleName: this._sourceFile.moduleName ?? this.getPackageName(),
29
- metadata: []
30
- };
31
-
32
- ts.forEachChild(this._sourceFile, (node) => {
33
- if (!isNamedClassDeclaration(node)) return;
34
- const className = node.name.text;
35
-
36
- // BrowserModule, ApplicationModule 두가지는 무시함
37
- if (className === "BrowserModule" || className === "ApplicationModule") {
38
- return;
39
- }
40
-
41
- const ngModuleMeta = this._metaReader.getNgModuleMetadata(new Reference(node));
42
- if (ngModuleMeta) {
43
- result.metadata.push({
44
- type: "NgModule",
45
- className,
46
- exports: ngModuleMeta.exports.map((item) => this._getAliasedModuleImportInfo(item.node.name))
47
- });
48
- }
49
-
50
- const pipeMeta = this._metaReader.getPipeMetadata(new Reference(node));
51
- if (pipeMeta) {
52
- result.metadata.push({
53
- type: "Pipe",
54
- className,
55
- name: pipeMeta.name
56
- });
57
- }
58
-
59
- const directiveMeta = this._metaReader.getDirectiveMetadata(new Reference(node));
60
- if (directiveMeta) {
61
- if (directiveMeta.isComponent) {
62
- result.metadata.push({
63
- type: "Component",
64
- className,
65
- selector: directiveMeta.selector ?? undefined
66
- });
67
- }
68
- else {
69
- result.metadata.push({
70
- type: "Directive",
71
- className,
72
- selector: directiveMeta.selector ?? undefined
73
- });
74
- }
75
- }
76
- });
77
-
78
- return result;
79
- }
80
-
81
- private _getAliasedModuleImportInfo(identifier: ts.Identifier): IMyModuleImport {
82
- const moduleSymbol = this._typeChecker.getSymbolAtLocation(identifier);
83
- if (!moduleSymbol) throw new NeverEntryError();
84
- if (moduleSymbol.valueDeclaration) {
85
- const moduleFilePath = PathUtil.posix(moduleSymbol.valueDeclaration.getSourceFile().fileName);
86
- return { name: identifier.text, moduleFilePath };
87
- }
88
- else {
89
- const aliasedTargetSymbol = this._typeChecker.getAliasedSymbol(moduleSymbol);
90
- const declarations = aliasedTargetSymbol.getDeclarations();
91
- if (!declarations || declarations.length < 1) {
92
- throw new SdMetadataError(this._sourceFile.fileName, `'${identifier.text}'를 찾을 수 없습니다.`);
93
- }
94
-
95
- if (declarations.length === 1) {
96
- return { name: identifier.text, moduleFilePath: PathUtil.posix(declarations[0].getSourceFile().fileName) };
97
- }
98
-
99
- const moduleFilePaths = declarations
100
- .filter((item) => (
101
- this._hasParentsOrMe(item, (item1) => Boolean(item1.modifiers?.some((mod) => mod.kind === ts.SyntaxKind.ExportKeyword)))
102
- ))
103
- .map((item) => PathUtil.posix(item.getSourceFile().fileName))
104
- .distinct();
105
- if (moduleFilePaths.length === 0) {
106
- throw new SdMetadataError(this._sourceFile.fileName, `'${identifier.text}'의 경로를 찾을 수 없습니다.`);
107
- }
108
- if (moduleFilePaths.length !== 1) {
109
- throw new SdMetadataError(this._sourceFile.fileName, `'${identifier.text}'의 경로가 중복되었습니다.\n${moduleFilePaths.join("\n")}`);
110
- }
111
-
112
- const moduleFilePath = moduleFilePaths[0];
113
-
114
- return { name: identifier.text, moduleFilePath };
115
- }
116
- }
117
-
118
- private _hasParentsOrMe(node: ts.Node, fn: (node1: ts.Node) => boolean): boolean {
119
- let currNode = node as ts.Node | undefined;
120
- while (true) {
121
- if (!currNode) return false;
122
-
123
- const result = fn(currNode);
124
- if (result) return true;
125
-
126
- currNode = currNode.parent as ts.Node | undefined;
127
- }
128
- }
129
-
130
- private getPackageName(): string {
131
- let cursorDirPath = path.dirname(this._sourceFile.fileName);
132
- while (true) {
133
- if (FsUtil.exists(path.resolve(cursorDirPath, "package.json"))) {
134
- break;
135
- }
136
- cursorDirPath = path.dirname(cursorDirPath);
137
- }
138
- const npmConfigFilePath = path.resolve(cursorDirPath, "package.json");
139
- const npmConfig: INpmConfig = FsUtil.readJson(npmConfigFilePath);
140
- return npmConfig.name;
141
- }
142
- }
143
-
144
-
145
- export interface IIvyModuleDefMetadata {
146
- moduleName: string;
147
- metadata: TIvyNgMetadata[];
148
- }
149
-
150
- export type TIvyNgMetadata =
151
- IIvyNgModuleMetadata
152
- | IIvyDirectiveMetadata
153
- | IIvyPipeMetadata
154
- | IIvyComponentMetadata;
155
-
156
- export interface IIvyNgModuleMetadata {
157
- type: "NgModule";
158
- className: string;
159
- exports: IIvyModuleImport[];
160
- }
161
-
162
- export interface IIvyDirectiveMetadata {
163
- type: "Directive";
164
- className: string;
165
- selector?: string;
166
- }
167
-
168
- export interface IIvyPipeMetadata {
169
- type: "Pipe";
170
- className: string;
171
- name?: string;
172
- }
173
-
174
- export interface IIvyComponentMetadata {
175
- type: "Component";
176
- className: string;
177
- selector?: string;
178
- }
179
-
180
- export interface IIvyModuleImport {
181
- moduleFilePath: string;
182
- name: string;
183
- }
@@ -1,7 +0,0 @@
1
- import { SdError } from "@simplysm/sd-core-common";
2
-
3
- export class SdMetadataError extends SdError {
4
- public constructor(public fileName: string, public message: string) {
5
- super(message);
6
- }
7
- }