Skip to content

Commit 568d686

Browse files
committed
Use webpack to build binary
1 parent 1743de1 commit 568d686

8 files changed

Lines changed: 312 additions & 35 deletions

File tree

bin/react-stdio

Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
1+
#!/usr/bin/env node
2+
3+
/******/ (function(modules) { // webpackBootstrap
4+
/******/ // The module cache
5+
/******/ var installedModules = {};
6+
7+
/******/ // The require function
8+
/******/ function __webpack_require__(moduleId) {
9+
10+
/******/ // Check if module is in cache
11+
/******/ if(installedModules[moduleId])
12+
/******/ return installedModules[moduleId].exports;
13+
14+
/******/ // Create a new module (and put it into the cache)
15+
/******/ var module = installedModules[moduleId] = {
16+
/******/ exports: {},
17+
/******/ id: moduleId,
18+
/******/ loaded: false
19+
/******/ };
20+
21+
/******/ // Execute the module function
22+
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
23+
24+
/******/ // Flag the module as loaded
25+
/******/ module.loaded = true;
26+
27+
/******/ // Return the exports of the module
28+
/******/ return module.exports;
29+
/******/ }
30+
31+
32+
/******/ // expose the modules object (__webpack_modules__)
33+
/******/ __webpack_require__.m = modules;
34+
35+
/******/ // expose the module cache
36+
/******/ __webpack_require__.c = installedModules;
37+
38+
/******/ // __webpack_public_path__
39+
/******/ __webpack_require__.p = "";
40+
41+
/******/ // Load entry module and return exports
42+
/******/ return __webpack_require__(0);
43+
/******/ })
44+
/************************************************************************/
45+
/******/ ([
46+
/* 0 */
47+
/***/ function(module, exports, __webpack_require__) {
48+
49+
'use strict';
50+
51+
var _eventStream = __webpack_require__(1);
52+
53+
var _eventStream2 = _interopRequireDefault(_eventStream);
54+
55+
var _jsonstream = __webpack_require__(2);
56+
57+
var _jsonstream2 = _interopRequireDefault(_jsonstream);
58+
59+
var _ServerUtils = __webpack_require__(3);
60+
61+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
62+
63+
process.stdin.pipe(_jsonstream2.default.parse()).pipe(_eventStream2.default.map((0, _ServerUtils.createRequestHandler)(process.cwd()))).pipe(process.stdout);
64+
65+
/***/ },
66+
/* 1 */
67+
/***/ function(module, exports) {
68+
69+
module.exports = require("event-stream");
70+
71+
/***/ },
72+
/* 2 */
73+
/***/ function(module, exports) {
74+
75+
module.exports = require("jsonstream");
76+
77+
/***/ },
78+
/* 3 */
79+
/***/ function(module, exports, __webpack_require__) {
80+
81+
'use strict';
82+
83+
Object.defineProperty(exports, "__esModule", {
84+
value: true
85+
});
86+
exports.createRequestHandler = createRequestHandler;
87+
88+
var _path = __webpack_require__(4);
89+
90+
var _path2 = _interopRequireDefault(_path);
91+
92+
var _invariant = __webpack_require__(5);
93+
94+
var _invariant2 = _interopRequireDefault(_invariant);
95+
96+
var _RenderUtils = __webpack_require__(6);
97+
98+
var _ModuleUtils = __webpack_require__(8);
99+
100+
var _react = __webpack_require__(9);
101+
102+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
103+
104+
function handleRequest(workingDir, request, callback) {
105+
var componentPath = request.component;
106+
var renderMethod = request.render;
107+
var props = request.props;
108+
109+
(0, _invariant2.default)(componentPath != null, 'Missing { component } in request');
110+
111+
var render = undefined;
112+
if (renderMethod == null || renderMethod === 'renderToString') {
113+
render = _RenderUtils.renderToString;
114+
} else if (renderMethod === 'renderToStaticMarkup') {
115+
render = _RenderUtils.renderToStaticMarkup;
116+
} else {
117+
var methodFile = _path2.default.resolve(workingDir, renderMethod);
118+
119+
try {
120+
render = (0, _ModuleUtils.getDefaultExports)(methodFile);
121+
} catch (error) {
122+
if (error.code !== 'MODULE_NOT_FOUND') process.stderr.write(error.stack + '\n');
123+
}
124+
}
125+
126+
(0, _invariant2.default)(typeof render === 'function', 'Cannot load render method: %s', renderMethod);
127+
128+
var componentFile = _path2.default.resolve(workingDir, componentPath);
129+
130+
var component = undefined;
131+
try {
132+
component = (0, _ModuleUtils.getDefaultExports)(componentFile);
133+
} catch (error) {
134+
if (error.code !== 'MODULE_NOT_FOUND') process.stderr.write(error.stack + '\n');
135+
}
136+
137+
(0, _invariant2.default)(component != null, 'Cannot load component: %s', componentPath);
138+
139+
render((0, _react.createElement)(component, props), callback);
140+
}
141+
142+
function createRequestHandler(workingDir) {
143+
return function (request, callback) {
144+
try {
145+
handleRequest(workingDir, request, function (error, html) {
146+
if (error) {
147+
callback(error);
148+
} else if (typeof html !== 'string') {
149+
// Crash the server process.
150+
callback(new Error('Render method must return a string'));
151+
} else {
152+
callback(null, JSON.stringify({ html: html }));
153+
}
154+
});
155+
} catch (error) {
156+
callback(null, JSON.stringify({ error: error.message }));
157+
}
158+
};
159+
}
160+
161+
/***/ },
162+
/* 4 */
163+
/***/ function(module, exports) {
164+
165+
module.exports = require("path");
166+
167+
/***/ },
168+
/* 5 */
169+
/***/ function(module, exports) {
170+
171+
module.exports = require("invariant");
172+
173+
/***/ },
174+
/* 6 */
175+
/***/ function(module, exports, __webpack_require__) {
176+
177+
'use strict';
178+
179+
Object.defineProperty(exports, "__esModule", {
180+
value: true
181+
});
182+
exports.renderToStaticMarkup = renderToStaticMarkup;
183+
exports.renderToString = renderToString;
184+
185+
var _server = __webpack_require__(7);
186+
187+
var _server2 = _interopRequireDefault(_server);
188+
189+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
190+
191+
function renderToStaticMarkup(element, callback) {
192+
return callback(null, _server2.default.renderToStaticMarkup(element));
193+
}
194+
195+
function renderToString(element, callback) {
196+
return callback(null, _server2.default.renderToString(element));
197+
}
198+
199+
/***/ },
200+
/* 7 */
201+
/***/ function(module, exports) {
202+
203+
module.exports = require("react-dom/server");
204+
205+
/***/ },
206+
/* 8 */
207+
/***/ function(module, exports) {
208+
209+
"use strict";
210+
211+
// We tell webpack not to parse this file (using noParse)
212+
// so we can use node's require in the generated bundle.
213+
214+
exports.getDefaultExports = function (file) {
215+
var moduleExports = require(file);
216+
217+
// Return the "default" export if using ES2015 modules.
218+
if (moduleExports && moduleExports.default) return moduleExports.default;
219+
220+
return moduleExports;
221+
};
222+
223+
/***/ },
224+
/* 9 */
225+
/***/ function(module, exports) {
226+
227+
module.exports = require("react");
228+
229+
/***/ }
230+
/******/ ]);

