1 | 'use strict';
|
2 |
|
3 | const semver = require('semver');
|
4 |
|
5 | const pickInits = deps => {
|
6 | const inits = [];
|
7 | if (deps['react-loadable']) {
|
8 | inits.push('react-loadable');
|
9 | }
|
10 | return inits;
|
11 | };
|
12 |
|
13 | const pickRouter = deps => {
|
14 | if (deps['react-router']) {
|
15 | if (semver.lt(deps['react-router'], '4.0.0')) {
|
16 | return 'react-router-v3';
|
17 | } else {
|
18 | return 'react-router-v4';
|
19 | }
|
20 | } else if (deps['react-router-dom']) {
|
21 | return 'react-router-v4';
|
22 | } else {
|
23 | return 'config-router';
|
24 | }
|
25 | };
|
26 |
|
27 | const pickStatePromise = deps => {
|
28 | if (deps['redux']) {
|
29 | return 'config-redux';
|
30 | } else {
|
31 | return 'config-state';
|
32 | }
|
33 | };
|
34 |
|
35 | const pickPreRenders = deps => {
|
36 | const preRenders = [];
|
37 | if (deps['react-loadable']) {
|
38 | preRenders.push('react-loadable');
|
39 | }
|
40 | if (deps['react-redux']) {
|
41 | preRenders.push('react-redux');
|
42 | }
|
43 | if (deps['styled-components']) {
|
44 | if (deps['babel-plugin-styled-components']) {
|
45 | preRenders.push('styled-components');
|
46 | } else {
|
47 | throw new Error('Need to install "babel-plugin-styled-components" to be able to Server-Side Render styled-components');
|
48 | }
|
49 | }
|
50 | return preRenders;
|
51 | };
|
52 |
|
53 | const pickRenderer = deps => {
|
54 | if (deps['react']) {
|
55 | if (semver.lt(deps['react'], '16.0.0')) {
|
56 | return 'react15';
|
57 | } else {
|
58 | return 'react16';
|
59 | }
|
60 | } else {
|
61 | throw new Error('Only support react in this profile for now');
|
62 | }
|
63 | };
|
64 |
|
65 | const pickAfterRenders = deps => {
|
66 | const afterRenders = [];
|
67 | if (deps['react-loadable']) {
|
68 | afterRenders.push('react-loadable');
|
69 | }
|
70 | if (deps['styled-components']) {
|
71 | afterRenders.push('styled-components');
|
72 | }
|
73 | if (deps['react-helmet']) {
|
74 | afterRenders.push('react-helmet');
|
75 | }
|
76 | return afterRenders;
|
77 | };
|
78 |
|
79 | const getLibs = strategy => {
|
80 | const list = Object.keys(strategy).reduce((list, elem) => {
|
81 | return list.concat(strategy[elem]);
|
82 | }, []);
|
83 | return list.filter((item, pos, self) => self.indexOf(item) === pos);
|
84 | };
|
85 |
|
86 | const createStrategy = deps => {
|
87 | try {
|
88 | const strategy = {};
|
89 | strategy.inits = pickInits(deps);
|
90 | strategy.router = pickRouter(deps);
|
91 | strategy.render = pickRenderer(deps);
|
92 | strategy.getStatePromise = pickStatePromise(deps);
|
93 | strategy.preRenders = pickPreRenders(deps);
|
94 | strategy.afterRenders = pickAfterRenders(deps);
|
95 | strategy.libs = getLibs(strategy);
|
96 | return strategy;
|
97 | } catch (e) {
|
98 | console.error("We couldn't automatically figure out what plugins to use");
|
99 | console.error(e.message);
|
100 | process.exit(-1);
|
101 | }
|
102 | };
|
103 |
|
104 | module.exports = createStrategy;
|
105 |
|
\ | No newline at end of file |