Skip to content

Commit a5bf833

Browse files
authored
Configure Prettier. Adapt the Travis setup. (#80)
* Configure Prettier. Adapt the Travis setup. * Fix
1 parent 0000d72 commit a5bf833

17 files changed

+682
-492
lines changed

.eslintrc.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,16 @@ module.exports = {
66
},
77
'parser': 'babel-eslint',
88
'parserOptions': {
9-
ecmaVersion: 7,
10-
sourceType: 'module'
9+
'ecmaVersion': 7,
10+
'sourceType': 'module'
1111
},
1212
'plugins': ['import'],
13-
'extends': 'eslint:recommended',
14-
'rules':{
13+
'extends': [
14+
'plugin:prettier/recommended',
15+
'eslint:recommended',
16+
],
17+
'rules': {
18+
'prettier/prettier': 'error',
1519
'no-console': 0,
1620
}
1721
};

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
language: node_js
22
node_js:
3+
- '10'
34
- '8'
4-
- '7'
55
- '6'
66

77
cache:

package.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,11 @@
2525
"babel-preset-es2015": "^6.24.0",
2626
"babel-preset-stage-0": "^6.22.0",
2727
"eslint": "^3.18.0",
28+
"eslint-config-prettier": "^2.9.0",
2829
"eslint-plugin-import": "^2.2.0",
30+
"eslint-plugin-prettier": "^2.6.0",
2931
"jest": "^23",
32+
"prettier": "^1.13.2",
3033
"tmp": "^0.0.31"
3134
},
3235
"dependencies": {
@@ -43,6 +46,8 @@
4346
"scripts": {
4447
"test": "jest",
4548
"lint": "eslint src",
49+
"fix": "eslint --fix src",
50+
"eslint-check": "eslint --print-config .eslintrc.js | eslint-config-prettier-check",
4651
"build": "babel src -d lib --ignore '*.test.js'",
4752
"watch": "babel --watch src -d lib --ignore '*.test.js'",
4853
"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",

src/generators.js

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,25 @@
1-
import AdminOnRestGenerator from './generators/AdminOnRestGenerator';
2-
import ReactGenerator from './generators/ReactGenerator';
3-
import ReactNativeGenerator from './generators/ReactNativeGenerator';
4-
import TypescriptInterfaceGenerator from './generators/TypescriptInterfaceGenerator';
5-
import VueGenerator from './generators/VueGenerator';
1+
import AdminOnRestGenerator from "./generators/AdminOnRestGenerator";
2+
import ReactGenerator from "./generators/ReactGenerator";
3+
import ReactNativeGenerator from "./generators/ReactNativeGenerator";
4+
import TypescriptInterfaceGenerator from "./generators/TypescriptInterfaceGenerator";
5+
import VueGenerator from "./generators/VueGenerator";
66

7-
function wrap (cl) {
8-
return ({hydraPrefix, templateDirectory}) => new cl({hydraPrefix, templateDirectory})
7+
function wrap(cl) {
8+
return ({ hydraPrefix, templateDirectory }) =>
9+
new cl({ hydraPrefix, templateDirectory });
910
}
1011

11-
export default function generators (generator = 'react') {
12+
export default function generators(generator = "react") {
1213
switch (generator) {
13-
case 'admin-on-rest':
14+
case "admin-on-rest":
1415
return wrap(AdminOnRestGenerator);
15-
case 'react':
16+
case "react":
1617
return wrap(ReactGenerator);
17-
case 'react-native':
18+
case "react-native":
1819
return wrap(ReactNativeGenerator);
19-
case 'typescript':
20+
case "typescript":
2021
return wrap(TypescriptInterfaceGenerator);
21-
case 'vue':
22-
return wrap(VueGenerator)
22+
case "vue":
23+
return wrap(VueGenerator);
2324
}
2425
}
Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,37 @@
1-
import fs from 'fs';
2-
import BaseGenerator from './BaseGenerator';
3-
import handlebars from 'handlebars';
4-
import hbh_comparison from 'handlebars-helpers/lib/comparison';
1+
import fs from "fs";
2+
import BaseGenerator from "./BaseGenerator";
3+
import handlebars from "handlebars";
4+
import hbh_comparison from "handlebars-helpers/lib/comparison";
55

66
export default class extends BaseGenerator {
77
constructor(params) {
88
super(params);
99

1010
this.registerTemplates(`admin-on-rest/`, [
11-
'components/foo.js',
12-
'config/foo.js',
13-
'resources/foo.js',
14-
'resource-import.js',
11+
"components/foo.js",
12+
"config/foo.js",
13+
"resources/foo.js",
14+
"resource-import.js"
1515
]);
1616

17-
handlebars.registerHelper('compare', hbh_comparison.compare);
17+
handlebars.registerHelper("compare", hbh_comparison.compare);
1818
}
1919

2020
help(resource) {
21-
console.log('Code for the "%s" resource type has been generated!', resource.title);
21+
console.log(
22+
'Code for the "%s" resource type has been generated!',
23+
resource.title
24+
);
2225
}
2326

2427
appendFile(template, dest, context = {}) {
25-
fs.appendFileSync(dest, this.templates[template](context));
28+
fs.appendFileSync(dest, this.templates[template](context));
2629
}
2730

2831
generate(api, resource, dir) {
2932
const lc = resource.title.toLowerCase();
30-
const titleUcFirst = resource.title.charAt(0).toUpperCase() + resource.title.slice(1);
33+
const titleUcFirst =
34+
resource.title.charAt(0).toUpperCase() + resource.title.slice(1);
3135

3236
const context = {
3337
title: resource.title,
@@ -37,25 +41,29 @@ export default class extends BaseGenerator {
3741
fields: resource.readableFields,
3842
formFields: this.buildFields(resource.writableFields),
3943
hydraPrefix: this.hydraPrefix,
40-
titleUcFirst,
44+
titleUcFirst
4145
};
4246

4347
// Create directories
4448
// These directories may already exist
45-
for (let dir of [`${dir}/config`, `${dir}/resources`, `${dir}/components/`]) {
49+
for (let dir of [
50+
`${dir}/config`,
51+
`${dir}/resources`,
52+
`${dir}/components/`
53+
]) {
4654
this.createDir(dir, false);
4755
}
4856

4957
for (let pattern of [
50-
'components/%s.js',
51-
'config/%s.js',
52-
'resources/%s.js',
58+
"components/%s.js",
59+
"config/%s.js",
60+
"resources/%s.js"
5361
]) {
54-
this.createFileFromPattern(pattern, dir, lc, context)
62+
this.createFileFromPattern(pattern, dir, lc, context);
5563
}
5664

57-
this.appendFile('resource-import.js', `${dir}/resource-import.js`, context);
65+
this.appendFile("resource-import.js", `${dir}/resource-import.js`, context);
5866

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

src/generators/AdminOnRestGenerator.test.js

Lines changed: 34 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,48 @@
1-
import Api from '@api-platform/api-doc-parser/lib/Api';
2-
import Resource from '@api-platform/api-doc-parser/lib/Resource';
3-
import Field from '@api-platform/api-doc-parser/lib/Field';
4-
import fs from 'fs';
5-
import tmp from 'tmp';
6-
import AdminOnRestGenerator from './AdminOnRestGenerator';
1+
import Api from "@api-platform/api-doc-parser/lib/Api";
2+
import Resource from "@api-platform/api-doc-parser/lib/Resource";
3+
import Field from "@api-platform/api-doc-parser/lib/Field";
4+
import fs from "fs";
5+
import tmp from "tmp";
6+
import AdminOnRestGenerator from "./AdminOnRestGenerator";
77

8-
test('Generate a Admin On Rest app', () => {
9-
const generator = new AdminOnRestGenerator({hydraPrefix: 'hydra:', templateDirectory: `${__dirname}/../../templates`});
10-
const tmpobj = tmp.dirSync({unsafeCleanup: true});
8+
test("Generate a Admin On Rest app", () => {
9+
const generator = new AdminOnRestGenerator({
10+
hydraPrefix: "hydra:",
11+
templateDirectory: `${__dirname}/../../templates`
12+
});
13+
const tmpobj = tmp.dirSync({ unsafeCleanup: true });
1114

12-
const fields = [new Field('bar', {
13-
id: 'http://schema.org/url',
14-
range: 'http://www.w3.org/2001/XMLSchema#string',
15-
reference: null,
16-
required: true,
17-
description: 'An URL'
18-
})];
19-
const resource = new Resource('abc', 'http://example.com/foos', {
20-
id: 'abc',
21-
title: 'abc',
15+
const fields = [
16+
new Field("bar", {
17+
id: "http://schema.org/url",
18+
range: "http://www.w3.org/2001/XMLSchema#string",
19+
reference: null,
20+
required: true,
21+
description: "An URL"
22+
})
23+
];
24+
const resource = new Resource("abc", "http://example.com/foos", {
25+
id: "abc",
26+
title: "abc",
2227
readableFields: fields,
2328
writableFields: fields
2429
});
25-
const api = new Api('http://example.com', {
26-
entrypoint: 'http://example.com:8080',
27-
title: 'My API',
30+
const api = new Api("http://example.com", {
31+
entrypoint: "http://example.com:8080",
32+
title: "My API",
2833
resources: [resource]
2934
});
3035
generator.generate(api, resource, tmpobj.name);
3136

3237
[
33-
'/config/_entrypoint.js',
34-
'/resources/abc.js',
35-
'/resource-import.js',
36-
].forEach(file => expect(fs.existsSync(tmpobj.name+file)).toBe(true));
38+
"/config/_entrypoint.js",
39+
"/resources/abc.js",
40+
"/resource-import.js"
41+
].forEach(file => expect(fs.existsSync(tmpobj.name + file)).toBe(true));
3742

38-
[
39-
'/components/abc.js',
40-
'/config/abc.js',
41-
].forEach(file => {
42-
expect(fs.existsSync(tmpobj.name+file)).toBe(true)
43-
expect(fs.readFileSync(tmpobj.name+file, 'utf8')).toMatch(/bar/);
43+
["/components/abc.js", "/config/abc.js"].forEach(file => {
44+
expect(fs.existsSync(tmpobj.name + file)).toBe(true);
45+
expect(fs.readFileSync(tmpobj.name + file, "utf8")).toMatch(/bar/);
4446
});
4547

4648
tmpobj.removeCallback();

src/generators/BaseGenerator.js

Lines changed: 43 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,26 @@
1-
import fs from 'fs';
2-
import handlebars from 'handlebars';
3-
import mkdirp from 'mkdirp';
4-
import { sprintf } from 'sprintf-js';
5-
import urlapi from 'url';
1+
import fs from "fs";
2+
import handlebars from "handlebars";
3+
import mkdirp from "mkdirp";
4+
import { sprintf } from "sprintf-js";
5+
import urlapi from "url";
66

77
export default class {
88
templates = {};
99

10-
constructor({hydraPrefix, templateDirectory}) {
10+
constructor({ hydraPrefix, templateDirectory }) {
1111
this.hydraPrefix = hydraPrefix;
1212
this.templateDirectory = templateDirectory;
1313

14-
this.registerTemplates('', ['_entrypoint.js']);
14+
this.registerTemplates("", ["_entrypoint.js"]);
1515
}
1616

1717
registerTemplates(basePath, paths) {
1818
for (let path of paths) {
19-
this.templates[path] = handlebars.compile(fs.readFileSync(`${this.templateDirectory}/${basePath}${path}`).toString());
19+
this.templates[path] = handlebars.compile(
20+
fs
21+
.readFileSync(`${this.templateDirectory}/${basePath}${path}`)
22+
.toString()
23+
);
2024
}
2125
}
2226

@@ -31,7 +35,11 @@ export default class {
3135
}
3236

3337
createFileFromPattern(pattern, dir, lc, context) {
34-
this.createFile(sprintf(pattern, 'foo'), sprintf(`${dir}/${pattern}`, lc), context);
38+
this.createFile(
39+
sprintf(pattern, "foo"),
40+
sprintf(`${dir}/${pattern}`, lc),
41+
context
42+
);
3543
}
3644

3745
createFile(template, dest, context = {}, warn = true) {
@@ -46,41 +54,46 @@ export default class {
4654

4755
createEntrypoint(apiEntry, dest) {
4856
const url = urlapi.parse(apiEntry);
49-
const {protocol, host, pathname} = url;
50-
51-
this.createFile('_entrypoint.js', dest, {host: `${protocol}//${host}`, path: pathname}, false);
57+
const { protocol, host, pathname } = url;
58+
59+
this.createFile(
60+
"_entrypoint.js",
61+
dest,
62+
{ host: `${protocol}//${host}`, path: pathname },
63+
false
64+
);
5265
}
5366

5467
getHtmlInputTypeFromField(field) {
5568
switch (field.id) {
56-
case 'http://schema.org/email':
57-
return {type: 'email'};
69+
case "http://schema.org/email":
70+
return { type: "email" };
5871

59-
case 'http://schema.org/url':
60-
return {type: 'url'};
72+
case "http://schema.org/url":
73+
return { type: "url" };
6174
}
6275

6376
switch (field.range) {
64-
case 'http://www.w3.org/2001/XMLSchema#integer':
65-
return {type: 'number'};
77+
case "http://www.w3.org/2001/XMLSchema#integer":
78+
return { type: "number" };
6679

67-
case 'http://www.w3.org/2001/XMLSchema#decimal':
68-
return {type: 'number', step: '0.1'};
80+
case "http://www.w3.org/2001/XMLSchema#decimal":
81+
return { type: "number", step: "0.1" };
6982

70-
case 'http://www.w3.org/2001/XMLSchema#boolean':
71-
return {type: 'checkbox'};
83+
case "http://www.w3.org/2001/XMLSchema#boolean":
84+
return { type: "checkbox" };
7285

73-
case 'http://www.w3.org/2001/XMLSchema#date':
74-
return {type: 'date'};
86+
case "http://www.w3.org/2001/XMLSchema#date":
87+
return { type: "date" };
7588

76-
case 'http://www.w3.org/2001/XMLSchema#time':
77-
return {type: 'time'};
89+
case "http://www.w3.org/2001/XMLSchema#time":
90+
return { type: "time" };
7891

79-
case 'http://www.w3.org/2001/XMLSchema#dateTime':
80-
return {type: 'dateTime'};
92+
case "http://www.w3.org/2001/XMLSchema#dateTime":
93+
return { type: "dateTime" };
8194

8295
default:
83-
return {type: 'text'};
96+
return { type: "text" };
8497
}
8598
}
8699

@@ -92,7 +105,7 @@ export default class {
92105
field.name = apiField.name;
93106
field.description = apiField.description.replace(/"/g, "'"); // fix for Form placeholder description
94107

95-
fields.push(field)
108+
fields.push(field);
96109
}
97110

98111
return fields;

0 commit comments

Comments
 (0)