1 | 'use strict';
|
2 |
|
3 | function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
|
4 |
|
5 | const path = require('path');
|
6 | const fse = require('fs-extra');
|
7 |
|
8 | const steps = ['inits', 'getStatePromise', 'router', 'preRenders', 'render', 'afterRenders'];
|
9 |
|
10 | const mapValues = (obj, iterator) => {
|
11 | const keys = Object.keys(obj);
|
12 | const mapped = {};
|
13 | keys.forEach(key => {
|
14 | mapped[key] = iterator(obj[key], key, obj);
|
15 | });
|
16 | return mapped;
|
17 | };
|
18 |
|
19 | const getImports = strategy => {
|
20 | const libs = strategy.libs.map(lib => {
|
21 | if (lib) return requireLib(lib);
|
22 | }).filter(e => e);
|
23 | const fragments = libs.map(module => module ? module.clientImportFragment : '');
|
24 | return fragments.join('\n');
|
25 | };
|
26 |
|
27 | const requireLib = module => {
|
28 | const file = path.resolve(__dirname, 'libs', 'config_client', module);
|
29 | try {
|
30 | return require(file);
|
31 | } catch (e) {
|
32 | return undefined;
|
33 | }
|
34 | };
|
35 |
|
36 | const createClientStrategy = strategy => {
|
37 | const clientStrategy = {};
|
38 | steps.forEach(step => {
|
39 | const module = strategy[step];
|
40 | if (typeof module === 'string') {
|
41 | clientStrategy[step] = requireLib(module);
|
42 | } else if (Array.isArray(module)) {
|
43 | clientStrategy[step] = module.map(name => requireLib(name)).filter(e => e);
|
44 | }
|
45 | });
|
46 | return clientStrategy;
|
47 | };
|
48 |
|
49 | const createClientCode = strategy => {
|
50 | const clientStrategy = createClientStrategy(strategy);
|
51 |
|
52 | let preRenderCode;
|
53 | if (clientStrategy.preRenders) {
|
54 | const preRenders = clientStrategy.preRenders.filter(e => e.preRenderFragment);
|
55 | const fragments = preRenders.map(preRender => preRender.preRenderFragment('renderComponent', 'store'));
|
56 | preRenderCode = fragments.join('\n');
|
57 | }
|
58 |
|
59 | const inits = clientStrategy.inits.map(init => init.initFragment()).filter(e => e);
|
60 | let runRender = 'main()';
|
61 | if (inits.length > 0) {
|
62 | runRender = `Promise.all([
|
63 | ${inits.join('\n')}
|
64 | ]).then(main())
|
65 | `;
|
66 | }
|
67 |
|
68 | const createStoreFragment = clientStrategy.getStatePromise && clientStrategy.getStatePromise.createStoreFragment && clientStrategy.getStatePromise.createStoreFragment('store', 'initialState');
|
69 |
|
70 | return `${getImports(strategy)}
|
71 |
|
72 | import createConfig from 'linc-config-js'
|
73 |
|
74 | const config = typeof createConfig === 'function' ? createConfig('CLIENT') : createConfig;
|
75 |
|
76 | const serverState = (window && window.__INITIALSTATE__);
|
77 | const initialState = config.state && config.state.parseServerState ? config.state.parseServerState(serverState) : serverState;
|
78 | const userInfo = (window && window.__USER_INFO__) || {};
|
79 |
|
80 | const main = () => {
|
81 | ${createStoreFragment || ''}
|
82 | const env = {store, userInfo, config};
|
83 | if(typeof config.init ==='function') {
|
84 | config.init(env);
|
85 | }
|
86 |
|
87 | ${clientStrategy.router.routerFragment('routeComponent', 'history')}
|
88 | let renderComponent = routeComponent
|
89 | ${preRenderCode || ''}
|
90 | ${clientStrategy.render.renderFragment('renderComponent', 'root')}
|
91 | }
|
92 |
|
93 | ${runRender}
|
94 |
|
95 | if (!config.disableServiceWorker && 'serviceWorker' in navigator) {
|
96 | navigator.serviceWorker.register('/serviceworker.js')
|
97 | .then(function(reg) {
|
98 | // registration worked
|
99 | console.log('Registration succeeded. Scope is ' + reg.scope);
|
100 | }).catch(function(error) {
|
101 | // registration failed
|
102 | console.log('Registration failed with ' + error);
|
103 | });
|
104 | }
|
105 | `;
|
106 | };
|
107 |
|
108 | const generateClient = (() => {
|
109 | var _ref = _asyncToGenerator(function* (filename, strategy) {
|
110 | try {
|
111 | const code = createClientCode(strategy);
|
112 | yield fse.ensureFile(filename);
|
113 | return fse.writeFile(filename, code);
|
114 | } catch (e) {
|
115 | console.error("Couldn't create or write the client code.");
|
116 | console.error('Strategy: ', strategy);
|
117 | console.error(e);
|
118 | process.exit(-1);
|
119 | }
|
120 | });
|
121 |
|
122 | return function generateClient(_x, _x2) {
|
123 | return _ref.apply(this, arguments);
|
124 | };
|
125 | })();
|
126 |
|
127 | module.exports = generateClient;
|
128 |
|
\ | No newline at end of file |