@ngflow/ng-architect 1.2.6 → 1.2.7
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/package.json
CHANGED
|
@@ -8,92 +8,77 @@ const structure_resolver_1 = require("../utils/structure-resolver");
|
|
|
8
8
|
const options_validator_1 = require("../utils/options-validator");
|
|
9
9
|
function default_1(options) {
|
|
10
10
|
return (tree, context) => {
|
|
11
|
-
|
|
11
|
+
const featureKebab = (0, string_utils_1.toKebabCase)(options.name);
|
|
12
|
+
const featurePascal = (0, string_utils_1.toPascalCase)(options.name);
|
|
13
|
+
// 🔹 Resolve auto-structure
|
|
12
14
|
const resolvedStructure = (0, structure_resolver_1.resolveStructure)(tree, options);
|
|
13
15
|
options.structure = resolvedStructure;
|
|
16
|
+
context.logger.info(`🟢 Creating feature: ${featurePascal} (${featureKebab})`);
|
|
14
17
|
context.logger.info(`📐 Structure resolved to: ${resolvedStructure}`);
|
|
15
|
-
// 🔹
|
|
18
|
+
// 🔹 Validate options according to resolved structure
|
|
16
19
|
(0, options_validator_1.validateOptions)(options, resolvedStructure);
|
|
17
|
-
// 🔹
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
context.logger.info(`Structure: ${options.structure}`);
|
|
56
|
-
},
|
|
57
|
-
// 🔹 Gerar ficheiros a partir do template
|
|
58
|
-
(0, schematics_1.mergeWith)((0, schematics_1.apply)((0, schematics_1.url)('./files'), [
|
|
59
|
-
(0, schematics_1.template)({ featureKebab, featurePascal }),
|
|
60
|
-
(0, schematics_1.move)(basePath),
|
|
61
|
-
])),
|
|
62
|
-
// 🔹 Atualizar routes.ts (standalone + lazy loading quando necessário)
|
|
63
|
-
(_tree, context) => {
|
|
64
|
-
context.logger.info(`🟢 Updating app.routes.ts with ${featurePascal}Page...`);
|
|
65
|
-
(0, routes_utils_1.updateAppRoutes)(_tree, featureKebab, featurePascal, options.structure, options);
|
|
66
|
-
},
|
|
67
|
-
// 🔹 Criar subpastas e barrels (index.ts)
|
|
68
|
-
(_tree) => {
|
|
20
|
+
// 🔹 Determine base path and subfolders
|
|
21
|
+
let basePath;
|
|
22
|
+
let subFolders = [];
|
|
23
|
+
switch (resolvedStructure) {
|
|
24
|
+
case 'flat':
|
|
25
|
+
basePath = `src/app/${featureKebab}`;
|
|
26
|
+
break;
|
|
27
|
+
case 'domain-driven':
|
|
28
|
+
basePath = `src/app/features/${featureKebab}`;
|
|
29
|
+
subFolders = ['pages', 'data', 'models'];
|
|
30
|
+
break;
|
|
31
|
+
case 'module-driven':
|
|
32
|
+
if (!options.module)
|
|
33
|
+
throw new Error('module-driven requires --module=<moduleName>');
|
|
34
|
+
basePath = `src/app/${options.module}/${featureKebab}`;
|
|
35
|
+
subFolders = ['pages', 'data', 'models'];
|
|
36
|
+
break;
|
|
37
|
+
case 'monorepo':
|
|
38
|
+
if (!options.app && !options.lib)
|
|
39
|
+
throw new Error('monorepo requires --app=<appName> or --lib=<libName>');
|
|
40
|
+
basePath = options.app
|
|
41
|
+
? `apps/${options.app}/src/app/${featureKebab}`
|
|
42
|
+
: `libs/${options.lib}/src/lib/${featureKebab}`;
|
|
43
|
+
subFolders = ['pages', 'data', 'models'];
|
|
44
|
+
break;
|
|
45
|
+
default:
|
|
46
|
+
throw new Error(`Invalid structure: ${resolvedStructure}`);
|
|
47
|
+
}
|
|
48
|
+
// 🔹 Apply templates and move to proper folder
|
|
49
|
+
const templateRule = (0, schematics_1.mergeWith)((0, schematics_1.apply)((0, schematics_1.url)('./files'), [(0, schematics_1.template)({ featureKebab, featurePascal }), (0, schematics_1.move)(basePath)]));
|
|
50
|
+
// 🔹 Update app routes
|
|
51
|
+
const routesRule = (t, ctx) => {
|
|
52
|
+
ctx.logger.info(`🟢 Updating routes with ${featurePascal}Page...`);
|
|
53
|
+
(0, routes_utils_1.updateAppRoutes)(t, featureKebab, featurePascal, resolvedStructure, options);
|
|
54
|
+
return t;
|
|
55
|
+
};
|
|
56
|
+
// 🔹 Create subfolders and barrels
|
|
57
|
+
const subFoldersRule = (t) => {
|
|
69
58
|
subFolders.forEach((folder) => {
|
|
70
59
|
const folderPath = `${basePath}/${folder}`;
|
|
71
|
-
if (!
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
const files = _tree.getDir(folderPath).subfiles.filter((f) => f.endsWith('.ts'));
|
|
60
|
+
if (!t.exists(folderPath))
|
|
61
|
+
t.create(folderPath + '/.gitkeep', '');
|
|
62
|
+
const files = t.getDir(folderPath).subfiles.filter((f) => f.endsWith('.ts'));
|
|
75
63
|
const barrelContent = files
|
|
76
|
-
.map((f) => {
|
|
77
|
-
const name = f.replace('.ts', '');
|
|
78
|
-
return `export * from './${name}';`;
|
|
79
|
-
})
|
|
64
|
+
.map((f) => `export * from './${f.replace('.ts', '')}';`)
|
|
80
65
|
.join('\n');
|
|
81
|
-
if (!
|
|
82
|
-
|
|
66
|
+
if (!t.exists(`${folderPath}/index.ts`)) {
|
|
67
|
+
t.create(`${folderPath}/index.ts`, barrelContent);
|
|
83
68
|
}
|
|
84
69
|
else {
|
|
85
|
-
|
|
86
|
-
const existing = _tree.read(`${folderPath}/index.ts`).toString('utf-8');
|
|
70
|
+
const existing = t.read(`${folderPath}/index.ts`).toString('utf-8');
|
|
87
71
|
const newExports = files
|
|
88
72
|
.map((f) => `export * from './${f.replace('.ts', '')}';`)
|
|
89
73
|
.filter((line) => !existing.includes(line))
|
|
90
74
|
.join('\n');
|
|
91
75
|
if (newExports)
|
|
92
|
-
|
|
76
|
+
t.overwrite(`${folderPath}/index.ts`, existing + '\n' + newExports);
|
|
93
77
|
}
|
|
94
78
|
});
|
|
95
|
-
return
|
|
96
|
-
}
|
|
97
|
-
|
|
79
|
+
return t;
|
|
80
|
+
};
|
|
81
|
+
return (0, schematics_1.chain)([templateRule, routesRule, subFoldersRule]);
|
|
82
|
+
};
|
|
98
83
|
}
|
|
99
84
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;AAgBA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,109 +11,95 @@ import {
|
|
|
11
11
|
} from '@angular-devkit/schematics';
|
|
12
12
|
import { toKebabCase, toPascalCase } from '../utils/string-utils';
|
|
13
13
|
import { updateAppRoutes } from '../utils/routes-utils';
|
|
14
|
-
import { resolveStructure } from '../utils/structure-resolver';
|
|
14
|
+
import { resolveStructure, Structure } from '../utils/structure-resolver';
|
|
15
15
|
import { validateOptions } from '../utils/options-validator';
|
|
16
16
|
|
|
17
17
|
export default function (options: any): Rule {
|
|
18
18
|
return (tree: Tree, context: SchematicContext) => {
|
|
19
|
-
|
|
20
|
-
const
|
|
19
|
+
const featureKebab = toKebabCase(options.name);
|
|
20
|
+
const featurePascal = toPascalCase(options.name);
|
|
21
|
+
|
|
22
|
+
// 🔹 Resolve auto-structure
|
|
23
|
+
const resolvedStructure: Structure = resolveStructure(tree, options);
|
|
21
24
|
options.structure = resolvedStructure;
|
|
22
25
|
|
|
26
|
+
context.logger.info(`🟢 Creating feature: ${featurePascal} (${featureKebab})`);
|
|
23
27
|
context.logger.info(`📐 Structure resolved to: ${resolvedStructure}`);
|
|
24
28
|
|
|
25
|
-
// 🔹
|
|
29
|
+
// 🔹 Validate options according to resolved structure
|
|
26
30
|
validateOptions(options, resolvedStructure);
|
|
27
31
|
|
|
28
|
-
// 🔹
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// 🔹
|
|
75
|
-
|
|
76
|
-
apply(url('./files'), [
|
|
77
|
-
template({ featureKebab, featurePascal }),
|
|
78
|
-
move(basePath),
|
|
79
|
-
])
|
|
80
|
-
),
|
|
81
|
-
|
|
82
|
-
// 🔹 Atualizar routes.ts (standalone + lazy loading quando necessário)
|
|
83
|
-
(_tree: Tree, context: SchematicContext) => {
|
|
84
|
-
context.logger.info(`🟢 Updating app.routes.ts with ${featurePascal}Page...`);
|
|
85
|
-
updateAppRoutes(_tree, featureKebab, featurePascal, options.structure, options);
|
|
86
|
-
},
|
|
87
|
-
|
|
88
|
-
// 🔹 Criar subpastas e barrels (index.ts)
|
|
89
|
-
(_tree: Tree) => {
|
|
32
|
+
// 🔹 Determine base path and subfolders
|
|
33
|
+
let basePath: string;
|
|
34
|
+
let subFolders: string[] = [];
|
|
35
|
+
|
|
36
|
+
switch (resolvedStructure) {
|
|
37
|
+
case 'flat':
|
|
38
|
+
basePath = `src/app/${featureKebab}`;
|
|
39
|
+
break;
|
|
40
|
+
|
|
41
|
+
case 'domain-driven':
|
|
42
|
+
basePath = `src/app/features/${featureKebab}`;
|
|
43
|
+
subFolders = ['pages', 'data', 'models'];
|
|
44
|
+
break;
|
|
45
|
+
|
|
46
|
+
case 'module-driven':
|
|
47
|
+
if (!options.module)
|
|
48
|
+
throw new Error('module-driven requires --module=<moduleName>');
|
|
49
|
+
basePath = `src/app/${options.module}/${featureKebab}`;
|
|
50
|
+
subFolders = ['pages', 'data', 'models'];
|
|
51
|
+
break;
|
|
52
|
+
|
|
53
|
+
case 'monorepo':
|
|
54
|
+
if (!options.app && !options.lib)
|
|
55
|
+
throw new Error('monorepo requires --app=<appName> or --lib=<libName>');
|
|
56
|
+
basePath = options.app
|
|
57
|
+
? `apps/${options.app}/src/app/${featureKebab}`
|
|
58
|
+
: `libs/${options.lib}/src/lib/${featureKebab}`;
|
|
59
|
+
subFolders = ['pages', 'data', 'models'];
|
|
60
|
+
break;
|
|
61
|
+
|
|
62
|
+
default:
|
|
63
|
+
throw new Error(`Invalid structure: ${resolvedStructure}`);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// 🔹 Apply templates and move to proper folder
|
|
67
|
+
const templateRule = mergeWith(
|
|
68
|
+
apply(url('./files'), [template({ featureKebab, featurePascal }), move(basePath)])
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
// 🔹 Update app routes
|
|
72
|
+
const routesRule = (t: Tree, ctx: SchematicContext) => {
|
|
73
|
+
ctx.logger.info(`🟢 Updating routes with ${featurePascal}Page...`);
|
|
74
|
+
updateAppRoutes(t, featureKebab, featurePascal, resolvedStructure, options);
|
|
75
|
+
return t;
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
// 🔹 Create subfolders and barrels
|
|
79
|
+
const subFoldersRule = (t: Tree) => {
|
|
90
80
|
subFolders.forEach((folder) => {
|
|
91
81
|
const folderPath = `${basePath}/${folder}`;
|
|
92
|
-
if (!
|
|
82
|
+
if (!t.exists(folderPath)) t.create(folderPath + '/.gitkeep', '');
|
|
93
83
|
|
|
94
|
-
|
|
95
|
-
const files = _tree.getDir(folderPath).subfiles.filter((f) => f.endsWith('.ts'));
|
|
84
|
+
const files = t.getDir(folderPath).subfiles.filter((f) => f.endsWith('.ts'));
|
|
96
85
|
const barrelContent = files
|
|
97
|
-
.map((f) => {
|
|
98
|
-
const name = f.replace('.ts', '');
|
|
99
|
-
return `export * from './${name}';`;
|
|
100
|
-
})
|
|
86
|
+
.map((f) => `export * from './${f.replace('.ts', '')}';`)
|
|
101
87
|
.join('\n');
|
|
102
88
|
|
|
103
|
-
if (!
|
|
104
|
-
|
|
89
|
+
if (!t.exists(`${folderPath}/index.ts`)) {
|
|
90
|
+
t.create(`${folderPath}/index.ts`, barrelContent);
|
|
105
91
|
} else {
|
|
106
|
-
|
|
107
|
-
const existing = _tree.read(`${folderPath}/index.ts`)!.toString('utf-8');
|
|
92
|
+
const existing = t.read(`${folderPath}/index.ts`)!.toString('utf-8');
|
|
108
93
|
const newExports = files
|
|
109
94
|
.map((f) => `export * from './${f.replace('.ts', '')}';`)
|
|
110
95
|
.filter((line) => !existing.includes(line))
|
|
111
96
|
.join('\n');
|
|
112
|
-
if (newExports)
|
|
97
|
+
if (newExports) t.overwrite(`${folderPath}/index.ts`, existing + '\n' + newExports);
|
|
113
98
|
}
|
|
114
99
|
});
|
|
100
|
+
return t;
|
|
101
|
+
};
|
|
115
102
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
]);
|
|
103
|
+
return chain([templateRule, routesRule, subFoldersRule]);
|
|
104
|
+
};
|
|
119
105
|
}
|