diff --git a/js/compiler.ts b/js/compiler.ts index 941691f5c4d257..a6b6e6970f7296 100644 --- a/js/compiler.ts +++ b/js/compiler.ts @@ -388,6 +388,7 @@ export class DenoCompiler let lastModule: ModuleMetaData | undefined; sourceMaps.install({ installPrepareStackTrace: true, + getGeneratedContents: (fileName: string): string | RawSourceMap => { this._log("compiler.getGeneratedContents", fileName); if (fileName === "gen/bundle/main.js") { @@ -419,6 +420,11 @@ export class DenoCompiler } } }); + // Pre-compute source maps for main.js.map. This will happen at compile-time + // as long as Compiler is instanciated before the snapshot is created.. + const consumer = sourceMaps.loadConsumer("gen/bundle/main.js"); + assert(consumer != null); + consumer!.computeColumnSpans(); } private constructor() { diff --git a/js/main.ts b/js/main.ts index 0ed45aaec50829..02e5dcb4d32e26 100644 --- a/js/main.ts +++ b/js/main.ts @@ -11,6 +11,10 @@ import { promiseErrorExaminer, promiseRejectHandler } from "./promise_util"; import { replLoop } from "./repl"; import { version } from "typescript"; +// Instantiate compiler at the top-level so it decodes source maps for the main +// bundle during snapshot. +const compiler = DenoCompiler.instance(); + function sendStart(): msg.StartRes { const builder = flatbuffers.createBuilder(); msg.Start.startStart(builder); @@ -44,7 +48,6 @@ export default function denoMain() { libdeno.setGlobalErrorHandler(onGlobalError); libdeno.setPromiseRejectHandler(promiseRejectHandler); libdeno.setPromiseErrorExaminer(promiseErrorExaminer); - const compiler = DenoCompiler.instance(); // First we send an empty "Start" message to let the privileged side know we // are ready. The response should be a "StartRes" message containing the CLI diff --git a/js/v8_source_maps.ts b/js/v8_source_maps.ts index f73cc2d3810f21..cd61955d2bd791 100644 --- a/js/v8_source_maps.ts +++ b/js/v8_source_maps.ts @@ -186,7 +186,7 @@ function CallSiteToString(frame: CallSite): string { // Regex for detecting source maps const reSourceMap = /^data:application\/json[^,]+base64,/; -function loadConsumer(source: string): SourceMapConsumer | null { +export function loadConsumer(source: string): SourceMapConsumer | null { let consumer = consumers.get(source); if (consumer == null) { const code = getGeneratedContents(source); @@ -210,8 +210,8 @@ function loadConsumer(source: string): SourceMapConsumer | null { sourceMapData = arrayToStr(ui8); sourceMappingURL = source; } else { - // Support source map URLs relative to the source URL - //sourceMappingURL = supportRelativeURL(source, sourceMappingURL); + // TODO Support source map URLs relative to the source URL + // sourceMappingURL = supportRelativeURL(source, sourceMappingURL); sourceMapData = getGeneratedContents(sourceMappingURL); } @@ -219,7 +219,6 @@ function loadConsumer(source: string): SourceMapConsumer | null { typeof sourceMapData === "string" ? JSON.parse(sourceMapData) : sourceMapData; - //console.log("sourceMapData", sourceMapData); consumer = new SourceMapConsumer(rawSourceMap); consumers.set(source, consumer); } @@ -242,7 +241,7 @@ function retrieveSourceMapURL(fileData: string): string | null { return lastMatch[1]; } -function mapSourcePosition(position: Position): MappedPosition { +export function mapSourcePosition(position: Position): MappedPosition { const consumer = loadConsumer(position.source); if (consumer == null) { return position; diff --git a/libdeno/binding.cc b/libdeno/binding.cc index 6cf0a7a21c954c..999ccac474038f 100644 --- a/libdeno/binding.cc +++ b/libdeno/binding.cc @@ -521,13 +521,6 @@ void InitializeContext(v8::Isolate* isolate, v8::Local context, .FromJust()); { - auto source = deno::v8_str(js_source); - CHECK( - deno_val->Set(context, deno::v8_str("mainSource"), source).FromJust()); - - bool r = deno::ExecuteV8StringSource(context, js_filename, source); - CHECK(r); - if (source_map != nullptr) { v8::TryCatch try_catch(isolate); v8::ScriptOrigin origin(v8_str("set_source_map.js")); @@ -551,6 +544,13 @@ void InitializeContext(v8::Isolate* isolate, v8::Local context, source_map_obj.ToLocalChecked()) .FromJust()); } + + auto source = deno::v8_str(js_source); + CHECK( + deno_val->Set(context, deno::v8_str("mainSource"), source).FromJust()); + + bool r = deno::ExecuteV8StringSource(context, js_filename, source); + CHECK(r); } } diff --git a/package.json b/package.json index 56b32ceca2e43a..6f2fafb3a90ea0 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "flatbuffers": "^1.9.0", "magic-string": "^0.22.5", "prettier": "^1.14.0", - "rollup": "^0.63.2", + "rollup": "0.67.0", "rollup-plugin-alias": "^1.4.0", "rollup-plugin-analyzer": "^2.1.0", "rollup-plugin-commonjs": "^9.1.3", diff --git a/rollup.config.js b/rollup.config.js index a648c647048316..1996d2b3e5d2bd 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,5 +1,5 @@ // Copyright 2018 the Deno authors. All rights reserved. MIT license. -import assert from "assert"; +// @ts-check import * as fs from "fs"; import path from "path"; import alias from "rollup-plugin-alias"; @@ -30,10 +30,14 @@ const tsconfigOverride = { } }; -// this is a rollup plugin which will look for imports ending with `!string` and resolve -// them with a module that will inline the contents of the file as a string. Needed to -// support `js/assets.ts`. -function strings({ include, exclude } = {}) { +/** this is a rollup plugin which will look for imports ending with `!string` and resolve + * them with a module that will inline the contents of the file as a string. Needed to + * support `js/assets.ts`. + * @param {any} param0 + */ +function strings( + { include, exclude } = { include: undefined, exclude: undefined } +) { if (!include) { throw new Error("include option must be passed"); } @@ -85,7 +89,9 @@ const osNodeToDeno = { linux: "linux" }; -// Inject deno.platform.arch and deno.platform.os +/** Inject deno.platform.arch and deno.platform.os + * @param {any} param0 + */ function platform({ include, exclude } = {}) { if (!include) { throw new Error("include option must be passed"); @@ -132,7 +138,7 @@ function resolveGenerated() { } function generateDepFile({ outputFile, sourceFiles = [], configFiles = [] }) { - let timestamp = Date.now(); + let timestamp = new Date(); // Save the depfile just before the node process exits. process.once("beforeExit", () => @@ -209,7 +215,8 @@ export default function makeConfig(commandOptions) { output: { format: "iife", name: "denoMain", - sourcemap: true + sourcemap: true, + sourcemapExcludeSources: true }, plugins: [ diff --git a/tests/error_004_missing_module.ts.out b/tests/error_004_missing_module.ts.out index 64932ddd0138a7..22207250dc5808 100644 --- a/tests/error_004_missing_module.ts.out +++ b/tests/error_004_missing_module.ts.out @@ -7,5 +7,5 @@ NotFound: Cannot resolve module "bad-module.ts" from "[WILDCARD]/tests/error_004 at moduleNames.map.name ([WILDCARD]/js/compiler.ts:[WILDCARD]) at Array.map () at DenoCompiler.resolveModuleNames ([WILDCARD]/js/compiler.ts:[WILDCARD]) - at Object.compilerHost.resolveModuleNames ([WILDCARD]/third_party/node_modules/typescript/lib/typescript.js:[WILDCARD]) - at resolveModuleNamesWorker ([WILDCARD]/third_party/node_modules/typescript/lib/typescript.js:[WILDCARD]) + at Object.compilerHost.resolveModuleNames () + at resolveModuleNamesWorker () diff --git a/tests/error_005_missing_dynamic_import.ts.out b/tests/error_005_missing_dynamic_import.ts.out index eb991de9db31a3..a0f17cf8124779 100644 --- a/tests/error_005_missing_dynamic_import.ts.out +++ b/tests/error_005_missing_dynamic_import.ts.out @@ -7,5 +7,5 @@ NotFound: Cannot resolve module "bad-module.ts" from "[WILDCARD]/tests/error_005 at moduleNames.map.name ([WILDCARD]/js/compiler.ts:[WILDCARD]) at Array.map () at DenoCompiler.resolveModuleNames ([WILDCARD]/js/compiler.ts:[WILDCARD]) - at Object.compilerHost.resolveModuleNames ([WILDCARD]/third_party/node_modules/typescript/lib/typescript.js:[WILDCARD]) - at resolveModuleNamesWorker ([WILDCARD]/third_party/node_modules/typescript/lib/typescript.js:[WILDCARD]) + at Object.compilerHost.resolveModuleNames () + at resolveModuleNamesWorker () diff --git a/tests/error_006_import_ext_failure.ts.out b/tests/error_006_import_ext_failure.ts.out index f2b6aa599116ca..f5f76af0f51f50 100644 --- a/tests/error_006_import_ext_failure.ts.out +++ b/tests/error_006_import_ext_failure.ts.out @@ -7,5 +7,5 @@ NotFound: Cannot resolve module "./non-existent" from "[WILDCARD]/tests/error_00 at moduleNames.map.name ([WILDCARD]/js/compiler.ts:[WILDCARD]) at Array.map () at DenoCompiler.resolveModuleNames ([WILDCARD]/js/compiler.ts:[WILDCARD]) - at Object.compilerHost.resolveModuleNames ([WILDCARD]/third_party/node_modules/typescript/lib/typescript.js:[WILDCARD]) - at resolveModuleNamesWorker ([WILDCARD]/third_party/node_modules/typescript/lib/typescript.js:[WILDCARD]) + at Object.compilerHost.resolveModuleNames () + at resolveModuleNamesWorker () diff --git a/third_party b/third_party index d1447e6375ebdd..d2dc0456c23c77 160000 --- a/third_party +++ b/third_party @@ -1 +1 @@ -Subproject commit d1447e6375ebddf590f1cd87219dadeca51cfec1 +Subproject commit d2dc0456c23c771781d77c40f8e2c21ba9f5abe7