Skip to content

Commit

Permalink
[BUILD]v1.3.0
Browse files Browse the repository at this point in the history
  • Loading branch information
Cody2333 committed Mar 26, 2018
1 parent fdc788e commit c4c5933
Show file tree
Hide file tree
Showing 3 changed files with 164 additions and 85 deletions.
81 changes: 81 additions & 0 deletions dist/swaggerJSON.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
'use strict';

Object.defineProperty(exports, "__esModule", {
value: true
});
exports.swaggerJSON = undefined;

var _lodash = require('lodash');

var _lodash2 = _interopRequireDefault(_lodash);

var _swaggerTemplate = require('./swaggerTemplate');

var _swaggerTemplate2 = _interopRequireDefault(_swaggerTemplate);

var _utils = require('./utils');

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

/**
* build swagger json from apiObjects
*/
const swaggerJSON = (options = {}, apiObjects) => {
const {
title,
description,
version,
prefix = '',
swaggerOptions = {}
} = options;
const swaggerJSON = (0, _swaggerTemplate2.default)(title, description, version, swaggerOptions);

_lodash2.default.chain(apiObjects).forEach(value => {
if (!Object.keys(value).includes('request')) {
throw new Error('missing [request] field');
}

const { method } = value.request;
let { path } = value.request;
path = (0, _utils.getPath)(prefix, path); // 根据前缀补全path
const summary = value.summary ? value.summary : '';
const description = value.description ? value.description : summary;
const responses = value.responses ? value.responses : {
200: {
description: 'success'
}
};
const {
query = [],
path: pathParams = [],
body = [],
tags,
formData = [],
security
} = value;

const parameters = [...pathParams, ...query, ...formData, ...body];

// init path object first
if (!swaggerJSON.paths[path]) {
swaggerJSON.paths[path] = {};
}

// add content type [multipart/form-data] to support file upload
const consumes = formData.length > 0 ? ['multipart/form-data'] : undefined;

swaggerJSON.paths[path][method] = {
consumes,
summary,
description,
parameters,
responses,
tags,
security
};
}).value();
return swaggerJSON;
};

exports.default = swaggerJSON;
exports.swaggerJSON = swaggerJSON;
65 changes: 65 additions & 0 deletions dist/utils.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
'use strict';

Object.defineProperty(exports, "__esModule", {
value: true
});
exports.readSync = exports.isSwaggerRouter = exports.getPath = exports.convertPath = undefined;

var _koaRouter = require('koa-router');

var _koaRouter2 = _interopRequireDefault(_koaRouter);

var _fs2 = require('fs');

var _fs3 = _interopRequireDefault(_fs2);

var _path2 = require('path');

var _path3 = _interopRequireDefault(_path2);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

/**
* eg. /api/{id} -> /api/:id
* @param {String} path
*/
const convertPath = path => {
const re = new RegExp('{(.*?)}', 'g');
return path.replace(re, ':$1');
};

const getPath = (prefix, path) => `${prefix}${path}`.replace('//', '/');

/**
* check if an object is an instance of SwaggerRouter
* @param {Object} o
*/
const isSwaggerRouter = o => {
if (!o || o instanceof _koaRouter2.default) {
return false;
}
return true;
};

/**
* read all files in the dir
* @param {String} dir
* @param {Array} result
* @param {Boolean} recursive
* @returns {Array} an array containing file url
*/
const readSync = (dir, result = [], recursive = false) => {
const files = _fs3.default.readdirSync(dir);
files.forEach(filename => {
const filedir = _path3.default.join(dir, filename);
const stat = _fs3.default.statSync(filedir);
if (stat.isFile()) result.push(filedir);
if (recursive && stat.isDirectory()) readSync(filedir, result, true);
});
return result;
};

exports.convertPath = convertPath;
exports.getPath = getPath;
exports.isSwaggerRouter = isSwaggerRouter;
exports.readSync = readSync;
103 changes: 18 additions & 85 deletions dist/wrapper.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,6 @@
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getPath = exports.convertPath = undefined;

var _path2 = require('path');

var _path3 = _interopRequireDefault(_path2);

var _lodash = require('lodash');

Expand All @@ -19,28 +14,19 @@ var _validate2 = _interopRequireDefault(_validate);

