diff --git a/cspell.json b/cspell.json index 190c89ccf..e008d732b 100644 --- a/cspell.json +++ b/cspell.json @@ -351,6 +351,7 @@ "website/playground/codeSamples.mjs", "website/pages/googlefe164a33bda4034b.html", "website/static/lib/**", - "website/static/playground.js" + "website/static/playground.js", + "scripts/build/typescript-unused-specifiers.js" ] } diff --git a/eslint.config.js b/eslint.config.js index c9bacc9d2..3ab76cd60 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -278,6 +278,7 @@ export default [ "unicorn/prevent-abbreviations": "off", "unicorn/relative-url-style": "off", "unicorn/switch-case-braces": ["error", "avoid"], + "unicorn/template-indent": "error", }, linterOptions: { diff --git a/package.json b/package.json index 9f4e9c7c3..ba0a1b5e6 100644 --- a/package.json +++ b/package.json @@ -97,7 +97,7 @@ "sdbm": "2.0.0", "strip-ansi": "7.1.0", "to-fast-properties": "4.0.0", - "typescript": "5.4.5", + "typescript": "5.5.1-rc", "unicode-regex": "4.0.0", "unified": "9.2.2", "url-or-path": "2.3.0", diff --git a/scripts/build/build-javascript-module.js b/scripts/build/build-javascript-module.js index ef1e26846..4f7f34f56 100644 --- a/scripts/build/build-javascript-module.js +++ b/scripts/build/build-javascript-module.js @@ -54,6 +54,20 @@ function getEsbuildOptions({ file, files, shouldCollectLicenses, cliOptions }) { module: "*", process: transform, }, + // Transform `require("typescript")` to `import` + { + module: "*", + process(text, file) { + text = text.replaceAll( + /(?:const|let|var) (\w+) = (?:__importStar\(require\("typescript"\)\)|require\("typescript"\));/g, + 'import * as $1 from "typescript";', + ); + if (/require\(["']typescript["']\)/.test(text)) { + throw new Error(`Unexpected \`require("typescript")\` in ${file}.`); + } + return text; + }, + }, // #12493, not sure what the problem is, but replace the cjs version with esm version seems fix it { module: require.resolve("tslib"), diff --git a/scripts/build/config.js b/scripts/build/config.js index 34c1fc205..ca0989dda 100644 --- a/scripts/build/config.js +++ b/scripts/build/config.js @@ -133,7 +133,11 @@ const pluginFiles = [ .replace('require("./create-program/createDefaultProgram")', "{}") .replace('require("./create-program/createIsolatedProgram")', "{}") .replace('require("./create-program/createProjectProgram")', "{}") - .replace('require("./create-program/useProvidedPrograms")', "{}"); + .replace('require("./create-program/useProvidedPrograms")', "{}") + .replace( + 'require("./semantic-or-syntactic-errors")', + "{getFirstSemanticOrSyntacticError(){}}", + ); return text; }, }, @@ -266,6 +270,17 @@ const pluginFiles = [ return text; }, }, + // Use named import from `typescript` + { + module: getPackageFile("ts-api-utils/lib/index.js"), + process(text) { + text = text.replaceAll( + /(?<=import )(?=\w+ from ["']typescript["'])/g, + "* as ", + ); + return text; + }, + }, ], }, { diff --git a/scripts/build/modify-typescript-module.js b/scripts/build/modify-typescript-module.js index 6032c9510..bdf8932a2 100644 --- a/scripts/build/modify-typescript-module.js +++ b/scripts/build/modify-typescript-module.js @@ -5,9 +5,10 @@ import MagicString from "magic-string"; import { outdent } from "outdent"; import { PROJECT_ROOT, writeFile } from "../utils/index.js"; +import UNUSED_SPECIFIERS from "./typescript-unused-specifiers.js"; function* getModules(text) { - const parts = text.split(/(?<=\n)( {2}\/\/ src\/\S+\n)/); + const parts = text.split(/(?<=\n)(\/\/ src\/\S+\n)/); let start = parts[0].length; @@ -15,31 +16,16 @@ function* getModules(text) { const comment = parts[partIndex]; const code = parts[partIndex + 1]; - const path = comment.slice(" // ".length, -1); + const path = comment.slice("// ".length, -1); const end = start + comment.length + code.length; - if (/\S/.test(code)) { - const esmRegExp = new RegExp( - [ - String.raw`\s*var (?\w+) = __esm\({`, - `\\s*"${escapeStringRegexp(path)}"\\(\\) {`, - ".*", - String.raw`\s*}`, - String.raw`\s*}\);`, - ].join(String.raw`\n`), - "s", - ); - const match = code.match(esmRegExp); - - yield { - isEntry: path === "src/typescript/typescript.ts", - path, - start: start + comment.length, - end: end - 1, - code, - esmModuleInitFunctionName: match?.groups.initFunctionName, - }; - } + yield { + isEntry: path === "src/typescript/typescript.ts", + path, + start: start + comment.length, + end: end - 1, + code, + }; start = end; } @@ -65,16 +51,7 @@ class TypeScriptModuleSource { module = found; } - const { esmModuleInitFunctionName } = module; - const moduleInitCode = esmModuleInitFunctionName - ? `var ${esmModuleInitFunctionName} = () => {};` - : ""; - - this.#source.overwrite( - module.start, - module.end, - moduleInitCode + replacement, - ); + this.#source.overwrite(module.start, module.end, replacement); return this; } @@ -142,8 +119,8 @@ class TypeScriptModuleSource { } function unwrap(text) { - const startMark = "var ts = (() => {"; - const endMark = "return require_typescript();"; + const startMark = 'var ts = {}; ((module) => {\n"use strict";'; + const endMark = "// src/typescript/typescript.ts"; const start = text.indexOf(startMark); const end = text.lastIndexOf(endMark); @@ -151,7 +128,40 @@ function unwrap(text) { throw new Error("Unexpected source"); } - return text.slice(start + startMark.length, end); + text = text.slice(start + startMark.length, end); + + return text; +} + +function getExports(entry) { + let lines = entry.code.trim().split("\n"); + + if ( + !( + lines[0] === "var typescript_exports = {};" && + lines[1] === "__export(typescript_exports, {" && + lines.at(-2) === "});" && + lines.at(-1) === "module.exports = __toCommonJS(typescript_exports);" + ) + ) { + throw new Error("Unexpected source"); + } + + lines = lines.slice(2, -2); + + const exports = lines.map((line) => { + const match = line.match( + /^\s*(?.*?): \(\) => (?.*?),?$/, + ); + + if (!match) { + throw new Error("Unexpected source"); + } + + return match.groups; + }); + + return exports; } function modifyTypescriptModule(text) { @@ -159,6 +169,21 @@ function modifyTypescriptModule(text) { const source = new TypeScriptModuleSource(text); + const entry = source.modules.find((module) => module.isEntry); + let exports = getExports(entry); + source.removeModule(entry); + + // print variables from core.ts to ignore + // const coreModule = source.modules.find( + // (module) => module.path === "src/compiler/core.ts", + // ); + // const variables = [ + // ...coreModule.code.matchAll(/(?<=\n)var (?\w+) =/g), + // ...coreModule.code.matchAll(/(?<=\n)function (?\w+)\(/g), + // ].map((match) => match.groups.variable); + + // console.log(JSON.stringify(variables, undefined, 2)); + // Deprecated for (const module of source.modules) { if (module.path.startsWith("src/deprecatedCompat/")) { @@ -175,10 +200,7 @@ function modifyTypescriptModule(text) { // services for (const module of source.modules) { - if ( - module.path === "src/services/services.ts" || - module.path === "src/services/_namespaces/ts.ts" - ) { + if (module.path === "src/services/services.ts") { continue; } @@ -186,13 +208,7 @@ function modifyTypescriptModule(text) { if (module.path === "src/services/utilities.ts") { source.replaceModule( module, - outdent` - var scanner; - var ${module.esmModuleInitFunctionName} = () => { - init_debug(); - scanner = createScanner(99 /* Latest */, /*skipTrivia*/ true); - }; - `, + "var scanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ true);", ); continue; } @@ -203,6 +219,7 @@ function modifyTypescriptModule(text) { } // server + source.removeModule("src/typescript/_namespaces/ts.server.ts"); for (const module of source.modules) { if (module.path.startsWith("src/server/")) { source.removeModule(module); @@ -217,6 +234,13 @@ function modifyTypescriptModule(text) { } } + // `typingsInstaller` + for (const module of source.modules) { + if (module.path.startsWith("src/typingsInstallerCore/")) { + source.removeModule(module); + } + } + // `ts.moduleSpecifiers` source.removeModule("src/compiler/_namespaces/ts.moduleSpecifiers.ts"); source.removeModule("src/compiler/moduleSpecifiers.ts"); @@ -237,7 +261,6 @@ function modifyTypescriptModule(text) { source.removeModule("src/compiler/tsbuild.ts"); source.removeModule("src/compiler/tsbuildPublic.ts"); source.removeModule("src/compiler/builderState.ts"); - source.removeModule("src/compiler/builderStatePublic.ts"); // Misc source.removeModule("src/compiler/symbolWalker.ts"); @@ -249,6 +272,8 @@ function modifyTypescriptModule(text) { source.removeModule("src/compiler/visitorPublic.ts"); source.removeModule("src/compiler/emitter.ts"); source.removeModule("src/compiler/_namespaces/ts.performance.ts"); + source.removeModule("src/compiler/executeCommandLine.ts"); + source.removeModule("src/compiler/expressionToTypeNode.ts"); // File system source.replaceModule("src/compiler/sys.ts", "var sys;"); @@ -260,7 +285,7 @@ function modifyTypescriptModule(text) { "var perfLogger = new Proxy(() => {}, {get: () => perfLogger});", ); - // performanceCore + // performance source.replaceModule( "src/compiler/performanceCore.ts", outdent` @@ -268,21 +293,32 @@ function modifyTypescriptModule(text) { var timestamp = Date.now; `, ); + source.replaceModule( + "src/compiler/performance.ts", + outdent` + var mark = () => {}; + var measure = () => {}; + `, + ); // `factory` source.removeModule("src/compiler/factory/emitNode.ts"); source.removeModule("src/compiler/factory/emitHelpers.ts"); - source.replaceModule( - "src/compiler/factory/nodeConverters.ts", - outdent` - var createNodeConverters = () => new Proxy({}, {get: () => () => {}}); - `, - ); + source.removeModule("src/compiler/factory/nodeConverters.ts"); // `pnp` if (source.hasModule("src/compiler/pnp.ts")) { source.removeModule("src/compiler/pnp.ts"); } + if (source.hasModule("src/compiler/pnpapi.ts")) { + source.removeModule("src/compiler/pnpapi.ts"); + } + + source.replaceAlignedCode({ + start: "function isNodeLikeSystem(", + end: "}", + replacement: "function isNodeLikeSystem() {return false}", + }); /* spell-checker: disable */ // `ts.createParenthesizerRules` @@ -293,8 +329,8 @@ function modifyTypescriptModule(text) { /* spell-checker: enable */ source.replaceAlignedCode({ - start: "function getScriptTargetFeatures(", - end: "}", + start: "var getScriptTargetFeatures = /* @__PURE__ */ memoize(", + end: ");", }); source.replaceAlignedCode({ @@ -302,16 +338,46 @@ function modifyTypescriptModule(text) { end: "});", }); - source.append("module.exports = require_typescript();"); + let code = source.toString(); + exports = exports.filter( + ({ specifier }) => !UNUSED_SPECIFIERS.has(specifier), + ); - return source.toString(); + code = addExports(code, exports); + + code += + "\n" + + outdent` + export const isUnparsedPrepend = () => false; + export const isUnparsedTextLike = () => false; + `; + + return { code, exports }; +} + +function addExports(code, exports) { + return ( + code + + "\n\n" + + outdent` + export { + ${exports + .map(({ specifier, variable }) => + variable === specifier ? specifier : `${variable} as ${specifier}`, + ) + .map((line) => ` ${line},`) + .join("\n")} + }; + ` + ); } // Save modified code to `{PROJECT_ROOT}/.tmp/modified-typescript.js` for debug const saveOutputToDisk = (process) => (text) => { - const result = process(text); - writeFile(path.join(PROJECT_ROOT, ".tmp/modified-typescript.js"), result); - return result; + const { code } = process(text); + writeFile(path.join(PROJECT_ROOT, ".tmp/modified-typescript.js"), code); + return code; }; export default saveOutputToDisk(modifyTypescriptModule); +export { modifyTypescriptModule }; diff --git a/scripts/build/typescript-unused-specifiers.js b/scripts/build/typescript-unused-specifiers.js new file mode 100644 index 000000000..4b9bccb58 --- /dev/null +++ b/scripts/build/typescript-unused-specifiers.js @@ -0,0 +1,1014 @@ +export default new Set([ + "ANONYMOUS", + "AssertionLevel", + "BreakpointResolver", + "BuilderFileEmit", + "BuilderProgramKind", + "BuilderState", + "CallHierarchy", + "CheckMode", + "ClassificationType", + "ClassificationTypeNames", + "CompletionInfoFlags", + "CompletionTriggerKind", + "Completions", + "ContainerFlags", + "DocumentHighlights", + "EndOfLineState", + "ExportKind", + "FileSystemEntryKind", + "FileWatcherEventKind", + "FindAllReferences", + "FlattenLevel", + "ForegroundColorEscapeSequences", + "GoToDefinition", + "HighlightSpanKind", + "IdentifierNameMap", + "IdentifierNameMultiMap", + "ImportKind", + "IndentStyle", + "InlayHintKind", + "InlayHints", + "InvalidatedProjectKind", + "JsDoc", + "JsTyping", + "LanguageServiceMode", + "MapCode", + "ModuleInstanceState", + "NavigateTo", + "NavigationBar", + "NodeResolutionFeatures", + "OrganizeImports", + "OrganizeImportsMode", + "OutliningElementsCollector", + "OutliningSpanKind", + "OutputFileType", + "PackageJsonAutoImportPreference", + "PackageJsonDependencyGroup", + "PatternMatchKind", + "PollingInterval", + "PrivateIdentifierKind", + "ProcessLevel", + "ProgramUpdateLevel", + "QuotePreference", + "Rename", + "ScriptElementKind", + "ScriptElementKindModifier", + "ScriptSnapshot", + "SemanticClassificationFormat", + "SemanticMeaning", + "SemicolonPreference", + "SignatureCheckMode", + "SignatureHelp", + "SignatureInfo", + "SmartSelectionRange", + "StatisticType", + "SymbolDisplay", + "SymbolDisplayPartKind", + "ThrottledCancellationToken", + "TokenClass", + "TypeFacts", + "UpToDateStatusType", + "Version", + "VersionRange", + "WatchDirectoryFlags", + "WatchDirectoryKind", + "WatchFileKind", + "WatchLogLevel", + "WatchType", + "accessPrivateIdentifier", + "addDisposableResourceHelper", + "addEmitFlags", + "addEmitHelper", + "addEmitHelpers", + "addInternalEmitFlags", + "addRange", + "addSyntheticLeadingComment", + "addSyntheticTrailingComment", + "advancedAsyncSuperHelper", + "affectsDeclarationPathOptionDeclarations", + "affectsEmitOptionDeclarations", + "allKeysStartWithDot", + "and", + "append", + "appendIfUnique", + "arrayFrom", + "arrayIsEqualTo", + "arrayIsSorted", + "arrayOf", + "arrayToMap", + "arrayToMultiMap", + "arrayToNumericMap", + "arraysEqual", + "assertType", + "assign", + "assignHelper", + "asyncDelegator", + "asyncGeneratorHelper", + "asyncSuperHelper", + "asyncValues", + "awaitHelper", + "awaiterHelper", + "base64decode", + "base64encode", + "binarySearch", + "binarySearchKey", + "bindSourceFile", + "breakIntoCharacterSpans", + "breakIntoWordSpans", + "buildLinkParts", + "buildOpts", + "buildOverload", + "bundlerModuleNameResolver", + "canBeConvertedToAsync", + "canJsonReportNoInputFiles", + "canProduceDiagnostics", + "canWatchAffectingLocation", + "canWatchAtTypes", + "canWatchDirectoryOrFile", + "cartesianProduct", + "cast", + "chainBundle", + "changeCompilerHostLikeToUseCache", + "classHasClassThisAssignment", + "classHasDeclaredOrExplicitlyAssignedName", + "classHasExplicitlyAssignedName", + "classPrivateFieldGetHelper", + "classPrivateFieldInHelper", + "classPrivateFieldSetHelper", + "classicNameResolver", + "classifier", + "cleanExtendedConfigCache", + "clear", + "clearSharedExtendedConfigFileWatcher", + "climbPastPropertyAccess", + "climbPastPropertyOrElementAccess", + "clone", + "cloneCompilerOptions", + "closeFileWatcherOf", + "codefix", + "collectExternalModuleInfo", + "combine", + "commandLineOptionOfCustomType", + "commonOptionsWithBuild", + "compact", + "compareBooleans", + "compareEmitHelpers", + "comparePatternKeys", + "compareProperties", + "compareStringsCaseInsensitive", + "compareStringsCaseInsensitiveEslintCompatible", + "compareStringsCaseSensitive", + "compareStringsCaseSensitiveUI", + "compareTextSpans", + "compareValues", + "compileOnSaveCommandLineOption", + "compilerOptionsDidYouMeanDiagnostics", + "compilerOptionsIndicateEsModules", + "compose", + "computeCommonSourceDirectoryOfFilenames", + "computeSignature", + "computeSignatureWithDiagnostics", + "computeSuggestionDiagnostics", + "concatenate", + "configDirTemplateSubstitutionOptions", + "configDirTemplateSubstitutionWatchOptions", + "consumesNodeCoreModules", + "contains", + "convertCompilerOptionsForTelemetry", + "convertCompilerOptionsFromJson", + "convertJsonOption", + "convertToJson", + "convertToObject", + "convertToOptionsWithAbsolutePaths", + "convertToTSConfig", + "convertTypeAcquisitionFromJson", + "copyComments", + "copyLeadingComments", + "copyProperties", + "copyTrailingAsLeadingComments", + "copyTrailingComments", + "countWhere", + "createAbstractBuilder", + "createBindingHelper", + "createBuildInfo", + "createBuilderProgram", + "createBuilderProgramUsingProgramBuildInfo", + "createBuilderStatusReporter", + "createCacheWithRedirects", + "createCacheableExportInfoMap", + "createCachedDirectoryStructureHost", + "createClassNamedEvaluationHelperBlock", + "createClassThisAssignmentBlock", + "createClassifier", + "createCompilerDiagnosticForInvalidCustomType", + "createCompilerHost", + "createCompilerHostFromProgramHost", + "createCompilerHostWorker", + "createDiagnosticReporter", + "createDocumentPositionMapper", + "createDocumentRegistry", + "createDocumentRegistryInternal", + "createEmitAndSemanticDiagnosticsBuilderProgram", + "createEmitHelperFactory", + "createFlowNode", + "createFutureSourceFile", + "createGetCanonicalFileName", + "createGetIsolatedDeclarationErrors", + "createGetSourceFile", + "createGetSymbolAccessibilityDiagnosticForNode", + "createGetSymbolAccessibilityDiagnosticForNodeName", + "createGetSymbolWalker", + "createIncrementalCompilerHost", + "createIncrementalProgram", + "createLanguageService", + "createLanguageServiceSourceFile", + "createModeAwareCache", + "createModeAwareCacheKey", + "createModuleResolutionCache", + "createModuleResolutionLoader", + "createModuleResolutionLoaderUsingGlobalCache", + "createModuleSpecifierResolutionHost", + "createMultiMap", + "createNodeConverters", + "createOptionNameMap", + "createOverload", + "createPackageJsonImportFilter", + "createPackageJsonInfo", + "createParenthesizerRules", + "createPatternMatcher", + "createPrinter", + "createPrinterWithDefaults", + "createPrinterWithRemoveComments", + "createPrinterWithRemoveCommentsNeverAsciiEscape", + "createPrinterWithRemoveCommentsOmitTrailingSemicolon", + "createProgram", + "createProgramHost", + "createQueue", + "createRedirectedBuilderProgram", + "createResolutionCache", + "createRuntimeTypeSerializer", + "createSemanticDiagnosticsBuilderProgram", + "createSet", + "createSolutionBuilder", + "createSolutionBuilderHost", + "createSolutionBuilderWithWatch", + "createSolutionBuilderWithWatchHost", + "createSortedArray", + "createSourceMapGenerator", + "createSuperAccessVariableStatement", + "createSyntacticTypeNodeBuilder", + "createSystemWatchFunctions", + "createTextChange", + "createTextChangeFromStartLength", + "createTextRangeFromNode", + "createTextRangeFromSpan", + "createTextSpanFromNode", + "createTextSpanFromRange", + "createTextSpanFromStringLiteralLikeContent", + "createTypeChecker", + "createTypeReferenceDirectiveResolutionCache", + "createTypeReferenceResolutionLoader", + "createWatchCompilerHost", + "createWatchCompilerHostOfConfigFile", + "createWatchCompilerHostOfFilesAndCompilerOptions", + "createWatchFactory", + "createWatchHost", + "createWatchProgram", + "createWatchStatusReporter", + "createWriteFileMeasuringIO", + "decodeMappings", + "decorateHelper", + "deduplicate", + "defaultIncludeSpec", + "defaultInitCompilerOptions", + "diagnosticToString", + "displayPart", + "displayPartsToString", + "disposeEmitNodes", + "disposeResourcesHelper", + "documentSpansEqual", + "dumpTracingLegend", + "elementAt", + "emitFiles", + "emitFilesAndReportErrors", + "emitFilesAndReportErrorsAndGetExitStatus", + "emitResolverSkipsTypeChecking", + "emitSkippedWithNoDiagnostics", + "emptyMap", + "emptyOptions", + "emptySet", + "endsWith", + "enumerateInsertsAndDeletes", + "equalOwnProperties", + "equateStringsCaseInsensitive", + "equateStringsCaseSensitive", + "equateValues", + "esDecorateHelper", + "every", + "executeCommandLine", + "explainFiles", + "explainIfFileIsRedirectAndImpliedFormat", + "exportStarHelper", + "extend", + "extendsHelper", + "fileIncludeReasonToDiagnostics", + "fileShouldUseJavaScriptRequire", + "filter", + "filterMutate", + "filterSemanticDiagnostics", + "find", + "findBestPatternMatch", + "findChildOfKind", + "findConfigFile", + "findContainingList", + "findDiagnosticForNode", + "findFirstNonJsxWhitespaceToken", + "findIndex", + "findLast", + "findLastIndex", + "findListItemInfo", + "findMap", + "findModifier", + "findNextToken", + "findPackageJson", + "findPackageJsons", + "findPrecedingMatchingToken", + "findPrecedingToken", + "findSuperStatementIndexPath", + "findTokenOnLeftOfPosition", + "first", + "firstDefined", + "firstDefinedIterator", + "firstIterator", + "firstOrOnly", + "firstOrUndefined", + "firstOrUndefinedIterator", + "fixupCompilerOptions", + "flatMap", + "flatMapToMutable", + "flatten", + "flattenDestructuringAssignment", + "flattenDestructuringBinding", + "flattenDiagnosticMessageText", + "forEach", + "forEachEmittedFile", + "forEachExternalModuleToImportFrom", + "forEachNameOfDefaultExport", + "forEachResolvedProjectReference", + "forEachRight", + "forEachUnique", + "formatColorAndReset", + "formatDiagnostic", + "formatDiagnostics", + "formatDiagnosticsWithColorAndContext", + "formatLocation", + "formatting", + "generateDjb2Hash", + "generateTSConfig", + "generatorHelper", + "getAdjustedReferenceLocation", + "getAdjustedRenameLocation", + "getAllDecoratorsOfClass", + "getAllDecoratorsOfClassElement", + "getAllKeys", + "getAllProjectOutputs", + "getAssignedNameOfIdentifier", + "getAutomaticTypeDirectiveNames", + "getBuildInfo", + "getBuildInfoFileVersionMap", + "getBuildInfoText", + "getBuildOrderFromAnyBuildOrder", + "getBuilderCreationParameters", + "getBuilderFileEmit", + "getCommentRange", + "getCommonSourceDirectory", + "getCommonSourceDirectoryOfConfig", + "getCompilerOptionsDiffValue", + "getConditions", + "getConfigFileParsingDiagnostics", + "getConstantValue", + "getContainerFlags", + "getContainerNode", + "getContainingObjectLiteralElement", + "getContextualTypeFromParent", + "getContextualTypeFromParentOrAncestorTypeNode", + "getCurrentTime", + "getDeclarationDiagnostics", + "getDefaultCompilerOptions", + "getDefaultFormatCodeSettings", + "getDefaultLibFilePath", + "getDefaultLikeExportInfo", + "getDefaultLikeExportNameFromDeclaration", + "getDefaultResolutionModeForFileWorker", + "getDiagnosticText", + "getDiagnosticsWithinSpan", + "getDirectoryToWatchFailedLookupLocation", + "getDirectoryToWatchFailedLookupLocationFromTypeRoot", + "getDocumentPositionMapper", + "getDocumentSpansEqualityComparer", + "getEditsForFileRename", + "getEffectiveTypeRoots", + "getEmitHelpers", + "getEmitModuleFormatOfFileWorker", + "getEncodedSemanticClassifications", + "getEncodedSyntacticClassifications", + "getEntrypointsFromPackageJsonInfo", + "getErrorCountForSummary", + "getErrorSummaryText", + "getExportInfoMap", + "getExportNeedsImportStarHelper", + "getFallbackOptions", + "getFileEmitOutput", + "getFileNamesFromConfigSpecs", + "getFileWatcherEventKind", + "getFilesInErrorForSummary", + "getFirstNonSpaceCharacterPosition", + "getFirstProjectOutput", + "getFixableErrorSpanExpression", + "getFormatCodeSettingsForWriting", + "getIdentifierAutoGenerate", + "getIdentifierGeneratedImportReference", + "getIdentifierTypeArguments", + "getImpliedNodeFormatForEmitWorker", + "getImpliedNodeFormatForFile", + "getImpliedNodeFormatForFileWorker", + "getImportNeedsImportDefaultHelper", + "getImportNeedsImportStarHelper", + "getInferredLibraryNameResolveFrom", + "getJSDocAugmentsTag", + "getJSDocClassTag", + "getJSDocCommentRanges", + "getJSDocCommentsAndTags", + "getJSDocDeprecatedTag", + "getJSDocDeprecatedTagNoCache", + "getJSDocEnumTag", + "getJSDocHost", + "getJSDocImplementsTags", + "getJSDocOverloadTags", + "getJSDocOverrideTagNoCache", + "getJSDocParameterTags", + "getJSDocParameterTagsNoCache", + "getJSDocPrivateTag", + "getJSDocPrivateTagNoCache", + "getJSDocProtectedTag", + "getJSDocProtectedTagNoCache", + "getJSDocPublicTag", + "getJSDocPublicTagNoCache", + "getJSDocReadonlyTag", + "getJSDocReadonlyTagNoCache", + "getJSDocReturnTag", + "getJSDocReturnType", + "getJSDocRoot", + "getJSDocSatisfiesExpressionType", + "getJSDocSatisfiesTag", + "getJSDocTags", + "getJSDocTagsNoCache", + "getJSDocTemplateTag", + "getJSDocThisTag", + "getJSDocType", + "getJSDocTypeAliasName", + "getJSDocTypeAssertionType", + "getJSDocTypeParameterDeclarations", + "getJSDocTypeParameterTags", + "getJSDocTypeParameterTagsNoCache", + "getJSDocTypeTag", + "getKeyForCompilerOptions", + "getLibraryNameFromLibFileName", + "getLineInfo", + "getLineStartPositionForPosition", + "getLocaleTimeString", + "getMappedContextSpan", + "getMappedDocumentSpan", + "getMappedLocation", + "getMatchedFileSpec", + "getMatchedIncludeSpec", + "getMeaningFromDeclaration", + "getMeaningFromLocation", + "getModeForFileReference", + "getModeForResolutionAtIndex", + "getModeForUsageLocation", + "getModifiedTime", + "getModuleInstanceState", + "getModuleNameStringLiteralAt", + "getModuleSpecifierResolverHost", + "getNameForExportedSymbol", + "getNameFromPropertyName", + "getNameOfCompilerOptionValue", + "getNameTable", + "getNamesForExportedSymbol", + "getNewLineKind", + "getNewLineOrDefaultFromHost", + "getNodeId", + "getNodeKind", + "getNodeModifiers", + "getNonAssignmentOperatorForCompoundAssignment", + "getOptionFromName", + "getOptionsForLibraryResolution", + "getOptionsNameMap", + "getOrCreateEmitNode", + "getOrUpdate", + "getOriginalNodeId", + "getOutputDeclarationFileName", + "getOutputDeclarationFileNameWorker", + "getOutputExtension", + "getOutputFileNames", + "getOutputJSFileNameWorker", + "getOutputPathsFor", + "getOutputPathsForBundle", + "getOwnKeys", + "getOwnValues", + "getPackageJsonInfo", + "getPackageJsonTypesVersionsPaths", + "getPackageJsonsVisibleToFile", + "getPackageNameFromTypesPackageName", + "getPackageScopeForPath", + "getParentNodeInSpan", + "getParsedCommandLineOfConfigFile", + "getPathUpdater", + "getPendingEmitKind", + "getPossibleGenericSignatures", + "getPossibleTypeArgumentsInfo", + "getPreEmitDiagnostics", + "getPrecedingNonSpaceCharacterPosition", + "getPrivateIdentifier", + "getProperties", + "getProperty", + "getPropertySymbolFromBindingElement", + "getPropertySymbolsFromContextualType", + "getQuoteFromPreference", + "getQuotePreference", + "getRangesWhere", + "getRefactorContextSpan", + "getReferencedFileLocation", + "getRenameLocation", + "getReplacementSpanForContextToken", + "getResolutionDiagnostic", + "getResolutionModeOverride", + "getRootDirectoryOfResolutionCache", + "getRootPathSplitLength", + "getScriptKind", + "getScriptTargetFeatures", + "getSemanticClassifications", + "getSnapshotText", + "getSnippetElement", + "getSourceFileVersionAsHashFromText", + "getSourceMapRange", + "getSourceMapper", + "getSpellingSuggestion", + "getStartsOnNewLine", + "getStaticPropertiesAndClassStaticBlock", + "getStringComparer", + "getSuperCallFromStatement", + "getSupportedCodeFixes", + "getSwitchedType", + "getSymbolId", + "getSymbolParentOrFail", + "getSymbolTarget", + "getSyntacticClassifications", + "getSynthesizedDeepClone", + "getSynthesizedDeepCloneWithReplacements", + "getSynthesizedDeepClones", + "getSynthesizedDeepClonesWithReplacements", + "getSyntheticLeadingComments", + "getSyntheticTrailingComments", + "getTargetLabel", + "getTemporaryModuleResolutionState", + "getTokenAtPosition", + "getTokenSourceMapRange", + "getTouchingPropertyName", + "getTouchingToken", + "getTransformers", + "getTsBuildInfoEmitOutputFilePath", + "getTypeArgumentOrTypeParameterList", + "getTypeKeywordOfTypeOnlyImport", + "getTypeNode", + "getTypeNodeIfAccessible", + "getTypesPackageName", + "getUILocale", + "getUniqueName", + "getUniqueSymbolId", + "getWatchErrorSummaryDiagnosticMessage", + "getWatchFactory", + "group", + "groupBy", + "handleNoEmitOptions", + "handleWatchOptionsConfigDirTemplateSubstitution", + "hasChildOfKind", + "hasDocComment", + "hasIndexSignature", + "hasProperty", + "hasPropertyAccessExpressionWithName", + "helperString", + "identity", + "identitySourceMapConsumer", + "ignoreSourceNewlines", + "ignoredPaths", + "importDefaultHelper", + "importStarHelper", + "indexOfAnyCharCode", + "indicesOf", + "inferredTypesContainingFile", + "injectClassNamedEvaluationHelperBlockIfMissing", + "injectClassThisAssignmentIfMissing", + "insertImports", + "insertSorted", + "intersperse", + "inverseJsxOptionMap", + "isAccessibilityModifier", + "isApplicableVersionedTypesKey", + "isArgumentExpressionOfElementAccess", + "isArray", + "isArrayLiteralOrObjectLiteralDestructuringPattern", + "isBlockLike", + "isBuild", + "isBuildInfoFile", + "isBuilderProgram", + "isCallExpressionTarget", + "isCallOrNewExpressionTarget", + "isCallToHelper", + "isCircularBuildOrder", + "isClassNamedEvaluationHelperBlock", + "isClassThisAssignmentBlock", + "isComment", + "isCompoundAssignment", + "isDecoratorTarget", + "isDeprecatedDeclaration", + "isDiagnosticWithLocation", + "isDocumentRegistryEntry", + "isEmittedFileOfProgram", + "isEqualityOperatorKind", + "isExcludedFile", + "isExclusivelyTypeOnlyImportOrExport", + "isExportsOrModuleExportsOrAlias", + "isExpressionOfExternalModuleImportEqualsDeclaration", + "isExternalModuleSymbol", + "isFirstDeclarationOfSymbolParameter", + "isFixablePromiseHandler", + "isGlobalDeclaration", + "isIgnoredFileFromWildCardWatching", + "isImportOrExportSpecifierName", + "isImportableFile", + "isInComment", + "isInJSXText", + "isInNonReferenceComment", + "isInReferenceComment", + "isInRightSideOfInternalImportEqualsDeclaration", + "isInString", + "isInTemplateString", + "isInitializedProperty", + "isInsideJsxElement", + "isInsideJsxElementOrAttribute", + "isInsideNodeModules", + "isInsideTemplateLiteral", + "isInstantiatedModule", + "isJsxOpeningLikeElementTagName", + "isJumpStatementTarget", + "isLabelName", + "isLabelOfLabeledStatement", + "isLiteralNameOfPropertyDeclarationOrIndexAccess", + "isMissingPackageJsonInfo", + "isModuleSpecifierLike", + "isNameOfFunctionDeclaration", + "isNameOfModuleDeclaration", + "isNewExpressionTarget", + "isNodeLikeSystem", + "isNonGlobalDeclaration", + "isNonStaticMethodOrAccessorWithPrivateName", + "isNumber", + "isObjectBindingElementWithoutPropertyName", + "isPackageJsonInfo", + "isPatternMatch", + "isPossiblyTypeArgumentPosition", + "isProgramBundleEmitBuildInfo", + "isProgramUptoDate", + "isRawSourceMap", + "isReferenceFileLocation", + "isReferencedFile", + "isReturnStatementWithFixablePromiseHandler", + "isRightSideOfPropertyAccess", + "isRightSideOfQualifiedName", + "isSimpleCopiableExpression", + "isSimpleInlineableExpression", + "isSimpleParameter", + "isSimpleParameterList", + "isSourceFileFromLibrary", + "isSourceMapping", + "isString", + "isStringAndEmptyAnonymousObjectIntersection", + "isStringLiteralOrTemplate", + "isStringOrRegularExpressionOrTemplateLiteral", + "isTagName", + "isTaggedTemplateTag", + "isTextWhiteSpaceLike", + "isThis", + "isTraceEnabled", + "isTypeKeyword", + "isTypeKeywordToken", + "isTypeKeywordTokenOrIdentifier", + "jsxModeNeedsExplicitImport", + "keywordPart", + "last", + "lastOrUndefined", + "length", + "libMap", + "libs", + "lineBreakPart", + "linkNamePart", + "linkPart", + "linkTextPart", + "listFiles", + "loadModuleFromGlobalCache", + "loadWithModeAwareCache", + "makeImport", + "makeStringLiteral", + "mangleScopedPackageName", + "map", + "mapAllOrFail", + "mapDefined", + "mapDefinedEntries", + "mapEntries", + "mapOneOrMany", + "mapToDisplayParts", + "matchedText", + "matchesExclude", + "maybeBind", + "memoize", + "memoizeCached", + "memoizeOne", + "memoizeWeak", + "metadataHelper", + "min", + "missingFileModifiedTime", + "moduleOptionDeclaration", + "moduleResolutionNameAndModeGetter", + "moduleResolutionOptionDeclarations", + "moduleResolutionUsesNodeModules", + "moduleSpecifierToValidIdentifier", + "moduleSpecifiers", + "moduleSymbolToValidIdentifier", + "moveEmitHelpers", + "moveSyntheticComments", + "needsParentheses", + "newCaseClauseTracker", + "newPrivateEnvironment", + "noEmitNotification", + "noEmitSubstitution", + "noTransformers", + "nodeModuleNameResolver", + "nodeModulesPathPart", + "nodeNextJsonConfigResolver", + "nodeOverlapsWithStartEnd", + "nodeSeenTracker", + "nodeToDisplayParts", + "noop", + "noopFileWatcher", + "not", + "notImplemented", + "notImplementedResolver", + "nullNodeConverters", + "nullTransformationContext", + "operatorPart", + "optionDeclarations", + "optionMapToObject", + "optionsAffectingProgramStructure", + "optionsForBuild", + "optionsForWatch", + "or", + "orderedRemoveItem", + "orderedRemoveItemAt", + "paramHelper", + "parameterNamePart", + "parseBuildCommand", + "parseCommandLine", + "parseCommandLineWorker", + "parseConfigFileTextToJson", + "parseConfigFileWithSystem", + "parseConfigHostFromCompilerHostLike", + "parseCustomTypeOption", + "parseJsonConfigFileContent", + "parseJsonSourceFileConfigFileContent", + "parseListTypeOption", + "parseNodeModuleFromPath", + "parsePackageName", + "pasteEdits", + "patchWriteFileEnsuringDirectory", + "pathContainsNodeModules", + "patternText", + "performIncrementalCompilation", + "performance", + "plainJSErrors", + "positionBelongsToNode", + "positionIsASICandidate", + "preProcessFile", + "probablyUsesSemicolons", + "processTaggedTemplateExpression", + "programContainsEsModules", + "programContainsModules", + "propKeyHelper", + "propertyNamePart", + "punctuationPart", + "pushIfUnique", + "quote", + "quotePreferenceFromString", + "rangeContainsPosition", + "rangeContainsPositionExclusive", + "rangeContainsRange", + "rangeContainsRangeExclusive", + "rangeContainsStartEnd", + "rangeEquals", + "rangeOverlapsWithStartEnd", + "readBuilderProgram", + "readConfigFile", + "readHelper", + "readJson", + "readJsonConfigFile", + "readJsonOrUndefined", + "reduceLeft", + "reduceLeftIterator", + "refactor", + "relativeComplement", + "removeAllComments", + "removeEmitHelper", + "removeIgnoredPath", + "removeMinAndVersionNumbers", + "removeOptionality", + "removePrefix", + "removeSuffix", + "repeatString", + "replaceElement", + "resolveConfigFileProjectName", + "resolveJSModule", + "resolveLibrary", + "resolveModuleName", + "resolveModuleNameFromCache", + "resolvePackageNameToPackageJson", + "resolveProjectReferencePath", + "resolveTripleslashReference", + "resolveTypeReferenceDirective", + "restHelper", + "returnFalse", + "returnNoopFileWatcher", + "returnTrue", + "returnUndefined", + "returnsPromise", + "runInitializersHelper", + "sameFlatMap", + "sameMap", + "sameMapping", + "screenStartingMessageCodes", + "semanticDiagnosticsOptionDeclarations", + "serializeCompilerOptions", + "server", + "servicesVersion", + "setCommentRange", + "setConfigFileInOptions", + "setConstantValue", + "setEmitFlags", + "setFunctionNameHelper", + "setGetSourceFileAsHashVersioned", + "setIdentifierAutoGenerate", + "setIdentifierGeneratedImportReference", + "setIdentifierTypeArguments", + "setInternalEmitFlags", + "setModuleDefaultHelper", + "setPrivateIdentifier", + "setSnippetElement", + "setSourceMapRange", + "setStackTraceLimit", + "setStartsOnNewLine", + "setSyntheticLeadingComments", + "setSyntheticTrailingComments", + "setSys", + "setSysLog", + "setTokenSourceMapRange", + "setTypeNode", + "setUILocale", + "shouldAllowImportingTsExtension", + "shouldUseUriStyleNodeCoreModules", + "signatureHasLiteralTypes", + "signatureHasRestParameter", + "signatureToDisplayParts", + "single", + "singleElementArray", + "singleOrMany", + "singleOrUndefined", + "skipConstraint", + "skipWhile", + "some", + "sort", + "sortAndDeduplicate", + "sourceFileAffectingCompilerOptions", + "sourceMapCommentRegExp", + "sourceMapCommentRegExpDontCareLineStart", + "spacePart", + "spanMap", + "spreadArrayHelper", + "stableSort", + "startEndContainsRange", + "startEndOverlapsWithStartEnd", + "startTracing", + "startsWith", + "startsWithUnderscore", + "stringContainsAt", + "suppressLeadingAndTrailingTrivia", + "suppressLeadingTrivia", + "suppressTrailingTrivia", + "symbolEscapedNameNoDefault", + "symbolNameNoDefault", + "symbolPart", + "symbolToDisplayParts", + "syntaxMayBeASICandidate", + "syntaxRequiresTrailingSemicolonOrASI", + "sys", + "sysLog", + "takeWhile", + "targetOptionDeclaration", + "templateObjectHelper", + "testFormatSettings", + "textChanges", + "textOrKeywordPart", + "textPart", + "textSpansEqual", + "toArray", + "toBuilderFileEmit", + "toBuilderStateFileInfoForMultiEmit", + "toEditorSettings", + "toFileNameLowerCase", + "toLowerCase", + "toProgramEmitPending", + "trace", + "tracing", + "tracingEnabled", + "transform", + "transformClassFields", + "transformDeclarations", + "transformECMAScriptModule", + "transformES2015", + "transformES2016", + "transformES2017", + "transformES2018", + "transformES2019", + "transformES2020", + "transformES2021", + "transformESDecorators", + "transformESNext", + "transformGenerators", + "transformImpliedNodeFormatDependentModule", + "transformJsx", + "transformLegacyDecorators", + "transformModule", + "transformNamedEvaluation", + "transformNodes", + "transformSystemModule", + "transformTypeScript", + "transpile", + "transpileDeclaration", + "transpileModule", + "transpileOptionValueCompilerOptions", + "tryAddToSet", + "tryAndIgnoreErrors", + "tryCast", + "tryDirectoryExists", + "tryFileExists", + "tryGetDirectories", + "tryGetExtensionFromPath", + "tryGetNativePerformanceHooks", + "tryGetSourceMappingURL", + "tryIOAndConsumeErrors", + "tryParseRawSourceMap", + "tryReadDirectory", + "tryReadFile", + "tryRemovePrefix", + "tryRemoveSuffix", + "typeAcquisitionDeclarations", + "typeAliasNamePart", + "typeKeywords", + "typeParameterNamePart", + "typeToDisplayParts", + "unchangedPollThresholds", + "unmangleScopedPackageName", + "unorderedRemoveItem", + "unorderedRemoveItemAt", + "updateErrorForNoInputFiles", + "updateLanguageServiceSourceFile", + "updateMissingFilePathsWatch", + "updateResolutionField", + "updateSharedExtendedConfigFileWatcher", + "updateWatchingWildcardDirectories", + "valuesHelper", + "visitArray", + "visitCommaListElements", + "visitEachChild", + "visitFunctionBody", + "visitIterationBody", + "visitLexicalEnvironment", + "visitNode", + "visitNodes", + "visitParameterList", + "walkUpLexicalEnvironments", + "whitespaceOrMapCommentRegExp", + "writeFile", + "writeFileEnsuringDirectories", + "zipWith", +]); diff --git a/scripts/generate-unused-typescript-specifiers.js b/scripts/generate-unused-typescript-specifiers.js new file mode 100644 index 000000000..ecf4d83c2 --- /dev/null +++ b/scripts/generate-unused-typescript-specifiers.js @@ -0,0 +1,63 @@ +import fs from "node:fs/promises"; + +import esbuild from "esbuild"; +import * as importMetaResolve from "import-meta-resolve"; +import { outdent } from "outdent"; +import * as prettier from "prettier"; +import * as typescript from "typescript"; + +import { modifyTypescriptModule } from "./build/modify-typescript-module.js"; +import UNUSED_SPECIFIERS from "./build/typescript-unused-specifiers.js"; + +async function getRemovedSpecifiers(code, exports) { + let errors = []; + try { + await esbuild.transformSync(code, { loader: "js" }); + return; + } catch (error) { + ({ errors } = error); + } + + const specifiers = []; + for (const { text } of errors) { + const match = text.match( + /^"(?.*?)" is not declared in this file$/, + ); + + if (match) { + const { specifier } = exports.find( + ({ variable }) => variable === match.groups.variable, + ); + specifiers.push(specifier); + } + } + + return specifiers; +} + +async function main() { + const original = await fs.readFile( + new URL(importMetaResolve.resolve("typescript", import.meta.url)), + "utf8", + ); + const { code, exports } = modifyTypescriptModule(original); + + let specifiers = (await getRemovedSpecifiers(code, exports)) ?? []; + + specifiers = [...new Set([...UNUSED_SPECIFIERS, ...specifiers])] + .filter((specifier) => Object.hasOwn(typescript, specifier)) + .sort(); + + await fs.writeFile( + new URL("./build/typescript-unused-specifiers.js", import.meta.url), + await prettier.format( + outdent` + export default new Set(${JSON.stringify(specifiers, undefined, 2)}); + `, + { parser: "meriyah" }, + ), + ); + console.log("typescript-unused-specifiers.js updated."); +} + +await main(); diff --git a/yarn.lock b/yarn.lock index e59bf57e8..7a573ab13 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7372,7 +7372,7 @@ __metadata: tempy: "npm:3.1.0" to-fast-properties: "npm:4.0.0" ts-expect: "npm:1.3.0" - typescript: "npm:5.4.5" + typescript: "npm:5.5.1-rc" unicode-regex: "npm:4.0.0" unified: "npm:9.2.2" url-or-path: "npm:2.3.0" @@ -8660,23 +8660,23 @@ __metadata: languageName: node linkType: hard -"typescript@npm:5.4.5": - version: 5.4.5 - resolution: "typescript@npm:5.4.5" +"typescript@npm:5.5.1-rc": + version: 5.5.1-rc + resolution: "typescript@npm:5.5.1-rc" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/d04a9e27e6d83861f2126665aa8d84847e8ebabcea9125b9ebc30370b98cb38b5dff2508d74e2326a744938191a83a69aa9fddab41f193ffa43eabfdf3f190a5 + checksum: 10/c4412a2f9a351c0cd566464da8794c25f86dc1da087bf04776eb3a1ae16e1f9f52ec3f3b9e972bfd6bd7845af94f46de062b848e4e1001b7d58b4e02ccd61136 languageName: node linkType: hard -"typescript@patch:typescript@npm%3A5.4.5#optional!builtin": - version: 5.4.5 - resolution: "typescript@patch:typescript@npm%3A5.4.5#optional!builtin::version=5.4.5&hash=5adc0c" +"typescript@patch:typescript@npm%3A5.5.1-rc#optional!builtin": + version: 5.5.1-rc + resolution: "typescript@patch:typescript@npm%3A5.5.1-rc#optional!builtin::version=5.5.1-rc&hash=b45daf" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/760f7d92fb383dbf7dee2443bf902f4365db2117f96f875cf809167f6103d55064de973db9f78fe8f31ec08fff52b2c969aee0d310939c0a3798ec75d0bca2e1 + checksum: 10/2f3cdded7c8c273e483f041a6dbd1bebb202403b2623d1e71242f530e6c927f37a1135a7069b3e7e038416b5b9db8bdd8ca8ab0c4493b11da8f32cd3d7c9829a languageName: node linkType: hard