Skip to content

Commit 15bc0df

Browse files
feat(schematics): add the ability to create actions with the prefix (#3025)
1 parent 3b565b4 commit 15bc0df

File tree

9 files changed

+67
-27
lines changed

9 files changed

+67
-27
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import * as from<%= classify(name) %> from './<%= dasherize(name) %>.actions';
22

3-
describe('load<%= classify(name) %>s', () => {
3+
describe('<%= prefix %><%= classify(name) %>s', () => {
44
it('should return an action', () => {
5-
expect(from<%= classify(name) %>.load<%= classify(name) %>s().type).toBe('[<%= classify(name) %>] Load <%= classify(name) %>s');
5+
expect(from<%= classify(name) %>.<%= prefix %><%= classify(name) %>s().type).toBe('[<%= classify(name) %>] <%= classify(prefix) %> <%= classify(name) %>s');
66
});
77
});
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import { createAction, props } from '@ngrx/store';
22

3-
export const load<%= classify(name) %>s = createAction(
4-
'[<%= classify(name) %>] Load <%= classify(name) %>s'
3+
export const <%= prefix %><%= classify(name) %>s = createAction(
4+
'[<%= classify(name) %>] <%= classify(prefix) %> <%= classify(name) %>s'
55
);
66

7-
<% if (api) { %>export const load<%= classify(name) %>sSuccess = createAction(
8-
'[<%= classify(name) %>] Load <%= classify(name) %>s Success',
7+
<% if (api) { %>export const <%= prefix %><%= classify(name) %>sSuccess = createAction(
8+
'[<%= classify(name) %>] <%= classify(prefix) %> <%= classify(name) %>s Success',
99
props<{ data: any }>()
1010
);<% } %>
1111

12-
<% if (api) { %>export const load<%= classify(name) %>sFailure = createAction(
13-
'[<%= classify(name) %>] Load <%= classify(name) %>s Failure',
12+
<% if (api) { %>export const <%= prefix %><%= classify(name) %>sFailure = createAction(
13+
'[<%= classify(name) %>] <%= classify(prefix) %> <%= classify(name) %>s Failure',
1414
props<{ error: any }>()
1515
);<% } %>

modules/schematics/src/action/files/__name@dasherize@if-flat__/__name@dasherize__.actions.spec.ts.template

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@ import * as <%= classify(name) %>Actions from './<%= dasherize(name) %>.actions'
22

33
describe('<%= classify(name) %>', () => {
44
it('should create an instance', () => {
5-
expect(new <%= classify(name)%>Actions.Load<%= classify(name) %>s()).toBeTruthy();
5+
expect(new <%= classify(name)%>Actions.<%= prefix %><%= classify(name) %>s()).toBeTruthy();
66
});
77
});
Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
11
import { Action } from '@ngrx/store';
22

33
export enum <%= classify(name) %>ActionTypes {
4-
Load<%= classify(name) %>s = '[<%= classify(name) %>] Load <%= classify(name) %>s',
5-
<% if (api) { %>Load<%= classify(name) %>sSuccess = '[<%= classify(name) %>] Load <%= classify(name) %>s Success',<% } %>
6-
<% if (api) { %>Load<%= classify(name) %>sFailure = '[<%= classify(name) %>] Load <%= classify(name) %>s Failure',<% } %>
4+
<%= prefix %><%= classify(name) %>s = '[<%= classify(name) %>] <%= prefix %> <%= classify(name) %>s',
5+
<% if (api) { %><%= prefix %><%= classify(name) %>sSuccess = '[<%= classify(name) %>] <%= prefix %> <%= classify(name) %>s Success',<% } %>
6+
<% if (api) { %><%= prefix %><%= classify(name) %>sFailure = '[<%= classify(name) %>] <%= prefix %> <%= classify(name) %>s Failure',<% } %>
77
}
88

9-
export class Load<%= classify(name) %>s implements Action {
10-
readonly type = <%= classify(name) %>ActionTypes.Load<%= classify(name) %>s;
9+
export class <%= prefix %><%= classify(name) %>s implements Action {
10+
readonly type = <%= classify(name) %>ActionTypes.<%= prefix %><%= classify(name) %>s;
1111
}
1212
<% if (api) { %>
13-
export class Load<%= classify(name) %>sSuccess implements Action {
14-
readonly type = <%= classify(name) %>ActionTypes.Load<%= classify(name) %>sSuccess;
13+
export class <%= prefix %><%= classify(name) %>sSuccess implements Action {
14+
readonly type = <%= classify(name) %>ActionTypes.<%= prefix %><%= classify(name) %>sSuccess;
1515
constructor(public payload: { data: any }) { }
1616
}
1717

18-
export class Load<%= classify(name) %>sFailure implements Action {
19-
readonly type = <%= classify(name) %>ActionTypes.Load<%= classify(name) %>sFailure;
18+
export class <%= prefix %><%= classify(name) %>sFailure implements Action {
19+
readonly type = <%= classify(name) %>ActionTypes.<%= prefix %><%= classify(name) %>sFailure;
2020
constructor(public payload: { error: any }) { }
2121
}
2222
<% } %>
23-
<% if (api) { %>export type <%= classify(name) %>Actions = Load<%= classify(name) %>s | Load<%= classify(name) %>sSuccess | Load<%= classify(name) %>sFailure;<% } %>
24-
<% if (!api) { %>export type <%= classify(name) %>Actions = Load<%= classify(name) %>s;<% } %>
23+
<% if (api) { %>export type <%= classify(name) %>Actions = <%= prefix %><%= classify(name) %>s | <%= prefix %><%= classify(name) %>sSuccess | <%= prefix %><%= classify(name) %>sFailure;<% } %>
24+
<% if (!api) { %>export type <%= classify(name) %>Actions = <%= prefix %><%= classify(name) %>s;<% } %>

modules/schematics/src/action/index.spec.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
defaultWorkspaceOptions,
1111
defaultAppOptions,
1212
} from '@ngrx/schematics-core/testing';
13+
import { capitalize } from '../../schematics-core/utility/strings';
1314

1415
describe('Action Schematic', () => {
1516
const schematicRunner = new SchematicTestRunner(
@@ -18,6 +19,7 @@ describe('Action Schematic', () => {
1819
);
1920
const defaultOptions: ActionOptions = {
2021
name: 'foo',
22+
prefix: 'load',
2123
project: 'bar',
2224
group: false,
2325
flat: true,
@@ -173,6 +175,28 @@ describe('Action Schematic', () => {
173175
expect(fileContent).toMatch(/\[Foo\] Load Foos Failure/);
174176
expect(fileContent).toMatch(/props<{ error: any }>\(\)/);
175177
});
178+
179+
it.each(['load', 'delete', 'update'])(
180+
'should create a action with prefix',
181+
async (prefix) => {
182+
const tree = await schematicRunner
183+
.runSchematicAsync(
184+
'action',
185+
{ ...creatorDefaultOptions, prefix: prefix },
186+
appTree
187+
)
188+
.toPromise();
189+
const fileContent = tree.readContent(
190+
`${projectPath}/src/app/foo.actions.ts`
191+
);
192+
expect(fileContent).toMatch(
193+
new RegExp(`export const ${prefix}Foos = createAction`)
194+
);
195+
expect(fileContent).toMatch(
196+
new RegExp(`'\\[Foo] ${capitalize(prefix)} Foos'`)
197+
);
198+
}
199+
);
176200
});
177201

178202
describe('api', () => {

modules/schematics/src/action/index.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import {
22
Rule,
3-
SchematicsException,
43
apply,
54
applyTemplates,
65
branchAndMerge,
@@ -9,22 +8,22 @@ import {
98
mergeWith,
109
move,
1110
noop,
12-
template,
1311
url,
1412
Tree,
1513
SchematicContext,
1614
} from '@angular-devkit/schematics';
1715
import { Schema as ActionOptions } from './schema';
18-
import {
19-
getProjectPath,
20-
stringUtils,
21-
parseName,
22-
} from '@ngrx/schematics/schematics-core';
16+
import { getProjectPath, stringUtils, parseName } from '../../schematics-core';
17+
import { capitalize, camelize } from '../../schematics-core/utility/strings';
2318

2419
export default function (options: ActionOptions): Rule {
2520
return (host: Tree, context: SchematicContext) => {
2621
options.path = getProjectPath(host, options);
2722

23+
options.prefix = options.creators
24+
? camelize(options.prefix || 'load')
25+
: capitalize(options.prefix || 'load');
26+
2827
const parsedPath = parseName(options.path, options.name);
2928
options.name = parsedPath.name;
3029
options.path = parsedPath.path;

modules/schematics/src/action/schema.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,12 @@
1313
},
1414
"x-prompt": "What should be the name of the action?"
1515
},
16+
"prefix": {
17+
"description": "The prefix of the action.",
18+
"type": "string",
19+
"default": "load",
20+
"x-prompt": "What should be the prefix of the action?"
21+
},
1622
"path": {
1723
"type": "string",
1824
"format": "path",

modules/schematics/src/action/schema.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ export interface Schema {
44
*/
55
name: string;
66

7+
/**
8+
* The prefix for the actions.
9+
*/
10+
prefix: string;
11+
712
/**
813
* The path to create the component.
914
*/

projects/ngrx.io/content/guide/schematics/action.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,12 @@ Generate a spec file alongside the action file.
6060
- Type: `boolean`
6161
- Default: `false`
6262

63+
Specify the prefix for the actions.
64+
65+
- `--prefix`
66+
- Type: `string`
67+
- Default: `load`
68+
6369
## Examples
6470

6571
Generate a `User` actions file with an associated spec file.

0 commit comments

Comments
 (0)