@simplysm/sd-cli 6.0.19 → 6.0.27

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