UNPKG

astx

Version:

super powerful structural search and replace for JavaScript and TypeScript to automate your refactoring

117 lines (109 loc) 13.7 kB
import _typesPlugin from 'ast-types/lib/types.js' const typesPlugin = _typesPlugin['default'] || _typesPlugin import * as defaultTypes from '@babel/types' import { memoize, omit, mapValues } from 'lodash-es' import fork from 'ast-types/fork.js' import nodePathPlugin from 'ast-types/lib/node-path.js' const babelAstTypes = memoize((t = defaultTypes) => { function babel(fork) { const types = fork.use(typesPlugin) const { builtInTypes, Type } = types const { def, or } = Type fork.use(nodePathPlugin) def('Node').field('type', builtInTypes.string) function tryConvertValidate(validate, node) { if (!validate) return {} if (validate.type) { switch (validate.type) { case 'any': return {} case 'string': return builtInTypes.string case 'boolean': return builtInTypes.boolean case 'number': return builtInTypes.number case 'null': return builtInTypes.null case 'undefined': return builtInTypes.undefined } } if (validate.chainOf) { for (const elem of validate.chainOf) { const converted = tryConvertValidate(elem) if (converted) return converted } } if (validate.each) { return [convertValidate(validate.each)] } if (validate.oneOfNodeTypes) { return or(...validate.oneOfNodeTypes.map((type) => def(type))) } if (validate.oneOf) { return node !== null && node !== void 0 && node.optional ? or(...validate.oneOf, null) : or(...validate.oneOf) } if (validate.shapeOf) { return mapValues(validate.shapeOf, (value) => convertValidate(value.validate, value) ) } if (validate.oneOfNodeOrValueTypes) { return or( ...validate.oneOfNodeOrValueTypes.map((type) => /^[A-Z]/.test(type) ? def(type) : convertValidate({ type, }) ) ) } } function convertValidate(validate, node) { const converted = tryConvertValidate(validate, node) if (!converted) { throw new Error( `couldn't determine field def for validate: ${JSON.stringify( validate )}` ) } return converted } for (const [type, fields] of Object.entries(t.NODE_FIELDS)) { const d = def(type) d.field('type', type) const aliases = t.ALIAS_KEYS[type] if (aliases) { for (const alias of aliases) { def(alias) } d.bases('Node', ...aliases) } else { d.bases('Node') } for (const [field, { validate, default: _default }] of Object.entries( type === 'File' ? omit(fields, 'tokens') : fields )) { const fieldType = convertValidate(validate) d.field( field, fieldType, Array.isArray(_default) ? () => [..._default] : fieldType === builtInTypes.boolean && _default == null ? () => false : _default !== undefined ? () => _default : undefined ) } } } return fork([babel]) }) export default babelAstTypes //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdHlwZXNQbHVnaW4iLCJ0eXBlc1BsdWdpbiIsImRlZmF1bHRUeXBlcyIsIm1lbW9pemUiLCJvbWl0IiwibWFwVmFsdWVzIiwiZm9yayIsIm5vZGVQYXRoUGx1Z2luIiwiYmFiZWxBc3RUeXBlcyIsInQiLCJiYWJlbCIsInR5cGVzIiwidXNlIiwiYnVpbHRJblR5cGVzIiwiVHlwZSIsImRlZiIsIm9yIiwiZmllbGQiLCJzdHJpbmciLCJ0cnlDb252ZXJ0VmFsaWRhdGUiLCJ2YWxpZGF0ZSIsIm5vZGUiLCJ0eXBlIiwiYm9vbGVhbiIsIm51bWJlciIsIm51bGwiLCJ1bmRlZmluZWQiLCJjaGFpbk9mIiwiZWxlbSIsImNvbnZlcnRlZCIsImVhY2giLCJjb252ZXJ0VmFsaWRhdGUiLCJvbmVPZk5vZGVUeXBlcyIsIm1hcCIsIm9uZU9mIiwib3B0aW9uYWwiLCJzaGFwZU9mIiwidmFsdWUiLCJvbmVPZk5vZGVPclZhbHVlVHlwZXMiLCJ0ZXN0IiwiRXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwiZmllbGRzIiwiT2JqZWN0IiwiZW50cmllcyIsIk5PREVfRklFTERTIiwiZCIsImFsaWFzZXMiLCJBTElBU19LRVlTIiwiYWxpYXMiLCJiYXNlcyIsImRlZmF1bHQiLCJfZGVmYXVsdCIsImZpZWxkVHlwZSIsIkFycmF5IiwiaXNBcnJheSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iYWJlbC9iYWJlbEFzdFR5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfdHlwZXNQbHVnaW4gZnJvbSAnYXN0LXR5cGVzL2xpYi90eXBlcydcbmNvbnN0IHR5cGVzUGx1Z2luOiB0eXBlb2YgX3R5cGVzUGx1Z2luID1cbiAgKF90eXBlc1BsdWdpbiBhcyBhbnkpWydkZWZhdWx0J10gfHwgX3R5cGVzUGx1Z2luXG5pbXBvcnQgKiBhcyBkZWZhdWx0VHlwZXMgZnJvbSAnQGJhYmVsL3R5cGVzJ1xuaW1wb3J0IHsgbWVtb2l6ZSwgb21pdCwgbWFwVmFsdWVzIH0gZnJvbSAnbG9kYXNoJ1xuaW1wb3J0IGZvcmsgZnJvbSAnYXN0LXR5cGVzL2ZvcmsnXG5pbXBvcnQgeyBGb3JrIH0gZnJvbSAnYXN0LXR5cGVzL3R5cGVzJ1xuaW1wb3J0IG5vZGVQYXRoUGx1Z2luIGZyb20gJ2FzdC10eXBlcy9saWIvbm9kZS1wYXRoJ1xuXG5jb25zdCBiYWJlbEFzdFR5cGVzOiAodD86IHR5cGVvZiBkZWZhdWx0VHlwZXMpID0+IFJldHVyblR5cGU8dHlwZW9mIGZvcms+ID1cbiAgbWVtb2l6ZSgodDogdHlwZW9mIGRlZmF1bHRUeXBlcyA9IGRlZmF1bHRUeXBlcyk6IFJldHVyblR5cGU8dHlwZW9mIGZvcms+ID0+IHtcbiAgICBmdW5jdGlvbiBiYWJlbChmb3JrOiBGb3JrKSB7XG4gICAgICBjb25zdCB0eXBlcyA9IGZvcmsudXNlKHR5cGVzUGx1Z2luKVxuICAgICAgY29uc3QgeyBidWlsdEluVHlwZXMsIFR5cGUgfSA9IHR5cGVzXG4gICAgICBjb25zdCB7IGRlZiwgb3IgfSA9IFR5cGVcblxuICAgICAgZm9yay51c2Uobm9kZVBhdGhQbHVnaW4pXG5cbiAgICAgIGRlZignTm9kZScpLmZpZWxkKCd0eXBlJywgYnVpbHRJblR5cGVzLnN0cmluZylcblxuICAgICAgZnVuY3Rpb24gdHJ5Q29udmVydFZhbGlkYXRlKHZhbGlkYXRlOiBhbnksIG5vZGU/OiBhbnkpOiBhbnkge1xuICAgICAgICBpZiAoIXZhbGlkYXRlKSByZXR1cm4ge31cblxuICAgICAgICBpZiAodmFsaWRhdGUudHlwZSkge1xuICAgICAgICAgIHN3aXRjaCAodmFsaWRhdGUudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnYW55JzpcbiAgICAgICAgICAgICAgcmV0dXJuIHt9XG4gICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgICByZXR1cm4gYnVpbHRJblR5cGVzLnN0cmluZ1xuICAgICAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgICAgICAgIHJldHVybiBidWlsdEluVHlwZXMuYm9vbGVhblxuICAgICAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgICAgICAgcmV0dXJuIGJ1aWx0SW5UeXBlcy5udW1iZXJcbiAgICAgICAgICAgIGNhc2UgJ251bGwnOlxuICAgICAgICAgICAgICByZXR1cm4gYnVpbHRJblR5cGVzLm51bGxcbiAgICAgICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgICAgICAgIHJldHVybiBidWlsdEluVHlwZXMudW5kZWZpbmVkXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh2YWxpZGF0ZS5jaGFpbk9mKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBlbGVtIG9mIHZhbGlkYXRlLmNoYWluT2YpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnZlcnRlZCA9IHRyeUNvbnZlcnRWYWxpZGF0ZShlbGVtKVxuICAgICAgICAgICAgaWYgKGNvbnZlcnRlZCkgcmV0dXJuIGNvbnZlcnRlZFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsaWRhdGUuZWFjaCkge1xuICAgICAgICAgIHJldHVybiBbY29udmVydFZhbGlkYXRlKHZhbGlkYXRlLmVhY2gpXVxuICAgICAgICB9XG4gICAgICAgIGlmICh2YWxpZGF0ZS5vbmVPZk5vZGVUeXBlcykge1xuICAgICAgICAgIHJldHVybiBvciguLi52YWxpZGF0ZS5vbmVPZk5vZGVUeXBlcy5tYXAoKHR5cGU6IHN0cmluZykgPT4gZGVmKHR5cGUpKSlcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsaWRhdGUub25lT2YpIHtcbiAgICAgICAgICByZXR1cm4gbm9kZT8ub3B0aW9uYWxcbiAgICAgICAgICAgID8gb3IoLi4udmFsaWRhdGUub25lT2YsIG51bGwpXG4gICAgICAgICAgICA6IG9yKC4uLnZhbGlkYXRlLm9uZU9mKVxuICAgICAgICB9XG4gICAgICAgIGlmICh2YWxpZGF0ZS5zaGFwZU9mKSB7XG4gICAgICAgICAgcmV0dXJuIG1hcFZhbHVlcyh2YWxpZGF0ZS5zaGFwZU9mLCAodmFsdWUpID0+XG4gICAgICAgICAgICBjb252ZXJ0VmFsaWRhdGUodmFsdWUudmFsaWRhdGUsIHZhbHVlKVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsaWRhdGUub25lT2ZOb2RlT3JWYWx1ZVR5cGVzKSB7XG4gICAgICAgICAgcmV0dXJuIG9yKFxuICAgICAgICAgICAgLi4udmFsaWRhdGUub25lT2ZOb2RlT3JWYWx1ZVR5cGVzLm1hcCgodHlwZTogc3RyaW5nKSA9PlxuICAgICAgICAgICAgICAvXltBLVpdLy50ZXN0KHR5cGUpID8gZGVmKHR5cGUpIDogY29udmVydFZhbGlkYXRlKHsgdHlwZSB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjb252ZXJ0VmFsaWRhdGUodmFsaWRhdGU6IGFueSwgbm9kZT86IGFueSk6IGFueSB7XG4gICAgICAgIGNvbnN0IGNvbnZlcnRlZCA9IHRyeUNvbnZlcnRWYWxpZGF0ZSh2YWxpZGF0ZSwgbm9kZSlcbiAgICAgICAgaWYgKCFjb252ZXJ0ZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgY291bGRuJ3QgZGV0ZXJtaW5lIGZpZWxkIGRlZiBmb3IgdmFsaWRhdGU6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgIHZhbGlkYXRlXG4gICAgICAgICAgICApfWBcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnZlcnRlZFxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IFt0eXBlLCBmaWVsZHNdIG9mIE9iamVjdC5lbnRyaWVzKHQuTk9ERV9GSUVMRFMpKSB7XG4gICAgICAgIGNvbnN0IGQgPSBkZWYodHlwZSlcbiAgICAgICAgZC5maWVsZCgndHlwZScsIHR5cGUpXG4gICAgICAgIGNvbnN0IGFsaWFzZXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkID0gKHQuQUxJQVNfS0VZUyBhcyBhbnkpW3R5cGVdXG4gICAgICAgIGlmIChhbGlhc2VzKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBhbGlhcyBvZiBhbGlhc2VzKSB7XG4gICAgICAgICAgICBkZWYoYWxpYXMpXG4gICAgICAgICAgfVxuICAgICAgICAgIGQuYmFzZXMoJ05vZGUnLCAuLi5hbGlhc2VzKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGQuYmFzZXMoJ05vZGUnKVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgW2ZpZWxkLCB7IHZhbGlkYXRlLCBkZWZhdWx0OiBfZGVmYXVsdCB9XSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgICAgICB0eXBlID09PSAnRmlsZScgPyBvbWl0KGZpZWxkcywgJ3Rva2VucycpIDogZmllbGRzXG4gICAgICAgICkpIHtcbiAgICAgICAgICBjb25zdCBmaWVsZFR5cGUgPSBjb252ZXJ0VmFsaWRhdGUodmFsaWRhdGUpXG4gICAgICAgICAgZC5maWVsZChcbiAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgZmllbGRUeXBlLFxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheShfZGVmYXVsdClcbiAgICAgICAgICAgICAgPyAoKSA9PiBbLi4uX2RlZmF1bHRdXG4gICAgICAgICAgICAgIDogZmllbGRUeXBlID09PSBidWlsdEluVHlwZXMuYm9vbGVhbiAmJiBfZGVmYXVsdCA9PSBudWxsXG4gICAgICAgICAgICAgID8gKCkgPT4gZmFsc2VcbiAgICAgICAgICAgICAgOiBfZGVmYXVsdCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gKCkgPT4gX2RlZmF1bHRcbiAgICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZm9yayhbYmFiZWxdKVxuICB9KVxuXG5leHBvcnQgZGVmYXVsdCBiYWJlbEFzdFR5cGVzXG4iXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9B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