@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.
Files changed (74) hide show
  1. package/dist/SdCliBuildResultError.d.ts +5 -0
  2. package/dist/bin/sd-cli.d.ts +2 -0
  3. package/dist/bin/sd-cli.mjs +27 -6
  4. package/dist/build-tool/SdCliCacheCompilerHost.d.ts +10 -0
  5. package/dist/build-tool/SdCliCordova.d.ts +16 -0
  6. package/dist/build-tool/SdCliCordova.mjs +176 -0
  7. package/dist/build-tool/SdCliIndexFileGenerator.d.ts +13 -0
  8. package/dist/{entry-points → build-tool}/SdCliIndexFileGenerator.mjs +4 -3
  9. package/dist/build-tool/SdCliNgCacheCompilerHost.d.ts +11 -0
  10. package/dist/build-tool/SdCliPackageLinter.d.ts +8 -0
  11. package/dist/build-tool/SdCliPackageLinter.mjs +19 -2
  12. package/dist/builder/SdCliClientBuilder.d.ts +23 -0
  13. package/dist/builder/SdCliClientBuilder.mjs +69 -6
  14. package/dist/builder/SdCliJsLibBuilder.d.ts +14 -0
  15. package/dist/builder/SdCliServerBuilder.d.ts +25 -0
  16. package/dist/builder/SdCliServerBuilder.mjs +19 -10
  17. package/dist/builder/SdCliTsLibBuilder.d.ts +34 -0
  18. package/dist/builder/SdCliTsLibBuilder.mjs +84 -37
  19. package/dist/commons.d.ts +101 -0
  20. package/dist/entry-points/SdCliLocalUpdate.d.ts +13 -0
  21. package/dist/entry-points/SdCliNpm.d.ts +6 -0
  22. package/dist/entry-points/SdCliPrepare.d.ts +5 -0
  23. package/dist/entry-points/SdCliPrepare.mjs +2 -2
  24. package/dist/entry-points/SdCliWorkspace.d.ts +31 -0
  25. package/dist/entry-points/SdCliWorkspace.mjs +67 -51
  26. package/dist/index.d.ts +29 -0
  27. package/dist/index.mjs +5 -3
  28. package/dist/ng-tools/SdCliNgModuleGenerator.d.ts +28 -0
  29. package/dist/ng-tools/SdCliNgModuleGenerator.mjs +486 -0
  30. package/dist/ng-tools/babel/SdCliBbFileMetadata.d.ts +23 -0
  31. package/dist/ng-tools/babel/SdCliBbFileMetadata.mjs +187 -36
  32. package/dist/ng-tools/babel/SdCliBbRootMetadata.d.ts +22 -0
  33. package/dist/ng-tools/babel/SdCliBbRootMetadata.mjs +10 -7
  34. package/dist/ng-tools/babel/SdCliBbUtil.d.ts +5 -0
  35. package/dist/ng-tools/babel/SdCliBbUtil.mjs +2 -2
  36. package/dist/ng-tools/babel/TSdCliBbNgMetadata.d.ts +42 -0
  37. package/dist/ng-tools/babel/TSdCliBbNgMetadata.mjs +107 -76
  38. package/dist/ng-tools/babel/TSdCliBbTypeMetadata.d.ts +44 -0
  39. package/dist/ng-tools/commons.d.ts +9 -0
  40. package/dist/ng-tools/typescript/SdCliTsFileMetadata.d.ts +61 -0
  41. package/dist/ng-tools/typescript/SdCliTsFileMetadata.mjs +12 -12
  42. package/dist/ng-tools/typescript/SdCliTsRootMetadata.d.ts +8 -0
  43. package/dist/ng-tools/typescript/SdCliTsUtil.d.ts +5 -0
  44. package/dist/ng-tools/typescript/SdCliTsUtil.mjs +28 -0
  45. package/dist/packages/SdCliPackage.d.ts +23 -0
  46. package/dist/packages/SdCliPackage.mjs +53 -7
  47. package/dist/utils/SdCliBuildResultUtil.d.ts +9 -0
  48. package/dist/utils/SdCliConfigUtil.d.ts +7 -0
  49. package/dist/utils/SdCliNpmConfigUtil.d.ts +7 -0
  50. package/package.json +11 -8
  51. package/src/bin/sd-cli.ts +26 -5
  52. package/src/build-tool/SdCliCordova.ts +224 -0
  53. package/src/{entry-points → build-tool}/SdCliIndexFileGenerator.ts +3 -2
  54. package/src/build-tool/SdCliPackageLinter.ts +18 -2
  55. package/src/builder/SdCliClientBuilder.ts +84 -5
  56. package/src/builder/SdCliServerBuilder.ts +20 -9
  57. package/src/builder/SdCliTsLibBuilder.ts +101 -45
  58. package/src/commons.ts +43 -0
  59. package/src/entry-points/SdCliPrepare.ts +1 -1
  60. package/src/entry-points/SdCliWorkspace.ts +71 -56
  61. package/src/index.ts +4 -2
  62. package/src/ng-tools/SdCliNgModuleGenerator.ts +643 -0
  63. package/src/ng-tools/babel/SdCliBbFileMetadata.ts +234 -38
  64. package/src/ng-tools/babel/SdCliBbRootMetadata.ts +10 -6
  65. package/src/ng-tools/babel/SdCliBbUtil.ts +1 -1
  66. package/src/ng-tools/babel/TSdCliBbNgMetadata.ts +36 -22
  67. package/src/ng-tools/commons.ts +1 -1
  68. package/src/ng-tools/typescript/SdCliTsFileMetadata.ts +12 -12
  69. package/src/ng-tools/typescript/SdCliTsUtil.ts +29 -0
  70. package/src/packages/SdCliPackage.ts +56 -6
  71. package/tsconfig-build.json +1 -1
  72. package/tsconfig.json +3 -0
  73. package/dist/ng-tools/NgModuleGenerator.mjs +0 -278
  74. 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
