blob: 03084cfd27db860dfd88da660cde2d12054fb961 [file] [log] [blame]
Jack Franklin65c824b2021-01-14 14:34:231// Copyright 2020 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5/**
6 * This file contains helpers to load the correct path to various scripts and
7 * directories. It is the Node equivalent of devtools_paths.py.
8 *
9 * Note that not all paths implemented in devtools_paths.py are implemented
10 * here. Please add any paths you need that are missing.
11 */
12
13const path = require('path');
14const os = require('os');
15
16/**
17 * You would think we can use __filename here but we cannot because __filename
Jack Franklinbc302342021-01-18 10:03:3018 * has any symlinks resolved. This means we can't use it to tell if the user is
19 * using the external repo with a standalone build setup because the symlink
20 * from chromium/src/third_party/devtools-frontend => devtools-frontend repo
21 * gets resolved by Node before it gives us __filename.
Jack Franklin65c824b2021-01-14 14:34:2322 *
Jack Franklinbc302342021-01-18 10:03:3023 * We can use process.argv[1], which is the path to the file currently being
24 * executed without any symlinks resolution. If we assume that file is always in
25 * the devtools-frontend repository/directory, we can use that file as the
26 * starting point for figuring out if we're in Chromium or not. until we find
27 * the scripts directory, at which point we've found this file and can use it
28 * for all subsequent logic.
29 *
Benedikt Meurere6a39dc2024-08-19 15:28:2630 * e.g. the user executes a script: scripts/test/run_lint_check.js
Jack Franklinbc302342021-01-18 10:03:3031 *
32 * process.argv[1] =
Benedikt Meurere6a39dc2024-08-19 15:28:2633 * /full/path/devtools-frontend/src/scripts/test/run_lint_check.js
Jack Franklin65c824b2021-01-14 14:34:2334 */
Jack Franklinbc302342021-01-18 10:03:3035const PATH_TO_EXECUTED_FILE = process.argv[1];
Jack Franklin65c824b2021-01-14 14:34:2336
Jack Franklinbc302342021-01-18 10:03:3037const _lookUpCaches = new Map(
38 [['chromium', null]],
39);
40/**
41 * This function figures out if we're within a chromium directory, and therefore
42 * we are in the integrated workflow mode, rather than working in a standalone
43 * devtools-frontend repository.
44 */
45function isInChromiumDirectory() {
46 const cached = _lookUpCaches.get('chromium');
47 if (cached) {
48 return cached;
49 }
50
Patrick Brosset5d02bbd2021-04-14 08:32:5051 const normalizedPath = PATH_TO_EXECUTED_FILE.split(path.sep).join('/');
Takuto Ikutaafe8b8e2022-01-26 02:42:0952 const devtoolsPath = 'src/third_party/devtools-frontend';
53 const isInChromium = normalizedPath.includes(devtoolsPath);
John Emau254c8dd2022-06-13 21:40:2454 const potentialChromiumDir = PATH_TO_EXECUTED_FILE.substring(0, normalizedPath.indexOf(devtoolsPath));
Jack Franklinbc302342021-01-18 10:03:3055 const result = {isInChromium, chromiumDirectory: potentialChromiumDir};
56 _lookUpCaches.set('chromium', result);
57 return result;
58}
59/**
60 * Returns the path to the root of the devtools-frontend repository.
61 *
62 * If we're in Chromium, this will be /path/to/chromium/src/third_party/devtools-frontend/src
63 * If it's standalone, it will be /path/to/devtools-frontend
64 */
65function devtoolsRootPath() {
Takuto Ikuta5bfd1022022-02-07 11:02:3266 return path.dirname(__dirname);
Jack Franklinbc302342021-01-18 10:03:3067}
68
69/**
70 * Returns the path to the root of the main repository we're in.
71 * if we're in Chromium, this is /path/to/chromium/src
72 * if we're in standalone, this is /path/to/devtools-frontend
73 *
74 * Note this is different to devtoolsRootPath(), which always returns the path
75 * to the devtools-frontend source code.
76 */
77function rootPath() {
78 const {isInChromium, chromiumDirectory} = isInChromiumDirectory();
79 if (isInChromium) {
80 return path.join(chromiumDirectory, 'src');
81 }
82 return devtoolsRootPath();
83}
84
85/**
86 * Path to the third_party directory. Used because if we're running in Chromium
87 * land we need to use e.g. the Node executable from Chromium's third_party
88 * directory, not from the devtools-frontend third_party directory.
89 */
Jack Franklin65c824b2021-01-14 14:34:2390function thirdPartyPath() {
Jack Franklinbc302342021-01-18 10:03:3091 return path.join(rootPath(), 'third_party');
Jack Franklin65c824b2021-01-14 14:34:2392}
93
Wolfgang Beyer21656cb2023-09-04 16:38:1394function devToolsThirdPartyPath() {
95 const {isInChromium} = isInChromiumDirectory();
96 if (isInChromium) {
97 return path.join(rootPath(), 'third_party', 'devtools-frontend', 'src', 'third_party');
98 }
99 return thirdPartyPath();
100}
101
Jack Franklin65c824b2021-01-14 14:34:23102function nodePath() {
103 const paths = {
Joshua Thomase2625e32024-10-10 14:21:25104 darwin: path.join(
105 process.arch === 'arm64' ? 'mac_arm64' : 'mac',
106 process.arch === 'arm64' ? 'node-darwin-arm64' : 'node-darwin-x64', 'bin', 'node'),
Nikolay Vitkov47310242024-09-04 10:00:07107 linux: path.join('linux', 'node-linux-x64', 'bin', 'node'),
108 win32: path.join('win', 'node.exe'),
Jack Franklin65c824b2021-01-14 14:34:23109 };
Jack Franklinbc302342021-01-18 10:03:30110 return path.join(thirdPartyPath(), 'node', paths[os.platform()]);
Jack Franklin65c824b2021-01-14 14:34:23111}
112
Jack Franklinbc302342021-01-18 10:03:30113/**
114 * The path to the devtools-frontend node_modules folder.
115 */
Jack Franklin65c824b2021-01-14 14:34:23116function nodeModulesPath() {
117 return path.join(devtoolsRootPath(), 'node_modules');
118}
119
Jack Franklinbc302342021-01-18 10:03:30120function stylelintExecutablePath() {
121 return path.join(nodeModulesPath(), 'stylelint', 'bin', 'stylelint.js');
122}
123
Jack Franklin29bb6312021-03-16 09:27:17124function mochaExecutablePath() {
125 return path.join(nodeModulesPath(), 'mocha', 'bin', 'mocha');
126}
127
Danil Somsikov058b9d82024-10-07 11:22:19128function litAnalyzerExecutablePath() {
129 return path.join(nodeModulesPath(), 'lit-analyzer', 'cli.js');
130}
131
Benedikt Meurer0d4dbae2024-10-23 13:21:11132/**
133 * Computes the path to the toplevel `tsconfig.json`.
134 *
135 * @returns the path to the toplevel `tsconfig.json`.
136 */
137function tsconfigJsonPath() {
138 return path.join(devtoolsRootPath(), 'tsconfig.json');
139}
140
Jack Franklin40b5fb62021-02-01 14:06:15141function downloadedChromeBinaryPath() {
142 const paths = {
Nikolay Vitkov47310242024-09-04 10:00:07143 linux: path.join('chrome-linux', 'chrome'),
144 darwin: path.join('chrome-mac', 'Google Chrome for Testing.app', 'Contents', 'MacOS', 'Google Chrome for Testing'),
145 win32: path.join('chrome-win', 'chrome.exe'),
Jack Franklin40b5fb62021-02-01 14:06:15146 };
Wolfgang Beyer21656cb2023-09-04 16:38:13147 return path.join(devToolsThirdPartyPath(), 'chrome', paths[os.platform()]);
Jack Franklin40b5fb62021-02-01 14:06:15148}
149
Jack Franklinbc302342021-01-18 10:03:30150module.exports = {
151 thirdPartyPath,
152 nodePath,
153 devtoolsRootPath,
154 nodeModulesPath,
Jack Franklin29bb6312021-03-16 09:27:17155 mochaExecutablePath,
Jack Franklin40b5fb62021-02-01 14:06:15156 stylelintExecutablePath,
Danil Somsikov058b9d82024-10-07 11:22:19157 downloadedChromeBinaryPath,
Benedikt Meurer0d4dbae2024-10-23 13:21:11158 litAnalyzerExecutablePath,
159 tsconfigJsonPath,
Jack Franklinbc302342021-01-18 10:03:30160};