UNPKG

chrome-devtools-frontend

Version:
145 lines (110 loc) 5.1 kB
# Workflow: Merging a DevTools Submodule into its Parent This document outlines the process for merging a submodule (e.g., `panels/timeline/extensions`) into its parent module (e.g., `panels/timeline`) within the DevTools build system. The goal is to simplify the build configuration by consolidating `BUILD.gn` files while keeping the original source file directory structure. ## Prerequisites You will need the following information: - **Parent Module Path:** The path to the directory containing the primary module. - **Child Module Path:** The path to the directory of the submodule to be merged. ## Workflow Steps ### 1. Analyze Build Configurations Read the contents of the `BUILD.gn` file from both the child module and the parent module. Identify the following from the child's `BUILD.gn`: - The list of `sources` in the `devtools_module`. - The list of `deps` (dependencies) in the `devtools_module`. - The `entrypoint` for the `devtools_entrypoint("bundle")`. ### 2. Modify the Parent `BUILD.gn` Edit the `BUILD.gn` file in the parent module's directory to incorporate the child module's configuration. 1. **Add Child's Sources:** Append the list of `sources` from the child's `devtools_module` to the parent's `sources` list. Remember to maintain the relative path from the parent's directory (e.g., `extensions/ExtensionUI.ts`). 2. **Merge Dependencies:** Add the `deps` from the child's `devtools_module` to the parent's `deps` list. Remove any duplicate entries. 3. **Remove Child Bundle Dependency:** Delete the dependency on the child's bundle from the parent's `deps` list (e.g., remove `./extensions:bundle`). ### 3. Delete the Child `BUILD.gn` Once the parent `BUILD.gn` is updated and contains all the necessary information, the child's `BUILD.gn` is no longer needed. Delete it. ```bash rm <child_module_path>/BUILD.gn ``` ### 4. Update `devtools_grd_files.gni` The global `.gni` file that lists all resources needs to be updated to reflect that the child module is no longer a separate, bundled entrypoint. 1. **Locate and Read the File:** Open `config/gni/devtools_grd_files.gni`. 2. **Remove Bundled Source:** Find and remove the line for the child's bundled JavaScript file from the `grd_files_bundled_sources` list. This path usually corresponds to the child's `entrypoint`. 3. **Add Unbundled Sources:** Add the paths to all of the child's original TypeScript source files (`.ts`) to the `grd_files_unbundled_sources` list. --- ## Example: Merging `panels/timeline/extensions` into `panels/timeline` - **Parent Module:** `panels/timeline` - **Child Module:** `panels/timeline/extensions` ### 1. `panels/timeline/BUILD.gn` Modification **Before:** ```gni devtools_module("timeline") { sources = [ ... "UIDevtoolsUtils.ts", ] deps = [ ... "./components:bundle", "./extensions:bundle", "./overlays:bundle", ... ] } ``` **After:** ```gni devtools_module("timeline") { sources = [ ... "UIDevtoolsUtils.ts", "extensions/ExtensionUI.ts", # Added from child ] deps = [ ... "./components:bundle", # "./extensions:bundle", # Removed "./overlays:bundle", ... # Dependencies from extensions/BUILD.gn are merged here "../../../ui/components/helpers:bundle", "../../../ui/components/render_coordinator:bundle", "../../../ui/legacy:bundle", ] } ``` ### 2. `panels/timeline/extensions/BUILD.gn` Deletion ```bash rm front_end/panels/timeline/extensions/BUILD.gn ``` ### 3. `config/gni/devtools_grd_files.gni` Modification **Before:** ```gni grd_files_bundled_sources = [ ... "front_end/panels/timeline/components/components.js", "front_end/panels/timeline/extensions/extensions.js", "front_end/panels/timeline/overlays/overlays.js", ... ] grd_files_unbundled_sources = [ ... "front_end/panels/timeline/extensions/ExtensionUI.ts", # This might not have been present before ... ] ``` **After:** ```gni grd_files_bundled_sources = [ ... "front_end/panels/timeline/components/components.js", # "front_end/panels/timeline/extensions/extensions.js", # Removed "front_end/panels/timeline/overlays/overlays.js", ... ] grd_files_unbundled_sources = [ ... "front_end/panels/timeline/extensions/extensions.ts", # Added "front_end/panels/timeline/extensions/ExtensionUI.ts", # Added ... ] ``` ## Removing Barrel Files After merging modules, you may still have remaining barrel files (e.g. `index.ts` or `extensions.ts` that just re-export other files). These should be removed to simplify the module structure. Manually updating all imports that rely on these barrels can be tedious and error-prone. The tool [unbarrelify](https://github.com/webpro/unbarrelify) can automate this process. It analyzes your codebase and replaces imports from barrel files with direct imports from the source files. **Usage:** Follow the instructions in the [unbarrelify repository](https://github.com/webpro/unbarrelify) to install and run the tool on your project. This is highly recommended to complete the refactoring process efficiently.