1 | #!/usr/bin/env node
|
2 |
|
3 | const config = require('./config');
|
4 | const lib = require('./lib');
|
5 | const EOL = require('os').EOL;
|
6 |
|
7 | const assembleIndex = require('./assembler/index');
|
8 | const assembleApp = require('./assembler/app');
|
9 | const assembleAppState = require('./assembler/app-state');
|
10 | const assembleAppSpec = require('./assembler/app-spec');
|
11 | const assembleDependencies = require('./assembler/dependencies');
|
12 | const assembleDevDependencies = require('./assembler/dev-dependencies');
|
13 | const assembleNpmScripts = require('./assembler/npm-scripts');
|
14 | const tmpl = require('./assembler/tmpl');
|
15 |
|
16 | const init = lib.init;
|
17 | const sequence = lib.sequence;
|
18 | const log = lib.log;
|
19 | const start = lib.starting;
|
20 | const folders = lib.createFolders;
|
21 | const write = lib.writeFile;
|
22 | const chdir = lib.chdir;
|
23 | const exec = lib.exec;
|
24 | const exit = lib.exit;
|
25 | const versions = lib.versions;
|
26 |
|
27 | const mergeBabelrcs = (a, b) => {
|
28 | a.presets && b.presets && b.presets.forEach((preset) => {
|
29 | a.presets.push(preset);
|
30 | });
|
31 | a.plugins && b.plugins && b.plugins.forEach((plugin) => {
|
32 | a.plugins.push(plugin);
|
33 | });
|
34 | return a;
|
35 | };
|
36 |
|
37 | config((project, args) => {
|
38 | const dir = project.name;
|
39 | const dependencies = assembleDependencies(args);
|
40 | const devDependencies = assembleDevDependencies(args);
|
41 | const index = assembleIndex(args);
|
42 | const app = assembleApp(args);
|
43 | const appState = assembleAppState(args);
|
44 | const appSpec = assembleAppSpec(args);
|
45 | let npmScripts = {};
|
46 | let jestConfig = '';
|
47 |
|
48 | const render = template => template
|
49 | .replace('{{PROJEKT-NAME}}', project.name)
|
50 | .replace('{{PROJEKT-DESCRIPTION}}', project.desc)
|
51 | .replace('{{PROJEKT-LICENCE}}', project.license)
|
52 | .replace('{{PROJEKT-VERSION}}', project.version)
|
53 | .replace('{{PROJEKT-AUTHOR}}', project.author)
|
54 | .replace('{{PORT}}', (args.port || project.port))
|
55 | .replace('{{PACKAGE-SCRIPTS}}', npmScripts)
|
56 | .replace('{{JEST-CONFIG}}', jestConfig);
|
57 |
|
58 | npmScripts = render(assembleNpmScripts(args));
|
59 | let appStylesheetExt = 'css';
|
60 | tmpl.appStylesheet = tmpl.appCss;
|
61 |
|
62 | let styledJs;;
|
63 |
|
64 | let typesFileContent;
|
65 |
|
66 | if (args.router) {
|
67 | tmpl.appStylesheet += EOL + tmpl.appCssRouter
|
68 | }
|
69 |
|
70 | if (args.flow) {
|
71 | tmpl.eslintrc += tmpl.eslintrcFlow;
|
72 | tmpl.babelrc = JSON.stringify(mergeBabelrcs(
|
73 | JSON.parse(tmpl.babelrc),
|
74 | JSON.parse(tmpl.babelrcFlow)
|
75 | ), null, 2);
|
76 | }
|
77 |
|
78 | if (args.test) {
|
79 | jestConfig = tmpl.jestConfig;
|
80 | }
|
81 |
|
82 | if (args.sass) {
|
83 | tmpl.appStylesheet = tmpl.appScss;
|
84 | if (args.router) {
|
85 | tmpl.appStylesheet += EOL + tmpl.appScssRooter;
|
86 | }
|
87 | appStylesheetExt = 'scss';
|
88 | }
|
89 |
|
90 | if (args.styled) {
|
91 | if (args.router) {
|
92 | styledJs = tmpl.styledJsRouter;
|
93 | } else {
|
94 | styledJs = tmpl.styledJs;
|
95 | }
|
96 | }
|
97 |
|
98 | if (args.flow) {
|
99 | if (args.mobx) {
|
100 | typesFileContent = tmpl.typesFileMobx;
|
101 | } else if (args.redux) {
|
102 | typesFileContent = tmpl.typesFileRedux;
|
103 | } else if (args.router) {
|
104 | typesFileContent = tmpl.typesFileBase;
|
105 | } else {
|
106 | typesFileContent = tmpl.typesFileBase;
|
107 | }
|
108 | }
|
109 |
|
110 | sequence([
|
111 | [init, args, dir],
|
112 | [exec, 'npm view freshpack version', { version: true }],
|
113 | [start, 'project files'],
|
114 | [folders, 'src/components/app'],
|
115 | [folders, 'flow-typed'],
|
116 | [folders, '.vscode'],
|
117 | [folders, '.mocks'],
|
118 | [write, '.babelrc', tmpl.babelrc],
|
119 | [write, '.editorconfig', tmpl.editorconfig],
|
120 | [write, '.eslintrc', tmpl.eslintrc],
|
121 | [write, '.eslintignore', tmpl.eslintignore],
|
122 | [write, '.flowConfig', tmpl.flowConfig],
|
123 | [write, 'package.json', render(tmpl.package)],
|
124 | [write, 'webpack.config.js', render(tmpl.webpackConfig)],
|
125 | [write, 'src/index.js', index],
|
126 | [write, 'src/index.html', render(tmpl.indexHtml)],
|
127 | [write, 'src/store.js', tmpl.storeJs],
|
128 | [write, 'src/components/app/App.js', app],
|
129 | [write, 'src/components/app/style.' + appStylesheetExt, tmpl.appStylesheet],
|
130 | [write, 'src/components/app/styled.js', styledJs],
|
131 | [write, 'src/components/app/state.js', appState],
|
132 | [write, 'src/components/app/spec.js', appSpec],
|
133 | [write, 'src/components/app/types.js', typesFileContent],
|
134 | [write, 'flow-typed/redux.js', tmpl.flowTypeRedux],
|
135 | [write, 'flow-typed/prop-types.js', tmpl.flowTypePropTypes],
|
136 | [write, 'flow-typed/react-router-dom.js', tmpl.flowTypeReactRouterDom],
|
137 | [write, 'flow-typed/react-redux.js', tmpl.flowTypeReactRedux],
|
138 | [write, 'flow-typed/mobx.js', tmpl.flowTypeMobx],
|
139 | [write, 'flow-typed/mobx-react.js', tmpl.flowTypeMobxReact],
|
140 | [write, 'flow-typed/mobx-react-devtools.js', tmpl.flowTypeMobxReactDevtools],
|
141 | [write, 'flow-typed/styled-components.js', tmpl.flowTypeStyled],
|
142 | [write, '.mocks/empty-module.js', tmpl.emptyModule],
|
143 | [write, '.vscode/settings.json', tmpl.settingsVSCode],
|
144 | [chdir, './' + dir],
|
145 | [log, ''],
|
146 | [versions, dependencies, devDependencies],
|
147 | [exec, 'yarn add ' + dependencies, { dependencies: true }],
|
148 | [exec, 'yarn add -D ' + devDependencies, { dependencies: true }],
|
149 | [chdir, '../'],
|
150 | [exit]
|
151 | ]);
|
152 | });
|