UNPKG

decorator-x

Version:

decorator for entity instantiation & validation, auto-generate swagger docs & graphql schema

101 lines (76 loc) 2.94 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.flowToDecorator = undefined; var _regenerator = require('babel-runtime/regenerator'); var _regenerator2 = _interopRequireDefault(_regenerator); var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator'); var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2); /** * Description 执行 Babel 转换过程 * @param fileName * @param destFileName * @returns {Promise.<void>} */ var flowToDecorator = exports.flowToDecorator = function () { var _ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee(fileName) { var destFileName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; var codeStr, out; return _regenerator2.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.next = 2; return readFileAsync(fileName); case 2: codeStr = _context.sent.toString(); // 使用自定义插件进行转化 out = babel.transform(codeStr, { plugins: ['syntax-flow', 'syntax-class-properties', 'syntax-decorators', flowToDecoratorPlugin] }); if (destFileName) { fs.writeFileSync(destFileName, out.code); } return _context.abrupt('return', out.code); case 6: case 'end': return _context.stop(); } } }, _callee, this); })); return function flowToDecorator(_x) { return _ref.apply(this, arguments); }; }(); exports.flowToDecoratorPlugin = flowToDecoratorPlugin; var _ast = require('../../../internal/babel/ast'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var fs = require('fs'); var _require = require('util'), promisify = _require.promisify; var readFileAsync = promisify(fs.readFile); // (A) var babel = require('babel-core'); function flowToDecoratorPlugin(babel) { var t = babel.types; return { name: 'flow-to-decorator-ast-transform', // not required visitor: { Program: function Program(path) { // 添加头部导入库 path.node.body.splice(0, 0, (0, _ast.generateImportDeclaration)('{ entityProperty }', 'swagger-decorator')); }, ClassProperty: function ClassProperty(path, state) { // 判断当前是否已经存在注解,如果不存在则动态创建 if (!path.node.decorators) { var typeAndValue = (0, _ast.extractFlowTypeFromClassProperty)(path.node); path.node.decorators = [(0, _ast.generateDecoratorWithObjectParams)('entityProperty', { type: typeAndValue.type, required: typeAndValue.value === 'undefined' }, typeAndValue.comment)]; } } } }; }