Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(cli): add --unstable-node-globals flag #26617

Merged
merged 4 commits into from
Nov 14, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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}`);