lib/helper.js (183 lines of code) (raw):

'use strict'; const REQUEST = 'request_'; const RESPONSE = 'response_'; const CORE = '$dara'; const fs = require('fs'); const path = require('path'); function _escape(str) { return str.includes('-') ? `'${str}'` : str; } function _name(str) { if (str.lexeme === '__request') { return REQUEST; } if (str.lexeme === '__response') { return RESPONSE; } return str.lexeme || str.name; } function _avoidModel(name) { if(name.toLowerCase() === 'model') { return `${name}_`; } return name; } function _snakeCase(str) { if (!str) { return ''; } let res = ''; let tmp = ''; for (const [, c] of [...str].entries()) { // 检查字符是否为大写字母或数字 if (/[A-Z0-9]/.test(c)) { tmp += c; } else { if (tmp.length > 0) { res += (res === '' ? tmp.toLowerCase() : '_' + tmp.toLowerCase()); tmp = ''; } res += c; } } if (tmp.length > 0) { res += (res === '' ? tmp.toLowerCase() : '_' + tmp.toLowerCase()); } return res; } function _upperFirst(str) { return str[0].toUpperCase() + str.substring(1); } function _subModelName(name) { return name.split('.').map((name) => _upperFirst(name)).join(''); } function _camelCase(str, split = '_') { // 先将字符串中的下划线拆分 if (str.indexOf(split) > -1) { let tmp = str.split(split); tmp = tmp.map((s, i) => { // 如果是第一个单词则不处理,其他单词首字母大写 return _upperFirst(s); }); str = tmp.join(''); } else { // 如果没有下划线,对整个字符串首字母大写 str = _upperFirst(str); } return str; } function _string(str) { if (str.string === '""') { return '\\"\\"'; } return str.string.replace(/([^\\])"+|^"/g, function(str){ return str.replace(/"/g, '\\"'); }); } function _isBinaryOp(type){ const op = [ 'or', 'eq', 'neq', 'gt', 'gte', 'lt', 'lte', 'add', 'subtract', 'div', 'multi', 'and' ]; return op.includes(type); } function _type(name, usedTypes = []) { let type = name; if (name === 'integer' || name === 'number' || name === 'int8' || name === 'uint8' || name === 'int16' || name === 'uint16' || name === 'int32' || name === 'uint32' || name === 'int64' || name === 'uint64' || name === 'long' || name === 'ulong' || name === 'float' || name === 'double') { type = 'number'; } if (name === 'readable') { type = 'Readable'; } if (name === 'writable') { type = 'Writable'; } if (name === '$Request') { type = '$dara.Request'; } if (name === '$Response') { type = '$dara.Response'; } if (name === '$Model') { type = '$dara.Model'; } if (name === '$Error') { type = '$dara.BaseError'; } if (name === '$SSEEvent') { type = '$dara.SSEEvent'; } if (name === '$RetryOptions') { type = '$dara.RetryOptions'; } if (name === '$RuntimeOptions') { type = '$dara.RuntimeOptions'; } if (name === '$ResponseError') { type = '$dara.ResponseError'; } if (name === '$FileField') { type = '$dara.FileField'; } if (name === '$ExtendsParameters') { type = '$dara.ExtendsParameters'; } if (name === '$Date') { type = '$dara.Date'; } if (name === '$File') { type = '$dara.File'; } if (name === '$URL') { type = '$dara.URL'; } if (name === '$Stream') { type = '$dara.Stream'; } if (name === 'object') { type = '{[key: string]: any}'; } if (name === 'bytes') { type = `Buffer`; } usedTypes.push(type); return type; } function _isDefault(expr) { if(expr.type !== 'call' || expr.left.type !== 'method_call') { return false; } const name = _name(expr.left.id); if(name !== '$default') { return false; } return true; } function _vid(vid) { return `_${_name(vid).substr(1)}`; } function _removeFilesInDirectory(directoryPath) { if(!fs.existsSync(directoryPath)) { return; } const files = fs.readdirSync(directoryPath); for (const file of files) { const filePath = path.join(directoryPath, file); const stat = fs.statSync(filePath); if (stat.isDirectory()) { _removeFilesInDirectory(filePath); fs.rmdirSync(filePath); } else { fs.unlinkSync(filePath); } } } module.exports = { _name, _string, _type, _subModelName, _vid, _upperFirst, _isBinaryOp, _escape, _isDefault, _snakeCase, _camelCase, REQUEST, RESPONSE, CORE, _removeFilesInDirectory, _avoidModel };