@simplysm/sd-cli 6.4.6 → 7.0.12

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 (185) 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 +86 -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 +46 -0
  15. package/dist/commons.mjs +2 -0
  16. package/dist/entry-points/SdCliWorkspace.d.ts +18 -0
  17. package/dist/entry-points/SdCliWorkspace.mjs +193 -0
  18. package/dist/packages/SdCliPackage.d.ts +19 -0
  19. package/dist/packages/SdCliPackage.mjs +89 -0
  20. package/dist/utils/SdCliBuildResultUtil.d.ts +6 -0
  21. package/dist/utils/SdCliBuildResultUtil.mjs +38 -0
  22. package/dist/utils/SdCliConfigUtil.d.ts +7 -0
  23. package/dist/utils/SdCliConfigUtil.mjs +69 -0
  24. package/lib/ts-node-esm-paths.mjs +15 -0
  25. package/package.json +27 -59
  26. package/src/bin/sd-cli.ts +86 -214
  27. package/src/build-tool/SdCliCacheCompilerHost.ts +71 -0
  28. package/src/build-tool/SdCliNgCacheCompilerHost.ts +50 -0
  29. package/src/build-tool/SdCliPackageLinter.ts +54 -0
  30. package/src/builder/SdCliJsLibBuilder.ts +66 -0
  31. package/src/builder/SdCliTsLibBuilder.ts +335 -0
  32. package/src/commons.ts +17 -122
  33. package/src/entry-points/SdCliWorkspace.ts +229 -0
  34. package/src/packages/SdCliPackage.ts +111 -0
  35. package/src/utils/SdCliBuildResultUtil.ts +43 -0
  36. package/src/utils/SdCliConfigUtil.ts +94 -0
  37. package/tsconfig-build.json +9 -0
  38. package/tsconfig.json +7 -18
  39. package/.eslintrc.js +0 -19
  40. package/dist-node/bin/sd-cli.js +0 -197
  41. package/dist-node/bin/sd-cli.js.map +0 -1
  42. package/dist-node/build-tools/SdCliCordova.js +0 -145
  43. package/dist-node/build-tools/SdCliCordova.js.map +0 -1
  44. package/dist-node/build-tools/SdCliIndexFileGenerator.js +0 -51
  45. package/dist-node/build-tools/SdCliIndexFileGenerator.js.map +0 -1
  46. package/dist-node/build-tools/SdCliNgModuleFilesGenerator.js +0 -675
  47. package/dist-node/build-tools/SdCliNgModuleFilesGenerator.js.map +0 -1
  48. package/dist-node/build-tools/metadata/SdAotMetadataReader.js +0 -274
  49. package/dist-node/build-tools/metadata/SdAotMetadataReader.js.map +0 -1
  50. package/dist-node/build-tools/metadata/SdIvyMetadataReader.js +0 -124
  51. package/dist-node/build-tools/metadata/SdIvyMetadataReader.js.map +0 -1
  52. package/dist-node/build-tools/metadata/SdMetadataError.js +0 -13
  53. package/dist-node/build-tools/metadata/SdMetadataError.js.map +0 -1
  54. package/dist-node/build-tools/metadata/SdMyMetadataReader.js +0 -321
  55. package/dist-node/build-tools/metadata/SdMyMetadataReader.js.map +0 -1
  56. package/dist-node/builders/SdCliJavascriptLinter.js +0 -65
  57. package/dist-node/builders/SdCliJavascriptLinter.js.map +0 -1
  58. package/dist-node/builders/SdCliNgClientBuilder.js +0 -636
  59. package/dist-node/builders/SdCliNgClientBuilder.js.map +0 -1
  60. package/dist-node/builders/SdCliNgLibraryBuilder.js +0 -217
  61. package/dist-node/builders/SdCliNgLibraryBuilder.js.map +0 -1
  62. package/dist-node/builders/SdCliPublisher.js +0 -129
  63. package/dist-node/builders/SdCliPublisher.js.map +0 -1
  64. package/dist-node/builders/SdCliServerBuilder.js +0 -452
  65. package/dist-node/builders/SdCliServerBuilder.js.map +0 -1
  66. package/dist-node/builders/SdCliTypescriptBuilder.js +0 -347
  67. package/dist-node/builders/SdCliTypescriptBuilder.js.map +0 -1
  68. package/dist-node/commons.js +0 -3
  69. package/dist-node/commons.js.map +0 -1
  70. package/dist-node/entry-points/SdCliLocalUpdater.js +0 -88
  71. package/dist-node/entry-points/SdCliLocalUpdater.js.map +0 -1
  72. package/dist-node/entry-points/SdCliPrepare.js +0 -56
  73. package/dist-node/entry-points/SdCliPrepare.js.map +0 -1
  74. package/dist-node/entry-points/SdCliProject.js +0 -302
  75. package/dist-node/entry-points/SdCliProject.js.map +0 -1
  76. package/dist-node/packages/SdCliClientPackage.js +0 -91
  77. package/dist-node/packages/SdCliClientPackage.js.map +0 -1
  78. package/dist-node/packages/SdCliLibraryPackage.js +0 -99
  79. package/dist-node/packages/SdCliLibraryPackage.js.map +0 -1
  80. package/dist-node/packages/SdCliPackageBase.js +0 -33
  81. package/dist-node/packages/SdCliPackageBase.js.map +0 -1
  82. package/dist-node/packages/SdCliServerPackage.js +0 -69
  83. package/dist-node/packages/SdCliServerPackage.js.map +0 -1
  84. package/dist-node/packages/SdCliUnknownPackage.js +0 -15
  85. package/dist-node/packages/SdCliUnknownPackage.js.map +0 -1
  86. package/dist-node/utils/SdCliFileCrypto.js +0 -76
  87. package/dist-node/utils/SdCliFileCrypto.js.map +0 -1
  88. package/dist-node/utils/SdProjectConfigUtil.js +0 -62
  89. package/dist-node/utils/SdProjectConfigUtil.js.map +0 -1
  90. package/dist-node/utils/SdTsDiagnosticUtil.js +0 -45
  91. package/dist-node/utils/SdTsDiagnosticUtil.js.map +0 -1
  92. package/dist-node/utils/SdWebpackUtil.js +0 -63
  93. package/dist-node/utils/SdWebpackUtil.js.map +0 -1
  94. package/dist-node/workers/client-ng-gen-worker.js +0 -57
  95. package/dist-node/workers/client-ng-gen-worker.js.map +0 -1
  96. package/dist-node/workers/lib-build-worker.js +0 -88
  97. package/dist-node/workers/lib-build-worker.js.map +0 -1
  98. package/dist-types/bin/sd-cli.d.ts +0 -3
  99. package/dist-types/bin/sd-cli.d.ts.map +0 -1
  100. package/dist-types/build-tools/SdCliCordova.d.ts +0 -15
  101. package/dist-types/build-tools/SdCliCordova.d.ts.map +0 -1
  102. package/dist-types/build-tools/SdCliIndexFileGenerator.d.ts +0 -13
  103. package/dist-types/build-tools/SdCliIndexFileGenerator.d.ts.map +0 -1
  104. package/dist-types/build-tools/SdCliNgModuleFilesGenerator.d.ts +0 -43
  105. package/dist-types/build-tools/SdCliNgModuleFilesGenerator.d.ts.map +0 -1
  106. package/dist-types/build-tools/metadata/SdAotMetadataReader.d.ts +0 -58
  107. package/dist-types/build-tools/metadata/SdAotMetadataReader.d.ts.map +0 -1
  108. package/dist-types/build-tools/metadata/SdIvyMetadataReader.d.ts +0 -43
  109. package/dist-types/build-tools/metadata/SdIvyMetadataReader.d.ts.map +0 -1
  110. package/dist-types/build-tools/metadata/SdMetadataError.d.ts +0 -7
  111. package/dist-types/build-tools/metadata/SdMetadataError.d.ts.map +0 -1
  112. package/dist-types/build-tools/metadata/SdMyMetadataReader.d.ts +0 -59
  113. package/dist-types/build-tools/metadata/SdMyMetadataReader.d.ts.map +0 -1
  114. package/dist-types/builders/SdCliJavascriptLinter.d.ts +0 -14
  115. package/dist-types/builders/SdCliJavascriptLinter.d.ts.map +0 -1
  116. package/dist-types/builders/SdCliNgClientBuilder.d.ts +0 -29
  117. package/dist-types/builders/SdCliNgClientBuilder.d.ts.map +0 -1
  118. package/dist-types/builders/SdCliNgLibraryBuilder.d.ts +0 -30
  119. package/dist-types/builders/SdCliNgLibraryBuilder.d.ts.map +0 -1
  120. package/dist-types/builders/SdCliPublisher.d.ts +0 -9
  121. package/dist-types/builders/SdCliPublisher.d.ts.map +0 -1
  122. package/dist-types/builders/SdCliServerBuilder.d.ts +0 -31
  123. package/dist-types/builders/SdCliServerBuilder.d.ts.map +0 -1
  124. package/dist-types/builders/SdCliTypescriptBuilder.d.ts +0 -56
  125. package/dist-types/builders/SdCliTypescriptBuilder.d.ts.map +0 -1
  126. package/dist-types/commons.d.ts +0 -134
  127. package/dist-types/commons.d.ts.map +0 -1
  128. package/dist-types/entry-points/SdCliLocalUpdater.d.ts +0 -12
  129. package/dist-types/entry-points/SdCliLocalUpdater.d.ts.map +0 -1
  130. package/dist-types/entry-points/SdCliPrepare.d.ts +0 -6
  131. package/dist-types/entry-points/SdCliPrepare.d.ts.map +0 -1
  132. package/dist-types/entry-points/SdCliProject.d.ts +0 -32
  133. package/dist-types/entry-points/SdCliProject.d.ts.map +0 -1
  134. package/dist-types/packages/SdCliClientPackage.d.ts +0 -17
  135. package/dist-types/packages/SdCliClientPackage.d.ts.map +0 -1
  136. package/dist-types/packages/SdCliLibraryPackage.d.ts +0 -20
  137. package/dist-types/packages/SdCliLibraryPackage.d.ts.map +0 -1
  138. package/dist-types/packages/SdCliPackageBase.d.ts +0 -11
  139. package/dist-types/packages/SdCliPackageBase.d.ts.map +0 -1
  140. package/dist-types/packages/SdCliServerPackage.d.ts +0 -16
  141. package/dist-types/packages/SdCliServerPackage.d.ts.map +0 -1
  142. package/dist-types/packages/SdCliUnknownPackage.d.ts +0 -9
  143. package/dist-types/packages/SdCliUnknownPackage.d.ts.map +0 -1
  144. package/dist-types/utils/SdCliFileCrypto.d.ts +0 -8
  145. package/dist-types/utils/SdCliFileCrypto.d.ts.map +0 -1
  146. package/dist-types/utils/SdProjectConfigUtil.d.ts +0 -7
  147. package/dist-types/utils/SdProjectConfigUtil.d.ts.map +0 -1
  148. package/dist-types/utils/SdTsDiagnosticUtil.d.ts +0 -6
  149. package/dist-types/utils/SdTsDiagnosticUtil.d.ts.map +0 -1
  150. package/dist-types/utils/SdWebpackUtil.d.ts +0 -7
  151. package/dist-types/utils/SdWebpackUtil.d.ts.map +0 -1
  152. package/dist-types/workers/client-ng-gen-worker.d.ts +0 -2
  153. package/dist-types/workers/client-ng-gen-worker.d.ts.map +0 -1
  154. package/dist-types/workers/lib-build-worker.d.ts +0 -2
  155. package/dist-types/workers/lib-build-worker.d.ts.map +0 -1
  156. package/schema/schema.json +0 -447
  157. package/sd-tsconfig.node.json +0 -18
  158. package/src/build-tools/SdCliCordova.ts +0 -242
  159. package/src/build-tools/SdCliIndexFileGenerator.ts +0 -61
  160. package/src/build-tools/SdCliNgModuleFilesGenerator.ts +0 -894
  161. package/src/build-tools/metadata/SdAotMetadataReader.ts +0 -374
  162. package/src/build-tools/metadata/SdIvyMetadataReader.ts +0 -183
  163. package/src/build-tools/metadata/SdMetadataError.ts +0 -7
  164. package/src/build-tools/metadata/SdMyMetadataReader.ts +0 -407
  165. package/src/builders/SdCliJavascriptLinter.ts +0 -81
  166. package/src/builders/SdCliNgClientBuilder.ts +0 -793
  167. package/src/builders/SdCliNgLibraryBuilder.ts +0 -301
  168. package/src/builders/SdCliPublisher.ts +0 -144
  169. package/src/builders/SdCliServerBuilder.ts +0 -555
  170. package/src/builders/SdCliTypescriptBuilder.ts +0 -552
  171. package/src/entry-points/SdCliLocalUpdater.ts +0 -114
  172. package/src/entry-points/SdCliPrepare.ts +0 -104
  173. package/src/entry-points/SdCliProject.ts +0 -405
  174. package/src/packages/SdCliClientPackage.ts +0 -111
  175. package/src/packages/SdCliLibraryPackage.ts +0 -118
  176. package/src/packages/SdCliPackageBase.ts +0 -34
  177. package/src/packages/SdCliServerPackage.ts +0 -85
  178. package/src/packages/SdCliUnknownPackage.ts +0 -14
  179. package/src/utils/SdCliFileCrypto.ts +0 -87
  180. package/src/utils/SdCliUtils.ts +0 -56
  181. package/src/utils/SdProjectConfigUtil.ts +0 -145
  182. package/src/utils/SdTsDiagnosticUtil.ts +0 -46
  183. package/src/utils/SdWebpackUtil.ts +0 -71
  184. package/src/workers/client-ng-gen-worker.ts +0 -63
  185. 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
- }