var _swaggerHTML = require('./swaggerHTML');

var _swaggerTemplate = require('./swaggerTemplate');

var _swaggerTemplate2 = _interopRequireDefault(_swaggerTemplate);
var _swaggerJSON = require('./swaggerJSON');

var _index = require('./index');

var _utils = require('./utils');

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

/**
* allowed http methods
*/
const reqMethods = ['get', 'post', 'put', 'patch', 'delete'];

/**
* eg. /api/{id} -> /api/:id
* @param {String} path
*/
const convertPath = path => {
const re = new RegExp('{(.*?)}', 'g');
return path.replace(re, ':$1');
};

/**
* middlewara for validating [query, path, body] params
* @param {Object} parameters
Expand All @@ -63,67 +49,6 @@ const validator = parameters => async (ctx, next) => {
await next();
};

const getPath = (prefix, path) => `${prefix}${path}`.replace('//', '/');
/**
* 构建swagger的json
*/
const buildSwaggerJson = (options = {}, apiObjects) => {
const {
title,
description,
version,
prefix = '',
swaggerOptions = {}
} = options;
const swaggerJSON = (0, _swaggerTemplate2.default)(title, description, version, swaggerOptions);

_lodash2.default.chain(apiObjects).forEach(value => {
if (!Object.keys(value).includes('request')) {
throw new Error('missing [request] field');
}

const { method } = value.request;
let { path } = value.request;
path = getPath(prefix, path); // 根据前缀补全path
const summary = value.summary ? value.summary : '';
const description = value.description ? value.description : summary;
const responses = value.responses ? value.responses : {
200: {
description: 'success'
}
};
const {
query = [],
path: pathParams = [],
body = [],
tags,
formData = [],
security
} = value;

const parameters = [...pathParams, ...query, ...formData, ...body];

// init path object first
if (!swaggerJSON.paths[path]) {
swaggerJSON.paths[path] = {};
}

// add content type [multipart/form-data] to support file upload
const consumes = formData.length > 0 ? ['multipart/form-data'] : undefined;

swaggerJSON.paths[path][method] = {
consumes,
summary,
description,
parameters,
responses,
tags,
security
};
}).value();
return swaggerJSON;
};

/**
* add [ router.map ] and [ router.swagger ] for router object
* @param {Object} router
Expand All @@ -139,18 +64,18 @@ exports.default = router => {

// setup swagger router
router.get(swaggerJsonEndpoint, async ctx => {
ctx.body = buildSwaggerJson(options, _index.apiObjects);
ctx.body = (0, _swaggerJSON.swaggerJSON)(options, _index.apiObjects);
});
router.get(swaggerHtmlEndpoint, async ctx => {
ctx.body = (0, _swaggerHTML.swaggerHTML)(getPath(prefix, swaggerJsonEndpoint));
ctx.body = (0, _swaggerHTML.swaggerHTML)((0, _utils.getPath)(prefix, swaggerJsonEndpoint));
});
};
router.map = StaticClass => {
if (!(0, _utils.isSwaggerRouter)(StaticClass)) return;
const methods = Object.getOwnPropertyNames(StaticClass);

// remove useless field in class object: constructor, length, name, prototype
_lodash2.default.pull(methods, 'name', 'constructor', 'length', 'prototype');

// map all method in methods
methods
// filter methods withour @request decorator
Expand Down Expand Up @@ -181,11 +106,19 @@ exports.default = router => {
if (!reqMethods.includes(method)) {
throw new Error(`illegal API: ${method} ${path} at [${item}]`);
}
const chain = [`${convertPath(path)}`, validator(StaticClass[item].parameters), ...middlewares, StaticClass[item]];
const chain = [`${(0, _utils.convertPath)(path)}`, validator(StaticClass[item].parameters), ...middlewares, StaticClass[item]];
router[method](...chain);
});
};
};

exports.convertPath = convertPath;
exports.getPath = getPath;
router.mapDir = (dir, options = {}) => {
const { recursive = false } = options;
const filenames = (0, _utils.readSync)(dir, [], recursive);
/* eslint-disable*/
const classes = filenames.map(filename => require(filename));
/* eslint-disable*/
classes.map(c => c.default).forEach(c => {
router.map(c);
});
};
};

0 comments on commit c4c5933

Please sign in to comment.