Skip to content

Commit

Permalink
feat(cli): add --unstable-node-globals flag (#26617)
Browse files Browse the repository at this point in the history
This PR adds a new `--unstable-node-globals` flag to expose Node globals
by default.

Fixes #26611

---------

Co-authored-by: Bartek Iwańczuk <biwanczuk@gmail.com>
  • Loading branch information
marvinhagemeister and bartlomieju authored Nov 14, 2024
1 parent 4e899d4 commit de34c7e
Show file tree
Hide file tree
Showing 13 changed files with 75 additions and 21 deletions.
1 change: 1 addition & 0 deletions cli/schemas/config-file.v1.json
Original file line number Diff line number Diff line change
Expand Up @@ -534,6 +534,7 @@
"http",
"kv",
"net",
"node-globals",
"sloppy-imports",
"temporal",
"unsafe-proto",
Expand Down
20 changes: 16 additions & 4 deletions runtime/fmt_errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -339,28 +339,40 @@ fn get_suggestions_for_terminal_errors(e: &JsError) -> Vec<FixSuggestion> {
FixSuggestion::info(cstr!(
"<u>Buffer</> is not available in the global scope in Deno."
)),
FixSuggestion::hint(cstr!("Import it explicitly with <u>import { Buffer } from \"node:buffer\";</>.")),
FixSuggestion::hint_multiline(&[
cstr!("Import it explicitly with <u>import { Buffer } from \"node:buffer\";</>,"),
cstr!("or run again with <u>--unstable-node-globals</> flag to add this global."),
]),
];
} else if msg.contains("clearImmediate is not defined") {
return vec![
FixSuggestion::info(cstr!(
"<u>clearImmediate</> is not available in the global scope in Deno."
)),
FixSuggestion::hint(cstr!("Import it explicitly with <u>import { clearImmediate } from \"node:timers\";</>.")),
FixSuggestion::hint_multiline(&[
cstr!("Import it explicitly with <u>import { clearImmediate } from \"node:timers\";</>,"),
cstr!("or run again with <u>--unstable-node-globals</> flag to add this global."),
]),
];
} else if msg.contains("setImmediate is not defined") {
return vec![
FixSuggestion::info(cstr!(
"<u>setImmediate</> is not available in the global scope in Deno."
)),
FixSuggestion::hint(cstr!("Import it explicitly with <u>import { setImmediate } from \"node:timers\";</>.")),
FixSuggestion::hint_multiline(
&[cstr!("Import it explicitly with <u>import { setImmediate } from \"node:timers\";</>,"),
cstr!("or run again with <u>--unstable-node-globals</> flag to add this global."),
]),
];
} else if msg.contains("global is not defined") {
return vec![
FixSuggestion::info(cstr!(
"<u>global</> is not available in the global scope in Deno."
)),
FixSuggestion::hint(cstr!("Use <u>globalThis</> instead, or assign <u>globalThis.global = globalThis</>.")),
FixSuggestion::hint_multiline(&[
cstr!("Use <u>globalThis</> instead, or assign <u>globalThis.global = globalThis</>,"),
cstr!("or run again with <u>--unstable-node-globals</> flag to add this global."),
]),
];
} else if msg.contains("openKv is not a function") {
return vec![
Expand Down
13 changes: 7 additions & 6 deletions runtime/js/90_deno_ns.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 };
Expand Down
13 changes: 13 additions & 0 deletions runtime/js/98_global_scope_shared.js
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down Expand Up @@ -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 };
18 changes: 12 additions & 6 deletions runtime/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -99,44 +99,50 @@ 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",
help_text: "Enable unsafe __proto__ support. This is a security risk.",
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,
},
];

Expand Down
3 changes: 2 additions & 1 deletion tests/specs/lint/node_globals_no_duplicate_imports/main.out
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ const _foo = setImmediate;
at [WILDCARD]main.ts:3:14

info: setImmediate is not available in the global scope in Deno.
hint: Import it explicitly with import { setImmediate } from "node:timers";.
hint: Import it explicitly with import { setImmediate } from "node:timers";,
or run again with --unstable-node-globals flag to add this global.
3 changes: 2 additions & 1 deletion tests/specs/run/node_globals_hints/buffer.out
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ Buffer;
at [WILDCARD]buffer.js:1:1

info: Buffer is not available in the global scope in Deno.
hint: Import it explicitly with import { Buffer } from "node:buffer";.
hint: Import it explicitly with import { Buffer } from "node:buffer";,
or run again with --unstable-node-globals flag to add this global.
3 changes: 2 additions & 1 deletion tests/specs/run/node_globals_hints/clear_immediate.out
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ clearImmediate;
at [WILDCARD]clear_immediate.js:1:1

info: clearImmediate is not available in the global scope in Deno.
hint: Import it explicitly with import { clearImmediate } from "node:timers";.
hint: Import it explicitly with import { clearImmediate } from "node:timers";,
or run again with --unstable-node-globals flag to add this global.
3 changes: 2 additions & 1 deletion tests/specs/run/node_globals_hints/global.out
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ global;
at [WILDCARD]global.js:1:1

info: global is not available in the global scope in Deno.
hint: Use globalThis instead, or assign globalThis.global = globalThis.
hint: Use globalThis instead, or assign globalThis.global = globalThis,
or run again with --unstable-node-globals flag to add this global.
3 changes: 2 additions & 1 deletion tests/specs/run/node_globals_hints/set_immediate.out
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ setImmediate;
at [WILDCARD]set_immediate.js:1:1

info: setImmediate is not available in the global scope in Deno.
hint: Import it explicitly with import { setImmediate } from "node:timers";.
hint: Import it explicitly with import { setImmediate } from "node:timers";,
or run again with --unstable-node-globals flag to add this global.
5 changes: 5 additions & 0 deletions tests/specs/run/unstable/__test__.jsonc
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@
"exitCode": 1,
"output": "kv.out"
},
"node_globals": {
"args": "run --unstable-node-globals node_globals.ts",
"exitCode": 0,
"output": "node_globals.out"
},
"temporal": {
"args": "run temporal.ts",
"exitCode": 1,
Expand Down
4 changes: 4 additions & 0 deletions tests/specs/run/unstable/node_globals.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
global: true
Buffer: true
setImmediate: true
clearImmediate: true
7 changes: 7 additions & 0 deletions tests/specs/run/unstable/node_globals.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import * as nodeBuffer from "node:buffer";
import * as nodeTimers from "node:timers";

console.log(`global: ${globalThis === global}`);
console.log(`Buffer: ${Buffer === nodeBuffer.default}`);
console.log(`setImmediate: ${setImmediate === nodeTimers.setImmediate}`);
console.log(`clearImmediate: ${clearImmediate === nodeTimers.clearImmediate}`);

0 comments on commit de34c7e

Please sign in to comment.