import t from "@babel/types"; import virtualTypes from "../../lib/path/lib/virtual-types.js"; import definitions from "@babel/types/lib/definitions/index.js"; export default function generateValidators() { let output = `/* * This file is auto-generated! Do not modify it directly. * To re-generate run 'make build' */ import * as t from "@babel/types"; import NodePath from "../index"; import type { VirtualTypeAliases } from "./virtual-types"; export interface NodePathValidators { `; for (const type of [...t.TYPES].sort()) { output += `is${type}(opts?: object): this is NodePath<t.${type}>;`; } for (const type of Object.keys(virtualTypes)) { const { types } = virtualTypes[type]; if (type[0] === "_") continue; if (definitions.NODE_FIELDS[type] || definitions.FLIPPED_ALIAS_KEYS[type]) { output += `is${type}(opts?: object): this is NodePath<t.${type}>;`; } else if (types /* in VirtualTypeAliases */) { output += `is${type}(opts?: object): this is NodePath<VirtualTypeAliases["${type}"]>;`; } else { // if it don't have types, then VirtualTypeAliases[type] is t.Node // which TS marked as always true // eg. if (path.isBlockScope()) return; // path resolved to `never` here // so we have to return boolean instead of this is NodePath<t.Node> here output += `is${type}(opts?: object): boolean;`; } } output += ` } `; return output; }