UNPKG

4.21 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 => {
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
27const 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
36const 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
49const 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
72import createConfig from 'linc-config-js'
73
74const config = typeof createConfig === 'function' ? createConfig('CLIENT') : createConfig;
75
76const serverState = (window && window.__INITIALSTATE__);
77const initialState = config.state && config.state.parseServerState ? config.state.parseServerState(serverState) : serverState;
78const userInfo = (window && window.__USER_INFO__) || {};
79
80const 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
95if (!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
108const 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
127module.exports = generateClient;
128//# sourceMappingURL=generateClient.js.map
\No newline at end of file