| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| const { TypeScriptVersion } = require('@definitelytyped/typescript-versions'); |
| const { typeScriptPath, install } = require('@definitelytyped/utils'); |
| const { runTsCompile } = require('./pre-publish'); |
| const globby = require('globby'); |
| const semver = require('semver'); |
| |
| const MIN_VERSION = '3.5.0'; |
| |
| async function installTs() { |
| const tsVersions = getTypeScriptVersions(); |
| for (const version of tsVersions) { |
| await install(version); |
| } |
| } |
| |
| async function runTests() { |
| const casesESM = await globby(__dirname + '/../test/types/esm/*.ts'); |
| const casesCJS = await globby(__dirname + '/../test/types/cjs/*.ts'); |
| const casesNoModule = await globby(__dirname + '/../test/types/no-module/*.ts'); |
| |
| const tsVersions = getTypeScriptVersions(); |
| |
| function createCompilerOptions(overrideOptions) { |
| return { |
| declaration: false, |
| importHelpers: false, |
| sourceMap: false, |
| pretty: false, |
| removeComments: false, |
| allowJs: false, |
| rootDir: __dirname + '/../test/types', |
| outDir: __dirname + '/../test/types/tmp', |
| // Disable global types, necessary to avoid other |
| // irrelevant node_modules types interference. |
| typeRoots: [], |
| // Must pass in most strict cases |
| strict: true, |
| ...overrideOptions |
| }; |
| }; |
| |
| async function singleTest(ts, tsVersion, tsconfigModule, tsconfigModuleResolution, testList) { |
| if (!isSupportedTSConfigModuleField(ts, tsconfigModule)) { |
| console.log(`Skip: tsVersion: ${tsVersion} does not support {"module": "${tsconfigModule}"}.`); |
| return; |
| } |
| if (!isSupportedTSConfigModuleResolutionField(ts, tsVersion, tsconfigModuleResolution)) { |
| console.log(`Skip: tsVersion: ${tsVersion} does not support {"moduleResolution": "${tsconfigModuleResolution}"}.`); |
| return; |
| } |
| |
| console.log(`Testing: tsVersion: ${tsVersion}, tsconfig: {"module": "${tsconfigModule}", "moduleResolution": "${tsconfigModuleResolution}"}`); |
| await runTsCompile(ts, createCompilerOptions({ |
| // noEmit: true, |
| module: tsconfigModule, |
| moduleResolution: tsconfigModuleResolution, |
| }), testList); |
| } |
| |
| for (const version of tsVersions) { |
| const ts = require(typeScriptPath(version)); |
| |
| // console.log(ts.ModuleKind); |
| // console.log(ts.ModuleResolutionKind); |
| |
| // await singleTest(ts, version, undefined , undefined, casesESM); |
| // await singleTest(ts, version, 'None', 'classic', casesNoModule); |
| // await singleTest(ts, version, 'CommonJS', 'node', casesESM); |
| // await singleTest(ts, version, 'CommonJS', 'node', casesCJS); |
| // await singleTest(ts, version, 'ESNext', 'node', casesESM); |
| // await singleTest(ts, version, 'ESNext', 'Bundler', casesESM); |
| await singleTest(ts, version, 'NodeNext', 'NodeNext', casesESM); |
| // await singleTest(ts, version, 'NodeNext', 'NodeNext', casesCJS); |
| |
| console.log(`Finished test of tsVersion ${version}`); |
| } |
| } |
| |
| function isSupportedTSConfigModuleField(ts, moduleName) { |
| if (moduleName === undefined) { |
| return true; |
| } |
| const map = { |
| 'none': 'None', |
| 'commonjs': 'CommonJS', |
| 'amd': 'AMD', |
| 'umd': 'UMD', |
| 'system': 'System', |
| 'es6': 'ES2015', |
| 'es2015': 'ES2015', |
| 'es2020': 'ES2020', |
| 'es2022': 'ES2022', |
| 'esnext': 'ESNext', |
| 'node16': 'Node16', |
| 'nodenext': 'NodeNext', |
| }; |
| const enumKey = map[moduleName.toLowerCase()]; |
| return enumKey != null && ts.ModuleKind[enumKey] != null; |
| } |
| |
| function isSupportedTSConfigModuleResolutionField(ts, tsVersion, moduleResolutionName) { |
| if (moduleResolutionName === undefined) { |
| return true; |
| } |
| const map = { |
| 'classic': 'Classic', |
| 'node': 'NodeJs', |
| // 'nodejs': 'NodeJs', // Older TS do not support value "nodejs". |
| 'node10': 'Node10', |
| 'node16': 'Node16', |
| 'nodenext': 'NodeNext', |
| 'bundler': 'Bundler', |
| }; |
| const enumKey = map[moduleResolutionName.toLowerCase()]; |
| |
| if (enumKey === 'NodeNext') { |
| // "NodeNext" is unstable before TSv4.7, and error will be thrown. |
| if (semver.lt(tsVersion + '.0', '4.7.0')) { |
| return false; |
| } |
| } |
| |
| return enumKey != null && ts.ModuleResolutionKind[enumKey] != null; |
| } |
| |
| function getTypeScriptVersions() { |
| return TypeScriptVersion.unsupported |
| .concat(TypeScriptVersion.shipped) |
| .filter(version => semver.gte(version + '.0', MIN_VERSION)); |
| } |
| |
| async function main() { |
| await installTs(); |
| await runTests(); |
| } |
| |
| module.exports = main; |
| |
| main(); |