Skip to content

Commit 36cd069

Browse files
dunglasmysiar
authored andcommitted
Mercure support and various improvements (see description) (#94)
1 parent 0e0c8cc commit 36cd069

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+1213
-851
lines changed

.travis.yml

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
language: node_js
22
node_js:
3+
- '11'
34
- '10'
45
- '8'
5-
- '6'
66

77
cache:
88
directories:
@@ -13,6 +13,7 @@ script:
1313
- yarn test
1414
- yarn lint
1515
- yarn test-gen
16+
- yarn test-gen-cs
1617
- yarn test-gen-env
1718
- yarn check
1819

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
"build": "babel src -d lib --ignore '*.test.js'",
5252
"watch": "babel --watch src -d lib --ignore '*.test.js'",
5353
"test-gen": "rm -rf ./tmp && npm run build && ./lib/index.js https://demo.api-platform.com ./tmp/react && ./lib/index.js https://demo.api-platform.com ./tmp/react-native -g react-native && ./lib/index.js https://demo.api-platform.com ./tmp/vue -g vue && ./lib/index.js https://demo.api-platform.com ./tmp/admin-on-rest -g admin-on-rest",
54+
"test-gen-cs": "./node_modules/.bin/prettier --single-quote -l \"./tmp/react/**/*.{js,jsx,ts,tsx,json,css,scss,md}\"",
5455
"test-gen-swagger": "rm -rf ./tmp && npm run build && ./lib/index.js https://demo.api-platform.com/docs.json ./tmp/react -f swagger && ./lib/index.js https://demo.api-platform.com/docs.json ./tmp/react-native -g react-native -f swagger && ./lib/index.js https://demo.api-platform.com/docs.json ./tmp/vue -g vue -f swagger && ./lib/index.js https://demo.api-platform.com/docs.json ./tmp/admin-on-rest -g admin-on-rest -f swagger",
5556
"test-gen-env": "rm -rf ./tmp && npm run build && API_PLATFORM_CLIENT_GENERATOR_ENTRYPOINT=https://demo.api-platform.com API_PLATFORM_CLIENT_GENERATOR_OUTPUT=./tmp ./lib/index.js"
5657
},

src/generators/AdminOnRestGenerator.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,6 @@ export default class extends BaseGenerator {
6464

6565
this.appendFile("resource-import.js", `${dir}/resource-import.js`, context);
6666

67-
this.createEntrypoint(api.entrypoint, `${dir}/config/_entrypoint.js`);
67+
this.createEntrypoint(api.entrypoint, `${dir}/config/entrypoint.js`);
6868
}
6969
}

src/generators/AdminOnRestGenerator.test.js

+3-5
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,9 @@ test("Generate a Admin On Rest app", () => {
3434
});
3535
generator.generate(api, resource, tmpobj.name);
3636

37-
[
38-
"/config/_entrypoint.js",
39-
"/resources/abc.js",
40-
"/resource-import.js"
41-
].forEach(file => expect(fs.existsSync(tmpobj.name + file)).toBe(true));
37+
["/config/entrypoint.js", "/resources/abc.js", "/resource-import.js"].forEach(
38+
file => expect(fs.existsSync(tmpobj.name + file)).toBe(true)
39+
);
4240

