chrome-devtools-frontend
Version:
Chrome DevTools UI
185 lines (158 loc) • 5.49 kB
TypeScript
// Copyright 2025 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.
/**
* The decoded scopes information found in a source map.
*/
export interface ScopeInfo {
/**
* The length of {@linkcode scopes} must match the length of "sources" in the source map JSON. Each entry describes the scope tree of the corresponding source file.
*/
scopes: (OriginalScope | null)[];
/**
* The range tree of the generated bundle. Multiple top-level ranges are allowed but must not overlap source position wise.
*/
ranges: GeneratedRange[];
}
/**
* A scope in the authored source.
*/
export interface OriginalScope {
/** The beginning of this scope (inclusive). */
start: Position;
/** The end of this scope (exclusive) */
end: Position;
/**
* The name of this scope. For function scopes this is the function name.
*
* Constructors may put the class name here.
*/
name?: string;
/**
* JavaScript-like languages are encouraged to use 'Global', 'Class', 'Function' and 'Block'.
*
* The "kind" is only used in debuggers as a label for scope UI views, but does not have any
* semantic significance.
*/
kind?: string;
/**
* Whether this scope is something that can be called and results in stack frame (e.g. functions, methods, etc.).
*/
isStackFrame: boolean;
/**
* All variable names that this scope declares.
*/
variables: string[];
/**
* The child scopes. When manually building scopes, {@linkcode children} must be sorted, not
* overlap each other and be contained within [start, end).
*/
children: OriginalScope[];
/** The parent scope or `undefined` for top-level scopes. */
parent?: OriginalScope;
}
/**
* A range (can be a scope) in the generated JavaScript/WASM.
*
* The name "range" was chosen deliberately as a GeneratedRange does not necessarily
* correspond to a lexical JavaScript scope. E.g. inlining, or concatenating multiple
* bundles can result in generated ranges that are not lexical scopes.
*/
export interface GeneratedRange {
/** The beginning of this range (inclusive) */
start: Position;
/** The end of this range (exclusive) */
end: Position;
/**
* The corresponding scope in the authored source.
*/
originalScope?: OriginalScope;
/**
* Whether this generated range is an actual JavaScript/WASM function in the generated code.
*/
isStackFrame: boolean;
/**
* Whether calls to this generated range should be hidden from stack traces even if
* this range has an `originalScope`.
*/
isHidden: boolean;
/**
* If this `GeneratedRange` is the result of inlining `originalScope`, then `callSite`
* refers to where `originalScope` was called in the original ("authored") code.
*
* If this field is present than `originalScope` is present as well and `isStackFrame` is `false`.
*/
callSite?: OriginalPosition;
/**
* Expressions that compute the values of the variables of this OriginalScope. The length
* of `values` matches the length of `originalScope.variables`.
*/
values: Binding[];
/**
* The child ranges. When manually building ranges, {@linkcode children} must be sorted,
* not overlap each other and be contained within [start, end).
*/
children: GeneratedRange[];
/** The parent range or `undefined` for top-level ranges. */
parent?: GeneratedRange;
}
/**
* For each variable, this can either be:
*
* 1) A single expression (valid for a full `GeneratedRange`).
*
* 2) `null` if this variable is unavailable in the whole range. This can
* happen e.g. when the variable was optimized out and can't be recomputed.
*
* 3) A list of `SubRangeBinding`s. Used when computing the value requires different
* expressions throughout the `GeneratedRange` or if the variable is unavailable in
* parts of the `GeneratedRange`.
*
* Note: The decoder produces `SubRangeBindings` where the "from" of the first `SubRangeBinding`
* and the "to" of the last `SubRangeBinding` are equal to the `GeneratedRange`s "start" and "end"
* position respectively.
*/
export type Binding = string | null | SubRangeBinding[];
export interface SubRangeBinding {
value?: string;
from: Position;
to: Position;
}
/**
* A position with 0-based line and column numbers.
*
* A {@linkcode Position} object by itself does not imply a position in original source
* or generated code. It is used in both and normally it is clear from context.
*/
export interface Position {
line: number;
column: number;
}
/**
* A position with 0-based line and column numbers in a specific original source file.
*/
export interface OriginalPosition extends Position {
/** The 0-based index into "sources" in the source map. Or into {@linkcode ScopeInfo.scopes}. */
sourceIndex: number;
}
/**
* A standard source map, or index source map as per https://tc39.es/ecma426.
*/
export type SourceMap = SourceMapJson | IndexSourceMapJson;
/**
* A standard index source map json object as per https://tc39.es/ecma426.
*/
export interface IndexSourceMapJson {
version: 3;
sections: Array<{ offset: Position; map: SourceMapJson }>;
}
/**
* A standard source map json object as per https://tc39.es/ecma426.
*/
export interface SourceMapJson {
version: 3;
sources: (string | null)[];
mappings: string;
names?: string[];
scopes?: string;
}