UNPKG

chrome-devtools-frontend

Version:
194 lines (174 loc) 5.91 kB
// Copyright 2020 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 contains helpers to load the correct path to various scripts and * directories. It is the Node equivalent of devtools_paths.py. * * Note that not all paths implemented in devtools_paths.py are implemented * here. Please add any paths you need that are missing. */ const os = require('os'); const path = require('path'); /** * You would think we can use __filename here but we cannot because __filename * has any symlinks resolved. This means we can't use it to tell if the user is * using the external repo with a standalone build setup because the symlink * from chromium/src/third_party/devtools-frontend => devtools-frontend repo * gets resolved by Node before it gives us __filename. * * We can use process.argv[1], which is the path to the file currently being * executed without any symlinks resolution. If we assume that file is always in * the devtools-frontend repository/directory, we can use that file as the * starting point for figuring out if we're in Chromium or not. until we find * the scripts directory, at which point we've found this file and can use it * for all subsequent logic. * * e.g. the user executes a script: scripts/test/run_lint_check.mjs * * process.argv[1] = * /full/path/devtools-frontend/src/scripts/test/run_lint_check.mjs */ const PATH_TO_EXECUTED_FILE = process.argv[1]; const _lookUpCaches = new Map([['chromium', null]]); /** * This function figures out if we're within a chromium directory, and therefore * we are in the integrated workflow mode, rather than working in a standalone * devtools-frontend repository. */ function isInChromiumDirectory() { const cached = _lookUpCaches.get('chromium'); if (cached) { return cached; } const normalizedPath = PATH_TO_EXECUTED_FILE.split(path.sep).join('/'); const devtoolsPath = 'third_party/devtools-frontend/src'; const isInChromium = normalizedPath.includes(devtoolsPath); const potentialChromiumDir = PATH_TO_EXECUTED_FILE.substring( 0, normalizedPath.indexOf(devtoolsPath), ); const result = {isInChromium, chromiumDirectory: potentialChromiumDir}; _lookUpCaches.set('chromium', result); return result; } /** * Returns the path to the root of the devtools-frontend repository. * * If we're in Chromium, this will be /path/to/chromium/src/third_party/devtools-frontend/src * If it's standalone, it will be /path/to/devtools-frontend */ function devtoolsRootPath() { return path.dirname(__dirname); } /** * Returns the path to the root of the main repository we're in. * if we're in Chromium, this is /path/to/chromium/src * if we're in standalone, this is /path/to/devtools-frontend * * Note this is different to devtoolsRootPath(), which always returns the path * to the devtools-frontend source code. */ function rootPath() { const {isInChromium, chromiumDirectory} = isInChromiumDirectory(); if (isInChromium) { return chromiumDirectory; } return devtoolsRootPath(); } /** * Path to the third_party directory. Used because if we're running in Chromium * land we need to use e.g. the Node executable from Chromium's third_party * directory, not from the devtools-frontend third_party directory. */ function thirdPartyPath() { return path.join(rootPath(), 'third_party'); } function devToolsThirdPartyPath() { const {isInChromium} = isInChromiumDirectory(); if (isInChromium) { return path.join( rootPath(), 'third_party', 'devtools-frontend', 'src', 'third_party', ); } return thirdPartyPath(); } function nodePath() { const paths = { darwin: path.join( process.arch === 'arm64' ? 'mac_arm64' : 'mac', process.arch === 'arm64' ? 'node-darwin-arm64' : 'node-darwin-x64', 'bin', 'node', ), linux: path.join('linux', 'node-linux-x64', 'bin', 'node'), win32: path.join('win', 'node.exe'), }; return path.join(thirdPartyPath(), 'node', paths[os.platform()]); } /** * The path to the devtools-frontend node_modules folder. */ function nodeModulesPath() { return path.join(devtoolsRootPath(), 'node_modules'); } function autoninjaPyPath() { return path.join(thirdPartyPath(), 'depot_tools', 'autoninja.py'); } function vpython3ExecutablePath() { return path.join(thirdPartyPath(), 'depot_tools', os.platform() === 'win32' ? 'vpython3.bat' : 'vpython3'); } function gnPyPath() { return path.join(thirdPartyPath(), 'depot_tools', 'gn.py'); } function stylelintExecutablePath() { return path.join(nodeModulesPath(), 'stylelint', 'bin', 'stylelint.js'); } function mochaExecutablePath() { return path.join(nodeModulesPath(), 'mocha', 'bin', 'mocha'); } function litAnalyzerExecutablePath() { return path.join(nodeModulesPath(), 'lit-analyzer', 'cli.js'); } /** * Computes the path to the toplevel `tsconfig.json`. * * @returns the path to the toplevel `tsconfig.json`. */ function tsconfigJsonPath() { return path.join(devtoolsRootPath(), 'front_end', 'tsconfig.json'); } function downloadedChromeBinaryPath() { const paths = { linux: path.join('chrome-linux', 'chrome'), darwin: path.join( 'chrome-mac', 'Google Chrome for Testing.app', 'Contents', 'MacOS', 'Google Chrome for Testing', ), win32: path.join('chrome-win', 'chrome.exe'), }; return path.join(devToolsThirdPartyPath(), 'chrome', paths[os.platform()]); } module.exports = { autoninjaPyPath, devtoolsRootPath, downloadedChromeBinaryPath, isInChromiumDirectory, gnPyPath, litAnalyzerExecutablePath, mochaExecutablePath, nodeModulesPath, nodePath, rootPath, stylelintExecutablePath, thirdPartyPath, tsconfigJsonPath, vpython3ExecutablePath, };