From 9e75588430c730d0b77fadca200c9454055f4475 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Fri, 21 Apr 2023 16:29:13 -0700 Subject: [PATCH 1/7] Centralize access to the 'current' ts namespace object --- src/compiler/_namespaces/ts.ts | 1 + src/compiler/pluginUtilities.ts | 18 ++++++++++++++++++ src/server/project.ts | 3 ++- src/testRunner/_namespaces/ts.ts | 3 +++ src/tsc/_namespaces/ts.ts | 3 +++ src/tsserver/_namespaces/ts.ts | 3 +++ src/tsserverlibrary/_namespaces/ts.ts | 3 +++ src/typescript/_namespaces/ts.ts | 3 +++ 8 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 src/compiler/pluginUtilities.ts diff --git a/src/compiler/_namespaces/ts.ts b/src/compiler/_namespaces/ts.ts index 5a01767f96d44..7678846fb31ff 100644 --- a/src/compiler/_namespaces/ts.ts +++ b/src/compiler/_namespaces/ts.ts @@ -1,6 +1,7 @@ /* Generated file to emulate the ts namespace. */ export * from "../corePublic"; +export * from "../pluginUtilities"; export * from "../core"; export * from "../debug"; export * from "../semver"; diff --git a/src/compiler/pluginUtilities.ts b/src/compiler/pluginUtilities.ts new file mode 100644 index 0000000000000..770648ab982fc --- /dev/null +++ b/src/compiler/pluginUtilities.ts @@ -0,0 +1,18 @@ +/** @internal */ +export type Entrypoint = "tsc" | "typescript" | "tsserver" | "tsserverlibrary" | "testRunner"; + +let currentEntrypoint: Entrypoint | undefined; +let currentTsNamespace: any; + +/** @internal */ +export function setTypeScriptNamespace(entrypoint: Entrypoint, ts: any) { + if (currentEntrypoint !== undefined) throw new Error("ts namespace already set"); + currentEntrypoint = entrypoint; + currentTsNamespace = ts; +} + +/** @internal */ +export function getTypeScriptNamespace(): any { + if (currentTsNamespace === undefined) throw new Error("ts namespace unset"); + return currentTsNamespace; +} diff --git a/src/server/project.ts b/src/server/project.ts index 129d18a2dc1d7..4ff3a21454792 100644 --- a/src/server/project.ts +++ b/src/server/project.ts @@ -61,6 +61,7 @@ import { getNormalizedAbsolutePath, getOrUpdate, getStringComparer, + getTypeScriptNamespace, HasInvalidatedLibResolutions, HasInvalidatedResolutions, HostCancellationToken, @@ -2000,7 +2001,7 @@ export abstract class Project implements LanguageServiceHost, ModuleResolutionHo session: this.projectService.session }; - const pluginModule = pluginModuleFactory({ typescript: ts }); + const pluginModule = pluginModuleFactory({ typescript: getTypeScriptNamespace() }); const newLS = pluginModule.create(info); for (const k of Object.keys(this.languageService)) { // eslint-disable-next-line local/no-in-operator diff --git a/src/testRunner/_namespaces/ts.ts b/src/testRunner/_namespaces/ts.ts index d9f1d2e9eef1e..0f881662e34e4 100644 --- a/src/testRunner/_namespaces/ts.ts +++ b/src/testRunner/_namespaces/ts.ts @@ -11,3 +11,6 @@ export * from "../../harness/_namespaces/ts"; export * from "../../loggedIO/_namespaces/ts"; import * as server from "./ts.server"; export { server }; + +import * as ts from "./ts"; +ts.setTypeScriptNamespace("testRunner", ts); diff --git a/src/tsc/_namespaces/ts.ts b/src/tsc/_namespaces/ts.ts index 8e361ae718461..5b3865dd51664 100644 --- a/src/tsc/_namespaces/ts.ts +++ b/src/tsc/_namespaces/ts.ts @@ -2,3 +2,6 @@ export * from "../../compiler/_namespaces/ts"; export * from "../../executeCommandLine/_namespaces/ts"; + +import * as ts from "./ts"; +ts.setTypeScriptNamespace("tsc", ts); diff --git a/src/tsserver/_namespaces/ts.ts b/src/tsserver/_namespaces/ts.ts index f590869290d26..0a350171b5831 100644 --- a/src/tsserver/_namespaces/ts.ts +++ b/src/tsserver/_namespaces/ts.ts @@ -6,3 +6,6 @@ export * from "../../jsTyping/_namespaces/ts"; export * from "../../server/_namespaces/ts"; import * as server from "./ts.server"; export { server }; + +import * as ts from "./ts"; +ts.setTypeScriptNamespace("tsserver", ts); diff --git a/src/tsserverlibrary/_namespaces/ts.ts b/src/tsserverlibrary/_namespaces/ts.ts index 3060a64378787..e5f38407ab525 100644 --- a/src/tsserverlibrary/_namespaces/ts.ts +++ b/src/tsserverlibrary/_namespaces/ts.ts @@ -6,3 +6,6 @@ export * from "../../services/_namespaces/ts"; export * from "../../server/_namespaces/ts"; import * as server from "./ts.server"; export { server }; + +import * as ts from "./ts"; +ts.setTypeScriptNamespace("tsserverlibrary", ts); diff --git a/src/typescript/_namespaces/ts.ts b/src/typescript/_namespaces/ts.ts index e55b26438094f..b506f1714023a 100644 --- a/src/typescript/_namespaces/ts.ts +++ b/src/typescript/_namespaces/ts.ts @@ -4,3 +4,6 @@ export * from "../../compiler/_namespaces/ts"; export * from "../../jsTyping/_namespaces/ts"; export * from "../../services/_namespaces/ts"; export * from "../../deprecatedCompat/_namespaces/ts"; + +import * as ts from "./ts"; +ts.setTypeScriptNamespace("typescript", ts); From e4320f1e99ba3bcd88cb225354d979692acb618f Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Fri, 21 Apr 2023 16:48:05 -0700 Subject: [PATCH 2/7] Add tsclibrary.d.ts --- .github/fabricbot.json | 3 +- .github/workflows/new-release-branch.yaml | 2 + .github/workflows/set-version.yaml | 2 + Herebyfile.mjs | 16 +- scripts/produceLKG.mjs | 1 + src/executeCommandLine/executeCommandLine.ts | 3 +- src/testRunner/unittests/publicApi.ts | 4 + tests/baselines/reference/APILibCheck.js | 14 + tests/baselines/reference/APILibCheck.symbols | 6 + tests/baselines/reference/APILibCheck.types | 6 + tests/baselines/reference/api/tsclibrary.d.ts | 5801 +++++++++++++++++ tests/cases/compiler/APILibCheck.ts | 14 + 12 files changed, 5868 insertions(+), 4 deletions(-) create mode 100644 tests/baselines/reference/api/tsclibrary.d.ts diff --git a/.github/fabricbot.json b/.github/fabricbot.json index 70c26603f3446..a0a35ec1ab43c 100644 --- a/.github/fabricbot.json +++ b/.github/fabricbot.json @@ -642,7 +642,8 @@ "parameters": { "pathFilters": [ "tests/baselines/reference/api/typescript.d.ts", - "tests/baselines/reference/api/tsserverlibrary.d.ts" + "tests/baselines/reference/api/tsserverlibrary.d.ts", + "tests/baselines/reference/api/tsclibrary.d.ts" ] } } diff --git a/.github/workflows/new-release-branch.yaml b/.github/workflows/new-release-branch.yaml index dcd720a42da4f..8ac3a32ff7c4d 100644 --- a/.github/workflows/new-release-branch.yaml +++ b/.github/workflows/new-release-branch.yaml @@ -28,6 +28,7 @@ jobs: sed -i -e 's/const versionMajorMinor = ".*"/const versionMajorMinor = "${{ github.event.client_payload.core_major_minor }}"/g' src/compiler/corePublic.ts sed -i -e 's/const versionMajorMinor = ".*"/const versionMajorMinor = "${{ github.event.client_payload.core_major_minor }}"/g' tests/baselines/reference/api/typescript.d.ts sed -i -e 's/const versionMajorMinor = ".*"/const versionMajorMinor = "${{ github.event.client_payload.core_major_minor }}"/g' tests/baselines/reference/api/tsserverlibrary.d.ts + sed -i -e 's/const versionMajorMinor = ".*"/const versionMajorMinor = "${{ github.event.client_payload.core_major_minor }}"/g' tests/baselines/reference/api/tsclibrary.d.ts sed -i -e 's/const version\(: string\)\{0,1\} = `${versionMajorMinor}.0-.*`/const version = `${versionMajorMinor}.0-${{ github.event.client_payload.core_tag || 'dev' }}`/g' src/compiler/corePublic.ts npm ci npx hereby LKG @@ -37,6 +38,7 @@ jobs: git add src/compiler/corePublic.ts git add tests/baselines/reference/api/typescript.d.ts git add tests/baselines/reference/api/tsserverlibrary.d.ts + git add tests/baselines/reference/api/tsclibrary.d.ts git add --force ./lib git config user.email "typescriptbot@microsoft.com" git config user.name "TypeScript Bot" diff --git a/.github/workflows/set-version.yaml b/.github/workflows/set-version.yaml index 0fc9d58d16706..81f0f577effa2 100644 --- a/.github/workflows/set-version.yaml +++ b/.github/workflows/set-version.yaml @@ -34,6 +34,7 @@ jobs: sed -i -e 's/const versionMajorMinor = ".*"/const versionMajorMinor = "${{ github.event.client_payload.core_major_minor }}"/g' src/compiler/corePublic.ts sed -i -e 's/const versionMajorMinor = ".*"/const versionMajorMinor = "${{ github.event.client_payload.core_major_minor }}"/g' tests/baselines/reference/api/typescript.d.ts sed -i -e 's/const versionMajorMinor = ".*"/const versionMajorMinor = "${{ github.event.client_payload.core_major_minor }}"/g' tests/baselines/reference/api/tsserverlibrary.d.ts + sed -i -e 's/const versionMajorMinor = ".*"/const versionMajorMinor = "${{ github.event.client_payload.core_major_minor }}"/g' tests/baselines/reference/api/tsclibrary.d.ts sed -i -e 's/const version\(: string\)\{0,1\} = .*;/const version = "${{ github.event.client_payload.package_version }}" as string;/g' src/compiler/corePublic.ts npm ci npx hereby LKG @@ -43,6 +44,7 @@ jobs: git add src/compiler/corePublic.ts git add tests/baselines/reference/api/typescript.d.ts git add tests/baselines/reference/api/tsserverlibrary.d.ts + git add tests/baselines/reference/api/tsclibrary.d.ts git add --force ./lib git config user.email "typescriptbot@microsoft.com" git config user.name "TypeScript Bot" diff --git a/Herebyfile.mjs b/Herebyfile.mjs index 883ba191f18d2..08a0f6ff11bf1 100644 --- a/Herebyfile.mjs +++ b/Herebyfile.mjs @@ -338,7 +338,7 @@ function entrypointBuildTask(options) { } -const { main: tsc, watch: watchTsc } = entrypointBuildTask({ +const { main: tsc, build: buildTsc, watch: watchTsc } = entrypointBuildTask({ name: "tsc", description: "Builds the command-line compiler", buildDeps: [generateDiagnostics], @@ -428,9 +428,20 @@ export const dtsLssl = task({ } }); +export const dtsTsc = task({ + name: "dts-tsc", + description: "Bundles tsclibrary.d.ts", + dependencies: [buildTsc], + run: async () => { + if (needsUpdate("./built/local/tsc/tsconfig.tsbuildinfo", ["./built/local/tsclibrary.d.ts", "./built/local/tsclibrary.internal.d.ts"])) { + await runDtsBundler("./built/local/tsc/_namespaces/ts.d.ts", "./built/local/tsclibrary.d.ts"); + } + } +}); + export const dts = task({ name: "dts", - dependencies: [dtsServices, dtsLssl], + dependencies: [dtsServices, dtsLssl, dtsTsc], }); @@ -820,6 +831,7 @@ export const produceLKG = task({ "built/local/tsserver.js", "built/local/tsserverlibrary.js", "built/local/tsserverlibrary.d.ts", + "built/local/tsclibrary.d.ts", "built/local/typescript.js", "built/local/typescript.d.ts", "built/local/typingsInstaller.js", diff --git a/scripts/produceLKG.mjs b/scripts/produceLKG.mjs index 8db2e831d7828..7aeecc9bf13fd 100644 --- a/scripts/produceLKG.mjs +++ b/scripts/produceLKG.mjs @@ -54,6 +54,7 @@ async function copyScriptOutputs() { async function copyDeclarationOutputs() { await copyFromBuiltLocal("tsserverlibrary.d.ts"); await copyFromBuiltLocal("typescript.d.ts"); + await copyFromBuiltLocal("tsclibrary.d.ts"); } async function writeGitAttributes() { diff --git a/src/executeCommandLine/executeCommandLine.ts b/src/executeCommandLine/executeCommandLine.ts index b6f1d1ddedd7c..ba8a406a1988e 100644 --- a/src/executeCommandLine/executeCommandLine.ts +++ b/src/executeCommandLine/executeCommandLine.ts @@ -87,6 +87,7 @@ import { validateLocaleAndSetLanguage, version, WatchCompilerHost, + WatchOfConfigFile, WatchOptions, } from "./_namespaces/ts"; @@ -744,7 +745,7 @@ export function executeCommandLine( system: System, cb: ExecuteCommandLineCallbacks, commandLineArgs: readonly string[], -) { +): void | WatchOfConfigFile | SolutionBuilder { if (isBuild(commandLineArgs)) { const { buildOptions, watchOptions, projects, errors } = parseBuildCommand(commandLineArgs.slice(1)); if (buildOptions.generateCpuProfile && system.enableCPUProfiler) { diff --git a/src/testRunner/unittests/publicApi.ts b/src/testRunner/unittests/publicApi.ts index a794e71c05352..8fab0fac42c54 100644 --- a/src/testRunner/unittests/publicApi.ts +++ b/src/testRunner/unittests/publicApi.ts @@ -43,6 +43,10 @@ describe("unittests:: Public APIs", () => { describe("for the language server", () => { verifyApi("tsserverlibrary.d.ts"); }); + + describe("for the tsc", () => { + verifyApi("tsclibrary.d.ts"); + }); }); describe("unittests:: Public APIs:: token to string", () => { diff --git a/tests/baselines/reference/APILibCheck.js b/tests/baselines/reference/APILibCheck.js index 76bacfbf7a675..3193cca0be184 100644 --- a/tests/baselines/reference/APILibCheck.js +++ b/tests/baselines/reference/APILibCheck.js @@ -24,11 +24,25 @@ "types": "/.ts/tsserverlibrary.internal.d.ts" } +//// [package.json] +{ + "name": "tsclibrary", + "types": "/.ts/tsclibrary.d.ts" +} + +//// [package.json] +{ + "name": "tsclibrary-internal", + "types": "/.ts/tsclibrary.internal.d.ts" +} + //// [index.ts] import ts = require("typescript"); import tsInternal = require("typescript-internal"); import tsserverlibrary = require("tsserverlibrary"); import tsserverlibraryInternal = require("tsserverlibrary-internal"); +import tsclibrary = require("tsclibrary"); +import tsclibraryInternal = require("tsclibrary-internal"); //// [index.js] diff --git a/tests/baselines/reference/APILibCheck.symbols b/tests/baselines/reference/APILibCheck.symbols index 73bfb529ba365..b38ac2dbf1440 100644 --- a/tests/baselines/reference/APILibCheck.symbols +++ b/tests/baselines/reference/APILibCheck.symbols @@ -11,3 +11,9 @@ import tsserverlibrary = require("tsserverlibrary"); import tsserverlibraryInternal = require("tsserverlibrary-internal"); >tsserverlibraryInternal : Symbol(tsserverlibraryInternal, Decl(index.ts, 2, 52)) +import tsclibrary = require("tsclibrary"); +>tsclibrary : Symbol(tsclibrary, Decl(index.ts, 3, 69)) + +import tsclibraryInternal = require("tsclibrary-internal"); +>tsclibraryInternal : Symbol(tsclibraryInternal, Decl(index.ts, 4, 42)) + diff --git a/tests/baselines/reference/APILibCheck.types b/tests/baselines/reference/APILibCheck.types index 5b06711a8022c..13565b884c2de 100644 --- a/tests/baselines/reference/APILibCheck.types +++ b/tests/baselines/reference/APILibCheck.types @@ -11,3 +11,9 @@ import tsserverlibrary = require("tsserverlibrary"); import tsserverlibraryInternal = require("tsserverlibrary-internal"); >tsserverlibraryInternal : typeof tsserverlibraryInternal +import tsclibrary = require("tsclibrary"); +>tsclibrary : typeof tsclibrary + +import tsclibraryInternal = require("tsclibrary-internal"); +>tsclibraryInternal : typeof tsclibraryInternal + diff --git a/tests/baselines/reference/api/tsclibrary.d.ts b/tests/baselines/reference/api/tsclibrary.d.ts new file mode 100644 index 0000000000000..a35ceaf32191b --- /dev/null +++ b/tests/baselines/reference/api/tsclibrary.d.ts @@ -0,0 +1,5801 @@ +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. All rights reserved. +Licensed under the Apache License, Version 2.0 (the "License"); you may not use +this file except in compliance with the License. You may obtain a copy of the +License at http://www.apache.org/licenses/LICENSE-2.0 + +THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED +WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, +MERCHANTABLITY OR NON-INFRINGEMENT. + +See the Apache Version 2.0 License for specific language governing permissions +and limitations under the License. +***************************************************************************** */ + +declare namespace ts { + const versionMajorMinor = "5.2"; + /** The version of the TypeScript compiler release */ + const version: string; + /** + * Type of objects whose values are all of the same type. + * The `in` and `for-in` operators can *not* be safely used, + * since `Object.prototype` may be modified by outside code. + */ + interface MapLike { + [index: string]: T; + } + interface SortedReadonlyArray extends ReadonlyArray { + " __sortedArrayBrand": any; + } + interface SortedArray extends Array { + " __sortedArrayBrand": any; + } + type Path = string & { + __pathBrand: any; + }; + interface TextRange { + pos: number; + end: number; + } + interface ReadonlyTextRange { + readonly pos: number; + readonly end: number; + } + enum SyntaxKind { + Unknown = 0, + EndOfFileToken = 1, + SingleLineCommentTrivia = 2, + MultiLineCommentTrivia = 3, + NewLineTrivia = 4, + WhitespaceTrivia = 5, + ShebangTrivia = 6, + ConflictMarkerTrivia = 7, + NonTextFileMarkerTrivia = 8, + NumericLiteral = 9, + BigIntLiteral = 10, + StringLiteral = 11, + JsxText = 12, + JsxTextAllWhiteSpaces = 13, + RegularExpressionLiteral = 14, + NoSubstitutionTemplateLiteral = 15, + TemplateHead = 16, + TemplateMiddle = 17, + TemplateTail = 18, + OpenBraceToken = 19, + CloseBraceToken = 20, + OpenParenToken = 21, + CloseParenToken = 22, + OpenBracketToken = 23, + CloseBracketToken = 24, + DotToken = 25, + DotDotDotToken = 26, + SemicolonToken = 27, + CommaToken = 28, + QuestionDotToken = 29, + LessThanToken = 30, + LessThanSlashToken = 31, + GreaterThanToken = 32, + LessThanEqualsToken = 33, + GreaterThanEqualsToken = 34, + EqualsEqualsToken = 35, + ExclamationEqualsToken = 36, + EqualsEqualsEqualsToken = 37, + ExclamationEqualsEqualsToken = 38, + EqualsGreaterThanToken = 39, + PlusToken = 40, + MinusToken = 41, + AsteriskToken = 42, + AsteriskAsteriskToken = 43, + SlashToken = 44, + PercentToken = 45, + PlusPlusToken = 46, + MinusMinusToken = 47, + LessThanLessThanToken = 48, + GreaterThanGreaterThanToken = 49, + GreaterThanGreaterThanGreaterThanToken = 50, + AmpersandToken = 51, + BarToken = 52, + CaretToken = 53, + ExclamationToken = 54, + TildeToken = 55, + AmpersandAmpersandToken = 56, + BarBarToken = 57, + QuestionToken = 58, + ColonToken = 59, + AtToken = 60, + QuestionQuestionToken = 61, + /** Only the JSDoc scanner produces BacktickToken. The normal scanner produces NoSubstitutionTemplateLiteral and related kinds. */ + BacktickToken = 62, + /** Only the JSDoc scanner produces HashToken. The normal scanner produces PrivateIdentifier. */ + HashToken = 63, + EqualsToken = 64, + PlusEqualsToken = 65, + MinusEqualsToken = 66, + AsteriskEqualsToken = 67, + AsteriskAsteriskEqualsToken = 68, + SlashEqualsToken = 69, + PercentEqualsToken = 70, + LessThanLessThanEqualsToken = 71, + GreaterThanGreaterThanEqualsToken = 72, + GreaterThanGreaterThanGreaterThanEqualsToken = 73, + AmpersandEqualsToken = 74, + BarEqualsToken = 75, + BarBarEqualsToken = 76, + AmpersandAmpersandEqualsToken = 77, + QuestionQuestionEqualsToken = 78, + CaretEqualsToken = 79, + Identifier = 80, + PrivateIdentifier = 81, + BreakKeyword = 83, + CaseKeyword = 84, + CatchKeyword = 85, + ClassKeyword = 86, + ConstKeyword = 87, + ContinueKeyword = 88, + DebuggerKeyword = 89, + DefaultKeyword = 90, + DeleteKeyword = 91, + DoKeyword = 92, + ElseKeyword = 93, + EnumKeyword = 94, + ExportKeyword = 95, + ExtendsKeyword = 96, + FalseKeyword = 97, + FinallyKeyword = 98, + ForKeyword = 99, + FunctionKeyword = 100, + IfKeyword = 101, + ImportKeyword = 102, + InKeyword = 103, + InstanceOfKeyword = 104, + NewKeyword = 105, + NullKeyword = 106, + ReturnKeyword = 107, + SuperKeyword = 108, + SwitchKeyword = 109, + ThisKeyword = 110, + ThrowKeyword = 111, + TrueKeyword = 112, + TryKeyword = 113, + TypeOfKeyword = 114, + VarKeyword = 115, + VoidKeyword = 116, + WhileKeyword = 117, + WithKeyword = 118, + ImplementsKeyword = 119, + InterfaceKeyword = 120, + LetKeyword = 121, + PackageKeyword = 122, + PrivateKeyword = 123, + ProtectedKeyword = 124, + PublicKeyword = 125, + StaticKeyword = 126, + YieldKeyword = 127, + AbstractKeyword = 128, + AccessorKeyword = 129, + AsKeyword = 130, + AssertsKeyword = 131, + AssertKeyword = 132, + AnyKeyword = 133, + AsyncKeyword = 134, + AwaitKeyword = 135, + BooleanKeyword = 136, + ConstructorKeyword = 137, + DeclareKeyword = 138, + GetKeyword = 139, + InferKeyword = 140, + IntrinsicKeyword = 141, + IsKeyword = 142, + KeyOfKeyword = 143, + ModuleKeyword = 144, + NamespaceKeyword = 145, + NeverKeyword = 146, + OutKeyword = 147, + ReadonlyKeyword = 148, + RequireKeyword = 149, + NumberKeyword = 150, + ObjectKeyword = 151, + SatisfiesKeyword = 152, + SetKeyword = 153, + StringKeyword = 154, + SymbolKeyword = 155, + TypeKeyword = 156, + UndefinedKeyword = 157, + UniqueKeyword = 158, + UnknownKeyword = 159, + FromKeyword = 160, + GlobalKeyword = 161, + BigIntKeyword = 162, + OverrideKeyword = 163, + OfKeyword = 164, + QualifiedName = 165, + ComputedPropertyName = 166, + TypeParameter = 167, + Parameter = 168, + Decorator = 169, + PropertySignature = 170, + PropertyDeclaration = 171, + MethodSignature = 172, + MethodDeclaration = 173, + ClassStaticBlockDeclaration = 174, + Constructor = 175, + GetAccessor = 176, + SetAccessor = 177, + CallSignature = 178, + ConstructSignature = 179, + IndexSignature = 180, + TypePredicate = 181, + TypeReference = 182, + FunctionType = 183, + ConstructorType = 184, + TypeQuery = 185, + TypeLiteral = 186, + ArrayType = 187, + TupleType = 188, + OptionalType = 189, + RestType = 190, + UnionType = 191, + IntersectionType = 192, + ConditionalType = 193, + InferType = 194, + ParenthesizedType = 195, + ThisType = 196, + TypeOperator = 197, + IndexedAccessType = 198, + MappedType = 199, + LiteralType = 200, + NamedTupleMember = 201, + TemplateLiteralType = 202, + TemplateLiteralTypeSpan = 203, + ImportType = 204, + ObjectBindingPattern = 205, + ArrayBindingPattern = 206, + BindingElement = 207, + ArrayLiteralExpression = 208, + ObjectLiteralExpression = 209, + PropertyAccessExpression = 210, + ElementAccessExpression = 211, + CallExpression = 212, + NewExpression = 213, + TaggedTemplateExpression = 214, + TypeAssertionExpression = 215, + ParenthesizedExpression = 216, + FunctionExpression = 217, + ArrowFunction = 218, + DeleteExpression = 219, + TypeOfExpression = 220, + VoidExpression = 221, + AwaitExpression = 222, + PrefixUnaryExpression = 223, + PostfixUnaryExpression = 224, + BinaryExpression = 225, + ConditionalExpression = 226, + TemplateExpression = 227, + YieldExpression = 228, + SpreadElement = 229, + ClassExpression = 230, + OmittedExpression = 231, + ExpressionWithTypeArguments = 232, + AsExpression = 233, + NonNullExpression = 234, + MetaProperty = 235, + SyntheticExpression = 236, + SatisfiesExpression = 237, + TemplateSpan = 238, + SemicolonClassElement = 239, + Block = 240, + EmptyStatement = 241, + VariableStatement = 242, + ExpressionStatement = 243, + IfStatement = 244, + DoStatement = 245, + WhileStatement = 246, + ForStatement = 247, + ForInStatement = 248, + ForOfStatement = 249, + ContinueStatement = 250, + BreakStatement = 251, + ReturnStatement = 252, + WithStatement = 253, + SwitchStatement = 254, + LabeledStatement = 255, + ThrowStatement = 256, + TryStatement = 257, + DebuggerStatement = 258, + VariableDeclaration = 259, + VariableDeclarationList = 260, + FunctionDeclaration = 261, + ClassDeclaration = 262, + InterfaceDeclaration = 263, + TypeAliasDeclaration = 264, + EnumDeclaration = 265, + ModuleDeclaration = 266, + ModuleBlock = 267, + CaseBlock = 268, + NamespaceExportDeclaration = 269, + ImportEqualsDeclaration = 270, + ImportDeclaration = 271, + ImportClause = 272, + NamespaceImport = 273, + NamedImports = 274, + ImportSpecifier = 275, + ExportAssignment = 276, + ExportDeclaration = 277, + NamedExports = 278, + NamespaceExport = 279, + ExportSpecifier = 280, + MissingDeclaration = 281, + ExternalModuleReference = 282, + JsxElement = 283, + JsxSelfClosingElement = 284, + JsxOpeningElement = 285, + JsxClosingElement = 286, + JsxFragment = 287, + JsxOpeningFragment = 288, + JsxClosingFragment = 289, + JsxAttribute = 290, + JsxAttributes = 291, + JsxSpreadAttribute = 292, + JsxExpression = 293, + JsxNamespacedName = 294, + CaseClause = 295, + DefaultClause = 296, + HeritageClause = 297, + CatchClause = 298, + AssertClause = 299, + AssertEntry = 300, + ImportTypeAssertionContainer = 301, + PropertyAssignment = 302, + ShorthandPropertyAssignment = 303, + SpreadAssignment = 304, + EnumMember = 305, + /** @deprecated */ UnparsedPrologue = 306, + /** @deprecated */ UnparsedPrepend = 307, + /** @deprecated */ UnparsedText = 308, + /** @deprecated */ UnparsedInternalText = 309, + /** @deprecated */ UnparsedSyntheticReference = 310, + SourceFile = 311, + Bundle = 312, + /** @deprecated */ UnparsedSource = 313, + /** @deprecated */ InputFiles = 314, + JSDocTypeExpression = 315, + JSDocNameReference = 316, + JSDocMemberName = 317, + JSDocAllType = 318, + JSDocUnknownType = 319, + JSDocNullableType = 320, + JSDocNonNullableType = 321, + JSDocOptionalType = 322, + JSDocFunctionType = 323, + JSDocVariadicType = 324, + JSDocNamepathType = 325, + JSDoc = 326, + /** @deprecated Use SyntaxKind.JSDoc */ + JSDocComment = 326, + JSDocText = 327, + JSDocTypeLiteral = 328, + JSDocSignature = 329, + JSDocLink = 330, + JSDocLinkCode = 331, + JSDocLinkPlain = 332, + JSDocTag = 333, + JSDocAugmentsTag = 334, + JSDocImplementsTag = 335, + JSDocAuthorTag = 336, + JSDocDeprecatedTag = 337, + JSDocClassTag = 338, + JSDocPublicTag = 339, + JSDocPrivateTag = 340, + JSDocProtectedTag = 341, + JSDocReadonlyTag = 342, + JSDocOverrideTag = 343, + JSDocCallbackTag = 344, + JSDocOverloadTag = 345, + JSDocEnumTag = 346, + JSDocParameterTag = 347, + JSDocReturnTag = 348, + JSDocThisTag = 349, + JSDocTypeTag = 350, + JSDocTemplateTag = 351, + JSDocTypedefTag = 352, + JSDocSeeTag = 353, + JSDocPropertyTag = 354, + JSDocThrowsTag = 355, + JSDocSatisfiesTag = 356, + SyntaxList = 357, + NotEmittedStatement = 358, + PartiallyEmittedExpression = 359, + CommaListExpression = 360, + SyntheticReferenceExpression = 361, + Count = 362, + FirstAssignment = 64, + LastAssignment = 79, + FirstCompoundAssignment = 65, + LastCompoundAssignment = 79, + FirstReservedWord = 83, + LastReservedWord = 118, + FirstKeyword = 83, + LastKeyword = 164, + FirstFutureReservedWord = 119, + LastFutureReservedWord = 127, + FirstTypeNode = 181, + LastTypeNode = 204, + FirstPunctuation = 19, + LastPunctuation = 79, + FirstToken = 0, + LastToken = 164, + FirstTriviaToken = 2, + LastTriviaToken = 7, + FirstLiteralToken = 9, + LastLiteralToken = 15, + FirstTemplateToken = 15, + LastTemplateToken = 18, + FirstBinaryOperator = 30, + LastBinaryOperator = 79, + FirstStatement = 242, + LastStatement = 258, + FirstNode = 165, + FirstJSDocNode = 315, + LastJSDocNode = 356, + FirstJSDocTagNode = 333, + LastJSDocTagNode = 356 + } + type TriviaSyntaxKind = SyntaxKind.SingleLineCommentTrivia | SyntaxKind.MultiLineCommentTrivia | SyntaxKind.NewLineTrivia | SyntaxKind.WhitespaceTrivia | SyntaxKind.ShebangTrivia | SyntaxKind.ConflictMarkerTrivia; + type LiteralSyntaxKind = SyntaxKind.NumericLiteral | SyntaxKind.BigIntLiteral | SyntaxKind.StringLiteral | SyntaxKind.JsxText | SyntaxKind.JsxTextAllWhiteSpaces | SyntaxKind.RegularExpressionLiteral | SyntaxKind.NoSubstitutionTemplateLiteral; + type PseudoLiteralSyntaxKind = SyntaxKind.TemplateHead | SyntaxKind.TemplateMiddle | SyntaxKind.TemplateTail; + type PunctuationSyntaxKind = SyntaxKind.OpenBraceToken | SyntaxKind.CloseBraceToken | SyntaxKind.OpenParenToken | SyntaxKind.CloseParenToken | SyntaxKind.OpenBracketToken | SyntaxKind.CloseBracketToken | SyntaxKind.DotToken | SyntaxKind.DotDotDotToken | SyntaxKind.SemicolonToken | SyntaxKind.CommaToken | SyntaxKind.QuestionDotToken | SyntaxKind.LessThanToken | SyntaxKind.LessThanSlashToken | SyntaxKind.GreaterThanToken | SyntaxKind.LessThanEqualsToken | SyntaxKind.GreaterThanEqualsToken | SyntaxKind.EqualsEqualsToken | SyntaxKind.ExclamationEqualsToken | SyntaxKind.EqualsEqualsEqualsToken | SyntaxKind.ExclamationEqualsEqualsToken | SyntaxKind.EqualsGreaterThanToken | SyntaxKind.PlusToken | SyntaxKind.MinusToken | SyntaxKind.AsteriskToken | SyntaxKind.AsteriskAsteriskToken | SyntaxKind.SlashToken | SyntaxKind.PercentToken | SyntaxKind.PlusPlusToken | SyntaxKind.MinusMinusToken | SyntaxKind.LessThanLessThanToken | SyntaxKind.GreaterThanGreaterThanToken | SyntaxKind.GreaterThanGreaterThanGreaterThanToken | SyntaxKind.AmpersandToken | SyntaxKind.BarToken | SyntaxKind.CaretToken | SyntaxKind.ExclamationToken | SyntaxKind.TildeToken | SyntaxKind.AmpersandAmpersandToken | SyntaxKind.AmpersandAmpersandEqualsToken | SyntaxKind.BarBarToken | SyntaxKind.BarBarEqualsToken | SyntaxKind.QuestionQuestionToken | SyntaxKind.QuestionQuestionEqualsToken | SyntaxKind.QuestionToken | SyntaxKind.ColonToken | SyntaxKind.AtToken | SyntaxKind.BacktickToken | SyntaxKind.HashToken | SyntaxKind.EqualsToken | SyntaxKind.PlusEqualsToken | SyntaxKind.MinusEqualsToken | SyntaxKind.AsteriskEqualsToken | SyntaxKind.AsteriskAsteriskEqualsToken | SyntaxKind.SlashEqualsToken | SyntaxKind.PercentEqualsToken | SyntaxKind.LessThanLessThanEqualsToken | SyntaxKind.GreaterThanGreaterThanEqualsToken | SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken | SyntaxKind.AmpersandEqualsToken | SyntaxKind.BarEqualsToken | SyntaxKind.CaretEqualsToken; + type KeywordSyntaxKind = SyntaxKind.AbstractKeyword | SyntaxKind.AccessorKeyword | SyntaxKind.AnyKeyword | SyntaxKind.AsKeyword | SyntaxKind.AssertsKeyword | SyntaxKind.AssertKeyword | SyntaxKind.AsyncKeyword | SyntaxKind.AwaitKeyword | SyntaxKind.BigIntKeyword | SyntaxKind.BooleanKeyword | SyntaxKind.BreakKeyword | SyntaxKind.CaseKeyword | SyntaxKind.CatchKeyword | SyntaxKind.ClassKeyword | SyntaxKind.ConstKeyword | SyntaxKind.ConstructorKeyword | SyntaxKind.ContinueKeyword | SyntaxKind.DebuggerKeyword | SyntaxKind.DeclareKeyword | SyntaxKind.DefaultKeyword | SyntaxKind.DeleteKeyword | SyntaxKind.DoKeyword | SyntaxKind.ElseKeyword | SyntaxKind.EnumKeyword | SyntaxKind.ExportKeyword | SyntaxKind.ExtendsKeyword | SyntaxKind.FalseKeyword | SyntaxKind.FinallyKeyword | SyntaxKind.ForKeyword | SyntaxKind.FromKeyword | SyntaxKind.FunctionKeyword | SyntaxKind.GetKeyword | SyntaxKind.GlobalKeyword | SyntaxKind.IfKeyword | SyntaxKind.ImplementsKeyword | SyntaxKind.ImportKeyword | SyntaxKind.InferKeyword | SyntaxKind.InKeyword | SyntaxKind.InstanceOfKeyword | SyntaxKind.InterfaceKeyword | SyntaxKind.IntrinsicKeyword | SyntaxKind.IsKeyword | SyntaxKind.KeyOfKeyword | SyntaxKind.LetKeyword | SyntaxKind.ModuleKeyword | SyntaxKind.NamespaceKeyword | SyntaxKind.NeverKeyword | SyntaxKind.NewKeyword | SyntaxKind.NullKeyword | SyntaxKind.NumberKeyword | SyntaxKind.ObjectKeyword | SyntaxKind.OfKeyword | SyntaxKind.PackageKeyword | SyntaxKind.PrivateKeyword | SyntaxKind.ProtectedKeyword | SyntaxKind.PublicKeyword | SyntaxKind.ReadonlyKeyword | SyntaxKind.OutKeyword | SyntaxKind.OverrideKeyword | SyntaxKind.RequireKeyword | SyntaxKind.ReturnKeyword | SyntaxKind.SatisfiesKeyword | SyntaxKind.SetKeyword | SyntaxKind.StaticKeyword | SyntaxKind.StringKeyword | SyntaxKind.SuperKeyword | SyntaxKind.SwitchKeyword | SyntaxKind.SymbolKeyword | SyntaxKind.ThisKeyword | SyntaxKind.ThrowKeyword | SyntaxKind.TrueKeyword | SyntaxKind.TryKeyword | SyntaxKind.TypeKeyword | SyntaxKind.TypeOfKeyword | SyntaxKind.UndefinedKeyword | SyntaxKind.UniqueKeyword | SyntaxKind.UnknownKeyword | SyntaxKind.VarKeyword | SyntaxKind.VoidKeyword | SyntaxKind.WhileKeyword | SyntaxKind.WithKeyword | SyntaxKind.YieldKeyword; + type ModifierSyntaxKind = SyntaxKind.AbstractKeyword | SyntaxKind.AccessorKeyword | SyntaxKind.AsyncKeyword | SyntaxKind.ConstKeyword | SyntaxKind.DeclareKeyword | SyntaxKind.DefaultKeyword | SyntaxKind.ExportKeyword | SyntaxKind.InKeyword | SyntaxKind.PrivateKeyword | SyntaxKind.ProtectedKeyword | SyntaxKind.PublicKeyword | SyntaxKind.ReadonlyKeyword | SyntaxKind.OutKeyword | SyntaxKind.OverrideKeyword | SyntaxKind.StaticKeyword; + type KeywordTypeSyntaxKind = SyntaxKind.AnyKeyword | SyntaxKind.BigIntKeyword | SyntaxKind.BooleanKeyword | SyntaxKind.IntrinsicKeyword | SyntaxKind.NeverKeyword | SyntaxKind.NumberKeyword | SyntaxKind.ObjectKeyword | SyntaxKind.StringKeyword | SyntaxKind.SymbolKeyword | SyntaxKind.UndefinedKeyword | SyntaxKind.UnknownKeyword | SyntaxKind.VoidKeyword; + type TokenSyntaxKind = SyntaxKind.Unknown | SyntaxKind.EndOfFileToken | TriviaSyntaxKind | LiteralSyntaxKind | PseudoLiteralSyntaxKind | PunctuationSyntaxKind | SyntaxKind.Identifier | KeywordSyntaxKind; + type JsxTokenSyntaxKind = SyntaxKind.LessThanSlashToken | SyntaxKind.EndOfFileToken | SyntaxKind.ConflictMarkerTrivia | SyntaxKind.JsxText | SyntaxKind.JsxTextAllWhiteSpaces | SyntaxKind.OpenBraceToken | SyntaxKind.LessThanToken; + type JSDocSyntaxKind = SyntaxKind.EndOfFileToken | SyntaxKind.WhitespaceTrivia | SyntaxKind.AtToken | SyntaxKind.NewLineTrivia | SyntaxKind.AsteriskToken | SyntaxKind.OpenBraceToken | SyntaxKind.CloseBraceToken | SyntaxKind.LessThanToken | SyntaxKind.GreaterThanToken | SyntaxKind.OpenBracketToken | SyntaxKind.CloseBracketToken | SyntaxKind.EqualsToken | SyntaxKind.CommaToken | SyntaxKind.DotToken | SyntaxKind.Identifier | SyntaxKind.BacktickToken | SyntaxKind.HashToken | SyntaxKind.Unknown | KeywordSyntaxKind; + enum NodeFlags { + None = 0, + Let = 1, + Const = 2, + NestedNamespace = 4, + Synthesized = 8, + Namespace = 16, + OptionalChain = 32, + ExportContext = 64, + ContainsThis = 128, + HasImplicitReturn = 256, + HasExplicitReturn = 512, + GlobalAugmentation = 1024, + HasAsyncFunctions = 2048, + DisallowInContext = 4096, + YieldContext = 8192, + DecoratorContext = 16384, + AwaitContext = 32768, + DisallowConditionalTypesContext = 65536, + ThisNodeHasError = 131072, + JavaScriptFile = 262144, + ThisNodeOrAnySubNodesHasError = 524288, + HasAggregatedChildData = 1048576, + JSDoc = 8388608, + JsonFile = 67108864, + BlockScoped = 3, + ReachabilityCheckFlags = 768, + ReachabilityAndEmitFlags = 2816, + ContextFlags = 50720768, + TypeExcludesFlags = 40960 + } + enum ModifierFlags { + None = 0, + Export = 1, + Ambient = 2, + Public = 4, + Private = 8, + Protected = 16, + Static = 32, + Readonly = 64, + Accessor = 128, + Abstract = 256, + Async = 512, + Default = 1024, + Const = 2048, + HasComputedJSDocModifiers = 4096, + Deprecated = 8192, + Override = 16384, + In = 32768, + Out = 65536, + Decorator = 131072, + HasComputedFlags = 536870912, + AccessibilityModifier = 28, + ParameterPropertyModifier = 16476, + NonPublicAccessibilityModifier = 24, + TypeScriptModifier = 117086, + ExportDefault = 1025, + All = 258047, + Modifier = 126975 + } + enum JsxFlags { + None = 0, + /** An element from a named property of the JSX.IntrinsicElements interface */ + IntrinsicNamedElement = 1, + /** An element inferred from the string index signature of the JSX.IntrinsicElements interface */ + IntrinsicIndexedElement = 2, + IntrinsicElement = 3 + } + interface Node extends ReadonlyTextRange { + readonly kind: SyntaxKind; + readonly flags: NodeFlags; + readonly parent: Node; + } + interface JSDocContainer extends Node { + _jsdocContainerBrand: any; + } + interface LocalsContainer extends Node { + _localsContainerBrand: any; + } + interface FlowContainer extends Node { + _flowContainerBrand: any; + } + type HasJSDoc = AccessorDeclaration | ArrowFunction | BinaryExpression | Block | BreakStatement | CallSignatureDeclaration | CaseClause | ClassLikeDeclaration | ClassStaticBlockDeclaration | ConstructorDeclaration | ConstructorTypeNode | ConstructSignatureDeclaration | ContinueStatement | DebuggerStatement | DoStatement | ElementAccessExpression | EmptyStatement | EndOfFileToken | EnumDeclaration | EnumMember | ExportAssignment | ExportDeclaration | ExportSpecifier | ExpressionStatement | ForInStatement | ForOfStatement | ForStatement | FunctionDeclaration | FunctionExpression | FunctionTypeNode | Identifier | IfStatement | ImportDeclaration | ImportEqualsDeclaration | IndexSignatureDeclaration | InterfaceDeclaration | JSDocFunctionType | JSDocSignature | LabeledStatement | MethodDeclaration | MethodSignature | ModuleDeclaration | NamedTupleMember | NamespaceExportDeclaration | ObjectLiteralExpression | ParameterDeclaration | ParenthesizedExpression | PropertyAccessExpression | PropertyAssignment | PropertyDeclaration | PropertySignature | ReturnStatement | SemicolonClassElement | ShorthandPropertyAssignment | SpreadAssignment | SwitchStatement | ThrowStatement | TryStatement | TypeAliasDeclaration | TypeParameterDeclaration | VariableDeclaration | VariableStatement | WhileStatement | WithStatement; + type HasType = SignatureDeclaration | VariableDeclaration | ParameterDeclaration | PropertySignature | PropertyDeclaration | TypePredicateNode | ParenthesizedTypeNode | TypeOperatorNode | MappedTypeNode | AssertionExpression | TypeAliasDeclaration | JSDocTypeExpression | JSDocNonNullableType | JSDocNullableType | JSDocOptionalType | JSDocVariadicType; + type HasTypeArguments = CallExpression | NewExpression | TaggedTemplateExpression | JsxOpeningElement | JsxSelfClosingElement; + type HasInitializer = HasExpressionInitializer | ForStatement | ForInStatement | ForOfStatement | JsxAttribute; + type HasExpressionInitializer = VariableDeclaration | ParameterDeclaration | BindingElement | PropertyDeclaration | PropertyAssignment | EnumMember; + type HasDecorators = ParameterDeclaration | PropertyDeclaration | MethodDeclaration | GetAccessorDeclaration | SetAccessorDeclaration | ClassExpression | ClassDeclaration; + type HasModifiers = TypeParameterDeclaration | ParameterDeclaration | ConstructorTypeNode | PropertySignature | PropertyDeclaration | MethodSignature | MethodDeclaration | ConstructorDeclaration | GetAccessorDeclaration | SetAccessorDeclaration | IndexSignatureDeclaration | FunctionExpression | ArrowFunction | ClassExpression | VariableStatement | FunctionDeclaration | ClassDeclaration | InterfaceDeclaration | TypeAliasDeclaration | EnumDeclaration | ModuleDeclaration | ImportEqualsDeclaration | ImportDeclaration | ExportAssignment | ExportDeclaration; + interface NodeArray extends ReadonlyArray, ReadonlyTextRange { + readonly hasTrailingComma: boolean; + } + interface Token extends Node { + readonly kind: TKind; + } + type EndOfFileToken = Token & JSDocContainer; + interface PunctuationToken extends Token { + } + type DotToken = PunctuationToken; + type DotDotDotToken = PunctuationToken; + type QuestionToken = PunctuationToken; + type ExclamationToken = PunctuationToken; + type ColonToken = PunctuationToken; + type EqualsToken = PunctuationToken; + type AmpersandAmpersandEqualsToken = PunctuationToken; + type BarBarEqualsToken = PunctuationToken; + type QuestionQuestionEqualsToken = PunctuationToken; + type AsteriskToken = PunctuationToken; + type EqualsGreaterThanToken = PunctuationToken; + type PlusToken = PunctuationToken; + type MinusToken = PunctuationToken; + type QuestionDotToken = PunctuationToken; + interface KeywordToken extends Token { + } + type AssertsKeyword = KeywordToken; + type AssertKeyword = KeywordToken; + type AwaitKeyword = KeywordToken; + type CaseKeyword = KeywordToken; + interface ModifierToken extends KeywordToken { + } + type AbstractKeyword = ModifierToken; + type AccessorKeyword = ModifierToken; + type AsyncKeyword = ModifierToken; + type ConstKeyword = ModifierToken; + type DeclareKeyword = ModifierToken; + type DefaultKeyword = ModifierToken; + type ExportKeyword = ModifierToken; + type InKeyword = ModifierToken; + type PrivateKeyword = ModifierToken; + type ProtectedKeyword = ModifierToken; + type PublicKeyword = ModifierToken; + type ReadonlyKeyword = ModifierToken; + type OutKeyword = ModifierToken; + type OverrideKeyword = ModifierToken; + type StaticKeyword = ModifierToken; + type Modifier = AbstractKeyword | AccessorKeyword | AsyncKeyword | ConstKeyword | DeclareKeyword | DefaultKeyword | ExportKeyword | InKeyword | PrivateKeyword | ProtectedKeyword | PublicKeyword | OutKeyword | OverrideKeyword | ReadonlyKeyword | StaticKeyword; + type ModifierLike = Modifier | Decorator; + type AccessibilityModifier = PublicKeyword | PrivateKeyword | ProtectedKeyword; + type ParameterPropertyModifier = AccessibilityModifier | ReadonlyKeyword; + type ClassMemberModifier = AccessibilityModifier | ReadonlyKeyword | StaticKeyword | AccessorKeyword; + type ModifiersArray = NodeArray; + enum GeneratedIdentifierFlags { + None = 0, + ReservedInNestedScopes = 8, + Optimistic = 16, + FileLevel = 32, + AllowNameSubstitution = 64 + } + interface Identifier extends PrimaryExpression, Declaration, JSDocContainer, FlowContainer { + readonly kind: SyntaxKind.Identifier; + /** + * Prefer to use `id.unescapedText`. (Note: This is available only in services, not internally to the TypeScript compiler.) + * Text of identifier, but if the identifier begins with two underscores, this will begin with three. + */ + readonly escapedText: __String; + } + interface TransientIdentifier extends Identifier { + resolvedSymbol: Symbol; + } + interface QualifiedName extends Node, FlowContainer { + readonly kind: SyntaxKind.QualifiedName; + readonly left: EntityName; + readonly right: Identifier; + } + type EntityName = Identifier | QualifiedName; + type PropertyName = Identifier | StringLiteral | NumericLiteral | ComputedPropertyName | PrivateIdentifier; + type MemberName = Identifier | PrivateIdentifier; + type DeclarationName = PropertyName | JsxAttributeName | StringLiteralLike | ElementAccessExpression | BindingPattern | EntityNameExpression; + interface Declaration extends Node { + _declarationBrand: any; + } + interface NamedDeclaration extends Declaration { + readonly name?: DeclarationName; + } + interface DeclarationStatement extends NamedDeclaration, Statement { + readonly name?: Identifier | StringLiteral | NumericLiteral; + } + interface ComputedPropertyName extends Node { + readonly kind: SyntaxKind.ComputedPropertyName; + readonly parent: Declaration; + readonly expression: Expression; + } + interface PrivateIdentifier extends PrimaryExpression { + readonly kind: SyntaxKind.PrivateIdentifier; + readonly escapedText: __String; + } + interface Decorator extends Node { + readonly kind: SyntaxKind.Decorator; + readonly parent: NamedDeclaration; + readonly expression: LeftHandSideExpression; + } + interface TypeParameterDeclaration extends NamedDeclaration, JSDocContainer { + readonly kind: SyntaxKind.TypeParameter; + readonly parent: DeclarationWithTypeParameterChildren | InferTypeNode; + readonly modifiers?: NodeArray; + readonly name: Identifier; + /** Note: Consider calling `getEffectiveConstraintOfTypeParameter` */ + readonly constraint?: TypeNode; + readonly default?: TypeNode; + expression?: Expression; + } + interface SignatureDeclarationBase extends NamedDeclaration, JSDocContainer { + readonly kind: SignatureDeclaration["kind"]; + readonly name?: PropertyName; + readonly typeParameters?: NodeArray | undefined; + readonly parameters: NodeArray; + readonly type?: TypeNode | undefined; + } + type SignatureDeclaration = CallSignatureDeclaration | ConstructSignatureDeclaration | MethodSignature | IndexSignatureDeclaration | FunctionTypeNode | ConstructorTypeNode | JSDocFunctionType | FunctionDeclaration | MethodDeclaration | ConstructorDeclaration | AccessorDeclaration | FunctionExpression | ArrowFunction; + interface CallSignatureDeclaration extends SignatureDeclarationBase, TypeElement, LocalsContainer { + readonly kind: SyntaxKind.CallSignature; + } + interface ConstructSignatureDeclaration extends SignatureDeclarationBase, TypeElement, LocalsContainer { + readonly kind: SyntaxKind.ConstructSignature; + } + type BindingName = Identifier | BindingPattern; + interface VariableDeclaration extends NamedDeclaration, JSDocContainer { + readonly kind: SyntaxKind.VariableDeclaration; + readonly parent: VariableDeclarationList | CatchClause; + readonly name: BindingName; + readonly exclamationToken?: ExclamationToken; + readonly type?: TypeNode; + readonly initializer?: Expression; + } + interface VariableDeclarationList extends Node { + readonly kind: SyntaxKind.VariableDeclarationList; + readonly parent: VariableStatement | ForStatement | ForOfStatement | ForInStatement; + readonly declarations: NodeArray; + } + interface ParameterDeclaration extends NamedDeclaration, JSDocContainer { + readonly kind: SyntaxKind.Parameter; + readonly parent: SignatureDeclaration; + readonly modifiers?: NodeArray; + readonly dotDotDotToken?: DotDotDotToken; + readonly name: BindingName; + readonly questionToken?: QuestionToken; + readonly type?: TypeNode; + readonly initializer?: Expression; + } + interface BindingElement extends NamedDeclaration, FlowContainer { + readonly kind: SyntaxKind.BindingElement; + readonly parent: BindingPattern; + readonly propertyName?: PropertyName; + readonly dotDotDotToken?: DotDotDotToken; + readonly name: BindingName; + readonly initializer?: Expression; + } + interface PropertySignature extends TypeElement, JSDocContainer { + readonly kind: SyntaxKind.PropertySignature; + readonly parent: TypeLiteralNode | InterfaceDeclaration; + readonly modifiers?: NodeArray; + readonly name: PropertyName; + readonly questionToken?: QuestionToken; + readonly type?: TypeNode; + } + interface PropertyDeclaration extends ClassElement, JSDocContainer { + readonly kind: SyntaxKind.PropertyDeclaration; + readonly parent: ClassLikeDeclaration; + readonly modifiers?: NodeArray; + readonly name: PropertyName; + readonly questionToken?: QuestionToken; + readonly exclamationToken?: ExclamationToken; + readonly type?: TypeNode; + readonly initializer?: Expression; + } + interface AutoAccessorPropertyDeclaration extends PropertyDeclaration { + _autoAccessorBrand: any; + } + interface ObjectLiteralElement extends NamedDeclaration { + _objectLiteralBrand: any; + readonly name?: PropertyName; + } + /** Unlike ObjectLiteralElement, excludes JSXAttribute and JSXSpreadAttribute. */ + type ObjectLiteralElementLike = PropertyAssignment | ShorthandPropertyAssignment | SpreadAssignment | MethodDeclaration | AccessorDeclaration; + interface PropertyAssignment extends ObjectLiteralElement, JSDocContainer { + readonly kind: SyntaxKind.PropertyAssignment; + readonly parent: ObjectLiteralExpression; + readonly name: PropertyName; + readonly initializer: Expression; + } + interface ShorthandPropertyAssignment extends ObjectLiteralElement, JSDocContainer { + readonly kind: SyntaxKind.ShorthandPropertyAssignment; + readonly parent: ObjectLiteralExpression; + readonly name: Identifier; + readonly equalsToken?: EqualsToken; + readonly objectAssignmentInitializer?: Expression; + } + interface SpreadAssignment extends ObjectLiteralElement, JSDocContainer { + readonly kind: SyntaxKind.SpreadAssignment; + readonly parent: ObjectLiteralExpression; + readonly expression: Expression; + } + type VariableLikeDeclaration = VariableDeclaration | ParameterDeclaration | BindingElement | PropertyDeclaration | PropertyAssignment | PropertySignature | JsxAttribute | ShorthandPropertyAssignment | EnumMember | JSDocPropertyTag | JSDocParameterTag; + interface ObjectBindingPattern extends Node { + readonly kind: SyntaxKind.ObjectBindingPattern; + readonly parent: VariableDeclaration | ParameterDeclaration | BindingElement; + readonly elements: NodeArray; + } + interface ArrayBindingPattern extends Node { + readonly kind: SyntaxKind.ArrayBindingPattern; + readonly parent: VariableDeclaration | ParameterDeclaration | BindingElement; + readonly elements: NodeArray; + } + type BindingPattern = ObjectBindingPattern | ArrayBindingPattern; + type ArrayBindingElement = BindingElement | OmittedExpression; + /** + * Several node kinds share function-like features such as a signature, + * a name, and a body. These nodes should extend FunctionLikeDeclarationBase. + * Examples: + * - FunctionDeclaration + * - MethodDeclaration + * - AccessorDeclaration + */ + interface FunctionLikeDeclarationBase extends SignatureDeclarationBase { + _functionLikeDeclarationBrand: any; + readonly asteriskToken?: AsteriskToken | undefined; + readonly questionToken?: QuestionToken | undefined; + readonly exclamationToken?: ExclamationToken | undefined; + readonly body?: Block | Expression | undefined; + } + type FunctionLikeDeclaration = FunctionDeclaration | MethodDeclaration | GetAccessorDeclaration | SetAccessorDeclaration | ConstructorDeclaration | FunctionExpression | ArrowFunction; + /** @deprecated Use SignatureDeclaration */ + type FunctionLike = SignatureDeclaration; + interface FunctionDeclaration extends FunctionLikeDeclarationBase, DeclarationStatement, LocalsContainer { + readonly kind: SyntaxKind.FunctionDeclaration; + readonly modifiers?: NodeArray; + readonly name?: Identifier; + readonly body?: FunctionBody; + } + interface MethodSignature extends SignatureDeclarationBase, TypeElement, LocalsContainer { + readonly kind: SyntaxKind.MethodSignature; + readonly parent: TypeLiteralNode | InterfaceDeclaration; + readonly modifiers?: NodeArray; + readonly name: PropertyName; + } + interface MethodDeclaration extends FunctionLikeDeclarationBase, ClassElement, ObjectLiteralElement, JSDocContainer, LocalsContainer, FlowContainer { + readonly kind: SyntaxKind.MethodDeclaration; + readonly parent: ClassLikeDeclaration | ObjectLiteralExpression; + readonly modifiers?: NodeArray | undefined; + readonly name: PropertyName; + readonly body?: FunctionBody | undefined; + } + interface ConstructorDeclaration extends FunctionLikeDeclarationBase, ClassElement, JSDocContainer, LocalsContainer { + readonly kind: SyntaxKind.Constructor; + readonly parent: ClassLikeDeclaration; + readonly modifiers?: NodeArray | undefined; + readonly body?: FunctionBody | undefined; + } + /** For when we encounter a semicolon in a class declaration. ES6 allows these as class elements. */ + interface SemicolonClassElement extends ClassElement, JSDocContainer { + readonly kind: SyntaxKind.SemicolonClassElement; + readonly parent: ClassLikeDeclaration; + } + interface GetAccessorDeclaration extends FunctionLikeDeclarationBase, ClassElement, TypeElement, ObjectLiteralElement, JSDocContainer, LocalsContainer, FlowContainer { + readonly kind: SyntaxKind.GetAccessor; + readonly parent: ClassLikeDeclaration | ObjectLiteralExpression | TypeLiteralNode | InterfaceDeclaration; + readonly modifiers?: NodeArray; + readonly name: PropertyName; + readonly body?: FunctionBody; + } + interface SetAccessorDeclaration extends FunctionLikeDeclarationBase, ClassElement, TypeElement, ObjectLiteralElement, JSDocContainer, LocalsContainer, FlowContainer { + readonly kind: SyntaxKind.SetAccessor; + readonly parent: ClassLikeDeclaration | ObjectLiteralExpression | TypeLiteralNode | InterfaceDeclaration; + readonly modifiers?: NodeArray; + readonly name: PropertyName; + readonly body?: FunctionBody; + } + type AccessorDeclaration = GetAccessorDeclaration | SetAccessorDeclaration; + interface IndexSignatureDeclaration extends SignatureDeclarationBase, ClassElement, TypeElement, LocalsContainer { + readonly kind: SyntaxKind.IndexSignature; + readonly parent: ObjectTypeDeclaration; + readonly modifiers?: NodeArray; + readonly type: TypeNode; + } + interface ClassStaticBlockDeclaration extends ClassElement, JSDocContainer, LocalsContainer { + readonly kind: SyntaxKind.ClassStaticBlockDeclaration; + readonly parent: ClassDeclaration | ClassExpression; + readonly body: Block; + } + interface TypeNode extends Node { + _typeNodeBrand: any; + } + interface KeywordTypeNode extends KeywordToken, TypeNode { + readonly kind: TKind; + } + interface ImportTypeAssertionContainer extends Node { + readonly kind: SyntaxKind.ImportTypeAssertionContainer; + readonly parent: ImportTypeNode; + readonly assertClause: AssertClause; + readonly multiLine?: boolean; + } + interface ImportTypeNode extends NodeWithTypeArguments { + readonly kind: SyntaxKind.ImportType; + readonly isTypeOf: boolean; + readonly argument: TypeNode; + readonly assertions?: ImportTypeAssertionContainer; + readonly qualifier?: EntityName; + } + interface ThisTypeNode extends TypeNode { + readonly kind: SyntaxKind.ThisType; + } + type FunctionOrConstructorTypeNode = FunctionTypeNode | ConstructorTypeNode; + interface FunctionOrConstructorTypeNodeBase extends TypeNode, SignatureDeclarationBase { + readonly kind: SyntaxKind.FunctionType | SyntaxKind.ConstructorType; + readonly type: TypeNode; + } + interface FunctionTypeNode extends FunctionOrConstructorTypeNodeBase, LocalsContainer { + readonly kind: SyntaxKind.FunctionType; + } + interface ConstructorTypeNode extends FunctionOrConstructorTypeNodeBase, LocalsContainer { + readonly kind: SyntaxKind.ConstructorType; + readonly modifiers?: NodeArray; + } + interface NodeWithTypeArguments extends TypeNode { + readonly typeArguments?: NodeArray; + } + type TypeReferenceType = TypeReferenceNode | ExpressionWithTypeArguments; + interface TypeReferenceNode extends NodeWithTypeArguments { + readonly kind: SyntaxKind.TypeReference; + readonly typeName: EntityName; + } + interface TypePredicateNode extends TypeNode { + readonly kind: SyntaxKind.TypePredicate; + readonly parent: SignatureDeclaration | JSDocTypeExpression; + readonly assertsModifier?: AssertsKeyword; + readonly parameterName: Identifier | ThisTypeNode; + readonly type?: TypeNode; + } + interface TypeQueryNode extends NodeWithTypeArguments { + readonly kind: SyntaxKind.TypeQuery; + readonly exprName: EntityName; + } + interface TypeLiteralNode extends TypeNode, Declaration { + readonly kind: SyntaxKind.TypeLiteral; + readonly members: NodeArray; + } + interface ArrayTypeNode extends TypeNode { + readonly kind: SyntaxKind.ArrayType; + readonly elementType: TypeNode; + } + interface TupleTypeNode extends TypeNode { + readonly kind: SyntaxKind.TupleType; + readonly elements: NodeArray; + } + interface NamedTupleMember extends TypeNode, Declaration, JSDocContainer { + readonly kind: SyntaxKind.NamedTupleMember; + readonly dotDotDotToken?: Token; + readonly name: Identifier; + readonly questionToken?: Token; + readonly type: TypeNode; + } + interface OptionalTypeNode extends TypeNode { + readonly kind: SyntaxKind.OptionalType; + readonly type: TypeNode; + } + interface RestTypeNode extends TypeNode { + readonly kind: SyntaxKind.RestType; + readonly type: TypeNode; + } + type UnionOrIntersectionTypeNode = UnionTypeNode | IntersectionTypeNode; + interface UnionTypeNode extends TypeNode { + readonly kind: SyntaxKind.UnionType; + readonly types: NodeArray; + } + interface IntersectionTypeNode extends TypeNode { + readonly kind: SyntaxKind.IntersectionType; + readonly types: NodeArray; + } + interface ConditionalTypeNode extends TypeNode, LocalsContainer { + readonly kind: SyntaxKind.ConditionalType; + readonly checkType: TypeNode; + readonly extendsType: TypeNode; + readonly trueType: TypeNode; + readonly falseType: TypeNode; + } + interface InferTypeNode extends TypeNode { + readonly kind: SyntaxKind.InferType; + readonly typeParameter: TypeParameterDeclaration; + } + interface ParenthesizedTypeNode extends TypeNode { + readonly kind: SyntaxKind.ParenthesizedType; + readonly type: TypeNode; + } + interface TypeOperatorNode extends TypeNode { + readonly kind: SyntaxKind.TypeOperator; + readonly operator: SyntaxKind.KeyOfKeyword | SyntaxKind.UniqueKeyword | SyntaxKind.ReadonlyKeyword; + readonly type: TypeNode; + } + interface IndexedAccessTypeNode extends TypeNode { + readonly kind: SyntaxKind.IndexedAccessType; + readonly objectType: TypeNode; + readonly indexType: TypeNode; + } + interface MappedTypeNode extends TypeNode, Declaration, LocalsContainer { + readonly kind: SyntaxKind.MappedType; + readonly readonlyToken?: ReadonlyKeyword | PlusToken | MinusToken; + readonly typeParameter: TypeParameterDeclaration; + readonly nameType?: TypeNode; + readonly questionToken?: QuestionToken | PlusToken | MinusToken; + readonly type?: TypeNode; + /** Used only to produce grammar errors */ + readonly members?: NodeArray; + } + interface LiteralTypeNode extends TypeNode { + readonly kind: SyntaxKind.LiteralType; + readonly literal: NullLiteral | BooleanLiteral | LiteralExpression | PrefixUnaryExpression; + } + interface StringLiteral extends LiteralExpression, Declaration { + readonly kind: SyntaxKind.StringLiteral; + } + type StringLiteralLike = StringLiteral | NoSubstitutionTemplateLiteral; + type PropertyNameLiteral = Identifier | StringLiteralLike | NumericLiteral | JsxNamespacedName; + interface TemplateLiteralTypeNode extends TypeNode { + kind: SyntaxKind.TemplateLiteralType; + readonly head: TemplateHead; + readonly templateSpans: NodeArray; + } + interface TemplateLiteralTypeSpan extends TypeNode { + readonly kind: SyntaxKind.TemplateLiteralTypeSpan; + readonly parent: TemplateLiteralTypeNode; + readonly type: TypeNode; + readonly literal: TemplateMiddle | TemplateTail; + } + interface Expression extends Node { + _expressionBrand: any; + } + interface OmittedExpression extends Expression { + readonly kind: SyntaxKind.OmittedExpression; + } + interface PartiallyEmittedExpression extends LeftHandSideExpression { + readonly kind: SyntaxKind.PartiallyEmittedExpression; + readonly expression: Expression; + } + interface UnaryExpression extends Expression { + _unaryExpressionBrand: any; + } + /** Deprecated, please use UpdateExpression */ + type IncrementExpression = UpdateExpression; + interface UpdateExpression extends UnaryExpression { + _updateExpressionBrand: any; + } + type PrefixUnaryOperator = SyntaxKind.PlusPlusToken | SyntaxKind.MinusMinusToken | SyntaxKind.PlusToken | SyntaxKind.MinusToken | SyntaxKind.TildeToken | SyntaxKind.ExclamationToken; + interface PrefixUnaryExpression extends UpdateExpression { + readonly kind: SyntaxKind.PrefixUnaryExpression; + readonly operator: PrefixUnaryOperator; + readonly operand: UnaryExpression; + } + type PostfixUnaryOperator = SyntaxKind.PlusPlusToken | SyntaxKind.MinusMinusToken; + interface PostfixUnaryExpression extends UpdateExpression { + readonly kind: SyntaxKind.PostfixUnaryExpression; + readonly operand: LeftHandSideExpression; + readonly operator: PostfixUnaryOperator; + } + interface LeftHandSideExpression extends UpdateExpression { + _leftHandSideExpressionBrand: any; + } + interface MemberExpression extends LeftHandSideExpression { + _memberExpressionBrand: any; + } + interface PrimaryExpression extends MemberExpression { + _primaryExpressionBrand: any; + } + interface NullLiteral extends PrimaryExpression { + readonly kind: SyntaxKind.NullKeyword; + } + interface TrueLiteral extends PrimaryExpression { + readonly kind: SyntaxKind.TrueKeyword; + } + interface FalseLiteral extends PrimaryExpression { + readonly kind: SyntaxKind.FalseKeyword; + } + type BooleanLiteral = TrueLiteral | FalseLiteral; + interface ThisExpression extends PrimaryExpression, FlowContainer { + readonly kind: SyntaxKind.ThisKeyword; + } + interface SuperExpression extends PrimaryExpression, FlowContainer { + readonly kind: SyntaxKind.SuperKeyword; + } + interface ImportExpression extends PrimaryExpression { + readonly kind: SyntaxKind.ImportKeyword; + } + interface DeleteExpression extends UnaryExpression { + readonly kind: SyntaxKind.DeleteExpression; + readonly expression: UnaryExpression; + } + interface TypeOfExpression extends UnaryExpression { + readonly kind: SyntaxKind.TypeOfExpression; + readonly expression: UnaryExpression; + } + interface VoidExpression extends UnaryExpression { + readonly kind: SyntaxKind.VoidExpression; + readonly expression: UnaryExpression; + } + interface AwaitExpression extends UnaryExpression { + readonly kind: SyntaxKind.AwaitExpression; + readonly expression: UnaryExpression; + } + interface YieldExpression extends Expression { + readonly kind: SyntaxKind.YieldExpression; + readonly asteriskToken?: AsteriskToken; + readonly expression?: Expression; + } + interface SyntheticExpression extends Expression { + readonly kind: SyntaxKind.SyntheticExpression; + readonly isSpread: boolean; + readonly type: Type; + readonly tupleNameSource?: ParameterDeclaration | NamedTupleMember; + } + type ExponentiationOperator = SyntaxKind.AsteriskAsteriskToken; + type MultiplicativeOperator = SyntaxKind.AsteriskToken | SyntaxKind.SlashToken | SyntaxKind.PercentToken; + type MultiplicativeOperatorOrHigher = ExponentiationOperator | MultiplicativeOperator; + type AdditiveOperator = SyntaxKind.PlusToken | SyntaxKind.MinusToken; + type AdditiveOperatorOrHigher = MultiplicativeOperatorOrHigher | AdditiveOperator; + type ShiftOperator = SyntaxKind.LessThanLessThanToken | SyntaxKind.GreaterThanGreaterThanToken | SyntaxKind.GreaterThanGreaterThanGreaterThanToken; + type ShiftOperatorOrHigher = AdditiveOperatorOrHigher | ShiftOperator; + type RelationalOperator = SyntaxKind.LessThanToken | SyntaxKind.LessThanEqualsToken | SyntaxKind.GreaterThanToken | SyntaxKind.GreaterThanEqualsToken | SyntaxKind.InstanceOfKeyword | SyntaxKind.InKeyword; + type RelationalOperatorOrHigher = ShiftOperatorOrHigher | RelationalOperator; + type EqualityOperator = SyntaxKind.EqualsEqualsToken | SyntaxKind.EqualsEqualsEqualsToken | SyntaxKind.ExclamationEqualsEqualsToken | SyntaxKind.ExclamationEqualsToken; + type EqualityOperatorOrHigher = RelationalOperatorOrHigher | EqualityOperator; + type BitwiseOperator = SyntaxKind.AmpersandToken | SyntaxKind.BarToken | SyntaxKind.CaretToken; + type BitwiseOperatorOrHigher = EqualityOperatorOrHigher | BitwiseOperator; + type LogicalOperator = SyntaxKind.AmpersandAmpersandToken | SyntaxKind.BarBarToken; + type LogicalOperatorOrHigher = BitwiseOperatorOrHigher | LogicalOperator; + type CompoundAssignmentOperator = SyntaxKind.PlusEqualsToken | SyntaxKind.MinusEqualsToken | SyntaxKind.AsteriskAsteriskEqualsToken | SyntaxKind.AsteriskEqualsToken | SyntaxKind.SlashEqualsToken | SyntaxKind.PercentEqualsToken | SyntaxKind.AmpersandEqualsToken | SyntaxKind.BarEqualsToken | SyntaxKind.CaretEqualsToken | SyntaxKind.LessThanLessThanEqualsToken | SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken | SyntaxKind.GreaterThanGreaterThanEqualsToken | SyntaxKind.BarBarEqualsToken | SyntaxKind.AmpersandAmpersandEqualsToken | SyntaxKind.QuestionQuestionEqualsToken; + type AssignmentOperator = SyntaxKind.EqualsToken | CompoundAssignmentOperator; + type AssignmentOperatorOrHigher = SyntaxKind.QuestionQuestionToken | LogicalOperatorOrHigher | AssignmentOperator; + type BinaryOperator = AssignmentOperatorOrHigher | SyntaxKind.CommaToken; + type LogicalOrCoalescingAssignmentOperator = SyntaxKind.AmpersandAmpersandEqualsToken | SyntaxKind.BarBarEqualsToken | SyntaxKind.QuestionQuestionEqualsToken; + type BinaryOperatorToken = Token; + interface BinaryExpression extends Expression, Declaration, JSDocContainer { + readonly kind: SyntaxKind.BinaryExpression; + readonly left: Expression; + readonly operatorToken: BinaryOperatorToken; + readonly right: Expression; + } + type AssignmentOperatorToken = Token; + interface AssignmentExpression extends BinaryExpression { + readonly left: LeftHandSideExpression; + readonly operatorToken: TOperator; + } + interface ObjectDestructuringAssignment extends AssignmentExpression { + readonly left: ObjectLiteralExpression; + } + interface ArrayDestructuringAssignment extends AssignmentExpression { + readonly left: ArrayLiteralExpression; + } + type DestructuringAssignment = ObjectDestructuringAssignment | ArrayDestructuringAssignment; + type BindingOrAssignmentElement = VariableDeclaration | ParameterDeclaration | ObjectBindingOrAssignmentElement | ArrayBindingOrAssignmentElement; + type ObjectBindingOrAssignmentElement = BindingElement | PropertyAssignment | ShorthandPropertyAssignment | SpreadAssignment; + type ArrayBindingOrAssignmentElement = BindingElement | OmittedExpression | SpreadElement | ArrayLiteralExpression | ObjectLiteralExpression | AssignmentExpression | Identifier | PropertyAccessExpression | ElementAccessExpression; + type BindingOrAssignmentElementRestIndicator = DotDotDotToken | SpreadElement | SpreadAssignment; + type BindingOrAssignmentElementTarget = BindingOrAssignmentPattern | Identifier | PropertyAccessExpression | ElementAccessExpression | OmittedExpression; + type ObjectBindingOrAssignmentPattern = ObjectBindingPattern | ObjectLiteralExpression; + type ArrayBindingOrAssignmentPattern = ArrayBindingPattern | ArrayLiteralExpression; + type AssignmentPattern = ObjectLiteralExpression | ArrayLiteralExpression; + type BindingOrAssignmentPattern = ObjectBindingOrAssignmentPattern | ArrayBindingOrAssignmentPattern; + interface ConditionalExpression extends Expression { + readonly kind: SyntaxKind.ConditionalExpression; + readonly condition: Expression; + readonly questionToken: QuestionToken; + readonly whenTrue: Expression; + readonly colonToken: ColonToken; + readonly whenFalse: Expression; + } + type FunctionBody = Block; + type ConciseBody = FunctionBody | Expression; + interface FunctionExpression extends PrimaryExpression, FunctionLikeDeclarationBase, JSDocContainer, LocalsContainer, FlowContainer { + readonly kind: SyntaxKind.FunctionExpression; + readonly modifiers?: NodeArray; + readonly name?: Identifier; + readonly body: FunctionBody; + } + interface ArrowFunction extends Expression, FunctionLikeDeclarationBase, JSDocContainer, LocalsContainer, FlowContainer { + readonly kind: SyntaxKind.ArrowFunction; + readonly modifiers?: NodeArray; + readonly equalsGreaterThanToken: EqualsGreaterThanToken; + readonly body: ConciseBody; + readonly name: never; + } + interface LiteralLikeNode extends Node { + text: string; + isUnterminated?: boolean; + hasExtendedUnicodeEscape?: boolean; + } + interface TemplateLiteralLikeNode extends LiteralLikeNode { + rawText?: string; + } + interface LiteralExpression extends LiteralLikeNode, PrimaryExpression { + _literalExpressionBrand: any; + } + interface RegularExpressionLiteral extends LiteralExpression { + readonly kind: SyntaxKind.RegularExpressionLiteral; + } + interface NoSubstitutionTemplateLiteral extends LiteralExpression, TemplateLiteralLikeNode, Declaration { + readonly kind: SyntaxKind.NoSubstitutionTemplateLiteral; + } + enum TokenFlags { + None = 0, + Scientific = 16, + Octal = 32, + HexSpecifier = 64, + BinarySpecifier = 128, + OctalSpecifier = 256 + } + interface NumericLiteral extends LiteralExpression, Declaration { + readonly kind: SyntaxKind.NumericLiteral; + } + interface BigIntLiteral extends LiteralExpression { + readonly kind: SyntaxKind.BigIntLiteral; + } + type LiteralToken = NumericLiteral | BigIntLiteral | StringLiteral | JsxText | RegularExpressionLiteral | NoSubstitutionTemplateLiteral; + interface TemplateHead extends TemplateLiteralLikeNode { + readonly kind: SyntaxKind.TemplateHead; + readonly parent: TemplateExpression | TemplateLiteralTypeNode; + } + interface TemplateMiddle extends TemplateLiteralLikeNode { + readonly kind: SyntaxKind.TemplateMiddle; + readonly parent: TemplateSpan | TemplateLiteralTypeSpan; + } + interface TemplateTail extends TemplateLiteralLikeNode { + readonly kind: SyntaxKind.TemplateTail; + readonly parent: TemplateSpan | TemplateLiteralTypeSpan; + } + type PseudoLiteralToken = TemplateHead | TemplateMiddle | TemplateTail; + type TemplateLiteralToken = NoSubstitutionTemplateLiteral | PseudoLiteralToken; + interface TemplateExpression extends PrimaryExpression { + readonly kind: SyntaxKind.TemplateExpression; + readonly head: TemplateHead; + readonly templateSpans: NodeArray; + } + type TemplateLiteral = TemplateExpression | NoSubstitutionTemplateLiteral; + interface TemplateSpan extends Node { + readonly kind: SyntaxKind.TemplateSpan; + readonly parent: TemplateExpression; + readonly expression: Expression; + readonly literal: TemplateMiddle | TemplateTail; + } + interface ParenthesizedExpression extends PrimaryExpression, JSDocContainer { + readonly kind: SyntaxKind.ParenthesizedExpression; + readonly expression: Expression; + } + interface ArrayLiteralExpression extends PrimaryExpression { + readonly kind: SyntaxKind.ArrayLiteralExpression; + readonly elements: NodeArray; + } + interface SpreadElement extends Expression { + readonly kind: SyntaxKind.SpreadElement; + readonly parent: ArrayLiteralExpression | CallExpression | NewExpression; + readonly expression: Expression; + } + /** + * This interface is a base interface for ObjectLiteralExpression and JSXAttributes to extend from. JSXAttributes is similar to + * ObjectLiteralExpression in that it contains array of properties; however, JSXAttributes' properties can only be + * JSXAttribute or JSXSpreadAttribute. ObjectLiteralExpression, on the other hand, can only have properties of type + * ObjectLiteralElement (e.g. PropertyAssignment, ShorthandPropertyAssignment etc.) + */ + interface ObjectLiteralExpressionBase extends PrimaryExpression, Declaration { + readonly properties: NodeArray; + } + interface ObjectLiteralExpression extends ObjectLiteralExpressionBase, JSDocContainer { + readonly kind: SyntaxKind.ObjectLiteralExpression; + } + type EntityNameExpression = Identifier | PropertyAccessEntityNameExpression; + type EntityNameOrEntityNameExpression = EntityName | EntityNameExpression; + type AccessExpression = PropertyAccessExpression | ElementAccessExpression; + interface PropertyAccessExpression extends MemberExpression, NamedDeclaration, JSDocContainer, FlowContainer { + readonly kind: SyntaxKind.PropertyAccessExpression; + readonly expression: LeftHandSideExpression; + readonly questionDotToken?: QuestionDotToken; + readonly name: MemberName; + } + interface PropertyAccessChain extends PropertyAccessExpression { + _optionalChainBrand: any; + readonly name: MemberName; + } + interface SuperPropertyAccessExpression extends PropertyAccessExpression { + readonly expression: SuperExpression; + } + /** Brand for a PropertyAccessExpression which, like a QualifiedName, consists of a sequence of identifiers separated by dots. */ + interface PropertyAccessEntityNameExpression extends PropertyAccessExpression { + _propertyAccessExpressionLikeQualifiedNameBrand?: any; + readonly expression: EntityNameExpression; + readonly name: Identifier; + } + interface ElementAccessExpression extends MemberExpression, Declaration, JSDocContainer, FlowContainer { + readonly kind: SyntaxKind.ElementAccessExpression; + readonly expression: LeftHandSideExpression; + readonly questionDotToken?: QuestionDotToken; + readonly argumentExpression: Expression; + } + interface ElementAccessChain extends ElementAccessExpression { + _optionalChainBrand: any; + } + interface SuperElementAccessExpression extends ElementAccessExpression { + readonly expression: SuperExpression; + } + type SuperProperty = SuperPropertyAccessExpression | SuperElementAccessExpression; + interface CallExpression extends LeftHandSideExpression, Declaration { + readonly kind: SyntaxKind.CallExpression; + readonly expression: LeftHandSideExpression; + readonly questionDotToken?: QuestionDotToken; + readonly typeArguments?: NodeArray; + readonly arguments: NodeArray; + } + interface CallChain extends CallExpression { + _optionalChainBrand: any; + } + type OptionalChain = PropertyAccessChain | ElementAccessChain | CallChain | NonNullChain; + interface SuperCall extends CallExpression { + readonly expression: SuperExpression; + } + interface ImportCall extends CallExpression { + readonly expression: ImportExpression; + } + interface ExpressionWithTypeArguments extends MemberExpression, NodeWithTypeArguments { + readonly kind: SyntaxKind.ExpressionWithTypeArguments; + readonly expression: LeftHandSideExpression; + } + interface NewExpression extends PrimaryExpression, Declaration { + readonly kind: SyntaxKind.NewExpression; + readonly expression: LeftHandSideExpression; + readonly typeArguments?: NodeArray; + readonly arguments?: NodeArray; + } + interface TaggedTemplateExpression extends MemberExpression { + readonly kind: SyntaxKind.TaggedTemplateExpression; + readonly tag: LeftHandSideExpression; + readonly typeArguments?: NodeArray; + readonly template: TemplateLiteral; + } + type CallLikeExpression = CallExpression | NewExpression | TaggedTemplateExpression | Decorator | JsxOpeningLikeElement; + interface AsExpression extends Expression { + readonly kind: SyntaxKind.AsExpression; + readonly expression: Expression; + readonly type: TypeNode; + } + interface TypeAssertion extends UnaryExpression { + readonly kind: SyntaxKind.TypeAssertionExpression; + readonly type: TypeNode; + readonly expression: UnaryExpression; + } + interface SatisfiesExpression extends Expression { + readonly kind: SyntaxKind.SatisfiesExpression; + readonly expression: Expression; + readonly type: TypeNode; + } + type AssertionExpression = TypeAssertion | AsExpression; + interface NonNullExpression extends LeftHandSideExpression { + readonly kind: SyntaxKind.NonNullExpression; + readonly expression: Expression; + } + interface NonNullChain extends NonNullExpression { + _optionalChainBrand: any; + } + interface MetaProperty extends PrimaryExpression, FlowContainer { + readonly kind: SyntaxKind.MetaProperty; + readonly keywordToken: SyntaxKind.NewKeyword | SyntaxKind.ImportKeyword; + readonly name: Identifier; + } + interface JsxElement extends PrimaryExpression { + readonly kind: SyntaxKind.JsxElement; + readonly openingElement: JsxOpeningElement; + readonly children: NodeArray; + readonly closingElement: JsxClosingElement; + } + type JsxOpeningLikeElement = JsxSelfClosingElement | JsxOpeningElement; + type JsxAttributeLike = JsxAttribute | JsxSpreadAttribute; + type JsxAttributeName = Identifier | JsxNamespacedName; + type JsxTagNameExpression = Identifier | ThisExpression | JsxTagNamePropertyAccess | JsxNamespacedName; + interface JsxTagNamePropertyAccess extends PropertyAccessExpression { + readonly expression: Identifier | ThisExpression | JsxTagNamePropertyAccess; + } + interface JsxAttributes extends PrimaryExpression, Declaration { + readonly properties: NodeArray; + readonly kind: SyntaxKind.JsxAttributes; + readonly parent: JsxOpeningLikeElement; + } + interface JsxNamespacedName extends Node { + readonly kind: SyntaxKind.JsxNamespacedName; + readonly name: Identifier; + readonly namespace: Identifier; + } + interface JsxOpeningElement extends Expression { + readonly kind: SyntaxKind.JsxOpeningElement; + readonly parent: JsxElement; + readonly tagName: JsxTagNameExpression; + readonly typeArguments?: NodeArray; + readonly attributes: JsxAttributes; + } + interface JsxSelfClosingElement extends PrimaryExpression { + readonly kind: SyntaxKind.JsxSelfClosingElement; + readonly tagName: JsxTagNameExpression; + readonly typeArguments?: NodeArray; + readonly attributes: JsxAttributes; + } + interface JsxFragment extends PrimaryExpression { + readonly kind: SyntaxKind.JsxFragment; + readonly openingFragment: JsxOpeningFragment; + readonly children: NodeArray; + readonly closingFragment: JsxClosingFragment; + } + interface JsxOpeningFragment extends Expression { + readonly kind: SyntaxKind.JsxOpeningFragment; + readonly parent: JsxFragment; + } + interface JsxClosingFragment extends Expression { + readonly kind: SyntaxKind.JsxClosingFragment; + readonly parent: JsxFragment; + } + interface JsxAttribute extends Declaration { + readonly kind: SyntaxKind.JsxAttribute; + readonly parent: JsxAttributes; + readonly name: JsxAttributeName; + readonly initializer?: JsxAttributeValue; + } + type JsxAttributeValue = StringLiteral | JsxExpression | JsxElement | JsxSelfClosingElement | JsxFragment; + interface JsxSpreadAttribute extends ObjectLiteralElement { + readonly kind: SyntaxKind.JsxSpreadAttribute; + readonly name: PropertyName; + readonly parent: JsxAttributes; + readonly expression: Expression; + } + interface JsxClosingElement extends Node { + readonly kind: SyntaxKind.JsxClosingElement; + readonly parent: JsxElement; + readonly tagName: JsxTagNameExpression; + } + interface JsxExpression extends Expression { + readonly kind: SyntaxKind.JsxExpression; + readonly parent: JsxElement | JsxFragment | JsxAttributeLike; + readonly dotDotDotToken?: Token; + readonly expression?: Expression; + } + interface JsxText extends LiteralLikeNode { + readonly kind: SyntaxKind.JsxText; + readonly parent: JsxElement | JsxFragment; + readonly containsOnlyTriviaWhiteSpaces: boolean; + } + type JsxChild = JsxText | JsxExpression | JsxElement | JsxSelfClosingElement | JsxFragment; + interface Statement extends Node, JSDocContainer { + _statementBrand: any; + } + interface NotEmittedStatement extends Statement { + readonly kind: SyntaxKind.NotEmittedStatement; + } + /** + * A list of comma-separated expressions. This node is only created by transformations. + */ + interface CommaListExpression extends Expression { + readonly kind: SyntaxKind.CommaListExpression; + readonly elements: NodeArray; + } + interface EmptyStatement extends Statement { + readonly kind: SyntaxKind.EmptyStatement; + } + interface DebuggerStatement extends Statement, FlowContainer { + readonly kind: SyntaxKind.DebuggerStatement; + } + interface MissingDeclaration extends DeclarationStatement, PrimaryExpression { + readonly kind: SyntaxKind.MissingDeclaration; + readonly name?: Identifier; + } + type BlockLike = SourceFile | Block | ModuleBlock | CaseOrDefaultClause; + interface Block extends Statement, LocalsContainer { + readonly kind: SyntaxKind.Block; + readonly statements: NodeArray; + } + interface VariableStatement extends Statement, FlowContainer { + readonly kind: SyntaxKind.VariableStatement; + readonly modifiers?: NodeArray; + readonly declarationList: VariableDeclarationList; + } + interface ExpressionStatement extends Statement, FlowContainer { + readonly kind: SyntaxKind.ExpressionStatement; + readonly expression: Expression; + } + interface IfStatement extends Statement, FlowContainer { + readonly kind: SyntaxKind.IfStatement; + readonly expression: Expression; + readonly thenStatement: Statement; + readonly elseStatement?: Statement; + } + interface IterationStatement extends Statement { + readonly statement: Statement; + } + interface DoStatement extends IterationStatement, FlowContainer { + readonly kind: SyntaxKind.DoStatement; + readonly expression: Expression; + } + interface WhileStatement extends IterationStatement, FlowContainer { + readonly kind: SyntaxKind.WhileStatement; + readonly expression: Expression; + } + type ForInitializer = VariableDeclarationList | Expression; + interface ForStatement extends IterationStatement, LocalsContainer, FlowContainer { + readonly kind: SyntaxKind.ForStatement; + readonly initializer?: ForInitializer; + readonly condition?: Expression; + readonly incrementor?: Expression; + } + type ForInOrOfStatement = ForInStatement | ForOfStatement; + interface ForInStatement extends IterationStatement, LocalsContainer, FlowContainer { + readonly kind: SyntaxKind.ForInStatement; + readonly initializer: ForInitializer; + readonly expression: Expression; + } + interface ForOfStatement extends IterationStatement, LocalsContainer, FlowContainer { + readonly kind: SyntaxKind.ForOfStatement; + readonly awaitModifier?: AwaitKeyword; + readonly initializer: ForInitializer; + readonly expression: Expression; + } + interface BreakStatement extends Statement, FlowContainer { + readonly kind: SyntaxKind.BreakStatement; + readonly label?: Identifier; + } + interface ContinueStatement extends Statement, FlowContainer { + readonly kind: SyntaxKind.ContinueStatement; + readonly label?: Identifier; + } + type BreakOrContinueStatement = BreakStatement | ContinueStatement; + interface ReturnStatement extends Statement, FlowContainer { + readonly kind: SyntaxKind.ReturnStatement; + readonly expression?: Expression; + } + interface WithStatement extends Statement, FlowContainer { + readonly kind: SyntaxKind.WithStatement; + readonly expression: Expression; + readonly statement: Statement; + } + interface SwitchStatement extends Statement, FlowContainer { + readonly kind: SyntaxKind.SwitchStatement; + readonly expression: Expression; + readonly caseBlock: CaseBlock; + possiblyExhaustive?: boolean; + } + interface CaseBlock extends Node, LocalsContainer { + readonly kind: SyntaxKind.CaseBlock; + readonly parent: SwitchStatement; + readonly clauses: NodeArray; + } + interface CaseClause extends Node, JSDocContainer { + readonly kind: SyntaxKind.CaseClause; + readonly parent: CaseBlock; + readonly expression: Expression; + readonly statements: NodeArray; + } + interface DefaultClause extends Node { + readonly kind: SyntaxKind.DefaultClause; + readonly parent: CaseBlock; + readonly statements: NodeArray; + } + type CaseOrDefaultClause = CaseClause | DefaultClause; + interface LabeledStatement extends Statement, FlowContainer { + readonly kind: SyntaxKind.LabeledStatement; + readonly label: Identifier; + readonly statement: Statement; + } + interface ThrowStatement extends Statement, FlowContainer { + readonly kind: SyntaxKind.ThrowStatement; + readonly expression: Expression; + } + interface TryStatement extends Statement, FlowContainer { + readonly kind: SyntaxKind.TryStatement; + readonly tryBlock: Block; + readonly catchClause?: CatchClause; + readonly finallyBlock?: Block; + } + interface CatchClause extends Node, LocalsContainer { + readonly kind: SyntaxKind.CatchClause; + readonly parent: TryStatement; + readonly variableDeclaration?: VariableDeclaration; + readonly block: Block; + } + type ObjectTypeDeclaration = ClassLikeDeclaration | InterfaceDeclaration | TypeLiteralNode; + type DeclarationWithTypeParameters = DeclarationWithTypeParameterChildren | JSDocTypedefTag | JSDocCallbackTag | JSDocSignature; + type DeclarationWithTypeParameterChildren = SignatureDeclaration | ClassLikeDeclaration | InterfaceDeclaration | TypeAliasDeclaration | JSDocTemplateTag; + interface ClassLikeDeclarationBase extends NamedDeclaration, JSDocContainer { + readonly kind: SyntaxKind.ClassDeclaration | SyntaxKind.ClassExpression; + readonly name?: Identifier; + readonly typeParameters?: NodeArray; + readonly heritageClauses?: NodeArray; + readonly members: NodeArray; + } + interface ClassDeclaration extends ClassLikeDeclarationBase, DeclarationStatement { + readonly kind: SyntaxKind.ClassDeclaration; + readonly modifiers?: NodeArray; + /** May be undefined in `export default class { ... }`. */ + readonly name?: Identifier; + } + interface ClassExpression extends ClassLikeDeclarationBase, PrimaryExpression { + readonly kind: SyntaxKind.ClassExpression; + readonly modifiers?: NodeArray; + } + type ClassLikeDeclaration = ClassDeclaration | ClassExpression; + interface ClassElement extends NamedDeclaration { + _classElementBrand: any; + readonly name?: PropertyName; + } + interface TypeElement extends NamedDeclaration { + _typeElementBrand: any; + readonly name?: PropertyName; + readonly questionToken?: QuestionToken | undefined; + } + interface InterfaceDeclaration extends DeclarationStatement, JSDocContainer { + readonly kind: SyntaxKind.InterfaceDeclaration; + readonly modifiers?: NodeArray; + readonly name: Identifier; + readonly typeParameters?: NodeArray; + readonly heritageClauses?: NodeArray; + readonly members: NodeArray; + } + interface HeritageClause extends Node { + readonly kind: SyntaxKind.HeritageClause; + readonly parent: InterfaceDeclaration | ClassLikeDeclaration; + readonly token: SyntaxKind.ExtendsKeyword | SyntaxKind.ImplementsKeyword; + readonly types: NodeArray; + } + interface TypeAliasDeclaration extends DeclarationStatement, JSDocContainer, LocalsContainer { + readonly kind: SyntaxKind.TypeAliasDeclaration; + readonly modifiers?: NodeArray; + readonly name: Identifier; + readonly typeParameters?: NodeArray; + readonly type: TypeNode; + } + interface EnumMember extends NamedDeclaration, JSDocContainer { + readonly kind: SyntaxKind.EnumMember; + readonly parent: EnumDeclaration; + readonly name: PropertyName; + readonly initializer?: Expression; + } + interface EnumDeclaration extends DeclarationStatement, JSDocContainer { + readonly kind: SyntaxKind.EnumDeclaration; + readonly modifiers?: NodeArray; + readonly name: Identifier; + readonly members: NodeArray; + } + type ModuleName = Identifier | StringLiteral; + type ModuleBody = NamespaceBody | JSDocNamespaceBody; + interface ModuleDeclaration extends DeclarationStatement, JSDocContainer, LocalsContainer { + readonly kind: SyntaxKind.ModuleDeclaration; + readonly parent: ModuleBody | SourceFile; + readonly modifiers?: NodeArray; + readonly name: ModuleName; + readonly body?: ModuleBody | JSDocNamespaceDeclaration; + } + type NamespaceBody = ModuleBlock | NamespaceDeclaration; + interface NamespaceDeclaration extends ModuleDeclaration { + readonly name: Identifier; + readonly body: NamespaceBody; + } + type JSDocNamespaceBody = Identifier | JSDocNamespaceDeclaration; + interface JSDocNamespaceDeclaration extends ModuleDeclaration { + readonly name: Identifier; + readonly body?: JSDocNamespaceBody; + } + interface ModuleBlock extends Node, Statement { + readonly kind: SyntaxKind.ModuleBlock; + readonly parent: ModuleDeclaration; + readonly statements: NodeArray; + } + type ModuleReference = EntityName | ExternalModuleReference; + /** + * One of: + * - import x = require("mod"); + * - import x = M.x; + */ + interface ImportEqualsDeclaration extends DeclarationStatement, JSDocContainer { + readonly kind: SyntaxKind.ImportEqualsDeclaration; + readonly parent: SourceFile | ModuleBlock; + readonly modifiers?: NodeArray; + readonly name: Identifier; + readonly isTypeOnly: boolean; + readonly moduleReference: ModuleReference; + } + interface ExternalModuleReference extends Node { + readonly kind: SyntaxKind.ExternalModuleReference; + readonly parent: ImportEqualsDeclaration; + readonly expression: Expression; + } + interface ImportDeclaration extends Statement { + readonly kind: SyntaxKind.ImportDeclaration; + readonly parent: SourceFile | ModuleBlock; + readonly modifiers?: NodeArray; + readonly importClause?: ImportClause; + /** If this is not a StringLiteral it will be a grammar error. */ + readonly moduleSpecifier: Expression; + readonly assertClause?: AssertClause; + } + type NamedImportBindings = NamespaceImport | NamedImports; + type NamedExportBindings = NamespaceExport | NamedExports; + interface ImportClause extends NamedDeclaration { + readonly kind: SyntaxKind.ImportClause; + readonly parent: ImportDeclaration; + readonly isTypeOnly: boolean; + readonly name?: Identifier; + readonly namedBindings?: NamedImportBindings; + } + type AssertionKey = Identifier | StringLiteral; + interface AssertEntry extends Node { + readonly kind: SyntaxKind.AssertEntry; + readonly parent: AssertClause; + readonly name: AssertionKey; + readonly value: Expression; + } + interface AssertClause extends Node { + readonly kind: SyntaxKind.AssertClause; + readonly parent: ImportDeclaration | ExportDeclaration; + readonly elements: NodeArray; + readonly multiLine?: boolean; + } + interface NamespaceImport extends NamedDeclaration { + readonly kind: SyntaxKind.NamespaceImport; + readonly parent: ImportClause; + readonly name: Identifier; + } + interface NamespaceExport extends NamedDeclaration { + readonly kind: SyntaxKind.NamespaceExport; + readonly parent: ExportDeclaration; + readonly name: Identifier; + } + interface NamespaceExportDeclaration extends DeclarationStatement, JSDocContainer { + readonly kind: SyntaxKind.NamespaceExportDeclaration; + readonly name: Identifier; + } + interface ExportDeclaration extends DeclarationStatement, JSDocContainer { + readonly kind: SyntaxKind.ExportDeclaration; + readonly parent: SourceFile | ModuleBlock; + readonly modifiers?: NodeArray; + readonly isTypeOnly: boolean; + /** Will not be assigned in the case of `export * from "foo";` */ + readonly exportClause?: NamedExportBindings; + /** If this is not a StringLiteral it will be a grammar error. */ + readonly moduleSpecifier?: Expression; + readonly assertClause?: AssertClause; + } + interface NamedImports extends Node { + readonly kind: SyntaxKind.NamedImports; + readonly parent: ImportClause; + readonly elements: NodeArray; + } + interface NamedExports extends Node { + readonly kind: SyntaxKind.NamedExports; + readonly parent: ExportDeclaration; + readonly elements: NodeArray; + } + type NamedImportsOrExports = NamedImports | NamedExports; + interface ImportSpecifier extends NamedDeclaration { + readonly kind: SyntaxKind.ImportSpecifier; + readonly parent: NamedImports; + readonly propertyName?: Identifier; + readonly name: Identifier; + readonly isTypeOnly: boolean; + } + interface ExportSpecifier extends NamedDeclaration, JSDocContainer { + readonly kind: SyntaxKind.ExportSpecifier; + readonly parent: NamedExports; + readonly isTypeOnly: boolean; + readonly propertyName?: Identifier; + readonly name: Identifier; + } + type ImportOrExportSpecifier = ImportSpecifier | ExportSpecifier; + type TypeOnlyCompatibleAliasDeclaration = ImportClause | ImportEqualsDeclaration | NamespaceImport | ImportOrExportSpecifier | ExportDeclaration | NamespaceExport; + type TypeOnlyImportDeclaration = ImportClause & { + readonly isTypeOnly: true; + readonly name: Identifier; + } | ImportEqualsDeclaration & { + readonly isTypeOnly: true; + } | NamespaceImport & { + readonly parent: ImportClause & { + readonly isTypeOnly: true; + }; + } | ImportSpecifier & ({ + readonly isTypeOnly: true; + } | { + readonly parent: NamedImports & { + readonly parent: ImportClause & { + readonly isTypeOnly: true; + }; + }; + }); + type TypeOnlyExportDeclaration = ExportSpecifier & ({ + readonly isTypeOnly: true; + } | { + readonly parent: NamedExports & { + readonly parent: ExportDeclaration & { + readonly isTypeOnly: true; + }; + }; + }) | ExportDeclaration & { + readonly isTypeOnly: true; + } | NamespaceExport & { + readonly parent: ExportDeclaration & { + readonly isTypeOnly: true; + }; + }; + type TypeOnlyAliasDeclaration = TypeOnlyImportDeclaration | TypeOnlyExportDeclaration; + /** + * This is either an `export =` or an `export default` declaration. + * Unless `isExportEquals` is set, this node was parsed as an `export default`. + */ + interface ExportAssignment extends DeclarationStatement, JSDocContainer { + readonly kind: SyntaxKind.ExportAssignment; + readonly parent: SourceFile; + readonly modifiers?: NodeArray; + readonly isExportEquals?: boolean; + readonly expression: Expression; + } + interface FileReference extends TextRange { + fileName: string; + resolutionMode?: ResolutionMode; + } + interface CheckJsDirective extends TextRange { + enabled: boolean; + } + type CommentKind = SyntaxKind.SingleLineCommentTrivia | SyntaxKind.MultiLineCommentTrivia; + interface CommentRange extends TextRange { + hasTrailingNewLine?: boolean; + kind: CommentKind; + } + interface SynthesizedComment extends CommentRange { + text: string; + pos: -1; + end: -1; + hasLeadingNewline?: boolean; + } + interface JSDocTypeExpression extends TypeNode { + readonly kind: SyntaxKind.JSDocTypeExpression; + readonly type: TypeNode; + } + interface JSDocNameReference extends Node { + readonly kind: SyntaxKind.JSDocNameReference; + readonly name: EntityName | JSDocMemberName; + } + /** Class#method reference in JSDoc */ + interface JSDocMemberName extends Node { + readonly kind: SyntaxKind.JSDocMemberName; + readonly left: EntityName | JSDocMemberName; + readonly right: Identifier; + } + interface JSDocType extends TypeNode { + _jsDocTypeBrand: any; + } + interface JSDocAllType extends JSDocType { + readonly kind: SyntaxKind.JSDocAllType; + } + interface JSDocUnknownType extends JSDocType { + readonly kind: SyntaxKind.JSDocUnknownType; + } + interface JSDocNonNullableType extends JSDocType { + readonly kind: SyntaxKind.JSDocNonNullableType; + readonly type: TypeNode; + readonly postfix: boolean; + } + interface JSDocNullableType extends JSDocType { + readonly kind: SyntaxKind.JSDocNullableType; + readonly type: TypeNode; + readonly postfix: boolean; + } + interface JSDocOptionalType extends JSDocType { + readonly kind: SyntaxKind.JSDocOptionalType; + readonly type: TypeNode; + } + interface JSDocFunctionType extends JSDocType, SignatureDeclarationBase, LocalsContainer { + readonly kind: SyntaxKind.JSDocFunctionType; + } + interface JSDocVariadicType extends JSDocType { + readonly kind: SyntaxKind.JSDocVariadicType; + readonly type: TypeNode; + } + interface JSDocNamepathType extends JSDocType { + readonly kind: SyntaxKind.JSDocNamepathType; + readonly type: TypeNode; + } + type JSDocTypeReferencingNode = JSDocVariadicType | JSDocOptionalType | JSDocNullableType | JSDocNonNullableType; + interface JSDoc extends Node { + readonly kind: SyntaxKind.JSDoc; + readonly parent: HasJSDoc; + readonly tags?: NodeArray; + readonly comment?: string | NodeArray; + } + interface JSDocTag extends Node { + readonly parent: JSDoc | JSDocTypeLiteral; + readonly tagName: Identifier; + readonly comment?: string | NodeArray; + } + interface JSDocLink extends Node { + readonly kind: SyntaxKind.JSDocLink; + readonly name?: EntityName | JSDocMemberName; + text: string; + } + interface JSDocLinkCode extends Node { + readonly kind: SyntaxKind.JSDocLinkCode; + readonly name?: EntityName | JSDocMemberName; + text: string; + } + interface JSDocLinkPlain extends Node { + readonly kind: SyntaxKind.JSDocLinkPlain; + readonly name?: EntityName | JSDocMemberName; + text: string; + } + type JSDocComment = JSDocText | JSDocLink | JSDocLinkCode | JSDocLinkPlain; + interface JSDocText extends Node { + readonly kind: SyntaxKind.JSDocText; + text: string; + } + interface JSDocUnknownTag extends JSDocTag { + readonly kind: SyntaxKind.JSDocTag; + } + /** + * Note that `@extends` is a synonym of `@augments`. + * Both tags are represented by this interface. + */ + interface JSDocAugmentsTag extends JSDocTag { + readonly kind: SyntaxKind.JSDocAugmentsTag; + readonly class: ExpressionWithTypeArguments & { + readonly expression: Identifier | PropertyAccessEntityNameExpression; + }; + } + interface JSDocImplementsTag extends JSDocTag { + readonly kind: SyntaxKind.JSDocImplementsTag; + readonly class: ExpressionWithTypeArguments & { + readonly expression: Identifier | PropertyAccessEntityNameExpression; + }; + } + interface JSDocAuthorTag extends JSDocTag { + readonly kind: SyntaxKind.JSDocAuthorTag; + } + interface JSDocDeprecatedTag extends JSDocTag { + kind: SyntaxKind.JSDocDeprecatedTag; + } + interface JSDocClassTag extends JSDocTag { + readonly kind: SyntaxKind.JSDocClassTag; + } + interface JSDocPublicTag extends JSDocTag { + readonly kind: SyntaxKind.JSDocPublicTag; + } + interface JSDocPrivateTag extends JSDocTag { + readonly kind: SyntaxKind.JSDocPrivateTag; + } + interface JSDocProtectedTag extends JSDocTag { + readonly kind: SyntaxKind.JSDocProtectedTag; + } + interface JSDocReadonlyTag extends JSDocTag { + readonly kind: SyntaxKind.JSDocReadonlyTag; + } + interface JSDocOverrideTag extends JSDocTag { + readonly kind: SyntaxKind.JSDocOverrideTag; + } + interface JSDocEnumTag extends JSDocTag, Declaration, LocalsContainer { + readonly kind: SyntaxKind.JSDocEnumTag; + readonly parent: JSDoc; + readonly typeExpression: JSDocTypeExpression; + } + interface JSDocThisTag extends JSDocTag { + readonly kind: SyntaxKind.JSDocThisTag; + readonly typeExpression: JSDocTypeExpression; + } + interface JSDocTemplateTag extends JSDocTag { + readonly kind: SyntaxKind.JSDocTemplateTag; + readonly constraint: JSDocTypeExpression | undefined; + readonly typeParameters: NodeArray; + } + interface JSDocSeeTag extends JSDocTag { + readonly kind: SyntaxKind.JSDocSeeTag; + readonly name?: JSDocNameReference; + } + interface JSDocReturnTag extends JSDocTag { + readonly kind: SyntaxKind.JSDocReturnTag; + readonly typeExpression?: JSDocTypeExpression; + } + interface JSDocTypeTag extends JSDocTag { + readonly kind: SyntaxKind.JSDocTypeTag; + readonly typeExpression: JSDocTypeExpression; + } + interface JSDocTypedefTag extends JSDocTag, NamedDeclaration, LocalsContainer { + readonly kind: SyntaxKind.JSDocTypedefTag; + readonly parent: JSDoc; + readonly fullName?: JSDocNamespaceDeclaration | Identifier; + readonly name?: Identifier; + readonly typeExpression?: JSDocTypeExpression | JSDocTypeLiteral; + } + interface JSDocCallbackTag extends JSDocTag, NamedDeclaration, LocalsContainer { + readonly kind: SyntaxKind.JSDocCallbackTag; + readonly parent: JSDoc; + readonly fullName?: JSDocNamespaceDeclaration | Identifier; + readonly name?: Identifier; + readonly typeExpression: JSDocSignature; + } + interface JSDocOverloadTag extends JSDocTag { + readonly kind: SyntaxKind.JSDocOverloadTag; + readonly parent: JSDoc; + readonly typeExpression: JSDocSignature; + } + interface JSDocThrowsTag extends JSDocTag { + readonly kind: SyntaxKind.JSDocThrowsTag; + readonly typeExpression?: JSDocTypeExpression; + } + interface JSDocSignature extends JSDocType, Declaration, JSDocContainer, LocalsContainer { + readonly kind: SyntaxKind.JSDocSignature; + readonly typeParameters?: readonly JSDocTemplateTag[]; + readonly parameters: readonly JSDocParameterTag[]; + readonly type: JSDocReturnTag | undefined; + } + interface JSDocPropertyLikeTag extends JSDocTag, Declaration { + readonly parent: JSDoc; + readonly name: EntityName; + readonly typeExpression?: JSDocTypeExpression; + /** Whether the property name came before the type -- non-standard for JSDoc, but Typescript-like */ + readonly isNameFirst: boolean; + readonly isBracketed: boolean; + } + interface JSDocPropertyTag extends JSDocPropertyLikeTag { + readonly kind: SyntaxKind.JSDocPropertyTag; + } + interface JSDocParameterTag extends JSDocPropertyLikeTag { + readonly kind: SyntaxKind.JSDocParameterTag; + } + interface JSDocTypeLiteral extends JSDocType, Declaration { + readonly kind: SyntaxKind.JSDocTypeLiteral; + readonly jsDocPropertyTags?: readonly JSDocPropertyLikeTag[]; + /** If true, then this type literal represents an *array* of its type. */ + readonly isArrayType: boolean; + } + interface JSDocSatisfiesTag extends JSDocTag { + readonly kind: SyntaxKind.JSDocSatisfiesTag; + readonly typeExpression: JSDocTypeExpression; + } + enum FlowFlags { + Unreachable = 1, + Start = 2, + BranchLabel = 4, + LoopLabel = 8, + Assignment = 16, + TrueCondition = 32, + FalseCondition = 64, + SwitchClause = 128, + ArrayMutation = 256, + Call = 512, + ReduceLabel = 1024, + Referenced = 2048, + Shared = 4096, + Label = 12, + Condition = 96 + } + type FlowNode = FlowStart | FlowLabel | FlowAssignment | FlowCondition | FlowSwitchClause | FlowArrayMutation | FlowCall | FlowReduceLabel; + interface FlowNodeBase { + flags: FlowFlags; + id?: number; + } + interface FlowStart extends FlowNodeBase { + node?: FunctionExpression | ArrowFunction | MethodDeclaration | GetAccessorDeclaration | SetAccessorDeclaration; + } + interface FlowLabel extends FlowNodeBase { + antecedents: FlowNode[] | undefined; + } + interface FlowAssignment extends FlowNodeBase { + node: Expression | VariableDeclaration | BindingElement; + antecedent: FlowNode; + } + interface FlowCall extends FlowNodeBase { + node: CallExpression; + antecedent: FlowNode; + } + interface FlowCondition extends FlowNodeBase { + node: Expression; + antecedent: FlowNode; + } + interface FlowSwitchClause extends FlowNodeBase { + switchStatement: SwitchStatement; + clauseStart: number; + clauseEnd: number; + antecedent: FlowNode; + } + interface FlowArrayMutation extends FlowNodeBase { + node: CallExpression | BinaryExpression; + antecedent: FlowNode; + } + interface FlowReduceLabel extends FlowNodeBase { + target: FlowLabel; + antecedents: FlowNode[]; + antecedent: FlowNode; + } + type FlowType = Type | IncompleteType; + interface IncompleteType { + flags: TypeFlags | 0; + type: Type; + } + interface AmdDependency { + path: string; + name?: string; + } + /** + * Subset of properties from SourceFile that are used in multiple utility functions + */ + interface SourceFileLike { + readonly text: string; + } + type ResolutionMode = ModuleKind.ESNext | ModuleKind.CommonJS | undefined; + interface SourceFile extends Declaration, LocalsContainer { + readonly kind: SyntaxKind.SourceFile; + readonly statements: NodeArray; + readonly endOfFileToken: Token; + fileName: string; + text: string; + amdDependencies: readonly AmdDependency[]; + moduleName?: string; + referencedFiles: readonly FileReference[]; + typeReferenceDirectives: readonly FileReference[]; + libReferenceDirectives: readonly FileReference[]; + languageVariant: LanguageVariant; + isDeclarationFile: boolean; + /** + * lib.d.ts should have a reference comment like + * + * /// + * + * If any other file has this comment, it signals not to include lib.d.ts + * because this containing file is intended to act as a default library. + */ + hasNoDefaultLib: boolean; + languageVersion: ScriptTarget; + /** + * When `module` is `Node16` or `NodeNext`, this field controls whether the + * source file in question is an ESNext-output-format file, or a CommonJS-output-format + * module. This is derived by the module resolver as it looks up the file, since + * it is derived from either the file extension of the module, or the containing + * `package.json` context, and affects both checking and emit. + * + * It is _public_ so that (pre)transformers can set this field, + * since it switches the builtin `node` module transform. Generally speaking, if unset, + * the field is treated as though it is `ModuleKind.CommonJS`. + * + * Note that this field is only set by the module resolution process when + * `moduleResolution` is `Node16` or `NodeNext`, which is implied by the `module` setting + * of `Node16` or `NodeNext`, respectively, but may be overriden (eg, by a `moduleResolution` + * of `node`). If so, this field will be unset and source files will be considered to be + * CommonJS-output-format by the node module transformer and type checker, regardless of extension or context. + */ + impliedNodeFormat?: ResolutionMode; + } + interface Bundle extends Node { + readonly kind: SyntaxKind.Bundle; + /** @deprecated */ readonly prepends: readonly (InputFiles | UnparsedSource)[]; + readonly sourceFiles: readonly SourceFile[]; + } + /** @deprecated */ + interface InputFiles extends Node { + readonly kind: SyntaxKind.InputFiles; + javascriptPath?: string; + javascriptText: string; + javascriptMapPath?: string; + javascriptMapText?: string; + declarationPath?: string; + declarationText: string; + declarationMapPath?: string; + declarationMapText?: string; + } + /** @deprecated */ + interface UnparsedSource extends Node { + readonly kind: SyntaxKind.UnparsedSource; + fileName: string; + text: string; + readonly prologues: readonly UnparsedPrologue[]; + helpers: readonly UnscopedEmitHelper[] | undefined; + referencedFiles: readonly FileReference[]; + typeReferenceDirectives: readonly FileReference[] | undefined; + libReferenceDirectives: readonly FileReference[]; + hasNoDefaultLib?: boolean; + sourceMapPath?: string; + sourceMapText?: string; + readonly syntheticReferences?: readonly UnparsedSyntheticReference[]; + readonly texts: readonly UnparsedSourceText[]; + } + /** @deprecated */ + type UnparsedSourceText = UnparsedPrepend | UnparsedTextLike; + /** @deprecated */ + type UnparsedNode = UnparsedPrologue | UnparsedSourceText | UnparsedSyntheticReference; + /** @deprecated */ + interface UnparsedSection extends Node { + readonly kind: SyntaxKind; + readonly parent: UnparsedSource; + readonly data?: string; + } + /** @deprecated */ + interface UnparsedPrologue extends UnparsedSection { + readonly kind: SyntaxKind.UnparsedPrologue; + readonly parent: UnparsedSource; + readonly data: string; + } + /** @deprecated */ + interface UnparsedPrepend extends UnparsedSection { + readonly kind: SyntaxKind.UnparsedPrepend; + readonly parent: UnparsedSource; + readonly data: string; + readonly texts: readonly UnparsedTextLike[]; + } + /** @deprecated */ + interface UnparsedTextLike extends UnparsedSection { + readonly kind: SyntaxKind.UnparsedText | SyntaxKind.UnparsedInternalText; + readonly parent: UnparsedSource; + } + /** @deprecated */ + interface UnparsedSyntheticReference extends UnparsedSection { + readonly kind: SyntaxKind.UnparsedSyntheticReference; + readonly parent: UnparsedSource; + } + interface JsonSourceFile extends SourceFile { + readonly statements: NodeArray; + } + interface TsConfigSourceFile extends JsonSourceFile { + extendedSourceFiles?: string[]; + } + interface JsonMinusNumericLiteral extends PrefixUnaryExpression { + readonly kind: SyntaxKind.PrefixUnaryExpression; + readonly operator: SyntaxKind.MinusToken; + readonly operand: NumericLiteral; + } + type JsonObjectExpression = ObjectLiteralExpression | ArrayLiteralExpression | JsonMinusNumericLiteral | NumericLiteral | StringLiteral | BooleanLiteral | NullLiteral; + interface JsonObjectExpressionStatement extends ExpressionStatement { + readonly expression: JsonObjectExpression; + } + interface ScriptReferenceHost { + getCompilerOptions(): CompilerOptions; + getSourceFile(fileName: string): SourceFile | undefined; + getSourceFileByPath(path: Path): SourceFile | undefined; + getCurrentDirectory(): string; + } + interface ParseConfigHost { + useCaseSensitiveFileNames: boolean; + readDirectory(rootDir: string, extensions: readonly string[], excludes: readonly string[] | undefined, includes: readonly string[], depth?: number): readonly string[]; + /** + * Gets a value indicating whether the specified path exists and is a file. + * @param path The path to test. + */ + fileExists(path: string): boolean; + readFile(path: string): string | undefined; + trace?(s: string): void; + } + /** + * Branded string for keeping track of when we've turned an ambiguous path + * specified like "./blah" to an absolute path to an actual + * tsconfig file, e.g. "/root/blah/tsconfig.json" + */ + type ResolvedConfigFileName = string & { + _isResolvedConfigFileName: never; + }; + interface WriteFileCallbackData { + } + type WriteFileCallback = (fileName: string, text: string, writeByteOrderMark: boolean, onError?: (message: string) => void, sourceFiles?: readonly SourceFile[], data?: WriteFileCallbackData) => void; + class OperationCanceledException { + } + interface CancellationToken { + isCancellationRequested(): boolean; + /** @throws OperationCanceledException if isCancellationRequested is true */ + throwIfCancellationRequested(): void; + } + interface Program extends ScriptReferenceHost { + getCurrentDirectory(): string; + /** + * Get a list of root file names that were passed to a 'createProgram' + */ + getRootFileNames(): readonly string[]; + /** + * Get a list of files in the program + */ + getSourceFiles(): readonly SourceFile[]; + /** + * Emits the JavaScript and declaration files. If targetSourceFile is not specified, then + * the JavaScript and declaration files will be produced for all the files in this program. + * If targetSourceFile is specified, then only the JavaScript and declaration for that + * specific file will be generated. + * + * If writeFile is not specified then the writeFile callback from the compiler host will be + * used for writing the JavaScript and declaration files. Otherwise, the writeFile parameter + * will be invoked when writing the JavaScript and declaration files. + */ + emit(targetSourceFile?: SourceFile, writeFile?: WriteFileCallback, cancellationToken?: CancellationToken, emitOnlyDtsFiles?: boolean, customTransformers?: CustomTransformers): EmitResult; + getOptionsDiagnostics(cancellationToken?: CancellationToken): readonly Diagnostic[]; + getGlobalDiagnostics(cancellationToken?: CancellationToken): readonly Diagnostic[]; + getSyntacticDiagnostics(sourceFile?: SourceFile, cancellationToken?: CancellationToken): readonly DiagnosticWithLocation[]; + /** The first time this is called, it will return global diagnostics (no location). */ + getSemanticDiagnostics(sourceFile?: SourceFile, cancellationToken?: CancellationToken): readonly Diagnostic[]; + getDeclarationDiagnostics(sourceFile?: SourceFile, cancellationToken?: CancellationToken): readonly DiagnosticWithLocation[]; + getConfigFileParsingDiagnostics(): readonly Diagnostic[]; + /** + * Gets a type checker that can be used to semantically analyze source files in the program. + */ + getTypeChecker(): TypeChecker; + getNodeCount(): number; + getIdentifierCount(): number; + getSymbolCount(): number; + getTypeCount(): number; + getInstantiationCount(): number; + getRelationCacheSizes(): { + assignable: number; + identity: number; + subtype: number; + strictSubtype: number; + }; + isSourceFileFromExternalLibrary(file: SourceFile): boolean; + isSourceFileDefaultLibrary(file: SourceFile): boolean; + getProjectReferences(): readonly ProjectReference[] | undefined; + getResolvedProjectReferences(): readonly (ResolvedProjectReference | undefined)[] | undefined; + } + interface ResolvedProjectReference { + commandLine: ParsedCommandLine; + sourceFile: SourceFile; + references?: readonly (ResolvedProjectReference | undefined)[]; + } + type CustomTransformerFactory = (context: TransformationContext) => CustomTransformer; + interface CustomTransformer { + transformSourceFile(node: SourceFile): SourceFile; + transformBundle(node: Bundle): Bundle; + } + interface CustomTransformers { + /** Custom transformers to evaluate before built-in .js transformations. */ + before?: (TransformerFactory | CustomTransformerFactory)[]; + /** Custom transformers to evaluate after built-in .js transformations. */ + after?: (TransformerFactory | CustomTransformerFactory)[]; + /** Custom transformers to evaluate after built-in .d.ts transformations. */ + afterDeclarations?: (TransformerFactory | CustomTransformerFactory)[]; + } + interface SourceMapSpan { + /** Line number in the .js file. */ + emittedLine: number; + /** Column number in the .js file. */ + emittedColumn: number; + /** Line number in the .ts file. */ + sourceLine: number; + /** Column number in the .ts file. */ + sourceColumn: number; + /** Optional name (index into names array) associated with this span. */ + nameIndex?: number; + /** .ts file (index into sources array) associated with this span */ + sourceIndex: number; + } + /** Return code used by getEmitOutput function to indicate status of the function */ + enum ExitStatus { + Success = 0, + DiagnosticsPresent_OutputsSkipped = 1, + DiagnosticsPresent_OutputsGenerated = 2, + InvalidProject_OutputsSkipped = 3, + ProjectReferenceCycle_OutputsSkipped = 4 + } + interface EmitResult { + emitSkipped: boolean; + /** Contains declaration emit diagnostics */ + diagnostics: readonly Diagnostic[]; + emittedFiles?: string[]; + } + interface TypeChecker { + getTypeOfSymbolAtLocation(symbol: Symbol, node: Node): Type; + getTypeOfSymbol(symbol: Symbol): Type; + getDeclaredTypeOfSymbol(symbol: Symbol): Type; + getPropertiesOfType(type: Type): Symbol[]; + getPropertyOfType(type: Type, propertyName: string): Symbol | undefined; + getPrivateIdentifierPropertyOfType(leftType: Type, name: string, location: Node): Symbol | undefined; + getIndexInfoOfType(type: Type, kind: IndexKind): IndexInfo | undefined; + getIndexInfosOfType(type: Type): readonly IndexInfo[]; + getIndexInfosOfIndexSymbol: (indexSymbol: Symbol) => IndexInfo[]; + getSignaturesOfType(type: Type, kind: SignatureKind): readonly Signature[]; + getIndexTypeOfType(type: Type, kind: IndexKind): Type | undefined; + getBaseTypes(type: InterfaceType): BaseType[]; + getBaseTypeOfLiteralType(type: Type): Type; + getWidenedType(type: Type): Type; + getReturnTypeOfSignature(signature: Signature): Type; + getNullableType(type: Type, flags: TypeFlags): Type; + getNonNullableType(type: Type): Type; + getTypeArguments(type: TypeReference): readonly Type[]; + /** Note that the resulting nodes cannot be checked. */ + typeToTypeNode(type: Type, enclosingDeclaration: Node | undefined, flags: NodeBuilderFlags | undefined): TypeNode | undefined; + /** Note that the resulting nodes cannot be checked. */ + signatureToSignatureDeclaration(signature: Signature, kind: SyntaxKind, enclosingDeclaration: Node | undefined, flags: NodeBuilderFlags | undefined): SignatureDeclaration & { + typeArguments?: NodeArray; + } | undefined; + /** Note that the resulting nodes cannot be checked. */ + indexInfoToIndexSignatureDeclaration(indexInfo: IndexInfo, enclosingDeclaration: Node | undefined, flags: NodeBuilderFlags | undefined): IndexSignatureDeclaration | undefined; + /** Note that the resulting nodes cannot be checked. */ + symbolToEntityName(symbol: Symbol, meaning: SymbolFlags, enclosingDeclaration: Node | undefined, flags: NodeBuilderFlags | undefined): EntityName | undefined; + /** Note that the resulting nodes cannot be checked. */ + symbolToExpression(symbol: Symbol, meaning: SymbolFlags, enclosingDeclaration: Node | undefined, flags: NodeBuilderFlags | undefined): Expression | undefined; + /** Note that the resulting nodes cannot be checked. */ + symbolToTypeParameterDeclarations(symbol: Symbol, enclosingDeclaration: Node | undefined, flags: NodeBuilderFlags | undefined): NodeArray | undefined; + /** Note that the resulting nodes cannot be checked. */ + symbolToParameterDeclaration(symbol: Symbol, enclosingDeclaration: Node | undefined, flags: NodeBuilderFlags | undefined): ParameterDeclaration | undefined; + /** Note that the resulting nodes cannot be checked. */ + typeParameterToDeclaration(parameter: TypeParameter, enclosingDeclaration: Node | undefined, flags: NodeBuilderFlags | undefined): TypeParameterDeclaration | undefined; + getSymbolsInScope(location: Node, meaning: SymbolFlags): Symbol[]; + getSymbolAtLocation(node: Node): Symbol | undefined; + getSymbolsOfParameterPropertyDeclaration(parameter: ParameterDeclaration, parameterName: string): Symbol[]; + /** + * The function returns the value (local variable) symbol of an identifier in the short-hand property assignment. + * This is necessary as an identifier in short-hand property assignment can contains two meaning: property name and property value. + */ + getShorthandAssignmentValueSymbol(location: Node | undefined): Symbol | undefined; + getExportSpecifierLocalTargetSymbol(location: ExportSpecifier | Identifier): Symbol | undefined; + /** + * If a symbol is a local symbol with an associated exported symbol, returns the exported symbol. + * Otherwise returns its input. + * For example, at `export type T = number;`: + * - `getSymbolAtLocation` at the location `T` will return the exported symbol for `T`. + * - But the result of `getSymbolsInScope` will contain the *local* symbol for `T`, not the exported symbol. + * - Calling `getExportSymbolOfSymbol` on that local symbol will return the exported symbol. + */ + getExportSymbolOfSymbol(symbol: Symbol): Symbol; + getPropertySymbolOfDestructuringAssignment(location: Identifier): Symbol | undefined; + getTypeOfAssignmentPattern(pattern: AssignmentPattern): Type; + getTypeAtLocation(node: Node): Type; + getTypeFromTypeNode(node: TypeNode): Type; + signatureToString(signature: Signature, enclosingDeclaration?: Node, flags?: TypeFormatFlags, kind?: SignatureKind): string; + typeToString(type: Type, enclosingDeclaration?: Node, flags?: TypeFormatFlags): string; + symbolToString(symbol: Symbol, enclosingDeclaration?: Node, meaning?: SymbolFlags, flags?: SymbolFormatFlags): string; + typePredicateToString(predicate: TypePredicate, enclosingDeclaration?: Node, flags?: TypeFormatFlags): string; + getFullyQualifiedName(symbol: Symbol): string; + getAugmentedPropertiesOfType(type: Type): Symbol[]; + getRootSymbols(symbol: Symbol): readonly Symbol[]; + getSymbolOfExpando(node: Node, allowDeclaration: boolean): Symbol | undefined; + getContextualType(node: Expression): Type | undefined; + /** + * returns unknownSignature in the case of an error. + * returns undefined if the node is not valid. + * @param argumentCount Apparent number of arguments, passed in case of a possibly incomplete call. This should come from an ArgumentListInfo. See `signatureHelp.ts`. + */ + getResolvedSignature(node: CallLikeExpression, candidatesOutArray?: Signature[], argumentCount?: number): Signature | undefined; + getSignatureFromDeclaration(declaration: SignatureDeclaration): Signature | undefined; + isImplementationOfOverload(node: SignatureDeclaration): boolean | undefined; + isUndefinedSymbol(symbol: Symbol): boolean; + isArgumentsSymbol(symbol: Symbol): boolean; + isUnknownSymbol(symbol: Symbol): boolean; + getConstantValue(node: EnumMember | PropertyAccessExpression | ElementAccessExpression): string | number | undefined; + isValidPropertyAccess(node: PropertyAccessExpression | QualifiedName | ImportTypeNode, propertyName: string): boolean; + /** Follow all aliases to get the original symbol. */ + getAliasedSymbol(symbol: Symbol): Symbol; + /** Follow a *single* alias to get the immediately aliased symbol. */ + getImmediateAliasedSymbol(symbol: Symbol): Symbol | undefined; + getExportsOfModule(moduleSymbol: Symbol): Symbol[]; + getJsxIntrinsicTagNamesAt(location: Node): Symbol[]; + isOptionalParameter(node: ParameterDeclaration): boolean; + getAmbientModules(): Symbol[]; + tryGetMemberInModuleExports(memberName: string, moduleSymbol: Symbol): Symbol | undefined; + getApparentType(type: Type): Type; + getBaseConstraintOfType(type: Type): Type | undefined; + getDefaultFromTypeParameter(type: Type): Type | undefined; + /** + * Gets the intrinsic `any` type. There are multiple types that act as `any` used internally in the compiler, + * so the type returned by this function should not be used in equality checks to determine if another type + * is `any`. Instead, use `type.flags & TypeFlags.Any`. + */ + getAnyType(): Type; + getStringType(): Type; + getStringLiteralType(value: string): StringLiteralType; + getNumberType(): Type; + getNumberLiteralType(value: number): NumberLiteralType; + getBigIntType(): Type; + getBooleanType(): Type; + getFalseType(): Type; + getTrueType(): Type; + getVoidType(): Type; + /** + * Gets the intrinsic `undefined` type. There are multiple types that act as `undefined` used internally in the compiler + * depending on compiler options, so the type returned by this function should not be used in equality checks to determine + * if another type is `undefined`. Instead, use `type.flags & TypeFlags.Undefined`. + */ + getUndefinedType(): Type; + /** + * Gets the intrinsic `null` type. There are multiple types that act as `null` used internally in the compiler, + * so the type returned by this function should not be used in equality checks to determine if another type + * is `null`. Instead, use `type.flags & TypeFlags.Null`. + */ + getNullType(): Type; + getESSymbolType(): Type; + /** + * Gets the intrinsic `never` type. There are multiple types that act as `never` used internally in the compiler, + * so the type returned by this function should not be used in equality checks to determine if another type + * is `never`. Instead, use `type.flags & TypeFlags.Never`. + */ + getNeverType(): Type; + /** + * True if this type is the `Array` or `ReadonlyArray` type from lib.d.ts. + * This function will _not_ return true if passed a type which + * extends `Array` (for example, the TypeScript AST's `NodeArray` type). + */ + isArrayType(type: Type): boolean; + /** + * True if this type is a tuple type. This function will _not_ return true if + * passed a type which extends from a tuple. + */ + isTupleType(type: Type): boolean; + /** + * True if this type is assignable to `ReadonlyArray`. + */ + isArrayLikeType(type: Type): boolean; + getTypePredicateOfSignature(signature: Signature): TypePredicate | undefined; + /** + * Depending on the operation performed, it may be appropriate to throw away the checker + * if the cancellation token is triggered. Typically, if it is used for error checking + * and the operation is cancelled, then it should be discarded, otherwise it is safe to keep. + */ + runWithCancellationToken(token: CancellationToken, cb: (checker: TypeChecker) => T): T; + } + enum NodeBuilderFlags { + None = 0, + NoTruncation = 1, + WriteArrayAsGenericType = 2, + GenerateNamesForShadowedTypeParams = 4, + UseStructuralFallback = 8, + ForbidIndexedAccessSymbolReferences = 16, + WriteTypeArgumentsOfSignature = 32, + UseFullyQualifiedType = 64, + UseOnlyExternalAliasing = 128, + SuppressAnyReturnType = 256, + WriteTypeParametersInQualifiedName = 512, + MultilineObjectLiterals = 1024, + WriteClassExpressionAsTypeLiteral = 2048, + UseTypeOfFunction = 4096, + OmitParameterModifiers = 8192, + UseAliasDefinedOutsideCurrentScope = 16384, + UseSingleQuotesForStringLiteralType = 268435456, + NoTypeReduction = 536870912, + OmitThisParameter = 33554432, + AllowThisInObjectLiteral = 32768, + AllowQualifiedNameInPlaceOfIdentifier = 65536, + AllowAnonymousIdentifier = 131072, + AllowEmptyUnionOrIntersection = 262144, + AllowEmptyTuple = 524288, + AllowUniqueESSymbolType = 1048576, + AllowEmptyIndexInfoType = 2097152, + AllowNodeModulesRelativePaths = 67108864, + IgnoreErrors = 70221824, + InObjectTypeLiteral = 4194304, + InTypeAlias = 8388608, + InInitialEntityName = 16777216 + } + enum TypeFormatFlags { + None = 0, + NoTruncation = 1, + WriteArrayAsGenericType = 2, + UseStructuralFallback = 8, + WriteTypeArgumentsOfSignature = 32, + UseFullyQualifiedType = 64, + SuppressAnyReturnType = 256, + MultilineObjectLiterals = 1024, + WriteClassExpressionAsTypeLiteral = 2048, + UseTypeOfFunction = 4096, + OmitParameterModifiers = 8192, + UseAliasDefinedOutsideCurrentScope = 16384, + UseSingleQuotesForStringLiteralType = 268435456, + NoTypeReduction = 536870912, + OmitThisParameter = 33554432, + AllowUniqueESSymbolType = 1048576, + AddUndefined = 131072, + WriteArrowStyleSignature = 262144, + InArrayType = 524288, + InElementType = 2097152, + InFirstTypeArgument = 4194304, + InTypeAlias = 8388608, + NodeBuilderFlagsMask = 848330091 + } + enum SymbolFormatFlags { + None = 0, + WriteTypeParametersOrArguments = 1, + UseOnlyExternalAliasing = 2, + AllowAnyNodeKind = 4, + UseAliasDefinedOutsideCurrentScope = 8 + } + enum TypePredicateKind { + This = 0, + Identifier = 1, + AssertsThis = 2, + AssertsIdentifier = 3 + } + interface TypePredicateBase { + kind: TypePredicateKind; + type: Type | undefined; + } + interface ThisTypePredicate extends TypePredicateBase { + kind: TypePredicateKind.This; + parameterName: undefined; + parameterIndex: undefined; + type: Type; + } + interface IdentifierTypePredicate extends TypePredicateBase { + kind: TypePredicateKind.Identifier; + parameterName: string; + parameterIndex: number; + type: Type; + } + interface AssertsThisTypePredicate extends TypePredicateBase { + kind: TypePredicateKind.AssertsThis; + parameterName: undefined; + parameterIndex: undefined; + type: Type | undefined; + } + interface AssertsIdentifierTypePredicate extends TypePredicateBase { + kind: TypePredicateKind.AssertsIdentifier; + parameterName: string; + parameterIndex: number; + type: Type | undefined; + } + type TypePredicate = ThisTypePredicate | IdentifierTypePredicate | AssertsThisTypePredicate | AssertsIdentifierTypePredicate; + enum SymbolFlags { + None = 0, + FunctionScopedVariable = 1, + BlockScopedVariable = 2, + Property = 4, + EnumMember = 8, + Function = 16, + Class = 32, + Interface = 64, + ConstEnum = 128, + RegularEnum = 256, + ValueModule = 512, + NamespaceModule = 1024, + TypeLiteral = 2048, + ObjectLiteral = 4096, + Method = 8192, + Constructor = 16384, + GetAccessor = 32768, + SetAccessor = 65536, + Signature = 131072, + TypeParameter = 262144, + TypeAlias = 524288, + ExportValue = 1048576, + Alias = 2097152, + Prototype = 4194304, + ExportStar = 8388608, + Optional = 16777216, + Transient = 33554432, + Assignment = 67108864, + ModuleExports = 134217728, + Enum = 384, + Variable = 3, + Value = 111551, + Type = 788968, + Namespace = 1920, + Module = 1536, + Accessor = 98304, + FunctionScopedVariableExcludes = 111550, + BlockScopedVariableExcludes = 111551, + ParameterExcludes = 111551, + PropertyExcludes = 0, + EnumMemberExcludes = 900095, + FunctionExcludes = 110991, + ClassExcludes = 899503, + InterfaceExcludes = 788872, + RegularEnumExcludes = 899327, + ConstEnumExcludes = 899967, + ValueModuleExcludes = 110735, + NamespaceModuleExcludes = 0, + MethodExcludes = 103359, + GetAccessorExcludes = 46015, + SetAccessorExcludes = 78783, + AccessorExcludes = 13247, + TypeParameterExcludes = 526824, + TypeAliasExcludes = 788968, + AliasExcludes = 2097152, + ModuleMember = 2623475, + ExportHasLocal = 944, + BlockScoped = 418, + PropertyOrAccessor = 98308, + ClassMember = 106500 + } + interface Symbol { + flags: SymbolFlags; + escapedName: __String; + declarations?: Declaration[]; + valueDeclaration?: Declaration; + members?: SymbolTable; + exports?: SymbolTable; + globalExports?: SymbolTable; + } + enum InternalSymbolName { + Call = "__call", + Constructor = "__constructor", + New = "__new", + Index = "__index", + ExportStar = "__export", + Global = "__global", + Missing = "__missing", + Type = "__type", + Object = "__object", + JSXAttributes = "__jsxAttributes", + Class = "__class", + Function = "__function", + Computed = "__computed", + Resolving = "__resolving__", + ExportEquals = "export=", + Default = "default", + This = "this" + } + /** + * This represents a string whose leading underscore have been escaped by adding extra leading underscores. + * The shape of this brand is rather unique compared to others we've used. + * Instead of just an intersection of a string and an object, it is that union-ed + * with an intersection of void and an object. This makes it wholly incompatible + * with a normal string (which is good, it cannot be misused on assignment or on usage), + * while still being comparable with a normal string via === (also good) and castable from a string. + */ + type __String = (string & { + __escapedIdentifier: void; + }) | (void & { + __escapedIdentifier: void; + }) | InternalSymbolName; + /** @deprecated Use ReadonlyMap<__String, T> instead. */ + type ReadonlyUnderscoreEscapedMap = ReadonlyMap<__String, T>; + /** @deprecated Use Map<__String, T> instead. */ + type UnderscoreEscapedMap = Map<__String, T>; + /** SymbolTable based on ES6 Map interface. */ + type SymbolTable = Map<__String, Symbol>; + enum TypeFlags { + Any = 1, + Unknown = 2, + String = 4, + Number = 8, + Boolean = 16, + Enum = 32, + BigInt = 64, + StringLiteral = 128, + NumberLiteral = 256, + BooleanLiteral = 512, + EnumLiteral = 1024, + BigIntLiteral = 2048, + ESSymbol = 4096, + UniqueESSymbol = 8192, + Void = 16384, + Undefined = 32768, + Null = 65536, + Never = 131072, + TypeParameter = 262144, + Object = 524288, + Union = 1048576, + Intersection = 2097152, + Index = 4194304, + IndexedAccess = 8388608, + Conditional = 16777216, + Substitution = 33554432, + NonPrimitive = 67108864, + TemplateLiteral = 134217728, + StringMapping = 268435456, + Literal = 2944, + Unit = 109472, + Freshable = 2976, + StringOrNumberLiteral = 384, + PossiblyFalsy = 117724, + StringLike = 402653316, + NumberLike = 296, + BigIntLike = 2112, + BooleanLike = 528, + EnumLike = 1056, + ESSymbolLike = 12288, + VoidLike = 49152, + UnionOrIntersection = 3145728, + StructuredType = 3670016, + TypeVariable = 8650752, + InstantiableNonPrimitive = 58982400, + InstantiablePrimitive = 406847488, + Instantiable = 465829888, + StructuredOrInstantiable = 469499904, + Narrowable = 536624127 + } + type DestructuringPattern = BindingPattern | ObjectLiteralExpression | ArrayLiteralExpression; + interface Type { + flags: TypeFlags; + symbol: Symbol; + pattern?: DestructuringPattern; + aliasSymbol?: Symbol; + aliasTypeArguments?: readonly Type[]; + } + interface FreshableType extends Type { + freshType: FreshableType; + regularType: FreshableType; + } + interface LiteralType extends FreshableType { + value: string | number | PseudoBigInt; + } + interface UniqueESSymbolType extends Type { + symbol: Symbol; + escapedName: __String; + } + interface StringLiteralType extends LiteralType { + value: string; + } + interface NumberLiteralType extends LiteralType { + value: number; + } + interface BigIntLiteralType extends LiteralType { + value: PseudoBigInt; + } + interface EnumType extends FreshableType { + } + enum ObjectFlags { + None = 0, + Class = 1, + Interface = 2, + Reference = 4, + Tuple = 8, + Anonymous = 16, + Mapped = 32, + Instantiated = 64, + ObjectLiteral = 128, + EvolvingArray = 256, + ObjectLiteralPatternWithComputedProperties = 512, + ReverseMapped = 1024, + JsxAttributes = 2048, + JSLiteral = 4096, + FreshLiteral = 8192, + ArrayLiteral = 16384, + ClassOrInterface = 3, + ContainsSpread = 2097152, + ObjectRestType = 4194304, + InstantiationExpressionType = 8388608 + } + interface ObjectType extends Type { + objectFlags: ObjectFlags; + } + /** Class and interface types (ObjectFlags.Class and ObjectFlags.Interface). */ + interface InterfaceType extends ObjectType { + typeParameters: TypeParameter[] | undefined; + outerTypeParameters: TypeParameter[] | undefined; + localTypeParameters: TypeParameter[] | undefined; + thisType: TypeParameter | undefined; + } + type BaseType = ObjectType | IntersectionType | TypeVariable; + interface InterfaceTypeWithDeclaredMembers extends InterfaceType { + declaredProperties: Symbol[]; + declaredCallSignatures: Signature[]; + declaredConstructSignatures: Signature[]; + declaredIndexInfos: IndexInfo[]; + } + /** + * Type references (ObjectFlags.Reference). When a class or interface has type parameters or + * a "this" type, references to the class or interface are made using type references. The + * typeArguments property specifies the types to substitute for the type parameters of the + * class or interface and optionally includes an extra element that specifies the type to + * substitute for "this" in the resulting instantiation. When no extra argument is present, + * the type reference itself is substituted for "this". The typeArguments property is undefined + * if the class or interface has no type parameters and the reference isn't specifying an + * explicit "this" argument. + */ + interface TypeReference extends ObjectType { + target: GenericType; + node?: TypeReferenceNode | ArrayTypeNode | TupleTypeNode; + } + interface DeferredTypeReference extends TypeReference { + } + interface GenericType extends InterfaceType, TypeReference { + } + enum ElementFlags { + Required = 1, + Optional = 2, + Rest = 4, + Variadic = 8, + Fixed = 3, + Variable = 12, + NonRequired = 14, + NonRest = 11 + } + interface TupleType extends GenericType { + elementFlags: readonly ElementFlags[]; + /** Number of required or variadic elements */ + minLength: number; + /** Number of initial required or optional elements */ + fixedLength: number; + /** True if tuple has any rest or variadic elements */ + hasRestElement: boolean; + combinedFlags: ElementFlags; + readonly: boolean; + labeledElementDeclarations?: readonly (NamedTupleMember | ParameterDeclaration)[]; + } + interface TupleTypeReference extends TypeReference { + target: TupleType; + } + interface UnionOrIntersectionType extends Type { + types: Type[]; + } + interface UnionType extends UnionOrIntersectionType { + } + interface IntersectionType extends UnionOrIntersectionType { + } + type StructuredType = ObjectType | UnionType | IntersectionType; + interface EvolvingArrayType extends ObjectType { + elementType: Type; + finalArrayType?: Type; + } + interface InstantiableType extends Type { + } + interface TypeParameter extends InstantiableType { + } + interface IndexedAccessType extends InstantiableType { + objectType: Type; + indexType: Type; + constraint?: Type; + simplifiedForReading?: Type; + simplifiedForWriting?: Type; + } + type TypeVariable = TypeParameter | IndexedAccessType; + interface IndexType extends InstantiableType { + type: InstantiableType | UnionOrIntersectionType; + } + interface ConditionalRoot { + node: ConditionalTypeNode; + checkType: Type; + extendsType: Type; + isDistributive: boolean; + inferTypeParameters?: TypeParameter[]; + outerTypeParameters?: TypeParameter[]; + instantiations?: Map; + aliasSymbol?: Symbol; + aliasTypeArguments?: Type[]; + } + interface ConditionalType extends InstantiableType { + root: ConditionalRoot; + checkType: Type; + extendsType: Type; + resolvedTrueType?: Type; + resolvedFalseType?: Type; + } + interface TemplateLiteralType extends InstantiableType { + texts: readonly string[]; + types: readonly Type[]; + } + interface StringMappingType extends InstantiableType { + symbol: Symbol; + type: Type; + } + interface SubstitutionType extends InstantiableType { + objectFlags: ObjectFlags; + baseType: Type; + constraint: Type; + } + enum SignatureKind { + Call = 0, + Construct = 1 + } + interface Signature { + declaration?: SignatureDeclaration | JSDocSignature; + typeParameters?: readonly TypeParameter[]; + parameters: readonly Symbol[]; + } + enum IndexKind { + String = 0, + Number = 1 + } + interface IndexInfo { + keyType: Type; + type: Type; + isReadonly: boolean; + declaration?: IndexSignatureDeclaration; + } + enum InferencePriority { + None = 0, + NakedTypeVariable = 1, + SpeculativeTuple = 2, + SubstituteSource = 4, + HomomorphicMappedType = 8, + PartialHomomorphicMappedType = 16, + MappedTypeConstraint = 32, + ContravariantConditional = 64, + ReturnType = 128, + LiteralKeyof = 256, + NoConstraints = 512, + AlwaysStrict = 1024, + MaxValue = 2048, + PriorityImpliesCombination = 416, + Circularity = -1 + } + interface FileExtensionInfo { + extension: string; + isMixedContent: boolean; + scriptKind?: ScriptKind; + } + interface DiagnosticMessage { + key: string; + category: DiagnosticCategory; + code: number; + message: string; + reportsUnnecessary?: {}; + reportsDeprecated?: {}; + } + /** + * A linked list of formatted diagnostic messages to be used as part of a multiline message. + * It is built from the bottom up, leaving the head to be the "main" diagnostic. + * While it seems that DiagnosticMessageChain is structurally similar to DiagnosticMessage, + * the difference is that messages are all preformatted in DMC. + */ + interface DiagnosticMessageChain { + messageText: string; + category: DiagnosticCategory; + code: number; + next?: DiagnosticMessageChain[]; + } + interface Diagnostic extends DiagnosticRelatedInformation { + /** May store more in future. For now, this will simply be `true` to indicate when a diagnostic is an unused-identifier diagnostic. */ + reportsUnnecessary?: {}; + reportsDeprecated?: {}; + source?: string; + relatedInformation?: DiagnosticRelatedInformation[]; + } + interface DiagnosticRelatedInformation { + category: DiagnosticCategory; + code: number; + file: SourceFile | undefined; + start: number | undefined; + length: number | undefined; + messageText: string | DiagnosticMessageChain; + } + interface DiagnosticWithLocation extends Diagnostic { + file: SourceFile; + start: number; + length: number; + } + enum DiagnosticCategory { + Warning = 0, + Error = 1, + Suggestion = 2, + Message = 3 + } + enum ModuleResolutionKind { + Classic = 1, + /** + * @deprecated + * `NodeJs` was renamed to `Node10` to better reflect the version of Node that it targets. + * Use the new name or consider switching to a modern module resolution target. + */ + NodeJs = 2, + Node10 = 2, + Node16 = 3, + NodeNext = 99, + Bundler = 100 + } + enum ModuleDetectionKind { + /** + * Files with imports, exports and/or import.meta are considered modules + */ + Legacy = 1, + /** + * Legacy, but also files with jsx under react-jsx or react-jsxdev and esm mode files under moduleResolution: node16+ + */ + Auto = 2, + /** + * Consider all non-declaration files modules, regardless of present syntax + */ + Force = 3 + } + interface PluginImport { + name: string; + } + interface ProjectReference { + /** A normalized path on disk */ + path: string; + /** The path as the user originally wrote it */ + originalPath?: string; + /** True if the output of this reference should be prepended to the output of this project. Only valid for --outFile compilations */ + prepend?: boolean; + /** True if it is intended that this reference form a circularity */ + circular?: boolean; + } + enum WatchFileKind { + FixedPollingInterval = 0, + PriorityPollingInterval = 1, + DynamicPriorityPolling = 2, + FixedChunkSizePolling = 3, + UseFsEvents = 4, + UseFsEventsOnParentDirectory = 5 + } + enum WatchDirectoryKind { + UseFsEvents = 0, + FixedPollingInterval = 1, + DynamicPriorityPolling = 2, + FixedChunkSizePolling = 3 + } + enum PollingWatchKind { + FixedInterval = 0, + PriorityInterval = 1, + DynamicPriority = 2, + FixedChunkSize = 3 + } + type CompilerOptionsValue = string | number | boolean | (string | number)[] | string[] | MapLike | PluginImport[] | ProjectReference[] | null | undefined; + interface CompilerOptions { + allowImportingTsExtensions?: boolean; + allowJs?: boolean; + allowArbitraryExtensions?: boolean; + allowSyntheticDefaultImports?: boolean; + allowUmdGlobalAccess?: boolean; + allowUnreachableCode?: boolean; + allowUnusedLabels?: boolean; + alwaysStrict?: boolean; + baseUrl?: string; + charset?: string; + checkJs?: boolean; + customConditions?: string[]; + declaration?: boolean; + declarationMap?: boolean; + emitDeclarationOnly?: boolean; + declarationDir?: string; + disableSizeLimit?: boolean; + disableSourceOfProjectReferenceRedirect?: boolean; + disableSolutionSearching?: boolean; + disableReferencedProjectLoad?: boolean; + downlevelIteration?: boolean; + emitBOM?: boolean; + emitDecoratorMetadata?: boolean; + exactOptionalPropertyTypes?: boolean; + experimentalDecorators?: boolean; + forceConsistentCasingInFileNames?: boolean; + ignoreDeprecations?: string; + importHelpers?: boolean; + importsNotUsedAsValues?: ImportsNotUsedAsValues; + inlineSourceMap?: boolean; + inlineSources?: boolean; + isolatedModules?: boolean; + jsx?: JsxEmit; + keyofStringsOnly?: boolean; + lib?: string[]; + locale?: string; + mapRoot?: string; + maxNodeModuleJsDepth?: number; + module?: ModuleKind; + moduleResolution?: ModuleResolutionKind; + moduleSuffixes?: string[]; + moduleDetection?: ModuleDetectionKind; + newLine?: NewLineKind; + noEmit?: boolean; + noEmitHelpers?: boolean; + noEmitOnError?: boolean; + noErrorTruncation?: boolean; + noFallthroughCasesInSwitch?: boolean; + noImplicitAny?: boolean; + noImplicitReturns?: boolean; + noImplicitThis?: boolean; + noStrictGenericChecks?: boolean; + noUnusedLocals?: boolean; + noUnusedParameters?: boolean; + noImplicitUseStrict?: boolean; + noPropertyAccessFromIndexSignature?: boolean; + assumeChangesOnlyAffectDirectDependencies?: boolean; + noLib?: boolean; + noResolve?: boolean; + noUncheckedIndexedAccess?: boolean; + out?: string; + outDir?: string; + outFile?: string; + paths?: MapLike; + preserveConstEnums?: boolean; + noImplicitOverride?: boolean; + preserveSymlinks?: boolean; + preserveValueImports?: boolean; + project?: string; + reactNamespace?: string; + jsxFactory?: string; + jsxFragmentFactory?: string; + jsxImportSource?: string; + composite?: boolean; + incremental?: boolean; + tsBuildInfoFile?: string; + removeComments?: boolean; + resolvePackageJsonExports?: boolean; + resolvePackageJsonImports?: boolean; + rootDir?: string; + rootDirs?: string[]; + skipLibCheck?: boolean; + skipDefaultLibCheck?: boolean; + sourceMap?: boolean; + sourceRoot?: string; + strict?: boolean; + strictFunctionTypes?: boolean; + strictBindCallApply?: boolean; + strictNullChecks?: boolean; + strictPropertyInitialization?: boolean; + stripInternal?: boolean; + suppressExcessPropertyErrors?: boolean; + suppressImplicitAnyIndexErrors?: boolean; + target?: ScriptTarget; + traceResolution?: boolean; + useUnknownInCatchVariables?: boolean; + resolveJsonModule?: boolean; + types?: string[]; + /** Paths used to compute primary types search locations */ + typeRoots?: string[]; + verbatimModuleSyntax?: boolean; + esModuleInterop?: boolean; + useDefineForClassFields?: boolean; + [option: string]: CompilerOptionsValue | TsConfigSourceFile | undefined; + } + interface WatchOptions { + watchFile?: WatchFileKind; + watchDirectory?: WatchDirectoryKind; + fallbackPolling?: PollingWatchKind; + synchronousWatchDirectory?: boolean; + excludeDirectories?: string[]; + excludeFiles?: string[]; + [option: string]: CompilerOptionsValue | undefined; + } + interface TypeAcquisition { + enable?: boolean; + include?: string[]; + exclude?: string[]; + disableFilenameBasedTypeAcquisition?: boolean; + [option: string]: CompilerOptionsValue | undefined; + } + enum ModuleKind { + None = 0, + CommonJS = 1, + AMD = 2, + UMD = 3, + System = 4, + ES2015 = 5, + ES2020 = 6, + ES2022 = 7, + ESNext = 99, + Node16 = 100, + NodeNext = 199 + } + enum JsxEmit { + None = 0, + Preserve = 1, + React = 2, + ReactNative = 3, + ReactJSX = 4, + ReactJSXDev = 5 + } + enum ImportsNotUsedAsValues { + Remove = 0, + Preserve = 1, + Error = 2 + } + enum NewLineKind { + CarriageReturnLineFeed = 0, + LineFeed = 1 + } + interface LineAndCharacter { + /** 0-based. */ + line: number; + character: number; + } + enum ScriptKind { + Unknown = 0, + JS = 1, + JSX = 2, + TS = 3, + TSX = 4, + External = 5, + JSON = 6, + /** + * Used on extensions that doesn't define the ScriptKind but the content defines it. + * Deferred extensions are going to be included in all project contexts. + */ + Deferred = 7 + } + enum ScriptTarget { + ES3 = 0, + ES5 = 1, + ES2015 = 2, + ES2016 = 3, + ES2017 = 4, + ES2018 = 5, + ES2019 = 6, + ES2020 = 7, + ES2021 = 8, + ES2022 = 9, + ESNext = 99, + JSON = 100, + Latest = 99 + } + enum LanguageVariant { + Standard = 0, + JSX = 1 + } + /** Either a parsed command line or a parsed tsconfig.json */ + interface ParsedCommandLine { + options: CompilerOptions; + typeAcquisition?: TypeAcquisition; + fileNames: string[]; + projectReferences?: readonly ProjectReference[]; + watchOptions?: WatchOptions; + raw?: any; + errors: Diagnostic[]; + wildcardDirectories?: MapLike; + compileOnSave?: boolean; + } + enum WatchDirectoryFlags { + None = 0, + Recursive = 1 + } + interface CreateProgramOptions { + rootNames: readonly string[]; + options: CompilerOptions; + projectReferences?: readonly ProjectReference[]; + host?: CompilerHost; + oldProgram?: Program; + configFileParsingDiagnostics?: readonly Diagnostic[]; + } + interface ModuleResolutionHost { + fileExists(fileName: string): boolean; + readFile(fileName: string): string | undefined; + trace?(s: string): void; + directoryExists?(directoryName: string): boolean; + /** + * Resolve a symbolic link. + * @see https://nodejs.org/api/fs.html#fs_fs_realpathsync_path_options + */ + realpath?(path: string): string; + getCurrentDirectory?(): string; + getDirectories?(path: string): string[]; + useCaseSensitiveFileNames?: boolean | (() => boolean) | undefined; + } + /** + * Used by services to specify the minimum host area required to set up source files under any compilation settings + */ + interface MinimalResolutionCacheHost extends ModuleResolutionHost { + getCompilationSettings(): CompilerOptions; + getCompilerHost?(): CompilerHost | undefined; + } + /** + * Represents the result of module resolution. + * Module resolution will pick up tsx/jsx/js files even if '--jsx' and '--allowJs' are turned off. + * The Program will then filter results based on these flags. + * + * Prefer to return a `ResolvedModuleFull` so that the file type does not have to be inferred. + */ + interface ResolvedModule { + /** Path of the file the module was resolved to. */ + resolvedFileName: string; + /** True if `resolvedFileName` comes from `node_modules`. */ + isExternalLibraryImport?: boolean; + /** + * True if the original module reference used a .ts extension to refer directly to a .ts file, + * which should produce an error during checking if emit is enabled. + */ + resolvedUsingTsExtension?: boolean; + } + /** + * ResolvedModule with an explicitly provided `extension` property. + * Prefer this over `ResolvedModule`. + * If changing this, remember to change `moduleResolutionIsEqualTo`. + */ + interface ResolvedModuleFull extends ResolvedModule { + /** + * Extension of resolvedFileName. This must match what's at the end of resolvedFileName. + * This is optional for backwards-compatibility, but will be added if not provided. + */ + extension: string; + packageId?: PackageId; + } + /** + * Unique identifier with a package name and version. + * If changing this, remember to change `packageIdIsEqual`. + */ + interface PackageId { + /** + * Name of the package. + * Should not include `@types`. + * If accessing a non-index file, this should include its name e.g. "foo/bar". + */ + name: string; + /** + * Name of a submodule within this package. + * May be "". + */ + subModuleName: string; + /** Version of the package, e.g. "1.2.3" */ + version: string; + } + enum Extension { + Ts = ".ts", + Tsx = ".tsx", + Dts = ".d.ts", + Js = ".js", + Jsx = ".jsx", + Json = ".json", + TsBuildInfo = ".tsbuildinfo", + Mjs = ".mjs", + Mts = ".mts", + Dmts = ".d.mts", + Cjs = ".cjs", + Cts = ".cts", + Dcts = ".d.cts" + } + interface ResolvedModuleWithFailedLookupLocations { + readonly resolvedModule: ResolvedModuleFull | undefined; + } + interface ResolvedTypeReferenceDirective { + primary: boolean; + resolvedFileName: string | undefined; + packageId?: PackageId; + /** True if `resolvedFileName` comes from `node_modules`. */ + isExternalLibraryImport?: boolean; + } + interface ResolvedTypeReferenceDirectiveWithFailedLookupLocations { + readonly resolvedTypeReferenceDirective: ResolvedTypeReferenceDirective | undefined; + } + interface CompilerHost extends ModuleResolutionHost { + getSourceFile(fileName: string, languageVersionOrOptions: ScriptTarget | CreateSourceFileOptions, onError?: (message: string) => void, shouldCreateNewSourceFile?: boolean): SourceFile | undefined; + getSourceFileByPath?(fileName: string, path: Path, languageVersionOrOptions: ScriptTarget | CreateSourceFileOptions, onError?: (message: string) => void, shouldCreateNewSourceFile?: boolean): SourceFile | undefined; + getCancellationToken?(): CancellationToken; + getDefaultLibFileName(options: CompilerOptions): string; + getDefaultLibLocation?(): string; + writeFile: WriteFileCallback; + getCurrentDirectory(): string; + getCanonicalFileName(fileName: string): string; + useCaseSensitiveFileNames(): boolean; + getNewLine(): string; + readDirectory?(rootDir: string, extensions: readonly string[], excludes: readonly string[] | undefined, includes: readonly string[], depth?: number): string[]; + /** @deprecated supply resolveModuleNameLiterals instead for resolution that can handle newer resolution modes like nodenext */ + resolveModuleNames?(moduleNames: string[], containingFile: string, reusedNames: string[] | undefined, redirectedReference: ResolvedProjectReference | undefined, options: CompilerOptions, containingSourceFile?: SourceFile): (ResolvedModule | undefined)[]; + /** + * Returns the module resolution cache used by a provided `resolveModuleNames` implementation so that any non-name module resolution operations (eg, package.json lookup) can reuse it + */ + getModuleResolutionCache?(): ModuleResolutionCache | undefined; + /** + * @deprecated supply resolveTypeReferenceDirectiveReferences instead for resolution that can handle newer resolution modes like nodenext + * + * This method is a companion for 'resolveModuleNames' and is used to resolve 'types' references to actual type declaration files + */ + resolveTypeReferenceDirectives?(typeReferenceDirectiveNames: string[] | readonly FileReference[], containingFile: string, redirectedReference: ResolvedProjectReference | undefined, options: CompilerOptions, containingFileMode?: ResolutionMode): (ResolvedTypeReferenceDirective | undefined)[]; + resolveModuleNameLiterals?(moduleLiterals: readonly StringLiteralLike[], containingFile: string, redirectedReference: ResolvedProjectReference | undefined, options: CompilerOptions, containingSourceFile: SourceFile, reusedNames: readonly StringLiteralLike[] | undefined): readonly ResolvedModuleWithFailedLookupLocations[]; + resolveTypeReferenceDirectiveReferences?(typeDirectiveReferences: readonly T[], containingFile: string, redirectedReference: ResolvedProjectReference | undefined, options: CompilerOptions, containingSourceFile: SourceFile | undefined, reusedNames: readonly T[] | undefined): readonly ResolvedTypeReferenceDirectiveWithFailedLookupLocations[]; + getEnvironmentVariable?(name: string): string | undefined; + /** If provided along with custom resolveModuleNames or resolveTypeReferenceDirectives, used to determine if unchanged file path needs to re-resolve modules/type reference directives */ + hasInvalidatedResolutions?(filePath: Path): boolean; + createHash?(data: string): string; + getParsedCommandLine?(fileName: string): ParsedCommandLine | undefined; + } + interface SourceMapRange extends TextRange { + source?: SourceMapSource; + } + interface SourceMapSource { + fileName: string; + text: string; + skipTrivia?: (pos: number) => number; + } + enum EmitFlags { + None = 0, + SingleLine = 1, + MultiLine = 2, + AdviseOnEmitNode = 4, + NoSubstitution = 8, + CapturesThis = 16, + NoLeadingSourceMap = 32, + NoTrailingSourceMap = 64, + NoSourceMap = 96, + NoNestedSourceMaps = 128, + NoTokenLeadingSourceMaps = 256, + NoTokenTrailingSourceMaps = 512, + NoTokenSourceMaps = 768, + NoLeadingComments = 1024, + NoTrailingComments = 2048, + NoComments = 3072, + NoNestedComments = 4096, + HelperName = 8192, + ExportName = 16384, + LocalName = 32768, + InternalName = 65536, + Indented = 131072, + NoIndentation = 262144, + AsyncFunctionBody = 524288, + ReuseTempVariableScope = 1048576, + CustomPrologue = 2097152, + NoHoisting = 4194304, + Iterator = 8388608, + NoAsciiEscaping = 16777216 + } + interface EmitHelperBase { + readonly name: string; + readonly scoped: boolean; + readonly text: string | ((node: EmitHelperUniqueNameCallback) => string); + readonly priority?: number; + readonly dependencies?: EmitHelper[]; + } + interface ScopedEmitHelper extends EmitHelperBase { + readonly scoped: true; + } + interface UnscopedEmitHelper extends EmitHelperBase { + readonly scoped: false; + readonly text: string; + } + type EmitHelper = ScopedEmitHelper | UnscopedEmitHelper; + type EmitHelperUniqueNameCallback = (name: string) => string; + enum EmitHint { + SourceFile = 0, + Expression = 1, + IdentifierName = 2, + MappedTypeParameter = 3, + Unspecified = 4, + EmbeddedStatement = 5, + JsxAttributeValue = 6 + } + enum OuterExpressionKinds { + Parentheses = 1, + TypeAssertions = 2, + NonNullAssertions = 4, + PartiallyEmittedExpressions = 8, + Assertions = 6, + All = 15, + ExcludeJSDocTypeAssertion = 16 + } + type TypeOfTag = "undefined" | "number" | "bigint" | "boolean" | "string" | "symbol" | "object" | "function"; + interface NodeFactory { + createNodeArray(elements?: readonly T[], hasTrailingComma?: boolean): NodeArray; + createNumericLiteral(value: string | number, numericLiteralFlags?: TokenFlags): NumericLiteral; + createBigIntLiteral(value: string | PseudoBigInt): BigIntLiteral; + createStringLiteral(text: string, isSingleQuote?: boolean): StringLiteral; + createStringLiteralFromNode(sourceNode: PropertyNameLiteral | PrivateIdentifier, isSingleQuote?: boolean): StringLiteral; + createRegularExpressionLiteral(text: string): RegularExpressionLiteral; + createIdentifier(text: string): Identifier; + /** + * Create a unique temporary variable. + * @param recordTempVariable An optional callback used to record the temporary variable name. This + * should usually be a reference to `hoistVariableDeclaration` from a `TransformationContext`, but + * can be `undefined` if you plan to record the temporary variable manually. + * @param reservedInNestedScopes When `true`, reserves the temporary variable name in all nested scopes + * during emit so that the variable can be referenced in a nested function body. This is an alternative to + * setting `EmitFlags.ReuseTempVariableScope` on the nested function itself. + */ + createTempVariable(recordTempVariable: ((node: Identifier) => void) | undefined, reservedInNestedScopes?: boolean): Identifier; + /** + * Create a unique temporary variable for use in a loop. + * @param reservedInNestedScopes When `true`, reserves the temporary variable name in all nested scopes + * during emit so that the variable can be referenced in a nested function body. This is an alternative to + * setting `EmitFlags.ReuseTempVariableScope` on the nested function itself. + */ + createLoopVariable(reservedInNestedScopes?: boolean): Identifier; + /** Create a unique name based on the supplied text. */ + createUniqueName(text: string, flags?: GeneratedIdentifierFlags): Identifier; + /** Create a unique name generated for a node. */ + getGeneratedNameForNode(node: Node | undefined, flags?: GeneratedIdentifierFlags): Identifier; + createPrivateIdentifier(text: string): PrivateIdentifier; + createUniquePrivateName(text?: string): PrivateIdentifier; + getGeneratedPrivateNameForNode(node: Node): PrivateIdentifier; + createToken(token: SyntaxKind.SuperKeyword): SuperExpression; + createToken(token: SyntaxKind.ThisKeyword): ThisExpression; + createToken(token: SyntaxKind.NullKeyword): NullLiteral; + createToken(token: SyntaxKind.TrueKeyword): TrueLiteral; + createToken(token: SyntaxKind.FalseKeyword): FalseLiteral; + createToken(token: SyntaxKind.EndOfFileToken): EndOfFileToken; + createToken(token: SyntaxKind.Unknown): Token; + createToken(token: TKind): PunctuationToken; + createToken(token: TKind): KeywordTypeNode; + createToken(token: TKind): ModifierToken; + createToken(token: TKind): KeywordToken; + createSuper(): SuperExpression; + createThis(): ThisExpression; + createNull(): NullLiteral; + createTrue(): TrueLiteral; + createFalse(): FalseLiteral; + createModifier(kind: T): ModifierToken; + createModifiersFromModifierFlags(flags: ModifierFlags): Modifier[] | undefined; + createQualifiedName(left: EntityName, right: string | Identifier): QualifiedName; + updateQualifiedName(node: QualifiedName, left: EntityName, right: Identifier): QualifiedName; + createComputedPropertyName(expression: Expression): ComputedPropertyName; + updateComputedPropertyName(node: ComputedPropertyName, expression: Expression): ComputedPropertyName; + createTypeParameterDeclaration(modifiers: readonly Modifier[] | undefined, name: string | Identifier, constraint?: TypeNode, defaultType?: TypeNode): TypeParameterDeclaration; + updateTypeParameterDeclaration(node: TypeParameterDeclaration, modifiers: readonly Modifier[] | undefined, name: Identifier, constraint: TypeNode | undefined, defaultType: TypeNode | undefined): TypeParameterDeclaration; + createParameterDeclaration(modifiers: readonly ModifierLike[] | undefined, dotDotDotToken: DotDotDotToken | undefined, name: string | BindingName, questionToken?: QuestionToken, type?: TypeNode, initializer?: Expression): ParameterDeclaration; + updateParameterDeclaration(node: ParameterDeclaration, modifiers: readonly ModifierLike[] | undefined, dotDotDotToken: DotDotDotToken | undefined, name: string | BindingName, questionToken: QuestionToken | undefined, type: TypeNode | undefined, initializer: Expression | undefined): ParameterDeclaration; + createDecorator(expression: Expression): Decorator; + updateDecorator(node: Decorator, expression: Expression): Decorator; + createPropertySignature(modifiers: readonly Modifier[] | undefined, name: PropertyName | string, questionToken: QuestionToken | undefined, type: TypeNode | undefined): PropertySignature; + updatePropertySignature(node: PropertySignature, modifiers: readonly Modifier[] | undefined, name: PropertyName, questionToken: QuestionToken | undefined, type: TypeNode | undefined): PropertySignature; + createPropertyDeclaration(modifiers: readonly ModifierLike[] | undefined, name: string | PropertyName, questionOrExclamationToken: QuestionToken | ExclamationToken | undefined, type: TypeNode | undefined, initializer: Expression | undefined): PropertyDeclaration; + updatePropertyDeclaration(node: PropertyDeclaration, modifiers: readonly ModifierLike[] | undefined, name: string | PropertyName, questionOrExclamationToken: QuestionToken | ExclamationToken | undefined, type: TypeNode | undefined, initializer: Expression | undefined): PropertyDeclaration; + createMethodSignature(modifiers: readonly Modifier[] | undefined, name: string | PropertyName, questionToken: QuestionToken | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined): MethodSignature; + updateMethodSignature(node: MethodSignature, modifiers: readonly Modifier[] | undefined, name: PropertyName, questionToken: QuestionToken | undefined, typeParameters: NodeArray | undefined, parameters: NodeArray, type: TypeNode | undefined): MethodSignature; + createMethodDeclaration(modifiers: readonly ModifierLike[] | undefined, asteriskToken: AsteriskToken | undefined, name: string | PropertyName, questionToken: QuestionToken | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, body: Block | undefined): MethodDeclaration; + updateMethodDeclaration(node: MethodDeclaration, modifiers: readonly ModifierLike[] | undefined, asteriskToken: AsteriskToken | undefined, name: PropertyName, questionToken: QuestionToken | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, body: Block | undefined): MethodDeclaration; + createConstructorDeclaration(modifiers: readonly ModifierLike[] | undefined, parameters: readonly ParameterDeclaration[], body: Block | undefined): ConstructorDeclaration; + updateConstructorDeclaration(node: ConstructorDeclaration, modifiers: readonly ModifierLike[] | undefined, parameters: readonly ParameterDeclaration[], body: Block | undefined): ConstructorDeclaration; + createGetAccessorDeclaration(modifiers: readonly ModifierLike[] | undefined, name: string | PropertyName, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, body: Block | undefined): GetAccessorDeclaration; + updateGetAccessorDeclaration(node: GetAccessorDeclaration, modifiers: readonly ModifierLike[] | undefined, name: PropertyName, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, body: Block | undefined): GetAccessorDeclaration; + createSetAccessorDeclaration(modifiers: readonly ModifierLike[] | undefined, name: string | PropertyName, parameters: readonly ParameterDeclaration[], body: Block | undefined): SetAccessorDeclaration; + updateSetAccessorDeclaration(node: SetAccessorDeclaration, modifiers: readonly ModifierLike[] | undefined, name: PropertyName, parameters: readonly ParameterDeclaration[], body: Block | undefined): SetAccessorDeclaration; + createCallSignature(typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined): CallSignatureDeclaration; + updateCallSignature(node: CallSignatureDeclaration, typeParameters: NodeArray | undefined, parameters: NodeArray, type: TypeNode | undefined): CallSignatureDeclaration; + createConstructSignature(typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined): ConstructSignatureDeclaration; + updateConstructSignature(node: ConstructSignatureDeclaration, typeParameters: NodeArray | undefined, parameters: NodeArray, type: TypeNode | undefined): ConstructSignatureDeclaration; + createIndexSignature(modifiers: readonly ModifierLike[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode): IndexSignatureDeclaration; + updateIndexSignature(node: IndexSignatureDeclaration, modifiers: readonly ModifierLike[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode): IndexSignatureDeclaration; + createTemplateLiteralTypeSpan(type: TypeNode, literal: TemplateMiddle | TemplateTail): TemplateLiteralTypeSpan; + updateTemplateLiteralTypeSpan(node: TemplateLiteralTypeSpan, type: TypeNode, literal: TemplateMiddle | TemplateTail): TemplateLiteralTypeSpan; + createClassStaticBlockDeclaration(body: Block): ClassStaticBlockDeclaration; + updateClassStaticBlockDeclaration(node: ClassStaticBlockDeclaration, body: Block): ClassStaticBlockDeclaration; + createKeywordTypeNode(kind: TKind): KeywordTypeNode; + createTypePredicateNode(assertsModifier: AssertsKeyword | undefined, parameterName: Identifier | ThisTypeNode | string, type: TypeNode | undefined): TypePredicateNode; + updateTypePredicateNode(node: TypePredicateNode, assertsModifier: AssertsKeyword | undefined, parameterName: Identifier | ThisTypeNode, type: TypeNode | undefined): TypePredicateNode; + createTypeReferenceNode(typeName: string | EntityName, typeArguments?: readonly TypeNode[]): TypeReferenceNode; + updateTypeReferenceNode(node: TypeReferenceNode, typeName: EntityName, typeArguments: NodeArray | undefined): TypeReferenceNode; + createFunctionTypeNode(typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode): FunctionTypeNode; + updateFunctionTypeNode(node: FunctionTypeNode, typeParameters: NodeArray | undefined, parameters: NodeArray, type: TypeNode): FunctionTypeNode; + createConstructorTypeNode(modifiers: readonly Modifier[] | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode): ConstructorTypeNode; + updateConstructorTypeNode(node: ConstructorTypeNode, modifiers: readonly Modifier[] | undefined, typeParameters: NodeArray | undefined, parameters: NodeArray, type: TypeNode): ConstructorTypeNode; + createTypeQueryNode(exprName: EntityName, typeArguments?: readonly TypeNode[]): TypeQueryNode; + updateTypeQueryNode(node: TypeQueryNode, exprName: EntityName, typeArguments?: readonly TypeNode[]): TypeQueryNode; + createTypeLiteralNode(members: readonly TypeElement[] | undefined): TypeLiteralNode; + updateTypeLiteralNode(node: TypeLiteralNode, members: NodeArray): TypeLiteralNode; + createArrayTypeNode(elementType: TypeNode): ArrayTypeNode; + updateArrayTypeNode(node: ArrayTypeNode, elementType: TypeNode): ArrayTypeNode; + createTupleTypeNode(elements: readonly (TypeNode | NamedTupleMember)[]): TupleTypeNode; + updateTupleTypeNode(node: TupleTypeNode, elements: readonly (TypeNode | NamedTupleMember)[]): TupleTypeNode; + createNamedTupleMember(dotDotDotToken: DotDotDotToken | undefined, name: Identifier, questionToken: QuestionToken | undefined, type: TypeNode): NamedTupleMember; + updateNamedTupleMember(node: NamedTupleMember, dotDotDotToken: DotDotDotToken | undefined, name: Identifier, questionToken: QuestionToken | undefined, type: TypeNode): NamedTupleMember; + createOptionalTypeNode(type: TypeNode): OptionalTypeNode; + updateOptionalTypeNode(node: OptionalTypeNode, type: TypeNode): OptionalTypeNode; + createRestTypeNode(type: TypeNode): RestTypeNode; + updateRestTypeNode(node: RestTypeNode, type: TypeNode): RestTypeNode; + createUnionTypeNode(types: readonly TypeNode[]): UnionTypeNode; + updateUnionTypeNode(node: UnionTypeNode, types: NodeArray): UnionTypeNode; + createIntersectionTypeNode(types: readonly TypeNode[]): IntersectionTypeNode; + updateIntersectionTypeNode(node: IntersectionTypeNode, types: NodeArray): IntersectionTypeNode; + createConditionalTypeNode(checkType: TypeNode, extendsType: TypeNode, trueType: TypeNode, falseType: TypeNode): ConditionalTypeNode; + updateConditionalTypeNode(node: ConditionalTypeNode, checkType: TypeNode, extendsType: TypeNode, trueType: TypeNode, falseType: TypeNode): ConditionalTypeNode; + createInferTypeNode(typeParameter: TypeParameterDeclaration): InferTypeNode; + updateInferTypeNode(node: InferTypeNode, typeParameter: TypeParameterDeclaration): InferTypeNode; + createImportTypeNode(argument: TypeNode, assertions?: ImportTypeAssertionContainer, qualifier?: EntityName, typeArguments?: readonly TypeNode[], isTypeOf?: boolean): ImportTypeNode; + updateImportTypeNode(node: ImportTypeNode, argument: TypeNode, assertions: ImportTypeAssertionContainer | undefined, qualifier: EntityName | undefined, typeArguments: readonly TypeNode[] | undefined, isTypeOf?: boolean): ImportTypeNode; + createParenthesizedType(type: TypeNode): ParenthesizedTypeNode; + updateParenthesizedType(node: ParenthesizedTypeNode, type: TypeNode): ParenthesizedTypeNode; + createThisTypeNode(): ThisTypeNode; + createTypeOperatorNode(operator: SyntaxKind.KeyOfKeyword | SyntaxKind.UniqueKeyword | SyntaxKind.ReadonlyKeyword, type: TypeNode): TypeOperatorNode; + updateTypeOperatorNode(node: TypeOperatorNode, type: TypeNode): TypeOperatorNode; + createIndexedAccessTypeNode(objectType: TypeNode, indexType: TypeNode): IndexedAccessTypeNode; + updateIndexedAccessTypeNode(node: IndexedAccessTypeNode, objectType: TypeNode, indexType: TypeNode): IndexedAccessTypeNode; + createMappedTypeNode(readonlyToken: ReadonlyKeyword | PlusToken | MinusToken | undefined, typeParameter: TypeParameterDeclaration, nameType: TypeNode | undefined, questionToken: QuestionToken | PlusToken | MinusToken | undefined, type: TypeNode | undefined, members: NodeArray | undefined): MappedTypeNode; + updateMappedTypeNode(node: MappedTypeNode, readonlyToken: ReadonlyKeyword | PlusToken | MinusToken | undefined, typeParameter: TypeParameterDeclaration, nameType: TypeNode | undefined, questionToken: QuestionToken | PlusToken | MinusToken | undefined, type: TypeNode | undefined, members: NodeArray | undefined): MappedTypeNode; + createLiteralTypeNode(literal: LiteralTypeNode["literal"]): LiteralTypeNode; + updateLiteralTypeNode(node: LiteralTypeNode, literal: LiteralTypeNode["literal"]): LiteralTypeNode; + createTemplateLiteralType(head: TemplateHead, templateSpans: readonly TemplateLiteralTypeSpan[]): TemplateLiteralTypeNode; + updateTemplateLiteralType(node: TemplateLiteralTypeNode, head: TemplateHead, templateSpans: readonly TemplateLiteralTypeSpan[]): TemplateLiteralTypeNode; + createObjectBindingPattern(elements: readonly BindingElement[]): ObjectBindingPattern; + updateObjectBindingPattern(node: ObjectBindingPattern, elements: readonly BindingElement[]): ObjectBindingPattern; + createArrayBindingPattern(elements: readonly ArrayBindingElement[]): ArrayBindingPattern; + updateArrayBindingPattern(node: ArrayBindingPattern, elements: readonly ArrayBindingElement[]): ArrayBindingPattern; + createBindingElement(dotDotDotToken: DotDotDotToken | undefined, propertyName: string | PropertyName | undefined, name: string | BindingName, initializer?: Expression): BindingElement; + updateBindingElement(node: BindingElement, dotDotDotToken: DotDotDotToken | undefined, propertyName: PropertyName | undefined, name: BindingName, initializer: Expression | undefined): BindingElement; + createArrayLiteralExpression(elements?: readonly Expression[], multiLine?: boolean): ArrayLiteralExpression; + updateArrayLiteralExpression(node: ArrayLiteralExpression, elements: readonly Expression[]): ArrayLiteralExpression; + createObjectLiteralExpression(properties?: readonly ObjectLiteralElementLike[], multiLine?: boolean): ObjectLiteralExpression; + updateObjectLiteralExpression(node: ObjectLiteralExpression, properties: readonly ObjectLiteralElementLike[]): ObjectLiteralExpression; + createPropertyAccessExpression(expression: Expression, name: string | MemberName): PropertyAccessExpression; + updatePropertyAccessExpression(node: PropertyAccessExpression, expression: Expression, name: MemberName): PropertyAccessExpression; + createPropertyAccessChain(expression: Expression, questionDotToken: QuestionDotToken | undefined, name: string | MemberName): PropertyAccessChain; + updatePropertyAccessChain(node: PropertyAccessChain, expression: Expression, questionDotToken: QuestionDotToken | undefined, name: MemberName): PropertyAccessChain; + createElementAccessExpression(expression: Expression, index: number | Expression): ElementAccessExpression; + updateElementAccessExpression(node: ElementAccessExpression, expression: Expression, argumentExpression: Expression): ElementAccessExpression; + createElementAccessChain(expression: Expression, questionDotToken: QuestionDotToken | undefined, index: number | Expression): ElementAccessChain; + updateElementAccessChain(node: ElementAccessChain, expression: Expression, questionDotToken: QuestionDotToken | undefined, argumentExpression: Expression): ElementAccessChain; + createCallExpression(expression: Expression, typeArguments: readonly TypeNode[] | undefined, argumentsArray: readonly Expression[] | undefined): CallExpression; + updateCallExpression(node: CallExpression, expression: Expression, typeArguments: readonly TypeNode[] | undefined, argumentsArray: readonly Expression[]): CallExpression; + createCallChain(expression: Expression, questionDotToken: QuestionDotToken | undefined, typeArguments: readonly TypeNode[] | undefined, argumentsArray: readonly Expression[] | undefined): CallChain; + updateCallChain(node: CallChain, expression: Expression, questionDotToken: QuestionDotToken | undefined, typeArguments: readonly TypeNode[] | undefined, argumentsArray: readonly Expression[]): CallChain; + createNewExpression(expression: Expression, typeArguments: readonly TypeNode[] | undefined, argumentsArray: readonly Expression[] | undefined): NewExpression; + updateNewExpression(node: NewExpression, expression: Expression, typeArguments: readonly TypeNode[] | undefined, argumentsArray: readonly Expression[] | undefined): NewExpression; + createTaggedTemplateExpression(tag: Expression, typeArguments: readonly TypeNode[] | undefined, template: TemplateLiteral): TaggedTemplateExpression; + updateTaggedTemplateExpression(node: TaggedTemplateExpression, tag: Expression, typeArguments: readonly TypeNode[] | undefined, template: TemplateLiteral): TaggedTemplateExpression; + createTypeAssertion(type: TypeNode, expression: Expression): TypeAssertion; + updateTypeAssertion(node: TypeAssertion, type: TypeNode, expression: Expression): TypeAssertion; + createParenthesizedExpression(expression: Expression): ParenthesizedExpression; + updateParenthesizedExpression(node: ParenthesizedExpression, expression: Expression): ParenthesizedExpression; + createFunctionExpression(modifiers: readonly Modifier[] | undefined, asteriskToken: AsteriskToken | undefined, name: string | Identifier | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[] | undefined, type: TypeNode | undefined, body: Block): FunctionExpression; + updateFunctionExpression(node: FunctionExpression, modifiers: readonly Modifier[] | undefined, asteriskToken: AsteriskToken | undefined, name: Identifier | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, body: Block): FunctionExpression; + createArrowFunction(modifiers: readonly Modifier[] | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, equalsGreaterThanToken: EqualsGreaterThanToken | undefined, body: ConciseBody): ArrowFunction; + updateArrowFunction(node: ArrowFunction, modifiers: readonly Modifier[] | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, equalsGreaterThanToken: EqualsGreaterThanToken, body: ConciseBody): ArrowFunction; + createDeleteExpression(expression: Expression): DeleteExpression; + updateDeleteExpression(node: DeleteExpression, expression: Expression): DeleteExpression; + createTypeOfExpression(expression: Expression): TypeOfExpression; + updateTypeOfExpression(node: TypeOfExpression, expression: Expression): TypeOfExpression; + createVoidExpression(expression: Expression): VoidExpression; + updateVoidExpression(node: VoidExpression, expression: Expression): VoidExpression; + createAwaitExpression(expression: Expression): AwaitExpression; + updateAwaitExpression(node: AwaitExpression, expression: Expression): AwaitExpression; + createPrefixUnaryExpression(operator: PrefixUnaryOperator, operand: Expression): PrefixUnaryExpression; + updatePrefixUnaryExpression(node: PrefixUnaryExpression, operand: Expression): PrefixUnaryExpression; + createPostfixUnaryExpression(operand: Expression, operator: PostfixUnaryOperator): PostfixUnaryExpression; + updatePostfixUnaryExpression(node: PostfixUnaryExpression, operand: Expression): PostfixUnaryExpression; + createBinaryExpression(left: Expression, operator: BinaryOperator | BinaryOperatorToken, right: Expression): BinaryExpression; + updateBinaryExpression(node: BinaryExpression, left: Expression, operator: BinaryOperator | BinaryOperatorToken, right: Expression): BinaryExpression; + createConditionalExpression(condition: Expression, questionToken: QuestionToken | undefined, whenTrue: Expression, colonToken: ColonToken | undefined, whenFalse: Expression): ConditionalExpression; + updateConditionalExpression(node: ConditionalExpression, condition: Expression, questionToken: QuestionToken, whenTrue: Expression, colonToken: ColonToken, whenFalse: Expression): ConditionalExpression; + createTemplateExpression(head: TemplateHead, templateSpans: readonly TemplateSpan[]): TemplateExpression; + updateTemplateExpression(node: TemplateExpression, head: TemplateHead, templateSpans: readonly TemplateSpan[]): TemplateExpression; + createTemplateHead(text: string, rawText?: string, templateFlags?: TokenFlags): TemplateHead; + createTemplateHead(text: string | undefined, rawText: string, templateFlags?: TokenFlags): TemplateHead; + createTemplateMiddle(text: string, rawText?: string, templateFlags?: TokenFlags): TemplateMiddle; + createTemplateMiddle(text: string | undefined, rawText: string, templateFlags?: TokenFlags): TemplateMiddle; + createTemplateTail(text: string, rawText?: string, templateFlags?: TokenFlags): TemplateTail; + createTemplateTail(text: string | undefined, rawText: string, templateFlags?: TokenFlags): TemplateTail; + createNoSubstitutionTemplateLiteral(text: string, rawText?: string): NoSubstitutionTemplateLiteral; + createNoSubstitutionTemplateLiteral(text: string | undefined, rawText: string): NoSubstitutionTemplateLiteral; + createYieldExpression(asteriskToken: AsteriskToken, expression: Expression): YieldExpression; + createYieldExpression(asteriskToken: undefined, expression: Expression | undefined): YieldExpression; + updateYieldExpression(node: YieldExpression, asteriskToken: AsteriskToken | undefined, expression: Expression | undefined): YieldExpression; + createSpreadElement(expression: Expression): SpreadElement; + updateSpreadElement(node: SpreadElement, expression: Expression): SpreadElement; + createClassExpression(modifiers: readonly ModifierLike[] | undefined, name: string | Identifier | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, heritageClauses: readonly HeritageClause[] | undefined, members: readonly ClassElement[]): ClassExpression; + updateClassExpression(node: ClassExpression, modifiers: readonly ModifierLike[] | undefined, name: Identifier | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, heritageClauses: readonly HeritageClause[] | undefined, members: readonly ClassElement[]): ClassExpression; + createOmittedExpression(): OmittedExpression; + createExpressionWithTypeArguments(expression: Expression, typeArguments: readonly TypeNode[] | undefined): ExpressionWithTypeArguments; + updateExpressionWithTypeArguments(node: ExpressionWithTypeArguments, expression: Expression, typeArguments: readonly TypeNode[] | undefined): ExpressionWithTypeArguments; + createAsExpression(expression: Expression, type: TypeNode): AsExpression; + updateAsExpression(node: AsExpression, expression: Expression, type: TypeNode): AsExpression; + createNonNullExpression(expression: Expression): NonNullExpression; + updateNonNullExpression(node: NonNullExpression, expression: Expression): NonNullExpression; + createNonNullChain(expression: Expression): NonNullChain; + updateNonNullChain(node: NonNullChain, expression: Expression): NonNullChain; + createMetaProperty(keywordToken: MetaProperty["keywordToken"], name: Identifier): MetaProperty; + updateMetaProperty(node: MetaProperty, name: Identifier): MetaProperty; + createSatisfiesExpression(expression: Expression, type: TypeNode): SatisfiesExpression; + updateSatisfiesExpression(node: SatisfiesExpression, expression: Expression, type: TypeNode): SatisfiesExpression; + createTemplateSpan(expression: Expression, literal: TemplateMiddle | TemplateTail): TemplateSpan; + updateTemplateSpan(node: TemplateSpan, expression: Expression, literal: TemplateMiddle | TemplateTail): TemplateSpan; + createSemicolonClassElement(): SemicolonClassElement; + createBlock(statements: readonly Statement[], multiLine?: boolean): Block; + updateBlock(node: Block, statements: readonly Statement[]): Block; + createVariableStatement(modifiers: readonly ModifierLike[] | undefined, declarationList: VariableDeclarationList | readonly VariableDeclaration[]): VariableStatement; + updateVariableStatement(node: VariableStatement, modifiers: readonly ModifierLike[] | undefined, declarationList: VariableDeclarationList): VariableStatement; + createEmptyStatement(): EmptyStatement; + createExpressionStatement(expression: Expression): ExpressionStatement; + updateExpressionStatement(node: ExpressionStatement, expression: Expression): ExpressionStatement; + createIfStatement(expression: Expression, thenStatement: Statement, elseStatement?: Statement): IfStatement; + updateIfStatement(node: IfStatement, expression: Expression, thenStatement: Statement, elseStatement: Statement | undefined): IfStatement; + createDoStatement(statement: Statement, expression: Expression): DoStatement; + updateDoStatement(node: DoStatement, statement: Statement, expression: Expression): DoStatement; + createWhileStatement(expression: Expression, statement: Statement): WhileStatement; + updateWhileStatement(node: WhileStatement, expression: Expression, statement: Statement): WhileStatement; + createForStatement(initializer: ForInitializer | undefined, condition: Expression | undefined, incrementor: Expression | undefined, statement: Statement): ForStatement; + updateForStatement(node: ForStatement, initializer: ForInitializer | undefined, condition: Expression | undefined, incrementor: Expression | undefined, statement: Statement): ForStatement; + createForInStatement(initializer: ForInitializer, expression: Expression, statement: Statement): ForInStatement; + updateForInStatement(node: ForInStatement, initializer: ForInitializer, expression: Expression, statement: Statement): ForInStatement; + createForOfStatement(awaitModifier: AwaitKeyword | undefined, initializer: ForInitializer, expression: Expression, statement: Statement): ForOfStatement; + updateForOfStatement(node: ForOfStatement, awaitModifier: AwaitKeyword | undefined, initializer: ForInitializer, expression: Expression, statement: Statement): ForOfStatement; + createContinueStatement(label?: string | Identifier): ContinueStatement; + updateContinueStatement(node: ContinueStatement, label: Identifier | undefined): ContinueStatement; + createBreakStatement(label?: string | Identifier): BreakStatement; + updateBreakStatement(node: BreakStatement, label: Identifier | undefined): BreakStatement; + createReturnStatement(expression?: Expression): ReturnStatement; + updateReturnStatement(node: ReturnStatement, expression: Expression | undefined): ReturnStatement; + createWithStatement(expression: Expression, statement: Statement): WithStatement; + updateWithStatement(node: WithStatement, expression: Expression, statement: Statement): WithStatement; + createSwitchStatement(expression: Expression, caseBlock: CaseBlock): SwitchStatement; + updateSwitchStatement(node: SwitchStatement, expression: Expression, caseBlock: CaseBlock): SwitchStatement; + createLabeledStatement(label: string | Identifier, statement: Statement): LabeledStatement; + updateLabeledStatement(node: LabeledStatement, label: Identifier, statement: Statement): LabeledStatement; + createThrowStatement(expression: Expression): ThrowStatement; + updateThrowStatement(node: ThrowStatement, expression: Expression): ThrowStatement; + createTryStatement(tryBlock: Block, catchClause: CatchClause | undefined, finallyBlock: Block | undefined): TryStatement; + updateTryStatement(node: TryStatement, tryBlock: Block, catchClause: CatchClause | undefined, finallyBlock: Block | undefined): TryStatement; + createDebuggerStatement(): DebuggerStatement; + createVariableDeclaration(name: string | BindingName, exclamationToken?: ExclamationToken, type?: TypeNode, initializer?: Expression): VariableDeclaration; + updateVariableDeclaration(node: VariableDeclaration, name: BindingName, exclamationToken: ExclamationToken | undefined, type: TypeNode | undefined, initializer: Expression | undefined): VariableDeclaration; + createVariableDeclarationList(declarations: readonly VariableDeclaration[], flags?: NodeFlags): VariableDeclarationList; + updateVariableDeclarationList(node: VariableDeclarationList, declarations: readonly VariableDeclaration[]): VariableDeclarationList; + createFunctionDeclaration(modifiers: readonly ModifierLike[] | undefined, asteriskToken: AsteriskToken | undefined, name: string | Identifier | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, body: Block | undefined): FunctionDeclaration; + updateFunctionDeclaration(node: FunctionDeclaration, modifiers: readonly ModifierLike[] | undefined, asteriskToken: AsteriskToken | undefined, name: Identifier | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined, body: Block | undefined): FunctionDeclaration; + createClassDeclaration(modifiers: readonly ModifierLike[] | undefined, name: string | Identifier | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, heritageClauses: readonly HeritageClause[] | undefined, members: readonly ClassElement[]): ClassDeclaration; + updateClassDeclaration(node: ClassDeclaration, modifiers: readonly ModifierLike[] | undefined, name: Identifier | undefined, typeParameters: readonly TypeParameterDeclaration[] | undefined, heritageClauses: readonly HeritageClause[] | undefined, members: readonly ClassElement[]): ClassDeclaration; + createInterfaceDeclaration(modifiers: readonly ModifierLike[] | undefined, name: string | Identifier, typeParameters: readonly TypeParameterDeclaration[] | undefined, heritageClauses: readonly HeritageClause[] | undefined, members: readonly TypeElement[]): InterfaceDeclaration; + updateInterfaceDeclaration(node: InterfaceDeclaration, modifiers: readonly ModifierLike[] | undefined, name: Identifier, typeParameters: readonly TypeParameterDeclaration[] | undefined, heritageClauses: readonly HeritageClause[] | undefined, members: readonly TypeElement[]): InterfaceDeclaration; + createTypeAliasDeclaration(modifiers: readonly ModifierLike[] | undefined, name: string | Identifier, typeParameters: readonly TypeParameterDeclaration[] | undefined, type: TypeNode): TypeAliasDeclaration; + updateTypeAliasDeclaration(node: TypeAliasDeclaration, modifiers: readonly ModifierLike[] | undefined, name: Identifier, typeParameters: readonly TypeParameterDeclaration[] | undefined, type: TypeNode): TypeAliasDeclaration; + createEnumDeclaration(modifiers: readonly ModifierLike[] | undefined, name: string | Identifier, members: readonly EnumMember[]): EnumDeclaration; + updateEnumDeclaration(node: EnumDeclaration, modifiers: readonly ModifierLike[] | undefined, name: Identifier, members: readonly EnumMember[]): EnumDeclaration; + createModuleDeclaration(modifiers: readonly ModifierLike[] | undefined, name: ModuleName, body: ModuleBody | undefined, flags?: NodeFlags): ModuleDeclaration; + updateModuleDeclaration(node: ModuleDeclaration, modifiers: readonly ModifierLike[] | undefined, name: ModuleName, body: ModuleBody | undefined): ModuleDeclaration; + createModuleBlock(statements: readonly Statement[]): ModuleBlock; + updateModuleBlock(node: ModuleBlock, statements: readonly Statement[]): ModuleBlock; + createCaseBlock(clauses: readonly CaseOrDefaultClause[]): CaseBlock; + updateCaseBlock(node: CaseBlock, clauses: readonly CaseOrDefaultClause[]): CaseBlock; + createNamespaceExportDeclaration(name: string | Identifier): NamespaceExportDeclaration; + updateNamespaceExportDeclaration(node: NamespaceExportDeclaration, name: Identifier): NamespaceExportDeclaration; + createImportEqualsDeclaration(modifiers: readonly ModifierLike[] | undefined, isTypeOnly: boolean, name: string | Identifier, moduleReference: ModuleReference): ImportEqualsDeclaration; + updateImportEqualsDeclaration(node: ImportEqualsDeclaration, modifiers: readonly ModifierLike[] | undefined, isTypeOnly: boolean, name: Identifier, moduleReference: ModuleReference): ImportEqualsDeclaration; + createImportDeclaration(modifiers: readonly ModifierLike[] | undefined, importClause: ImportClause | undefined, moduleSpecifier: Expression, assertClause?: AssertClause): ImportDeclaration; + updateImportDeclaration(node: ImportDeclaration, modifiers: readonly ModifierLike[] | undefined, importClause: ImportClause | undefined, moduleSpecifier: Expression, assertClause: AssertClause | undefined): ImportDeclaration; + createImportClause(isTypeOnly: boolean, name: Identifier | undefined, namedBindings: NamedImportBindings | undefined): ImportClause; + updateImportClause(node: ImportClause, isTypeOnly: boolean, name: Identifier | undefined, namedBindings: NamedImportBindings | undefined): ImportClause; + createAssertClause(elements: NodeArray, multiLine?: boolean): AssertClause; + updateAssertClause(node: AssertClause, elements: NodeArray, multiLine?: boolean): AssertClause; + createAssertEntry(name: AssertionKey, value: Expression): AssertEntry; + updateAssertEntry(node: AssertEntry, name: AssertionKey, value: Expression): AssertEntry; + createImportTypeAssertionContainer(clause: AssertClause, multiLine?: boolean): ImportTypeAssertionContainer; + updateImportTypeAssertionContainer(node: ImportTypeAssertionContainer, clause: AssertClause, multiLine?: boolean): ImportTypeAssertionContainer; + createNamespaceImport(name: Identifier): NamespaceImport; + updateNamespaceImport(node: NamespaceImport, name: Identifier): NamespaceImport; + createNamespaceExport(name: Identifier): NamespaceExport; + updateNamespaceExport(node: NamespaceExport, name: Identifier): NamespaceExport; + createNamedImports(elements: readonly ImportSpecifier[]): NamedImports; + updateNamedImports(node: NamedImports, elements: readonly ImportSpecifier[]): NamedImports; + createImportSpecifier(isTypeOnly: boolean, propertyName: Identifier | undefined, name: Identifier): ImportSpecifier; + updateImportSpecifier(node: ImportSpecifier, isTypeOnly: boolean, propertyName: Identifier | undefined, name: Identifier): ImportSpecifier; + createExportAssignment(modifiers: readonly ModifierLike[] | undefined, isExportEquals: boolean | undefined, expression: Expression): ExportAssignment; + updateExportAssignment(node: ExportAssignment, modifiers: readonly ModifierLike[] | undefined, expression: Expression): ExportAssignment; + createExportDeclaration(modifiers: readonly ModifierLike[] | undefined, isTypeOnly: boolean, exportClause: NamedExportBindings | undefined, moduleSpecifier?: Expression, assertClause?: AssertClause): ExportDeclaration; + updateExportDeclaration(node: ExportDeclaration, modifiers: readonly ModifierLike[] | undefined, isTypeOnly: boolean, exportClause: NamedExportBindings | undefined, moduleSpecifier: Expression | undefined, assertClause: AssertClause | undefined): ExportDeclaration; + createNamedExports(elements: readonly ExportSpecifier[]): NamedExports; + updateNamedExports(node: NamedExports, elements: readonly ExportSpecifier[]): NamedExports; + createExportSpecifier(isTypeOnly: boolean, propertyName: string | Identifier | undefined, name: string | Identifier): ExportSpecifier; + updateExportSpecifier(node: ExportSpecifier, isTypeOnly: boolean, propertyName: Identifier | undefined, name: Identifier): ExportSpecifier; + createExternalModuleReference(expression: Expression): ExternalModuleReference; + updateExternalModuleReference(node: ExternalModuleReference, expression: Expression): ExternalModuleReference; + createJSDocAllType(): JSDocAllType; + createJSDocUnknownType(): JSDocUnknownType; + createJSDocNonNullableType(type: TypeNode, postfix?: boolean): JSDocNonNullableType; + updateJSDocNonNullableType(node: JSDocNonNullableType, type: TypeNode): JSDocNonNullableType; + createJSDocNullableType(type: TypeNode, postfix?: boolean): JSDocNullableType; + updateJSDocNullableType(node: JSDocNullableType, type: TypeNode): JSDocNullableType; + createJSDocOptionalType(type: TypeNode): JSDocOptionalType; + updateJSDocOptionalType(node: JSDocOptionalType, type: TypeNode): JSDocOptionalType; + createJSDocFunctionType(parameters: readonly ParameterDeclaration[], type: TypeNode | undefined): JSDocFunctionType; + updateJSDocFunctionType(node: JSDocFunctionType, parameters: readonly ParameterDeclaration[], type: TypeNode | undefined): JSDocFunctionType; + createJSDocVariadicType(type: TypeNode): JSDocVariadicType; + updateJSDocVariadicType(node: JSDocVariadicType, type: TypeNode): JSDocVariadicType; + createJSDocNamepathType(type: TypeNode): JSDocNamepathType; + updateJSDocNamepathType(node: JSDocNamepathType, type: TypeNode): JSDocNamepathType; + createJSDocTypeExpression(type: TypeNode): JSDocTypeExpression; + updateJSDocTypeExpression(node: JSDocTypeExpression, type: TypeNode): JSDocTypeExpression; + createJSDocNameReference(name: EntityName | JSDocMemberName): JSDocNameReference; + updateJSDocNameReference(node: JSDocNameReference, name: EntityName | JSDocMemberName): JSDocNameReference; + createJSDocMemberName(left: EntityName | JSDocMemberName, right: Identifier): JSDocMemberName; + updateJSDocMemberName(node: JSDocMemberName, left: EntityName | JSDocMemberName, right: Identifier): JSDocMemberName; + createJSDocLink(name: EntityName | JSDocMemberName | undefined, text: string): JSDocLink; + updateJSDocLink(node: JSDocLink, name: EntityName | JSDocMemberName | undefined, text: string): JSDocLink; + createJSDocLinkCode(name: EntityName | JSDocMemberName | undefined, text: string): JSDocLinkCode; + updateJSDocLinkCode(node: JSDocLinkCode, name: EntityName | JSDocMemberName | undefined, text: string): JSDocLinkCode; + createJSDocLinkPlain(name: EntityName | JSDocMemberName | undefined, text: string): JSDocLinkPlain; + updateJSDocLinkPlain(node: JSDocLinkPlain, name: EntityName | JSDocMemberName | undefined, text: string): JSDocLinkPlain; + createJSDocTypeLiteral(jsDocPropertyTags?: readonly JSDocPropertyLikeTag[], isArrayType?: boolean): JSDocTypeLiteral; + updateJSDocTypeLiteral(node: JSDocTypeLiteral, jsDocPropertyTags: readonly JSDocPropertyLikeTag[] | undefined, isArrayType: boolean | undefined): JSDocTypeLiteral; + createJSDocSignature(typeParameters: readonly JSDocTemplateTag[] | undefined, parameters: readonly JSDocParameterTag[], type?: JSDocReturnTag): JSDocSignature; + updateJSDocSignature(node: JSDocSignature, typeParameters: readonly JSDocTemplateTag[] | undefined, parameters: readonly JSDocParameterTag[], type: JSDocReturnTag | undefined): JSDocSignature; + createJSDocTemplateTag(tagName: Identifier | undefined, constraint: JSDocTypeExpression | undefined, typeParameters: readonly TypeParameterDeclaration[], comment?: string | NodeArray): JSDocTemplateTag; + updateJSDocTemplateTag(node: JSDocTemplateTag, tagName: Identifier | undefined, constraint: JSDocTypeExpression | undefined, typeParameters: readonly TypeParameterDeclaration[], comment: string | NodeArray | undefined): JSDocTemplateTag; + createJSDocTypedefTag(tagName: Identifier | undefined, typeExpression?: JSDocTypeExpression | JSDocTypeLiteral, fullName?: Identifier | JSDocNamespaceDeclaration, comment?: string | NodeArray): JSDocTypedefTag; + updateJSDocTypedefTag(node: JSDocTypedefTag, tagName: Identifier | undefined, typeExpression: JSDocTypeExpression | JSDocTypeLiteral | undefined, fullName: Identifier | JSDocNamespaceDeclaration | undefined, comment: string | NodeArray | undefined): JSDocTypedefTag; + createJSDocParameterTag(tagName: Identifier | undefined, name: EntityName, isBracketed: boolean, typeExpression?: JSDocTypeExpression, isNameFirst?: boolean, comment?: string | NodeArray): JSDocParameterTag; + updateJSDocParameterTag(node: JSDocParameterTag, tagName: Identifier | undefined, name: EntityName, isBracketed: boolean, typeExpression: JSDocTypeExpression | undefined, isNameFirst: boolean, comment: string | NodeArray | undefined): JSDocParameterTag; + createJSDocPropertyTag(tagName: Identifier | undefined, name: EntityName, isBracketed: boolean, typeExpression?: JSDocTypeExpression, isNameFirst?: boolean, comment?: string | NodeArray): JSDocPropertyTag; + updateJSDocPropertyTag(node: JSDocPropertyTag, tagName: Identifier | undefined, name: EntityName, isBracketed: boolean, typeExpression: JSDocTypeExpression | undefined, isNameFirst: boolean, comment: string | NodeArray | undefined): JSDocPropertyTag; + createJSDocTypeTag(tagName: Identifier | undefined, typeExpression: JSDocTypeExpression, comment?: string | NodeArray): JSDocTypeTag; + updateJSDocTypeTag(node: JSDocTypeTag, tagName: Identifier | undefined, typeExpression: JSDocTypeExpression, comment: string | NodeArray | undefined): JSDocTypeTag; + createJSDocSeeTag(tagName: Identifier | undefined, nameExpression: JSDocNameReference | undefined, comment?: string | NodeArray): JSDocSeeTag; + updateJSDocSeeTag(node: JSDocSeeTag, tagName: Identifier | undefined, nameExpression: JSDocNameReference | undefined, comment?: string | NodeArray): JSDocSeeTag; + createJSDocReturnTag(tagName: Identifier | undefined, typeExpression?: JSDocTypeExpression, comment?: string | NodeArray): JSDocReturnTag; + updateJSDocReturnTag(node: JSDocReturnTag, tagName: Identifier | undefined, typeExpression: JSDocTypeExpression | undefined, comment: string | NodeArray | undefined): JSDocReturnTag; + createJSDocThisTag(tagName: Identifier | undefined, typeExpression: JSDocTypeExpression, comment?: string | NodeArray): JSDocThisTag; + updateJSDocThisTag(node: JSDocThisTag, tagName: Identifier | undefined, typeExpression: JSDocTypeExpression | undefined, comment: string | NodeArray | undefined): JSDocThisTag; + createJSDocEnumTag(tagName: Identifier | undefined, typeExpression: JSDocTypeExpression, comment?: string | NodeArray): JSDocEnumTag; + updateJSDocEnumTag(node: JSDocEnumTag, tagName: Identifier | undefined, typeExpression: JSDocTypeExpression, comment: string | NodeArray | undefined): JSDocEnumTag; + createJSDocCallbackTag(tagName: Identifier | undefined, typeExpression: JSDocSignature, fullName?: Identifier | JSDocNamespaceDeclaration, comment?: string | NodeArray): JSDocCallbackTag; + updateJSDocCallbackTag(node: JSDocCallbackTag, tagName: Identifier | undefined, typeExpression: JSDocSignature, fullName: Identifier | JSDocNamespaceDeclaration | undefined, comment: string | NodeArray | undefined): JSDocCallbackTag; + createJSDocOverloadTag(tagName: Identifier | undefined, typeExpression: JSDocSignature, comment?: string | NodeArray): JSDocOverloadTag; + updateJSDocOverloadTag(node: JSDocOverloadTag, tagName: Identifier | undefined, typeExpression: JSDocSignature, comment: string | NodeArray | undefined): JSDocOverloadTag; + createJSDocAugmentsTag(tagName: Identifier | undefined, className: JSDocAugmentsTag["class"], comment?: string | NodeArray): JSDocAugmentsTag; + updateJSDocAugmentsTag(node: JSDocAugmentsTag, tagName: Identifier | undefined, className: JSDocAugmentsTag["class"], comment: string | NodeArray | undefined): JSDocAugmentsTag; + createJSDocImplementsTag(tagName: Identifier | undefined, className: JSDocImplementsTag["class"], comment?: string | NodeArray): JSDocImplementsTag; + updateJSDocImplementsTag(node: JSDocImplementsTag, tagName: Identifier | undefined, className: JSDocImplementsTag["class"], comment: string | NodeArray | undefined): JSDocImplementsTag; + createJSDocAuthorTag(tagName: Identifier | undefined, comment?: string | NodeArray): JSDocAuthorTag; + updateJSDocAuthorTag(node: JSDocAuthorTag, tagName: Identifier | undefined, comment: string | NodeArray | undefined): JSDocAuthorTag; + createJSDocClassTag(tagName: Identifier | undefined, comment?: string | NodeArray): JSDocClassTag; + updateJSDocClassTag(node: JSDocClassTag, tagName: Identifier | undefined, comment: string | NodeArray | undefined): JSDocClassTag; + createJSDocPublicTag(tagName: Identifier | undefined, comment?: string | NodeArray): JSDocPublicTag; + updateJSDocPublicTag(node: JSDocPublicTag, tagName: Identifier | undefined, comment: string | NodeArray | undefined): JSDocPublicTag; + createJSDocPrivateTag(tagName: Identifier | undefined, comment?: string | NodeArray): JSDocPrivateTag; + updateJSDocPrivateTag(node: JSDocPrivateTag, tagName: Identifier | undefined, comment: string | NodeArray | undefined): JSDocPrivateTag; + createJSDocProtectedTag(tagName: Identifier | undefined, comment?: string | NodeArray): JSDocProtectedTag; + updateJSDocProtectedTag(node: JSDocProtectedTag, tagName: Identifier | undefined, comment: string | NodeArray | undefined): JSDocProtectedTag; + createJSDocReadonlyTag(tagName: Identifier | undefined, comment?: string | NodeArray): JSDocReadonlyTag; + updateJSDocReadonlyTag(node: JSDocReadonlyTag, tagName: Identifier | undefined, comment: string | NodeArray | undefined): JSDocReadonlyTag; + createJSDocUnknownTag(tagName: Identifier, comment?: string | NodeArray): JSDocUnknownTag; + updateJSDocUnknownTag(node: JSDocUnknownTag, tagName: Identifier, comment: string | NodeArray | undefined): JSDocUnknownTag; + createJSDocDeprecatedTag(tagName: Identifier | undefined, comment?: string | NodeArray): JSDocDeprecatedTag; + updateJSDocDeprecatedTag(node: JSDocDeprecatedTag, tagName: Identifier | undefined, comment?: string | NodeArray): JSDocDeprecatedTag; + createJSDocOverrideTag(tagName: Identifier | undefined, comment?: string | NodeArray): JSDocOverrideTag; + updateJSDocOverrideTag(node: JSDocOverrideTag, tagName: Identifier | undefined, comment?: string | NodeArray): JSDocOverrideTag; + createJSDocThrowsTag(tagName: Identifier, typeExpression: JSDocTypeExpression | undefined, comment?: string | NodeArray): JSDocThrowsTag; + updateJSDocThrowsTag(node: JSDocThrowsTag, tagName: Identifier | undefined, typeExpression: JSDocTypeExpression | undefined, comment?: string | NodeArray | undefined): JSDocThrowsTag; + createJSDocSatisfiesTag(tagName: Identifier | undefined, typeExpression: JSDocTypeExpression, comment?: string | NodeArray): JSDocSatisfiesTag; + updateJSDocSatisfiesTag(node: JSDocSatisfiesTag, tagName: Identifier | undefined, typeExpression: JSDocTypeExpression, comment: string | NodeArray | undefined): JSDocSatisfiesTag; + createJSDocText(text: string): JSDocText; + updateJSDocText(node: JSDocText, text: string): JSDocText; + createJSDocComment(comment?: string | NodeArray | undefined, tags?: readonly JSDocTag[] | undefined): JSDoc; + updateJSDocComment(node: JSDoc, comment: string | NodeArray | undefined, tags: readonly JSDocTag[] | undefined): JSDoc; + createJsxElement(openingElement: JsxOpeningElement, children: readonly JsxChild[], closingElement: JsxClosingElement): JsxElement; + updateJsxElement(node: JsxElement, openingElement: JsxOpeningElement, children: readonly JsxChild[], closingElement: JsxClosingElement): JsxElement; + createJsxSelfClosingElement(tagName: JsxTagNameExpression, typeArguments: readonly TypeNode[] | undefined, attributes: JsxAttributes): JsxSelfClosingElement; + updateJsxSelfClosingElement(node: JsxSelfClosingElement, tagName: JsxTagNameExpression, typeArguments: readonly TypeNode[] | undefined, attributes: JsxAttributes): JsxSelfClosingElement; + createJsxOpeningElement(tagName: JsxTagNameExpression, typeArguments: readonly TypeNode[] | undefined, attributes: JsxAttributes): JsxOpeningElement; + updateJsxOpeningElement(node: JsxOpeningElement, tagName: JsxTagNameExpression, typeArguments: readonly TypeNode[] | undefined, attributes: JsxAttributes): JsxOpeningElement; + createJsxClosingElement(tagName: JsxTagNameExpression): JsxClosingElement; + updateJsxClosingElement(node: JsxClosingElement, tagName: JsxTagNameExpression): JsxClosingElement; + createJsxFragment(openingFragment: JsxOpeningFragment, children: readonly JsxChild[], closingFragment: JsxClosingFragment): JsxFragment; + createJsxText(text: string, containsOnlyTriviaWhiteSpaces?: boolean): JsxText; + updateJsxText(node: JsxText, text: string, containsOnlyTriviaWhiteSpaces?: boolean): JsxText; + createJsxOpeningFragment(): JsxOpeningFragment; + createJsxJsxClosingFragment(): JsxClosingFragment; + updateJsxFragment(node: JsxFragment, openingFragment: JsxOpeningFragment, children: readonly JsxChild[], closingFragment: JsxClosingFragment): JsxFragment; + createJsxAttribute(name: JsxAttributeName, initializer: JsxAttributeValue | undefined): JsxAttribute; + updateJsxAttribute(node: JsxAttribute, name: JsxAttributeName, initializer: JsxAttributeValue | undefined): JsxAttribute; + createJsxAttributes(properties: readonly JsxAttributeLike[]): JsxAttributes; + updateJsxAttributes(node: JsxAttributes, properties: readonly JsxAttributeLike[]): JsxAttributes; + createJsxSpreadAttribute(expression: Expression): JsxSpreadAttribute; + updateJsxSpreadAttribute(node: JsxSpreadAttribute, expression: Expression): JsxSpreadAttribute; + createJsxExpression(dotDotDotToken: DotDotDotToken | undefined, expression: Expression | undefined): JsxExpression; + updateJsxExpression(node: JsxExpression, expression: Expression | undefined): JsxExpression; + createJsxNamespacedName(namespace: Identifier, name: Identifier): JsxNamespacedName; + updateJsxNamespacedName(node: JsxNamespacedName, namespace: Identifier, name: Identifier): JsxNamespacedName; + createCaseClause(expression: Expression, statements: readonly Statement[]): CaseClause; + updateCaseClause(node: CaseClause, expression: Expression, statements: readonly Statement[]): CaseClause; + createDefaultClause(statements: readonly Statement[]): DefaultClause; + updateDefaultClause(node: DefaultClause, statements: readonly Statement[]): DefaultClause; + createHeritageClause(token: HeritageClause["token"], types: readonly ExpressionWithTypeArguments[]): HeritageClause; + updateHeritageClause(node: HeritageClause, types: readonly ExpressionWithTypeArguments[]): HeritageClause; + createCatchClause(variableDeclaration: string | BindingName | VariableDeclaration | undefined, block: Block): CatchClause; + updateCatchClause(node: CatchClause, variableDeclaration: VariableDeclaration | undefined, block: Block): CatchClause; + createPropertyAssignment(name: string | PropertyName, initializer: Expression): PropertyAssignment; + updatePropertyAssignment(node: PropertyAssignment, name: PropertyName, initializer: Expression): PropertyAssignment; + createShorthandPropertyAssignment(name: string | Identifier, objectAssignmentInitializer?: Expression): ShorthandPropertyAssignment; + updateShorthandPropertyAssignment(node: ShorthandPropertyAssignment, name: Identifier, objectAssignmentInitializer: Expression | undefined): ShorthandPropertyAssignment; + createSpreadAssignment(expression: Expression): SpreadAssignment; + updateSpreadAssignment(node: SpreadAssignment, expression: Expression): SpreadAssignment; + createEnumMember(name: string | PropertyName, initializer?: Expression): EnumMember; + updateEnumMember(node: EnumMember, name: PropertyName, initializer: Expression | undefined): EnumMember; + createSourceFile(statements: readonly Statement[], endOfFileToken: EndOfFileToken, flags: NodeFlags): SourceFile; + updateSourceFile(node: SourceFile, statements: readonly Statement[], isDeclarationFile?: boolean, referencedFiles?: readonly FileReference[], typeReferences?: readonly FileReference[], hasNoDefaultLib?: boolean, libReferences?: readonly FileReference[]): SourceFile; + createNotEmittedStatement(original: Node): NotEmittedStatement; + createPartiallyEmittedExpression(expression: Expression, original?: Node): PartiallyEmittedExpression; + updatePartiallyEmittedExpression(node: PartiallyEmittedExpression, expression: Expression): PartiallyEmittedExpression; + createCommaListExpression(elements: readonly Expression[]): CommaListExpression; + updateCommaListExpression(node: CommaListExpression, elements: readonly Expression[]): CommaListExpression; + createBundle(sourceFiles: readonly SourceFile[]): Bundle; + /** @deprecated*/ createBundle(sourceFiles: readonly SourceFile[], prepends?: readonly (UnparsedSource | InputFiles)[]): Bundle; + updateBundle(node: Bundle, sourceFiles: readonly SourceFile[]): Bundle; + /** @deprecated*/ updateBundle(node: Bundle, sourceFiles: readonly SourceFile[], prepends?: readonly (UnparsedSource | InputFiles)[]): Bundle; + createComma(left: Expression, right: Expression): BinaryExpression; + createAssignment(left: ObjectLiteralExpression | ArrayLiteralExpression, right: Expression): DestructuringAssignment; + createAssignment(left: Expression, right: Expression): AssignmentExpression; + createLogicalOr(left: Expression, right: Expression): BinaryExpression; + createLogicalAnd(left: Expression, right: Expression): BinaryExpression; + createBitwiseOr(left: Expression, right: Expression): BinaryExpression; + createBitwiseXor(left: Expression, right: Expression): BinaryExpression; + createBitwiseAnd(left: Expression, right: Expression): BinaryExpression; + createStrictEquality(left: Expression, right: Expression): BinaryExpression; + createStrictInequality(left: Expression, right: Expression): BinaryExpression; + createEquality(left: Expression, right: Expression): BinaryExpression; + createInequality(left: Expression, right: Expression): BinaryExpression; + createLessThan(left: Expression, right: Expression): BinaryExpression; + createLessThanEquals(left: Expression, right: Expression): BinaryExpression; + createGreaterThan(left: Expression, right: Expression): BinaryExpression; + createGreaterThanEquals(left: Expression, right: Expression): BinaryExpression; + createLeftShift(left: Expression, right: Expression): BinaryExpression; + createRightShift(left: Expression, right: Expression): BinaryExpression; + createUnsignedRightShift(left: Expression, right: Expression): BinaryExpression; + createAdd(left: Expression, right: Expression): BinaryExpression; + createSubtract(left: Expression, right: Expression): BinaryExpression; + createMultiply(left: Expression, right: Expression): BinaryExpression; + createDivide(left: Expression, right: Expression): BinaryExpression; + createModulo(left: Expression, right: Expression): BinaryExpression; + createExponent(left: Expression, right: Expression): BinaryExpression; + createPrefixPlus(operand: Expression): PrefixUnaryExpression; + createPrefixMinus(operand: Expression): PrefixUnaryExpression; + createPrefixIncrement(operand: Expression): PrefixUnaryExpression; + createPrefixDecrement(operand: Expression): PrefixUnaryExpression; + createBitwiseNot(operand: Expression): PrefixUnaryExpression; + createLogicalNot(operand: Expression): PrefixUnaryExpression; + createPostfixIncrement(operand: Expression): PostfixUnaryExpression; + createPostfixDecrement(operand: Expression): PostfixUnaryExpression; + createImmediatelyInvokedFunctionExpression(statements: readonly Statement[]): CallExpression; + createImmediatelyInvokedFunctionExpression(statements: readonly Statement[], param: ParameterDeclaration, paramValue: Expression): CallExpression; + createImmediatelyInvokedArrowFunction(statements: readonly Statement[]): CallExpression; + createImmediatelyInvokedArrowFunction(statements: readonly Statement[], param: ParameterDeclaration, paramValue: Expression): CallExpression; + createVoidZero(): VoidExpression; + createExportDefault(expression: Expression): ExportAssignment; + createExternalModuleExport(exportName: Identifier): ExportDeclaration; + restoreOuterExpressions(outerExpression: Expression | undefined, innerExpression: Expression, kinds?: OuterExpressionKinds): Expression; + } + interface CoreTransformationContext { + readonly factory: NodeFactory; + /** Gets the compiler options supplied to the transformer. */ + getCompilerOptions(): CompilerOptions; + /** Starts a new lexical environment. */ + startLexicalEnvironment(): void; + /** Suspends the current lexical environment, usually after visiting a parameter list. */ + suspendLexicalEnvironment(): void; + /** Resumes a suspended lexical environment, usually before visiting a function body. */ + resumeLexicalEnvironment(): void; + /** Ends a lexical environment, returning any declarations. */ + endLexicalEnvironment(): Statement[] | undefined; + /** Hoists a function declaration to the containing scope. */ + hoistFunctionDeclaration(node: FunctionDeclaration): void; + /** Hoists a variable declaration to the containing scope. */ + hoistVariableDeclaration(node: Identifier): void; + } + interface TransformationContext extends CoreTransformationContext { + /** Records a request for a non-scoped emit helper in the current context. */ + requestEmitHelper(helper: EmitHelper): void; + /** Gets and resets the requested non-scoped emit helpers. */ + readEmitHelpers(): EmitHelper[] | undefined; + /** Enables expression substitutions in the pretty printer for the provided SyntaxKind. */ + enableSubstitution(kind: SyntaxKind): void; + /** Determines whether expression substitutions are enabled for the provided node. */ + isSubstitutionEnabled(node: Node): boolean; + /** + * Hook used by transformers to substitute expressions just before they + * are emitted by the pretty printer. + * + * NOTE: Transformation hooks should only be modified during `Transformer` initialization, + * before returning the `NodeTransformer` callback. + */ + onSubstituteNode: (hint: EmitHint, node: Node) => Node; + /** + * Enables before/after emit notifications in the pretty printer for the provided + * SyntaxKind. + */ + enableEmitNotification(kind: SyntaxKind): void; + /** + * Determines whether before/after emit notifications should be raised in the pretty + * printer when it emits a node. + */ + isEmitNotificationEnabled(node: Node): boolean; + /** + * Hook used to allow transformers to capture state before or after + * the printer emits a node. + * + * NOTE: Transformation hooks should only be modified during `Transformer` initialization, + * before returning the `NodeTransformer` callback. + */ + onEmitNode: (hint: EmitHint, node: Node, emitCallback: (hint: EmitHint, node: Node) => void) => void; + } + interface TransformationResult { + /** Gets the transformed source files. */ + transformed: T[]; + /** Gets diagnostics for the transformation. */ + diagnostics?: DiagnosticWithLocation[]; + /** + * Gets a substitute for a node, if one is available; otherwise, returns the original node. + * + * @param hint A hint as to the intended usage of the node. + * @param node The node to substitute. + */ + substituteNode(hint: EmitHint, node: Node): Node; + /** + * Emits a node with possible notification. + * + * @param hint A hint as to the intended usage of the node. + * @param node The node to emit. + * @param emitCallback A callback used to emit the node. + */ + emitNodeWithNotification(hint: EmitHint, node: Node, emitCallback: (hint: EmitHint, node: Node) => void): void; + /** + * Indicates if a given node needs an emit notification + * + * @param node The node to emit. + */ + isEmitNotificationEnabled?(node: Node): boolean; + /** + * Clean up EmitNode entries on any parse-tree nodes. + */ + dispose(): void; + } + /** + * A function that is used to initialize and return a `Transformer` callback, which in turn + * will be used to transform one or more nodes. + */ + type TransformerFactory = (context: TransformationContext) => Transformer; + /** + * A function that transforms a node. + */ + type Transformer = (node: T) => T; + /** + * A function that accepts and possibly transforms a node. + */ + type Visitor = (node: TIn) => VisitResult; + /** + * A function that walks a node using the given visitor, lifting node arrays into single nodes, + * returning an node which satisfies the test. + * + * - If the input node is undefined, then the output is undefined. + * - If the visitor returns undefined, then the output is undefined. + * - If the output node is not undefined, then it will satisfy the test function. + * - In order to obtain a return type that is more specific than `Node`, a test + * function _must_ be provided, and that function must be a type predicate. + * + * For the canonical implementation of this type, @see {visitNode}. + */ + interface NodeVisitor { + (node: TIn, visitor: Visitor, TVisited>, test: (node: Node) => node is TOut, lift?: (node: readonly Node[]) => Node): TOut | (TIn & undefined) | (TVisited & undefined); + (node: TIn, visitor: Visitor, TVisited>, test?: (node: Node) => boolean, lift?: (node: readonly Node[]) => Node): Node | (TIn & undefined) | (TVisited & undefined); + } + /** + * A function that walks a node array using the given visitor, returning an array whose contents satisfy the test. + * + * - If the input node array is undefined, the output is undefined. + * - If the visitor can return undefined, the node it visits in the array will be reused. + * - If the output node array is not undefined, then its contents will satisfy the test. + * - In order to obtain a return type that is more specific than `NodeArray`, a test + * function _must_ be provided, and that function must be a type predicate. + * + * For the canonical implementation of this type, @see {visitNodes}. + */ + interface NodesVisitor { + | undefined, TOut extends Node>(nodes: TInArray, visitor: Visitor, test: (node: Node) => node is TOut, start?: number, count?: number): NodeArray | (TInArray & undefined); + | undefined>(nodes: TInArray, visitor: Visitor, test?: (node: Node) => boolean, start?: number, count?: number): NodeArray | (TInArray & undefined); + } + type VisitResult = T | readonly Node[]; + interface Printer { + /** + * Print a node and its subtree as-is, without any emit transformations. + * @param hint A value indicating the purpose of a node. This is primarily used to + * distinguish between an `Identifier` used in an expression position, versus an + * `Identifier` used as an `IdentifierName` as part of a declaration. For most nodes you + * should just pass `Unspecified`. + * @param node The node to print. The node and its subtree are printed as-is, without any + * emit transformations. + * @param sourceFile A source file that provides context for the node. The source text of + * the file is used to emit the original source content for literals and identifiers, while + * the identifiers of the source file are used when generating unique names to avoid + * collisions. + */ + printNode(hint: EmitHint, node: Node, sourceFile: SourceFile): string; + /** + * Prints a list of nodes using the given format flags + */ + printList(format: ListFormat, list: NodeArray, sourceFile: SourceFile): string; + /** + * Prints a source file as-is, without any emit transformations. + */ + printFile(sourceFile: SourceFile): string; + /** + * Prints a bundle of source files as-is, without any emit transformations. + */ + printBundle(bundle: Bundle): string; + } + interface PrintHandlers { + /** + * A hook used by the Printer when generating unique names to avoid collisions with + * globally defined names that exist outside of the current source file. + */ + hasGlobalName?(name: string): boolean; + /** + * A hook used by the Printer to provide notifications prior to emitting a node. A + * compatible implementation **must** invoke `emitCallback` with the provided `hint` and + * `node` values. + * @param hint A hint indicating the intended purpose of the node. + * @param node The node to emit. + * @param emitCallback A callback that, when invoked, will emit the node. + * @example + * ```ts + * var printer = createPrinter(printerOptions, { + * onEmitNode(hint, node, emitCallback) { + * // set up or track state prior to emitting the node... + * emitCallback(hint, node); + * // restore state after emitting the node... + * } + * }); + * ``` + */ + onEmitNode?(hint: EmitHint, node: Node, emitCallback: (hint: EmitHint, node: Node) => void): void; + /** + * A hook used to check if an emit notification is required for a node. + * @param node The node to emit. + */ + isEmitNotificationEnabled?(node: Node): boolean; + /** + * A hook used by the Printer to perform just-in-time substitution of a node. This is + * primarily used by node transformations that need to substitute one node for another, + * such as replacing `myExportedVar` with `exports.myExportedVar`. + * @param hint A hint indicating the intended purpose of the node. + * @param node The node to emit. + * @example + * ```ts + * var printer = createPrinter(printerOptions, { + * substituteNode(hint, node) { + * // perform substitution if necessary... + * return node; + * } + * }); + * ``` + */ + substituteNode?(hint: EmitHint, node: Node): Node; + } + interface PrinterOptions { + removeComments?: boolean; + newLine?: NewLineKind; + omitTrailingSemicolon?: boolean; + noEmitHelpers?: boolean; + } + interface GetEffectiveTypeRootsHost { + getCurrentDirectory?(): string; + } + interface TextSpan { + start: number; + length: number; + } + interface TextChangeRange { + span: TextSpan; + newLength: number; + } + interface SyntaxList extends Node { + kind: SyntaxKind.SyntaxList; + _children: Node[]; + } + enum ListFormat { + None = 0, + SingleLine = 0, + MultiLine = 1, + PreserveLines = 2, + LinesMask = 3, + NotDelimited = 0, + BarDelimited = 4, + AmpersandDelimited = 8, + CommaDelimited = 16, + AsteriskDelimited = 32, + DelimitersMask = 60, + AllowTrailingComma = 64, + Indented = 128, + SpaceBetweenBraces = 256, + SpaceBetweenSiblings = 512, + Braces = 1024, + Parenthesis = 2048, + AngleBrackets = 4096, + SquareBrackets = 8192, + BracketsMask = 15360, + OptionalIfUndefined = 16384, + OptionalIfEmpty = 32768, + Optional = 49152, + PreferNewLine = 65536, + NoTrailingNewLine = 131072, + NoInterveningComments = 262144, + NoSpaceIfEmpty = 524288, + SingleElement = 1048576, + SpaceAfterList = 2097152, + Modifiers = 2359808, + HeritageClauses = 512, + SingleLineTypeLiteralMembers = 768, + MultiLineTypeLiteralMembers = 32897, + SingleLineTupleTypeElements = 528, + MultiLineTupleTypeElements = 657, + UnionTypeConstituents = 516, + IntersectionTypeConstituents = 520, + ObjectBindingPatternElements = 525136, + ArrayBindingPatternElements = 524880, + ObjectLiteralExpressionProperties = 526226, + ImportClauseEntries = 526226, + ArrayLiteralExpressionElements = 8914, + CommaListElements = 528, + CallExpressionArguments = 2576, + NewExpressionArguments = 18960, + TemplateExpressionSpans = 262144, + SingleLineBlockStatements = 768, + MultiLineBlockStatements = 129, + VariableDeclarationList = 528, + SingleLineFunctionBodyStatements = 768, + MultiLineFunctionBodyStatements = 1, + ClassHeritageClauses = 0, + ClassMembers = 129, + InterfaceMembers = 129, + EnumMembers = 145, + CaseBlockClauses = 129, + NamedImportsOrExportsElements = 525136, + JsxElementOrFragmentChildren = 262144, + JsxElementAttributes = 262656, + CaseOrDefaultClauseStatements = 163969, + HeritageClauseTypes = 528, + SourceFileStatements = 131073, + Decorators = 2146305, + TypeArguments = 53776, + TypeParameters = 53776, + Parameters = 2576, + IndexSignatureParameters = 8848, + JSDocComment = 33 + } + interface UserPreferences { + readonly disableSuggestions?: boolean; + readonly quotePreference?: "auto" | "double" | "single"; + readonly includeCompletionsForModuleExports?: boolean; + readonly includeCompletionsForImportStatements?: boolean; + readonly includeCompletionsWithSnippetText?: boolean; + readonly includeAutomaticOptionalChainCompletions?: boolean; + readonly includeCompletionsWithInsertText?: boolean; + readonly includeCompletionsWithClassMemberSnippets?: boolean; + readonly includeCompletionsWithObjectLiteralMethodSnippets?: boolean; + readonly useLabelDetailsInCompletionEntries?: boolean; + readonly allowIncompleteCompletions?: boolean; + readonly importModuleSpecifierPreference?: "shortest" | "project-relative" | "relative" | "non-relative"; + /** Determines whether we import `foo/index.ts` as "foo", "foo/index", or "foo/index.js" */ + readonly importModuleSpecifierEnding?: "auto" | "minimal" | "index" | "js"; + readonly allowTextChangesInNewFiles?: boolean; + readonly providePrefixAndSuffixTextForRename?: boolean; + readonly includePackageJsonAutoImports?: "auto" | "on" | "off"; + readonly provideRefactorNotApplicableReason?: boolean; + readonly jsxAttributeCompletionStyle?: "auto" | "braces" | "none"; + readonly includeInlayParameterNameHints?: "none" | "literals" | "all"; + readonly includeInlayParameterNameHintsWhenArgumentMatchesName?: boolean; + readonly includeInlayFunctionParameterTypeHints?: boolean; + readonly includeInlayVariableTypeHints?: boolean; + readonly includeInlayVariableTypeHintsWhenTypeMatchesName?: boolean; + readonly includeInlayPropertyDeclarationTypeHints?: boolean; + readonly includeInlayFunctionLikeReturnTypeHints?: boolean; + readonly includeInlayEnumMemberValueHints?: boolean; + readonly allowRenameOfImportPath?: boolean; + readonly autoImportFileExcludePatterns?: string[]; + readonly organizeImportsIgnoreCase?: "auto" | boolean; + readonly organizeImportsCollation?: "ordinal" | "unicode"; + readonly organizeImportsLocale?: string; + readonly organizeImportsNumericCollation?: boolean; + readonly organizeImportsAccentCollation?: boolean; + readonly organizeImportsCaseFirst?: "upper" | "lower" | false; + } + /** Represents a bigint literal value without requiring bigint support */ + interface PseudoBigInt { + negative: boolean; + base10Value: string; + } + enum FileWatcherEventKind { + Created = 0, + Changed = 1, + Deleted = 2 + } + type FileWatcherCallback = (fileName: string, eventKind: FileWatcherEventKind, modifiedTime?: Date) => void; + type DirectoryWatcherCallback = (fileName: string) => void; + type BufferEncoding = "ascii" | "utf8" | "utf-8" | "utf16le" | "ucs2" | "ucs-2" | "base64" | "latin1" | "binary" | "hex"; + interface System { + args: string[]; + newLine: string; + useCaseSensitiveFileNames: boolean; + write(s: string): void; + writeOutputIsTTY?(): boolean; + getWidthOfTerminal?(): number; + readFile(path: string, encoding?: string): string | undefined; + getFileSize?(path: string): number; + writeFile(path: string, data: string, writeByteOrderMark?: boolean): void; + /** + * @pollingInterval - this parameter is used in polling-based watchers and ignored in watchers that + * use native OS file watching + */ + watchFile?(path: string, callback: FileWatcherCallback, pollingInterval?: number, options?: WatchOptions): FileWatcher; + watchDirectory?(path: string, callback: DirectoryWatcherCallback, recursive?: boolean, options?: WatchOptions): FileWatcher; + resolvePath(path: string): string; + fileExists(path: string): boolean; + directoryExists(path: string): boolean; + createDirectory(path: string): void; + getExecutingFilePath(): string; + getCurrentDirectory(): string; + getDirectories(path: string): string[]; + readDirectory(path: string, extensions?: readonly string[], exclude?: readonly string[], include?: readonly string[], depth?: number): string[]; + getModifiedTime?(path: string): Date | undefined; + setModifiedTime?(path: string, time: Date): void; + deleteFile?(path: string): void; + /** + * A good implementation is node.js' `crypto.createHash`. (https://nodejs.org/api/crypto.html#crypto_crypto_createhash_algorithm) + */ + createHash?(data: string): string; + /** This must be cryptographically secure. Only implement this method using `crypto.createHash("sha256")`. */ + createSHA256Hash?(data: string): string; + getMemoryUsage?(): number; + exit(exitCode?: number): void; + realpath?(path: string): string; + setTimeout?(callback: (...args: any[]) => void, ms: number, ...args: any[]): any; + clearTimeout?(timeoutId: any): void; + clearScreen?(): void; + base64decode?(input: string): string; + base64encode?(input: string): string; + } + interface FileWatcher { + close(): void; + } + let sys: System; + function tokenToString(t: SyntaxKind): string | undefined; + function getPositionOfLineAndCharacter(sourceFile: SourceFileLike, line: number, character: number): number; + function getLineAndCharacterOfPosition(sourceFile: SourceFileLike, position: number): LineAndCharacter; + function isWhiteSpaceLike(ch: number): boolean; + /** Does not include line breaks. For that, see isWhiteSpaceLike. */ + function isWhiteSpaceSingleLine(ch: number): boolean; + function isLineBreak(ch: number): boolean; + function couldStartTrivia(text: string, pos: number): boolean; + function forEachLeadingCommentRange(text: string, pos: number, cb: (pos: number, end: number, kind: CommentKind, hasTrailingNewLine: boolean) => U): U | undefined; + function forEachLeadingCommentRange(text: string, pos: number, cb: (pos: number, end: number, kind: CommentKind, hasTrailingNewLine: boolean, state: T) => U, state: T): U | undefined; + function forEachTrailingCommentRange(text: string, pos: number, cb: (pos: number, end: number, kind: CommentKind, hasTrailingNewLine: boolean) => U): U | undefined; + function forEachTrailingCommentRange(text: string, pos: number, cb: (pos: number, end: number, kind: CommentKind, hasTrailingNewLine: boolean, state: T) => U, state: T): U | undefined; + function reduceEachLeadingCommentRange(text: string, pos: number, cb: (pos: number, end: number, kind: CommentKind, hasTrailingNewLine: boolean, state: T) => U, state: T, initial: U): U | undefined; + function reduceEachTrailingCommentRange(text: string, pos: number, cb: (pos: number, end: number, kind: CommentKind, hasTrailingNewLine: boolean, state: T) => U, state: T, initial: U): U | undefined; + function getLeadingCommentRanges(text: string, pos: number): CommentRange[] | undefined; + function getTrailingCommentRanges(text: string, pos: number): CommentRange[] | undefined; + /** Optionally, get the shebang */ + function getShebang(text: string): string | undefined; + function isIdentifierStart(ch: number, languageVersion: ScriptTarget | undefined): boolean; + function isIdentifierPart(ch: number, languageVersion: ScriptTarget | undefined, identifierVariant?: LanguageVariant): boolean; + function createScanner(languageVersion: ScriptTarget, skipTrivia: boolean, languageVariant?: LanguageVariant, textInitial?: string, onError?: ErrorCallback, start?: number, length?: number): Scanner; + type ErrorCallback = (message: DiagnosticMessage, length: number, arg0?: any) => void; + interface Scanner { + /** @deprecated use {@link getTokenFullStart} */ + getStartPos(): number; + getToken(): SyntaxKind; + getTokenFullStart(): number; + getTokenStart(): number; + getTokenEnd(): number; + /** @deprecated use {@link getTokenEnd} */ + getTextPos(): number; + /** @deprecated use {@link getTokenStart} */ + getTokenPos(): number; + getTokenText(): string; + getTokenValue(): string; + hasUnicodeEscape(): boolean; + hasExtendedUnicodeEscape(): boolean; + hasPrecedingLineBreak(): boolean; + isIdentifier(): boolean; + isReservedWord(): boolean; + isUnterminated(): boolean; + reScanGreaterToken(): SyntaxKind; + reScanSlashToken(): SyntaxKind; + reScanAsteriskEqualsToken(): SyntaxKind; + reScanTemplateToken(isTaggedTemplate: boolean): SyntaxKind; + /** @deprecated use {@link reScanTemplateToken}(false) */ + reScanTemplateHeadOrNoSubstitutionTemplate(): SyntaxKind; + scanJsxIdentifier(): SyntaxKind; + scanJsxAttributeValue(): SyntaxKind; + reScanJsxAttributeValue(): SyntaxKind; + reScanJsxToken(allowMultilineJsxText?: boolean): JsxTokenSyntaxKind; + reScanLessThanToken(): SyntaxKind; + reScanHashToken(): SyntaxKind; + reScanQuestionToken(): SyntaxKind; + reScanInvalidIdentifier(): SyntaxKind; + scanJsxToken(): JsxTokenSyntaxKind; + scanJsDocToken(): JSDocSyntaxKind; + scan(): SyntaxKind; + getText(): string; + setText(text: string | undefined, start?: number, length?: number): void; + setOnError(onError: ErrorCallback | undefined): void; + setScriptTarget(scriptTarget: ScriptTarget): void; + setLanguageVariant(variant: LanguageVariant): void; + /** @deprecated use {@link resetTokenState} */ + setTextPos(textPos: number): void; + resetTokenState(pos: number): void; + lookAhead(callback: () => T): T; + scanRange(start: number, length: number, callback: () => T): T; + tryScan(callback: () => T): T; + } + function isExternalModuleNameRelative(moduleName: string): boolean; + function sortAndDeduplicateDiagnostics(diagnostics: readonly T[]): SortedReadonlyArray; + function getDefaultLibFileName(options: CompilerOptions): string; + function textSpanEnd(span: TextSpan): number; + function textSpanIsEmpty(span: TextSpan): boolean; + function textSpanContainsPosition(span: TextSpan, position: number): boolean; + function textSpanContainsTextSpan(span: TextSpan, other: TextSpan): boolean; + function textSpanOverlapsWith(span: TextSpan, other: TextSpan): boolean; + function textSpanOverlap(span1: TextSpan, span2: TextSpan): TextSpan | undefined; + function textSpanIntersectsWithTextSpan(span: TextSpan, other: TextSpan): boolean; + function textSpanIntersectsWith(span: TextSpan, start: number, length: number): boolean; + function decodedTextSpanIntersectsWith(start1: number, length1: number, start2: number, length2: number): boolean; + function textSpanIntersectsWithPosition(span: TextSpan, position: number): boolean; + function textSpanIntersection(span1: TextSpan, span2: TextSpan): TextSpan | undefined; + function createTextSpan(start: number, length: number): TextSpan; + function createTextSpanFromBounds(start: number, end: number): TextSpan; + function textChangeRangeNewSpan(range: TextChangeRange): TextSpan; + function textChangeRangeIsUnchanged(range: TextChangeRange): boolean; + function createTextChangeRange(span: TextSpan, newLength: number): TextChangeRange; + /** + * Called to merge all the changes that occurred across several versions of a script snapshot + * into a single change. i.e. if a user keeps making successive edits to a script we will + * have a text change from V1 to V2, V2 to V3, ..., Vn. + * + * This function will then merge those changes into a single change range valid between V1 and + * Vn. + */ + function collapseTextChangeRangesAcrossMultipleVersions(changes: readonly TextChangeRange[]): TextChangeRange; + function getTypeParameterOwner(d: Declaration): Declaration | undefined; + function isParameterPropertyDeclaration(node: Node, parent: Node): node is ParameterPropertyDeclaration; + function isEmptyBindingPattern(node: BindingName): node is BindingPattern; + function isEmptyBindingElement(node: BindingElement | ArrayBindingElement): boolean; + function walkUpBindingElementsAndPatterns(binding: BindingElement): VariableDeclaration | ParameterDeclaration; + function getCombinedModifierFlags(node: Declaration): ModifierFlags; + function getCombinedNodeFlags(node: Node): NodeFlags; + /** + * Checks to see if the locale is in the appropriate format, + * and if it is, attempts to set the appropriate language. + */ + function validateLocaleAndSetLanguage(locale: string, sys: { + getExecutingFilePath(): string; + resolvePath(path: string): string; + fileExists(fileName: string): boolean; + readFile(fileName: string): string | undefined; + }, errors?: Diagnostic[]): void; + function getOriginalNode(node: Node): Node; + function getOriginalNode(node: Node, nodeTest: (node: Node) => node is T): T; + function getOriginalNode(node: Node | undefined): Node | undefined; + function getOriginalNode(node: Node | undefined, nodeTest: (node: Node) => node is T): T | undefined; + /** + * Iterates through the parent chain of a node and performs the callback on each parent until the callback + * returns a truthy value, then returns that value. + * If no such value is found, it applies the callback until the parent pointer is undefined or the callback returns "quit" + * At that point findAncestor returns undefined. + */ + function findAncestor(node: Node | undefined, callback: (element: Node) => element is T): T | undefined; + function findAncestor(node: Node | undefined, callback: (element: Node) => boolean | "quit"): Node | undefined; + /** + * Gets a value indicating whether a node originated in the parse tree. + * + * @param node The node to test. + */ + function isParseTreeNode(node: Node): boolean; + /** + * Gets the original parse tree node for a node. + * + * @param node The original node. + * @returns The original parse tree node if found; otherwise, undefined. + */ + function getParseTreeNode(node: Node | undefined): Node | undefined; + /** + * Gets the original parse tree node for a node. + * + * @param node The original node. + * @param nodeTest A callback used to ensure the correct type of parse tree node is returned. + * @returns The original parse tree node if found; otherwise, undefined. + */ + function getParseTreeNode(node: T | undefined, nodeTest?: (node: Node) => node is T): T | undefined; + /** Add an extra underscore to identifiers that start with two underscores to avoid issues with magic names like '__proto__' */ + function escapeLeadingUnderscores(identifier: string): __String; + /** + * Remove extra underscore from escaped identifier text content. + * + * @param identifier The escaped identifier text. + * @returns The unescaped identifier text. + */ + function unescapeLeadingUnderscores(identifier: __String): string; + function idText(identifierOrPrivateName: Identifier | PrivateIdentifier): string; + /** + * If the text of an Identifier matches a keyword (including contextual and TypeScript-specific keywords), returns the + * SyntaxKind for the matching keyword. + */ + function identifierToKeywordKind(node: Identifier): KeywordSyntaxKind | undefined; + function symbolName(symbol: Symbol): string; + function getNameOfJSDocTypedef(declaration: JSDocTypedefTag): Identifier | PrivateIdentifier | undefined; + function getNameOfDeclaration(declaration: Declaration | Expression | undefined): DeclarationName | undefined; + function getDecorators(node: HasDecorators): readonly Decorator[] | undefined; + function getModifiers(node: HasModifiers): readonly Modifier[] | undefined; + /** + * Gets the JSDoc parameter tags for the node if present. + * + * @remarks Returns any JSDoc param tag whose name matches the provided + * parameter, whether a param tag on a containing function + * expression, or a param tag on a variable declaration whose + * initializer is the containing function. The tags closest to the + * node are returned first, so in the previous example, the param + * tag on the containing function expression would be first. + * + * For binding patterns, parameter tags are matched by position. + */ + function getJSDocParameterTags(param: ParameterDeclaration): readonly JSDocParameterTag[]; + /** + * Gets the JSDoc type parameter tags for the node if present. + * + * @remarks Returns any JSDoc template tag whose names match the provided + * parameter, whether a template tag on a containing function + * expression, or a template tag on a variable declaration whose + * initializer is the containing function. The tags closest to the + * node are returned first, so in the previous example, the template + * tag on the containing function expression would be first. + */ + function getJSDocTypeParameterTags(param: TypeParameterDeclaration): readonly JSDocTemplateTag[]; + /** + * Return true if the node has JSDoc parameter tags. + * + * @remarks Includes parameter tags that are not directly on the node, + * for example on a variable declaration whose initializer is a function expression. + */ + function hasJSDocParameterTags(node: FunctionLikeDeclaration | SignatureDeclaration): boolean; + /** Gets the JSDoc augments tag for the node if present */ + function getJSDocAugmentsTag(node: Node): JSDocAugmentsTag | undefined; + /** Gets the JSDoc implements tags for the node if present */ + function getJSDocImplementsTags(node: Node): readonly JSDocImplementsTag[]; + /** Gets the JSDoc class tag for the node if present */ + function getJSDocClassTag(node: Node): JSDocClassTag | undefined; + /** Gets the JSDoc public tag for the node if present */ + function getJSDocPublicTag(node: Node): JSDocPublicTag | undefined; + /** Gets the JSDoc private tag for the node if present */ + function getJSDocPrivateTag(node: Node): JSDocPrivateTag | undefined; + /** Gets the JSDoc protected tag for the node if present */ + function getJSDocProtectedTag(node: Node): JSDocProtectedTag | undefined; + /** Gets the JSDoc protected tag for the node if present */ + function getJSDocReadonlyTag(node: Node): JSDocReadonlyTag | undefined; + function getJSDocOverrideTagNoCache(node: Node): JSDocOverrideTag | undefined; + /** Gets the JSDoc deprecated tag for the node if present */ + function getJSDocDeprecatedTag(node: Node): JSDocDeprecatedTag | undefined; + /** Gets the JSDoc enum tag for the node if present */ + function getJSDocEnumTag(node: Node): JSDocEnumTag | undefined; + /** Gets the JSDoc this tag for the node if present */ + function getJSDocThisTag(node: Node): JSDocThisTag | undefined; + /** Gets the JSDoc return tag for the node if present */ + function getJSDocReturnTag(node: Node): JSDocReturnTag | undefined; + /** Gets the JSDoc template tag for the node if present */ + function getJSDocTemplateTag(node: Node): JSDocTemplateTag | undefined; + function getJSDocSatisfiesTag(node: Node): JSDocSatisfiesTag | undefined; + /** Gets the JSDoc type tag for the node if present and valid */ + function getJSDocTypeTag(node: Node): JSDocTypeTag | undefined; + /** + * Gets the type node for the node if provided via JSDoc. + * + * @remarks The search includes any JSDoc param tag that relates + * to the provided parameter, for example a type tag on the + * parameter itself, or a param tag on a containing function + * expression, or a param tag on a variable declaration whose + * initializer is the containing function. The tags closest to the + * node are examined first, so in the previous example, the type + * tag directly on the node would be returned. + */ + function getJSDocType(node: Node): TypeNode | undefined; + /** + * Gets the return type node for the node if provided via JSDoc return tag or type tag. + * + * @remarks `getJSDocReturnTag` just gets the whole JSDoc tag. This function + * gets the type from inside the braces, after the fat arrow, etc. + */ + function getJSDocReturnType(node: Node): TypeNode | undefined; + /** Get all JSDoc tags related to a node, including those on parent nodes. */ + function getJSDocTags(node: Node): readonly JSDocTag[]; + /** Gets all JSDoc tags that match a specified predicate */ + function getAllJSDocTags(node: Node, predicate: (tag: JSDocTag) => tag is T): readonly T[]; + /** Gets all JSDoc tags of a specified kind */ + function getAllJSDocTagsOfKind(node: Node, kind: SyntaxKind): readonly JSDocTag[]; + /** Gets the text of a jsdoc comment, flattening links to their text. */ + function getTextOfJSDocComment(comment?: string | NodeArray): string | undefined; + /** + * Gets the effective type parameters. If the node was parsed in a + * JavaScript file, gets the type parameters from the `@template` tag from JSDoc. + * + * This does *not* return type parameters from a jsdoc reference to a generic type, eg + * + * type Id = (x: T) => T + * /** @type {Id} / + * function id(x) { return x } + */ + function getEffectiveTypeParameterDeclarations(node: DeclarationWithTypeParameters): readonly TypeParameterDeclaration[]; + function getEffectiveConstraintOfTypeParameter(node: TypeParameterDeclaration): TypeNode | undefined; + function isMemberName(node: Node): node is MemberName; + function isPropertyAccessChain(node: Node): node is PropertyAccessChain; + function isElementAccessChain(node: Node): node is ElementAccessChain; + function isCallChain(node: Node): node is CallChain; + function isOptionalChain(node: Node): node is PropertyAccessChain | ElementAccessChain | CallChain | NonNullChain; + function isNullishCoalesce(node: Node): boolean; + function isConstTypeReference(node: Node): boolean; + function skipPartiallyEmittedExpressions(node: Expression): Expression; + function skipPartiallyEmittedExpressions(node: Node): Node; + function isNonNullChain(node: Node): node is NonNullChain; + function isBreakOrContinueStatement(node: Node): node is BreakOrContinueStatement; + function isNamedExportBindings(node: Node): node is NamedExportBindings; + /** @deprecated */ + function isUnparsedTextLike(node: Node): node is UnparsedTextLike; + /** @deprecated */ + function isUnparsedNode(node: Node): node is UnparsedNode; + function isJSDocPropertyLikeTag(node: Node): node is JSDocPropertyLikeTag; + /** + * True if kind is of some token syntax kind. + * For example, this is true for an IfKeyword but not for an IfStatement. + * Literals are considered tokens, except TemplateLiteral, but does include TemplateHead/Middle/Tail. + */ + function isTokenKind(kind: SyntaxKind): boolean; + /** + * True if node is of some token syntax kind. + * For example, this is true for an IfKeyword but not for an IfStatement. + * Literals are considered tokens, except TemplateLiteral, but does include TemplateHead/Middle/Tail. + */ + function isToken(n: Node): boolean; + function isLiteralExpression(node: Node): node is LiteralExpression; + function isTemplateLiteralToken(node: Node): node is TemplateLiteralToken; + function isTemplateMiddleOrTemplateTail(node: Node): node is TemplateMiddle | TemplateTail; + function isImportOrExportSpecifier(node: Node): node is ImportSpecifier | ExportSpecifier; + function isTypeOnlyImportDeclaration(node: Node): node is TypeOnlyImportDeclaration; + function isTypeOnlyExportDeclaration(node: Node): node is TypeOnlyExportDeclaration; + function isTypeOnlyImportOrExportDeclaration(node: Node): node is TypeOnlyAliasDeclaration; + function isAssertionKey(node: Node): node is AssertionKey; + function isStringTextContainingNode(node: Node): node is StringLiteral | TemplateLiteralToken; + function isModifier(node: Node): node is Modifier; + function isEntityName(node: Node): node is EntityName; + function isPropertyName(node: Node): node is PropertyName; + function isBindingName(node: Node): node is BindingName; + function isFunctionLike(node: Node | undefined): node is SignatureDeclaration; + function isClassElement(node: Node): node is ClassElement; + function isClassLike(node: Node): node is ClassLikeDeclaration; + function isAccessor(node: Node): node is AccessorDeclaration; + function isAutoAccessorPropertyDeclaration(node: Node): node is AutoAccessorPropertyDeclaration; + function isModifierLike(node: Node): node is ModifierLike; + function isTypeElement(node: Node): node is TypeElement; + function isClassOrTypeElement(node: Node): node is ClassElement | TypeElement; + function isObjectLiteralElementLike(node: Node): node is ObjectLiteralElementLike; + /** + * Node test that determines whether a node is a valid type node. + * This differs from the `isPartOfTypeNode` function which determines whether a node is *part* + * of a TypeNode. + */ + function isTypeNode(node: Node): node is TypeNode; + function isFunctionOrConstructorTypeNode(node: Node): node is FunctionTypeNode | ConstructorTypeNode; + function isArrayBindingElement(node: Node): node is ArrayBindingElement; + function isPropertyAccessOrQualifiedName(node: Node): node is PropertyAccessExpression | QualifiedName; + function isCallLikeExpression(node: Node): node is CallLikeExpression; + function isCallOrNewExpression(node: Node): node is CallExpression | NewExpression; + function isTemplateLiteral(node: Node): node is TemplateLiteral; + function isLeftHandSideExpression(node: Node): node is LeftHandSideExpression; + function isLiteralTypeLiteral(node: Node): node is NullLiteral | BooleanLiteral | LiteralExpression | PrefixUnaryExpression; + /** + * Determines whether a node is an expression based only on its kind. + */ + function isExpression(node: Node): node is Expression; + function isAssertionExpression(node: Node): node is AssertionExpression; + function isIterationStatement(node: Node, lookInLabeledStatements: false): node is IterationStatement; + function isIterationStatement(node: Node, lookInLabeledStatements: boolean): node is IterationStatement | LabeledStatement; + function isConciseBody(node: Node): node is ConciseBody; + function isForInitializer(node: Node): node is ForInitializer; + function isModuleBody(node: Node): node is ModuleBody; + function isNamedImportBindings(node: Node): node is NamedImportBindings; + function isStatement(node: Node): node is Statement; + function isModuleReference(node: Node): node is ModuleReference; + function isJsxTagNameExpression(node: Node): node is JsxTagNameExpression; + function isJsxChild(node: Node): node is JsxChild; + function isJsxAttributeLike(node: Node): node is JsxAttributeLike; + function isStringLiteralOrJsxExpression(node: Node): node is StringLiteral | JsxExpression; + function isJsxOpeningLikeElement(node: Node): node is JsxOpeningLikeElement; + function isCaseOrDefaultClause(node: Node): node is CaseOrDefaultClause; + /** True if node is of a kind that may contain comment text. */ + function isJSDocCommentContainingNode(node: Node): boolean; + function isSetAccessor(node: Node): node is SetAccessorDeclaration; + function isGetAccessor(node: Node): node is GetAccessorDeclaration; + /** True if has initializer node attached to it. */ + function hasOnlyExpressionInitializer(node: Node): node is HasExpressionInitializer; + function isObjectLiteralElement(node: Node): node is ObjectLiteralElement; + function isStringLiteralLike(node: Node | FileReference): node is StringLiteralLike; + function isJSDocLinkLike(node: Node): node is JSDocLink | JSDocLinkCode | JSDocLinkPlain; + function hasRestParameter(s: SignatureDeclaration | JSDocSignature): boolean; + function isRestParameter(node: ParameterDeclaration | JSDocParameterTag): boolean; + let unchangedTextChangeRange: TextChangeRange; + type ParameterPropertyDeclaration = ParameterDeclaration & { + parent: ConstructorDeclaration; + name: Identifier; + }; + /** + * This function checks multiple locations for JSDoc comments that apply to a host node. + * At each location, the whole comment may apply to the node, or only a specific tag in + * the comment. In the first case, location adds the entire {@link JSDoc} object. In the + * second case, it adds the applicable {@link JSDocTag}. + * + * For example, a JSDoc comment before a parameter adds the entire {@link JSDoc}. But a + * `@param` tag on the parent function only adds the {@link JSDocTag} for the `@param`. + * + * ```ts + * /** JSDoc will be returned for `a` *\/ + * const a = 0 + * /** + * * Entire JSDoc will be returned for `b` + * * @param c JSDocTag will be returned for `c` + * *\/ + * function b(/** JSDoc will be returned for `c` *\/ c) {} + * ``` + */ + function getJSDocCommentsAndTags(hostNode: Node): readonly (JSDoc | JSDocTag)[]; + /** @deprecated */ + function createUnparsedSourceFile(text: string): UnparsedSource; + /** @deprecated */ + function createUnparsedSourceFile(inputFile: InputFiles, type: "js" | "dts", stripInternal?: boolean): UnparsedSource; + /** @deprecated */ + function createUnparsedSourceFile(text: string, mapPath: string | undefined, map: string | undefined): UnparsedSource; + /** @deprecated */ + function createInputFiles(javascriptText: string, declarationText: string): InputFiles; + /** @deprecated */ + function createInputFiles(javascriptText: string, declarationText: string, javascriptMapPath: string | undefined, javascriptMapText: string | undefined, declarationMapPath: string | undefined, declarationMapText: string | undefined): InputFiles; + /** @deprecated */ + function createInputFiles(readFileText: (path: string) => string | undefined, javascriptPath: string, javascriptMapPath: string | undefined, declarationPath: string, declarationMapPath: string | undefined, buildInfoPath: string | undefined): InputFiles; + /** + * Create an external source map source file reference + */ + function createSourceMapSource(fileName: string, text: string, skipTrivia?: (pos: number) => number): SourceMapSource; + function setOriginalNode(node: T, original: Node | undefined): T; + const factory: NodeFactory; + /** + * Clears any `EmitNode` entries from parse-tree nodes. + * @param sourceFile A source file. + */ + function disposeEmitNodes(sourceFile: SourceFile | undefined): void; + /** + * Sets flags that control emit behavior of a node. + */ + function setEmitFlags(node: T, emitFlags: EmitFlags): T; + /** + * Gets a custom text range to use when emitting source maps. + */ + function getSourceMapRange(node: Node): SourceMapRange; + /** + * Sets a custom text range to use when emitting source maps. + */ + function setSourceMapRange(node: T, range: SourceMapRange | undefined): T; + /** + * Gets the TextRange to use for source maps for a token of a node. + */ + function getTokenSourceMapRange(node: Node, token: SyntaxKind): SourceMapRange | undefined; + /** + * Sets the TextRange to use for source maps for a token of a node. + */ + function setTokenSourceMapRange(node: T, token: SyntaxKind, range: SourceMapRange | undefined): T; + /** + * Gets a custom text range to use when emitting comments. + */ + function getCommentRange(node: Node): TextRange; + /** + * Sets a custom text range to use when emitting comments. + */ + function setCommentRange(node: T, range: TextRange): T; + function getSyntheticLeadingComments(node: Node): SynthesizedComment[] | undefined; + function setSyntheticLeadingComments(node: T, comments: SynthesizedComment[] | undefined): T; + function addSyntheticLeadingComment(node: T, kind: SyntaxKind.SingleLineCommentTrivia | SyntaxKind.MultiLineCommentTrivia, text: string, hasTrailingNewLine?: boolean): T; + function getSyntheticTrailingComments(node: Node): SynthesizedComment[] | undefined; + function setSyntheticTrailingComments(node: T, comments: SynthesizedComment[] | undefined): T; + function addSyntheticTrailingComment(node: T, kind: SyntaxKind.SingleLineCommentTrivia | SyntaxKind.MultiLineCommentTrivia, text: string, hasTrailingNewLine?: boolean): T; + function moveSyntheticComments(node: T, original: Node): T; + /** + * Gets the constant value to emit for an expression representing an enum. + */ + function getConstantValue(node: AccessExpression): string | number | undefined; + /** + * Sets the constant value to emit for an expression. + */ + function setConstantValue(node: AccessExpression, value: string | number): AccessExpression; + /** + * Adds an EmitHelper to a node. + */ + function addEmitHelper(node: T, helper: EmitHelper): T; + /** + * Add EmitHelpers to a node. + */ + function addEmitHelpers(node: T, helpers: EmitHelper[] | undefined): T; + /** + * Removes an EmitHelper from a node. + */ + function removeEmitHelper(node: Node, helper: EmitHelper): boolean; + /** + * Gets the EmitHelpers of a node. + */ + function getEmitHelpers(node: Node): EmitHelper[] | undefined; + /** + * Moves matching emit helpers from a source node to a target node. + */ + function moveEmitHelpers(source: Node, target: Node, predicate: (helper: EmitHelper) => boolean): void; + function isNumericLiteral(node: Node): node is NumericLiteral; + function isBigIntLiteral(node: Node): node is BigIntLiteral; + function isStringLiteral(node: Node): node is StringLiteral; + function isJsxText(node: Node): node is JsxText; + function isRegularExpressionLiteral(node: Node): node is RegularExpressionLiteral; + function isNoSubstitutionTemplateLiteral(node: Node): node is NoSubstitutionTemplateLiteral; + function isTemplateHead(node: Node): node is TemplateHead; + function isTemplateMiddle(node: Node): node is TemplateMiddle; + function isTemplateTail(node: Node): node is TemplateTail; + function isDotDotDotToken(node: Node): node is DotDotDotToken; + function isPlusToken(node: Node): node is PlusToken; + function isMinusToken(node: Node): node is MinusToken; + function isAsteriskToken(node: Node): node is AsteriskToken; + function isExclamationToken(node: Node): node is ExclamationToken; + function isQuestionToken(node: Node): node is QuestionToken; + function isColonToken(node: Node): node is ColonToken; + function isQuestionDotToken(node: Node): node is QuestionDotToken; + function isEqualsGreaterThanToken(node: Node): node is EqualsGreaterThanToken; + function isIdentifier(node: Node): node is Identifier; + function isPrivateIdentifier(node: Node): node is PrivateIdentifier; + function isAssertsKeyword(node: Node): node is AssertsKeyword; + function isAwaitKeyword(node: Node): node is AwaitKeyword; + function isQualifiedName(node: Node): node is QualifiedName; + function isComputedPropertyName(node: Node): node is ComputedPropertyName; + function isTypeParameterDeclaration(node: Node): node is TypeParameterDeclaration; + function isParameter(node: Node): node is ParameterDeclaration; + function isDecorator(node: Node): node is Decorator; + function isPropertySignature(node: Node): node is PropertySignature; + function isPropertyDeclaration(node: Node): node is PropertyDeclaration; + function isMethodSignature(node: Node): node is MethodSignature; + function isMethodDeclaration(node: Node): node is MethodDeclaration; + function isClassStaticBlockDeclaration(node: Node): node is ClassStaticBlockDeclaration; + function isConstructorDeclaration(node: Node): node is ConstructorDeclaration; + function isGetAccessorDeclaration(node: Node): node is GetAccessorDeclaration; + function isSetAccessorDeclaration(node: Node): node is SetAccessorDeclaration; + function isCallSignatureDeclaration(node: Node): node is CallSignatureDeclaration; + function isConstructSignatureDeclaration(node: Node): node is ConstructSignatureDeclaration; + function isIndexSignatureDeclaration(node: Node): node is IndexSignatureDeclaration; + function isTypePredicateNode(node: Node): node is TypePredicateNode; + function isTypeReferenceNode(node: Node): node is TypeReferenceNode; + function isFunctionTypeNode(node: Node): node is FunctionTypeNode; + function isConstructorTypeNode(node: Node): node is ConstructorTypeNode; + function isTypeQueryNode(node: Node): node is TypeQueryNode; + function isTypeLiteralNode(node: Node): node is TypeLiteralNode; + function isArrayTypeNode(node: Node): node is ArrayTypeNode; + function isTupleTypeNode(node: Node): node is TupleTypeNode; + function isNamedTupleMember(node: Node): node is NamedTupleMember; + function isOptionalTypeNode(node: Node): node is OptionalTypeNode; + function isRestTypeNode(node: Node): node is RestTypeNode; + function isUnionTypeNode(node: Node): node is UnionTypeNode; + function isIntersectionTypeNode(node: Node): node is IntersectionTypeNode; + function isConditionalTypeNode(node: Node): node is ConditionalTypeNode; + function isInferTypeNode(node: Node): node is InferTypeNode; + function isParenthesizedTypeNode(node: Node): node is ParenthesizedTypeNode; + function isThisTypeNode(node: Node): node is ThisTypeNode; + function isTypeOperatorNode(node: Node): node is TypeOperatorNode; + function isIndexedAccessTypeNode(node: Node): node is IndexedAccessTypeNode; + function isMappedTypeNode(node: Node): node is MappedTypeNode; + function isLiteralTypeNode(node: Node): node is LiteralTypeNode; + function isImportTypeNode(node: Node): node is ImportTypeNode; + function isTemplateLiteralTypeSpan(node: Node): node is TemplateLiteralTypeSpan; + function isTemplateLiteralTypeNode(node: Node): node is TemplateLiteralTypeNode; + function isObjectBindingPattern(node: Node): node is ObjectBindingPattern; + function isArrayBindingPattern(node: Node): node is ArrayBindingPattern; + function isBindingElement(node: Node): node is BindingElement; + function isArrayLiteralExpression(node: Node): node is ArrayLiteralExpression; + function isObjectLiteralExpression(node: Node): node is ObjectLiteralExpression; + function isPropertyAccessExpression(node: Node): node is PropertyAccessExpression; + function isElementAccessExpression(node: Node): node is ElementAccessExpression; + function isCallExpression(node: Node): node is CallExpression; + function isNewExpression(node: Node): node is NewExpression; + function isTaggedTemplateExpression(node: Node): node is TaggedTemplateExpression; + function isTypeAssertionExpression(node: Node): node is TypeAssertion; + function isParenthesizedExpression(node: Node): node is ParenthesizedExpression; + function isFunctionExpression(node: Node): node is FunctionExpression; + function isArrowFunction(node: Node): node is ArrowFunction; + function isDeleteExpression(node: Node): node is DeleteExpression; + function isTypeOfExpression(node: Node): node is TypeOfExpression; + function isVoidExpression(node: Node): node is VoidExpression; + function isAwaitExpression(node: Node): node is AwaitExpression; + function isPrefixUnaryExpression(node: Node): node is PrefixUnaryExpression; + function isPostfixUnaryExpression(node: Node): node is PostfixUnaryExpression; + function isBinaryExpression(node: Node): node is BinaryExpression; + function isConditionalExpression(node: Node): node is ConditionalExpression; + function isTemplateExpression(node: Node): node is TemplateExpression; + function isYieldExpression(node: Node): node is YieldExpression; + function isSpreadElement(node: Node): node is SpreadElement; + function isClassExpression(node: Node): node is ClassExpression; + function isOmittedExpression(node: Node): node is OmittedExpression; + function isExpressionWithTypeArguments(node: Node): node is ExpressionWithTypeArguments; + function isAsExpression(node: Node): node is AsExpression; + function isSatisfiesExpression(node: Node): node is SatisfiesExpression; + function isNonNullExpression(node: Node): node is NonNullExpression; + function isMetaProperty(node: Node): node is MetaProperty; + function isSyntheticExpression(node: Node): node is SyntheticExpression; + function isPartiallyEmittedExpression(node: Node): node is PartiallyEmittedExpression; + function isCommaListExpression(node: Node): node is CommaListExpression; + function isTemplateSpan(node: Node): node is TemplateSpan; + function isSemicolonClassElement(node: Node): node is SemicolonClassElement; + function isBlock(node: Node): node is Block; + function isVariableStatement(node: Node): node is VariableStatement; + function isEmptyStatement(node: Node): node is EmptyStatement; + function isExpressionStatement(node: Node): node is ExpressionStatement; + function isIfStatement(node: Node): node is IfStatement; + function isDoStatement(node: Node): node is DoStatement; + function isWhileStatement(node: Node): node is WhileStatement; + function isForStatement(node: Node): node is ForStatement; + function isForInStatement(node: Node): node is ForInStatement; + function isForOfStatement(node: Node): node is ForOfStatement; + function isContinueStatement(node: Node): node is ContinueStatement; + function isBreakStatement(node: Node): node is BreakStatement; + function isReturnStatement(node: Node): node is ReturnStatement; + function isWithStatement(node: Node): node is WithStatement; + function isSwitchStatement(node: Node): node is SwitchStatement; + function isLabeledStatement(node: Node): node is LabeledStatement; + function isThrowStatement(node: Node): node is ThrowStatement; + function isTryStatement(node: Node): node is TryStatement; + function isDebuggerStatement(node: Node): node is DebuggerStatement; + function isVariableDeclaration(node: Node): node is VariableDeclaration; + function isVariableDeclarationList(node: Node): node is VariableDeclarationList; + function isFunctionDeclaration(node: Node): node is FunctionDeclaration; + function isClassDeclaration(node: Node): node is ClassDeclaration; + function isInterfaceDeclaration(node: Node): node is InterfaceDeclaration; + function isTypeAliasDeclaration(node: Node): node is TypeAliasDeclaration; + function isEnumDeclaration(node: Node): node is EnumDeclaration; + function isModuleDeclaration(node: Node): node is ModuleDeclaration; + function isModuleBlock(node: Node): node is ModuleBlock; + function isCaseBlock(node: Node): node is CaseBlock; + function isNamespaceExportDeclaration(node: Node): node is NamespaceExportDeclaration; + function isImportEqualsDeclaration(node: Node): node is ImportEqualsDeclaration; + function isImportDeclaration(node: Node): node is ImportDeclaration; + function isImportClause(node: Node): node is ImportClause; + function isImportTypeAssertionContainer(node: Node): node is ImportTypeAssertionContainer; + function isAssertClause(node: Node): node is AssertClause; + function isAssertEntry(node: Node): node is AssertEntry; + function isNamespaceImport(node: Node): node is NamespaceImport; + function isNamespaceExport(node: Node): node is NamespaceExport; + function isNamedImports(node: Node): node is NamedImports; + function isImportSpecifier(node: Node): node is ImportSpecifier; + function isExportAssignment(node: Node): node is ExportAssignment; + function isExportDeclaration(node: Node): node is ExportDeclaration; + function isNamedExports(node: Node): node is NamedExports; + function isExportSpecifier(node: Node): node is ExportSpecifier; + function isMissingDeclaration(node: Node): node is MissingDeclaration; + function isNotEmittedStatement(node: Node): node is NotEmittedStatement; + function isExternalModuleReference(node: Node): node is ExternalModuleReference; + function isJsxElement(node: Node): node is JsxElement; + function isJsxSelfClosingElement(node: Node): node is JsxSelfClosingElement; + function isJsxOpeningElement(node: Node): node is JsxOpeningElement; + function isJsxClosingElement(node: Node): node is JsxClosingElement; + function isJsxFragment(node: Node): node is JsxFragment; + function isJsxOpeningFragment(node: Node): node is JsxOpeningFragment; + function isJsxClosingFragment(node: Node): node is JsxClosingFragment; + function isJsxAttribute(node: Node): node is JsxAttribute; + function isJsxAttributes(node: Node): node is JsxAttributes; + function isJsxSpreadAttribute(node: Node): node is JsxSpreadAttribute; + function isJsxExpression(node: Node): node is JsxExpression; + function isJsxNamespacedName(node: Node): node is JsxNamespacedName; + function isCaseClause(node: Node): node is CaseClause; + function isDefaultClause(node: Node): node is DefaultClause; + function isHeritageClause(node: Node): node is HeritageClause; + function isCatchClause(node: Node): node is CatchClause; + function isPropertyAssignment(node: Node): node is PropertyAssignment; + function isShorthandPropertyAssignment(node: Node): node is ShorthandPropertyAssignment; + function isSpreadAssignment(node: Node): node is SpreadAssignment; + function isEnumMember(node: Node): node is EnumMember; + /** @deprecated */ + function isUnparsedPrepend(node: Node): node is UnparsedPrepend; + function isSourceFile(node: Node): node is SourceFile; + function isBundle(node: Node): node is Bundle; + /** @deprecated */ + function isUnparsedSource(node: Node): node is UnparsedSource; + function isJSDocTypeExpression(node: Node): node is JSDocTypeExpression; + function isJSDocNameReference(node: Node): node is JSDocNameReference; + function isJSDocMemberName(node: Node): node is JSDocMemberName; + function isJSDocLink(node: Node): node is JSDocLink; + function isJSDocLinkCode(node: Node): node is JSDocLinkCode; + function isJSDocLinkPlain(node: Node): node is JSDocLinkPlain; + function isJSDocAllType(node: Node): node is JSDocAllType; + function isJSDocUnknownType(node: Node): node is JSDocUnknownType; + function isJSDocNullableType(node: Node): node is JSDocNullableType; + function isJSDocNonNullableType(node: Node): node is JSDocNonNullableType; + function isJSDocOptionalType(node: Node): node is JSDocOptionalType; + function isJSDocFunctionType(node: Node): node is JSDocFunctionType; + function isJSDocVariadicType(node: Node): node is JSDocVariadicType; + function isJSDocNamepathType(node: Node): node is JSDocNamepathType; + function isJSDoc(node: Node): node is JSDoc; + function isJSDocTypeLiteral(node: Node): node is JSDocTypeLiteral; + function isJSDocSignature(node: Node): node is JSDocSignature; + function isJSDocAugmentsTag(node: Node): node is JSDocAugmentsTag; + function isJSDocAuthorTag(node: Node): node is JSDocAuthorTag; + function isJSDocClassTag(node: Node): node is JSDocClassTag; + function isJSDocCallbackTag(node: Node): node is JSDocCallbackTag; + function isJSDocPublicTag(node: Node): node is JSDocPublicTag; + function isJSDocPrivateTag(node: Node): node is JSDocPrivateTag; + function isJSDocProtectedTag(node: Node): node is JSDocProtectedTag; + function isJSDocReadonlyTag(node: Node): node is JSDocReadonlyTag; + function isJSDocOverrideTag(node: Node): node is JSDocOverrideTag; + function isJSDocOverloadTag(node: Node): node is JSDocOverloadTag; + function isJSDocDeprecatedTag(node: Node): node is JSDocDeprecatedTag; + function isJSDocSeeTag(node: Node): node is JSDocSeeTag; + function isJSDocEnumTag(node: Node): node is JSDocEnumTag; + function isJSDocParameterTag(node: Node): node is JSDocParameterTag; + function isJSDocReturnTag(node: Node): node is JSDocReturnTag; + function isJSDocThisTag(node: Node): node is JSDocThisTag; + function isJSDocTypeTag(node: Node): node is JSDocTypeTag; + function isJSDocTemplateTag(node: Node): node is JSDocTemplateTag; + function isJSDocTypedefTag(node: Node): node is JSDocTypedefTag; + function isJSDocUnknownTag(node: Node): node is JSDocUnknownTag; + function isJSDocPropertyTag(node: Node): node is JSDocPropertyTag; + function isJSDocImplementsTag(node: Node): node is JSDocImplementsTag; + function isJSDocSatisfiesTag(node: Node): node is JSDocSatisfiesTag; + function isJSDocThrowsTag(node: Node): node is JSDocThrowsTag; + function isQuestionOrExclamationToken(node: Node): node is QuestionToken | ExclamationToken; + function isIdentifierOrThisTypeNode(node: Node): node is Identifier | ThisTypeNode; + function isReadonlyKeywordOrPlusOrMinusToken(node: Node): node is ReadonlyKeyword | PlusToken | MinusToken; + function isQuestionOrPlusOrMinusToken(node: Node): node is QuestionToken | PlusToken | MinusToken; + function isModuleName(node: Node): node is ModuleName; + function isBinaryOperatorToken(node: Node): node is BinaryOperatorToken; + function setTextRange(range: T, location: TextRange | undefined): T; + function canHaveModifiers(node: Node): node is HasModifiers; + function canHaveDecorators(node: Node): node is HasDecorators; + /** + * Invokes a callback for each child of the given node. The 'cbNode' callback is invoked for all child nodes + * stored in properties. If a 'cbNodes' callback is specified, it is invoked for embedded arrays; otherwise, + * embedded arrays are flattened and the 'cbNode' callback is invoked for each element. If a callback returns + * a truthy value, iteration stops and that value is returned. Otherwise, undefined is returned. + * + * @param node a given node to visit its children + * @param cbNode a callback to be invoked for all child nodes + * @param cbNodes a callback to be invoked for embedded array + * + * @remarks `forEachChild` must visit the children of a node in the order + * that they appear in the source code. The language service depends on this property to locate nodes by position. + */ + function forEachChild(node: Node, cbNode: (node: Node) => T | undefined, cbNodes?: (nodes: NodeArray) => T | undefined): T | undefined; + function createSourceFile(fileName: string, sourceText: string, languageVersionOrOptions: ScriptTarget | CreateSourceFileOptions, setParentNodes?: boolean, scriptKind?: ScriptKind): SourceFile; + function parseIsolatedEntityName(text: string, languageVersion: ScriptTarget): EntityName | undefined; + /** + * Parse json text into SyntaxTree and return node and parse errors if any + * @param fileName + * @param sourceText + */ + function parseJsonText(fileName: string, sourceText: string): JsonSourceFile; + function isExternalModule(file: SourceFile): boolean; + function updateSourceFile(sourceFile: SourceFile, newText: string, textChangeRange: TextChangeRange, aggressiveChecks?: boolean): SourceFile; + interface CreateSourceFileOptions { + languageVersion: ScriptTarget; + /** + * Controls the format the file is detected as - this can be derived from only the path + * and files on disk, but needs to be done with a module resolution cache in scope to be performant. + * This is usually `undefined` for compilations that do not have `moduleResolution` values of `node16` or `nodenext`. + */ + impliedNodeFormat?: ResolutionMode; + /** + * Controls how module-y-ness is set for the given file. Usually the result of calling + * `getSetExternalModuleIndicator` on a valid `CompilerOptions` object. If not present, the default + * check specified by `isFileProbablyExternalModule` will be used to set the field. + */ + setExternalModuleIndicator?: (file: SourceFile) => void; + } + function parseCommandLine(commandLine: readonly string[], readFile?: (path: string) => string | undefined): ParsedCommandLine; + /** + * Reads the config file, reports errors if any and exits if the config file cannot be found + */ + function getParsedCommandLineOfConfigFile(configFileName: string, optionsToExtend: CompilerOptions | undefined, host: ParseConfigFileHost, extendedConfigCache?: Map, watchOptionsToExtend?: WatchOptions, extraFileExtensions?: readonly FileExtensionInfo[]): ParsedCommandLine | undefined; + /** + * Read tsconfig.json file + * @param fileName The path to the config file + */ + function readConfigFile(fileName: string, readFile: (path: string) => string | undefined): { + config?: any; + error?: Diagnostic; + }; + /** + * Parse the text of the tsconfig.json file + * @param fileName The path to the config file + * @param jsonText The text of the config file + */ + function parseConfigFileTextToJson(fileName: string, jsonText: string): { + config?: any; + error?: Diagnostic; + }; + /** + * Read tsconfig.json file + * @param fileName The path to the config file + */ + function readJsonConfigFile(fileName: string, readFile: (path: string) => string | undefined): TsConfigSourceFile; + /** + * Convert the json syntax tree into the json value + */ + function convertToObject(sourceFile: JsonSourceFile, errors: Diagnostic[]): any; + /** + * Parse the contents of a config file (tsconfig.json). + * @param json The contents of the config file to parse + * @param host Instance of ParseConfigHost used to enumerate files in folder. + * @param basePath A root directory to resolve relative path entries in the config + * file to. e.g. outDir + */ + function parseJsonConfigFileContent(json: any, host: ParseConfigHost, basePath: string, existingOptions?: CompilerOptions, configFileName?: string, resolutionStack?: Path[], extraFileExtensions?: readonly FileExtensionInfo[], extendedConfigCache?: Map, existingWatchOptions?: WatchOptions): ParsedCommandLine; + /** + * Parse the contents of a config file (tsconfig.json). + * @param jsonNode The contents of the config file to parse + * @param host Instance of ParseConfigHost used to enumerate files in folder. + * @param basePath A root directory to resolve relative path entries in the config + * file to. e.g. outDir + */ + function parseJsonSourceFileConfigFileContent(sourceFile: TsConfigSourceFile, host: ParseConfigHost, basePath: string, existingOptions?: CompilerOptions, configFileName?: string, resolutionStack?: Path[], extraFileExtensions?: readonly FileExtensionInfo[], extendedConfigCache?: Map, existingWatchOptions?: WatchOptions): ParsedCommandLine; + function convertCompilerOptionsFromJson(jsonOptions: any, basePath: string, configFileName?: string): { + options: CompilerOptions; + errors: Diagnostic[]; + }; + function convertTypeAcquisitionFromJson(jsonOptions: any, basePath: string, configFileName?: string): { + options: TypeAcquisition; + errors: Diagnostic[]; + }; + type DiagnosticReporter = (diagnostic: Diagnostic) => void; + /** + * Reports config file diagnostics + */ + interface ConfigFileDiagnosticsReporter { + /** + * Reports unrecoverable error when parsing config file + */ + onUnRecoverableConfigFileDiagnostic: DiagnosticReporter; + } + /** + * Interface extending ParseConfigHost to support ParseConfigFile that reads config file and reports errors + */ + interface ParseConfigFileHost extends ParseConfigHost, ConfigFileDiagnosticsReporter { + getCurrentDirectory(): string; + } + interface ParsedTsconfig { + raw: any; + options?: CompilerOptions; + watchOptions?: WatchOptions; + typeAcquisition?: TypeAcquisition; + /** + * Note that the case of the config path has not yet been normalized, as no files have been imported into the project yet + */ + extendedConfigPath?: string | string[]; + } + interface ExtendedConfigCacheEntry { + extendedResult: TsConfigSourceFile; + extendedConfig: ParsedTsconfig | undefined; + } + function getEffectiveTypeRoots(options: CompilerOptions, host: GetEffectiveTypeRootsHost): string[] | undefined; + /** + * @param {string | undefined} containingFile - file that contains type reference directive, can be undefined if containing file is unknown. + * This is possible in case if resolution is performed for directives specified via 'types' parameter. In this case initial path for secondary lookups + * is assumed to be the same as root directory of the project. + */ + function resolveTypeReferenceDirective(typeReferenceDirectiveName: string, containingFile: string | undefined, options: CompilerOptions, host: ModuleResolutionHost, redirectedReference?: ResolvedProjectReference, cache?: TypeReferenceDirectiveResolutionCache, resolutionMode?: ResolutionMode): ResolvedTypeReferenceDirectiveWithFailedLookupLocations; + /** + * Given a set of options, returns the set of type directive names + * that should be included for this program automatically. + * This list could either come from the config file, + * or from enumerating the types root + initial secondary types lookup location. + * More type directives might appear in the program later as a result of loading actual source files; + * this list is only the set of defaults that are implicitly included. + */ + function getAutomaticTypeDirectiveNames(options: CompilerOptions, host: ModuleResolutionHost): string[]; + function createModuleResolutionCache(currentDirectory: string, getCanonicalFileName: (s: string) => string, options?: CompilerOptions, packageJsonInfoCache?: PackageJsonInfoCache): ModuleResolutionCache; + function createTypeReferenceDirectiveResolutionCache(currentDirectory: string, getCanonicalFileName: (s: string) => string, options?: CompilerOptions, packageJsonInfoCache?: PackageJsonInfoCache): TypeReferenceDirectiveResolutionCache; + function resolveModuleNameFromCache(moduleName: string, containingFile: string, cache: ModuleResolutionCache, mode?: ResolutionMode): ResolvedModuleWithFailedLookupLocations | undefined; + function resolveModuleName(moduleName: string, containingFile: string, compilerOptions: CompilerOptions, host: ModuleResolutionHost, cache?: ModuleResolutionCache, redirectedReference?: ResolvedProjectReference, resolutionMode?: ResolutionMode): ResolvedModuleWithFailedLookupLocations; + function bundlerModuleNameResolver(moduleName: string, containingFile: string, compilerOptions: CompilerOptions, host: ModuleResolutionHost, cache?: ModuleResolutionCache, redirectedReference?: ResolvedProjectReference): ResolvedModuleWithFailedLookupLocations; + function nodeModuleNameResolver(moduleName: string, containingFile: string, compilerOptions: CompilerOptions, host: ModuleResolutionHost, cache?: ModuleResolutionCache, redirectedReference?: ResolvedProjectReference): ResolvedModuleWithFailedLookupLocations; + function classicNameResolver(moduleName: string, containingFile: string, compilerOptions: CompilerOptions, host: ModuleResolutionHost, cache?: NonRelativeModuleNameResolutionCache, redirectedReference?: ResolvedProjectReference): ResolvedModuleWithFailedLookupLocations; + interface TypeReferenceDirectiveResolutionCache extends PerDirectoryResolutionCache, NonRelativeNameResolutionCache, PackageJsonInfoCache { + } + interface ModeAwareCache { + get(key: string, mode: ResolutionMode): T | undefined; + set(key: string, mode: ResolutionMode, value: T): this; + delete(key: string, mode: ResolutionMode): this; + has(key: string, mode: ResolutionMode): boolean; + forEach(cb: (elem: T, key: string, mode: ResolutionMode) => void): void; + size(): number; + } + /** + * Cached resolutions per containing directory. + * This assumes that any module id will have the same resolution for sibling files located in the same folder. + */ + interface PerDirectoryResolutionCache { + getFromDirectoryCache(name: string, mode: ResolutionMode, directoryName: string, redirectedReference: ResolvedProjectReference | undefined): T | undefined; + getOrCreateCacheForDirectory(directoryName: string, redirectedReference?: ResolvedProjectReference): ModeAwareCache; + clear(): void; + /** + * Updates with the current compilerOptions the cache will operate with. + * This updates the redirects map as well if needed so module resolutions are cached if they can across the projects + */ + update(options: CompilerOptions): void; + } + interface NonRelativeNameResolutionCache { + getFromNonRelativeNameCache(nonRelativeName: string, mode: ResolutionMode, directoryName: string, redirectedReference: ResolvedProjectReference | undefined): T | undefined; + getOrCreateCacheForNonRelativeName(nonRelativeName: string, mode: ResolutionMode, redirectedReference?: ResolvedProjectReference): PerNonRelativeNameCache; + clear(): void; + /** + * Updates with the current compilerOptions the cache will operate with. + * This updates the redirects map as well if needed so module resolutions are cached if they can across the projects + */ + update(options: CompilerOptions): void; + } + interface PerNonRelativeNameCache { + get(directory: string): T | undefined; + set(directory: string, result: T): void; + } + interface ModuleResolutionCache extends PerDirectoryResolutionCache, NonRelativeModuleNameResolutionCache, PackageJsonInfoCache { + getPackageJsonInfoCache(): PackageJsonInfoCache; + } + /** + * Stored map from non-relative module name to a table: directory -> result of module lookup in this directory + * We support only non-relative module names because resolution of relative module names is usually more deterministic and thus less expensive. + */ + interface NonRelativeModuleNameResolutionCache extends NonRelativeNameResolutionCache, PackageJsonInfoCache { + /** @deprecated Use getOrCreateCacheForNonRelativeName */ + getOrCreateCacheForModuleName(nonRelativeModuleName: string, mode: ResolutionMode, redirectedReference?: ResolvedProjectReference): PerModuleNameCache; + } + interface PackageJsonInfoCache { + clear(): void; + } + type PerModuleNameCache = PerNonRelativeNameCache; + /** + * Visits a Node using the supplied visitor, possibly returning a new Node in its place. + * + * - If the input node is undefined, then the output is undefined. + * - If the visitor returns undefined, then the output is undefined. + * - If the output node is not undefined, then it will satisfy the test function. + * - In order to obtain a return type that is more specific than `Node`, a test + * function _must_ be provided, and that function must be a type predicate. + * + * @param node The Node to visit. + * @param visitor The callback used to visit the Node. + * @param test A callback to execute to verify the Node is valid. + * @param lift An optional callback to execute to lift a NodeArray into a valid Node. + */ + function visitNode(node: TIn, visitor: Visitor, TVisited>, test: (node: Node) => node is TOut, lift?: (node: readonly Node[]) => Node): TOut | (TIn & undefined) | (TVisited & undefined); + /** + * Visits a Node using the supplied visitor, possibly returning a new Node in its place. + * + * - If the input node is undefined, then the output is undefined. + * - If the visitor returns undefined, then the output is undefined. + * - If the output node is not undefined, then it will satisfy the test function. + * - In order to obtain a return type that is more specific than `Node`, a test + * function _must_ be provided, and that function must be a type predicate. + * + * @param node The Node to visit. + * @param visitor The callback used to visit the Node. + * @param test A callback to execute to verify the Node is valid. + * @param lift An optional callback to execute to lift a NodeArray into a valid Node. + */ + function visitNode(node: TIn, visitor: Visitor, TVisited>, test?: (node: Node) => boolean, lift?: (node: readonly Node[]) => Node): Node | (TIn & undefined) | (TVisited & undefined); + /** + * Visits a NodeArray using the supplied visitor, possibly returning a new NodeArray in its place. + * + * - If the input node array is undefined, the output is undefined. + * - If the visitor can return undefined, the node it visits in the array will be reused. + * - If the output node array is not undefined, then its contents will satisfy the test. + * - In order to obtain a return type that is more specific than `NodeArray`, a test + * function _must_ be provided, and that function must be a type predicate. + * + * @param nodes The NodeArray to visit. + * @param visitor The callback used to visit a Node. + * @param test A node test to execute for each node. + * @param start An optional value indicating the starting offset at which to start visiting. + * @param count An optional value indicating the maximum number of nodes to visit. + */ + function visitNodes | undefined, TOut extends Node>(nodes: TInArray, visitor: Visitor, test: (node: Node) => node is TOut, start?: number, count?: number): NodeArray | (TInArray & undefined); + /** + * Visits a NodeArray using the supplied visitor, possibly returning a new NodeArray in its place. + * + * - If the input node array is undefined, the output is undefined. + * - If the visitor can return undefined, the node it visits in the array will be reused. + * - If the output node array is not undefined, then its contents will satisfy the test. + * - In order to obtain a return type that is more specific than `NodeArray`, a test + * function _must_ be provided, and that function must be a type predicate. + * + * @param nodes The NodeArray to visit. + * @param visitor The callback used to visit a Node. + * @param test A node test to execute for each node. + * @param start An optional value indicating the starting offset at which to start visiting. + * @param count An optional value indicating the maximum number of nodes to visit. + */ + function visitNodes | undefined>(nodes: TInArray, visitor: Visitor, test?: (node: Node) => boolean, start?: number, count?: number): NodeArray | (TInArray & undefined); + /** + * Starts a new lexical environment and visits a statement list, ending the lexical environment + * and merging hoisted declarations upon completion. + */ + function visitLexicalEnvironment(statements: NodeArray, visitor: Visitor, context: TransformationContext, start?: number, ensureUseStrict?: boolean, nodesVisitor?: NodesVisitor): NodeArray; + /** + * Starts a new lexical environment and visits a parameter list, suspending the lexical + * environment upon completion. + */ + function visitParameterList(nodes: NodeArray, visitor: Visitor, context: TransformationContext, nodesVisitor?: NodesVisitor): NodeArray; + function visitParameterList(nodes: NodeArray | undefined, visitor: Visitor, context: TransformationContext, nodesVisitor?: NodesVisitor): NodeArray | undefined; + /** + * Resumes a suspended lexical environment and visits a function body, ending the lexical + * environment and merging hoisted declarations upon completion. + */ + function visitFunctionBody(node: FunctionBody, visitor: Visitor, context: TransformationContext): FunctionBody; + /** + * Resumes a suspended lexical environment and visits a function body, ending the lexical + * environment and merging hoisted declarations upon completion. + */ + function visitFunctionBody(node: FunctionBody | undefined, visitor: Visitor, context: TransformationContext): FunctionBody | undefined; + /** + * Resumes a suspended lexical environment and visits a concise body, ending the lexical + * environment and merging hoisted declarations upon completion. + */ + function visitFunctionBody(node: ConciseBody, visitor: Visitor, context: TransformationContext): ConciseBody; + /** + * Visits an iteration body, adding any block-scoped variables required by the transformation. + */ + function visitIterationBody(body: Statement, visitor: Visitor, context: TransformationContext): Statement; + /** + * Visits the elements of a {@link CommaListExpression}. + * @param visitor The visitor to use when visiting expressions whose result will not be discarded at runtime. + * @param discardVisitor The visitor to use when visiting expressions whose result will be discarded at runtime. Defaults to {@link visitor}. + */ + function visitCommaListElements(elements: NodeArray, visitor: Visitor, discardVisitor?: Visitor): NodeArray; + /** + * Visits each child of a Node using the supplied visitor, possibly returning a new Node of the same kind in its place. + * + * @param node The Node whose children will be visited. + * @param visitor The callback used to visit each child. + * @param context A lexical environment context for the visitor. + */ + function visitEachChild(node: T, visitor: Visitor, context: TransformationContext): T; + /** + * Visits each child of a Node using the supplied visitor, possibly returning a new Node of the same kind in its place. + * + * @param node The Node whose children will be visited. + * @param visitor The callback used to visit each child. + * @param context A lexical environment context for the visitor. + */ + function visitEachChild(node: T | undefined, visitor: Visitor, context: TransformationContext, nodesVisitor?: typeof visitNodes, tokenVisitor?: Visitor): T | undefined; + function getTsBuildInfoEmitOutputFilePath(options: CompilerOptions): string | undefined; + function getOutputFileNames(commandLine: ParsedCommandLine, inputFileName: string, ignoreCase: boolean): readonly string[]; + function createPrinter(printerOptions?: PrinterOptions, handlers?: PrintHandlers): Printer; + function findConfigFile(searchPath: string, fileExists: (fileName: string) => boolean, configName?: string): string | undefined; + function resolveTripleslashReference(moduleName: string, containingFile: string): string; + function createCompilerHost(options: CompilerOptions, setParentNodes?: boolean): CompilerHost; + function getPreEmitDiagnostics(program: Program, sourceFile?: SourceFile, cancellationToken?: CancellationToken): readonly Diagnostic[]; + function formatDiagnostics(diagnostics: readonly Diagnostic[], host: FormatDiagnosticsHost): string; + function formatDiagnostic(diagnostic: Diagnostic, host: FormatDiagnosticsHost): string; + function formatDiagnosticsWithColorAndContext(diagnostics: readonly Diagnostic[], host: FormatDiagnosticsHost): string; + function flattenDiagnosticMessageText(diag: string | DiagnosticMessageChain | undefined, newLine: string, indent?: number): string; + /** + * Calculates the resulting resolution mode for some reference in some file - this is generally the explicitly + * provided resolution mode in the reference, unless one is not present, in which case it is the mode of the containing file. + */ + function getModeForFileReference(ref: FileReference | string, containingFileMode: ResolutionMode): ResolutionMode; + /** + * Calculates the final resolution mode for an import at some index within a file's imports list. This is generally the explicitly + * defined mode of the import if provided, or, if not, the mode of the containing file (with some exceptions: import=require is always commonjs, dynamic import is always esm). + * If you have an actual import node, prefer using getModeForUsageLocation on the reference string node. + * @param file File to fetch the resolution mode within + * @param index Index into the file's complete resolution list to get the resolution of - this is a concatenation of the file's imports and module augmentations + */ + function getModeForResolutionAtIndex(file: SourceFile, index: number): ResolutionMode; + /** + * Calculates the final resolution mode for a given module reference node. This is generally the explicitly provided resolution mode, if + * one exists, or the mode of the containing source file. (Excepting import=require, which is always commonjs, and dynamic import, which is always esm). + * Notably, this function always returns `undefined` if the containing file has an `undefined` `impliedNodeFormat` - this field is only set when + * `moduleResolution` is `node16`+. + * @param file The file the import or import-like reference is contained within + * @param usage The module reference string + * @returns The final resolution mode of the import + */ + function getModeForUsageLocation(file: { + impliedNodeFormat?: ResolutionMode; + }, usage: StringLiteralLike): ModuleKind.CommonJS | ModuleKind.ESNext | undefined; + function getConfigFileParsingDiagnostics(configFileParseResult: ParsedCommandLine): readonly Diagnostic[]; + /** + * A function for determining if a given file is esm or cjs format, assuming modern node module resolution rules, as configured by the + * `options` parameter. + * + * @param fileName The normalized absolute path to check the format of (it need not exist on disk) + * @param [packageJsonInfoCache] A cache for package file lookups - it's best to have a cache when this function is called often + * @param host The ModuleResolutionHost which can perform the filesystem lookups for package json data + * @param options The compiler options to perform the analysis under - relevant options are `moduleResolution` and `traceResolution` + * @returns `undefined` if the path has no relevant implied format, `ModuleKind.ESNext` for esm format, and `ModuleKind.CommonJS` for cjs format + */ + function getImpliedNodeFormatForFile(fileName: Path, packageJsonInfoCache: PackageJsonInfoCache | undefined, host: ModuleResolutionHost, options: CompilerOptions): ResolutionMode; + /** + * Create a new 'Program' instance. A Program is an immutable collection of 'SourceFile's and a 'CompilerOptions' + * that represent a compilation unit. + * + * Creating a program proceeds from a set of root files, expanding the set of inputs by following imports and + * triple-slash-reference-path directives transitively. '@types' and triple-slash-reference-types are also pulled in. + * + * @param createProgramOptions - The options for creating a program. + * @returns A 'Program' object. + */ + function createProgram(createProgramOptions: CreateProgramOptions): Program; + /** + * Create a new 'Program' instance. A Program is an immutable collection of 'SourceFile's and a 'CompilerOptions' + * that represent a compilation unit. + * + * Creating a program proceeds from a set of root files, expanding the set of inputs by following imports and + * triple-slash-reference-path directives transitively. '@types' and triple-slash-reference-types are also pulled in. + * + * @param rootNames - A set of root files. + * @param options - The compiler options which should be used. + * @param host - The host interacts with the underlying file system. + * @param oldProgram - Reuses an old program structure. + * @param configFileParsingDiagnostics - error during config file parsing + * @returns A 'Program' object. + */ + function createProgram(rootNames: readonly string[], options: CompilerOptions, host?: CompilerHost, oldProgram?: Program, configFileParsingDiagnostics?: readonly Diagnostic[]): Program; + /** + * Returns the target config filename of a project reference. + * Note: The file might not exist. + */ + function resolveProjectReferencePath(ref: ProjectReference): ResolvedConfigFileName; + interface FormatDiagnosticsHost { + getCurrentDirectory(): string; + getCanonicalFileName(fileName: string): string; + getNewLine(): string; + } + interface EmitOutput { + outputFiles: OutputFile[]; + emitSkipped: boolean; + } + interface OutputFile { + name: string; + writeByteOrderMark: boolean; + text: string; + } + /** + * Create the builder to manage semantic diagnostics and cache them + */ + function createSemanticDiagnosticsBuilderProgram(newProgram: Program, host: BuilderProgramHost, oldProgram?: SemanticDiagnosticsBuilderProgram, configFileParsingDiagnostics?: readonly Diagnostic[]): SemanticDiagnosticsBuilderProgram; + function createSemanticDiagnosticsBuilderProgram(rootNames: readonly string[] | undefined, options: CompilerOptions | undefined, host?: CompilerHost, oldProgram?: SemanticDiagnosticsBuilderProgram, configFileParsingDiagnostics?: readonly Diagnostic[], projectReferences?: readonly ProjectReference[]): SemanticDiagnosticsBuilderProgram; + /** + * Create the builder that can handle the changes in program and iterate through changed files + * to emit the those files and manage semantic diagnostics cache as well + */ + function createEmitAndSemanticDiagnosticsBuilderProgram(newProgram: Program, host: BuilderProgramHost, oldProgram?: EmitAndSemanticDiagnosticsBuilderProgram, configFileParsingDiagnostics?: readonly Diagnostic[]): EmitAndSemanticDiagnosticsBuilderProgram; + function createEmitAndSemanticDiagnosticsBuilderProgram(rootNames: readonly string[] | undefined, options: CompilerOptions | undefined, host?: CompilerHost, oldProgram?: EmitAndSemanticDiagnosticsBuilderProgram, configFileParsingDiagnostics?: readonly Diagnostic[], projectReferences?: readonly ProjectReference[]): EmitAndSemanticDiagnosticsBuilderProgram; + /** + * Creates a builder thats just abstraction over program and can be used with watch + */ + function createAbstractBuilder(newProgram: Program, host: BuilderProgramHost, oldProgram?: BuilderProgram, configFileParsingDiagnostics?: readonly Diagnostic[]): BuilderProgram; + function createAbstractBuilder(rootNames: readonly string[] | undefined, options: CompilerOptions | undefined, host?: CompilerHost, oldProgram?: BuilderProgram, configFileParsingDiagnostics?: readonly Diagnostic[], projectReferences?: readonly ProjectReference[]): BuilderProgram; + type AffectedFileResult = { + result: T; + affected: SourceFile | Program; + } | undefined; + interface BuilderProgramHost { + /** + * If provided this would be used this hash instead of actual file shape text for detecting changes + */ + createHash?: (data: string) => string; + /** + * When emit or emitNextAffectedFile are called without writeFile, + * this callback if present would be used to write files + */ + writeFile?: WriteFileCallback; + } + /** + * Builder to manage the program state changes + */ + interface BuilderProgram { + /** + * Returns current program + */ + getProgram(): Program; + /** + * Get compiler options of the program + */ + getCompilerOptions(): CompilerOptions; + /** + * Get the source file in the program with file name + */ + getSourceFile(fileName: string): SourceFile | undefined; + /** + * Get a list of files in the program + */ + getSourceFiles(): readonly SourceFile[]; + /** + * Get the diagnostics for compiler options + */ + getOptionsDiagnostics(cancellationToken?: CancellationToken): readonly Diagnostic[]; + /** + * Get the diagnostics that dont belong to any file + */ + getGlobalDiagnostics(cancellationToken?: CancellationToken): readonly Diagnostic[]; + /** + * Get the diagnostics from config file parsing + */ + getConfigFileParsingDiagnostics(): readonly Diagnostic[]; + /** + * Get the syntax diagnostics, for all source files if source file is not supplied + */ + getSyntacticDiagnostics(sourceFile?: SourceFile, cancellationToken?: CancellationToken): readonly Diagnostic[]; + /** + * Get the declaration diagnostics, for all source files if source file is not supplied + */ + getDeclarationDiagnostics(sourceFile?: SourceFile, cancellationToken?: CancellationToken): readonly DiagnosticWithLocation[]; + /** + * Get all the dependencies of the file + */ + getAllDependencies(sourceFile: SourceFile): readonly string[]; + /** + * Gets the semantic diagnostics from the program corresponding to this state of file (if provided) or whole program + * The semantic diagnostics are cached and managed here + * Note that it is assumed that when asked about semantic diagnostics through this API, + * the file has been taken out of affected files so it is safe to use cache or get from program and cache the diagnostics + * In case of SemanticDiagnosticsBuilderProgram if the source file is not provided, + * it will iterate through all the affected files, to ensure that cache stays valid and yet provide a way to get all semantic diagnostics + */ + getSemanticDiagnostics(sourceFile?: SourceFile, cancellationToken?: CancellationToken): readonly Diagnostic[]; + /** + * Emits the JavaScript and declaration files. + * When targetSource file is specified, emits the files corresponding to that source file, + * otherwise for the whole program. + * In case of EmitAndSemanticDiagnosticsBuilderProgram, when targetSourceFile is specified, + * it is assumed that that file is handled from affected file list. If targetSourceFile is not specified, + * it will only emit all the affected files instead of whole program + * + * The first of writeFile if provided, writeFile of BuilderProgramHost if provided, writeFile of compiler host + * in that order would be used to write the files + */ + emit(targetSourceFile?: SourceFile, writeFile?: WriteFileCallback, cancellationToken?: CancellationToken, emitOnlyDtsFiles?: boolean, customTransformers?: CustomTransformers): EmitResult; + /** + * Get the current directory of the program + */ + getCurrentDirectory(): string; + } + /** + * The builder that caches the semantic diagnostics for the program and handles the changed files and affected files + */ + interface SemanticDiagnosticsBuilderProgram extends BuilderProgram { + /** + * Gets the semantic diagnostics from the program for the next affected file and caches it + * Returns undefined if the iteration is complete + */ + getSemanticDiagnosticsOfNextAffectedFile(cancellationToken?: CancellationToken, ignoreSourceFile?: (sourceFile: SourceFile) => boolean): AffectedFileResult; + } + /** + * The builder that can handle the changes in program and iterate through changed file to emit the files + * The semantic diagnostics are cached per file and managed by clearing for the changed/affected files + */ + interface EmitAndSemanticDiagnosticsBuilderProgram extends SemanticDiagnosticsBuilderProgram { + /** + * Emits the next affected file's emit result (EmitResult and sourceFiles emitted) or returns undefined if iteration is complete + * The first of writeFile if provided, writeFile of BuilderProgramHost if provided, writeFile of compiler host + * in that order would be used to write the files + */ + emitNextAffectedFile(writeFile?: WriteFileCallback, cancellationToken?: CancellationToken, emitOnlyDtsFiles?: boolean, customTransformers?: CustomTransformers): AffectedFileResult; + } + function readBuilderProgram(compilerOptions: CompilerOptions, host: ReadBuildProgramHost): EmitAndSemanticDiagnosticsBuilderProgram | undefined; + function createIncrementalCompilerHost(options: CompilerOptions, system?: System): CompilerHost; + function createIncrementalProgram({ rootNames, options, configFileParsingDiagnostics, projectReferences, host, createProgram }: IncrementalProgramOptions): T; + /** + * Create the watch compiler host for either configFile or fileNames and its options + */ + function createWatchCompilerHost(configFileName: string, optionsToExtend: CompilerOptions | undefined, system: System, createProgram?: CreateProgram, reportDiagnostic?: DiagnosticReporter, reportWatchStatus?: WatchStatusReporter, watchOptionsToExtend?: WatchOptions, extraFileExtensions?: readonly FileExtensionInfo[]): WatchCompilerHostOfConfigFile; + function createWatchCompilerHost(rootFiles: string[], options: CompilerOptions, system: System, createProgram?: CreateProgram, reportDiagnostic?: DiagnosticReporter, reportWatchStatus?: WatchStatusReporter, projectReferences?: readonly ProjectReference[], watchOptions?: WatchOptions): WatchCompilerHostOfFilesAndCompilerOptions; + /** + * Creates the watch from the host for root files and compiler options + */ + function createWatchProgram(host: WatchCompilerHostOfFilesAndCompilerOptions): WatchOfFilesAndCompilerOptions; + /** + * Creates the watch from the host for config file + */ + function createWatchProgram(host: WatchCompilerHostOfConfigFile): WatchOfConfigFile; + interface ReadBuildProgramHost { + useCaseSensitiveFileNames(): boolean; + getCurrentDirectory(): string; + readFile(fileName: string): string | undefined; + } + interface IncrementalProgramOptions { + rootNames: readonly string[]; + options: CompilerOptions; + configFileParsingDiagnostics?: readonly Diagnostic[]; + projectReferences?: readonly ProjectReference[]; + host?: CompilerHost; + createProgram?: CreateProgram; + } + type WatchStatusReporter = (diagnostic: Diagnostic, newLine: string, options: CompilerOptions, errorCount?: number) => void; + /** Create the program with rootNames and options, if they are undefined, oldProgram and new configFile diagnostics create new program */ + type CreateProgram = (rootNames: readonly string[] | undefined, options: CompilerOptions | undefined, host?: CompilerHost, oldProgram?: T, configFileParsingDiagnostics?: readonly Diagnostic[], projectReferences?: readonly ProjectReference[] | undefined) => T; + /** Host that has watch functionality used in --watch mode */ + interface WatchHost { + /** If provided, called with Diagnostic message that informs about change in watch status */ + onWatchStatusChange?(diagnostic: Diagnostic, newLine: string, options: CompilerOptions, errorCount?: number): void; + /** Used to watch changes in source files, missing files needed to update the program or config file */ + watchFile(path: string, callback: FileWatcherCallback, pollingInterval?: number, options?: WatchOptions): FileWatcher; + /** Used to watch resolved module's failed lookup locations, config file specs, type roots where auto type reference directives are added */ + watchDirectory(path: string, callback: DirectoryWatcherCallback, recursive?: boolean, options?: WatchOptions): FileWatcher; + /** If provided, will be used to set delayed compilation, so that multiple changes in short span are compiled together */ + setTimeout?(callback: (...args: any[]) => void, ms: number, ...args: any[]): any; + /** If provided, will be used to reset existing delayed compilation */ + clearTimeout?(timeoutId: any): void; + } + interface ProgramHost { + /** + * Used to create the program when need for program creation or recreation detected + */ + createProgram: CreateProgram; + useCaseSensitiveFileNames(): boolean; + getNewLine(): string; + getCurrentDirectory(): string; + getDefaultLibFileName(options: CompilerOptions): string; + getDefaultLibLocation?(): string; + createHash?(data: string): string; + /** + * Use to check file presence for source files and + * if resolveModuleNames is not provided (complier is in charge of module resolution) then module files as well + */ + fileExists(path: string): boolean; + /** + * Use to read file text for source files and + * if resolveModuleNames is not provided (complier is in charge of module resolution) then module files as well + */ + readFile(path: string, encoding?: string): string | undefined; + /** If provided, used for module resolution as well as to handle directory structure */ + directoryExists?(path: string): boolean; + /** If provided, used in resolutions as well as handling directory structure */ + getDirectories?(path: string): string[]; + /** If provided, used to cache and handle directory structure modifications */ + readDirectory?(path: string, extensions?: readonly string[], exclude?: readonly string[], include?: readonly string[], depth?: number): string[]; + /** Symbol links resolution */ + realpath?(path: string): string; + /** If provided would be used to write log about compilation */ + trace?(s: string): void; + /** If provided is used to get the environment variable */ + getEnvironmentVariable?(name: string): string | undefined; + /** + * @deprecated supply resolveModuleNameLiterals instead for resolution that can handle newer resolution modes like nodenext + * + * If provided, used to resolve the module names, otherwise typescript's default module resolution + */ + resolveModuleNames?(moduleNames: string[], containingFile: string, reusedNames: string[] | undefined, redirectedReference: ResolvedProjectReference | undefined, options: CompilerOptions, containingSourceFile?: SourceFile): (ResolvedModule | undefined)[]; + /** + * @deprecated supply resolveTypeReferenceDirectiveReferences instead for resolution that can handle newer resolution modes like nodenext + * + * If provided, used to resolve type reference directives, otherwise typescript's default resolution + */ + resolveTypeReferenceDirectives?(typeReferenceDirectiveNames: string[] | readonly FileReference[], containingFile: string, redirectedReference: ResolvedProjectReference | undefined, options: CompilerOptions, containingFileMode?: ResolutionMode): (ResolvedTypeReferenceDirective | undefined)[]; + resolveModuleNameLiterals?(moduleLiterals: readonly StringLiteralLike[], containingFile: string, redirectedReference: ResolvedProjectReference | undefined, options: CompilerOptions, containingSourceFile: SourceFile, reusedNames: readonly StringLiteralLike[] | undefined): readonly ResolvedModuleWithFailedLookupLocations[]; + resolveTypeReferenceDirectiveReferences?(typeDirectiveReferences: readonly T[], containingFile: string, redirectedReference: ResolvedProjectReference | undefined, options: CompilerOptions, containingSourceFile: SourceFile | undefined, reusedNames: readonly T[] | undefined): readonly ResolvedTypeReferenceDirectiveWithFailedLookupLocations[]; + /** If provided along with custom resolveModuleNames or resolveTypeReferenceDirectives, used to determine if unchanged file path needs to re-resolve modules/type reference directives */ + hasInvalidatedResolutions?(filePath: Path): boolean; + /** + * Returns the module resolution cache used by a provided `resolveModuleNames` implementation so that any non-name module resolution operations (eg, package.json lookup) can reuse it + */ + getModuleResolutionCache?(): ModuleResolutionCache | undefined; + } + interface WatchCompilerHost extends ProgramHost, WatchHost { + /** Instead of using output d.ts file from project reference, use its source file */ + useSourceOfProjectReferenceRedirect?(): boolean; + /** If provided, use this method to get parsed command lines for referenced projects */ + getParsedCommandLine?(fileName: string): ParsedCommandLine | undefined; + /** If provided, callback to invoke after every new program creation */ + afterProgramCreate?(program: T): void; + } + /** + * Host to create watch with root files and options + */ + interface WatchCompilerHostOfFilesAndCompilerOptions extends WatchCompilerHost { + /** root files to use to generate program */ + rootFiles: string[]; + /** Compiler options */ + options: CompilerOptions; + watchOptions?: WatchOptions; + /** Project References */ + projectReferences?: readonly ProjectReference[]; + } + /** + * Host to create watch with config file + */ + interface WatchCompilerHostOfConfigFile extends WatchCompilerHost, ConfigFileDiagnosticsReporter { + /** Name of the config file to compile */ + configFileName: string; + /** Options to extend */ + optionsToExtend?: CompilerOptions; + watchOptionsToExtend?: WatchOptions; + extraFileExtensions?: readonly FileExtensionInfo[]; + /** + * Used to generate source file names from the config file and its include, exclude, files rules + * and also to cache the directory stucture + */ + readDirectory(path: string, extensions?: readonly string[], exclude?: readonly string[], include?: readonly string[], depth?: number): string[]; + } + interface Watch { + /** Synchronize with host and get updated program */ + getProgram(): T; + /** Closes the watch */ + close(): void; + } + /** + * Creates the watch what generates program using the config file + */ + interface WatchOfConfigFile extends Watch { + } + /** + * Creates the watch that generates program using the root files and compiler options + */ + interface WatchOfFilesAndCompilerOptions extends Watch { + /** Updates the root files in the program, only if this is not config file compilation */ + updateRootFileNames(fileNames: string[]): void; + } + /** + * Create a function that reports watch status by writing to the system and handles the formating of the diagnostic + */ + function createBuilderStatusReporter(system: System, pretty?: boolean): DiagnosticReporter; + function createSolutionBuilderHost(system?: System, createProgram?: CreateProgram, reportDiagnostic?: DiagnosticReporter, reportSolutionBuilderStatus?: DiagnosticReporter, reportErrorSummary?: ReportEmitErrorSummary): SolutionBuilderHost; + function createSolutionBuilderWithWatchHost(system?: System, createProgram?: CreateProgram, reportDiagnostic?: DiagnosticReporter, reportSolutionBuilderStatus?: DiagnosticReporter, reportWatchStatus?: WatchStatusReporter): SolutionBuilderWithWatchHost; + function createSolutionBuilder(host: SolutionBuilderHost, rootNames: readonly string[], defaultOptions: BuildOptions): SolutionBuilder; + function createSolutionBuilderWithWatch(host: SolutionBuilderWithWatchHost, rootNames: readonly string[], defaultOptions: BuildOptions, baseWatchOptions?: WatchOptions): SolutionBuilder; + interface BuildOptions { + dry?: boolean; + force?: boolean; + verbose?: boolean; + incremental?: boolean; + assumeChangesOnlyAffectDirectDependencies?: boolean; + declaration?: boolean; + declarationMap?: boolean; + emitDeclarationOnly?: boolean; + sourceMap?: boolean; + inlineSourceMap?: boolean; + traceResolution?: boolean; + [option: string]: CompilerOptionsValue | undefined; + } + type ReportEmitErrorSummary = (errorCount: number, filesInError: (ReportFileInError | undefined)[]) => void; + interface ReportFileInError { + fileName: string; + line: number; + } + interface SolutionBuilderHostBase extends ProgramHost { + createDirectory?(path: string): void; + /** + * Should provide create directory and writeFile if done of invalidatedProjects is not invoked with + * writeFileCallback + */ + writeFile?(path: string, data: string, writeByteOrderMark?: boolean): void; + getCustomTransformers?: (project: string) => CustomTransformers | undefined; + getModifiedTime(fileName: string): Date | undefined; + setModifiedTime(fileName: string, date: Date): void; + deleteFile(fileName: string): void; + getParsedCommandLine?(fileName: string): ParsedCommandLine | undefined; + reportDiagnostic: DiagnosticReporter; + reportSolutionBuilderStatus: DiagnosticReporter; + afterProgramEmitAndDiagnostics?(program: T): void; + } + interface SolutionBuilderHost extends SolutionBuilderHostBase { + reportErrorSummary?: ReportEmitErrorSummary; + } + interface SolutionBuilderWithWatchHost extends SolutionBuilderHostBase, WatchHost { + } + interface SolutionBuilder { + build(project?: string, cancellationToken?: CancellationToken, writeFile?: WriteFileCallback, getCustomTransformers?: (project: string) => CustomTransformers): ExitStatus; + clean(project?: string): ExitStatus; + buildReferences(project: string, cancellationToken?: CancellationToken, writeFile?: WriteFileCallback, getCustomTransformers?: (project: string) => CustomTransformers): ExitStatus; + cleanReferences(project?: string): ExitStatus; + getNextInvalidatedProject(cancellationToken?: CancellationToken): InvalidatedProject | undefined; + } + enum InvalidatedProjectKind { + Build = 0, + /** @deprecated */ UpdateBundle = 1, + UpdateOutputFileStamps = 2 + } + interface InvalidatedProjectBase { + readonly kind: InvalidatedProjectKind; + readonly project: ResolvedConfigFileName; + /** + * To dispose this project and ensure that all the necessary actions are taken and state is updated accordingly + */ + done(cancellationToken?: CancellationToken, writeFile?: WriteFileCallback, customTransformers?: CustomTransformers): ExitStatus; + getCompilerOptions(): CompilerOptions; + getCurrentDirectory(): string; + } + interface UpdateOutputFileStampsProject extends InvalidatedProjectBase { + readonly kind: InvalidatedProjectKind.UpdateOutputFileStamps; + updateOutputFileStatmps(): void; + } + interface BuildInvalidedProject extends InvalidatedProjectBase { + readonly kind: InvalidatedProjectKind.Build; + getBuilderProgram(): T | undefined; + getProgram(): Program | undefined; + getSourceFile(fileName: string): SourceFile | undefined; + getSourceFiles(): readonly SourceFile[]; + getOptionsDiagnostics(cancellationToken?: CancellationToken): readonly Diagnostic[]; + getGlobalDiagnostics(cancellationToken?: CancellationToken): readonly Diagnostic[]; + getConfigFileParsingDiagnostics(): readonly Diagnostic[]; + getSyntacticDiagnostics(sourceFile?: SourceFile, cancellationToken?: CancellationToken): readonly Diagnostic[]; + getAllDependencies(sourceFile: SourceFile): readonly string[]; + getSemanticDiagnostics(sourceFile?: SourceFile, cancellationToken?: CancellationToken): readonly Diagnostic[]; + getSemanticDiagnosticsOfNextAffectedFile(cancellationToken?: CancellationToken, ignoreSourceFile?: (sourceFile: SourceFile) => boolean): AffectedFileResult; + emit(targetSourceFile?: SourceFile, writeFile?: WriteFileCallback, cancellationToken?: CancellationToken, emitOnlyDtsFiles?: boolean, customTransformers?: CustomTransformers): EmitResult | undefined; + } + /** @deprecated */ + interface UpdateBundleProject extends InvalidatedProjectBase { + readonly kind: InvalidatedProjectKind.UpdateBundle; + emit(writeFile?: WriteFileCallback, customTransformers?: CustomTransformers): EmitResult | BuildInvalidedProject | undefined; + } + type InvalidatedProject = UpdateOutputFileStampsProject | BuildInvalidedProject | UpdateBundleProject; + function isBuild(commandLineArgs: readonly string[]): boolean; + function executeCommandLine(system: System, cb: ExecuteCommandLineCallbacks, commandLineArgs: readonly string[]): void | WatchOfConfigFile | SolutionBuilder; + enum StatisticType { + time = 0, + count = 1, + memory = 2 + } + type ExecuteCommandLineCallbacks = (program: Program | BuilderProgram | ParsedCommandLine) => void; +} +export = ts; \ No newline at end of file diff --git a/tests/cases/compiler/APILibCheck.ts b/tests/cases/compiler/APILibCheck.ts index 674c2f280a1ea..421e9c1b577fd 100644 --- a/tests/cases/compiler/APILibCheck.ts +++ b/tests/cases/compiler/APILibCheck.ts @@ -27,8 +27,22 @@ "types": "/.ts/tsserverlibrary.internal.d.ts" } +// @filename: node_modules/tsclibrary/package.json +{ + "name": "tsclibrary", + "types": "/.ts/tsclibrary.d.ts" +} + +// @filename: node_modules/tsclibrary-internal/package.json +{ + "name": "tsclibrary-internal", + "types": "/.ts/tsclibrary.internal.d.ts" +} + // @filename: index.ts import ts = require("typescript"); import tsInternal = require("typescript-internal"); import tsserverlibrary = require("tsserverlibrary"); import tsserverlibraryInternal = require("tsserverlibrary-internal"); +import tsclibrary = require("tsclibrary"); +import tsclibraryInternal = require("tsclibrary-internal"); From b808fc2449a0f063e43b3bc9c026b37543d65807 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Fri, 21 Apr 2023 18:19:48 -0700 Subject: [PATCH 3/7] Add support for custom transformers --- src/compiler/emitter.ts | 1 + src/compiler/program.ts | 34 +++++++++++++++++-- src/compiler/transformer.ts | 16 +++++++++ src/compiler/types.ts | 33 ++++++++++++++++-- src/server/project.ts | 8 +++-- tests/baselines/reference/api/tsclibrary.d.ts | 23 ++++++++++++- .../reference/api/tsserverlibrary.d.ts | 23 ++++++++++++- tests/baselines/reference/api/typescript.d.ts | 23 ++++++++++++- 8 files changed, 151 insertions(+), 10 deletions(-) diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 6f34ec688fc63..c5c2e5ec68221 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -1336,6 +1336,7 @@ function emitUsingBuildInfoWorker( getFileIncludeReasons: notImplemented, createHash: maybeBind(host, host.createHash), }; + // TODO(jakebailey): customTransformers emitFiles( notImplementedResolver, emitHost, diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 7736fe9183d94..b12728cd33bcf 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -53,6 +53,7 @@ import { createTypeChecker, createTypeReferenceDirectiveResolutionCache, CustomTransformers, + CustomTransformersModuleFactory, Debug, DeclarationWithTypeParameterChildren, Diagnostic, @@ -153,6 +154,7 @@ import { getTsBuildInfoEmitOutputFilePath, getTsConfigObjectLiteralExpression, getTsConfigPropArrayElementValue, + getTypeScriptNamespace, getTypesPackageName, HasChangedAutomaticTypeDirectiveNames, hasChangesInResolutions, @@ -219,6 +221,7 @@ import { mapDefinedIterator, maybeBind, memoize, + mergeCustomTransformers, MethodDeclaration, ModeAwareCache, ModeAwareCacheKey, @@ -500,7 +503,8 @@ export function createCompilerHostWorker(options: CompilerOptions, setParentNode realpath, readDirectory: (path, extensions, include, exclude, depth) => system.readDirectory(path, extensions, include, exclude, depth), createDirectory: d => system.createDirectory(d), - createHash: maybeBind(system, system.createHash) + createHash: maybeBind(system, system.createHash), + require: maybeBind(system, system.require), }; return compilerHost; } @@ -2702,6 +2706,30 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg return hasEmitBlockingDiagnostics.has(toPath(emitFileName)); } + function getCustomTransformers() { + if (!host.require) { + return emptyArray; + } + + const compilerOptions = program.getCompilerOptions(); + const customTransformers = mapDefined(compilerOptions.plugins, config => { + if (config.type !== "transformer") return undefined; + + // TODO(jakebailey): The LS plugin loader is more complicated than this; copy. + const result = host.require!(program.getCurrentDirectory(), config.path); + // TODO(jakebailey): error handling, only do this once per, etc + Debug.assertIsDefined(result.module); + + const factory = result.module as CustomTransformersModuleFactory; + Debug.assert(typeof factory === "function"); + + const plugin = factory({ typescript: getTypeScriptNamespace() }); + return plugin.create({ program, config }); + }); + + return customTransformers ?? emptyArray; + } + function emitWorker(program: Program, sourceFile: SourceFile | undefined, writeFileCallback: WriteFileCallback | undefined, cancellationToken: CancellationToken | undefined, emitOnly?: boolean | EmitOnly, customTransformers?: CustomTransformers, forceDtsEmit?: boolean): EmitResult { if (!forceDtsEmit) { const result = handleNoEmitOptions(program, sourceFile, writeFileCallback, cancellationToken); @@ -2720,11 +2748,13 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg performance.mark("beforeEmit"); + const mergedCustomTransformers = mergeCustomTransformers(...getCustomTransformers(), customTransformers); + const emitResult = emitFiles( emitResolver, getEmitHost(writeFileCallback), sourceFile, - getTransformers(options, customTransformers, emitOnly), + getTransformers(options, mergedCustomTransformers, emitOnly), emitOnly, /*onlyBuildInfo*/ false, forceDtsEmit diff --git a/src/compiler/transformer.ts b/src/compiler/transformer.ts index a6bf29119479c..126deeac87ed6 100644 --- a/src/compiler/transformer.ts +++ b/src/compiler/transformer.ts @@ -4,6 +4,7 @@ import { Bundle, chainBundle, CompilerOptions, + concatenate, createEmitHelperFactory, CustomTransformer, CustomTransformerFactory, @@ -116,6 +117,21 @@ export function getTransformers(compilerOptions: CompilerOptions, customTransfor }; } +/** @internal */ +export function mergeCustomTransformers(...customTransformers: (CustomTransformers | undefined)[]): CustomTransformers | undefined { + if (!some(customTransformers)) return undefined; + + const result: CustomTransformers = {}; + for (const transformer of customTransformers) { + if (!transformer) continue; + result.before = concatenate(result.before, transformer.before); + result.after = concatenate(result.after, transformer.after); + result.afterDeclarations = concatenate(result.afterDeclarations, transformer.afterDeclarations); + } + + return result; +} + function getScriptTransformers(compilerOptions: CompilerOptions, customTransformers?: CustomTransformers, emitOnly?: boolean | EmitOnly) { if (emitOnly) return emptyArray; diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 905552c7fc7f4..a5bf53550a5a0 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -17,6 +17,7 @@ import { SymlinkCache, ThisContainer, } from "./_namespaces/ts"; +import * as ts from "./_namespaces/ts"; // branded string type used to store absolute, normalized and canonicalized paths // arbitrary file name can be converted to Path via toPath function @@ -7040,8 +7041,18 @@ export enum ModuleDetectionKind { Force = 3, } +export type PluginConfig = PluginImport | TransformerPluginImport; + export interface PluginImport { + type?: undefined; name: string; + /** @internal */ + global?: boolean; +} + +export interface TransformerPluginImport { + type: "transformer", + path: string; } export interface ProjectReference { @@ -7078,7 +7089,7 @@ export enum PollingWatchKind { FixedChunkSize, } -export type CompilerOptionsValue = string | number | boolean | (string | number)[] | string[] | MapLike | PluginImport[] | ProjectReference[] | null | undefined; +export type CompilerOptionsValue = string | number | boolean | (string | number)[] | string[] | MapLike | PluginConfig[] | ProjectReference[] | null | undefined; export interface CompilerOptions { /** @internal */ all?: boolean; @@ -7179,7 +7190,7 @@ export interface CompilerOptions { * @internal */ pathsBasePath?: string; - /** @internal */ plugins?: PluginImport[]; + /** @internal */ plugins?: PluginConfig[]; preserveConstEnums?: boolean; noImplicitOverride?: boolean; preserveSymlinks?: boolean; @@ -7225,6 +7236,7 @@ export interface CompilerOptions { esModuleInterop?: boolean; /** @internal */ showConfig?: boolean; useDefineForClassFields?: boolean; + customTransformers?: string[]; [option: string]: CompilerOptionsValue | TsConfigSourceFile | undefined; } @@ -7824,6 +7836,7 @@ export interface CompilerHost extends ModuleResolutionHost { createHash?(data: string): string; getParsedCommandLine?(fileName: string): ParsedCommandLine | undefined; /** @internal */ useSourceOfProjectReferenceRedirect?(): boolean; + /** @internal */ require?(baseDir: string, moduleName: string): ModuleImportResult; // TODO: later handle this in better way in builder host instead once the api for tsbuild finalizes and doesn't use compilerHost as base /** @internal */createDirectory?(directory: string): void; @@ -9991,3 +10004,19 @@ export interface Queue { dequeue(): T; isEmpty(): boolean; } + +export type CustomTransformersModuleFactory = (mod: { typescript: typeof ts }) => CustomTransformersModule; + +export interface CustomTransformersModuleWithName { + name: string; + module: CustomTransformersModule; +} + +export interface CustomTransformersModule { + create(createInfo: CustomTransformersCreateInfo): CustomTransformers; +} + +export interface CustomTransformersCreateInfo { + program: Program; + config: any; +} diff --git a/src/server/project.ts b/src/server/project.ts index 4ff3a21454792..5640306a299de 100644 --- a/src/server/project.ts +++ b/src/server/project.ts @@ -1971,12 +1971,12 @@ export abstract class Project implements LanguageServiceHost, ModuleResolutionHo if (!globalPluginName) continue; // Skip already-locally-loaded plugins - if (options.plugins && options.plugins.some(p => p.name === globalPluginName)) continue; + if (options.plugins && options.plugins.some(p => p.type === undefined && p.name === globalPluginName)) continue; // Provide global: true so plugins can detect why they can't find their config this.projectService.logger.info(`Loading global plugin ${globalPluginName}`); - this.enablePlugin({ name: globalPluginName, global: true } as PluginImport, searchPaths); + this.enablePlugin({ name: globalPluginName, global: true }, searchPaths); } } @@ -2831,7 +2831,9 @@ export class ConfiguredProject extends Project { // Enable tsconfig-specified plugins if (options.plugins) { for (const pluginConfigEntry of options.plugins) { - this.enablePlugin(pluginConfigEntry, searchPaths); + if (pluginConfigEntry.type === undefined) { + this.enablePlugin(pluginConfigEntry, searchPaths); + } } } diff --git a/tests/baselines/reference/api/tsclibrary.d.ts b/tests/baselines/reference/api/tsclibrary.d.ts index a35ceaf32191b..cbeb81320af23 100644 --- a/tests/baselines/reference/api/tsclibrary.d.ts +++ b/tests/baselines/reference/api/tsclibrary.d.ts @@ -2996,9 +2996,15 @@ declare namespace ts { */ Force = 3 } + type PluginConfig = PluginImport | TransformerPluginImport; interface PluginImport { + type?: undefined; name: string; } + interface TransformerPluginImport { + type: "transformer"; + path: string; + } interface ProjectReference { /** A normalized path on disk */ path: string; @@ -3029,7 +3035,7 @@ declare namespace ts { DynamicPriority = 2, FixedChunkSize = 3 } - type CompilerOptionsValue = string | number | boolean | (string | number)[] | string[] | MapLike | PluginImport[] | ProjectReference[] | null | undefined; + type CompilerOptionsValue = string | number | boolean | (string | number)[] | string[] | MapLike | PluginConfig[] | ProjectReference[] | null | undefined; interface CompilerOptions { allowImportingTsExtensions?: boolean; allowJs?: boolean; @@ -3134,6 +3140,7 @@ declare namespace ts { verbatimModuleSyntax?: boolean; esModuleInterop?: boolean; useDefineForClassFields?: boolean; + customTransformers?: string[]; [option: string]: CompilerOptionsValue | TsConfigSourceFile | undefined; } interface WatchOptions { @@ -4263,6 +4270,20 @@ declare namespace ts { negative: boolean; base10Value: string; } + type CustomTransformersModuleFactory = (mod: { + typescript: typeof ts; + }) => CustomTransformersModule; + interface CustomTransformersModuleWithName { + name: string; + module: CustomTransformersModule; + } + interface CustomTransformersModule { + create(createInfo: CustomTransformersCreateInfo): CustomTransformers; + } + interface CustomTransformersCreateInfo { + program: Program; + config: any; + } enum FileWatcherEventKind { Created = 0, Changed = 1, diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index f39dee12ae47b..fd54f350c3472 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -7128,9 +7128,15 @@ declare namespace ts { */ Force = 3 } + type PluginConfig = PluginImport | TransformerPluginImport; interface PluginImport { + type?: undefined; name: string; } + interface TransformerPluginImport { + type: "transformer"; + path: string; + } interface ProjectReference { /** A normalized path on disk */ path: string; @@ -7161,7 +7167,7 @@ declare namespace ts { DynamicPriority = 2, FixedChunkSize = 3 } - type CompilerOptionsValue = string | number | boolean | (string | number)[] | string[] | MapLike | PluginImport[] | ProjectReference[] | null | undefined; + type CompilerOptionsValue = string | number | boolean | (string | number)[] | string[] | MapLike | PluginConfig[] | ProjectReference[] | null | undefined; interface CompilerOptions { allowImportingTsExtensions?: boolean; allowJs?: boolean; @@ -7266,6 +7272,7 @@ declare namespace ts { verbatimModuleSyntax?: boolean; esModuleInterop?: boolean; useDefineForClassFields?: boolean; + customTransformers?: string[]; [option: string]: CompilerOptionsValue | TsConfigSourceFile | undefined; } interface WatchOptions { @@ -8398,6 +8405,20 @@ declare namespace ts { negative: boolean; base10Value: string; } + type CustomTransformersModuleFactory = (mod: { + typescript: typeof ts; + }) => CustomTransformersModule; + interface CustomTransformersModuleWithName { + name: string; + module: CustomTransformersModule; + } + interface CustomTransformersModule { + create(createInfo: CustomTransformersCreateInfo): CustomTransformers; + } + interface CustomTransformersCreateInfo { + program: Program; + config: any; + } enum FileWatcherEventKind { Created = 0, Changed = 1, diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index 13520f2ace059..28aed4d3897b7 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -3081,9 +3081,15 @@ declare namespace ts { */ Force = 3 } + type PluginConfig = PluginImport | TransformerPluginImport; interface PluginImport { + type?: undefined; name: string; } + interface TransformerPluginImport { + type: "transformer"; + path: string; + } interface ProjectReference { /** A normalized path on disk */ path: string; @@ -3114,7 +3120,7 @@ declare namespace ts { DynamicPriority = 2, FixedChunkSize = 3 } - type CompilerOptionsValue = string | number | boolean | (string | number)[] | string[] | MapLike | PluginImport[] | ProjectReference[] | null | undefined; + type CompilerOptionsValue = string | number | boolean | (string | number)[] | string[] | MapLike | PluginConfig[] | ProjectReference[] | null | undefined; interface CompilerOptions { allowImportingTsExtensions?: boolean; allowJs?: boolean; @@ -3219,6 +3225,7 @@ declare namespace ts { verbatimModuleSyntax?: boolean; esModuleInterop?: boolean; useDefineForClassFields?: boolean; + customTransformers?: string[]; [option: string]: CompilerOptionsValue | TsConfigSourceFile | undefined; } interface WatchOptions { @@ -4351,6 +4358,20 @@ declare namespace ts { negative: boolean; base10Value: string; } + type CustomTransformersModuleFactory = (mod: { + typescript: typeof ts; + }) => CustomTransformersModule; + interface CustomTransformersModuleWithName { + name: string; + module: CustomTransformersModule; + } + interface CustomTransformersModule { + create(createInfo: CustomTransformersCreateInfo): CustomTransformers; + } + interface CustomTransformersCreateInfo { + program: Program; + config: any; + } enum FileWatcherEventKind { Created = 0, Changed = 1, From e3498015e5317de3348ac365800a61f9fe20b073 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Mon, 24 Apr 2023 11:20:20 -0700 Subject: [PATCH 4/7] Gate plugins on CLI flag --- src/compiler/commandLineParser.ts | 9 +++++++++ src/compiler/diagnosticMessages.json | 4 ++++ src/compiler/pluginUtilities.ts | 13 +++++++++++++ src/compiler/program.ts | 13 +++++++++++++ src/compiler/tsbuildPublic.ts | 1 + src/compiler/types.ts | 1 + tests/baselines/reference/api/tsclibrary.d.ts | 2 ++ tests/baselines/reference/api/tsserverlibrary.d.ts | 2 ++ tests/baselines/reference/api/typescript.d.ts | 2 ++ .../allowPlugins/tsconfig.json | 5 +++++ 10 files changed, 52 insertions(+) create mode 100644 tests/baselines/reference/config/showConfig/Shows tsconfig for single option/allowPlugins/tsconfig.json diff --git a/src/compiler/commandLineParser.ts b/src/compiler/commandLineParser.ts index 3b2120d258c8c..5a34aadc7b33e 100644 --- a/src/compiler/commandLineParser.ts +++ b/src/compiler/commandLineParser.ts @@ -500,6 +500,15 @@ export const commonOptionsWithBuild: CommandLineOption[] = [ description: Diagnostics.Set_the_language_of_the_messaging_from_TypeScript_This_does_not_affect_emit, defaultValueDescription: Diagnostics.Platform_specific }, + { + name: "allowPlugins", + type: "boolean", + affectsSemanticDiagnostics: true, + affectsEmit: true, + affectsBuildInfo: true, + defaultValueDescription: undefined, + isCommandLineOnly: true, + }, ]; /** @internal */ diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 62f4bf4829b18..4236d39d13a47 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -6236,6 +6236,10 @@ "category": "Error", "code": 6931 }, + "Option '--allowPlugins' must be specified when compiler plugins are present.": { + "category": "Error", + "code": 6932 + }, "Variable '{0}' implicitly has an '{1}' type.": { "category": "Error", diff --git a/src/compiler/pluginUtilities.ts b/src/compiler/pluginUtilities.ts index 770648ab982fc..1b63fb1f1eeaa 100644 --- a/src/compiler/pluginUtilities.ts +++ b/src/compiler/pluginUtilities.ts @@ -1,3 +1,5 @@ +import type { CompilerOptions } from "./types"; + /** @internal */ export type Entrypoint = "tsc" | "typescript" | "tsserver" | "tsserverlibrary" | "testRunner"; @@ -16,3 +18,14 @@ export function getTypeScriptNamespace(): any { if (currentTsNamespace === undefined) throw new Error("ts namespace unset"); return currentTsNamespace; } + +/** @internal */ +export function shouldAllowPlugins(options: CompilerOptions): boolean { + switch (currentEntrypoint) { + case "tsserver": + case "tsserverlibrary": + case "typescript": + return true; + } + return options.allowPlugins ?? false; +} diff --git a/src/compiler/program.ts b/src/compiler/program.ts index b12728cd33bcf..624706535e7e7 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -294,6 +294,7 @@ import { setParentRecursive, setResolvedModule, setResolvedTypeReferenceDirective, + shouldAllowPlugins, shouldResolveJsRequire, skipTrivia, skipTypeChecking, @@ -2712,6 +2713,10 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg } const compilerOptions = program.getCompilerOptions(); + if (!shouldAllowPlugins(compilerOptions)) { + return emptyArray; + } + const customTransformers = mapDefined(compilerOptions.plugins, config => { if (config.type !== "transformer") return undefined; @@ -4444,6 +4449,14 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg }); } + if (options.plugins && !shouldAllowPlugins(options)) { + for (const plugin of options.plugins) { + if (plugin.type === undefined) continue; // Language service plugins. TODO(jakebailey): give these a type, require type, deprecate missing type? + programDiagnostics.add(createCompilerDiagnostic(Diagnostics.Option_allowPlugins_must_be_specified_when_compiler_plugins_are_present)); + break; + } + } + // Verify that all the emit files are unique and don't overwrite input files function verifyEmitFilePath(emitFileName: string | undefined, emitFilesSeen: Set) { if (emitFileName) { diff --git a/src/compiler/tsbuildPublic.ts b/src/compiler/tsbuildPublic.ts index 3bc998eb7dc26..0955afb7774a0 100644 --- a/src/compiler/tsbuildPublic.ts +++ b/src/compiler/tsbuildPublic.ts @@ -162,6 +162,7 @@ export interface BuildOptions { /** @internal */ locale?: string; /** @internal */ generateCpuProfile?: string; /** @internal */ generateTrace?: string; + allowPlugins?: boolean; [option: string]: CompilerOptionsValue | undefined; } diff --git a/src/compiler/types.ts b/src/compiler/types.ts index a5bf53550a5a0..59cbf22eabed8 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -7237,6 +7237,7 @@ export interface CompilerOptions { /** @internal */ showConfig?: boolean; useDefineForClassFields?: boolean; customTransformers?: string[]; + allowPlugins?: boolean; [option: string]: CompilerOptionsValue | TsConfigSourceFile | undefined; } diff --git a/tests/baselines/reference/api/tsclibrary.d.ts b/tests/baselines/reference/api/tsclibrary.d.ts index cbeb81320af23..58551df5dc975 100644 --- a/tests/baselines/reference/api/tsclibrary.d.ts +++ b/tests/baselines/reference/api/tsclibrary.d.ts @@ -3141,6 +3141,7 @@ declare namespace ts { esModuleInterop?: boolean; useDefineForClassFields?: boolean; customTransformers?: string[]; + allowPlugins?: boolean; [option: string]: CompilerOptionsValue | TsConfigSourceFile | undefined; } interface WatchOptions { @@ -5735,6 +5736,7 @@ declare namespace ts { sourceMap?: boolean; inlineSourceMap?: boolean; traceResolution?: boolean; + allowPlugins?: boolean; [option: string]: CompilerOptionsValue | undefined; } type ReportEmitErrorSummary = (errorCount: number, filesInError: (ReportFileInError | undefined)[]) => void; diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index fd54f350c3472..6070fc0f6d205 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -7273,6 +7273,7 @@ declare namespace ts { esModuleInterop?: boolean; useDefineForClassFields?: boolean; customTransformers?: string[]; + allowPlugins?: boolean; [option: string]: CompilerOptionsValue | TsConfigSourceFile | undefined; } interface WatchOptions { @@ -9870,6 +9871,7 @@ declare namespace ts { sourceMap?: boolean; inlineSourceMap?: boolean; traceResolution?: boolean; + allowPlugins?: boolean; [option: string]: CompilerOptionsValue | undefined; } type ReportEmitErrorSummary = (errorCount: number, filesInError: (ReportFileInError | undefined)[]) => void; diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index 28aed4d3897b7..0a63def1eaed6 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -3226,6 +3226,7 @@ declare namespace ts { esModuleInterop?: boolean; useDefineForClassFields?: boolean; customTransformers?: string[]; + allowPlugins?: boolean; [option: string]: CompilerOptionsValue | TsConfigSourceFile | undefined; } interface WatchOptions { @@ -5823,6 +5824,7 @@ declare namespace ts { sourceMap?: boolean; inlineSourceMap?: boolean; traceResolution?: boolean; + allowPlugins?: boolean; [option: string]: CompilerOptionsValue | undefined; } type ReportEmitErrorSummary = (errorCount: number, filesInError: (ReportFileInError | undefined)[]) => void; diff --git a/tests/baselines/reference/config/showConfig/Shows tsconfig for single option/allowPlugins/tsconfig.json b/tests/baselines/reference/config/showConfig/Shows tsconfig for single option/allowPlugins/tsconfig.json new file mode 100644 index 0000000000000..6e51943502d7d --- /dev/null +++ b/tests/baselines/reference/config/showConfig/Shows tsconfig for single option/allowPlugins/tsconfig.json @@ -0,0 +1,5 @@ +{ + "compilerOptions": { + "allowPlugins": true + } +} From 8c3bee604ff430e110d3669e800cbbb88ce06e1c Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Fri, 19 Jan 2024 20:12:18 -0800 Subject: [PATCH 5/7] fmt --- .github/workflows/set-version.yaml | 116 ++++++++++++++--------------- 1 file changed, 58 insertions(+), 58 deletions(-) diff --git a/.github/workflows/set-version.yaml b/.github/workflows/set-version.yaml index ac2b72e2b08ce..209f42df8027c 100644 --- a/.github/workflows/set-version.yaml +++ b/.github/workflows/set-version.yaml @@ -1,58 +1,58 @@ -name: Set branch version - -on: - repository_dispatch: - types: [set-version] - -permissions: - contents: read - -# Ensure scripts are run with pipefail. See: -# https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#exit-codes-and-error-action-preference -defaults: - run: - shell: bash - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - with: - ref: ${{ github.event.client_payload.branch_name }} - token: ${{ secrets.TS_BOT_GITHUB_TOKEN }} - - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 - - run: | - npm --version - # corepack enable npm - npm install -g $(jq -r '.packageManager' < package.json) - npm --version - # notably, this is essentially the same script as `new-release-branch.yaml` (with fewer inputs), but it assumes the branch already exists - # do note that executing the transform below will prevent the `configurePrerelease` script from running on the source, as it makes the - # `version` identifier no longer match the regex it uses - # required client_payload members: - # branch_name - the target branch - # package_version - the full version string (eg, `3.9.1-rc` or `3.9.2`) - # core_major_minor - the major.minor pair associated with the desired package_version (eg, `3.9` for `3.9.3`) - - run: | - sed -i -e 's/"version": ".*"/"version": "${{ github.event.client_payload.package_version }}"/g' package.json - sed -i -e 's/const versionMajorMinor = ".*"/const versionMajorMinor = "${{ github.event.client_payload.core_major_minor }}"/g' src/compiler/corePublic.ts - sed -i -e 's/const versionMajorMinor = ".*"/const versionMajorMinor = "${{ github.event.client_payload.core_major_minor }}"/g' tests/baselines/reference/api/typescript.d.ts - sed -i -e 's/const versionMajorMinor = ".*"/const versionMajorMinor = "${{ github.event.client_payload.core_major_minor }}"/g' tests/baselines/reference/api/tsserverlibrary.d.ts - sed -i -e 's/const versionMajorMinor = ".*"/const versionMajorMinor = "${{ github.event.client_payload.core_major_minor }}"/g' tests/baselines/reference/api/tsclibrary.d.ts - sed -i -e 's/const version\(: string\)\{0,1\} = .*;/const version = "${{ github.event.client_payload.package_version }}" as string;/g' src/compiler/corePublic.ts - npm ci - npm install # update package-lock.json to ensure the version bump is included - npx hereby LKG - npm test - git diff - git add package.json package-lock.json - git add src/compiler/corePublic.ts - git add tests/baselines/reference/api/typescript.d.ts - git add tests/baselines/reference/api/tsserverlibrary.d.ts - git add tests/baselines/reference/api/tsclibrary.d.ts - git add --force ./lib - git config user.email "typescriptbot@microsoft.com" - git config user.name "TypeScript Bot" - git commit -m 'Bump version to ${{ github.event.client_payload.package_version }} and LKG' - git push +name: Set branch version + +on: + repository_dispatch: + types: [set-version] + +permissions: + contents: read + +# Ensure scripts are run with pipefail. See: +# https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#exit-codes-and-error-action-preference +defaults: + run: + shell: bash + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + with: + ref: ${{ github.event.client_payload.branch_name }} + token: ${{ secrets.TS_BOT_GITHUB_TOKEN }} + - uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 + - run: | + npm --version + # corepack enable npm + npm install -g $(jq -r '.packageManager' < package.json) + npm --version + # notably, this is essentially the same script as `new-release-branch.yaml` (with fewer inputs), but it assumes the branch already exists + # do note that executing the transform below will prevent the `configurePrerelease` script from running on the source, as it makes the + # `version` identifier no longer match the regex it uses + # required client_payload members: + # branch_name - the target branch + # package_version - the full version string (eg, `3.9.1-rc` or `3.9.2`) + # core_major_minor - the major.minor pair associated with the desired package_version (eg, `3.9` for `3.9.3`) + - run: | + sed -i -e 's/"version": ".*"/"version": "${{ github.event.client_payload.package_version }}"/g' package.json + sed -i -e 's/const versionMajorMinor = ".*"/const versionMajorMinor = "${{ github.event.client_payload.core_major_minor }}"/g' src/compiler/corePublic.ts + sed -i -e 's/const versionMajorMinor = ".*"/const versionMajorMinor = "${{ github.event.client_payload.core_major_minor }}"/g' tests/baselines/reference/api/typescript.d.ts + sed -i -e 's/const versionMajorMinor = ".*"/const versionMajorMinor = "${{ github.event.client_payload.core_major_minor }}"/g' tests/baselines/reference/api/tsserverlibrary.d.ts + sed -i -e 's/const versionMajorMinor = ".*"/const versionMajorMinor = "${{ github.event.client_payload.core_major_minor }}"/g' tests/baselines/reference/api/tsclibrary.d.ts + sed -i -e 's/const version\(: string\)\{0,1\} = .*;/const version = "${{ github.event.client_payload.package_version }}" as string;/g' src/compiler/corePublic.ts + npm ci + npm install # update package-lock.json to ensure the version bump is included + npx hereby LKG + npm test + git diff + git add package.json package-lock.json + git add src/compiler/corePublic.ts + git add tests/baselines/reference/api/typescript.d.ts + git add tests/baselines/reference/api/tsserverlibrary.d.ts + git add tests/baselines/reference/api/tsclibrary.d.ts + git add --force ./lib + git config user.email "typescriptbot@microsoft.com" + git config user.name "TypeScript Bot" + git commit -m 'Bump version to ${{ github.event.client_payload.package_version }} and LKG' + git push From a37beff401b257390c89fd8136f0042b248dba96 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Tue, 19 Mar 2024 11:41:36 -0700 Subject: [PATCH 6/7] No need for tsserver anymore --- src/tsserver/_namespaces/ts.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/tsserver/_namespaces/ts.ts b/src/tsserver/_namespaces/ts.ts index aef4cf469179d..205e6849694b0 100644 --- a/src/tsserver/_namespaces/ts.ts +++ b/src/tsserver/_namespaces/ts.ts @@ -1,4 +1 @@ export * from "../../typescript/typescript"; - -import * as ts from "./ts"; -ts.setTypeScriptNamespace("tsserver", ts); From f3d7a49f30b2e79877bad097e7e0b48b747c9e80 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Sun, 7 Jul 2024 21:40:58 -0700 Subject: [PATCH 7/7] Fix lint and fmt --- src/compiler/pluginUtilities.ts | 4 +--- src/testRunner/_namespaces/ts.ts | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/compiler/pluginUtilities.ts b/src/compiler/pluginUtilities.ts index 2bc41404955e7..0b949a2bac6e4 100644 --- a/src/compiler/pluginUtilities.ts +++ b/src/compiler/pluginUtilities.ts @@ -1,6 +1,4 @@ -import type { - CompilerOptions, -} from "./types"; +import type { CompilerOptions } from "./types.js"; /** @internal */ export type Entrypoint = "tsc" | "typescript" | "tsserver" | "testRunner"; diff --git a/src/testRunner/_namespaces/ts.ts b/src/testRunner/_namespaces/ts.ts index 289766ffc14d8..8c43f8447fdfb 100644 --- a/src/testRunner/_namespaces/ts.ts +++ b/src/testRunner/_namespaces/ts.ts @@ -10,5 +10,5 @@ export * from "../../harness/_namespaces/ts.js"; import * as server from "./ts.server.js"; export { server }; -import * as ts from "./ts"; +import * as ts from "./ts.js"; ts.setTypeScriptNamespace("testRunner", ts);