ngrx-entity-crud 19.2.5 → 19.4.0-beta.4
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/README.md +67 -26
- package/package.json +1 -1
- package/schematics/collection.json +4 -4
- package/schematics/lazy-report/index.d.ts +2 -0
- package/schematics/lazy-report/index.js +238 -0
- package/schematics/lazy-report/index.js.map +1 -0
- package/schematics/lazy-report/index.ts +279 -0
- package/schematics/lazy-report/schema.d.ts +18 -0
- package/schematics/lazy-report/schema.json +28 -0
- package/schematics/my-utility.d.ts +0 -16
- package/schematics/my-utility.js +0 -34
- package/schematics/my-utility.js.map +1 -1
- package/schematics/my-utility.ts +0 -51
- package/schematics/ng-add/files/src/app/app.component.ts +3 -16
- package/schematics/ng-add/files/src/app/app.module.ts +6 -2
- package/schematics/ng-add/files/src/app/core/theme/components/footer.component.ts +1 -0
- package/schematics/ng-add/files/src/app/core/theme/components/header.component.ts +1 -5
- package/schematics/ng-add/files/src/app/core/theme/components/main.component.ts +3 -4
- package/schematics/ng-add/files/src/app/core/theme/components/menu-item.component.ts +3 -5
- package/schematics/ng-add/files/src/app/core/theme/components/progress.component.ts +2 -6
- package/schematics/ng-add/files/src/app/core/theme/components/slide-menu-pro.component.ts +1 -6
- package/schematics/ng-add/files/src/app/core/theme/components/slide-menu.component.ts +1 -7
- package/schematics/ng-add/files/src/app/core/theme/theme-jng.module.ts +22 -18
- package/schematics/ng-add/files/src/app/root-store/selectors.ts +80 -19
- package/schematics/store/index.js +24 -14
- package/schematics/store/index.js.map +1 -1
- package/schematics/store/index.ts +26 -15
- package/schematics/store/schema.d.ts +8 -0
- package/schematics/store/schema.json +16 -0
- package/schematics/auth0/files/store/auth-store/actions.ts +0 -21
- package/schematics/auth0/files/store/auth-store/auth-store.module.ts +0 -32
- package/schematics/auth0/files/store/auth-store/auth.guard.ts +0 -44
- package/schematics/auth0/files/store/auth-store/authentication.service.ts +0 -32
- package/schematics/auth0/files/store/auth-store/conf.ts +0 -2
- package/schematics/auth0/files/store/auth-store/effects.ts +0 -59
- package/schematics/auth0/files/store/auth-store/index.d.ts +0 -13
- package/schematics/auth0/files/store/auth-store/index.ts +0 -13
- package/schematics/auth0/files/store/auth-store/login.component.ts +0 -75
- package/schematics/auth0/files/store/auth-store/names.ts +0 -3
- package/schematics/auth0/files/store/auth-store/profile.ts +0 -12
- package/schematics/auth0/files/store/auth-store/reducer.ts +0 -23
- package/schematics/auth0/files/store/auth-store/selectors.ts +0 -24
- package/schematics/auth0/files/store/auth-store/state.ts +0 -11
- package/schematics/auth0/index.d.ts +0 -2
- package/schematics/auth0/index.js +0 -66
- package/schematics/auth0/index.js.map +0 -1
- package/schematics/auth0/index.ts +0 -76
- package/schematics/auth0/schema.d.ts +0 -21
- package/schematics/auth0/schema.json +0 -21
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@ Commands for code generation:
|
|
|
4
4
|
- `store`: Generates a feature set containing an `entity`, `actions`, `reducer`, ... file.
|
|
5
5
|
- `section`: Generates a new Angular CRUD page containing an `list`, `detail`, `search`, ... file.
|
|
6
6
|
- `auth`: Generates a boilerplate for authentication implementation containing an `store section` and `components` file.
|
|
7
|
-
- `
|
|
7
|
+
- `lazy-report`: Scans the project and reports which stores are good candidates to become lazy.
|
|
8
8
|
|
|
9
9
|
# How to use it?
|
|
10
10
|
To create your first project, follow this [guide](https://github.com/jucasoft/ngrx-entity-crud-prime-ng-boilerplate).
|
|
@@ -49,8 +49,28 @@ Store type:
|
|
|
49
49
|
- Enum: `"CRUD-PLURAL", "CRUD-SINGULAR", "CRUD+GRAPHQL", "BASE"`
|
|
50
50
|
- Default: `false`
|
|
51
51
|
|
|
52
|
+
Store registration strategy:
|
|
53
|
+
- `eager`: the store is declared in the application `RootStoreModule` (historical behavior); reducers/effects are loaded at startup.
|
|
54
|
+
- `lazy`: the store is **not** registered in the root; the view feature module is responsible for importing `<Clazz>StoreModule`, so reducers/effects are loaded only when the section is opened.
|
|
55
|
+
|
|
56
|
+
- `--registration`
|
|
57
|
+
- Type: `string`
|
|
58
|
+
- Enum: `"eager", "lazy"`
|
|
59
|
+
- Optional. If omitted, the schematic asks interactively. In non-interactive runs (CI/scripts) it falls back to `eager`, so existing pipelines keep working unchanged.
|
|
60
|
+
|
|
61
|
+
> **Lazy mode notes**
|
|
62
|
+
> - With `--registration=lazy` nothing registers the store automatically: you must import `<Clazz>StoreModule` in the feature module generated for the view (e.g. `coin.module.ts`).
|
|
63
|
+
> - The generated slice is declared as **optional** in `root-store/state.ts`, because it does not exist in the runtime state until the section is loaded.
|
|
64
|
+
> - `root-store/selectors.ts` exposes the global loading/error selectors (`selectIsLoading`, `selectError`, `selectLoadingNames`) in a **store-agnostic** way: they scan the root state using the `EntityCrudBaseState` convention (every CRUD slice exposes `isLoading`/`error` at the top level), so lazily-registered stores contribute to the global loading/error state without coupling the root to any specific domain.
|
|
65
|
+
|
|
52
66
|
#### Examples
|
|
53
67
|
|
|
68
|
+
```sh
|
|
69
|
+
ng generate ngrx-entity-crud:store --name=coin --clazz=Coin --type=CRUD-PLURAL --registration=lazy
|
|
70
|
+
```
|
|
71
|
+
With `--registration=lazy` the store is not added to `RootStoreModule`; remember to import `CoinStoreModule` in the view feature module.
|
|
72
|
+
|
|
73
|
+
|
|
54
74
|
```sh
|
|
55
75
|
ng generate ngrx-entity-crud:store --name=coin --clazz=Coin --type=CRUD-PLURAL
|
|
56
76
|
```
|
|
@@ -242,48 +262,69 @@ UPDATE src/app/root-store/__clazz@dasherize__.state.ts (184 bytes)
|
|
|
242
262
|
UPDATE src/app/root-store/root-store.module.ts (1051 bytes)
|
|
243
263
|
```
|
|
244
264
|
|
|
245
|
-
##
|
|
265
|
+
## lazy-report
|
|
246
266
|
|
|
247
267
|
---
|
|
248
268
|
|
|
249
269
|
### Overview
|
|
250
270
|
|
|
251
|
-
|
|
271
|
+
Read-only analysis command. It scans the project and produces a report that maps each store to
|
|
272
|
+
the sections that use it, then suggests which stores are good candidates to be registered as
|
|
273
|
+
**lazy** (see the `--registration` option of the `store` command). Nothing is modified except the
|
|
274
|
+
generated report file: you decide what to convert.
|
|
275
|
+
|
|
276
|
+
How a store is classified:
|
|
277
|
+
- **candidato lazy**: used by exactly one section, and that section is on a lazy route (`loadChildren`).
|
|
278
|
+
- **multi-sezione**: used by more than one section (evaluate a shared lazy module).
|
|
279
|
+
- **tieni eager (usato dalla shell)**: referenced by the app shell (`core/`, `main/components`, `app.component`) — must stay eager.
|
|
280
|
+
- **sezione non lazy-routed**: its only section is loaded eagerly, so going lazy gives little benefit.
|
|
281
|
+
- **infra (eager)**: infrastructure store (e.g. `router-store`), excluded from candidates.
|
|
282
|
+
- **orfano**: not referenced by any section.
|
|
283
|
+
|
|
284
|
+
The scan is static and relies on the naming convention (`XxxStoreActions/Selectors/State/Module`).
|
|
285
|
+
Paths are read from `ngrx-entity-crud.conf.json` when present, otherwise defaults are used
|
|
286
|
+
(`src/app/root-store`, `src/app/main/views`, `src/app`).
|
|
252
287
|
|
|
253
288
|
### Command
|
|
254
289
|
|
|
255
290
|
```sh
|
|
256
|
-
ng generate ngrx-entity-crud:
|
|
291
|
+
ng generate ngrx-entity-crud:lazy-report [options]
|
|
257
292
|
```
|
|
258
293
|
|
|
294
|
+
### Options
|
|
295
|
+
|
|
296
|
+
Report file to write (relative to the workspace root); empty string = console only.
|
|
297
|
+
- `--output`
|
|
298
|
+
- Type: `string`
|
|
299
|
+
- Default: `lazy-report.md`
|
|
300
|
+
|
|
301
|
+
Format of the written report.
|
|
302
|
+
- `--format`
|
|
303
|
+
- Type: `string`
|
|
304
|
+
- Enum: `"md", "json"`
|
|
305
|
+
- Default: `md`
|
|
306
|
+
|
|
307
|
+
Infrastructure stores excluded from lazy candidates (folder names).
|
|
308
|
+
- `--infra-stores`
|
|
309
|
+
- Type: `string[]`
|
|
310
|
+
- Default: `["router-store"]`
|
|
311
|
+
|
|
259
312
|
#### Examples
|
|
260
313
|
|
|
261
314
|
```sh
|
|
262
|
-
ng generate ngrx-entity-crud:
|
|
315
|
+
ng generate ngrx-entity-crud:lazy-report
|
|
316
|
+
ng generate ngrx-entity-crud:lazy-report --format=json --output=lazy-report.json
|
|
317
|
+
ng generate ngrx-entity-crud:lazy-report --output= # solo console
|
|
263
318
|
```
|
|
264
319
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
```sh
|
|
268
|
-
CREATE src/app/root-store/auth-store/__clazz@dasherize__.actions.ts (776 bytes)
|
|
269
|
-
CREATE src/app/root-store/auth-store/auth-store.module.ts (1044 bytes)
|
|
270
|
-
CREATE src/app/root-store/auth-store/auth.guard.ts (1359 bytes)
|
|
271
|
-
CREATE src/app/root-store/auth-store/authentication.service.ts (675 bytes)
|
|
272
|
-
CREATE src/app/root-store/auth-store/conf.ts (75 bytes)
|
|
273
|
-
CREATE src/app/root-store/auth-store/__clazz@dasherize__.effects.ts (1754 bytes)
|
|
274
|
-
CREATE src/app/root-store/auth-store/index.d.ts (271 bytes)
|
|
275
|
-
CREATE src/app/root-store/auth-store/index.ts (271 bytes)
|
|
276
|
-
CREATE src/app/root-store/auth-store/login.component.ts (2117 bytes)
|
|
277
|
-
CREATE src/app/root-store/auth-store/__clazz@dasherize__.names.ts (47 bytes)
|
|
278
|
-
CREATE src/app/root-store/auth-store/profile.ts (224 bytes)
|
|
279
|
-
CREATE src/app/root-store/auth-store/__clazz@dasherize__.reducer.ts (475 bytes)
|
|
280
|
-
CREATE src/app/root-store/auth-store/__clazz@dasherize__.selectors.ts (699 bytes)
|
|
281
|
-
CREATE src/app/root-store/auth-store/__clazz@dasherize__.state.ts (192 bytes)
|
|
320
|
+
Example output (excerpt):
|
|
282
321
|
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
322
|
+
```md
|
|
323
|
+
| store | clazz | type | sezioni | n | lazy route | shell | verdetto |
|
|
324
|
+
|---|---|---|---|---|---|---|---|
|
|
325
|
+
| coin-store | Coin | CRUD-PLURAL | coin | 1 | si | no | candidato lazy |
|
|
326
|
+
| currency-store | Currency | CRUD-PLURAL | coin, invoice | 2 | si | no | multi-sezione (2) -> valuta modulo condiviso |
|
|
327
|
+
| menu-store | Menu | CRUD-PLURAL | - | 0 | - | si | tieni eager (usato dalla shell) |
|
|
287
328
|
```
|
|
288
329
|
|
|
289
330
|
## Running unit tests
|
package/package.json
CHANGED
|
@@ -21,10 +21,10 @@
|
|
|
21
21
|
"factory": "./ng-add/index#ngAdd",
|
|
22
22
|
"schema": "./ng-add/schema.json"
|
|
23
23
|
},
|
|
24
|
-
"
|
|
25
|
-
"description": "
|
|
26
|
-
"factory": "./
|
|
27
|
-
"schema": "./
|
|
24
|
+
"lazy-report": {
|
|
25
|
+
"description": "Scan the project and report which stores are lazy candidates.",
|
|
26
|
+
"factory": "./lazy-report/index#lazyReport",
|
|
27
|
+
"schema": "./lazy-report/schema.json"
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.lazyReport = lazyReport;
|
|
4
|
+
const core_1 = require("@angular-devkit/core");
|
|
5
|
+
// Identifica i riferimenti agli store generati: XxxStoreActions/Selectors/State/Module/Service.
|
|
6
|
+
const STORE_REF = /\b([A-Z][A-Za-z0-9]*)Store(?:Actions|Selectors|State|Module|Service)\b/g;
|
|
7
|
+
function toRoot(p) {
|
|
8
|
+
return '/' + p.replace(/^\/+/, '').replace(/\/+$/, '');
|
|
9
|
+
}
|
|
10
|
+
function readJson(tree, file) {
|
|
11
|
+
const buf = tree.read(file);
|
|
12
|
+
if (!buf) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
return JSON.parse(buf.toString());
|
|
17
|
+
}
|
|
18
|
+
catch (_a) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function readPaths(tree) {
|
|
23
|
+
const paths = {
|
|
24
|
+
pathApp: 'src/app',
|
|
25
|
+
pathStore: 'src/app/root-store',
|
|
26
|
+
pathView: 'src/app/main/views',
|
|
27
|
+
};
|
|
28
|
+
const conf = readJson(tree, '/ngrx-entity-crud.conf.json');
|
|
29
|
+
if (conf) {
|
|
30
|
+
if (typeof conf.pathApp === 'string') {
|
|
31
|
+
paths.pathApp = conf.pathApp;
|
|
32
|
+
}
|
|
33
|
+
if (typeof conf.pathStore === 'string') {
|
|
34
|
+
paths.pathStore = conf.pathStore;
|
|
35
|
+
}
|
|
36
|
+
if (typeof conf.pathView === 'string') {
|
|
37
|
+
paths.pathView = conf.pathView;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return paths;
|
|
41
|
+
}
|
|
42
|
+
function listSubdirs(tree, dirPath) {
|
|
43
|
+
return tree.getDir(toRoot(dirPath)).subdirs.map((d) => d.toString());
|
|
44
|
+
}
|
|
45
|
+
function collectTsFiles(tree, dirPath) {
|
|
46
|
+
const out = [];
|
|
47
|
+
const root = toRoot(dirPath);
|
|
48
|
+
const dir = tree.getDir(root);
|
|
49
|
+
dir.subfiles.forEach((f) => {
|
|
50
|
+
const name = f.toString();
|
|
51
|
+
if (name.endsWith('.ts')) {
|
|
52
|
+
out.push(`${root}/${name}`);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
dir.subdirs.forEach((d) => {
|
|
56
|
+
out.push(...collectTsFiles(tree, `${root}/${d.toString()}`));
|
|
57
|
+
});
|
|
58
|
+
return out;
|
|
59
|
+
}
|
|
60
|
+
function storeKeysInContent(content, validKeys) {
|
|
61
|
+
const found = new Set();
|
|
62
|
+
let m;
|
|
63
|
+
STORE_REF.lastIndex = 0;
|
|
64
|
+
while ((m = STORE_REF.exec(content)) !== null) {
|
|
65
|
+
const key = core_1.strings.dasherize(m[1]);
|
|
66
|
+
if (validKeys.has(key)) {
|
|
67
|
+
found.add(key);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return found;
|
|
71
|
+
}
|
|
72
|
+
function detectType(tree, pathStore, info) {
|
|
73
|
+
const buf = tree.read(`${toRoot(pathStore)}/${info.name}/${info.key}.state.ts`);
|
|
74
|
+
if (!buf) {
|
|
75
|
+
return 'unknown';
|
|
76
|
+
}
|
|
77
|
+
const c = buf.toString();
|
|
78
|
+
if (c.indexOf('EntitySingleCrudState') !== -1 || c.indexOf('getInitialSingleCrudState') !== -1) {
|
|
79
|
+
return 'CRUD-SINGULAR';
|
|
80
|
+
}
|
|
81
|
+
if (c.indexOf('createEntityAdapter') !== -1 || c.indexOf('EntityCrudState') !== -1) {
|
|
82
|
+
return 'CRUD-PLURAL';
|
|
83
|
+
}
|
|
84
|
+
return 'unknown';
|
|
85
|
+
}
|
|
86
|
+
function verdict(info, lazySections) {
|
|
87
|
+
if (info.infra) {
|
|
88
|
+
return 'infra (eager)';
|
|
89
|
+
}
|
|
90
|
+
if (info.usedByShell) {
|
|
91
|
+
return 'tieni eager (usato dalla shell)';
|
|
92
|
+
}
|
|
93
|
+
if (info.sections.length === 0) {
|
|
94
|
+
return 'orfano? (nessuna sezione lo usa)';
|
|
95
|
+
}
|
|
96
|
+
if (info.sections.length > 1) {
|
|
97
|
+
return `multi-sezione (${info.sections.length}) -> valuta modulo condiviso`;
|
|
98
|
+
}
|
|
99
|
+
if (!lazySections.has(info.sections[0])) {
|
|
100
|
+
return 'sezione non lazy-routed -> lazy poco utile';
|
|
101
|
+
}
|
|
102
|
+
return 'candidato lazy';
|
|
103
|
+
}
|
|
104
|
+
function lazyReport(options) {
|
|
105
|
+
return (tree, context) => {
|
|
106
|
+
const paths = readPaths(tree);
|
|
107
|
+
const output = options.output === undefined ? 'lazy-report.md' : options.output;
|
|
108
|
+
const format = options.format || 'md';
|
|
109
|
+
const infraStores = options.infraStores && options.infraStores.length ? options.infraStores : ['router-store'];
|
|
110
|
+
// 1. Scopri gli store (sottocartelle *-store di pathStore).
|
|
111
|
+
const stores = new Map();
|
|
112
|
+
listSubdirs(tree, paths.pathStore)
|
|
113
|
+
.filter((d) => d.endsWith('-store'))
|
|
114
|
+
.forEach((folder) => {
|
|
115
|
+
const key = folder.replace(/-store$/, '');
|
|
116
|
+
const info = {
|
|
117
|
+
name: folder,
|
|
118
|
+
key,
|
|
119
|
+
clazz: core_1.strings.classify(key),
|
|
120
|
+
type: 'unknown',
|
|
121
|
+
infra: infraStores.indexOf(folder) !== -1,
|
|
122
|
+
sections: [],
|
|
123
|
+
usedByShell: false,
|
|
124
|
+
};
|
|
125
|
+
info.type = detectType(tree, paths.pathStore, info);
|
|
126
|
+
stores.set(key, info);
|
|
127
|
+
});
|
|
128
|
+
const validKeys = new Set(stores.keys());
|
|
129
|
+
// 2. Mappa sezione -> store (scansione dei .ts di ogni view).
|
|
130
|
+
const sections = listSubdirs(tree, paths.pathView);
|
|
131
|
+
sections.forEach((section) => {
|
|
132
|
+
const used = new Set();
|
|
133
|
+
collectTsFiles(tree, `${paths.pathView}/${section}`).forEach((file) => {
|
|
134
|
+
const buf = tree.read(file);
|
|
135
|
+
if (buf) {
|
|
136
|
+
storeKeysInContent(buf.toString(), validKeys).forEach((k) => used.add(k));
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
used.forEach((k) => {
|
|
140
|
+
const info = stores.get(k);
|
|
141
|
+
if (info) {
|
|
142
|
+
info.sections.push(section);
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
// 3. Uso dallo shell (core/, main/components, app.component/app.module): non lazy-izzabile.
|
|
147
|
+
const shellFiles = [
|
|
148
|
+
`${toRoot(paths.pathApp)}/app.component.ts`,
|
|
149
|
+
`${toRoot(paths.pathApp)}/app.module.ts`,
|
|
150
|
+
];
|
|
151
|
+
[`${paths.pathApp}/core`, `${paths.pathApp}/main/components`].forEach((d) => {
|
|
152
|
+
shellFiles.push(...collectTsFiles(tree, d));
|
|
153
|
+
});
|
|
154
|
+
shellFiles.forEach((file) => {
|
|
155
|
+
const buf = tree.read(file);
|
|
156
|
+
if (buf) {
|
|
157
|
+
storeKeysInContent(buf.toString(), validKeys).forEach((k) => {
|
|
158
|
+
const info = stores.get(k);
|
|
159
|
+
if (info) {
|
|
160
|
+
info.usedByShell = true;
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
// 4. Sezioni su rotta lazy (loadChildren in app-routing.module.ts).
|
|
166
|
+
const routingBuf = tree.read(`${toRoot(paths.pathApp)}/app-routing.module.ts`);
|
|
167
|
+
const routingContent = routingBuf ? routingBuf.toString() : '';
|
|
168
|
+
const lazySections = new Set();
|
|
169
|
+
sections.forEach((section) => {
|
|
170
|
+
if (routingContent.indexOf(`views/${section}/${section}.module`) !== -1) {
|
|
171
|
+
lazySections.add(section);
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
// 5. Componi il report.
|
|
175
|
+
const rows = Array.from(stores.values()).sort((a, b) => a.name.localeCompare(b.name));
|
|
176
|
+
const candidates = rows.filter((s) => verdict(s, lazySections) === 'candidato lazy');
|
|
177
|
+
const md = [];
|
|
178
|
+
md.push('# Lazy store report', '');
|
|
179
|
+
md.push('Generato da `ngrx-entity-crud:lazy-report`.', '');
|
|
180
|
+
md.push(`Path analizzati: store=\`${paths.pathStore}\`, views=\`${paths.pathView}\`, app=\`${paths.pathApp}\`.`, '');
|
|
181
|
+
md.push('## Store -> sezioni', '');
|
|
182
|
+
md.push('| store | clazz | type | sezioni | n | lazy route | shell | verdetto |');
|
|
183
|
+
md.push('|---|---|---|---|---|---|---|---|');
|
|
184
|
+
rows.forEach((s) => {
|
|
185
|
+
const lazyRoute = s.sections.length === 0
|
|
186
|
+
? '-'
|
|
187
|
+
: s.sections.every((x) => lazySections.has(x))
|
|
188
|
+
? 'si'
|
|
189
|
+
: 'no/parziale';
|
|
190
|
+
md.push(`| ${s.name} | ${s.clazz} | ${s.type} | ${s.sections.join(', ') || '-'} | ${s.sections.length} | ${lazyRoute} | ${s.usedByShell ? 'si' : 'no'} | ${verdict(s, lazySections)} |`);
|
|
191
|
+
});
|
|
192
|
+
md.push('', '## Candidati lazy', '');
|
|
193
|
+
if (candidates.length === 0) {
|
|
194
|
+
md.push('_Nessun candidato lazy individuato._');
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
candidates.forEach((s) => {
|
|
198
|
+
const type = s.type === 'unknown' ? 'CRUD-PLURAL' : s.type;
|
|
199
|
+
md.push(`- **${s.clazz}** (\`${s.name}\`), usato da \`${s.sections[0]}\`:`);
|
|
200
|
+
md.push(` - \`ng generate ngrx-entity-crud:store --clazz=${s.clazz} --type=${type} --registration=lazy\``);
|
|
201
|
+
md.push(` - poi importa \`${s.clazz}StoreModule\` nel modulo \`${s.sections[0]}.module.ts\` della view.`);
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
md.push('', '## Note', '');
|
|
205
|
+
md.push('- Analisi statica basata sulle convenzioni di naming (`XxxStoreActions/Selectors/State/Module`).');
|
|
206
|
+
md.push('- Verifica manuale per accoppiamenti nascosti (effect/selettori che combinano piu store).');
|
|
207
|
+
md.push('- Gli store usati dallo shell (`core/`, `main/components`, `app.component`) restano eager.');
|
|
208
|
+
const reportMd = md.join('\n') + '\n';
|
|
209
|
+
const jsonReport = {
|
|
210
|
+
paths,
|
|
211
|
+
stores: rows.map((s) => ({
|
|
212
|
+
name: s.name,
|
|
213
|
+
clazz: s.clazz,
|
|
214
|
+
type: s.type,
|
|
215
|
+
infra: s.infra,
|
|
216
|
+
sections: s.sections,
|
|
217
|
+
usedByShell: s.usedByShell,
|
|
218
|
+
verdict: verdict(s, lazySections),
|
|
219
|
+
})),
|
|
220
|
+
};
|
|
221
|
+
// 6. Output: console sempre, file se richiesto.
|
|
222
|
+
context.logger.info(reportMd);
|
|
223
|
+
context.logger.info(`Store: ${rows.length} | sezioni: ${sections.length} | candidati lazy: ${candidates.length}`);
|
|
224
|
+
if (output) {
|
|
225
|
+
const outPath = toRoot(output);
|
|
226
|
+
const content = format === 'json' ? JSON.stringify(jsonReport, null, 2) + '\n' : reportMd;
|
|
227
|
+
if (tree.exists(outPath)) {
|
|
228
|
+
tree.overwrite(outPath, content);
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
tree.create(outPath, content);
|
|
232
|
+
}
|
|
233
|
+
context.logger.info(`Report scritto in ${outPath}`);
|
|
234
|
+
}
|
|
235
|
+
return tree;
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}
|