/** * @license * Copyright 2025 Google LLC * SPDX-License-Identifier: Apache-2.0 */ import * as fs from 'node:fs'; import * as path from 'node:path'; const BUILD_DIR = path.join(process.cwd(), 'build'); /** * Writes content to a file. * @param filePath The path to the file. * @param content The content to write. */ function writeFile(filePath: string, content: string): void { fs.writeFileSync(filePath, content, 'utf-8'); } function main(): void { const devtoolsThirdPartyPath = 'node_modules/chrome-devtools-frontend/front_end/third_party'; const devtoolsFrontEndCorePath = 'node_modules/chrome-devtools-frontend/front_end/core'; // Create i18n mock const i18nDir = path.join(BUILD_DIR, devtoolsFrontEndCorePath, 'i18n'); fs.mkdirSync(i18nDir, {recursive: true}); const localesFile = path.join(i18nDir, 'locales.js'); const localesContent = ` export const LOCALES = [ 'en-US', ]; export const BUNDLED_LOCALES = [ 'en-US', ]; export const DEFAULT_LOCALE = 'en-US'; export const REMOTE_FETCH_PATTERN = '@HOST@/remote/serve_file/@VERSION@/core/i18n/locales/@LOCALE@.json'; export const LOCAL_FETCH_PATTERN = './locales/@LOCALE@.json';`; writeFile(localesFile, localesContent); // Create codemirror.next mock. const codeMirrorDir = path.join( BUILD_DIR, devtoolsThirdPartyPath, 'codemirror.next', ); fs.mkdirSync(codeMirrorDir, {recursive: true}); const codeMirrorFile = path.join(codeMirrorDir, 'codemirror.next.js'); const codeMirrorContent = ` export default {}; export const cssStreamParser = () => Promise.resolve({ startState: () => ({}) }); export class StringStream { constructor() {} } export const css = { cssLanguage: { parser: { parse: () => ({ topNode: { getChild: () => null } }) } } }; `; writeFile(codeMirrorFile, codeMirrorContent); // Create root mock const rootDir = path.join(BUILD_DIR, devtoolsFrontEndCorePath, 'root'); fs.mkdirSync(rootDir, {recursive: true}); const runtimeFile = path.join(rootDir, 'Runtime.js'); const runtimeContent = ` export function getChromeVersion() { return ''; }; export function getRemoteBase() { return null; }; export const hostConfig = {}; export const GdpProfilesEnterprisePolicyValue = { ENABLED: 0, ENABLED_WITHOUT_BADGES: 1, DISABLED: 2, }; export const Runtime = { isDescriptorEnabled: () => true, queryParam: () => null, } export const experiments = { isEnabled: () => false, } export const ExperimentName = { ALL: '*', CAPTURE_NODE_CREATION_STACKS: 'capture-node-creation-stacks', LIVE_HEAP_PROFILE: 'live-heap-profile', PROTOCOL_MONITOR: 'protocol-monitor', SAMPLING_HEAP_PROFILER_TIMELINE: 'sampling-heap-profiler-timeline', SHOW_OPTION_TO_EXPOSE_INTERNALS_IN_HEAP_SNAPSHOT: 'show-option-to-expose-internals-in-heap-snapshot', TIMELINE_INVALIDATION_TRACKING: 'timeline-invalidation-tracking', TIMELINE_SHOW_ALL_EVENTS: 'timeline-show-all-events', TIMELINE_V8_RUNTIME_CALL_STATS: 'timeline-v8-runtime-call-stats', APCA: 'apca', FONT_EDITOR: 'font-editor', FULL_ACCESSIBILITY_TREE: 'full-accessibility-tree', CONTRAST_ISSUES: 'contrast-issues', EXPERIMENTAL_COOKIE_FEATURES: 'experimental-cookie-features', INSTRUMENTATION_BREAKPOINTS: 'instrumentation-breakpoints', AUTHORED_DEPLOYED_GROUPING: 'authored-deployed-grouping', JUST_MY_CODE: 'just-my-code', USE_SOURCE_MAP_SCOPES: 'use-source-map-scopes', TIMELINE_SHOW_POST_MESSAGE_EVENTS: 'timeline-show-postmessage-events', TIMELINE_DEBUG_MODE: 'timeline-debug-mode', } `; writeFile(runtimeFile, runtimeContent); // Copy missing CodeMirror .mjs files that tsc ignores due to .d.mts renames const codemirrorDir = path.join( BUILD_DIR, devtoolsThirdPartyPath, 'codemirror', ); const codemirrorSrcDir = path.join( process.cwd(), 'node_modules', 'chrome-devtools-frontend', 'front_end', 'third_party', 'codemirror', ); const filesToCopy = [ 'package/addon/runmode/runmode-standalone.mjs', 'package/mode/css/css.mjs', 'package/mode/javascript/javascript.mjs', 'package/mode/xml/xml.mjs', ]; for (const file of filesToCopy) { const src = path.join(codemirrorSrcDir, file); const dest = path.join(codemirrorDir, file); fs.mkdirSync(path.dirname(dest), {recursive: true}); fs.copyFileSync(src, dest); } copyDevToolsDescriptionFiles(); } function copyDevToolsDescriptionFiles() { const devtoolsIssuesDescriptionPath = 'node_modules/chrome-devtools-frontend/front_end/models/issues_manager/descriptions'; const sourceDir = path.join(process.cwd(), devtoolsIssuesDescriptionPath); const destDir = path.join( BUILD_DIR, 'src', 'third_party', 'issue-descriptions', ); fs.cpSync(sourceDir, destDir, {recursive: true}); } main();