bin/react-stdio.js

Lines changed: 0 additions & 2 deletions
This file was deleted.

modules/ModuleUtils.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// We tell webpack not to parse this file (using noParse)
2+
// so we can use node's require in the generated bundle.
3+
4+
exports.getDefaultExports = function (file) {
5+
const moduleExports = require(file)
6+
7+
// Return the "default" export if using ES2015 modules.
8+
if (moduleExports && moduleExports.default)
9+
return moduleExports.default
10+
11+
return moduleExports
12+
}

modules/RenderUtils.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import ReactDOMServer from 'react-dom/server'
2+
3+
export function renderToStaticMarkup(element, callback) {
4+
return callback(null, ReactDOMServer.renderToStaticMarkup(element))
5+
}
6+
7+
export function renderToString(element, callback) {
8+
return callback(null, ReactDOMServer.renderToString(element))
9+
}

modules/ServerUtils.js

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,9 @@
11
import path from 'path'
22
import invariant from 'invariant'
3-
import ReactDOMServer from 'react-dom/server'
3+
import { renderToStaticMarkup, renderToString } from './RenderUtils'
4+
import { getDefaultExports } from './ModuleUtils'
45
import { createElement } from 'react'
56

6-
function getDefaultExports(file) {
7-
const moduleExports = require(file)
8-
9-
// Return the "default" export if using ES2015 modules.
10-
if (moduleExports && moduleExports.default)
11-
return moduleExports.default
12-
13-
return moduleExports
14-
}
15-
16-
function renderToStaticMarkup(element, callback) {
17-
return callback(null, ReactDOMServer.renderToStaticMarkup(element))
18-
}
19-
20-
function renderToString(element, callback) {
21-
return callback(null, ReactDOMServer.renderToString(element))
22-
}
23-
247
function handleRequest(workingDir, request, callback) {
258
const { component: componentPath, render: renderMethod, props } = request
269

package.json

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,29 @@
11
{
22
"name": "react-stdio",
33
"version": "1.0.0",
4-
"description": "A small server for rendering React components over stdio",
5-
"main": "server.js",
6-
"bin": "./bin/react-stdio.js",
4+
"description": "Render React.js components using JSON + stdio streams",
5+
"bin": "./bin/react-stdio",
6+
"files": [
7+
"bin"
8+
],
79
"scripts": {
8-
"test": "echo \"Error: no test specified\" && exit 1",
9-
"start": "node server.js"
10+
"build": "webpack",
11+
"start": "babel-node server.js"
1012
},
1113
"author": "Michael Jackson",
1214
"license": "MIT",
1315
"dependencies": {
14-
"babel-core": "^6.3.26",
16+
"babel-cli": "^6.3.17",
17+
"babel-preset-es2015": "^6.3.13",
18+
"babel-preset-react": "^6.3.13",
1519
"event-stream": "^3.3.2",
1620
"invariant": "^2.2.0",
1721
"jsonstream": "^1.0.3",
1822
"react": "^0.14.5",
1923
"react-dom": "^0.14.5"
2024
},
2125
"devDependencies": {
22-
"babel-cli": "^6.3.17",
23-
"babel-preset-es2015": "^6.3.13",
24-
"babel-preset-react": "^6.3.13"
26+
"babel-loader": "^6.2.0",
27+
"webpack": "^1.12.9"
2528
}
2629
}

server.js

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
require('babel-core/register')
2-
3-
var es = require('event-stream')
4-
var JSONStream = require('jsonstream')
5-
var createRequestHandler = require('./modules/ServerUtils').createRequestHandler
1+
import es from 'event-stream'
2+
import JSONStream from 'jsonstream'
3+
import { createRequestHandler } from './modules/ServerUtils'
64

75
process.stdin
86
.pipe(JSONStream.parse())

webpack.config.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
var fs = require('fs')
2+
var path = require('path')
3+
var webpack = require('webpack')
4+
5+
var nodeModules = fs.readdirSync(path.resolve(__dirname, 'node_modules')).concat([
6+
'react-dom/server'
7+
])
8+
9+
module.exports = {
10+
11+
target: 'node',
12+
entry: path.join(__dirname, 'server.js'),
13+
14+
output: {
15+
path: path.resolve(__dirname, 'bin'),
16+
filename: 'react-stdio'
17+
},
18+
19+
externals: nodeModules.reduce(function (ext, mod) {
20+
ext[mod] = 'commonjs ' + mod
21+
return ext
22+
}, {}),
23+
24+
node: {
25+
process: false,
26+
__filename: true,
27+
__dirname: true
28+
},
29+
30+
module: {
31+
noParse: /ModuleUtils\.js/,
32+
loaders: [
33+
{ test: /\.js$/, exclude: /node_modules/, loader: 'babel' }
34+
]
35+
},
36+
37+
plugins: [
38+
new webpack.BannerPlugin("#!/usr/bin/env node\n", {
39+
entryOnly: true,
40+
raw: true
41+
})
42+
]
43+
44+
}

0 commit comments

Comments
 (0)