Skip to content

Commit 31533a9

Browse files
committed
feat(domain): support ngrx for standalone components
1 parent efc5d3c commit 31533a9

File tree

8 files changed

+521
-335
lines changed

8 files changed

+521
-335
lines changed

.eslintrc.json

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,30 @@
5050
"sourceTag": "domain:shared",
5151
"onlyDependOnLibsWithTags": ["domain:shared"]
5252
},
53+
{
54+
"sourceTag": "domain:luggage",
55+
"onlyDependOnLibsWithTags": ["domain:luggage", "domain:shared"]
56+
},
57+
{
58+
"sourceTag": "domain:luggage",
59+
"onlyDependOnLibsWithTags": ["domain:luggage", "domain:shared"]
60+
},
61+
{
62+
"sourceTag": "domain:luggage",
63+
"onlyDependOnLibsWithTags": ["domain:luggage", "domain:shared"]
64+
},
65+
{
66+
"sourceTag": "domain:luggage",
67+
"onlyDependOnLibsWithTags": ["domain:luggage", "domain:shared"]
68+
},
69+
{
70+
"sourceTag": "domain:luggage",
71+
"onlyDependOnLibsWithTags": ["domain:luggage", "domain:shared"]
72+
},
73+
{
74+
"sourceTag": "domain:luggage",
75+
"onlyDependOnLibsWithTags": ["domain:luggage", "domain:shared"]
76+
},
5377
{
5478
"sourceTag": "domain:luggage",
5579
"onlyDependOnLibsWithTags": ["domain:luggage", "domain:shared"]
Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
import { HttpClientModule } from '@angular/common/http';
22
import { enableProdMode, importProvidersFrom } from '@angular/core';
33
import { bootstrapApplication } from '@angular/platform-browser';
4+
<% if (ngrx) { %>
5+
import { EffectsModule } from '@ngrx/effects';
6+
import { StoreModule } from '@ngrx/store';
7+
import { StoreDevtoolsModule } from '@ngrx/store-devtools';
8+
import { provide<%=className%>Domain } from '@<%=npmScope%>/<%=fileName%>/domain';
9+
<% } %>
410
import { AppComponent } from './app/app.component';
5-
611
import { environment } from './environments/environment';
712

813
if (environment.production) {
@@ -11,6 +16,10 @@ if (environment.production) {
1116

1217
bootstrapApplication(AppComponent,{
1318
providers: [
14-
importProvidersFrom(HttpClientModule)
19+
importProvidersFrom(HttpClientModule), <% if (ngrx) { %>
20+
importProvidersFrom(StoreModule.forRoot({})),
21+
importProvidersFrom(EffectsModule.forRoot()),
22+
... (!environment.production) ? [importProvidersFrom(StoreDevtoolsModule.instrument())] : [],
23+
provide<%=className%>Domain() <% } %>
1524
]
1625
});
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './lib/providers';
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { importProvidersFrom } from '@angular/core';
2+
import { EffectsModule } from '@ngrx/effects';
3+
import { StoreModule } from '@ngrx/store';
4+
5+
export function provide<%=className%>Domain() {
6+
return [
7+
];
8+
}

libs/ddd/src/generators/domain/index.ts

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { insertNgModuleImport } from '@nrwl/angular/src/generators/utils';
99
import * as ts from 'typescript';
1010
import { NGRX_VERSION } from '../utils/ngrx-version';
1111

12-
function convertToStandaloneApp (tree: Tree, options: { name: string, srcRoot: string, npmScope: string}) {
12+
function convertToStandaloneApp (tree: Tree, options: { name: string, srcRoot: string, npmScope: string, ngrx: boolean}) {
1313
// const mainPath = joinPathFragments(options.srcRoot, 'main.ts');
1414
// const appComponentPath = joinPathFragments(options.srcRoot, 'app/app.component.ts');
1515
const appModulePath = joinPathFragments(options.srcRoot, 'app/app.module.ts');
@@ -24,6 +24,7 @@ function convertToStandaloneApp (tree: Tree, options: { name: string, srcRoot: s
2424
joinPathFragments(__dirname, './files/standalone-app'),
2525
options.srcRoot,
2626
{
27+
ngrx: options.ngrx,
2728
npmScope: names(options.npmScope).fileName,
2829
...names(options.name),
2930
tmpl: '',
@@ -57,6 +58,7 @@ export default async function (tree: Tree, options: DomainOptions) {
5758
.join('-');
5859
const libFolderPath = `libs/${libNameAndDirectory}`;
5960
const libLibFolder = `${libFolderPath}/domain/src/lib`;
61+
const libSrcFolder = `${libFolderPath}/domain/src`;
6062

6163
// if (options.ngrx && !options.addApp) {
6264
// throw new Error(
@@ -106,12 +108,17 @@ export default async function (tree: Tree, options: DomainOptions) {
106108
if (options.addApp && options.standalone) {
107109
convertToStandaloneApp(tree, {
108110
name: options.name,
111+
ngrx: options.ngrx || false,
109112
srcRoot: appSrcFolder,
110113
npmScope: wsConfig.npmScope
111114
});
112115
}
113116

114117
if (options.addApp && options.ngrx) {
118+
addNgrxDependencies(tree);
119+
}
120+
121+
if (!options.standalone && options.addApp && options.ngrx) {
115122
const generateStore = wrapAngularDevkitSchematic('@ngrx/schematics', 'store');
116123

117124
await generateStore(tree, {
@@ -121,9 +128,20 @@ export default async function (tree: Tree, options: DomainOptions) {
121128
module: 'app.module.ts',
122129
name: 'state',
123130
});
124-
131+
125132
addNgrxImportsToApp(tree, appModuleFilepath);
126-
addNgrxDependencies(tree);
133+
}
134+
135+
if (options.ngrx && options.standalone) {
136+
generateFiles(tree,
137+
joinPathFragments(__dirname, './files/standalone-lib'),
138+
libSrcFolder,
139+
{
140+
...options,
141+
...names(options.name),
142+
tmpl: ''
143+
}
144+
)
127145
}
128146

129147
await formatFiles(tree);

libs/ddd/src/generators/feature/index.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
installPackagesTask,
55
generateFiles,
66
joinPathFragments,
7+
names,
78
} from '@nrwl/devkit';
89
import { libraryGenerator } from '@nrwl/angular/generators';
910
import { FeatureOptions } from './schema';
@@ -12,6 +13,7 @@ import { addTsExport } from '../utils/add-ts-exports';
1213
import {
1314
addDeclarationWithExportToNgModule,
1415
addImportToNgModule,
16+
addImportToTsModule,
1517
} from '../utils/addToNgModule';
1618
import { addNgrxImportsToDomain } from '../utils/add-ngrx-imports-to-domain';
1719
import { fileContains } from '../utils/fileContains';
@@ -162,12 +164,50 @@ export default async function (tree: Tree, options: FeatureOptions) {
162164
});
163165
}
164166

167+
if (options.standalone && options.ngrx) {
168+
updateProviders(tree, {
169+
domainLibFolderPath,
170+
entity: options.entity
171+
});
172+
}
173+
165174
await formatFiles(tree);
166175
return () => {
167176
installPackagesTask(tree);
168177
};
169178
}
170179

180+
function updateProviders(tree: Tree, options: { entity: string, domainLibFolderPath: string }) {
181+
const entityNames = names(options.entity);
182+
183+
addImportToTsModule(tree, {
184+
filePath: `${options.domainLibFolderPath}/providers.ts`,
185+
importClassName: `${entityNames.className}Effects`,
186+
importPath: `./+state/${entityNames.fileName}/${entityNames.fileName}.effects`
187+
});
188+
189+
addImportToTsModule(tree, {
190+
filePath: `${options.domainLibFolderPath}/providers.ts`,
191+
importClassName: `${entityNames.constantName}_FEATURE_KEY`,
192+
importPath: `./+state/${entityNames.fileName}/${entityNames.fileName}.reducer`
193+
});
194+
195+
addImportToTsModule(tree, {
196+
filePath: `${options.domainLibFolderPath}/providers.ts`,
197+
importClassName: `reducer`,
198+
importPath: `./+state/${entityNames.fileName}/${entityNames.fileName}.reducer`
199+
});
200+
201+
const providersToAdd = `
202+
importProvidersFrom(StoreModule.forFeature(${entityNames.constantName}_FEATURE_KEY, reducer)),
203+
importProvidersFrom(EffectsModule.forFeature([${entityNames.className}Effects])),
204+
]`;
205+
206+
const providers = tree.read(`${options.domainLibFolderPath}/providers.ts`, 'utf-8');
207+
const updated = providers.replace(']', providersToAdd);
208+
tree.write(`${options.domainLibFolderPath}/providers.ts`, updated);
209+
}
210+
171211
function wireUpNgModules(
172212
tree: Tree,
173213
{

0 commit comments

Comments
 (0)