UNPKG

vscode-chrome-debug-core

Version:

A library for building VS Code debug adapters for targets that support the Chrome Remote Debug Protocol

87 lines (85 loc) 4.01 kB
"use strict"; /*--------------------------------------------------------- * Copyright (C) Microsoft Corporation. All rights reserved. *--------------------------------------------------------*/ Object.defineProperty(exports, "__esModule", { value: true }); const path = require("path"); const baseSourceMapTransformer_1 = require("./baseSourceMapTransformer"); const utils = require("../utils"); const vscode_debugadapter_1 = require("vscode-debugadapter"); /** * Load SourceMaps on launch. Requires reading the file and parsing out the sourceMappingURL, because * if you wait until the script is loaded as in LazySMT, you get that info from the runtime. */ class EagerSourceMapTransformer extends baseSourceMapTransformer_1.BaseSourceMapTransformer { init(args) { super.init(args); if (args.sourceMaps) { const generatedCodeGlobs = args.outFiles ? args.outFiles : args.outDir ? [path.join(args.outDir, '**/*.js')] : []; // try to find all source files upfront asynchronously if (generatedCodeGlobs.length > 0) { vscode_debugadapter_1.logger.log('SourceMaps: preloading sourcemaps for scripts in globs: ' + JSON.stringify(generatedCodeGlobs)); this._preLoad = utils.multiGlob(generatedCodeGlobs) .then(paths => { vscode_debugadapter_1.logger.log(`SourceMaps: expanded globs and found ${paths.length} scripts`); return Promise.all(paths.map(scriptPath => this.discoverSourceMapForGeneratedScript(scriptPath))); }) .then(() => { }); } else { this._preLoad = Promise.resolve(); } } } discoverSourceMapForGeneratedScript(generatedScriptPath) { return this.findSourceMapUrlInFile(generatedScriptPath) .then(uri => { if (uri) { vscode_debugadapter_1.logger.log(`SourceMaps: sourcemap url parsed from end of generated content: ${uri}`); return this._sourceMaps.processNewSourceMap(generatedScriptPath, uri, this._isVSClient); } else { vscode_debugadapter_1.logger.log(`SourceMaps: no sourcemap url found in generated script: ${generatedScriptPath}`); return undefined; } }) .catch(err => { // If we fail to preload one, ignore and keep going vscode_debugadapter_1.logger.log(`SourceMaps: could not preload for generated script: ${generatedScriptPath}. Error: ${err.toString()}`); }); } /** * Try to find the 'sourceMappingURL' in content or the file with the given path. * Returns null if no source map url is found or if an error occured. */ findSourceMapUrlInFile(pathToGenerated, content) { if (content) { return Promise.resolve(this.findSourceMapUrl(content)); } return utils.readFileP(pathToGenerated) .then(fileContents => this.findSourceMapUrl(fileContents)); } /** * Try to find the 'sourceMappingURL' at the end of the given contents. * Relative file paths are converted into absolute paths. * Returns null if no source map url is found. */ findSourceMapUrl(contents) { const lines = contents.split('\n'); for (let l = lines.length - 1; l >= Math.max(lines.length - 10, 0); l--) { const line = lines[l].trim(); const matches = EagerSourceMapTransformer.SOURCE_MAPPING_MATCHER.exec(line); if (matches && matches.length === 2) { return matches[1].trim(); } } return null; } } EagerSourceMapTransformer.SOURCE_MAPPING_MATCHER = new RegExp('^//[#@] ?sourceMappingURL=(.+)$'); exports.EagerSourceMapTransformer = EagerSourceMapTransformer; //# sourceMappingURL=eagerSourceMapTransformer.js.map