mirror of
https://github.com/Azure/cosmos-explorer.git
synced 2025-12-20 09:20:16 +00:00
Initial Move from Azure DevOps to GitHub
This commit is contained in:
3
strict-migration-tools/src/config.js
Normal file
3
strict-migration-tools/src/config.js
Normal file
@@ -0,0 +1,3 @@
|
||||
module.exports.targetTsconfig = "../tsconfig.strict.json";
|
||||
|
||||
module.exports.skippedFiles = new Set([]);
|
||||
@@ -0,0 +1,94 @@
|
||||
// @ts-check
|
||||
const path = require("path");
|
||||
const fs = require("fs");
|
||||
const { getImportsForFile } = require("./tsHelper");
|
||||
const glob = require("glob");
|
||||
const config = require("./config");
|
||||
|
||||
/**
|
||||
* @param {string} srcRoot
|
||||
* @param {{ includeTests: boolean }} [options]
|
||||
*/
|
||||
const forEachFileInSrc = (srcRoot, options) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
glob(`${srcRoot}/**/*.ts`, (err, files) => {
|
||||
if (err) {
|
||||
return reject(err);
|
||||
}
|
||||
|
||||
return resolve(
|
||||
files.filter(
|
||||
file => !file.endsWith(".d.ts") && (options && options.includeTests ? true : !file.endsWith(".test.ts"))
|
||||
)
|
||||
);
|
||||
});
|
||||
});
|
||||
};
|
||||
module.exports.forEachFileInSrc = forEachFileInSrc;
|
||||
|
||||
/**
|
||||
* @param {string} vscodeRoot
|
||||
* @param {(file: string) => void} forEach
|
||||
* @param {{ includeTests: boolean }} [options]
|
||||
*/
|
||||
module.exports.forStrictNullCheckEligibleFiles = async (vscodeRoot, forEach, options) => {
|
||||
const srcRoot = path.join(vscodeRoot, "src");
|
||||
|
||||
const tsconfig = JSON.parse(fs.readFileSync(path.join(srcRoot, config.targetTsconfig)).toString());
|
||||
const checkedFiles = await getCheckedFiles(tsconfig, vscodeRoot);
|
||||
|
||||
const imports = new Map();
|
||||
const getMemoizedImportsForFile = (file, srcRoot) => {
|
||||
if (imports.has(file)) {
|
||||
return imports.get(file);
|
||||
}
|
||||
const importList = getImportsForFile(file, srcRoot);
|
||||
imports.set(file, importList);
|
||||
return importList;
|
||||
};
|
||||
|
||||
const files = await forEachFileInSrc(srcRoot, options);
|
||||
return files
|
||||
.filter(file => !checkedFiles.has(file))
|
||||
.filter(file => !config.skippedFiles.has(path.relative(srcRoot, file)))
|
||||
.filter(file => {
|
||||
const allProjImports = getMemoizedImportsForFile(file, srcRoot);
|
||||
|
||||
const nonCheckedImports = allProjImports
|
||||
.filter(x => x !== file)
|
||||
.filter(imp => {
|
||||
if (checkedFiles.has(imp)) {
|
||||
return false;
|
||||
}
|
||||
// Don't treat cycles as blocking
|
||||
const impImports = getMemoizedImportsForFile(imp, srcRoot);
|
||||
return impImports.filter(x => x !== file).filter(x => !checkedFiles.has(x)).length !== 0;
|
||||
});
|
||||
|
||||
const isEdge = nonCheckedImports.length === 0;
|
||||
if (isEdge) {
|
||||
forEach(file);
|
||||
}
|
||||
return isEdge;
|
||||
});
|
||||
};
|
||||
|
||||
async function getCheckedFiles(tsconfig, srcRoot) {
|
||||
const set = new Set(tsconfig.files.map(include => path.join(srcRoot, include)));
|
||||
const includes = tsconfig.include.map(include => {
|
||||
return new Promise((resolve, reject) => {
|
||||
glob(path.join(srcRoot, include), (err, files) => {
|
||||
if (err) {
|
||||
return reject(err);
|
||||
}
|
||||
|
||||
for (const file of files) {
|
||||
set.add(file);
|
||||
}
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
});
|
||||
await Promise.all(includes);
|
||||
return set;
|
||||
}
|
||||
44
strict-migration-tools/src/tsHelper.js
Normal file
44
strict-migration-tools/src/tsHelper.js
Normal file
@@ -0,0 +1,44 @@
|
||||
// @ts-check
|
||||
const path = require("path");
|
||||
const ts = require("typescript");
|
||||
const fs = require("fs");
|
||||
|
||||
module.exports.getImportsForFile = function getImportsForFile(file, srcRoot) {
|
||||
const fileInfo = ts.preProcessFile(fs.readFileSync(file).toString());
|
||||
return fileInfo.importedFiles
|
||||
.map(importedFile => importedFile.fileName)
|
||||
.filter(fileName => !/svg|gif|png|html|less|json|externals|css|ico/.test(fileName)) // remove image imports
|
||||
.filter(x => /\//.test(x)) // remove node modules (the import must contain '/')
|
||||
.filter(x => !/\@/.test(x)) // remove @ scoped modules
|
||||
.filter(
|
||||
x =>
|
||||
!/url-polyfill|office-ui-fabric|rxjs|\@nteract|bootstrap|promise-polyfill|abort-controller|es6-object-assign|es6-symbol|webcrypto-liner|promise.prototype.finally|object.entries/.test(
|
||||
x
|
||||
)
|
||||
) // remove other modules
|
||||
.filter(x => !/worker-loader/.test(x)) // remove other modules
|
||||
.map(fileName => {
|
||||
if (/(^\.\/)|(^\.\.\/)/.test(fileName)) {
|
||||
return path.join(path.dirname(file), fileName);
|
||||
}
|
||||
if (/^vs/.test(fileName)) {
|
||||
return path.join(srcRoot, fileName);
|
||||
}
|
||||
return fileName;
|
||||
})
|
||||
.map(fileName => {
|
||||
if (fs.existsSync(`${fileName}.ts`)) {
|
||||
return `${fileName}.ts`;
|
||||
}
|
||||
if (fs.existsSync(`${fileName}.js`)) {
|
||||
return `${fileName}.js`;
|
||||
}
|
||||
if (fs.existsSync(`${fileName}.d.ts`)) {
|
||||
return `${fileName}.d.ts`;
|
||||
}
|
||||
if (fs.existsSync(`${fileName}.tsx`)) {
|
||||
return `${fileName}.tsx`;
|
||||
}
|
||||
throw new Error(`Unresolved import ${fileName} in ${file}`);
|
||||
});
|
||||
};
|
||||
Reference in New Issue
Block a user