Skip to content

Commit 875e88a

Browse files
committed
Factorize code between generators. Don't overwrite existing files.
1 parent 00ef34d commit 875e88a

18 files changed

+491
-637
lines changed

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@
3636
"commander": "^2.9.0",
3737
"handlebars": "^4.0.6",
3838
"isomorphic-fetch": "^2.2.1",
39-
"mkdirp": "^0.5.1"
39+
"mkdirp": "^0.5.1",
40+
"sprintf-js": "^1.1.1"
4041
},
4142
"scripts": {
4243
"test": "jest",

src/generators.js

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,21 @@
1-
import ReactCrudGenerator from './generators/ReactCrudGenerator';
2-
import ReactNativeCrudGenerator from './generators/ReactNativeCrudGenerator';
1+
import ReactGenerator from './generators/ReactGenerator';
2+
import ReactNativeGenerator from './generators/ReactNativeGenerator';
33
import TypescriptInterfaceGenerator from './generators/TypescriptInterfaceGenerator';
4-
import VueCrudGenerator from './generators/VueCrudGenerator';
4+
import VueGenerator from './generators/VueGenerator';
55

66
function wrap (cl) {
77
return ({hydraPrefix, templateDirectory}) => new cl({hydraPrefix, templateDirectory})
88
}
99

10-
function generators (generator = 'react') {
10+
export default function generators (generator = 'react') {
1111
switch (generator) {
1212
case 'react':
13-
return wrap(ReactCrudGenerator);
13+
return wrap(ReactGenerator);
1414
case 'react-native':
15-
return wrap(ReactNativeCrudGenerator);
15+
return wrap(ReactNativeGenerator);
1616
case 'typescript':
1717
return wrap(TypescriptInterfaceGenerator);
1818
case 'vue':
19-
return wrap(VueCrudGenerator)
19+
return wrap(VueGenerator)
2020
}
2121
}
22-
23-
export default generators

src/generators/BaseGenerator.js

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
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';
6+
7+
export default class {
8+
templates = {};
9+
10+
constructor({hydraPrefix, templateDirectory}) {
11+
this.hydraPrefix = hydraPrefix;
12+
this.templateDirectory = templateDirectory;
13+
14+
this.registerTemplates('', ['_entrypoint.js']);
15+
}
16+
17+
registerTemplates(basePath, paths) {
18+
for (let path of paths) {
19+
this.templates[path] = handlebars.compile(fs.readFileSync(`${this.templateDirectory}/${basePath}${path}`).toString());
20+
}
21+
}
22+
23+
createDir(dir, warn = true) {
24+
if (!fs.existsSync(dir)) {
25+
mkdirp.sync(dir);
26+
27+
return;
28+
}
29+
30+
if (warn) console.log(`The directory "${dir}" already exists`);
31+
}
32+
33+
createFileFromPattern(pattern, dir, lc, context) {
34+
this.createFile(sprintf(pattern, 'foo'), sprintf(`${dir}/${pattern}`, lc), context);
35+
}
36+
37+
createFile(template, dest, context = {}, warn = true) {
38+
if (!fs.existsSync(dest)) {
39+
fs.writeFileSync(dest, this.templates[template](context));
40+
41+
return;
42+
}
43+
44+
if (warn) console.log(`The file "${dest}" already exists`);
45+
}
46+
47+
createEntrypoint(apiEntry, dest) {
48+
const url = urlapi.parse(apiEntry);
49+
const {protocol, host, port, pathname} = url;
50+
const hostUrl = `${protocol}//${host}${port ? `:${port}` : ''}`;
51+
52+
this.createFile('_entrypoint.js', dest, {host: hostUrl, path: pathname}, false);
53+
}
54+
55+
getHtmlInputTypeFromField(field) {
56+
switch (field.id) {
57+
case 'http://schema.org/email':
58+
return {type: 'email'};
59+
60+
case 'http://schema.org/url':
61+
return {type: 'url'};
62+
}
63+
64+
switch (field.range) {
65+
case 'http://www.w3.org/2001/XMLSchema#integer':
66+
return {type: 'number'};
67+
68+
case 'http://www.w3.org/2001/XMLSchema#decimal':
69+
return {type: 'number', step: '0.1'};
70+
71+
case 'http://www.w3.org/2001/XMLSchema#boolean':
72+
return {type: 'checkbox'};
73+
74+
case 'http://www.w3.org/2001/XMLSchema#date':
75+
return {type: 'date'};
76+
77+
case 'http://www.w3.org/2001/XMLSchema#time':
78+
return {type: 'time'};
79+
80+
default:
81+
return {type: 'text'};
82+
}
83+
}
84+
85+
buildFields(apiFields) {
86+
let fields = [];
87+
for (let apiField of apiFields) {
88+
let field = this.getHtmlInputTypeFromField(apiField);
89+
field.required = apiField.required;
90+
field.name = apiField.name;
91+
field.description = apiField.description.replace(/"/g, "'"); // fix for Form placeholder description
92+
93+
fields.push(field)
94+
}
95+
96+
return fields;
97+
}
98+
}

src/generators/ReactCrudGenerator.js

Lines changed: 0 additions & 201 deletions
This file was deleted.

0 commit comments

Comments
 (0)