| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100 |
- import ts9 from 'typescript';
- // src/comments.ts
- function forEachToken(node, callback, sourceFile = node.getSourceFile()) {
- for (const token of iterateTokens(node, sourceFile)) {
- callback(token);
- }
- }
- function* iterateTokens(node, sourceFile = node.getSourceFile()) {
- const queue = [];
- while (true) {
- if (ts9.isTokenKind(node.kind)) {
- yield node;
- } else {
- const children = node.getChildren(sourceFile);
- if (children.length === 1) {
- node = children[0];
- continue;
- }
- for (let i = children.length - 1; i >= 0; --i) {
- queue.push(children[i]);
- }
- }
- if (queue.length === 0) {
- break;
- }
- node = queue.pop();
- }
- }
- // src/comments.ts
- function forEachComment(node, callback, sourceFile = node.getSourceFile()) {
- const fullText = sourceFile.text;
- for (const { end, kind, pos } of iterateComments(node, sourceFile)) {
- callback(fullText, { end, kind, pos });
- }
- }
- function* iterateComments(node, sourceFile = node.getSourceFile()) {
- const fullText = sourceFile.text;
- const notJsx = sourceFile.languageVariant !== ts9.LanguageVariant.JSX;
- for (const token of iterateTokens(node, sourceFile)) {
- if (token.pos === token.end) {
- continue;
- }
- if (token.kind !== ts9.SyntaxKind.JsxText) {
- yield* collectComments((callback) => {
- ts9.forEachLeadingCommentRange(
- fullText,
- // skip shebang at position 0
- token.pos === 0 ? (ts9.getShebang(fullText) ?? "").length : token.pos,
- callback
- );
- }, fullText);
- }
- if (notJsx || canHaveTrailingTrivia(token)) {
- yield* collectComments((callback) => {
- ts9.forEachTrailingCommentRange(fullText, token.end, callback);
- }, fullText);
- }
- }
- }
- function canHaveTrailingTrivia(token) {
- switch (token.kind) {
- case ts9.SyntaxKind.CloseBraceToken:
- return token.parent.kind !== ts9.SyntaxKind.JsxExpression || !isJsxElementOrFragment(token.parent.parent);
- case ts9.SyntaxKind.GreaterThanToken:
- switch (token.parent.kind) {
- case ts9.SyntaxKind.JsxClosingElement:
- case ts9.SyntaxKind.JsxClosingFragment:
- return !isJsxElementOrFragment(token.parent.parent.parent);
- case ts9.SyntaxKind.JsxOpeningElement:
- return token.end !== token.parent.end;
- case ts9.SyntaxKind.JsxOpeningFragment:
- return false;
- // would be inside the fragment
- case ts9.SyntaxKind.JsxSelfClosingElement:
- return token.end !== token.parent.end || // if end is not equal, this is part of the type arguments list
- !isJsxElementOrFragment(token.parent.parent);
- }
- }
- return true;
- }
- function collectComments(execute, fullText) {
- const comments = [];
- execute((pos, end, kind) => {
- const text = fullText.slice(pos, end);
- const value = text.slice(
- 2,
- kind === ts9.SyntaxKind.SingleLineCommentTrivia ? void 0 : -2
- );
- comments.push({ end, kind, pos, text, value });
- });
- return comments;
- }
- function isJsxElementOrFragment(node) {
- return node.kind === ts9.SyntaxKind.JsxElement || node.kind === ts9.SyntaxKind.JsxFragment;
- }
- function isCompilerOptionEnabled(options, option) {
- switch (option) {
- case "allowJs":
- return options.allowJs === void 0 ? isCompilerOptionEnabled(options, "checkJs") : options.allowJs;
- case "allowSyntheticDefaultImports":
- return options.allowSyntheticDefaultImports !== void 0 ? options.allowSyntheticDefaultImports : isCompilerOptionEnabled(options, "esModuleInterop") || options.module === ts9.ModuleKind.System;
- case "alwaysStrict":
- case "noImplicitAny":
- case "noImplicitThis":
- case "strictBindCallApply":
- case "strictFunctionTypes":
- case "strictNullChecks":
- case "strictPropertyInitialization":
- return isStrictCompilerOptionEnabled(
- options,
- option
- );
- case "declaration":
- return options.declaration || isCompilerOptionEnabled(options, "composite");
- case "declarationMap":
- case "emitDeclarationOnly":
- case "stripInternal":
- return options[option] === true && isCompilerOptionEnabled(options, "declaration");
- case "incremental":
- return options.incremental === void 0 ? isCompilerOptionEnabled(options, "composite") : options.incremental;
- case "noUncheckedIndexedAccess":
- return options.noUncheckedIndexedAccess === true && isCompilerOptionEnabled(options, "strictNullChecks");
- case "skipDefaultLibCheck":
- return options.skipDefaultLibCheck || isCompilerOptionEnabled(options, "skipLibCheck");
- case "suppressImplicitAnyIndexErrors":
- return (
- // eslint-disable-next-line @typescript-eslint/no-deprecated
- options.suppressImplicitAnyIndexErrors === true && isCompilerOptionEnabled(options, "noImplicitAny")
- );
- }
- return options[option] === true;
- }
- function isStrictCompilerOptionEnabled(options, option) {
- return (options.strict ? options[option] !== false : options[option] === true) && (option !== "strictPropertyInitialization" || isStrictCompilerOptionEnabled(options, "strictNullChecks"));
- }
- function isModifierFlagSet(node, flag) {
- return isFlagSet(ts9.getCombinedModifierFlags(node), flag);
- }
- function isFlagSet(allFlags, flag) {
- return (allFlags & flag) !== 0;
- }
- function isFlagSetOnObject(obj, flag) {
- return isFlagSet(obj.flags, flag);
- }
- var isNodeFlagSet = isFlagSetOnObject;
- function isObjectFlagSet(objectType, flag) {
- return isFlagSet(objectType.objectFlags, flag);
- }
- var isSymbolFlagSet = isFlagSetOnObject;
- function isTransientSymbolLinksFlagSet(links, flag) {
- return isFlagSet(links.checkFlags, flag);
- }
- var isTypeFlagSet = isFlagSetOnObject;
- // src/modifiers.ts
- function includesModifier(modifiers, ...kinds) {
- if (modifiers === void 0) {
- return false;
- }
- for (const modifier of modifiers) {
- if (kinds.includes(modifier.kind)) {
- return true;
- }
- }
- return false;
- }
- function isAssignmentKind(kind) {
- return kind >= ts9.SyntaxKind.FirstAssignment && kind <= ts9.SyntaxKind.LastAssignment;
- }
- function isNumericPropertyName(name) {
- return String(+name) === name;
- }
- function isValidPropertyAccess(text, languageVersion = ts9.ScriptTarget.Latest) {
- if (text.length === 0) {
- return false;
- }
- let ch = text.codePointAt(0);
- if (!ts9.isIdentifierStart(ch, languageVersion)) {
- return false;
- }
- for (let i = charSize(ch); i < text.length; i += charSize(ch)) {
- ch = text.codePointAt(i);
- if (!ts9.isIdentifierPart(ch, languageVersion)) {
- return false;
- }
- }
- return true;
- }
- function charSize(ch) {
- return ch >= 65536 ? 2 : 1;
- }
- // src/nodes/access.ts
- var AccessKind = /* @__PURE__ */ ((AccessKind2) => {
- AccessKind2[AccessKind2["None"] = 0] = "None";
- AccessKind2[AccessKind2["Read"] = 1] = "Read";
- AccessKind2[AccessKind2["Write"] = 2] = "Write";
- AccessKind2[AccessKind2["Delete"] = 4] = "Delete";
- AccessKind2[AccessKind2["ReadWrite"] = 3] = "ReadWrite";
- return AccessKind2;
- })(AccessKind || {});
- function getAccessKind(node) {
- const parent = node.parent;
- switch (parent.kind) {
- case ts9.SyntaxKind.ArrayLiteralExpression:
- case ts9.SyntaxKind.SpreadAssignment:
- case ts9.SyntaxKind.SpreadElement:
- return isInDestructuringAssignment(
- parent
- ) ? 2 /* Write */ : 1 /* Read */;
- case ts9.SyntaxKind.ArrowFunction:
- return parent.body === node ? 1 /* Read */ : 2 /* Write */;
- case ts9.SyntaxKind.AsExpression:
- case ts9.SyntaxKind.NonNullExpression:
- case ts9.SyntaxKind.ParenthesizedExpression:
- case ts9.SyntaxKind.TypeAssertionExpression:
- return getAccessKind(parent);
- case ts9.SyntaxKind.AwaitExpression:
- case ts9.SyntaxKind.CallExpression:
- case ts9.SyntaxKind.CaseClause:
- case ts9.SyntaxKind.ComputedPropertyName:
- case ts9.SyntaxKind.ConditionalExpression:
- case ts9.SyntaxKind.Decorator:
- case ts9.SyntaxKind.DoStatement:
- case ts9.SyntaxKind.ElementAccessExpression:
- case ts9.SyntaxKind.ExpressionStatement:
- case ts9.SyntaxKind.ForStatement:
- case ts9.SyntaxKind.IfStatement:
- case ts9.SyntaxKind.JsxElement:
- case ts9.SyntaxKind.JsxExpression:
- case ts9.SyntaxKind.JsxOpeningElement:
- case ts9.SyntaxKind.JsxSelfClosingElement:
- case ts9.SyntaxKind.JsxSpreadAttribute:
- case ts9.SyntaxKind.NewExpression:
- case ts9.SyntaxKind.ReturnStatement:
- case ts9.SyntaxKind.SwitchStatement:
- case ts9.SyntaxKind.TaggedTemplateExpression:
- case ts9.SyntaxKind.TemplateSpan:
- case ts9.SyntaxKind.ThrowStatement:
- case ts9.SyntaxKind.TypeOfExpression:
- case ts9.SyntaxKind.VoidExpression:
- case ts9.SyntaxKind.WhileStatement:
- case ts9.SyntaxKind.WithStatement:
- case ts9.SyntaxKind.YieldExpression:
- return 1 /* Read */;
- case ts9.SyntaxKind.BinaryExpression:
- return parent.right === node ? 1 /* Read */ : !isAssignmentKind(parent.operatorToken.kind) ? 1 /* Read */ : parent.operatorToken.kind === ts9.SyntaxKind.EqualsToken ? 2 /* Write */ : 3 /* ReadWrite */;
- case ts9.SyntaxKind.BindingElement:
- case ts9.SyntaxKind.EnumMember:
- case ts9.SyntaxKind.JsxAttribute:
- case ts9.SyntaxKind.Parameter:
- case ts9.SyntaxKind.PropertyDeclaration:
- case ts9.SyntaxKind.VariableDeclaration:
- return parent.initializer === node ? 1 /* Read */ : 0 /* None */;
- case ts9.SyntaxKind.DeleteExpression:
- return 4 /* Delete */;
- case ts9.SyntaxKind.ExportAssignment:
- return parent.isExportEquals ? 1 /* Read */ : 0 /* None */;
- case ts9.SyntaxKind.ExpressionWithTypeArguments:
- return parent.parent.token === ts9.SyntaxKind.ExtendsKeyword && parent.parent.parent.kind !== ts9.SyntaxKind.InterfaceDeclaration ? 1 /* Read */ : 0 /* None */;
- case ts9.SyntaxKind.ForInStatement:
- case ts9.SyntaxKind.ForOfStatement:
- return parent.initializer === node ? 2 /* Write */ : 1 /* Read */;
- case ts9.SyntaxKind.PostfixUnaryExpression:
- return 3 /* ReadWrite */;
- case ts9.SyntaxKind.PrefixUnaryExpression:
- return parent.operator === ts9.SyntaxKind.PlusPlusToken || parent.operator === ts9.SyntaxKind.MinusMinusToken ? 3 /* ReadWrite */ : 1 /* Read */;
- case ts9.SyntaxKind.PropertyAccessExpression:
- return parent.expression === node ? 1 /* Read */ : 0 /* None */;
- case ts9.SyntaxKind.PropertyAssignment:
- return parent.name === node ? 0 /* None */ : isInDestructuringAssignment(parent) ? 2 /* Write */ : 1 /* Read */;
- case ts9.SyntaxKind.ShorthandPropertyAssignment:
- return parent.objectAssignmentInitializer === node ? 1 /* Read */ : isInDestructuringAssignment(parent) ? 2 /* Write */ : 1 /* Read */;
- }
- return 0 /* None */;
- }
- function isInDestructuringAssignment(node) {
- switch (node.kind) {
- case ts9.SyntaxKind.ShorthandPropertyAssignment:
- if (node.objectAssignmentInitializer !== void 0) {
- return true;
- }
- // falls through
- case ts9.SyntaxKind.PropertyAssignment:
- case ts9.SyntaxKind.SpreadAssignment:
- node = node.parent;
- break;
- case ts9.SyntaxKind.SpreadElement:
- if (node.parent.kind !== ts9.SyntaxKind.ArrayLiteralExpression) {
- return false;
- }
- node = node.parent;
- }
- while (true) {
- switch (node.parent.kind) {
- case ts9.SyntaxKind.ArrayLiteralExpression:
- case ts9.SyntaxKind.ObjectLiteralExpression:
- node = node.parent;
- break;
- case ts9.SyntaxKind.BinaryExpression:
- return node.parent.left === node && node.parent.operatorToken.kind === ts9.SyntaxKind.EqualsToken;
- case ts9.SyntaxKind.ForOfStatement:
- return node.parent.initializer === node;
- case ts9.SyntaxKind.PropertyAssignment:
- case ts9.SyntaxKind.SpreadAssignment:
- node = node.parent.parent;
- break;
- case ts9.SyntaxKind.SpreadElement:
- if (node.parent.parent.kind !== ts9.SyntaxKind.ArrayLiteralExpression) {
- return false;
- }
- node = node.parent.parent;
- break;
- default:
- return false;
- }
- }
- }
- function isAbstractKeyword(node) {
- return node.kind === ts9.SyntaxKind.AbstractKeyword;
- }
- function isAccessorKeyword(node) {
- return node.kind === ts9.SyntaxKind.AccessorKeyword;
- }
- function isAnyKeyword(node) {
- return node.kind === ts9.SyntaxKind.AnyKeyword;
- }
- function isAssertKeyword(node) {
- return node.kind === ts9.SyntaxKind.AssertKeyword;
- }
- function isAssertsKeyword(node) {
- return node.kind === ts9.SyntaxKind.AssertsKeyword;
- }
- function isAsyncKeyword(node) {
- return node.kind === ts9.SyntaxKind.AsyncKeyword;
- }
- function isAwaitKeyword(node) {
- return node.kind === ts9.SyntaxKind.AwaitKeyword;
- }
- function isBigIntKeyword(node) {
- return node.kind === ts9.SyntaxKind.BigIntKeyword;
- }
- function isBooleanKeyword(node) {
- return node.kind === ts9.SyntaxKind.BooleanKeyword;
- }
- function isColonToken(node) {
- return node.kind === ts9.SyntaxKind.ColonToken;
- }
- function isConstKeyword(node) {
- return node.kind === ts9.SyntaxKind.ConstKeyword;
- }
- function isDeclareKeyword(node) {
- return node.kind === ts9.SyntaxKind.DeclareKeyword;
- }
- function isDefaultKeyword(node) {
- return node.kind === ts9.SyntaxKind.DefaultKeyword;
- }
- function isDotToken(node) {
- return node.kind === ts9.SyntaxKind.DotToken;
- }
- function isEndOfFileToken(node) {
- return node.kind === ts9.SyntaxKind.EndOfFileToken;
- }
- function isEqualsGreaterThanToken(node) {
- return node.kind === ts9.SyntaxKind.EqualsGreaterThanToken;
- }
- function isEqualsToken(node) {
- return node.kind === ts9.SyntaxKind.EqualsToken;
- }
- function isExclamationToken(node) {
- return node.kind === ts9.SyntaxKind.ExclamationToken;
- }
- function isExportKeyword(node) {
- return node.kind === ts9.SyntaxKind.ExportKeyword;
- }
- function isFalseKeyword(node) {
- return node.kind === ts9.SyntaxKind.FalseKeyword;
- }
- function isFalseLiteral(node) {
- return node.kind === ts9.SyntaxKind.FalseKeyword;
- }
- function isImportExpression(node) {
- return node.kind === ts9.SyntaxKind.ImportKeyword;
- }
- function isImportKeyword(node) {
- return node.kind === ts9.SyntaxKind.ImportKeyword;
- }
- function isInKeyword(node) {
- return node.kind === ts9.SyntaxKind.InKeyword;
- }
- function isJSDocText(node) {
- return node.kind === ts9.SyntaxKind.JSDocText;
- }
- function isJsonMinusNumericLiteral(node) {
- return node.kind === ts9.SyntaxKind.PrefixUnaryExpression;
- }
- function isNeverKeyword(node) {
- return node.kind === ts9.SyntaxKind.NeverKeyword;
- }
- function isNullKeyword(node) {
- return node.kind === ts9.SyntaxKind.NullKeyword;
- }
- function isNullLiteral(node) {
- return node.kind === ts9.SyntaxKind.NullKeyword;
- }
- function isNumberKeyword(node) {
- return node.kind === ts9.SyntaxKind.NumberKeyword;
- }
- function isObjectKeyword(node) {
- return node.kind === ts9.SyntaxKind.ObjectKeyword;
- }
- function isOutKeyword(node) {
- return node.kind === ts9.SyntaxKind.OutKeyword;
- }
- function isOverrideKeyword(node) {
- return node.kind === ts9.SyntaxKind.OverrideKeyword;
- }
- function isPrivateKeyword(node) {
- return node.kind === ts9.SyntaxKind.PrivateKeyword;
- }
- function isProtectedKeyword(node) {
- return node.kind === ts9.SyntaxKind.ProtectedKeyword;
- }
- function isPublicKeyword(node) {
- return node.kind === ts9.SyntaxKind.PublicKeyword;
- }
- function isQuestionDotToken(node) {
- return node.kind === ts9.SyntaxKind.QuestionDotToken;
- }
- function isQuestionToken(node) {
- return node.kind === ts9.SyntaxKind.QuestionToken;
- }
- function isReadonlyKeyword(node) {
- return node.kind === ts9.SyntaxKind.ReadonlyKeyword;
- }
- function isStaticKeyword(node) {
- return node.kind === ts9.SyntaxKind.StaticKeyword;
- }
- function isStringKeyword(node) {
- return node.kind === ts9.SyntaxKind.StringKeyword;
- }
- function isSuperExpression(node) {
- return node.kind === ts9.SyntaxKind.SuperKeyword;
- }
- function isSuperKeyword(node) {
- return node.kind === ts9.SyntaxKind.SuperKeyword;
- }
- function isSymbolKeyword(node) {
- return node.kind === ts9.SyntaxKind.SymbolKeyword;
- }
- function isSyntaxList(node) {
- return node.kind === ts9.SyntaxKind.SyntaxList;
- }
- function isThisExpression(node) {
- return node.kind === ts9.SyntaxKind.ThisKeyword;
- }
- function isThisKeyword(node) {
- return node.kind === ts9.SyntaxKind.ThisKeyword;
- }
- function isTrueKeyword(node) {
- return node.kind === ts9.SyntaxKind.TrueKeyword;
- }
- function isTrueLiteral(node) {
- return node.kind === ts9.SyntaxKind.TrueKeyword;
- }
- function isUndefinedKeyword(node) {
- return node.kind === ts9.SyntaxKind.UndefinedKeyword;
- }
- function isUnknownKeyword(node) {
- return node.kind === ts9.SyntaxKind.UnknownKeyword;
- }
- function isVoidKeyword(node) {
- return node.kind === ts9.SyntaxKind.VoidKeyword;
- }
- var [tsMajor, tsMinor] = ts9.versionMajorMinor.split(".").map((raw) => Number.parseInt(raw, 10));
- function isTsVersionAtLeast(major, minor = 0) {
- return tsMajor > major || tsMajor === major && tsMinor >= minor;
- }
- // src/nodes/typeGuards/union.ts
- function hasDecorators(node) {
- return ts9.isParameter(node) || ts9.isPropertyDeclaration(node) || ts9.isMethodDeclaration(node) || ts9.isGetAccessorDeclaration(node) || ts9.isSetAccessorDeclaration(node) || ts9.isClassExpression(node) || ts9.isClassDeclaration(node);
- }
- function hasExpressionInitializer(node) {
- return ts9.isVariableDeclaration(node) || ts9.isParameter(node) || ts9.isBindingElement(node) || ts9.isPropertyDeclaration(node) || ts9.isPropertyAssignment(node) || ts9.isEnumMember(node);
- }
- function hasInitializer(node) {
- return hasExpressionInitializer(node) || ts9.isForStatement(node) || ts9.isForInStatement(node) || ts9.isForOfStatement(node) || ts9.isJsxAttribute(node);
- }
- function hasJSDoc(node) {
- if (
- // eslint-disable-next-line @typescript-eslint/no-deprecated -- Keep compatibility with ts <5
- isAccessorDeclaration(node) || ts9.isArrowFunction(node) || ts9.isBlock(node) || ts9.isBreakStatement(node) || ts9.isCallSignatureDeclaration(node) || ts9.isCaseClause(node) || // eslint-disable-next-line @typescript-eslint/no-deprecated -- Keep compatibility with ts <5
- isClassLikeDeclaration(node) || ts9.isConstructorDeclaration(node) || ts9.isConstructorTypeNode(node) || ts9.isConstructSignatureDeclaration(node) || ts9.isContinueStatement(node) || ts9.isDebuggerStatement(node) || ts9.isDoStatement(node) || ts9.isEmptyStatement(node) || isEndOfFileToken(node) || ts9.isEnumDeclaration(node) || ts9.isEnumMember(node) || ts9.isExportAssignment(node) || ts9.isExportDeclaration(node) || ts9.isExportSpecifier(node) || ts9.isExpressionStatement(node) || ts9.isForInStatement(node) || ts9.isForOfStatement(node) || ts9.isForStatement(node) || ts9.isFunctionDeclaration(node) || ts9.isFunctionExpression(node) || ts9.isFunctionTypeNode(node) || ts9.isIfStatement(node) || ts9.isImportDeclaration(node) || ts9.isImportEqualsDeclaration(node) || ts9.isIndexSignatureDeclaration(node) || ts9.isInterfaceDeclaration(node) || ts9.isJSDocFunctionType(node) || ts9.isLabeledStatement(node) || ts9.isMethodDeclaration(node) || ts9.isMethodSignature(node) || ts9.isModuleDeclaration(node) || ts9.isNamedTupleMember(node) || ts9.isNamespaceExportDeclaration(node) || ts9.isParameter(node) || ts9.isParenthesizedExpression(node) || ts9.isPropertyAssignment(node) || ts9.isPropertyDeclaration(node) || ts9.isPropertySignature(node) || ts9.isReturnStatement(node) || ts9.isShorthandPropertyAssignment(node) || ts9.isSpreadAssignment(node) || ts9.isSwitchStatement(node) || ts9.isThrowStatement(node) || ts9.isTryStatement(node) || ts9.isTypeAliasDeclaration(node) || ts9.isVariableDeclaration(node) || ts9.isVariableStatement(node) || ts9.isWhileStatement(node) || ts9.isWithStatement(node)
- ) {
- return true;
- }
- if (isTsVersionAtLeast(4, 4) && ts9.isClassStaticBlockDeclaration(node)) {
- return true;
- }
- if (isTsVersionAtLeast(5, 0) && (ts9.isBinaryExpression(node) || ts9.isElementAccessExpression(node) || ts9.isIdentifier(node) || ts9.isJSDocSignature(node) || ts9.isObjectLiteralExpression(node) || ts9.isPropertyAccessExpression(node) || ts9.isTypeParameterDeclaration(node))) {
- return true;
- }
- return false;
- }
- function hasModifiers(node) {
- return ts9.isTypeParameterDeclaration(node) || ts9.isParameter(node) || ts9.isConstructorTypeNode(node) || ts9.isPropertySignature(node) || ts9.isPropertyDeclaration(node) || ts9.isMethodSignature(node) || ts9.isMethodDeclaration(node) || ts9.isConstructorDeclaration(node) || ts9.isGetAccessorDeclaration(node) || ts9.isSetAccessorDeclaration(node) || ts9.isIndexSignatureDeclaration(node) || ts9.isFunctionExpression(node) || ts9.isArrowFunction(node) || ts9.isClassExpression(node) || ts9.isVariableStatement(node) || ts9.isFunctionDeclaration(node) || ts9.isClassDeclaration(node) || ts9.isInterfaceDeclaration(node) || ts9.isTypeAliasDeclaration(node) || ts9.isEnumDeclaration(node) || ts9.isModuleDeclaration(node) || ts9.isImportEqualsDeclaration(node) || ts9.isImportDeclaration(node) || ts9.isExportAssignment(node) || ts9.isExportDeclaration(node);
- }
- function hasType(node) {
- return isSignatureDeclaration(node) || ts9.isVariableDeclaration(node) || ts9.isParameter(node) || ts9.isPropertySignature(node) || ts9.isPropertyDeclaration(node) || ts9.isTypePredicateNode(node) || ts9.isParenthesizedTypeNode(node) || ts9.isTypeOperatorNode(node) || ts9.isMappedTypeNode(node) || ts9.isAssertionExpression(node) || ts9.isTypeAliasDeclaration(node) || ts9.isJSDocTypeExpression(node) || ts9.isJSDocNonNullableType(node) || ts9.isJSDocNullableType(node) || ts9.isJSDocOptionalType(node) || ts9.isJSDocVariadicType(node);
- }
- function hasTypeArguments(node) {
- return ts9.isCallExpression(node) || ts9.isNewExpression(node) || ts9.isTaggedTemplateExpression(node) || ts9.isJsxOpeningElement(node) || ts9.isJsxSelfClosingElement(node);
- }
- function isAccessExpression(node) {
- return ts9.isPropertyAccessExpression(node) || ts9.isElementAccessExpression(node);
- }
- function isAccessibilityModifier(node) {
- return isPublicKeyword(node) || isPrivateKeyword(node) || isProtectedKeyword(node);
- }
- function isAccessorDeclaration(node) {
- return ts9.isGetAccessorDeclaration(node) || ts9.isSetAccessorDeclaration(node);
- }
- function isArrayBindingElement(node) {
- return ts9.isBindingElement(node) || ts9.isOmittedExpression(node);
- }
- function isArrayBindingOrAssignmentPattern(node) {
- return ts9.isArrayBindingPattern(node) || ts9.isArrayLiteralExpression(node);
- }
- function isAssignmentPattern(node) {
- return ts9.isObjectLiteralExpression(node) || ts9.isArrayLiteralExpression(node);
- }
- function isBindingOrAssignmentElementRestIndicator(node) {
- if (ts9.isSpreadElement(node) || ts9.isSpreadAssignment(node)) {
- return true;
- }
- if (isTsVersionAtLeast(4, 4)) {
- return ts9.isDotDotDotToken(node);
- }
- return false;
- }
- function isBindingOrAssignmentElementTarget(node) {
- return isBindingOrAssignmentPattern(node) || ts9.isIdentifier(node) || ts9.isPropertyAccessExpression(node) || ts9.isElementAccessExpression(node) || ts9.isOmittedExpression(node);
- }
- function isBindingOrAssignmentPattern(node) {
- return isObjectBindingOrAssignmentPattern(node) || isArrayBindingOrAssignmentPattern(node);
- }
- function isBindingPattern(node) {
- return ts9.isObjectBindingPattern(node) || ts9.isArrayBindingPattern(node);
- }
- function isBlockLike(node) {
- return ts9.isSourceFile(node) || ts9.isBlock(node) || ts9.isModuleBlock(node) || ts9.isCaseOrDefaultClause(node);
- }
- function isBooleanLiteral(node) {
- return isTrueLiteral(node) || isFalseLiteral(node);
- }
- function isClassLikeDeclaration(node) {
- return ts9.isClassDeclaration(node) || ts9.isClassExpression(node);
- }
- function isClassMemberModifier(node) {
- return isAccessibilityModifier(node) || isReadonlyKeyword(node) || isStaticKeyword(node) || isAccessorKeyword(node);
- }
- function isDeclarationName(node) {
- return ts9.isIdentifier(node) || ts9.isPrivateIdentifier(node) || ts9.isStringLiteralLike(node) || ts9.isNumericLiteral(node) || ts9.isComputedPropertyName(node) || ts9.isElementAccessExpression(node) || isBindingPattern(node) || isEntityNameExpression(node);
- }
- function isDeclarationWithTypeParameterChildren(node) {
- return isSignatureDeclaration(node) || // eslint-disable-next-line @typescript-eslint/no-deprecated -- Keep compatibility with ts <5
- isClassLikeDeclaration(node) || ts9.isInterfaceDeclaration(node) || ts9.isTypeAliasDeclaration(node) || ts9.isJSDocTemplateTag(node);
- }
- function isDeclarationWithTypeParameters(node) {
- return isDeclarationWithTypeParameterChildren(node) || ts9.isJSDocTypedefTag(node) || ts9.isJSDocCallbackTag(node) || ts9.isJSDocSignature(node);
- }
- function isDestructuringPattern(node) {
- return isBindingPattern(node) || ts9.isObjectLiteralExpression(node) || ts9.isArrayLiteralExpression(node);
- }
- function isEntityNameExpression(node) {
- return ts9.isIdentifier(node) || isPropertyAccessEntityNameExpression(node);
- }
- function isEntityNameOrEntityNameExpression(node) {
- return ts9.isEntityName(node) || isEntityNameExpression(node);
- }
- function isForInOrOfStatement(node) {
- return ts9.isForInStatement(node) || ts9.isForOfStatement(node);
- }
- function isFunctionLikeDeclaration(node) {
- return ts9.isFunctionDeclaration(node) || ts9.isMethodDeclaration(node) || ts9.isGetAccessorDeclaration(node) || ts9.isSetAccessorDeclaration(node) || ts9.isConstructorDeclaration(node) || ts9.isFunctionExpression(node) || ts9.isArrowFunction(node);
- }
- function isJSDocComment(node) {
- if (isJSDocText(node)) {
- return true;
- }
- if (isTsVersionAtLeast(4, 4)) {
- return ts9.isJSDocLink(node) || ts9.isJSDocLinkCode(node) || ts9.isJSDocLinkPlain(node);
- }
- return false;
- }
- function isJSDocNamespaceBody(node) {
- return ts9.isIdentifier(node) || isJSDocNamespaceDeclaration(node);
- }
- function isJSDocTypeReferencingNode(node) {
- return ts9.isJSDocVariadicType(node) || ts9.isJSDocOptionalType(node) || ts9.isJSDocNullableType(node) || ts9.isJSDocNonNullableType(node);
- }
- function isJsonObjectExpression(node) {
- return ts9.isObjectLiteralExpression(node) || ts9.isArrayLiteralExpression(node) || isJsonMinusNumericLiteral(node) || ts9.isNumericLiteral(node) || ts9.isStringLiteral(node) || isBooleanLiteral(node) || isNullLiteral(node);
- }
- function isJsxAttributeLike(node) {
- return ts9.isJsxAttribute(node) || ts9.isJsxSpreadAttribute(node);
- }
- function isJsxAttributeValue(node) {
- return ts9.isStringLiteral(node) || ts9.isJsxExpression(node) || ts9.isJsxElement(node) || ts9.isJsxSelfClosingElement(node) || ts9.isJsxFragment(node);
- }
- function isJsxChild(node) {
- return ts9.isJsxText(node) || ts9.isJsxExpression(node) || ts9.isJsxElement(node) || ts9.isJsxSelfClosingElement(node) || ts9.isJsxFragment(node);
- }
- function isJsxTagNameExpression(node) {
- return ts9.isIdentifier(node) || isThisExpression(node) || isJsxTagNamePropertyAccess(node);
- }
- function isLiteralToken(node) {
- return ts9.isNumericLiteral(node) || ts9.isBigIntLiteral(node) || ts9.isStringLiteral(node) || ts9.isJsxText(node) || ts9.isRegularExpressionLiteral(node) || ts9.isNoSubstitutionTemplateLiteral(node);
- }
- function isModuleBody(node) {
- return isNamespaceBody(node) || isJSDocNamespaceBody(node);
- }
- function isModuleName(node) {
- return ts9.isIdentifier(node) || ts9.isStringLiteral(node);
- }
- function isModuleReference(node) {
- return ts9.isEntityName(node) || ts9.isExternalModuleReference(node);
- }
- function isNamedImportBindings(node) {
- return ts9.isNamespaceImport(node) || ts9.isNamedImports(node);
- }
- function isNamedImportsOrExports(node) {
- return ts9.isNamedImports(node) || ts9.isNamedExports(node);
- }
- function isNamespaceBody(node) {
- return ts9.isModuleBlock(node) || isNamespaceDeclaration(node);
- }
- function isObjectBindingOrAssignmentElement(node) {
- return ts9.isBindingElement(node) || ts9.isPropertyAssignment(node) || ts9.isShorthandPropertyAssignment(node) || ts9.isSpreadAssignment(node);
- }
- function isObjectBindingOrAssignmentPattern(node) {
- return ts9.isObjectBindingPattern(node) || ts9.isObjectLiteralExpression(node);
- }
- function isObjectTypeDeclaration(node) {
- return (
- // eslint-disable-next-line @typescript-eslint/no-deprecated -- Keep compatibility with ts <5
- isClassLikeDeclaration(node) || ts9.isInterfaceDeclaration(node) || ts9.isTypeLiteralNode(node)
- );
- }
- function isParameterPropertyModifier(node) {
- return isAccessibilityModifier(node) || isReadonlyKeyword(node);
- }
- function isPropertyNameLiteral(node) {
- return ts9.isIdentifier(node) || ts9.isStringLiteralLike(node) || ts9.isNumericLiteral(node);
- }
- function isPseudoLiteralToken(node) {
- return ts9.isTemplateHead(node) || ts9.isTemplateMiddle(node) || ts9.isTemplateTail(node);
- }
- function isSignatureDeclaration(node) {
- return ts9.isCallSignatureDeclaration(node) || ts9.isConstructSignatureDeclaration(node) || ts9.isMethodSignature(node) || ts9.isIndexSignatureDeclaration(node) || ts9.isFunctionTypeNode(node) || ts9.isConstructorTypeNode(node) || ts9.isJSDocFunctionType(node) || ts9.isFunctionDeclaration(node) || ts9.isMethodDeclaration(node) || ts9.isConstructorDeclaration(node) || // eslint-disable-next-line @typescript-eslint/no-deprecated -- Keep compatibility with ts <5
- isAccessorDeclaration(node) || ts9.isFunctionExpression(node) || ts9.isArrowFunction(node);
- }
- function isSuperProperty(node) {
- return isSuperPropertyAccessExpression(node) || isSuperElementAccessExpression(node);
- }
- function isTypeOnlyCompatibleAliasDeclaration(node) {
- if (ts9.isImportClause(node) || ts9.isImportEqualsDeclaration(node) || ts9.isNamespaceImport(node) || ts9.isImportOrExportSpecifier(node)) {
- return true;
- }
- if (isTsVersionAtLeast(5, 0) && (ts9.isExportDeclaration(node) || ts9.isNamespaceExport(node))) {
- return true;
- }
- return false;
- }
- function isTypeReferenceType(node) {
- return ts9.isTypeReferenceNode(node) || ts9.isExpressionWithTypeArguments(node);
- }
- function isUnionOrIntersectionTypeNode(node) {
- return ts9.isUnionTypeNode(node) || ts9.isIntersectionTypeNode(node);
- }
- function isVariableLikeDeclaration(node) {
- return ts9.isVariableDeclaration(node) || ts9.isParameter(node) || ts9.isBindingElement(node) || ts9.isPropertyDeclaration(node) || ts9.isPropertyAssignment(node) || ts9.isPropertySignature(node) || ts9.isJsxAttribute(node) || ts9.isShorthandPropertyAssignment(node) || ts9.isEnumMember(node) || ts9.isJSDocPropertyTag(node) || ts9.isJSDocParameterTag(node);
- }
- // src/nodes/typeGuards/compound.ts
- function isConstAssertionExpression(node) {
- return ts9.isTypeReferenceNode(node.type) && ts9.isIdentifier(node.type.typeName) && node.type.typeName.escapedText === "const";
- }
- function isIterationStatement(node) {
- switch (node.kind) {
- case ts9.SyntaxKind.DoStatement:
- case ts9.SyntaxKind.ForInStatement:
- case ts9.SyntaxKind.ForOfStatement:
- case ts9.SyntaxKind.ForStatement:
- case ts9.SyntaxKind.WhileStatement:
- return true;
- default:
- return false;
- }
- }
- function isJSDocNamespaceDeclaration(node) {
- return ts9.isModuleDeclaration(node) && ts9.isIdentifier(node.name) && (node.body === void 0 || isJSDocNamespaceBody(node.body));
- }
- function isJsxTagNamePropertyAccess(node) {
- return ts9.isPropertyAccessExpression(node) && // eslint-disable-next-line @typescript-eslint/no-deprecated -- Keep compatibility with ts < 5
- isJsxTagNameExpression(node.expression);
- }
- function isNamedDeclarationWithName(node) {
- return "name" in node && node.name !== void 0 && node.name !== null && isDeclarationName(node.name);
- }
- function isNamespaceDeclaration(node) {
- return ts9.isModuleDeclaration(node) && ts9.isIdentifier(node.name) && node.body !== void 0 && isNamespaceBody(node.body);
- }
- function isNumericOrStringLikeLiteral(node) {
- switch (node.kind) {
- case ts9.SyntaxKind.NoSubstitutionTemplateLiteral:
- case ts9.SyntaxKind.NumericLiteral:
- case ts9.SyntaxKind.StringLiteral:
- return true;
- default:
- return false;
- }
- }
- function isPropertyAccessEntityNameExpression(node) {
- return ts9.isPropertyAccessExpression(node) && ts9.isIdentifier(node.name) && isEntityNameExpression(node.expression);
- }
- function isSuperElementAccessExpression(node) {
- return ts9.isElementAccessExpression(node) && isSuperExpression(node.expression);
- }
- function isSuperPropertyAccessExpression(node) {
- return ts9.isPropertyAccessExpression(node) && isSuperExpression(node.expression);
- }
- function isFunctionScopeBoundary(node) {
- switch (node.kind) {
- case ts9.SyntaxKind.ArrowFunction:
- case ts9.SyntaxKind.CallSignature:
- case ts9.SyntaxKind.ClassDeclaration:
- case ts9.SyntaxKind.ClassExpression:
- case ts9.SyntaxKind.Constructor:
- case ts9.SyntaxKind.ConstructorType:
- case ts9.SyntaxKind.ConstructSignature:
- case ts9.SyntaxKind.EnumDeclaration:
- case ts9.SyntaxKind.FunctionDeclaration:
- case ts9.SyntaxKind.FunctionExpression:
- case ts9.SyntaxKind.FunctionType:
- case ts9.SyntaxKind.GetAccessor:
- case ts9.SyntaxKind.MethodDeclaration:
- case ts9.SyntaxKind.MethodSignature:
- case ts9.SyntaxKind.ModuleDeclaration:
- case ts9.SyntaxKind.SetAccessor:
- return true;
- case ts9.SyntaxKind.SourceFile:
- return ts9.isExternalModule(node);
- default:
- return false;
- }
- }
- function isIntrinsicAnyType(type) {
- return isTypeFlagSet(type, ts9.TypeFlags.Any);
- }
- function isIntrinsicBigIntType(type) {
- return isTypeFlagSet(type, ts9.TypeFlags.BigInt);
- }
- function isIntrinsicBooleanType(type) {
- return isTypeFlagSet(type, ts9.TypeFlags.Boolean);
- }
- function isIntrinsicErrorType(type) {
- return isIntrinsicType(type) && type.intrinsicName === "error";
- }
- function isIntrinsicESSymbolType(type) {
- return isTypeFlagSet(type, ts9.TypeFlags.ESSymbol);
- }
- var IntrinsicTypeFlags = ts9.TypeFlags.Intrinsic ?? ts9.TypeFlags.Any | ts9.TypeFlags.Unknown | ts9.TypeFlags.String | ts9.TypeFlags.Number | ts9.TypeFlags.BigInt | ts9.TypeFlags.Boolean | ts9.TypeFlags.BooleanLiteral | ts9.TypeFlags.ESSymbol | ts9.TypeFlags.Void | ts9.TypeFlags.Undefined | ts9.TypeFlags.Null | ts9.TypeFlags.Never | ts9.TypeFlags.NonPrimitive;
- function isIntrinsicNeverType(type) {
- return isTypeFlagSet(type, ts9.TypeFlags.Never);
- }
- function isIntrinsicNonPrimitiveType(type) {
- return isTypeFlagSet(type, ts9.TypeFlags.NonPrimitive);
- }
- function isIntrinsicNullType(type) {
- return isTypeFlagSet(type, ts9.TypeFlags.Null);
- }
- function isIntrinsicNumberType(type) {
- return isTypeFlagSet(type, ts9.TypeFlags.Number);
- }
- function isIntrinsicStringType(type) {
- return isTypeFlagSet(type, ts9.TypeFlags.String);
- }
- function isIntrinsicType(type) {
- return isTypeFlagSet(type, IntrinsicTypeFlags);
- }
- function isIntrinsicUndefinedType(type) {
- return isTypeFlagSet(type, ts9.TypeFlags.Undefined);
- }
- function isIntrinsicUnknownType(type) {
- return isTypeFlagSet(type, ts9.TypeFlags.Unknown);
- }
- function isIntrinsicVoidType(type) {
- return isTypeFlagSet(type, ts9.TypeFlags.Void);
- }
- function isConditionalType(type) {
- return isTypeFlagSet(type, ts9.TypeFlags.Conditional);
- }
- function isEnumType(type) {
- return isTypeFlagSet(type, ts9.TypeFlags.Enum);
- }
- function isFreshableType(type) {
- return isTypeFlagSet(type, ts9.TypeFlags.Freshable);
- }
- function isIndexedAccessType(type) {
- return isTypeFlagSet(type, ts9.TypeFlags.IndexedAccess);
- }
- function isIndexType(type) {
- return isTypeFlagSet(type, ts9.TypeFlags.Index);
- }
- function isInstantiableType(type) {
- return isTypeFlagSet(type, ts9.TypeFlags.Instantiable);
- }
- function isIntersectionType(type) {
- return isTypeFlagSet(type, ts9.TypeFlags.Intersection);
- }
- function isObjectType(type) {
- return isTypeFlagSet(type, ts9.TypeFlags.Object);
- }
- function isStringMappingType(type) {
- return isTypeFlagSet(type, ts9.TypeFlags.StringMapping);
- }
- function isSubstitutionType(type) {
- return isTypeFlagSet(type, ts9.TypeFlags.Substitution);
- }
- function isTypeParameter(type) {
- return isTypeFlagSet(type, ts9.TypeFlags.TypeParameter);
- }
- function isTypeVariable(type) {
- return isTypeFlagSet(type, ts9.TypeFlags.TypeVariable);
- }
- function isUnionOrIntersectionType(type) {
- return isTypeFlagSet(type, ts9.TypeFlags.UnionOrIntersection);
- }
- function isUnionType(type) {
- return isTypeFlagSet(type, ts9.TypeFlags.Union);
- }
- function isUniqueESSymbolType(type) {
- return isTypeFlagSet(type, ts9.TypeFlags.UniqueESSymbol);
- }
- // src/types/typeGuards/objects.ts
- function isEvolvingArrayType(type) {
- return isObjectType(type) && isObjectFlagSet(type, ts9.ObjectFlags.EvolvingArray);
- }
- function isTupleType(type) {
- return isObjectType(type) && isObjectFlagSet(type, ts9.ObjectFlags.Tuple);
- }
- function isTypeReference(type) {
- return isObjectType(type) && isObjectFlagSet(type, ts9.ObjectFlags.Reference);
- }
- // src/types/typeGuards/compound.ts
- function isFreshableIntrinsicType(type) {
- return isIntrinsicType(type) && isFreshableType(type);
- }
- function isTupleTypeReference(type) {
- return isTypeReference(type) && isTupleType(type.target);
- }
- function isBigIntLiteralType(type) {
- return isTypeFlagSet(type, ts9.TypeFlags.BigIntLiteral);
- }
- function isBooleanLiteralType(type) {
- return isTypeFlagSet(type, ts9.TypeFlags.BooleanLiteral);
- }
- function isFalseLiteralType(type) {
- return isBooleanLiteralType(type) && type.intrinsicName === "false";
- }
- function isLiteralType(type) {
- return isTypeFlagSet(type, ts9.TypeFlags.Literal);
- }
- function isNumberLiteralType(type) {
- return isTypeFlagSet(type, ts9.TypeFlags.NumberLiteral);
- }
- function isStringLiteralType(type) {
- return isTypeFlagSet(type, ts9.TypeFlags.StringLiteral);
- }
- function isTemplateLiteralType(type) {
- return isTypeFlagSet(type, ts9.TypeFlags.TemplateLiteral);
- }
- function isTrueLiteralType(type) {
- return isBooleanLiteralType(type) && type.intrinsicName === "true";
- }
- // src/types/getters.ts
- function getCallSignaturesOfType(type) {
- if (isUnionType(type)) {
- const signatures = [];
- for (const subType of type.types) {
- signatures.push(...getCallSignaturesOfType(subType));
- }
- return signatures;
- }
- if (isIntersectionType(type)) {
- let signatures;
- for (const subType of type.types) {
- const sig = getCallSignaturesOfType(subType);
- if (sig.length !== 0) {
- if (signatures !== void 0) {
- return [];
- }
- signatures = sig;
- }
- }
- return signatures === void 0 ? [] : signatures;
- }
- return type.getCallSignatures();
- }
- function getPropertyOfType(type, name) {
- if (!name.startsWith("__")) {
- return type.getProperty(name);
- }
- return type.getProperties().find((s) => s.escapedName === name);
- }
- function getWellKnownSymbolPropertyOfType(type, wellKnownSymbolName, typeChecker) {
- const prefix = "__@" + wellKnownSymbolName;
- for (const prop of type.getProperties()) {
- if (!prop.name.startsWith(prefix)) {
- continue;
- }
- const declaration = prop.valueDeclaration ?? prop.getDeclarations()?.[0];
- if (!declaration || !isNamedDeclarationWithName(declaration) || declaration.name === void 0 || !ts9.isComputedPropertyName(declaration.name)) {
- continue;
- }
- const globalSymbol = typeChecker.getApparentType(
- typeChecker.getTypeAtLocation(declaration.name.expression)
- ).symbol;
- if (prop.escapedName === getPropertyNameOfWellKnownSymbol(
- typeChecker,
- globalSymbol,
- wellKnownSymbolName
- )) {
- return prop;
- }
- }
- return void 0;
- }
- function getPropertyNameOfWellKnownSymbol(typeChecker, symbolConstructor, symbolName) {
- const knownSymbol = symbolConstructor && typeChecker.getTypeOfSymbolAtLocation(
- symbolConstructor,
- // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access
- symbolConstructor.valueDeclaration
- ).getProperty(symbolName);
- const knownSymbolType = knownSymbol && typeChecker.getTypeOfSymbolAtLocation(
- knownSymbol,
- // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access
- knownSymbol.valueDeclaration
- );
- if (knownSymbolType && isUniqueESSymbolType(knownSymbolType)) {
- return knownSymbolType.escapedName;
- }
- return "__@" + symbolName;
- }
- function isBindableObjectDefinePropertyCall(node) {
- return node.arguments.length === 3 && isEntityNameExpression(node.arguments[0]) && isNumericOrStringLikeLiteral(node.arguments[1]) && ts9.isPropertyAccessExpression(node.expression) && node.expression.name.escapedText === "defineProperty" && ts9.isIdentifier(node.expression.expression) && node.expression.expression.escapedText === "Object";
- }
- function isInConstContext(node, typeChecker) {
- let current = node;
- while (true) {
- const parent = current.parent;
- outer: switch (parent.kind) {
- case ts9.SyntaxKind.ArrayLiteralExpression:
- case ts9.SyntaxKind.ObjectLiteralExpression:
- case ts9.SyntaxKind.ParenthesizedExpression:
- case ts9.SyntaxKind.TemplateExpression:
- current = parent;
- break;
- case ts9.SyntaxKind.AsExpression:
- case ts9.SyntaxKind.TypeAssertionExpression:
- return isConstAssertionExpression(parent);
- case ts9.SyntaxKind.CallExpression: {
- if (!ts9.isExpression(current)) {
- return false;
- }
- const functionSignature = typeChecker.getResolvedSignature(
- parent
- );
- if (functionSignature === void 0) {
- return false;
- }
- const argumentIndex = parent.arguments.indexOf(
- current
- );
- if (argumentIndex < 0) {
- return false;
- }
- const parameterSymbol = functionSignature.getParameters()[argumentIndex];
- if (parameterSymbol === void 0 || !("links" in parameterSymbol)) {
- return false;
- }
- const parameterSymbolLinks = parameterSymbol.links;
- const propertySymbol = parameterSymbolLinks.type?.getProperties()?.[argumentIndex];
- if (propertySymbol === void 0 || !("links" in propertySymbol)) {
- return false;
- }
- return !!propertySymbol.links && isTransientSymbolLinksFlagSet(
- propertySymbol.links,
- ts9.CheckFlags.Readonly
- );
- }
- case ts9.SyntaxKind.PrefixUnaryExpression:
- if (current.kind !== ts9.SyntaxKind.NumericLiteral) {
- return false;
- }
- switch (parent.operator) {
- case ts9.SyntaxKind.MinusToken:
- case ts9.SyntaxKind.PlusToken:
- current = parent;
- break outer;
- default:
- return false;
- }
- case ts9.SyntaxKind.PropertyAssignment:
- if (parent.initializer !== current) {
- return false;
- }
- current = parent.parent;
- break;
- case ts9.SyntaxKind.ShorthandPropertyAssignment:
- current = parent.parent;
- break;
- default:
- return false;
- }
- }
- }
- // src/types/utilities.ts
- function intersectionConstituents(type) {
- return isIntersectionType(type) ? type.types : [type];
- }
- var intersectionTypeParts = intersectionConstituents;
- function isFalsyType(type) {
- if (isTypeFlagSet(
- type,
- ts9.TypeFlags.Undefined | ts9.TypeFlags.Null | ts9.TypeFlags.Void
- )) {
- return true;
- }
- if (typeIsLiteral(type)) {
- if (typeof type.value === "object") {
- return type.value.base10Value === "0";
- } else {
- return !type.value;
- }
- }
- return isFalseLiteralType(type);
- }
- function isPropertyReadonlyInType(type, name, typeChecker) {
- let seenProperty = false;
- let seenReadonlySignature = false;
- for (const subType of unionConstituents(type)) {
- if (getPropertyOfType(subType, name) === void 0) {
- const index = (isNumericPropertyName(name) ? typeChecker.getIndexInfoOfType(subType, ts9.IndexKind.Number) : void 0) ?? typeChecker.getIndexInfoOfType(subType, ts9.IndexKind.String);
- if (index?.isReadonly) {
- if (seenProperty) {
- return true;
- }
- seenReadonlySignature = true;
- }
- } else if (seenReadonlySignature || isReadonlyPropertyIntersection(subType, name, typeChecker)) {
- return true;
- } else {
- seenProperty = true;
- }
- }
- return false;
- }
- function isThenableType(typeChecker, node, type = typeChecker.getTypeAtLocation(node)) {
- for (const constituent of unionConstituents(
- typeChecker.getApparentType(type)
- )) {
- const then = constituent.getProperty("then");
- if (then === void 0) {
- continue;
- }
- const thenType = typeChecker.getTypeOfSymbolAtLocation(then, node);
- for (const subConstituent of unionConstituents(thenType)) {
- for (const signature of subConstituent.getCallSignatures()) {
- if (signature.parameters.length !== 0 && isCallback(typeChecker, signature.parameters[0], node)) {
- return true;
- }
- }
- }
- }
- return false;
- }
- function symbolHasReadonlyDeclaration(symbol, typeChecker) {
- return !!((symbol.flags & ts9.SymbolFlags.Accessor) === ts9.SymbolFlags.GetAccessor || symbol.declarations?.some(
- (node) => isModifierFlagSet(node, ts9.ModifierFlags.Readonly) || ts9.isVariableDeclaration(node) && isNodeFlagSet(node.parent, ts9.NodeFlags.Const) || ts9.isCallExpression(node) && isReadonlyAssignmentDeclaration(node, typeChecker) || ts9.isEnumMember(node) || (ts9.isPropertyAssignment(node) || ts9.isShorthandPropertyAssignment(node)) && isInConstContext(node, typeChecker)
- ));
- }
- function typeConstituents(type) {
- return isIntersectionType(type) || isUnionType(type) ? type.types : [type];
- }
- function typeIsLiteral(type) {
- if (isTsVersionAtLeast(5, 0)) {
- return type.isLiteral();
- } else {
- return isTypeFlagSet(
- type,
- ts9.TypeFlags.StringLiteral | ts9.TypeFlags.NumberLiteral | ts9.TypeFlags.BigIntLiteral
- );
- }
- }
- var typeParts = typeConstituents;
- function unionConstituents(type) {
- return isUnionType(type) ? type.types : [type];
- }
- var unionTypeParts = unionConstituents;
- function isCallback(typeChecker, param, node) {
- let type = typeChecker.getApparentType(
- typeChecker.getTypeOfSymbolAtLocation(param, node)
- );
- if (param.valueDeclaration.dotDotDotToken) {
- type = type.getNumberIndexType();
- if (type === void 0) {
- return false;
- }
- }
- for (const subType of unionConstituents(type)) {
- if (subType.getCallSignatures().length !== 0) {
- return true;
- }
- }
- return false;
- }
- function isReadonlyAssignmentDeclaration(node, typeChecker) {
- if (!isBindableObjectDefinePropertyCall(node)) {
- return false;
- }
- const descriptorType = typeChecker.getTypeAtLocation(node.arguments[2]);
- if (descriptorType.getProperty("value") === void 0) {
- return descriptorType.getProperty("set") === void 0;
- }
- const writableProp = descriptorType.getProperty("writable");
- if (writableProp === void 0) {
- return false;
- }
- const writableType = writableProp.valueDeclaration !== void 0 && ts9.isPropertyAssignment(writableProp.valueDeclaration) ? typeChecker.getTypeAtLocation(writableProp.valueDeclaration.initializer) : typeChecker.getTypeOfSymbolAtLocation(writableProp, node.arguments[2]);
- return isFalseLiteralType(writableType);
- }
- function isReadonlyPropertyFromMappedType(type, name, typeChecker) {
- if (!isObjectType(type) || !isObjectFlagSet(type, ts9.ObjectFlags.Mapped)) {
- return;
- }
- const declaration = type.symbol.declarations[0];
- if (declaration.readonlyToken !== void 0 && !/^__@[^@]+$/.test(name)) {
- return declaration.readonlyToken.kind !== ts9.SyntaxKind.MinusToken;
- }
- const { modifiersType } = type;
- return modifiersType && isPropertyReadonlyInType(modifiersType, name, typeChecker);
- }
- function isReadonlyPropertyIntersection(type, name, typeChecker) {
- const constituents = intersectionConstituents(type);
- return constituents.some((constituent) => {
- const prop = getPropertyOfType(constituent, name);
- if (prop === void 0) {
- return false;
- }
- if (prop.flags & ts9.SymbolFlags.Transient) {
- if (/^(?:[1-9]\d*|0)$/.test(name) && isTupleTypeReference(constituent)) {
- return constituent.target.readonly;
- }
- switch (isReadonlyPropertyFromMappedType(constituent, name, typeChecker)) {
- case false:
- return false;
- case true:
- return true;
- }
- }
- return !!// members of namespace import
- (isSymbolFlagSet(prop, ts9.SymbolFlags.ValueModule) || // we unwrapped every mapped type, now we can check the actual declarations
- // eslint-disable-next-line @typescript-eslint/no-deprecated -- Will be made private-only soon.
- symbolHasReadonlyDeclaration(prop, typeChecker));
- });
- }
- function identifierToKeywordKind(node) {
- return "originalKeywordKind" in node ? node.originalKeywordKind : ts9.identifierToKeywordKind(node);
- }
- // src/usage/declarations.ts
- var DeclarationDomain = /* @__PURE__ */ ((DeclarationDomain2) => {
- DeclarationDomain2[DeclarationDomain2["Namespace"] = 1] = "Namespace";
- DeclarationDomain2[DeclarationDomain2["Type"] = 2] = "Type";
- DeclarationDomain2[DeclarationDomain2["Value"] = 4] = "Value";
- DeclarationDomain2[DeclarationDomain2["Any"] = 7] = "Any";
- DeclarationDomain2[DeclarationDomain2["Import"] = 8] = "Import";
- return DeclarationDomain2;
- })(DeclarationDomain || {});
- function getDeclarationDomain(node) {
- switch (node.parent.kind) {
- case ts9.SyntaxKind.ClassDeclaration:
- case ts9.SyntaxKind.ClassExpression:
- return 2 /* Type */ | 4 /* Value */;
- case ts9.SyntaxKind.EnumDeclaration:
- return 7 /* Any */;
- case ts9.SyntaxKind.FunctionDeclaration:
- case ts9.SyntaxKind.FunctionExpression:
- return 4 /* Value */;
- case ts9.SyntaxKind.ImportClause:
- case ts9.SyntaxKind.NamespaceImport:
- return 7 /* Any */ | 8 /* Import */;
- // TODO handle type-only imports
- case ts9.SyntaxKind.ImportEqualsDeclaration:
- case ts9.SyntaxKind.ImportSpecifier:
- return node.parent.name === node ? 7 /* Any */ | 8 /* Import */ : void 0;
- case ts9.SyntaxKind.InterfaceDeclaration:
- case ts9.SyntaxKind.TypeAliasDeclaration:
- case ts9.SyntaxKind.TypeParameter:
- return 2 /* Type */;
- case ts9.SyntaxKind.ModuleDeclaration:
- return 1 /* Namespace */;
- case ts9.SyntaxKind.Parameter:
- if (node.parent.parent.kind === ts9.SyntaxKind.IndexSignature || identifierToKeywordKind(node) === ts9.SyntaxKind.ThisKeyword) {
- return;
- }
- // falls through
- case ts9.SyntaxKind.BindingElement:
- case ts9.SyntaxKind.VariableDeclaration:
- return node.parent.name === node ? 4 /* Value */ : void 0;
- }
- }
- function getPropertyName(propertyName) {
- if (propertyName.kind === ts9.SyntaxKind.ComputedPropertyName) {
- const expression = unwrapParentheses(propertyName.expression);
- if (ts9.isPrefixUnaryExpression(expression)) {
- let negate = false;
- switch (expression.operator) {
- case ts9.SyntaxKind.MinusToken:
- negate = true;
- // falls through
- case ts9.SyntaxKind.PlusToken:
- return ts9.isNumericLiteral(expression.operand) ? `${negate ? "-" : ""}${expression.operand.text}` : ts9.isBigIntLiteral(expression.operand) ? `${negate ? "-" : ""}${expression.operand.text.slice(0, -1)}` : void 0;
- default:
- return;
- }
- }
- if (ts9.isBigIntLiteral(expression)) {
- return expression.text.slice(0, -1);
- }
- if (isNumericOrStringLikeLiteral(expression)) {
- return expression.text;
- }
- return;
- }
- return propertyName.kind === ts9.SyntaxKind.PrivateIdentifier ? void 0 : propertyName.text;
- }
- function unwrapParentheses(node) {
- while (node.kind === ts9.SyntaxKind.ParenthesizedExpression) {
- node = node.expression;
- }
- return node;
- }
- var UsageDomain = /* @__PURE__ */ ((UsageDomain2) => {
- UsageDomain2[UsageDomain2["Namespace"] = 1] = "Namespace";
- UsageDomain2[UsageDomain2["Type"] = 2] = "Type";
- UsageDomain2[UsageDomain2["Value"] = 4] = "Value";
- UsageDomain2[UsageDomain2["Any"] = 7] = "Any";
- UsageDomain2[UsageDomain2["TypeQuery"] = 8] = "TypeQuery";
- UsageDomain2[UsageDomain2["ValueOrNamespace"] = 5] = "ValueOrNamespace";
- return UsageDomain2;
- })(UsageDomain || {});
- function getUsageDomain(node) {
- const parent = node.parent;
- switch (parent.kind) {
- // Value
- case ts9.SyntaxKind.BindingElement:
- if (parent.initializer === node) {
- return 5 /* ValueOrNamespace */;
- }
- break;
- case ts9.SyntaxKind.BreakStatement:
- case ts9.SyntaxKind.ClassDeclaration:
- case ts9.SyntaxKind.ClassExpression:
- case ts9.SyntaxKind.ContinueStatement:
- case ts9.SyntaxKind.EnumDeclaration:
- case ts9.SyntaxKind.FunctionDeclaration:
- case ts9.SyntaxKind.FunctionExpression:
- case ts9.SyntaxKind.GetAccessor:
- case ts9.SyntaxKind.ImportClause:
- case ts9.SyntaxKind.ImportSpecifier:
- case ts9.SyntaxKind.InterfaceDeclaration:
- case ts9.SyntaxKind.JsxAttribute:
- case ts9.SyntaxKind.LabeledStatement:
- case ts9.SyntaxKind.MethodDeclaration:
- case ts9.SyntaxKind.MethodSignature:
- case ts9.SyntaxKind.ModuleDeclaration:
- case ts9.SyntaxKind.NamedTupleMember:
- case ts9.SyntaxKind.NamespaceExport:
- case ts9.SyntaxKind.NamespaceExportDeclaration:
- case ts9.SyntaxKind.NamespaceImport:
- case ts9.SyntaxKind.PropertySignature:
- case ts9.SyntaxKind.SetAccessor:
- case ts9.SyntaxKind.TypeAliasDeclaration:
- case ts9.SyntaxKind.TypeParameter:
- case ts9.SyntaxKind.TypePredicate:
- break;
- case ts9.SyntaxKind.EnumMember:
- case ts9.SyntaxKind.ImportEqualsDeclaration:
- case ts9.SyntaxKind.Parameter:
- case ts9.SyntaxKind.PropertyAccessExpression:
- case ts9.SyntaxKind.PropertyAssignment:
- case ts9.SyntaxKind.PropertyDeclaration:
- case ts9.SyntaxKind.VariableDeclaration:
- if (parent.name !== node) {
- return 5 /* ValueOrNamespace */;
- }
- break;
- case ts9.SyntaxKind.ExportAssignment:
- return 7 /* Any */;
- case ts9.SyntaxKind.ExportSpecifier:
- if (parent.propertyName === void 0 || parent.propertyName === node) {
- return 7 /* Any */;
- }
- break;
- case ts9.SyntaxKind.ExpressionWithTypeArguments:
- return parent.parent.token === ts9.SyntaxKind.ImplementsKeyword || parent.parent.parent.kind === ts9.SyntaxKind.InterfaceDeclaration ? 2 /* Type */ : 4 /* Value */;
- case ts9.SyntaxKind.QualifiedName:
- if (parent.left === node) {
- if (getEntityNameParent(parent).kind === ts9.SyntaxKind.TypeQuery) {
- return 1 /* Namespace */ | 8 /* TypeQuery */;
- }
- return 1 /* Namespace */;
- }
- break;
- case ts9.SyntaxKind.TypeQuery:
- return 5 /* ValueOrNamespace */ | 8 /* TypeQuery */;
- case ts9.SyntaxKind.TypeReference:
- return identifierToKeywordKind(node) !== ts9.SyntaxKind.ConstKeyword ? 2 /* Type */ : void 0;
- default:
- return 5 /* ValueOrNamespace */;
- }
- }
- function getEntityNameParent(name) {
- let parent = name.parent;
- while (parent.kind === ts9.SyntaxKind.QualifiedName) {
- parent = parent.parent;
- }
- return parent;
- }
- function isBlockScopeBoundary(node) {
- switch (node.kind) {
- case ts9.SyntaxKind.Block: {
- const parent = node.parent;
- return parent.kind !== ts9.SyntaxKind.CatchClause && // blocks inside SourceFile are block scope boundaries
- (parent.kind === ts9.SyntaxKind.SourceFile || // blocks that are direct children of a function scope boundary are no scope boundary
- // for example the FunctionBlock is part of the function scope of the containing function
- !isFunctionScopeBoundary(parent)) ? 2 /* Block */ : 0 /* None */;
- }
- case ts9.SyntaxKind.CaseBlock:
- case ts9.SyntaxKind.CatchClause:
- case ts9.SyntaxKind.ForInStatement:
- case ts9.SyntaxKind.ForOfStatement:
- case ts9.SyntaxKind.ForStatement:
- case ts9.SyntaxKind.WithStatement:
- return 2 /* Block */;
- default:
- return 0 /* None */;
- }
- }
- // src/usage/scopes.ts
- var AbstractScope = class {
- constructor(global) {
- this.global = global;
- }
- namespaceScopes = void 0;
- uses = [];
- variables = /* @__PURE__ */ new Map();
- #enumScopes = void 0;
- addUse(use) {
- this.uses.push(use);
- }
- addVariable(identifier, name, selector, exported, domain) {
- const variables = this.getDestinationScope(selector).getVariables();
- const declaration = {
- declaration: name,
- domain,
- exported
- };
- const variable = variables.get(identifier);
- if (variable === void 0) {
- variables.set(identifier, {
- declarations: [declaration],
- domain,
- uses: []
- });
- } else {
- variable.domain |= domain;
- variable.declarations.push(declaration);
- }
- }
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
- createOrReuseEnumScope(name, _exported) {
- let scope;
- if (this.#enumScopes === void 0) {
- this.#enumScopes = /* @__PURE__ */ new Map();
- } else {
- scope = this.#enumScopes.get(name);
- }
- if (scope === void 0) {
- scope = new EnumScope(this);
- this.#enumScopes.set(name, scope);
- }
- return scope;
- }
- // only relevant for the root scope
- createOrReuseNamespaceScope(name, _exported, ambient, hasExportStatement) {
- let scope;
- if (this.namespaceScopes === void 0) {
- this.namespaceScopes = /* @__PURE__ */ new Map();
- } else {
- scope = this.namespaceScopes.get(name);
- }
- if (scope === void 0) {
- scope = new NamespaceScope(ambient, hasExportStatement, this);
- this.namespaceScopes.set(name, scope);
- } else {
- scope.refresh(ambient, hasExportStatement);
- }
- return scope;
- }
- end(cb) {
- if (this.namespaceScopes !== void 0) {
- this.namespaceScopes.forEach((value) => value.finish(cb));
- }
- this.namespaceScopes = this.#enumScopes = void 0;
- this.applyUses();
- this.variables.forEach((variable) => {
- for (const declaration of variable.declarations) {
- const result = {
- declarations: [],
- domain: declaration.domain,
- exported: declaration.exported,
- inGlobalScope: this.global,
- uses: []
- };
- for (const other of variable.declarations) {
- if (other.domain & declaration.domain) {
- result.declarations.push(other.declaration);
- }
- }
- for (const use of variable.uses) {
- if (use.domain & declaration.domain) {
- result.uses.push(use);
- }
- }
- cb(result, declaration.declaration, this);
- }
- });
- }
- getFunctionScope() {
- return this;
- }
- getVariables() {
- return this.variables;
- }
- // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-unused-vars
- markExported(_name) {
- }
- // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-unused-vars
- addUseToParent(_use) {
- }
- applyUse(use, variables = this.variables) {
- const variable = variables.get(use.location.text);
- if (variable === void 0 || (variable.domain & use.domain) === 0) {
- return false;
- }
- variable.uses.push(use);
- return true;
- }
- applyUses() {
- for (const use of this.uses) {
- if (!this.applyUse(use)) {
- this.addUseToParent(use);
- }
- }
- this.uses = [];
- }
- };
- var NonRootScope = class extends AbstractScope {
- constructor(parent, boundary) {
- super(false);
- this.parent = parent;
- this.boundary = boundary;
- }
- getDestinationScope(selector) {
- return this.boundary & selector ? this : this.parent.getDestinationScope(selector);
- }
- addUseToParent(use) {
- return this.parent.addUse(use, this);
- }
- };
- var AbstractNamedExpressionScope = class extends NonRootScope {
- #domain;
- #name;
- constructor(name, domain, parent) {
- super(parent, 1 /* Function */);
- this.#name = name;
- this.#domain = domain;
- }
- addUse(use, source) {
- if (source !== this.innerScope) {
- return this.innerScope.addUse(use);
- }
- if (use.domain & this.#domain && use.location.text === this.#name.text) {
- this.uses.push(use);
- } else {
- return this.parent.addUse(use, this);
- }
- }
- end(cb) {
- this.innerScope.end(cb);
- return cb(
- {
- declarations: [this.#name],
- domain: this.#domain,
- exported: false,
- inGlobalScope: false,
- uses: this.uses
- },
- this.#name,
- this
- );
- }
- getDestinationScope() {
- return this.innerScope;
- }
- getFunctionScope() {
- return this.innerScope;
- }
- };
- var BlockScope = class extends NonRootScope {
- #functionScope;
- constructor(functionScope, parent) {
- super(parent, 2 /* Block */);
- this.#functionScope = functionScope;
- }
- getFunctionScope() {
- return this.#functionScope;
- }
- };
- var ClassExpressionScope = class extends AbstractNamedExpressionScope {
- innerScope = new NonRootScope(this, 1 /* Function */);
- constructor(name, parent) {
- super(name, 4 /* Value */ | 2 /* Type */, parent);
- }
- };
- var ConditionalTypeScope = class extends NonRootScope {
- #state = 0 /* Initial */;
- constructor(parent) {
- super(parent, 8 /* ConditionalType */);
- }
- addUse(use) {
- if (this.#state === 2 /* TrueType */) {
- return void this.uses.push(use);
- }
- return this.parent.addUse(use, this);
- }
- updateState(newState) {
- this.#state = newState;
- }
- };
- var EnumScope = class extends NonRootScope {
- constructor(parent) {
- super(parent, 1 /* Function */);
- }
- end() {
- this.applyUses();
- }
- };
- var FunctionScope = class extends NonRootScope {
- constructor(parent) {
- super(parent, 1 /* Function */);
- }
- beginBody() {
- this.applyUses();
- }
- };
- var FunctionExpressionScope = class extends AbstractNamedExpressionScope {
- innerScope = new FunctionScope(this);
- constructor(name, parent) {
- super(name, 4 /* Value */, parent);
- }
- beginBody() {
- return this.innerScope.beginBody();
- }
- };
- var NamespaceScope = class extends NonRootScope {
- #ambient;
- #exports = void 0;
- #hasExport;
- #innerScope = new NonRootScope(this, 1 /* Function */);
- constructor(ambient, hasExport, parent) {
- super(parent, 1 /* Function */);
- this.#ambient = ambient;
- this.#hasExport = hasExport;
- }
- addUse(use, source) {
- if (source !== this.#innerScope) {
- return this.#innerScope.addUse(use);
- }
- this.uses.push(use);
- }
- createOrReuseEnumScope(name, exported) {
- if (!exported && (!this.#ambient || this.#hasExport)) {
- return this.#innerScope.createOrReuseEnumScope(name, exported);
- }
- return super.createOrReuseEnumScope(name, exported);
- }
- createOrReuseNamespaceScope(name, exported, ambient, hasExportStatement) {
- if (!exported && (!this.#ambient || this.#hasExport)) {
- return this.#innerScope.createOrReuseNamespaceScope(
- name,
- exported,
- ambient || this.#ambient,
- hasExportStatement
- );
- }
- return super.createOrReuseNamespaceScope(
- name,
- exported,
- ambient || this.#ambient,
- hasExportStatement
- );
- }
- end(cb) {
- this.#innerScope.end((variable, key, scope) => {
- if (scope !== this.#innerScope || !variable.exported && (!this.#ambient || this.#exports !== void 0 && !this.#exports.has(key.text))) {
- return cb(variable, key, scope);
- }
- const namespaceVar = this.variables.get(key.text);
- if (namespaceVar === void 0) {
- this.variables.set(key.text, {
- declarations: variable.declarations.map(mapDeclaration),
- domain: variable.domain,
- uses: [...variable.uses]
- });
- } else {
- outer: for (const declaration of variable.declarations) {
- for (const existing of namespaceVar.declarations) {
- if (existing.declaration === declaration) {
- continue outer;
- }
- namespaceVar.declarations.push(mapDeclaration(declaration));
- }
- }
- namespaceVar.domain |= variable.domain;
- for (const use of variable.uses) {
- if (namespaceVar.uses.includes(use)) {
- continue;
- }
- namespaceVar.uses.push(use);
- }
- }
- });
- this.applyUses();
- this.#innerScope = new NonRootScope(this, 1 /* Function */);
- }
- finish(cb) {
- return super.end(cb);
- }
- getDestinationScope() {
- return this.#innerScope;
- }
- markExported(name) {
- if (this.#exports === void 0) {
- this.#exports = /* @__PURE__ */ new Set();
- }
- this.#exports.add(name.text);
- }
- refresh(ambient, hasExport) {
- this.#ambient = ambient;
- this.#hasExport = hasExport;
- }
- };
- var RootScope = class extends AbstractScope {
- #exportAll;
- #exports = void 0;
- #innerScope = new NonRootScope(this, 1 /* Function */);
- constructor(exportAll, global) {
- super(global);
- this.#exportAll = exportAll;
- }
- addUse(use, origin) {
- if (origin === this.#innerScope) {
- return super.addUse(use);
- }
- return this.#innerScope.addUse(use);
- }
- addVariable(identifier, name, selector, exported, domain) {
- if (domain & 8 /* Import */) {
- return super.addVariable(identifier, name, selector, exported, domain);
- }
- return this.#innerScope.addVariable(
- identifier,
- name,
- selector,
- exported,
- domain
- );
- }
- end(cb) {
- this.#innerScope.end((value, key) => {
- value.exported ||= this.#exportAll || this.#exports !== void 0 && this.#exports.includes(key.text);
- value.inGlobalScope = this.global;
- return cb(value, key, this);
- });
- return super.end((value, key, scope) => {
- value.exported ||= scope === this && this.#exports !== void 0 && this.#exports.includes(key.text);
- return cb(value, key, scope);
- });
- }
- getDestinationScope() {
- return this;
- }
- markExported(id) {
- if (this.#exports === void 0) {
- this.#exports = [id.text];
- } else {
- this.#exports.push(id.text);
- }
- }
- };
- function mapDeclaration(declaration) {
- return {
- declaration,
- domain: getDeclarationDomain(declaration),
- exported: true
- };
- }
- // src/usage/UsageWalker.ts
- var UsageWalker = class {
- #result = /* @__PURE__ */ new Map();
- #scope;
- getUsage(sourceFile) {
- const variableCallback = (variable, key) => {
- this.#result.set(key, variable);
- };
- const isModule = ts9.isExternalModule(sourceFile);
- this.#scope = new RootScope(
- sourceFile.isDeclarationFile && isModule && !containsExportStatement(sourceFile),
- !isModule
- );
- const cb = (node) => {
- if (isBlockScopeBoundary(node)) {
- return continueWithScope(
- node,
- new BlockScope(this.#scope.getFunctionScope(), this.#scope),
- handleBlockScope
- );
- }
- switch (node.kind) {
- case ts9.SyntaxKind.ArrowFunction:
- case ts9.SyntaxKind.CallSignature:
- case ts9.SyntaxKind.Constructor:
- case ts9.SyntaxKind.ConstructorType:
- case ts9.SyntaxKind.ConstructSignature:
- case ts9.SyntaxKind.FunctionDeclaration:
- case ts9.SyntaxKind.FunctionExpression:
- case ts9.SyntaxKind.FunctionType:
- case ts9.SyntaxKind.GetAccessor:
- case ts9.SyntaxKind.MethodDeclaration:
- case ts9.SyntaxKind.MethodSignature:
- case ts9.SyntaxKind.SetAccessor:
- return this.#handleFunctionLikeDeclaration(
- node,
- cb,
- variableCallback
- );
- case ts9.SyntaxKind.ClassDeclaration:
- this.#handleDeclaration(
- node,
- true,
- 4 /* Value */ | 2 /* Type */
- );
- return continueWithScope(
- node,
- new NonRootScope(this.#scope, 1 /* Function */)
- );
- case ts9.SyntaxKind.ClassExpression:
- return continueWithScope(
- node,
- node.name !== void 0 ? new ClassExpressionScope(
- node.name,
- this.#scope
- ) : new NonRootScope(this.#scope, 1 /* Function */)
- );
- case ts9.SyntaxKind.ConditionalType:
- return this.#handleConditionalType(
- node,
- cb,
- variableCallback
- );
- case ts9.SyntaxKind.EnumDeclaration:
- this.#handleDeclaration(
- node,
- true,
- 7 /* Any */
- );
- return continueWithScope(
- node,
- this.#scope.createOrReuseEnumScope(
- node.name.text,
- includesModifier(
- node.modifiers,
- ts9.SyntaxKind.ExportKeyword
- )
- )
- );
- case ts9.SyntaxKind.EnumMember:
- this.#scope.addVariable(
- getPropertyName(node.name),
- node.name,
- 1 /* Function */,
- true,
- 4 /* Value */
- );
- break;
- case ts9.SyntaxKind.ExportAssignment:
- if (node.expression.kind === ts9.SyntaxKind.Identifier) {
- return this.#scope.markExported(
- node.expression
- );
- }
- break;
- case ts9.SyntaxKind.ExportSpecifier:
- if (node.propertyName !== void 0) {
- return this.#scope.markExported(
- node.propertyName,
- node.name
- );
- }
- return this.#scope.markExported(node.name);
- case ts9.SyntaxKind.Identifier: {
- const domain = getUsageDomain(node);
- if (domain !== void 0) {
- this.#scope.addUse({ domain, location: node });
- }
- return;
- }
- case ts9.SyntaxKind.ImportClause:
- case ts9.SyntaxKind.ImportEqualsDeclaration:
- case ts9.SyntaxKind.ImportSpecifier:
- case ts9.SyntaxKind.NamespaceImport:
- this.#handleDeclaration(
- node,
- false,
- 7 /* Any */ | 8 /* Import */
- );
- break;
- case ts9.SyntaxKind.InterfaceDeclaration:
- case ts9.SyntaxKind.TypeAliasDeclaration:
- this.#handleDeclaration(
- node,
- true,
- 2 /* Type */
- );
- return continueWithScope(
- node,
- new NonRootScope(this.#scope, 4 /* Type */)
- );
- case ts9.SyntaxKind.MappedType:
- return continueWithScope(
- node,
- new NonRootScope(this.#scope, 4 /* Type */)
- );
- case ts9.SyntaxKind.ModuleDeclaration:
- return this.#handleModule(
- node,
- continueWithScope
- );
- case ts9.SyntaxKind.Parameter:
- if (node.parent.kind !== ts9.SyntaxKind.IndexSignature && (node.name.kind !== ts9.SyntaxKind.Identifier || identifierToKeywordKind(
- node.name
- ) !== ts9.SyntaxKind.ThisKeyword)) {
- this.#handleBindingName(
- node.name,
- false,
- false
- );
- }
- break;
- case ts9.SyntaxKind.TypeParameter:
- this.#scope.addVariable(
- node.name.text,
- node.name,
- node.parent.kind === ts9.SyntaxKind.InferType ? 8 /* InferType */ : 7 /* Type */,
- false,
- 2 /* Type */
- );
- break;
- // End of Scope specific handling
- case ts9.SyntaxKind.VariableDeclarationList:
- this.#handleVariableDeclaration(node);
- break;
- }
- return ts9.forEachChild(node, cb);
- };
- const continueWithScope = (node, scope, next = forEachChild) => {
- const savedScope = this.#scope;
- this.#scope = scope;
- next(node);
- this.#scope.end(variableCallback);
- this.#scope = savedScope;
- };
- const handleBlockScope = (node) => {
- if (node.kind === ts9.SyntaxKind.CatchClause && node.variableDeclaration !== void 0) {
- this.#handleBindingName(
- node.variableDeclaration.name,
- true,
- false
- );
- }
- return ts9.forEachChild(node, cb);
- };
- ts9.forEachChild(sourceFile, cb);
- this.#scope.end(variableCallback);
- return this.#result;
- function forEachChild(node) {
- return ts9.forEachChild(node, cb);
- }
- }
- #handleBindingName(name, blockScoped, exported) {
- if (name.kind === ts9.SyntaxKind.Identifier) {
- return this.#scope.addVariable(
- name.text,
- name,
- blockScoped ? 3 /* Block */ : 1 /* Function */,
- exported,
- 4 /* Value */
- );
- }
- forEachDestructuringIdentifier(name, (declaration) => {
- this.#scope.addVariable(
- declaration.name.text,
- declaration.name,
- blockScoped ? 3 /* Block */ : 1 /* Function */,
- exported,
- 4 /* Value */
- );
- });
- }
- #handleConditionalType(node, cb, varCb) {
- const savedScope = this.#scope;
- const scope = this.#scope = new ConditionalTypeScope(savedScope);
- cb(node.checkType);
- scope.updateState(1 /* Extends */);
- cb(node.extendsType);
- scope.updateState(2 /* TrueType */);
- cb(node.trueType);
- scope.updateState(3 /* FalseType */);
- cb(node.falseType);
- scope.end(varCb);
- this.#scope = savedScope;
- }
- #handleDeclaration(node, blockScoped, domain) {
- if (node.name !== void 0) {
- this.#scope.addVariable(
- node.name.text,
- node.name,
- blockScoped ? 3 /* Block */ : 1 /* Function */,
- includesModifier(
- node.modifiers,
- ts9.SyntaxKind.ExportKeyword
- ),
- domain
- );
- }
- }
- #handleFunctionLikeDeclaration(node, cb, varCb) {
- if (ts9.canHaveDecorators(node)) {
- ts9.getDecorators(node)?.forEach(cb);
- }
- const savedScope = this.#scope;
- if (node.kind === ts9.SyntaxKind.FunctionDeclaration) {
- this.#handleDeclaration(node, false, 4 /* Value */);
- }
- const scope = this.#scope = node.kind === ts9.SyntaxKind.FunctionExpression && node.name !== void 0 ? new FunctionExpressionScope(node.name, savedScope) : new FunctionScope(savedScope);
- if (node.name !== void 0) {
- cb(node.name);
- }
- if (node.typeParameters !== void 0) {
- node.typeParameters.forEach(cb);
- }
- node.parameters.forEach(cb);
- if (node.type !== void 0) {
- cb(node.type);
- }
- if (node.body !== void 0) {
- scope.beginBody();
- cb(node.body);
- }
- scope.end(varCb);
- this.#scope = savedScope;
- }
- #handleModule(node, next) {
- if (node.flags & ts9.NodeFlags.GlobalAugmentation) {
- return next(
- node,
- this.#scope.createOrReuseNamespaceScope("-global", false, true, false)
- );
- }
- if (node.name.kind === ts9.SyntaxKind.Identifier) {
- const exported = isNamespaceExported(node);
- this.#scope.addVariable(
- node.name.text,
- node.name,
- 1 /* Function */,
- exported,
- 1 /* Namespace */ | 4 /* Value */
- );
- const ambient = includesModifier(
- node.modifiers,
- ts9.SyntaxKind.DeclareKeyword
- );
- return next(
- node,
- this.#scope.createOrReuseNamespaceScope(
- node.name.text,
- exported,
- ambient,
- ambient && namespaceHasExportStatement(node)
- )
- );
- }
- return next(
- node,
- this.#scope.createOrReuseNamespaceScope(
- `"${node.name.text}"`,
- false,
- true,
- namespaceHasExportStatement(node)
- )
- );
- }
- #handleVariableDeclaration(declarationList) {
- const blockScoped = isBlockScopedVariableDeclarationList(declarationList);
- const exported = declarationList.parent.kind === ts9.SyntaxKind.VariableStatement && includesModifier(
- declarationList.parent.modifiers,
- ts9.SyntaxKind.ExportKeyword
- );
- for (const declaration of declarationList.declarations) {
- this.#handleBindingName(declaration.name, blockScoped, exported);
- }
- }
- };
- function containsExportStatement(block) {
- for (const statement of block.statements) {
- if (statement.kind === ts9.SyntaxKind.ExportDeclaration || statement.kind === ts9.SyntaxKind.ExportAssignment) {
- return true;
- }
- }
- return false;
- }
- function forEachDestructuringIdentifier(pattern, fn) {
- for (const element of pattern.elements) {
- if (element.kind !== ts9.SyntaxKind.BindingElement) {
- continue;
- }
- let result;
- if (element.name.kind === ts9.SyntaxKind.Identifier) {
- result = fn(element);
- } else {
- result = forEachDestructuringIdentifier(element.name, fn);
- }
- if (result) {
- return result;
- }
- }
- }
- function isBlockScopedVariableDeclarationList(declarationList) {
- return (declarationList.flags & ts9.NodeFlags.BlockScoped) !== 0;
- }
- function isNamespaceExported(node) {
- return node.parent.kind === ts9.SyntaxKind.ModuleDeclaration || includesModifier(node.modifiers, ts9.SyntaxKind.ExportKeyword);
- }
- function namespaceHasExportStatement(ns) {
- if (ns.body === void 0 || ns.body.kind !== ts9.SyntaxKind.ModuleBlock) {
- return false;
- }
- return containsExportStatement(ns.body);
- }
- // src/usage/collectVariableUsage.ts
- function collectVariableUsage(sourceFile) {
- return new UsageWalker().getUsage(sourceFile);
- }
- export { AccessKind, DeclarationDomain, UsageDomain, collectVariableUsage, forEachComment, forEachToken, getAccessKind, getCallSignaturesOfType, getPropertyOfType, getWellKnownSymbolPropertyOfType, hasDecorators, hasExpressionInitializer, hasInitializer, hasJSDoc, hasModifiers, hasType, hasTypeArguments, includesModifier, intersectionConstituents, intersectionTypeParts, isAbstractKeyword, isAccessExpression, isAccessibilityModifier, isAccessorDeclaration, isAccessorKeyword, isAnyKeyword, isArrayBindingElement, isArrayBindingOrAssignmentPattern, isAssertKeyword, isAssertsKeyword, isAssignmentKind, isAssignmentPattern, isAsyncKeyword, isAwaitKeyword, isBigIntKeyword, isBigIntLiteralType, isBindingOrAssignmentElementRestIndicator, isBindingOrAssignmentElementTarget, isBindingOrAssignmentPattern, isBindingPattern, isBlockLike, isBooleanKeyword, isBooleanLiteral, isBooleanLiteralType, isClassLikeDeclaration, isClassMemberModifier, isColonToken, isCompilerOptionEnabled, isConditionalType, isConstAssertionExpression, isConstKeyword, isDeclarationName, isDeclarationWithTypeParameterChildren, isDeclarationWithTypeParameters, isDeclareKeyword, isDefaultKeyword, isDestructuringPattern, isDotToken, isEndOfFileToken, isEntityNameExpression, isEntityNameOrEntityNameExpression, isEnumType, isEqualsGreaterThanToken, isEqualsToken, isEvolvingArrayType, isExclamationToken, isExportKeyword, isFalseKeyword, isFalseLiteral, isFalseLiteralType, isFalsyType, isForInOrOfStatement, isFreshableIntrinsicType, isFreshableType, isFunctionLikeDeclaration, isFunctionScopeBoundary, isImportExpression, isImportKeyword, isInKeyword, isIndexType, isIndexedAccessType, isInstantiableType, isIntersectionType, isIntrinsicAnyType, isIntrinsicBigIntType, isIntrinsicBooleanType, isIntrinsicESSymbolType, isIntrinsicErrorType, isIntrinsicNeverType, isIntrinsicNonPrimitiveType, isIntrinsicNullType, isIntrinsicNumberType, isIntrinsicStringType, isIntrinsicType, isIntrinsicUndefinedType, isIntrinsicUnknownType, isIntrinsicVoidType, isIterationStatement, isJSDocComment, isJSDocNamespaceBody, isJSDocNamespaceDeclaration, isJSDocText, isJSDocTypeReferencingNode, isJsonMinusNumericLiteral, isJsonObjectExpression, isJsxAttributeLike, isJsxAttributeValue, isJsxChild, isJsxTagNameExpression, isJsxTagNamePropertyAccess, isLiteralToken, isLiteralType, isModifierFlagSet, isModuleBody, isModuleName, isModuleReference, isNamedDeclarationWithName, isNamedImportBindings, isNamedImportsOrExports, isNamespaceBody, isNamespaceDeclaration, isNeverKeyword, isNodeFlagSet, isNullKeyword, isNullLiteral, isNumberKeyword, isNumberLiteralType, isNumericOrStringLikeLiteral, isNumericPropertyName, isObjectBindingOrAssignmentElement, isObjectBindingOrAssignmentPattern, isObjectFlagSet, isObjectKeyword, isObjectType, isObjectTypeDeclaration, isOutKeyword, isOverrideKeyword, isParameterPropertyModifier, isPrivateKeyword, isPropertyAccessEntityNameExpression, isPropertyNameLiteral, isPropertyReadonlyInType, isProtectedKeyword, isPseudoLiteralToken, isPublicKeyword, isQuestionDotToken, isQuestionToken, isReadonlyKeyword, isSignatureDeclaration, isStaticKeyword, isStrictCompilerOptionEnabled, isStringKeyword, isStringLiteralType, isStringMappingType, isSubstitutionType, isSuperElementAccessExpression, isSuperExpression, isSuperKeyword, isSuperProperty, isSuperPropertyAccessExpression, isSymbolFlagSet, isSymbolKeyword, isSyntaxList, isTemplateLiteralType, isThenableType, isThisExpression, isThisKeyword, isTransientSymbolLinksFlagSet, isTrueKeyword, isTrueLiteral, isTrueLiteralType, isTupleType, isTupleTypeReference, isTypeFlagSet, isTypeOnlyCompatibleAliasDeclaration, isTypeParameter, isTypeReference, isTypeReferenceType, isTypeVariable, isUndefinedKeyword, isUnionOrIntersectionType, isUnionOrIntersectionTypeNode, isUnionType, isUniqueESSymbolType, isUnknownKeyword, isValidPropertyAccess, isVariableLikeDeclaration, isVoidKeyword, iterateComments, iterateTokens, symbolHasReadonlyDeclaration, typeConstituents, typeIsLiteral, typeParts, unionConstituents, unionTypeParts };
|