| Server IP : 185.11.201.71 / Your IP : 192.168.7.18 Web Server : Apache/2.4.29 (Ubuntu) System : Linux tech-virtual-machine 4.15.0-213-generic #224-Ubuntu SMP Mon Jun 19 13:30:12 UTC 2023 x86_64 User : tech ( 1000) PHP Version : 7.4.28 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, MySQL : OFF | cURL : OFF | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : ON Directory : /comunica/app_ojos_/frontend/node_modules/ast-kit/dist/ |
Upload File : |
// src/check.ts
function isTypeOf(node, types) {
if (!node) return false;
return [].concat(types).some((type) => {
if (type === "Function") {
return isFunctionType(node);
} else if (type === "Literal") {
return isLiteralType(node);
} else if (type === "Expression") {
return isExpressionType(node);
} else {
return node.type === type;
}
});
}
function isCallOf(node, test) {
return !!node && node.type === "CallExpression" && node.callee.type === "Identifier" && (typeof test === "string" ? node.callee.name === test : Array.isArray(test) ? test.includes(node.callee.name) : test(node.callee.name));
}
function isIdentifierOf(node, test) {
return !!node && node.type === "Identifier" && (typeof test === "string" ? node.name === test : test.includes(node.name));
}
function isLiteralType(node) {
return !!node && node.type.endsWith("Literal");
}
function isFunctionType(node) {
return !!node && !node.type.startsWith("TS") && /Function(?:Expression|Declaration)$|Method$/.test(node.type);
}
function isExpressionType(node) {
return !!node && (node.type.endsWith("Expression") || isLiteralType(node) || [
"Identifier",
"MetaProperty",
"Super",
"Import",
"JSXElement",
"JSXFragment",
"TopicReference",
"PipelineBareFunction",
"PipelinePrimaryTopicReference",
"TSTypeAssertion"
].includes(node.type));
}
function isReferenced(node, parent, grandparent) {
switch (parent.type) {
// yes: PARENT[NODE]
// yes: NODE.child
// no: parent.NODE
case "MemberExpression":
case "OptionalMemberExpression":
if (parent.property === node) {
return !!parent.computed;
}
return parent.object === node;
case "JSXMemberExpression":
return parent.object === node;
// no: let NODE = init;
// yes: let id = NODE;
case "VariableDeclarator":
return parent.init === node;
// yes: () => NODE
// no: (NODE) => {}
case "ArrowFunctionExpression":
return parent.body === node;
// no: class { #NODE; }
// no: class { get #NODE() {} }
// no: class { #NODE() {} }
// no: class { fn() { return this.#NODE; } }
case "PrivateName":
return false;
// no: class { NODE() {} }
// yes: class { [NODE]() {} }
// no: class { foo(NODE) {} }
case "ClassMethod":
case "ClassPrivateMethod":
case "ObjectMethod":
if (parent.key === node) {
return !!parent.computed;
}
return false;
// yes: { [NODE]: "" }
// no: { NODE: "" }
// depends: { NODE }
// depends: { key: NODE }
case "ObjectProperty":
if (parent.key === node) {
return !!parent.computed;
}
return !grandparent || grandparent.type !== "ObjectPattern";
// no: class { NODE = value; }
// yes: class { [NODE] = value; }
// yes: class { key = NODE; }
case "ClassProperty":
case "ClassAccessorProperty":
if (parent.key === node) {
return !!parent.computed;
}
return true;
case "ClassPrivateProperty":
return parent.key !== node;
// no: class NODE {}
// yes: class Foo extends NODE {}
case "ClassDeclaration":
case "ClassExpression":
return parent.superClass === node;
// yes: left = NODE;
// no: NODE = right;
case "AssignmentExpression":
return parent.right === node;
// no: [NODE = foo] = [];
// yes: [foo = NODE] = [];
case "AssignmentPattern":
return parent.right === node;
// no: NODE: for (;;) {}
case "LabeledStatement":
return false;
// no: try {} catch (NODE) {}
case "CatchClause":
return false;
// no: function foo(...NODE) {}
case "RestElement":
return false;
case "BreakStatement":
case "ContinueStatement":
return false;
// no: function NODE() {}
// no: function foo(NODE) {}
case "FunctionDeclaration":
case "FunctionExpression":
return false;
// no: export NODE from "foo";
// no: export * as NODE from "foo";
case "ExportNamespaceSpecifier":
case "ExportDefaultSpecifier":
return false;
// no: export { foo as NODE };
// yes: export { NODE as foo };
// no: export { NODE as foo } from "foo";
case "ExportSpecifier":
if (grandparent?.source) {
return false;
}
return parent.local === node;
// no: import NODE from "foo";
// no: import * as NODE from "foo";
// no: import { NODE as foo } from "foo";
// no: import { foo as NODE } from "foo";
// no: import NODE from "bar";
case "ImportDefaultSpecifier":
case "ImportNamespaceSpecifier":
case "ImportSpecifier":
return false;
// no: import "foo" assert { NODE: "json" }
case "ImportAttribute":
return false;
// no: <div NODE="foo" />
case "JSXAttribute":
return false;
// no: [NODE] = [];
// no: ({ NODE }) = [];
case "ObjectPattern":
case "ArrayPattern":
return false;
// no: new.NODE
// no: NODE.target
case "MetaProperty":
return false;
// yes: type X = { someProperty: NODE }
// no: type X = { NODE: OtherType }
case "ObjectTypeProperty":
return parent.key !== node;
// yes: enum X { Foo = NODE }
// no: enum X { NODE }
case "TSEnumMember":
return parent.id !== node;
// yes: { [NODE]: value }
// no: { NODE: value }
case "TSPropertySignature":
if (parent.key === node) {
return !!parent.computed;
}
return true;
}
return true;
}
// src/create.ts
function createStringLiteral(value) {
return {
type: "StringLiteral",
value,
extra: {
rawValue: value,
raw: JSON.stringify(value)
}
};
}
function createTSUnionType(types) {
return {
type: "TSUnionType",
types
};
}
function createTSLiteralType(literal) {
return {
type: "TSLiteralType",
literal
};
}
// src/extract.ts
function extractIdentifiers(node, identifiers = []) {
switch (node.type) {
case "Identifier":
identifiers.push(node);
break;
case "MemberExpression": {
let object = node;
while (object.type === "MemberExpression") {
object = object.object;
}
identifiers.push(object);
break;
}
case "ObjectPattern":
for (const prop of node.properties) {
if (prop.type === "RestElement") {
extractIdentifiers(prop.argument, identifiers);
} else {
extractIdentifiers(prop.value, identifiers);
}
}
break;
case "ArrayPattern":
node.elements.forEach((element) => {
element && extractIdentifiers(element, identifiers);
});
break;
case "RestElement":
extractIdentifiers(node.argument, identifiers);
break;
case "AssignmentPattern":
extractIdentifiers(node.left, identifiers);
break;
}
return identifiers;
}
// src/lang.ts
import { extname } from "pathe";
var REGEX_DTS = /\.d\.[cm]?ts(\?.*)?$/;
var REGEX_LANG_TS = /^[cm]?tsx?$/;
var REGEX_LANG_JSX = /^[cm]?[jt]sx$/;
function getLang(filename) {
if (isDts(filename)) return "dts";
return extname(filename).replace(/^\./, "").replace(/\?.*$/, "");
}
function isDts(filename) {
return REGEX_DTS.test(filename);
}
function isTs(lang) {
return !!lang && (lang === "dts" || REGEX_LANG_TS.test(lang));
}
// src/loc.ts
function locateTrailingComma(code, start, end, comments = []) {
let i = start;
while (i < end) {
if (comments.some((c) => i >= c.start && i < c.end)) {
i++;
continue;
}
const char = code[i];
if (["}", ")"].includes(char)) return -1;
if (char === ",") return i;
i++;
}
return -1;
}
// src/parse.ts
import {
parse,
parseExpression
} from "@babel/parser";
function hasPlugin(plugins, plugin) {
return plugins.some((p) => (Array.isArray(p) ? p[0] : p) === plugin);
}
function getParserOptions(lang, options = {}) {
const plugins = [...options.plugins || []];
if (isTs(lang)) {
if (!hasPlugin(plugins, "typescript")) {
plugins.push(
lang === "dts" ? ["typescript", { dts: true }] : "typescript"
);
}
if (!hasPlugin(plugins, "decorators") && !hasPlugin(plugins, "decorators-legacy")) {
plugins.push("decorators-legacy");
}
if (!hasPlugin(plugins, "importAttributes") && !hasPlugin(plugins, "importAssertions")) {
plugins.push(["importAttributes", { deprecatedAssertSyntax: true }]);
}
if (!hasPlugin(plugins, "explicitResourceManagement")) {
plugins.push("explicitResourceManagement");
}
if (REGEX_LANG_JSX.test(lang) && !hasPlugin(plugins, "jsx")) {
plugins.push("jsx");
}
} else if (!hasPlugin(plugins, "jsx")) {
plugins.push("jsx");
}
return {
sourceType: "module",
...options,
plugins
};
}
function babelParse(code, lang, options = {}) {
const { program, errors, comments } = parse(
code,
getParserOptions(lang, options)
);
return { ...program, errors, comments };
}
function babelParseExpression(code, lang, options = {}) {
return parseExpression(
code,
getParserOptions(lang, options)
);
}
// src/resolve.ts
function resolveString(node, computed = false) {
if (typeof node === "string") return node;
else if (node.type === "Identifier") {
if (computed) throw new TypeError("Invalid Identifier");
return node.name;
} else if (node.type === "PrivateName") {
return `#${node.id.name}`;
} else if (node.type === "ThisExpression") {
return "this";
} else if (node.type === "Super") {
return "super";
}
return String(resolveLiteral(node));
}
function resolveLiteral(node) {
switch (node.type) {
case "TemplateLiteral":
return resolveTemplateLiteral(node);
case "NullLiteral":
return null;
case "BigIntLiteral":
return BigInt(node.value);
case "RegExpLiteral":
return new RegExp(node.pattern, node.flags);
case "BooleanLiteral":
case "NumericLiteral":
case "StringLiteral":
return node.value;
/* c8 ignore next 2 */
case "DecimalLiteral":
return Number(node.value);
}
}
function resolveTemplateLiteral(node) {
return node.quasis.reduce((prev, curr, idx) => {
const expr = node.expressions[idx];
if (expr) {
if (!isLiteralType(expr))
throw new TypeError("TemplateLiteral expression must be a literal");
return prev + curr.value.cooked + resolveLiteral(expr);
}
return prev + curr.value.cooked;
}, "");
}
function resolveIdentifier(node) {
if (isTypeOf(node, ["Identifier", "PrivateName", "ThisExpression", "Super"]))
return [resolveString(node)];
const left = node.type === "TSQualifiedName" ? node.left : node.object;
const right = node.type === "TSQualifiedName" ? node.right : node.property;
const computed = node.type === "TSQualifiedName" ? false : node.computed;
if (isTypeOf(left, [
"Identifier",
"MemberExpression",
"ThisExpression",
"Super",
"TSQualifiedName"
])) {
const keys = resolveIdentifier(left);
if (isTypeOf(right, ["Identifier", "PrivateName", "Literal"])) {
keys.push(resolveString(right, computed));
} else {
throw new TypeError("Invalid Identifier");
}
return keys;
}
throw new TypeError("Invalid Identifier");
}
function tryResolveIdentifier(...args) {
try {
return resolveIdentifier(...args);
} catch {
return;
}
}
function resolveObjectKey(node, raw = false) {
const { key, computed } = node;
switch (key.type) {
case "StringLiteral":
case "NumericLiteral":
return raw ? key.extra.raw : key.value;
case "Identifier":
if (!computed) return raw ? `"${key.name}"` : key.name;
throw "Cannot resolve computed Identifier";
default:
throw new SyntaxError(`Unexpected node type: ${key.type}`);
}
}
// node_modules/.pnpm/estree-walker@3.0.3/node_modules/estree-walker/src/walker.js
var WalkerBase = class {
constructor() {
this.should_skip = false;
this.should_remove = false;
this.replacement = null;
this.context = {
skip: () => this.should_skip = true,
remove: () => this.should_remove = true,
replace: (node) => this.replacement = node
};
}
/**
* @template {Node} Parent
* @param {Parent | null | undefined} parent
* @param {keyof Parent | null | undefined} prop
* @param {number | null | undefined} index
* @param {Node} node
*/
replace(parent, prop, index, node) {
if (parent && prop) {
if (index != null) {
parent[prop][index] = node;
} else {
parent[prop] = node;
}
}
}
/**
* @template {Node} Parent
* @param {Parent | null | undefined} parent
* @param {keyof Parent | null | undefined} prop
* @param {number | null | undefined} index
*/
remove(parent, prop, index) {
if (parent && prop) {
if (index !== null && index !== void 0) {
parent[prop].splice(index, 1);
} else {
delete parent[prop];
}
}
}
};
// node_modules/.pnpm/estree-walker@3.0.3/node_modules/estree-walker/src/sync.js
var SyncWalker = class extends WalkerBase {
/**
*
* @param {SyncHandler} [enter]
* @param {SyncHandler} [leave]
*/
constructor(enter, leave) {
super();
this.should_skip = false;
this.should_remove = false;
this.replacement = null;
this.context = {
skip: () => this.should_skip = true,
remove: () => this.should_remove = true,
replace: (node) => this.replacement = node
};
this.enter = enter;
this.leave = leave;
}
/**
* @template {Node} Parent
* @param {Node} node
* @param {Parent | null} parent
* @param {keyof Parent} [prop]
* @param {number | null} [index]
* @returns {Node | null}
*/
visit(node, parent, prop, index) {
if (node) {
if (this.enter) {
const _should_skip = this.should_skip;
const _should_remove = this.should_remove;
const _replacement = this.replacement;
this.should_skip = false;
this.should_remove = false;
this.replacement = null;
this.enter.call(this.context, node, parent, prop, index);
if (this.replacement) {
node = this.replacement;
this.replace(parent, prop, index, node);
}
if (this.should_remove) {
this.remove(parent, prop, index);
}
const skipped = this.should_skip;
const removed = this.should_remove;
this.should_skip = _should_skip;
this.should_remove = _should_remove;
this.replacement = _replacement;
if (skipped) return node;
if (removed) return null;
}
let key;
for (key in node) {
const value = node[key];
if (value && typeof value === "object") {
if (Array.isArray(value)) {
const nodes = (
/** @type {Array<unknown>} */
value
);
for (let i = 0; i < nodes.length; i += 1) {
const item = nodes[i];
if (isNode(item)) {
if (!this.visit(item, node, key, i)) {
i--;
}
}
}
} else if (isNode(value)) {
this.visit(value, node, key, null);
}
}
}
if (this.leave) {
const _replacement = this.replacement;
const _should_remove = this.should_remove;
this.replacement = null;
this.should_remove = false;
this.leave.call(this.context, node, parent, prop, index);
if (this.replacement) {
node = this.replacement;
this.replace(parent, prop, index, node);
}
if (this.should_remove) {
this.remove(parent, prop, index);
}
const removed = this.should_remove;
this.replacement = _replacement;
this.should_remove = _should_remove;
if (removed) return null;
}
}
return node;
}
};
function isNode(value) {
return value !== null && typeof value === "object" && "type" in value && typeof value.type === "string";
}
// node_modules/.pnpm/estree-walker@3.0.3/node_modules/estree-walker/src/async.js
var AsyncWalker = class extends WalkerBase {
/**
*
* @param {AsyncHandler} [enter]
* @param {AsyncHandler} [leave]
*/
constructor(enter, leave) {
super();
this.should_skip = false;
this.should_remove = false;
this.replacement = null;
this.context = {
skip: () => this.should_skip = true,
remove: () => this.should_remove = true,
replace: (node) => this.replacement = node
};
this.enter = enter;
this.leave = leave;
}
/**
* @template {Node} Parent
* @param {Node} node
* @param {Parent | null} parent
* @param {keyof Parent} [prop]
* @param {number | null} [index]
* @returns {Promise<Node | null>}
*/
async visit(node, parent, prop, index) {
if (node) {
if (this.enter) {
const _should_skip = this.should_skip;
const _should_remove = this.should_remove;
const _replacement = this.replacement;
this.should_skip = false;
this.should_remove = false;
this.replacement = null;
await this.enter.call(this.context, node, parent, prop, index);
if (this.replacement) {
node = this.replacement;
this.replace(parent, prop, index, node);
}
if (this.should_remove) {
this.remove(parent, prop, index);
}
const skipped = this.should_skip;
const removed = this.should_remove;
this.should_skip = _should_skip;
this.should_remove = _should_remove;
this.replacement = _replacement;
if (skipped) return node;
if (removed) return null;
}
let key;
for (key in node) {
const value = node[key];
if (value && typeof value === "object") {
if (Array.isArray(value)) {
const nodes = (
/** @type {Array<unknown>} */
value
);
for (let i = 0; i < nodes.length; i += 1) {
const item = nodes[i];
if (isNode2(item)) {
if (!await this.visit(item, node, key, i)) {
i--;
}
}
}
} else if (isNode2(value)) {
await this.visit(value, node, key, null);
}
}
}
if (this.leave) {
const _replacement = this.replacement;
const _should_remove = this.should_remove;
this.replacement = null;
this.should_remove = false;
await this.leave.call(this.context, node, parent, prop, index);
if (this.replacement) {
node = this.replacement;
this.replace(parent, prop, index, node);
}
if (this.should_remove) {
this.remove(parent, prop, index);
}
const removed = this.should_remove;
this.replacement = _replacement;
this.should_remove = _should_remove;
if (removed) return null;
}
}
return node;
}
};
function isNode2(value) {
return value !== null && typeof value === "object" && "type" in value && typeof value.type === "string";
}
// node_modules/.pnpm/estree-walker@3.0.3/node_modules/estree-walker/src/index.js
function walk(ast, { enter, leave }) {
const instance = new SyncWalker(enter, leave);
return instance.visit(ast, null);
}
async function asyncWalk(ast, { enter, leave }) {
const instance = new AsyncWalker(enter, leave);
return await instance.visit(ast, null);
}
// src/walk.ts
var walkAST = walk;
var walkASTAsync = asyncWalk;
function walkImportDeclaration(imports, node) {
if (node.importKind === "type") return;
const source = node.source.value;
for (const specifier of node.specifiers) {
const isType = specifier.type === "ImportSpecifier" && specifier.importKind === "type";
const local = specifier.local.name;
const imported = specifier.type === "ImportSpecifier" ? resolveString(specifier.imported) : specifier.type === "ImportNamespaceSpecifier" ? "*" : "default";
imports[local] = {
source,
local,
imported,
specifier,
isType
};
}
}
function walkExportDeclaration(exports, node) {
let local;
let exported;
let isType;
let source;
let specifier;
let declaration;
function setExport() {
exports[exported] = {
source,
local,
exported,
specifier,
isType,
declaration
};
}
if (node.type === "ExportNamedDeclaration") {
if (node.specifiers.length > 0) {
for (const s of node.specifiers) {
const isExportSpecifier = s.type === "ExportSpecifier";
isType = node.exportKind === "type" || isExportSpecifier && s.exportKind === "type";
local = isExportSpecifier ? s.local.name : s.type === "ExportNamespaceSpecifier" ? "*" : "default";
source = node.source ? node.source.value : null;
exported = isExportSpecifier ? resolveString(s.exported) : s.exported.name;
declaration = null;
specifier = s;
setExport();
}
} else if (node.specifiers.length === 0 && !!node.declaration) {
if (node.declaration.type === "VariableDeclaration") {
for (const decl of node.declaration.declarations) {
if (decl.id.type !== "Identifier") {
continue;
}
local = resolveString(decl.id);
source = null;
exported = local;
isType = node.exportKind === "type";
declaration = node.declaration;
specifier = null;
setExport();
}
} else if ("id" in node.declaration && node.declaration.id && node.declaration.id.type === "Identifier") {
local = resolveString(node.declaration.id);
source = null;
exported = local;
isType = node.exportKind === "type";
declaration = node.declaration;
specifier = null;
setExport();
} else {
}
}
return;
} else if (node.type === "ExportDefaultDeclaration") {
if (isExpressionType(node.declaration)) {
local = "name" in node.declaration ? node.declaration.name : "default";
} else {
local = resolveString(node.declaration.id || "default");
}
source = null;
exported = "default";
isType = false;
declaration = node.declaration;
specifier = null;
} else {
local = "*";
source = resolveString(node.source);
exported = "*";
isType = node.exportKind === "type";
specifier = null;
declaration = null;
}
setExport();
}
// src/scope.ts
var extractors = {
ArrayPattern(names, param) {
for (const element of param.elements) {
if (element) extractors[element.type](names, element);
}
},
AssignmentPattern(names, param) {
extractors[param.left.type](names, param.left);
},
Identifier(names, param) {
names.push(param.name);
},
MemberExpression() {
},
ObjectPattern(names, param) {
for (const prop of param.properties) {
if (prop.type === "RestElement") {
extractors.RestElement(names, prop);
} else {
extractors[prop.value.type](names, prop.value);
}
}
},
RestElement(names, param) {
extractors[param.argument.type](names, param.argument);
}
};
function extractAssignedNames(param) {
const names = [];
extractors[param.type](names, param);
return names;
}
var blockDeclarations = {
const: true,
let: true
};
var Scope = class {
parent;
isBlockScope;
declarations;
constructor(options = {}) {
this.parent = options.parent;
this.isBlockScope = !!options.block;
this.declarations = /* @__PURE__ */ Object.create(null);
if (options.params) {
options.params.forEach((param) => {
extractAssignedNames(param).forEach((name) => {
this.declarations[name] = true;
});
});
}
}
addDeclaration(node, isBlockDeclaration, isVar) {
if (!isBlockDeclaration && this.isBlockScope) {
this.parent.addDeclaration(node, isBlockDeclaration, isVar);
} else if (node.id) {
extractAssignedNames(node.id).forEach((name) => {
this.declarations[name] = true;
});
}
}
contains(name) {
return this.declarations[name] || (this.parent ? this.parent.contains(name) : false);
}
};
function attachScopes(ast, propertyName = "scope") {
let scope = new Scope();
walkAST(ast, {
enter(node, parent) {
if (/(?:Function|Class)Declaration/.test(node.type)) {
scope.addDeclaration(node, false, false);
}
if (node.type === "VariableDeclaration") {
const { kind } = node;
const isBlockDeclaration = blockDeclarations[kind];
node.declarations.forEach((declaration) => {
scope.addDeclaration(declaration, isBlockDeclaration, true);
});
}
let newScope;
if (/Function/.test(node.type)) {
const func = node;
newScope = new Scope({
parent: scope,
block: false,
params: func.params
});
if (func.type === "FunctionExpression" && func.id) {
newScope.addDeclaration(func, false, false);
}
}
if (/For(?:In|Of)?Statement/.test(node.type)) {
newScope = new Scope({
parent: scope,
block: true
});
}
if (node.type === "BlockStatement" && !/Function/.test(parent.type)) {
newScope = new Scope({
parent: scope,
block: true
});
}
if (node.type === "CatchClause") {
newScope = new Scope({
parent: scope,
params: node.param ? [node.param] : [],
block: true
});
}
if (newScope) {
Object.defineProperty(node, propertyName, {
value: newScope,
configurable: true
});
scope = newScope;
}
},
leave(node) {
if (node[propertyName]) scope = scope.parent;
}
});
return scope;
}
// src/utils.ts
import { parseExpression as parseExpression2 } from "@babel/parser";
var TS_NODE_TYPES = [
"TSAsExpression",
// foo as number
"TSTypeAssertion",
// (<number>foo)
"TSNonNullExpression",
// foo!
"TSInstantiationExpression",
// foo<string>
"TSSatisfiesExpression"
// foo satisfies T
];
function unwrapTSNode(node) {
if (isTypeOf(node, TS_NODE_TYPES)) {
return unwrapTSNode(node.expression);
} else {
return node;
}
}
function escapeKey(rawKey) {
if (String(+rawKey) === rawKey) return rawKey;
try {
const node = parseExpression2(`({${rawKey}: 1})`);
if (node.properties[0].key.type === "Identifier")
return rawKey;
} catch {
}
return JSON.stringify(rawKey);
}
export {
REGEX_DTS,
REGEX_LANG_JSX,
REGEX_LANG_TS,
TS_NODE_TYPES,
attachScopes,
babelParse,
babelParseExpression,
createStringLiteral,
createTSLiteralType,
createTSUnionType,
escapeKey,
extractIdentifiers,
getLang,
isCallOf,
isDts,
isExpressionType,
isFunctionType,
isIdentifierOf,
isLiteralType,
isReferenced,
isTs,
isTypeOf,
locateTrailingComma,
resolveIdentifier,
resolveLiteral,
resolveObjectKey,
resolveString,
resolveTemplateLiteral,
tryResolveIdentifier,
unwrapTSNode,
walkAST,
walkASTAsync,
walkExportDeclaration,
walkImportDeclaration
};