Skip to content

Commit

Permalink
chore(release): 1.3.0 [skip ci]
Browse files Browse the repository at this point in the history
# [1.3.0](v1.2.0...v1.3.0) (2019-04-02)

### Features

* add custom temporary responses ([#9](#9)) ([d7b404e](d7b404e))
  • Loading branch information
semantic-release-bot committed Apr 2, 2019
1 parent d7b404e commit 0cb6603
Show file tree
Hide file tree
Showing 4 changed files with 94 additions and 17 deletions.
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
# [1.3.0](https://github.com/ClearC2/headlamp/compare/v1.2.0...v1.3.0) (2019-04-02)


### Features

* add custom temporary responses ([#9](https://github.com/ClearC2/headlamp/issues/9)) ([d7b404e](https://github.com/ClearC2/headlamp/commit/d7b404e))

# [1.2.0](https://github.com/ClearC2/headlamp/compare/v1.1.2...v1.2.0) (2019-03-29)


Expand Down
16 changes: 8 additions & 8 deletions api-explorer-dist/app.bundle.js

Large diffs are not rendered by default.

86 changes: 78 additions & 8 deletions lib/api-route-provider.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ Object.defineProperty(exports, "__esModule", {
value: true
});

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };

var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };

var _fs = require('fs');

var _fs2 = _interopRequireDefault(_fs);
Expand Down Expand Up @@ -36,16 +36,26 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
enterModule && enterModule(module);
})();

function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }

function _toArray(arr) { return Array.isArray(arr) ? arr : Array.from(arr); }

function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }

var execSync = _child_process2.default.execSync;

var _default = function _default(app) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

var responseStore = createActivationStore();
var customResponseStore = createCustomResponseStore();

function getAllRouteResponses(routeId) {
var fileRoute = getFileRoutes(options.routes).find(function (r) {
return r.id === routeId;
});
var fileResponses = getRouteResponses(options, fileRoute);
var customResponses = customResponseStore.getResponses(routeId);
return fileResponses.concat(customResponses);
}

// create routes from files
getFileRoutes(options.routes).forEach(function (route) {
Expand All @@ -54,7 +64,7 @@ var _default = function _default(app) {
// add methods to route
route.methods.forEach(function (method) {
appRoute[method](function (req, res) {
var responses = getRouteResponses(options, route);
var responses = getAllRouteResponses(route.id);
var respId = responseStore.getActivatedResponseId(route.id);
if (respId !== undefined) {
var resp = responses[respId];
Expand Down Expand Up @@ -257,10 +267,10 @@ var _default = function _default(app) {
var fileRoute = getFileRoutes(options.routes).find(function (r) {
return r.id === routeId;
}) || {};
var responses = getRouteResponses(options, fileRoute);
var responses = getAllRouteResponses(routeId);
var responseId = responseStore.getActivatedResponseId(fileRoute.id);
return res.json({
respId: responseId || fileRoute.response ? null : 0,
respId: responseId || (fileRoute.response ? null : 0),
responses: responses
});
});
Expand All @@ -273,7 +283,7 @@ var _default = function _default(app) {
var fileRoute = getFileRoutes(options.routes).find(function (r) {
return r.id === routeId;
});
var responses = getRouteResponses(options, fileRoute);
var responses = getAllRouteResponses(routeId);
if (fileRoute && responses[respId]) {
responseStore.setActiveResponse(routeId, respId);
}
Expand All @@ -296,6 +306,34 @@ var _default = function _default(app) {
});
});

app.put('/_route/:routeId/responses', function (req, res) {
var routeId = req.params.routeId;

var _customResponseStore$ = customResponseStore.save(routeId, req.body.response),
id = _customResponseStore$.id;

var responses = getAllRouteResponses(routeId);
var index = responses.findIndex(function (r) {
return r.id === id;
});
responseStore.setActiveResponse(routeId, '' + (index > -1 ? index : ''));
return res.json({ message: 'Saved' });
});

app.delete('/_route/:routeId/responses/:id', function (req, res) {
var routeId = req.params.routeId;
var responses = getAllRouteResponses(routeId);
var activeIndex = responseStore.getActivatedResponseId(routeId);
var deleteIndex = responses.findIndex(function (r) {
return r.id === req.params.id;
});
if (Number(activeIndex) === Number(deleteIndex)) {
responseStore.setActiveResponse(routeId, null);
}
customResponseStore.delete(routeId, req.params.id);
return res.json({ message: 'Deleted' });
});

// serve the api explorer
app.use('/_docs', _express2.default.static(_path2.default.resolve(__dirname, '..', 'api-explorer-dist')));

Expand Down Expand Up @@ -345,6 +383,37 @@ function createActivationStore() {
};
}

function createCustomResponseStore() {
var store = {}; //
return {
getResponses: function getResponses(routeId) {
return Array.isArray(store[routeId]) ? store[routeId] : [];
},
save: function save(routeId, response) {
response = _extends({}, response, {
id: response.id || Buffer.from(String(new Date().getTime())).toString('base64')
});
var routeResponses = this.getResponses(routeId);
var index = routeResponses.findIndex(function (r) {
return r.id === response.id;
});
var newResponses = [].concat(_toConsumableArray(routeResponses));
if (index > -1) {
newResponses[index] = response;
} else {
newResponses.push(response);
}
store[routeId] = newResponses;
return response;
},
delete: function _delete(routeId, id) {
store[routeId] = this.getResponses(routeId).filter(function (r) {
return r.id !== id;
});
}
};
}

function getRouteResponses(options, route) {
var routeResponses = Array.isArray(route.responses) ? route.responses : [];
var globalResponses = Array.isArray(options.responses) ? options.responses : [];
Expand Down Expand Up @@ -560,6 +629,7 @@ function nthIndex(str, pat, n) {
reactHotLoader.register(execSync, 'execSync', 'src/api-route-provider.js');
reactHotLoader.register(warnDuplicateRoutes, 'warnDuplicateRoutes', 'src/api-route-provider.js');
reactHotLoader.register(createActivationStore, 'createActivationStore', 'src/api-route-provider.js');
reactHotLoader.register(createCustomResponseStore, 'createCustomResponseStore', 'src/api-route-provider.js');
reactHotLoader.register(getRouteResponses, 'getRouteResponses', 'src/api-route-provider.js');
reactHotLoader.register(getRouteHeaders, 'getRouteHeaders', 'src/api-route-provider.js');
reactHotLoader.register(callIfFunc, 'callIfFunc', 'src/api-route-provider.js');
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "headlamp",
"version": "1.2.0",
"version": "1.3.0",
"description": "Express API documenter",
"main": "lib/index.js",
"scripts": {
Expand Down

0 comments on commit 0cb6603

Please sign in to comment.