blob: 112cd2b758d37167872a3bfd7203019fed0f6a40 [file]
/*
* 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();