From de34c7ed29bcce8b46a65f5effe45090b8493ba5 Mon Sep 17 00:00:00 2001 From: Marvin Hagemeister Date: Thu, 14 Nov 2024 14:11:29 +0100 Subject: feat(cli): add `--unstable-node-globals` flag (#26617) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR adds a new `--unstable-node-globals` flag to expose Node globals by default. Fixes https://github.com/denoland/deno/issues/26611 --------- Co-authored-by: Bartek IwaƄczuk --- runtime/fmt_errors.rs | 20 ++++++++++++++++---- runtime/js/90_deno_ns.js | 13 +++++++------ runtime/js/98_global_scope_shared.js | 13 +++++++++++++ runtime/lib.rs | 18 ++++++++++++------ 4 files changed, 48 insertions(+), 16 deletions(-) (limited to 'runtime') diff --git a/runtime/fmt_errors.rs b/runtime/fmt_errors.rs index 28cd70296..6c05fbc63 100644 --- a/runtime/fmt_errors.rs +++ b/runtime/fmt_errors.rs @@ -339,28 +339,40 @@ fn get_suggestions_for_terminal_errors(e: &JsError) -> Vec { FixSuggestion::info(cstr!( "Buffer is not available in the global scope in Deno." )), - FixSuggestion::hint(cstr!("Import it explicitly with import { Buffer } from \"node:buffer\";.")), + FixSuggestion::hint_multiline(&[ + cstr!("Import it explicitly with import { Buffer } from \"node:buffer\";,"), + cstr!("or run again with --unstable-node-globals flag to add this global."), + ]), ]; } else if msg.contains("clearImmediate is not defined") { return vec![ FixSuggestion::info(cstr!( "clearImmediate is not available in the global scope in Deno." )), - FixSuggestion::hint(cstr!("Import it explicitly with import { clearImmediate } from \"node:timers\";.")), + FixSuggestion::hint_multiline(&[ + cstr!("Import it explicitly with import { clearImmediate } from \"node:timers\";,"), + cstr!("or run again with --unstable-node-globals flag to add this global."), + ]), ]; } else if msg.contains("setImmediate is not defined") { return vec![ FixSuggestion::info(cstr!( "setImmediate is not available in the global scope in Deno." )), - FixSuggestion::hint(cstr!("Import it explicitly with import { setImmediate } from \"node:timers\";.")), + FixSuggestion::hint_multiline( + &[cstr!("Import it explicitly with import { setImmediate } from \"node:timers\";,"), + cstr!("or run again with --unstable-node-globals flag to add this global."), + ]), ]; } else if msg.contains("global is not defined") { return vec![ FixSuggestion::info(cstr!( "global is not available in the global scope in Deno." )), - FixSuggestion::hint(cstr!("Use globalThis instead, or assign globalThis.global = globalThis.")), + FixSuggestion::hint_multiline(&[ + cstr!("Use globalThis instead, or assign globalThis.global = globalThis,"), + cstr!("or run again with --unstable-node-globals flag to add this global."), + ]), ]; } else if msg.contains("openKv is not a function") { return vec![ diff --git a/runtime/js/90_deno_ns.js b/runtime/js/90_deno_ns.js index 11f618ce2..079338510 100644 --- a/runtime/js/90_deno_ns.js +++ b/runtime/js/90_deno_ns.js @@ -144,12 +144,13 @@ const unstableIds = { http: 5, kv: 6, net: 7, - otel: 8, - process: 9, - temporal: 10, - unsafeProto: 11, - webgpu: 12, - workerOptions: 13, + nodeGlobals: 8, + otel: 9, + process: 10, + temporal: 11, + unsafeProto: 12, + webgpu: 13, + workerOptions: 14, }; const denoNsUnstableById = { __proto__: null }; diff --git a/runtime/js/98_global_scope_shared.js b/runtime/js/98_global_scope_shared.js index 7a2723899..f8e76b7ce 100644 --- a/runtime/js/98_global_scope_shared.js +++ b/runtime/js/98_global_scope_shared.js @@ -32,6 +32,8 @@ import { DOMException } from "ext:deno_web/01_dom_exception.js"; import * as abortSignal from "ext:deno_web/03_abort_signal.js"; import * as imageData from "ext:deno_web/16_image_data.js"; import process from "node:process"; +import Buffer from "node:buffer"; +import { clearImmediate, setImmediate } from "node:timers"; import { loadWebGPU } from "ext:deno_webgpu/00_init.js"; import * as webgpuSurface from "ext:deno_webgpu/02_surface.js"; import { unstableIds } from "ext:runtime/90_deno_ns.js"; @@ -300,4 +302,15 @@ unstableForWindowOrWorkerGlobalScope[unstableIds.net] = { unstableForWindowOrWorkerGlobalScope[unstableIds.webgpu] = {}; +unstableForWindowOrWorkerGlobalScope[unstableIds.nodeGlobals] = { + Buffer: core.propWritable(Buffer), + setImmediate: core.propWritable(setImmediate), + clearImmediate: core.propWritable(clearImmediate), + global: { + enumerable: true, + configurable: true, + get: () => globalThis, + }, +}; + export { unstableForWindowOrWorkerGlobalScope, windowOrWorkerGlobalScope }; diff --git a/runtime/lib.rs b/runtime/lib.rs index 6fb8c5f3d..8a228c5b5 100644 --- a/runtime/lib.rs +++ b/runtime/lib.rs @@ -99,24 +99,30 @@ pub static UNSTABLE_GRANULAR_FLAGS: &[UnstableGranularFlag] = &[ show_in_help: true, id: 7, }, + UnstableGranularFlag { + name: "node-globals", + help_text: "Expose Node globals everywhere", + show_in_help: true, + id: 8, + }, UnstableGranularFlag { name: "otel", help_text: "Enable unstable OpenTelemetry features", show_in_help: false, - id: 8, + id: 9, }, // TODO(bartlomieju): consider removing it UnstableGranularFlag { name: ops::process::UNSTABLE_FEATURE_NAME, help_text: "Enable unstable process APIs", show_in_help: false, - id: 9, + id: 10, }, UnstableGranularFlag { name: "temporal", help_text: "Enable unstable Temporal API", show_in_help: true, - id: 10, + id: 11, }, UnstableGranularFlag { name: "unsafe-proto", @@ -124,19 +130,19 @@ pub static UNSTABLE_GRANULAR_FLAGS: &[UnstableGranularFlag] = &[ show_in_help: true, // This number is used directly in the JS code. Search // for "unstableIds" to see where it's used. - id: 11, + id: 12, }, UnstableGranularFlag { name: deno_webgpu::UNSTABLE_FEATURE_NAME, help_text: "Enable unstable `WebGPU` APIs", show_in_help: true, - id: 12, + id: 13, }, UnstableGranularFlag { name: ops::worker_host::UNSTABLE_FEATURE_NAME, help_text: "Enable unstable Web Worker APIs", show_in_help: true, - id: 13, + id: 14, }, ]; -- cgit v1.2.3