- private readonly _sourceFile: ts.SourceFile;
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._sourceFile = ts.createSourceFile(filePath, fileContent, ts.ScriptTarget.ES2017);
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._sourceFile.forEachChild((node) => {
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._sourceFile, (node) => {
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
- __TDeclRef__: "__TDeclRef__" as const
50
+ __TSdCliMetaRef__: "__TSdCliMetaRef__" as const
51
51
  });
52
52
  }
53
53
  }
54
54
  else {
55
- throw new NeverEntryError();
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
- __TDeclRef__: "__TDeclRef__" as const
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
- __TDeclRef__: "__TDeclRef__" as const
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
- __TDeclRef__: "__TDeclRef__" as const
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
- __TDeclRef__: "__TDeclRef__" as const
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
- __TDeclRef__: "__TDeclRef__" as const
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._sourceFile);
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.type === "library" && this.config.publish === "npm") {
87
- await SdProcess.spawnAsync("npm publish --quiet --access public", { cwd: this.rootPath });
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
- // const isAngular = isTs && this.allDependencies.includes("@angular/core");
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);
@@ -5,7 +5,7 @@
5
5
  "ES2020"
6
6
  ],
7
7
  "outDir": "./dist",
8
- "declaration": false
8
+ "declaration": true
9
9
  },
10
10
  "files": [
11
11
  "src/bin/sd-cli.ts",
package/tsconfig.json CHANGED
@@ -18,6 +18,9 @@
18
18
  ],
19
19
  "@simplysm/sd-service-server": [
20
20
  "../sd-service-server/src/index.ts"
21
+ ],
22
+ "@simplysm/sd-storage": [
23
+ "../sd-storage/src/index.ts"
21
24
  ]
22
25
  }
23
26
  },
@@ -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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