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.
Files changed (49) hide show
  1. package/README.md +67 -26
  2. package/package.json +1 -1
  3. package/schematics/collection.json +4 -4
  4. package/schematics/lazy-report/index.d.ts +2 -0
  5. package/schematics/lazy-report/index.js +238 -0
  6. package/schematics/lazy-report/index.js.map +1 -0
  7. package/schematics/lazy-report/index.ts +279 -0
  8. package/schematics/lazy-report/schema.d.ts +18 -0
  9. package/schematics/lazy-report/schema.json +28 -0
  10. package/schematics/my-utility.d.ts +0 -16
  11. package/schematics/my-utility.js +0 -34
  12. package/schematics/my-utility.js.map +1 -1
  13. package/schematics/my-utility.ts +0 -51
  14. package/schematics/ng-add/files/src/app/app.component.ts +3 -16
  15. package/schematics/ng-add/files/src/app/app.module.ts +6 -2
  16. package/schematics/ng-add/files/src/app/core/theme/components/footer.component.ts +1 -0
  17. package/schematics/ng-add/files/src/app/core/theme/components/header.component.ts +1 -5
  18. package/schematics/ng-add/files/src/app/core/theme/components/main.component.ts +3 -4
  19. package/schematics/ng-add/files/src/app/core/theme/components/menu-item.component.ts +3 -5
  20. package/schematics/ng-add/files/src/app/core/theme/components/progress.component.ts +2 -6
  21. package/schematics/ng-add/files/src/app/core/theme/components/slide-menu-pro.component.ts +1 -6
  22. package/schematics/ng-add/files/src/app/core/theme/components/slide-menu.component.ts +1 -7
  23. package/schematics/ng-add/files/src/app/core/theme/theme-jng.module.ts +22 -18
  24. package/schematics/ng-add/files/src/app/root-store/selectors.ts +80 -19
  25. package/schematics/store/index.js +24 -14
  26. package/schematics/store/index.js.map +1 -1
  27. package/schematics/store/index.ts +26 -15
  28. package/schematics/store/schema.d.ts +8 -0
  29. package/schematics/store/schema.json +16 -0
  30. package/schematics/auth0/files/store/auth-store/actions.ts +0 -21
  31. package/schematics/auth0/files/store/auth-store/auth-store.module.ts +0 -32
  32. package/schematics/auth0/files/store/auth-store/auth.guard.ts +0 -44
  33. package/schematics/auth0/files/store/auth-store/authentication.service.ts +0 -32
  34. package/schematics/auth0/files/store/auth-store/conf.ts +0 -2
  35. package/schematics/auth0/files/store/auth-store/effects.ts +0 -59
  36. package/schematics/auth0/files/store/auth-store/index.d.ts +0 -13
  37. package/schematics/auth0/files/store/auth-store/index.ts +0 -13
  38. package/schematics/auth0/files/store/auth-store/login.component.ts +0 -75
  39. package/schematics/auth0/files/store/auth-store/names.ts +0 -3
  40. package/schematics/auth0/files/store/auth-store/profile.ts +0 -12
  41. package/schematics/auth0/files/store/auth-store/reducer.ts +0 -23
  42. package/schematics/auth0/files/store/auth-store/selectors.ts +0 -24
  43. package/schematics/auth0/files/store/auth-store/state.ts +0 -11
  44. package/schematics/auth0/index.d.ts +0 -2
  45. package/schematics/auth0/index.js +0 -66
  46. package/schematics/auth0/index.js.map +0 -1
  47. package/schematics/auth0/index.ts +0 -76
  48. package/schematics/auth0/schema.d.ts +0 -21
  49. 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
- - `auth0`: Generates Auth0 implementation containing an `store section` and `components` file.
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
- ## auth0
265
+ ## lazy-report
246
266
 
247
267
  ---
248
268
 
249
269
  ### Overview
250
270
 
251
- Generates a boilerplate for authentication implementation containing an `store section` and `components` file.
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:auth0
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:auth0
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
- #### Files generated/changed by the “:auth0” command
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
- UPDATE src/app/root-store/index.ts (309 bytes)
284
- UPDATE src/app/root-store/index.d.ts (309 bytes)
285
- UPDATE src/app/root-store/__clazz@dasherize__.state.ts (184 bytes)
286
- UPDATE src/app/root-store/root-store.module.ts (1051 bytes)
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngrx-entity-crud",
3
- "version": "19.2.5",
3
+ "version": "19.4.0-beta.4",
4
4
  "repository": "https://github.com/jucasoft/ngrx-entity-crud",
5
5
  "license": "MIT",
6
6
  "schematics": "./schematics/collection.json",
@@ -21,10 +21,10 @@
21
21
  "factory": "./ng-add/index#ngAdd",
22
22
  "schema": "./ng-add/schema.json"
23
23
  },
24
- "auth0": {
25
- "description": "add Auth0 login integration",
26
- "factory": "./auth0/index#makeAuth0",
27
- "schema": "./auth0/schema.json"
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,2 @@
1
+ import { Rule } from '@angular-devkit/schematics';
2
+ export declare function lazyReport(options: LazyReport): Rule;
@@ -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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"}