blob: 8ab44ae0fbacfb81b6ea6d345921625b60ed0ca8 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// This file generates jsconfig.json to improve VSCode autocomplete in the DevTools codebase.
const fs = require('fs');
const path = require('path');
const utils = require('./utils');
const FRONTEND_PATH = path.resolve(__dirname, '..', 'front_end');
const modulePaths = [];
for (let dir of fs.readdirSync(FRONTEND_PATH)) {
if (!utils.isDir(path.resolve(FRONTEND_PATH, dir)))
continue;
const modulePath = path.resolve(dir, 'module.json');
if (utils.isFile(path.resolve(FRONTEND_PATH, dir, 'module.json')))
modulePaths.push(dir);
}
const modules = new Map();
for (const modulePath of modulePaths) {
const moduleObject = JSON.parse(fs.readFileSync(path.resolve(FRONTEND_PATH, modulePath, 'module.json')));
modules.set(modulePath, moduleObject);
}
for (const [name, moduleJSON] of modules) {
const jsconfig = {
compilerOptions: {
target: 'esnext',
lib: ['esnext', 'dom']
},
include: [
'**/*',
'../Runtime.js',
'../externs.js'
],
exclude: (moduleJSON.skip_compilation || [])
};
for (const dependency of dependencyChain(name)) {
jsconfig.include.push('../' + dependency + '/**/*');
for (const file of modules.get(dependency).skip_compilation || [])
jsconfig.exclude.push(path.posix.join('..',dependency, file));
}
fs.writeFileSync(path.resolve(FRONTEND_PATH, name, 'jsconfig.json'), JSON.stringify(jsconfig, undefined, 2));
}
/**
* @param {string} moduleName
* @return {!Set<string>}
*/
function dependencyChain(moduleName) {
const dependencies = new Set();
for (const dependency of modules.get(moduleName).dependencies || []){
dependencies.add(dependency);
for (const innerDependency of dependencyChain(dependency))
dependencies.add(innerDependency);
}
return dependencies;
}