4341
["/components/abc.js", "/config/abc.js"].forEach(file => {
4442
expect(fs.existsSync(tmpobj.name + file)).toBe(true);

src/generators/BaseGenerator.js

+8-14
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export default class {
1010
this.hydraPrefix = hydraPrefix;
1111
this.templateDirectory = templateDirectory;
1212

13-
this.registerTemplates("", ["_entrypoint.js"]);
13+
this.registerTemplates("", ["entrypoint.js"]);
1414
}
1515

1616
registerTemplates(basePath, paths) {
@@ -52,7 +52,7 @@ export default class {
5252
}
5353

5454
createEntrypoint(entrypoint, dest) {
55-
this.createFile("_entrypoint.js", dest, { entrypoint }, false);
55+
this.createFile("entrypoint.js", dest, { entrypoint }, false);
5656
}
5757

5858
getHtmlInputTypeFromField(field) {
@@ -88,17 +88,11 @@ export default class {
8888
}
8989
}
9090

91-
buildFields(apiFields) {
92-
let fields = [];
93-
for (let apiField of apiFields) {
94-
let field = this.getHtmlInputTypeFromField(apiField);
95-
field.required = apiField.required;
96-
field.name = apiField.name;
97-
field.description = apiField.description.replace(/"/g, "'"); // fix for Form placeholder description
98-
99-
fields.push(field);
100-
}
101-
102-
return fields;
91+
buildFields(fields) {
92+
return fields.map(field => ({
93+
...field,
94+
...this.getHtmlInputTypeFromField(field),
95+
description: field.description.replace(/"/g, "'") // fix for Form placeholder description
96+
}));
10397
}
10498
}

src/generators/ReactGenerator.js

+18-22
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ export default class extends BaseGenerator {
55
constructor(params) {
66
super(params);
77

8-
this.registerTemplates(`react-common/`, [
8+
this.registerTemplates("react-common/", [
99
// actions
1010
"actions/foo/create.js",
1111
"actions/foo/delete.js",
@@ -14,7 +14,7 @@ export default class extends BaseGenerator {
1414
"actions/foo/show.js",
1515

1616
// utils
17-
"utils/fetch.js",
17+
"utils/dataAccess.js",
1818

1919
// reducers
2020
"reducers/foo/create.js",
@@ -35,10 +35,7 @@ export default class extends BaseGenerator {
3535
"components/foo/Show.js",
3636

3737
// routes
38-
"routes/foo.js",
39-
40-
// utils
41-
"utils/helpers.js"
38+
"routes/foo.js"
4239
]);
4340
}
4441

@@ -61,7 +58,7 @@ import ${titleLc} from './reducers/${titleLc}/';
6158
import ${titleLc}Routes from './routes/${titleLc}';
6259
6360
// Add the reducer
64-
combineReducers(${titleLc},{/* ... */}),
61+
combineReducers({ ${titleLc},/* ... */ }),
6562
6663
// Add routes to <Switch>
6764
{ ${titleLc}Routes }
@@ -87,19 +84,17 @@ combineReducers(${titleLc},{/* ... */}),
8784

8885
// Create directories
8986
// These directories may already exist
90-
for (let dir of [`${dir}/utils`, `${dir}/config`, `${dir}/routes`]) {
91-
this.createDir(dir, false);
92-
}
87+
[`${dir}/utils`, `${dir}/config`, `${dir}/routes`].forEach(dir =>
88+
this.createDir(dir, false)
89+
);
9390

94-
for (let dir of [
91+
[
9592
`${dir}/actions/${lc}`,
9693
`${dir}/components/${lc}`,
9794
`${dir}/reducers/${lc}`
98-
]) {
99-
this.createDir(dir);
100-
}
95+
].forEach(dir => this.createDir(dir));
10196

102-
for (let pattern of [
97+
[
10398
// actions
10499
"actions/%s/create.js",
105100
"actions/%s/delete.js",
@@ -125,15 +120,16 @@ combineReducers(${titleLc},{/* ... */}),
125120

126121
// routes
127122
"routes/%s.js"
128-
]) {
129-
this.createFileFromPattern(pattern, dir, lc, context);
130-
}
123+
].forEach(pattern => this.createFileFromPattern(pattern, dir, lc, context));
131124

132125
// utils
133-
for (let file of ["utils/helpers.js", "utils/fetch.js"]) {
134-
this.createFile(file, `${dir}/${file}`, context, false);
135-
}
126+
this.createFile(
127+
"utils/dataAccess.js",
128+
`${dir}/utils/dataAccess.js`,
129+
context,
130+
false
131+
);
136132

137-
this.createEntrypoint(api.entrypoint, `${dir}/config/_entrypoint.js`);
133+
this.createEntrypoint(api.entrypoint, `${dir}/config/entrypoint.js`);
138134
}
139135
}

src/generators/ReactGenerator.test.js

+2-3
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,8 @@ test("Generate a React app", () => {
3535
generator.generate(api, resource, tmpobj.name);
3636

3737
[
38-
"/utils/fetch.js",
39-
"/utils/helpers.js",
40-
"/config/_entrypoint.js",
38+
"/utils/dataAccess.js",
39+
"/config/entrypoint.js",
4140

4241
"/actions/abc/create.js",
4342
"/actions/abc/delete.js",

src/generators/ReactNativeGenerator.js

+13-19
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export default class extends BaseGenerator {
2222
"actions/foo/show.js",
2323

2424
// utils
25-
"utils/fetch.js",
25+
"utils/dataAccess.js",
2626

2727
// reducers
2828
"reducers/foo/create.js",
@@ -68,7 +68,7 @@ export default class extends BaseGenerator {
6868
import ${titleLc} from './reducers/${titleLc}/';
6969
7070
// Add the reducer
71-
combineReducers(${titleLc},{/* ... */}),
71+
combineReducers({ ${titleLc}, /* ... */ }),
7272
`)
7373
);
7474
}
@@ -91,19 +91,17 @@ combineReducers(${titleLc},{/* ... */}),
9191

9292
// Create directories
9393
// These directories may already exist
94-
for (let dir of [`${dir}/utils`, `${dir}/config`, `${dir}/routes`]) {
95-
this.createDir(dir, false);
96-
}
94+
[`${dir}/utils`, `${dir}/config`, `${dir}/routes`].forEach(dir =>
95+
this.createDir(dir, false)
96+
);
9797

98-
for (let dir of [
98+
[
9999
`${dir}/actions/${lc}`,
100100
`${dir}/components/${lc}`,
101101
`${dir}/reducers/${lc}`
102-
]) {
103-
this.createDir(dir);
104-
}
102+
].forEach(dir => this.createDir(dir));
105103

106-
for (let pattern of [
104+
[
107105
// actions
108106
"actions/%s/create.js",
109107
"actions/%s/delete.js",
@@ -129,19 +127,15 @@ combineReducers(${titleLc},{/* ... */}),
129127

130128
// routes
131129
"routes/%s.js"
132-
]) {
133-
this.createFileFromPattern(pattern, dir, lc, context);
134-
}
130+
].forEach(pattern => this.createFileFromPattern(pattern, dir, lc, context));
135131

136-
for (let file of [
137-
"utils/fetch.js",
132+
[
133+
"utils/dataAccess.js",
138134
"utils/helpers.js",
139135
"components/Spinner.js",
140136
"components/Confirm.js"
141-
]) {
142-
this.createFile(file, `${dir}/${file}`);
143-
}
137+
].forEach(file => this.createFile(file, `${dir}/${file}`));
144138

145-
this.createEntrypoint(api.entrypoint, `${dir}/config/_entrypoint.js`);
139+
this.createEntrypoint(api.entrypoint, `${dir}/config/entrypoint.js`);
146140
}
147141
}

src/generators/ReactNativeGenerator.test.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ test("Generate a React app", () => {
3535
generator.generate(api, resource, tmpobj.name);
3636

3737
[
38-
"/utils/fetch.js",
39-
"/config/_entrypoint.js",
38+
"/utils/dataAccess.js",
39+
"/config/entrypoint.js",
4040

4141
"/actions/abc/create.js",
4242
"/actions/abc/delete.js",

src/generators/VueGenerator.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ export const store = new Vuex.Store({
177177
false
178178
);
179179

180-
this.createEntrypoint(api.entrypoint, `${dir}/config/_entrypoint.js`);
180+
this.createEntrypoint(api.entrypoint, `${dir}/config/entrypoint.js`);
181181
this.createFile(
182182
"utils/fetch.js",
183183
`${dir}/utils/fetch.js`,

src/generators/VueGenerator.test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ test("Generate a Vue app", () => {
4040
expect(fs.existsSync(tmpobj.name + "/components/foo/Show.vue")).toBe(true);
4141
expect(fs.existsSync(tmpobj.name + "/components/foo/Update.vue")).toBe(true);
4242

43-
expect(fs.existsSync(tmpobj.name + "/config/_entrypoint.js")).toBe(true);
43+
expect(fs.existsSync(tmpobj.name + "/config/entrypoint.js")).toBe(true);
4444

4545
expect(fs.existsSync(tmpobj.name + "/error/SubmissionError.js")).toBe(true);
4646

templates/_entrypoint.js

-1
This file was deleted.

templates/admin-on-rest/config/foo.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
export const configList = {
22
'@id': true,
33
{{#each fields}}
4-
{{{ name }}}: true,
4+
{{{name}}}: true,
55
{{/each}}
66
buttons: {
77
show: true,
@@ -15,7 +15,7 @@ export const configList = {
1515
export const configEdit = {
1616
'@id': true,
1717
{{#each fields}}
18-
{{{ name }}}: true,
18+
{{{name}}}: true,
1919
{{/each}}
2020
buttons: {
2121
show: true,
@@ -28,7 +28,7 @@ export const configEdit = {
2828
export const configCreate = {
2929
'@id': true,
3030
{{#each fields}}
31-
{{{ name }}}: true,
31+
{{{name}}}: true,
3232
{{/each}}
3333
buttons: {
3434
list: true,
@@ -38,7 +38,7 @@ export const configCreate = {
3838
export const configShow = {
3939
'@id': true,
4040
{{#each fields}}
41-
{{{ name }}}: true,
41+
{{{name}}}: true,
4242
{{/each}}
4343
buttons: {
4444
edit: true,

templates/entrypoint.js

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const ENTRYPOINT = '{{{entrypoint}}}';
+14-7
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,29 @@
11
import { SubmissionError } from 'redux-form';
2-
import fetch from '../../utils/fetch';
2+
import { fetch } from '../../utils/dataAccess';
33

44
export function error(error) {
5-
return {type: '{{{ uc }}}_CREATE_ERROR', error};
5+
return { type: '{{{uc}}}_CREATE_ERROR', error };
66
}
77

88
export function loading(loading) {
9-
return {type: '{{{ uc }}}_CREATE_LOADING', loading};
9+
return { type: '{{{uc}}}_CREATE_LOADING', loading };
1010
}
1111

1212
export function success(created) {
13-
return {type: '{{{ uc }}}_CREATE_SUCCESS', created};
13+
return { type: '{{{uc}}}_CREATE_SUCCESS', created };
1414
}
1515

1616
export function create(values) {
17-
return (dispatch) => {
17+
return dispatch => {
1818
dispatch(loading(true));
1919

20-
return fetch('/{{{ name }}}', {method: 'POST', body: JSON.stringify(values)})
20+
return fetch('/{{{name}}}', { method: 'POST', body: JSON.stringify(values) })
2121
.then(response => {
2222
dispatch(loading(false));
2323

2424
return response.json();
2525
})
26-
.then(data => dispatch(success(data)))
26+
.then(retrieved => dispatch(success(retrieved)))
2727
.catch(e => {
2828
dispatch(loading(false));
2929

@@ -36,3 +36,10 @@ export function create(values) {
3636
});
3737
};
3838
}
39+
40+
export function reset() {
41+
return dispatch => {
42+
dispatch(loading(false));
43+
dispatch(error(null));
44+
};
45+
}

0 commit comments

Comments
 (0)