| // 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(), '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, |
| }; |