@simplysm/sd-cli 6.4.4 → 7.0.8
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.
- package/.eslintrc.cjs +11 -0
- package/dist/bin/sd-cli.d.ts +1 -0
- package/dist/bin/sd-cli.mjs +60 -0
- package/dist/build-tool/SdCliCacheCompilerHost.d.ts +10 -0
- package/dist/build-tool/SdCliCacheCompilerHost.mjs +44 -0
- package/dist/build-tool/SdCliNgCacheCompilerHost.d.ts +11 -0
- package/dist/build-tool/SdCliNgCacheCompilerHost.mjs +36 -0
- package/dist/build-tool/SdCliPackageLinter.d.ts +8 -0
- package/dist/build-tool/SdCliPackageLinter.mjs +41 -0
- package/dist/builder/SdCliJsLibBuilder.d.ts +14 -0
- package/dist/builder/SdCliJsLibBuilder.mjs +50 -0
- package/dist/builder/SdCliTsLibBuilder.d.ts +27 -0
- package/dist/builder/SdCliTsLibBuilder.mjs +226 -0
- package/dist/commons.d.ts +43 -0
- package/dist/commons.mjs +2 -0
- package/dist/entry-points/SdCliWorkspace.d.ts +17 -0
- package/dist/entry-points/SdCliWorkspace.mjs +192 -0
- package/dist/packages/SdCliPackage.d.ts +19 -0
- package/dist/packages/SdCliPackage.mjs +89 -0
- package/dist/utils/SdBuildResultUtil.d.ts +6 -0
- package/dist/utils/SdBuildResultUtil.mjs +38 -0
- package/lib/ts-node-esm-paths.mjs +15 -0
- package/package.json +27 -58
- package/src/bin/sd-cli.ts +54 -220
- package/src/build-tool/SdCliCacheCompilerHost.ts +71 -0
- package/src/build-tool/SdCliNgCacheCompilerHost.ts +50 -0
- package/src/build-tool/SdCliPackageLinter.ts +54 -0
- package/src/builder/SdCliJsLibBuilder.ts +66 -0
- package/src/builder/SdCliTsLibBuilder.ts +335 -0
- package/src/commons.ts +15 -124
- package/src/entry-points/SdCliWorkspace.ts +228 -0
- package/src/packages/SdCliPackage.ts +111 -0
- package/src/utils/SdBuildResultUtil.ts +43 -0
- package/tsconfig-build.json +9 -0
- package/tsconfig.json +7 -18
- package/.eslintrc.js +0 -19
- package/dist-node/bin/sd-cli.js +0 -197
- package/dist-node/bin/sd-cli.js.map +0 -1
- package/dist-node/build-tools/SdCliCordova.js +0 -144
- package/dist-node/build-tools/SdCliCordova.js.map +0 -1
- package/dist-node/build-tools/SdCliIndexFileGenerator.js +0 -51
- package/dist-node/build-tools/SdCliIndexFileGenerator.js.map +0 -1
- package/dist-node/build-tools/SdCliNgModuleFilesGenerator.js +0 -675
- package/dist-node/build-tools/SdCliNgModuleFilesGenerator.js.map +0 -1
- package/dist-node/build-tools/metadata/SdAotMetadataReader.js +0 -274
- package/dist-node/build-tools/metadata/SdAotMetadataReader.js.map +0 -1
- package/dist-node/build-tools/metadata/SdIvyMetadataReader.js +0 -124
- package/dist-node/build-tools/metadata/SdIvyMetadataReader.js.map +0 -1
- package/dist-node/build-tools/metadata/SdMetadataError.js +0 -13
- package/dist-node/build-tools/metadata/SdMetadataError.js.map +0 -1
- package/dist-node/build-tools/metadata/SdMyMetadataReader.js +0 -321
- package/dist-node/build-tools/metadata/SdMyMetadataReader.js.map +0 -1
- package/dist-node/builders/SdCliJavascriptLinter.js +0 -65
- package/dist-node/builders/SdCliJavascriptLinter.js.map +0 -1
- package/dist-node/builders/SdCliNgClientBuilder.js +0 -637
- package/dist-node/builders/SdCliNgClientBuilder.js.map +0 -1
- package/dist-node/builders/SdCliNgLibraryBuilder.js +0 -217
- package/dist-node/builders/SdCliNgLibraryBuilder.js.map +0 -1
- package/dist-node/builders/SdCliPublisher.js +0 -129
- package/dist-node/builders/SdCliPublisher.js.map +0 -1
- package/dist-node/builders/SdCliServerBuilder.js +0 -452
- package/dist-node/builders/SdCliServerBuilder.js.map +0 -1
- package/dist-node/builders/SdCliTypescriptBuilder.js +0 -347
- package/dist-node/builders/SdCliTypescriptBuilder.js.map +0 -1
- package/dist-node/commons.js +0 -3
- package/dist-node/commons.js.map +0 -1
- package/dist-node/entry-points/SdCliLocalUpdater.js +0 -88
- package/dist-node/entry-points/SdCliLocalUpdater.js.map +0 -1
- package/dist-node/entry-points/SdCliPrepare.js +0 -56
- package/dist-node/entry-points/SdCliPrepare.js.map +0 -1
- package/dist-node/entry-points/SdCliProject.js +0 -302
- package/dist-node/entry-points/SdCliProject.js.map +0 -1
- package/dist-node/packages/SdCliClientPackage.js +0 -91
- package/dist-node/packages/SdCliClientPackage.js.map +0 -1
- package/dist-node/packages/SdCliLibraryPackage.js +0 -99
- package/dist-node/packages/SdCliLibraryPackage.js.map +0 -1
- package/dist-node/packages/SdCliPackageBase.js +0 -33
- package/dist-node/packages/SdCliPackageBase.js.map +0 -1
- package/dist-node/packages/SdCliServerPackage.js +0 -69
- package/dist-node/packages/SdCliServerPackage.js.map +0 -1
- package/dist-node/packages/SdCliUnknownPackage.js +0 -15
- package/dist-node/packages/SdCliUnknownPackage.js.map +0 -1
- package/dist-node/utils/SdCliFileCrypto.js +0 -76
- package/dist-node/utils/SdCliFileCrypto.js.map +0 -1
- package/dist-node/utils/SdProjectConfigUtil.js +0 -62
- package/dist-node/utils/SdProjectConfigUtil.js.map +0 -1
- package/dist-node/utils/SdTsDiagnosticUtil.js +0 -45
- package/dist-node/utils/SdTsDiagnosticUtil.js.map +0 -1
- package/dist-node/utils/SdWebpackUtil.js +0 -63
- package/dist-node/utils/SdWebpackUtil.js.map +0 -1
- package/dist-node/workers/client-ng-gen-worker.js +0 -57
- package/dist-node/workers/client-ng-gen-worker.js.map +0 -1
- package/dist-node/workers/lib-build-worker.js +0 -88
- package/dist-node/workers/lib-build-worker.js.map +0 -1
- package/dist-types/bin/sd-cli.d.ts +0 -3
- package/dist-types/bin/sd-cli.d.ts.map +0 -1
- package/dist-types/build-tools/SdCliCordova.d.ts +0 -15
- package/dist-types/build-tools/SdCliCordova.d.ts.map +0 -1
- package/dist-types/build-tools/SdCliIndexFileGenerator.d.ts +0 -13
- package/dist-types/build-tools/SdCliIndexFileGenerator.d.ts.map +0 -1
- package/dist-types/build-tools/SdCliNgModuleFilesGenerator.d.ts +0 -43
- package/dist-types/build-tools/SdCliNgModuleFilesGenerator.d.ts.map +0 -1
- package/dist-types/build-tools/metadata/SdAotMetadataReader.d.ts +0 -58
- package/dist-types/build-tools/metadata/SdAotMetadataReader.d.ts.map +0 -1
- package/dist-types/build-tools/metadata/SdIvyMetadataReader.d.ts +0 -43
- package/dist-types/build-tools/metadata/SdIvyMetadataReader.d.ts.map +0 -1
- package/dist-types/build-tools/metadata/SdMetadataError.d.ts +0 -7
- package/dist-types/build-tools/metadata/SdMetadataError.d.ts.map +0 -1
- package/dist-types/build-tools/metadata/SdMyMetadataReader.d.ts +0 -59
- package/dist-types/build-tools/metadata/SdMyMetadataReader.d.ts.map +0 -1
- package/dist-types/builders/SdCliJavascriptLinter.d.ts +0 -14
- package/dist-types/builders/SdCliJavascriptLinter.d.ts.map +0 -1
- package/dist-types/builders/SdCliNgClientBuilder.d.ts +0 -29
- package/dist-types/builders/SdCliNgClientBuilder.d.ts.map +0 -1
- package/dist-types/builders/SdCliNgLibraryBuilder.d.ts +0 -30
- package/dist-types/builders/SdCliNgLibraryBuilder.d.ts.map +0 -1
- package/dist-types/builders/SdCliPublisher.d.ts +0 -9
- package/dist-types/builders/SdCliPublisher.d.ts.map +0 -1
- package/dist-types/builders/SdCliServerBuilder.d.ts +0 -31
- package/dist-types/builders/SdCliServerBuilder.d.ts.map +0 -1
- package/dist-types/builders/SdCliTypescriptBuilder.d.ts +0 -56
- package/dist-types/builders/SdCliTypescriptBuilder.d.ts.map +0 -1
- package/dist-types/commons.d.ts +0 -134
- package/dist-types/commons.d.ts.map +0 -1
- package/dist-types/entry-points/SdCliLocalUpdater.d.ts +0 -12
- package/dist-types/entry-points/SdCliLocalUpdater.d.ts.map +0 -1
- package/dist-types/entry-points/SdCliPrepare.d.ts +0 -6
- package/dist-types/entry-points/SdCliPrepare.d.ts.map +0 -1
- package/dist-types/entry-points/SdCliProject.d.ts +0 -32
- package/dist-types/entry-points/SdCliProject.d.ts.map +0 -1
- package/dist-types/packages/SdCliClientPackage.d.ts +0 -17
- package/dist-types/packages/SdCliClientPackage.d.ts.map +0 -1
- package/dist-types/packages/SdCliLibraryPackage.d.ts +0 -20
- package/dist-types/packages/SdCliLibraryPackage.d.ts.map +0 -1
- package/dist-types/packages/SdCliPackageBase.d.ts +0 -11
- package/dist-types/packages/SdCliPackageBase.d.ts.map +0 -1
- package/dist-types/packages/SdCliServerPackage.d.ts +0 -16
- package/dist-types/packages/SdCliServerPackage.d.ts.map +0 -1
- package/dist-types/packages/SdCliUnknownPackage.d.ts +0 -9
- package/dist-types/packages/SdCliUnknownPackage.d.ts.map +0 -1
- package/dist-types/utils/SdCliFileCrypto.d.ts +0 -8
- package/dist-types/utils/SdCliFileCrypto.d.ts.map +0 -1
- package/dist-types/utils/SdProjectConfigUtil.d.ts +0 -7
- package/dist-types/utils/SdProjectConfigUtil.d.ts.map +0 -1
- package/dist-types/utils/SdTsDiagnosticUtil.d.ts +0 -6
- package/dist-types/utils/SdTsDiagnosticUtil.d.ts.map +0 -1
- package/dist-types/utils/SdWebpackUtil.d.ts +0 -7
- package/dist-types/utils/SdWebpackUtil.d.ts.map +0 -1
- package/dist-types/workers/client-ng-gen-worker.d.ts +0 -2
- package/dist-types/workers/client-ng-gen-worker.d.ts.map +0 -1
- package/dist-types/workers/lib-build-worker.d.ts +0 -2
- package/dist-types/workers/lib-build-worker.d.ts.map +0 -1
- package/schema/schema.json +0 -447
- package/sd-tsconfig.node.json +0 -18
- package/src/build-tools/SdCliCordova.ts +0 -240
- package/src/build-tools/SdCliIndexFileGenerator.ts +0 -61
- package/src/build-tools/SdCliNgModuleFilesGenerator.ts +0 -894
- package/src/build-tools/metadata/SdAotMetadataReader.ts +0 -374
- package/src/build-tools/metadata/SdIvyMetadataReader.ts +0 -183
- package/src/build-tools/metadata/SdMetadataError.ts +0 -7
- package/src/build-tools/metadata/SdMyMetadataReader.ts +0 -407
- package/src/builders/SdCliJavascriptLinter.ts +0 -81
- package/src/builders/SdCliNgClientBuilder.ts +0 -794
- package/src/builders/SdCliNgLibraryBuilder.ts +0 -301
- package/src/builders/SdCliPublisher.ts +0 -144
- package/src/builders/SdCliServerBuilder.ts +0 -555
- package/src/builders/SdCliTypescriptBuilder.ts +0 -552
- package/src/entry-points/SdCliLocalUpdater.ts +0 -114
- package/src/entry-points/SdCliPrepare.ts +0 -104
- package/src/entry-points/SdCliProject.ts +0 -405
- package/src/packages/SdCliClientPackage.ts +0 -111
- package/src/packages/SdCliLibraryPackage.ts +0 -118
- package/src/packages/SdCliPackageBase.ts +0 -34
- package/src/packages/SdCliServerPackage.ts +0 -85
- package/src/packages/SdCliUnknownPackage.ts +0 -14
- package/src/utils/SdCliFileCrypto.ts +0 -87
- package/src/utils/SdCliUtils.ts +0 -56
- package/src/utils/SdProjectConfigUtil.ts +0 -145
- package/src/utils/SdTsDiagnosticUtil.ts +0 -46
- package/src/utils/SdWebpackUtil.ts +0 -71
- package/src/workers/client-ng-gen-worker.ts +0 -63
- 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
|
-
}
|