UNPKG

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