UNPKG

5 kBJavaScriptView Raw
1#!/usr/bin/env node
2
3const config = require('./config');
4const lib = require('./lib');
5const EOL = require('os').EOL;
6
7const assembleIndex = require('./assembler/index');
8const assembleApp = require('./assembler/app');
9const assembleAppState = require('./assembler/app-state');
10const assembleAppSpec = require('./assembler/app-spec');
11const assembleDependencies = require('./assembler/dependencies');
12const assembleDevDependencies = require('./assembler/dev-dependencies');
13const assembleNpmScripts = require('./assembler/npm-scripts');
14const tmpl = require('./assembler/tmpl');
15
16const init = lib.init;
17const sequence = lib.sequence;
18const log = lib.log;
19const start = lib.starting;
20const folders = lib.createFolders;
21const write = lib.writeFile;
22const chdir = lib.chdir;
23const exec = lib.exec;
24const exit = lib.exit;
25const versions = lib.versions;
26
27const 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
37config((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; // todo: extend?
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});