-
Notifications
You must be signed in to change notification settings - Fork 1
/
plopfile.js
126 lines (112 loc) · 2.93 KB
/
plopfile.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
const path = require('path');
// Templates
const componentTemplate = `
import React from 'react';
import { css } from '@emotion/core';
import styled from '@emotion/styled';
import { Color } from '../../enums/appStyles';
interface {{componentName}}Props {
children: React.ReactNode;
}
const {{componentName}}El = styled.div<{{componentName}}Props>\`\`;
const {{componentName}}: React.FunctionComponent<{{componentName}}Props> = ({ children, ...rest }) => (
<{{componentName}}El {...rest}>{children}</{{componentName}}El>
);
export default {{componentName}};
`;
const pageTemplate = `
import React from 'react';
import Wrapper from '../components/base/Wrapper';
import App from '../components/layout/App';
const {{pageName}}Page = () => {
return (
<App>
<Wrapper>
{{pageName}} page
</Wrapper>
</App>
);
};
export default {{pageName}}Page;
`;
/*
Setup "plop" as a cli generator
see https://github.com/amwmedia/plop
*/
module.exports = function(plop) {
plop.addPrompt('directory', require('inquirer-directory'));
// Add helpers
plop.addHelper('componentsPath', function(p) {
return path.resolve(plop.getPlopfilePath() + '/src/components', p);
});
plop.addHelper('snakecase', function(name) {
return name
.split(/(?=[A-Z])/)
.map(s => s.toLowerCase())
.join('-');
});
// Page generator
plop.setGenerator('page', {
description: 'create a new gatsby page',
prompts: [
{
type: 'input',
name: 'pageName',
message: 'Pick a name for the page (UpperCamelCase)',
validate: function(value) {
if (/.+/.test(value)) {
if (/([A-Z][a-z0-9]+)+/.test(value)) {
return true;
} else {
return 'format is invalid';
}
} else {
return 'file name is required';
}
},
},
],
actions: [
{
type: 'add',
path: 'src/pages/{{snakecase pageName}}.tsx',
template: pageTemplate,
},
],
});
// Component generator
plop.setGenerator('component', {
description: 'create a new react component',
prompts: [
{
type: 'directory',
name: 'path',
message: 'where would you like to put this component?',
basePath: plop.getPlopfilePath() + '/src/components',
},
{
type: 'input',
name: 'componentName',
message: 'Pick a name for the component (UpperCamelCase)',
validate: function(value) {
if (/.+/.test(value)) {
if (/([A-Z][a-z0-9]+)+/.test(value)) {
return true;
} else {
return 'format is invalid';
}
} else {
return 'file name is required';
}
},
},
],
actions: [
{
type: 'add',
path: '{{componentsPath path}}/{{componentName}}.tsx',
template: componentTemplate,
},
],
});
};