// 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} */ 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; }