@simplysm/sd-cli 7.0.65 → 7.0.75
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/dist/SdCliBuildResultError.d.ts +5 -0
- package/dist/bin/sd-cli.d.ts +2 -0
- package/dist/bin/sd-cli.mjs +27 -6
- package/dist/build-tool/SdCliCacheCompilerHost.d.ts +10 -0
- package/dist/build-tool/SdCliCordova.d.ts +16 -0
- package/dist/build-tool/SdCliCordova.mjs +176 -0
- package/dist/build-tool/SdCliIndexFileGenerator.d.ts +13 -0
- package/dist/{entry-points → build-tool}/SdCliIndexFileGenerator.mjs +4 -3
- package/dist/build-tool/SdCliNgCacheCompilerHost.d.ts +11 -0
- package/dist/build-tool/SdCliPackageLinter.d.ts +8 -0
- package/dist/build-tool/SdCliPackageLinter.mjs +19 -2
- package/dist/builder/SdCliClientBuilder.d.ts +23 -0
- package/dist/builder/SdCliClientBuilder.mjs +69 -6
- package/dist/builder/SdCliJsLibBuilder.d.ts +14 -0
- package/dist/builder/SdCliServerBuilder.d.ts +25 -0
- package/dist/builder/SdCliServerBuilder.mjs +19 -10
- package/dist/builder/SdCliTsLibBuilder.d.ts +34 -0
- package/dist/builder/SdCliTsLibBuilder.mjs +84 -37
- package/dist/commons.d.ts +101 -0
- package/dist/entry-points/SdCliLocalUpdate.d.ts +13 -0
- package/dist/entry-points/SdCliNpm.d.ts +6 -0
- package/dist/entry-points/SdCliPrepare.d.ts +5 -0
- package/dist/entry-points/SdCliPrepare.mjs +2 -2
- package/dist/entry-points/SdCliWorkspace.d.ts +31 -0
- package/dist/entry-points/SdCliWorkspace.mjs +67 -51
- package/dist/index.d.ts +29 -0
- package/dist/index.mjs +5 -3
- package/dist/ng-tools/SdCliNgModuleGenerator.d.ts +28 -0
- package/dist/ng-tools/SdCliNgModuleGenerator.mjs +486 -0
- package/dist/ng-tools/babel/SdCliBbFileMetadata.d.ts +23 -0
- package/dist/ng-tools/babel/SdCliBbFileMetadata.mjs +187 -36
- package/dist/ng-tools/babel/SdCliBbRootMetadata.d.ts +22 -0
- package/dist/ng-tools/babel/SdCliBbRootMetadata.mjs +10 -7
- package/dist/ng-tools/babel/SdCliBbUtil.d.ts +5 -0
- package/dist/ng-tools/babel/SdCliBbUtil.mjs +2 -2
- package/dist/ng-tools/babel/TSdCliBbNgMetadata.d.ts +42 -0
- package/dist/ng-tools/babel/TSdCliBbNgMetadata.mjs +107 -76
- package/dist/ng-tools/babel/TSdCliBbTypeMetadata.d.ts +44 -0
- package/dist/ng-tools/commons.d.ts +9 -0
- package/dist/ng-tools/typescript/SdCliTsFileMetadata.d.ts +61 -0
- package/dist/ng-tools/typescript/SdCliTsFileMetadata.mjs +12 -12
- package/dist/ng-tools/typescript/SdCliTsRootMetadata.d.ts +8 -0
- package/dist/ng-tools/typescript/SdCliTsUtil.d.ts +5 -0
- package/dist/ng-tools/typescript/SdCliTsUtil.mjs +28 -0
- package/dist/packages/SdCliPackage.d.ts +23 -0
- package/dist/packages/SdCliPackage.mjs +53 -7
- package/dist/utils/SdCliBuildResultUtil.d.ts +9 -0
- package/dist/utils/SdCliConfigUtil.d.ts +7 -0
- package/dist/utils/SdCliNpmConfigUtil.d.ts +7 -0
- package/package.json +11 -8
- package/src/bin/sd-cli.ts +26 -5
- package/src/build-tool/SdCliCordova.ts +224 -0
- package/src/{entry-points → build-tool}/SdCliIndexFileGenerator.ts +3 -2
- package/src/build-tool/SdCliPackageLinter.ts +18 -2
- package/src/builder/SdCliClientBuilder.ts +84 -5
- package/src/builder/SdCliServerBuilder.ts +20 -9
- package/src/builder/SdCliTsLibBuilder.ts +101 -45
- package/src/commons.ts +43 -0
- package/src/entry-points/SdCliPrepare.ts +1 -1
- package/src/entry-points/SdCliWorkspace.ts +71 -56
- package/src/index.ts +4 -2
- package/src/ng-tools/SdCliNgModuleGenerator.ts +643 -0
- package/src/ng-tools/babel/SdCliBbFileMetadata.ts +234 -38
- package/src/ng-tools/babel/SdCliBbRootMetadata.ts +10 -6
- package/src/ng-tools/babel/SdCliBbUtil.ts +1 -1
- package/src/ng-tools/babel/TSdCliBbNgMetadata.ts +36 -22
- package/src/ng-tools/commons.ts +1 -1
- package/src/ng-tools/typescript/SdCliTsFileMetadata.ts +12 -12
- package/src/ng-tools/typescript/SdCliTsUtil.ts +29 -0
- package/src/packages/SdCliPackage.ts +56 -6
- package/tsconfig-build.json +1 -1
- package/tsconfig.json +3 -0
- package/dist/ng-tools/NgModuleGenerator.mjs +0 -278
- package/src/ng-tools/NgModuleGenerator.ts +0 -361
|
@@ -5,11 +5,11 @@ import { TSdCliMetaRef } from "../commons";
|
|
|
5
5
|
import path from "path";
|
|
6
6
|
|
|
7
7
|
export class SdCliTsFileMetadata {
|
|
8
|
-
|
|
8
|
+
public readonly sourceFile: ts.SourceFile;
|
|
9
9
|
|
|
10
10
|
public constructor(public readonly filePath: string) {
|
|
11
11
|
const fileContent = FsUtil.readFile(filePath);
|
|
12
|
-
this.
|
|
12
|
+
this.sourceFile = ts.createSourceFile(filePath, fileContent, ts.ScriptTarget.ES2017);
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
private _directExportClassesCache?: { exportedName: string; target: SdCliTsClassMetadata }[];
|
|
@@ -18,7 +18,7 @@ export class SdCliTsFileMetadata {
|
|
|
18
18
|
if (this._directExportClassesCache) return this._directExportClassesCache;
|
|
19
19
|
|
|
20
20
|
const result: { exportedName: string; target: SdCliTsClassMetadata }[] = [];
|
|
21
|
-
this.
|
|
21
|
+
this.sourceFile.forEachChild((node) => {
|
|
22
22
|
if (!node.modifiers || !node.modifiers.some((item) => item.kind === ts.SyntaxKind.ExportKeyword)) return;
|
|
23
23
|
if (!ts.isClassDeclaration(node)) return;
|
|
24
24
|
if (node.name === undefined) {
|
|
@@ -34,7 +34,7 @@ export class SdCliTsFileMetadata {
|
|
|
34
34
|
public get imports(): TSdCliMetaRef[] {
|
|
35
35
|
const result: TSdCliMetaRef[] = [];
|
|
36
36
|
|
|
37
|
-
ts.forEachChild(this.
|
|
37
|
+
ts.forEachChild(this.sourceFile, (node) => {
|
|
38
38
|
if (ts.isImportDeclaration(node)) {
|
|
39
39
|
if (ts.isStringLiteral(node.moduleSpecifier)) {
|
|
40
40
|
if (node.importClause) {
|
|
@@ -47,19 +47,19 @@ export class SdCliTsFileMetadata {
|
|
|
47
47
|
result.push({
|
|
48
48
|
filePath: moduleFilePath,
|
|
49
49
|
name: el.name.text,
|
|
50
|
-
|
|
50
|
+
__TSdCliMetaRef__: "__TSdCliMetaRef__" as const
|
|
51
51
|
});
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
54
|
else {
|
|
55
|
-
throw
|
|
55
|
+
// throw SdCliTsUtil.error("'import * as [name] from ...'을 'import [name] from ...'로 변경하세요.", this.sourceFile, node);
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
58
|
else {
|
|
59
59
|
result.push({
|
|
60
60
|
filePath: moduleFilePath,
|
|
61
61
|
name: "default",
|
|
62
|
-
|
|
62
|
+
__TSdCliMetaRef__: "__TSdCliMetaRef__" as const
|
|
63
63
|
});
|
|
64
64
|
}
|
|
65
65
|
}
|
|
@@ -71,7 +71,7 @@ export class SdCliTsFileMetadata {
|
|
|
71
71
|
result.push({
|
|
72
72
|
moduleName,
|
|
73
73
|
name: el.propertyName?.text ?? el.name.text,
|
|
74
|
-
|
|
74
|
+
__TSdCliMetaRef__: "__TSdCliMetaRef__" as const
|
|
75
75
|
});
|
|
76
76
|
}
|
|
77
77
|
}
|
|
@@ -81,7 +81,7 @@ export class SdCliTsFileMetadata {
|
|
|
81
81
|
result.push({
|
|
82
82
|
moduleName,
|
|
83
83
|
name: nsUse,
|
|
84
|
-
|
|
84
|
+
__TSdCliMetaRef__: "__TSdCliMetaRef__" as const
|
|
85
85
|
});
|
|
86
86
|
}
|
|
87
87
|
}
|
|
@@ -92,7 +92,7 @@ export class SdCliTsFileMetadata {
|
|
|
92
92
|
result.push({
|
|
93
93
|
moduleName: moduleName,
|
|
94
94
|
name: nsUse,
|
|
95
|
-
|
|
95
|
+
__TSdCliMetaRef__: "__TSdCliMetaRef__" as const
|
|
96
96
|
});
|
|
97
97
|
}
|
|
98
98
|
}
|
|
@@ -126,7 +126,7 @@ export class SdCliTsFileMetadata {
|
|
|
126
126
|
result.push({
|
|
127
127
|
filePath: moduleFilePath,
|
|
128
128
|
name: el.name.text,
|
|
129
|
-
|
|
129
|
+
__TSdCliMetaRef__: "__TSdCliMetaRef__" as const
|
|
130
130
|
});
|
|
131
131
|
}
|
|
132
132
|
}
|
|
@@ -164,7 +164,7 @@ export class SdCliTsFileMetadata {
|
|
|
164
164
|
return result;
|
|
165
165
|
};
|
|
166
166
|
|
|
167
|
-
return fn(this.
|
|
167
|
+
return fn(this.sourceFile);
|
|
168
168
|
}
|
|
169
169
|
|
|
170
170
|
public getMetaFromNode(node: ts.Node): TSdCliTsMetadata {
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import { SdCliBuildResultError } from "../../SdCliBuildResultError";
|
|
3
|
+
import path from "path";
|
|
4
|
+
|
|
5
|
+
export class SdCliTsUtil {
|
|
6
|
+
public static error(message: string, sourceFile: ts.SourceFile, meta?: ts.Node): SdCliBuildResultError {
|
|
7
|
+
if (meta) {
|
|
8
|
+
const pos = sourceFile.getLineAndCharacterOfPosition(meta.getStart());
|
|
9
|
+
return new SdCliBuildResultError({
|
|
10
|
+
filePath: path.resolve(sourceFile.fileName),
|
|
11
|
+
line: pos.line,
|
|
12
|
+
char: pos.character,
|
|
13
|
+
code: undefined,
|
|
14
|
+
severity: "error",
|
|
15
|
+
message: message
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
return new SdCliBuildResultError({
|
|
20
|
+
filePath: path.resolve(sourceFile.fileName),
|
|
21
|
+
line: undefined,
|
|
22
|
+
char: undefined,
|
|
23
|
+
code: undefined,
|
|
24
|
+
severity: "error",
|
|
25
|
+
message: message
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import { INpmConfig, ISdCliPackageBuildResult, ITsconfig, TSdCliPackageConfig } from "../commons";
|
|
2
2
|
import path from "path";
|
|
3
|
-
import { FsUtil, SdProcess } from "@simplysm/sd-core-node";
|
|
3
|
+
import { FsUtil, PathUtil, SdProcess } from "@simplysm/sd-core-node";
|
|
4
4
|
import { EventEmitter } from "events";
|
|
5
|
-
import { ObjectUtil } from "@simplysm/sd-core-common";
|
|
5
|
+
import { NeverEntryError, ObjectUtil, StringUtil } from "@simplysm/sd-core-common";
|
|
6
6
|
import { SdCliTsLibBuilder } from "../builder/SdCliTsLibBuilder";
|
|
7
7
|
import { SdCliJsLibBuilder } from "../builder/SdCliJsLibBuilder";
|
|
8
8
|
import { SdCliServerBuilder } from "../builder/SdCliServerBuilder";
|
|
9
9
|
import { SdCliNpmConfigUtil } from "../utils/SdCliNpmConfigUtil";
|
|
10
10
|
import { SdCliClientBuilder } from "../builder/SdCliClientBuilder";
|
|
11
11
|
import { NextHandleFunction } from "connect";
|
|
12
|
+
import { SdStorage } from "@simplysm/sd-storage";
|
|
13
|
+
import ts from "typescript";
|
|
12
14
|
|
|
13
15
|
export class SdCliPackage extends EventEmitter {
|
|
14
16
|
private readonly _npmConfig: INpmConfig;
|
|
@@ -83,8 +85,57 @@ export class SdCliPackage extends EventEmitter {
|
|
|
83
85
|
}
|
|
84
86
|
|
|
85
87
|
public async publishAsync(): Promise<void> {
|
|
86
|
-
if (this.config.
|
|
87
|
-
|
|
88
|
+
if (this.config.publish !== undefined) {
|
|
89
|
+
if (this.config.type === "library") {
|
|
90
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
91
|
+
if (this.config.publish === "npm") {
|
|
92
|
+
await SdProcess.spawnAsync("npm publish --quiet --access public", { cwd: this.rootPath });
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
throw new NeverEntryError();
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
if (this.config.publish.type === "ftp" || this.config.publish.type === "ftps" || this.config.publish.type === "sftp") {
|
|
100
|
+
const tsconfigPath = path.resolve(this.rootPath, "tsconfig-build.json");
|
|
101
|
+
const tsconfig = FsUtil.readJson(tsconfigPath);
|
|
102
|
+
const parsedTsconfig = ts.parseJsonConfigFileContent(tsconfig, ts.sys, this.rootPath, tsconfig.angularCompilerOptions);
|
|
103
|
+
|
|
104
|
+
const ftp = await SdStorage.connectAsync(this.config.publish.type, {
|
|
105
|
+
host: this.config.publish.host,
|
|
106
|
+
port: this.config.publish.port,
|
|
107
|
+
user: this.config.publish.user,
|
|
108
|
+
pass: this.config.publish.pass
|
|
109
|
+
});
|
|
110
|
+
await ftp.uploadDirAsync(parsedTsconfig.options.outDir!, this.config.publish.path);
|
|
111
|
+
await ftp.closeAsync();
|
|
112
|
+
}
|
|
113
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
114
|
+
else if (this.config.publish.type === "local-directory") {
|
|
115
|
+
const tsconfigPath = path.resolve(this.rootPath, "tsconfig-build.json");
|
|
116
|
+
const tsconfig = FsUtil.readJson(tsconfigPath);
|
|
117
|
+
const parsedTsconfig = ts.parseJsonConfigFileContent(tsconfig, ts.sys, this.rootPath, tsconfig.angularCompilerOptions);
|
|
118
|
+
|
|
119
|
+
const targetRootPath = this.config.publish.path.replace(/%([^%]*)%/g, (item) => {
|
|
120
|
+
const envName = item.replace(/%/g, "");
|
|
121
|
+
if (!StringUtil.isNullOrEmpty(this._npmConfig.version) && envName === "SD_VERSION") {
|
|
122
|
+
return this._npmConfig.version;
|
|
123
|
+
}
|
|
124
|
+
return process.env[envName] ?? item;
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
const filePaths = await FsUtil.globAsync(path.resolve(this.rootPath, "**", "*"), {
|
|
128
|
+
dot: true,
|
|
129
|
+
nodir: true
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
await filePaths.parallelAsync(async (filePath) => {
|
|
133
|
+
const relativeFilePath = path.relative(parsedTsconfig.options.outDir!, filePath);
|
|
134
|
+
const targetPath = PathUtil.posix(targetRootPath, relativeFilePath);
|
|
135
|
+
await FsUtil.copyAsync(filePath, targetPath);
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
}
|
|
88
139
|
}
|
|
89
140
|
}
|
|
90
141
|
|
|
@@ -96,8 +147,7 @@ export class SdCliPackage extends EventEmitter {
|
|
|
96
147
|
}
|
|
97
148
|
|
|
98
149
|
if (this.config.type === "library") {
|
|
99
|
-
|
|
100
|
-
return isTs ? new SdCliTsLibBuilder(this.rootPath) : new SdCliJsLibBuilder(this.rootPath);
|
|
150
|
+
return isTs ? new SdCliTsLibBuilder(this.rootPath, this.config, this._workspaceRootPath) : new SdCliJsLibBuilder(this.rootPath);
|
|
101
151
|
}
|
|
102
152
|
else if (this.config.type === "server") {
|
|
103
153
|
return new SdCliServerBuilder(this.rootPath, this.config, this._workspaceRootPath);
|
package/tsconfig-build.json
CHANGED
package/tsconfig.json
CHANGED
|
@@ -1,278 +0,0 @@
|
|
|
1
|
-
import { SdCliTsRootMetadata } from "./typescript/SdCliTsRootMetadata";
|
|
2
|
-
import { SdCliBbRootMetadata } from "./babel/SdCliBbRootMetadata";
|
|
3
|
-
import { SdCliBbClassMetadata, SdCliBbObjectMetadata } from "./babel/TSdCliBbTypeMetadata";
|
|
4
|
-
import { SdCliBbNgComponentMetadata, SdCliBbNgDirectiveMetadata, SdCliBbNgModuleMetadata, SdCliBbNgPipeMetadata } from "./babel/TSdCliBbNgMetadata";
|
|
5
|
-
import { NeverEntryError } from "@simplysm/sd-core-common";
|
|
6
|
-
import { SdCliTsNgInjectableMetadata } from "./typescript/SdCliTsFileMetadata";
|
|
7
|
-
import path from "path";
|
|
8
|
-
import { JSDOM } from "jsdom";
|
|
9
|
-
import { FsUtil, PathUtil } from "@simplysm/sd-core-node";
|
|
10
|
-
import os from "os";
|
|
11
|
-
// TODO: 에러 메시지 처리
|
|
12
|
-
export class NgModuleGenerator {
|
|
13
|
-
constructor(packagePath, _srcDirRelPaths) {
|
|
14
|
-
this._srcDirRelPaths = _srcDirRelPaths;
|
|
15
|
-
this._srcPath = path.resolve(process.cwd(), "packages", "sd-angular", "src");
|
|
16
|
-
this._modulesPath = path.resolve(process.cwd(), "packages", "sd-angular", "src", "_modules");
|
|
17
|
-
this._fileWriterCache = new Map();
|
|
18
|
-
this._bbMeta = new SdCliBbRootMetadata(packagePath);
|
|
19
|
-
this._tsMeta = new SdCliTsRootMetadata(packagePath);
|
|
20
|
-
}
|
|
21
|
-
async clearModulesAsync() {
|
|
22
|
-
await FsUtil.removeAsync(this._modulesPath);
|
|
23
|
-
}
|
|
24
|
-
removeCaches(changedFilePaths) {
|
|
25
|
-
this._bbMeta.removeCaches(changedFilePaths);
|
|
26
|
-
this._tsMeta.removeCaches(changedFilePaths);
|
|
27
|
-
for (const changedFilePath of changedFilePaths) {
|
|
28
|
-
this._fileWriterCache.delete(changedFilePath);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
async runAsync() {
|
|
32
|
-
const bbNgModules = this._getBbNgModuleDefs();
|
|
33
|
-
const tsPreset = this._getTsGenNgModulePreset();
|
|
34
|
-
const genNgModules = this._getGenNgModuleDefs(bbNgModules, tsPreset.modules, tsPreset.sources);
|
|
35
|
-
await this._genFileAsync(genNgModules);
|
|
36
|
-
}
|
|
37
|
-
_getBbNgModuleDefs() {
|
|
38
|
-
const entryRecord = this._bbMeta.getEntryFileMetaRecord();
|
|
39
|
-
const result = [];
|
|
40
|
-
for (const moduleName of Object.keys(entryRecord)) {
|
|
41
|
-
const fileMeta = entryRecord[moduleName];
|
|
42
|
-
for (const exp of fileMeta.exports) {
|
|
43
|
-
const metaTmp = typeof exp.target !== "string" && "__TDeclRef__" in exp.target ? this._bbMeta.findMeta(exp.target) : exp.target;
|
|
44
|
-
const metas = metaTmp instanceof Array ? metaTmp : [metaTmp];
|
|
45
|
-
for (const meta of metas) {
|
|
46
|
-
if (meta instanceof SdCliBbClassMetadata) {
|
|
47
|
-
if (meta.ngDecl instanceof SdCliBbNgModuleMetadata) {
|
|
48
|
-
const ngDecl = meta.ngDecl;
|
|
49
|
-
const resultItem = {
|
|
50
|
-
moduleName,
|
|
51
|
-
name: exp.exportedName,
|
|
52
|
-
providers: [],
|
|
53
|
-
exports: [],
|
|
54
|
-
selectors: [],
|
|
55
|
-
pipeNames: []
|
|
56
|
-
};
|
|
57
|
-
for (const modProv of ngDecl.def.providers) {
|
|
58
|
-
if (modProv instanceof SdCliBbClassMetadata) {
|
|
59
|
-
const ref = this._bbMeta.findExportRef({
|
|
60
|
-
filePath: modProv.filePath,
|
|
61
|
-
name: modProv.name
|
|
62
|
-
});
|
|
63
|
-
if (ref) {
|
|
64
|
-
resultItem.providers.push(ref);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
else if (modProv instanceof SdCliBbObjectMetadata) {
|
|
68
|
-
// 무시
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
throw new NeverEntryError();
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
for (const modExp of ngDecl.def.exports) {
|
|
75
|
-
if (modExp instanceof SdCliBbClassMetadata) {
|
|
76
|
-
const ref = this._bbMeta.findExportRef({
|
|
77
|
-
filePath: modExp.filePath,
|
|
78
|
-
name: modExp.name
|
|
79
|
-
});
|
|
80
|
-
if (ref) {
|
|
81
|
-
resultItem.exports.push(ref);
|
|
82
|
-
}
|
|
83
|
-
if (modExp.ngDecl instanceof SdCliBbNgDirectiveMetadata) {
|
|
84
|
-
resultItem.selectors.push(modExp.ngDecl.selector);
|
|
85
|
-
}
|
|
86
|
-
else if (modExp.ngDecl instanceof SdCliBbNgComponentMetadata) {
|
|
87
|
-
resultItem.selectors.push(modExp.ngDecl.selector);
|
|
88
|
-
}
|
|
89
|
-
else if (modExp.ngDecl instanceof SdCliBbNgPipeMetadata) {
|
|
90
|
-
resultItem.pipeNames.push(modExp.ngDecl.pipeName);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
else if (typeof modExp !== "string" && "__TDeclRef__" in modExp) {
|
|
94
|
-
const modExpMeta = this._bbMeta.findMeta(modExp);
|
|
95
|
-
if (modExpMeta instanceof Array) {
|
|
96
|
-
throw new NeverEntryError();
|
|
97
|
-
}
|
|
98
|
-
if (modExpMeta instanceof SdCliBbClassMetadata) {
|
|
99
|
-
const ref = this._bbMeta.findExportRef({
|
|
100
|
-
filePath: modExpMeta.filePath,
|
|
101
|
-
name: modExpMeta.name
|
|
102
|
-
});
|
|
103
|
-
if (ref) {
|
|
104
|
-
resultItem.exports.push(ref);
|
|
105
|
-
}
|
|
106
|
-
if (modExpMeta.ngDecl instanceof SdCliBbNgDirectiveMetadata) {
|
|
107
|
-
resultItem.selectors.push(modExpMeta.ngDecl.selector);
|
|
108
|
-
}
|
|
109
|
-
else if (modExpMeta.ngDecl instanceof SdCliBbNgComponentMetadata) {
|
|
110
|
-
resultItem.selectors.push(modExpMeta.ngDecl.selector);
|
|
111
|
-
}
|
|
112
|
-
else if (modExpMeta.ngDecl instanceof SdCliBbNgPipeMetadata) {
|
|
113
|
-
resultItem.pipeNames.push(modExpMeta.ngDecl.pipeName);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
else {
|
|
118
|
-
throw new NeverEntryError();
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
result.push(resultItem);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
return result;
|
|
128
|
-
}
|
|
129
|
-
_getTsGenNgModulePreset() {
|
|
130
|
-
const fileMetas = this._tsMeta.getFileMetas();
|
|
131
|
-
const result = { modules: [], sources: [] };
|
|
132
|
-
for (const fileMeta of fileMetas) {
|
|
133
|
-
if (!this._srcDirRelPaths.some((item) => fileMeta.filePath.startsWith(path.resolve(this._srcPath, item)))) {
|
|
134
|
-
continue;
|
|
135
|
-
}
|
|
136
|
-
for (const cls of fileMeta.directExportClasses) {
|
|
137
|
-
if (cls.target.ngDecl) {
|
|
138
|
-
if (cls.target.ngDecl instanceof SdCliTsNgInjectableMetadata) {
|
|
139
|
-
if (cls.target.ngDecl.providedIn === "root") {
|
|
140
|
-
continue;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
const moduleClassName = cls.exportedName + "Module";
|
|
144
|
-
const moduleFilePath = path.resolve(this._modulesPath, path.relative(this._srcPath, path.dirname(fileMeta.filePath)), moduleClassName);
|
|
145
|
-
result.sources.push({
|
|
146
|
-
filePath: fileMeta.filePath,
|
|
147
|
-
name: cls.exportedName,
|
|
148
|
-
module: {
|
|
149
|
-
filePath: moduleFilePath,
|
|
150
|
-
name: moduleClassName
|
|
151
|
-
},
|
|
152
|
-
imports: fileMeta.imports,
|
|
153
|
-
template: "template" in cls.target.ngDecl ? cls.target.ngDecl.template : undefined,
|
|
154
|
-
isProvider: cls.target.ngDecl instanceof SdCliTsNgInjectableMetadata
|
|
155
|
-
});
|
|
156
|
-
result.modules.push({
|
|
157
|
-
filePath: moduleFilePath,
|
|
158
|
-
name: moduleClassName,
|
|
159
|
-
source: {
|
|
160
|
-
filePath: fileMeta.filePath,
|
|
161
|
-
name: cls.exportedName
|
|
162
|
-
},
|
|
163
|
-
selector: "selector" in cls.target.ngDecl ? cls.target.ngDecl.selector : undefined,
|
|
164
|
-
pipeName: "pipeName" in cls.target.ngDecl ? cls.target.ngDecl.pipeName : undefined
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
return result;
|
|
170
|
-
}
|
|
171
|
-
_getGenNgModuleDefs(bbModules, presetModules, presetSources) {
|
|
172
|
-
const result = [];
|
|
173
|
-
for (const el of presetSources) {
|
|
174
|
-
const imports = [];
|
|
175
|
-
for (const imp of el.imports) {
|
|
176
|
-
if ("moduleName" in imp) {
|
|
177
|
-
for (const mod of bbModules) {
|
|
178
|
-
if (mod.exports.some((item) => item.moduleName === imp.moduleName && item.name === imp.name)) {
|
|
179
|
-
imports.push({ moduleName: mod.moduleName, name: mod.name, __TDeclRef__: "__TDeclRef__" });
|
|
180
|
-
}
|
|
181
|
-
if (mod.providers.some((item) => item.moduleName === imp.moduleName && item.name === imp.name)) {
|
|
182
|
-
imports.push({ moduleName: mod.moduleName, name: mod.name, __TDeclRef__: "__TDeclRef__" });
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
else {
|
|
187
|
-
for (const mod of presetModules) {
|
|
188
|
-
if (mod.source && mod.source.filePath === imp.filePath && mod.source.name === imp.name) {
|
|
189
|
-
imports.push({ filePath: mod.filePath, name: mod.name, __TDeclRef__: "__TDeclRef__" });
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
if (el.template !== undefined) {
|
|
195
|
-
const templateDOM = new JSDOM(el.template);
|
|
196
|
-
for (const mod of bbModules) {
|
|
197
|
-
for (const selector of mod.selectors) {
|
|
198
|
-
if (templateDOM.window.document.querySelector([
|
|
199
|
-
selector,
|
|
200
|
-
selector.replace(/\[/g, "[\\[").replace(/]/g, "\\]]"),
|
|
201
|
-
selector.replace(/\[/g, "[\\(").replace(/]/g, "\\)]")
|
|
202
|
-
].join(", ")) != null) {
|
|
203
|
-
imports.push({ moduleName: mod.moduleName, name: mod.name, __TDeclRef__: "__TDeclRef__" });
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
for (const pipeName of mod.pipeNames) {
|
|
207
|
-
if (new RegExp("| *" + pipeName + "[^\\w]").test(el.template)) {
|
|
208
|
-
imports.push({ moduleName: mod.moduleName, name: mod.name, __TDeclRef__: "__TDeclRef__" });
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
for (const mod of presetModules) {
|
|
213
|
-
if (mod.selector !== undefined) {
|
|
214
|
-
if (templateDOM.window.document.querySelector([
|
|
215
|
-
mod.selector,
|
|
216
|
-
mod.selector.replace(/\[/g, "[\\[").replace(/]/g, "\\]]"),
|
|
217
|
-
mod.selector.replace(/\[/g, "[\\(").replace(/]/g, "\\)]")
|
|
218
|
-
].join(", ")) != null) {
|
|
219
|
-
imports.push({ filePath: mod.filePath, name: mod.name, __TDeclRef__: "__TDeclRef__" });
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
if (mod.pipeName !== undefined) {
|
|
223
|
-
if (new RegExp("| *" + mod.pipeName + "[^\\w]").test(el.template)) {
|
|
224
|
-
imports.push({ filePath: mod.filePath, name: mod.name, __TDeclRef__: "__TDeclRef__" });
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
result.push({
|
|
230
|
-
filePath: el.module.filePath,
|
|
231
|
-
name: el.module.name,
|
|
232
|
-
imports: imports.distinct(),
|
|
233
|
-
exports: el.isProvider ? [] : [{ filePath: el.filePath, name: el.name }],
|
|
234
|
-
providers: el.isProvider ? [{ filePath: el.filePath, name: el.name }] : []
|
|
235
|
-
});
|
|
236
|
-
}
|
|
237
|
-
return result;
|
|
238
|
-
}
|
|
239
|
-
async _genFileAsync(mods) {
|
|
240
|
-
for (const mod of mods) {
|
|
241
|
-
const importMap = [...mod.imports, ...mod.exports, ...mod.providers]
|
|
242
|
-
.map((item) => ({
|
|
243
|
-
moduleName: "moduleName" in item ? item.moduleName : this._getImportModuleName(mod.filePath, item.filePath),
|
|
244
|
-
name: item.name
|
|
245
|
-
}))
|
|
246
|
-
.groupBy((item) => item.moduleName)
|
|
247
|
-
.toMap((item) => item.key, (item) => item.values.map((v) => v.name));
|
|
248
|
-
importMap.getOrCreate("@angular/core", []).push("NgModule");
|
|
249
|
-
const importTexts = [];
|
|
250
|
-
for (const moduleName of Array.from(importMap.keys()).orderBy()) {
|
|
251
|
-
const targetNames = importMap.get(moduleName).distinct();
|
|
252
|
-
if (targetNames.length === 0)
|
|
253
|
-
continue;
|
|
254
|
-
importTexts.push(`import { ${targetNames.join(", ")} } from "${moduleName}";`);
|
|
255
|
-
}
|
|
256
|
-
const content = `
|
|
257
|
-
${importTexts.join(os.EOL)}
|
|
258
|
-
|
|
259
|
-
@NgModule({
|
|
260
|
-
imports: [${mod.imports.map((item) => item.name).orderBy().join(", ")}],
|
|
261
|
-
declarations: [${mod.exports.map((item) => item.name).distinct().orderBy().join(", ")}],
|
|
262
|
-
exports: [${mod.exports.map((item) => item.name).distinct().orderBy().join(", ")}],
|
|
263
|
-
providers: [${mod.providers.map((item) => item.name).distinct().orderBy().join(", ")}]
|
|
264
|
-
})
|
|
265
|
-
export class ${mod.name} {
|
|
266
|
-
}`.trim();
|
|
267
|
-
if (this._fileWriterCache.get(mod.filePath) !== content) {
|
|
268
|
-
await FsUtil.writeFileAsync(mod.filePath + ".ts", content);
|
|
269
|
-
this._fileWriterCache.set(mod.filePath, content);
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
_getImportModuleName(mainFilePath, importFilePath) {
|
|
274
|
-
const filePath = PathUtil.posix(path.relative(path.dirname(mainFilePath), importFilePath).replace(/\.ts$/, ""));
|
|
275
|
-
return filePath.startsWith(".") ? filePath : "./" + filePath;
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmdNb2R1bGVHZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbmctdG9vbHMvTmdNb2R1bGVHZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDdkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0YsT0FBTyxFQUNMLDBCQUEwQixFQUMxQiwwQkFBMEIsRUFDMUIsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUN0QixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUUzRCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMvRSxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUM5QixPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQztBQUVwQixrQkFBa0I7QUFDbEIsTUFBTSxPQUFPLGlCQUFpQjtJQVM1QixZQUFtQixXQUFtQixFQUFtQixlQUF5QjtRQUF6QixvQkFBZSxHQUFmLGVBQWUsQ0FBVTtRQUxqRSxhQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN4RSxpQkFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FB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
|