UNPKG

4.3 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _assign = require('babel-runtime/core-js/object/assign');
8
9var _assign2 = _interopRequireDefault(_assign);
10
11var _keys = require('babel-runtime/core-js/object/keys');
12
13var _keys2 = _interopRequireDefault(_keys);
14
15var _stringify = require('babel-runtime/core-js/json/stringify');
16
17var _stringify2 = _interopRequireDefault(_stringify);
18
19var _extends2 = require('babel-runtime/helpers/extends');
20
21var _extends3 = _interopRequireDefault(_extends2);
22
23var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
24
25var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
26
27exports.default = proxy;
28
29var _pathToRegexp = require('path-to-regexp');
30
31var _pathToRegexp2 = _interopRequireDefault(_pathToRegexp);
32
33var _util = require('util');
34
35var _util2 = _interopRequireDefault(_util);
36
37require('isomorphic-fetch');
38
39var _urlPattern = require('url-pattern');
40
41var _urlPattern2 = _interopRequireDefault(_urlPattern);
42
43function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
44
45var fetcher = function fetcher(options, res, after, logger) {
46 logger.apply(undefined, ['# Proxing'].concat((0, _toConsumableArray3.default)(options)));
47 fetch.apply(undefined, (0, _toConsumableArray3.default)(options)).then(function (apiRes) {
48 if (apiRes.ok) {
49 apiRes.json().then(function (json) {
50 return after(json, function (converted) {
51 return res.json(converted);
52 });
53 }, function () {
54 return res.json({});
55 });
56 } else {
57 apiRes.json().then(function (json) {
58 return res.status(apiRes.status).json(json);
59 }, function () {
60 return res.status(apiRes.status).json({});
61 });
62 }
63 }, function (err) {
64 return logger('# Fetch Error ', options, err) || res.json(err);
65 }).catch(function (err) {
66 return logger('# Unexpected Error ', {}, err) || res.json(err);
67 });
68};
69
70function proxy(_ref) {
71 var app = _ref.app,
72 protocol = _ref.protocol,
73 host = _ref.host,
74 prefix = _ref.prefix,
75 customizer = _ref.customizer,
76 _ref$before = _ref.before,
77 before = _ref$before === undefined ? function (url, options, cb) {
78 return cb([url, options]);
79 } : _ref$before,
80 _ref$after = _ref.after,
81 after = _ref$after === undefined ? function (json, cb) {
82 return cb(json);
83 } : _ref$after,
84 _ref$logger = _ref.logger,
85 logger = _ref$logger === undefined ? function (title, data, err) {
86 return console.log(title, _util2.default.inspect(data), _util2.default.inspect(err));
87 } : _ref$logger;
88
89 app.use(prefix + '/*', function (req, res) {
90 var apiUri = req.originalUrl.replace(new RegExp(prefix), '');
91 var url = protocol + '://' + host + apiUri;
92 var options = [url, {
93 method: req.method,
94 headers: (0, _extends3.default)({}, req.headers, {
95 host: host
96 })
97 }];
98 var originalUrl = req.originalUrl.split('?')[0];
99 if (req.body) {
100 options[1].body = (0, _stringify2.default)(req.body);
101 }
102 var customizerBefore = void 0;
103 var customizerAfter = void 0;
104 var customizerOverride = void 0;
105 if (customizer) {
106 var keys = (0, _keys2.default)((0, _assign2.default)({}, req.params)).map(function (key) {
107 return {
108 name: key,
109 prefix: '/',
110 delimiter: '/'
111 };
112 });
113 (0, _keys2.default)(customizer).some(function (uri) {
114 if ((0, _pathToRegexp2.default)(uri, keys).exec(originalUrl) && customizer[uri] && customizer[uri][req.method]) {
115 customizerBefore = customizer[uri][req.method].before;
116 customizerAfter = customizer[uri][req.method].after;
117 customizerOverride = customizer[uri][req.method].override;
118 var pattern = new _urlPattern2.default(uri);
119 req.params = pattern.match(originalUrl);
120 }
121 });
122 }
123
124 if (customizerOverride) {
125 logger('# Proxing with override', url);
126 customizerOverride(req, res);
127 } else {
128 (customizerBefore || before).apply(undefined, options.concat([function (fetchOptions) {
129 return fetcher(fetchOptions, res, customizerAfter || after, logger);
130 }]));
131 }
132 });
133}
134module.exports = exports['default'];
\No newline at end of file