astx
Version:
super powerful structural search and replace for JavaScript and TypeScript to automate your refactoring
117 lines (109 loc) • 13.7 kB
JavaScript
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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