@simplysm/sd-cli 7.0.54 → 7.0.62

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 (42) hide show
  1. package/dist/SdCliBuildResultError.mjs +8 -0
  2. package/dist/builder/SdCliJsLibBuilder.mjs +2 -2
  3. package/dist/builder/SdCliServerBuilder.mjs +7 -4
  4. package/dist/builder/SdCliTsLibBuilder.mjs +25 -2
  5. package/dist/entry-points/SdCliIndexFileGenerator.mjs +4 -4
  6. package/dist/entry-points/SdCliLocalUpdate.mjs +2 -2
  7. package/dist/entry-points/SdCliWorkspace.mjs +7 -4
  8. package/dist/index.mjs +28 -0
  9. package/dist/ng-tools/NgModuleGenerator.mjs +278 -0
  10. package/dist/ng-tools/babel/SdCliBbFileMetadata.mjs +331 -0
  11. package/dist/ng-tools/babel/SdCliBbRootMetadata.mjs +171 -0
  12. package/dist/ng-tools/babel/SdCliBbUtil.mjs +14 -0
  13. package/dist/ng-tools/babel/TSdCliBbNgMetadata.mjs +169 -0
  14. package/dist/ng-tools/babel/TSdCliBbTypeMetadata.mjs +127 -0
  15. package/dist/ng-tools/commons.mjs +2 -0
  16. package/dist/ng-tools/typescript/SdCliTsFileMetadata.mjs +325 -0
  17. package/dist/ng-tools/typescript/SdCliTsRootMetadata.mjs +28 -0
  18. package/dist/utils/SdCliBuildResultUtil.mjs +3 -3
  19. package/dist/utils/SdCliNpmConfigUtil.mjs +3 -3
  20. package/lib/ts-node-esm-paths.mjs +2 -2
  21. package/package.json +11 -7
  22. package/src/SdCliBuildResultError.ts +9 -0
  23. package/src/builder/SdCliJsLibBuilder.ts +1 -1
  24. package/src/builder/SdCliServerBuilder.ts +6 -3
  25. package/src/builder/SdCliTsLibBuilder.ts +29 -1
  26. package/src/entry-points/SdCliIndexFileGenerator.ts +3 -3
  27. package/src/entry-points/SdCliLocalUpdate.ts +1 -1
  28. package/src/entry-points/SdCliWorkspace.ts +7 -4
  29. package/src/index.ts +27 -0
  30. package/src/ng-tools/NgModuleGenerator.ts +361 -0
  31. package/src/ng-tools/babel/SdCliBbFileMetadata.ts +372 -0
  32. package/src/ng-tools/babel/SdCliBbRootMetadata.ts +207 -0
  33. package/src/ng-tools/babel/SdCliBbUtil.ts +15 -0
  34. package/src/ng-tools/babel/TSdCliBbNgMetadata.ts +220 -0
  35. package/src/ng-tools/babel/TSdCliBbTypeMetadata.ts +177 -0
  36. package/src/ng-tools/commons.ts +3 -0
  37. package/src/ng-tools/typescript/SdCliTsFileMetadata.ts +384 -0
  38. package/src/ng-tools/typescript/SdCliTsRootMetadata.ts +32 -0
  39. package/src/utils/SdCliBuildResultUtil.ts +2 -2
  40. package/src/utils/SdCliNpmConfigUtil.ts +2 -2
  41. package/tsconfig-build.json +2 -1
  42. package/tsconfig.json +2 -1
@@ -0,0 +1,278 @@
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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