summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBartek Iwańczuk <biwanczuk@gmail.com>2024-01-24 14:20:51 +0100
committerGitHub <noreply@github.com>2024-01-24 14:20:51 +0100
commit930ce2087051b4e45b2026ce7a77c14360a6993f (patch)
treeb1152fcb56e7a498b904717f8a291c8720fd5eb8
parentb66f5ed00e83927a976ffdbe45c2ace9641de086 (diff)
feat: deprecate `window` global (#22057)
This commit deprecates `window` global and adds deprecation notice on each use of `window`. We decided to proceed with removal of `window` global variable in Deno 2.0. There's a lot of code in the wild that uses pattern like this: ``` if (typeof window !== "undefined) { ... } ``` to check if the code is being run in browser. However, this check passes fine in Deno and most often libraries that do this check try to access some browser API that is not available in Deno, or use DOM APIs (which are also not available in Deno). This situation has occurred multiple times already and it's unfeasible to expect the whole ecosystem to migrate to new check (and even if that happened there's a ton of code that's already shipped and won't change). The migration is straightfoward - replace all usages of `window` with `globalThis` or `self`. When Deno encounters use of `window` global it will now issue a warning, steering users towards required changes: ``` Warning ├ Use of deprecated "window" API. │ ├ This API will be removed in Deno 2.0. Make sure to upgrade to a stable API before then. │ ├ Suggestion: Use `globalThis` or `self` instead. │ ├ Suggestion: You can provide `window` in the current scope with: `const window = globalThis`. │ └ Stack trace: └─ at file:///Users/ib/dev/deno/foo.js:7:1 ``` Ref https://github.com/denoland/deno/issues/13367.
-rw-r--r--cli/tests/testdata/npm/compare_globals/main.out1
-rw-r--r--cli/tests/testdata/run/webstorage/logger.ts2
-rw-r--r--cli/tests/testdata/run/webstorage/serialization.ts6
-rw-r--r--cli/tests/testdata/run/webstorage/setter.ts2
-rw-r--r--runtime/js/98_global_scope_window.js12
-rw-r--r--runtime/js/99_main.js15
6 files changed, 25 insertions, 13 deletions
diff --git a/cli/tests/testdata/npm/compare_globals/main.out b/cli/tests/testdata/npm/compare_globals/main.out
index 0e366fae7..c59800eb4 100644
--- a/cli/tests/testdata/npm/compare_globals/main.out
+++ b/cli/tests/testdata/npm/compare_globals/main.out
@@ -20,6 +20,7 @@ false
true
true
true
+[WILDCARD]
true
false
false
diff --git a/cli/tests/testdata/run/webstorage/logger.ts b/cli/tests/testdata/run/webstorage/logger.ts
index 3898c4445..feadd39eb 100644
--- a/cli/tests/testdata/run/webstorage/logger.ts
+++ b/cli/tests/testdata/run/webstorage/logger.ts
@@ -1 +1 @@
-console.log(window.localStorage);
+console.log(globalThis.localStorage);
diff --git a/cli/tests/testdata/run/webstorage/serialization.ts b/cli/tests/testdata/run/webstorage/serialization.ts
index f3791d355..f125331bb 100644
--- a/cli/tests/testdata/run/webstorage/serialization.ts
+++ b/cli/tests/testdata/run/webstorage/serialization.ts
@@ -1,4 +1,4 @@
-window.sessionStorage.setItem("hello", "deno");
+globalThis.sessionStorage.setItem("hello", "deno");
-console.log(window.localStorage);
-console.log(window.sessionStorage);
+console.log(globalThis.localStorage);
+console.log(globalThis.sessionStorage);
diff --git a/cli/tests/testdata/run/webstorage/setter.ts b/cli/tests/testdata/run/webstorage/setter.ts
index ec6d474f5..cf5a7bfaf 100644
--- a/cli/tests/testdata/run/webstorage/setter.ts
+++ b/cli/tests/testdata/run/webstorage/setter.ts
@@ -1 +1 @@
-window.localStorage.setItem("hello", "deno");
+globalThis.localStorage.setItem("hello", "deno");
diff --git a/runtime/js/98_global_scope_window.js b/runtime/js/98_global_scope_window.js
index 63b346dd5..3188c4b4c 100644
--- a/runtime/js/98_global_scope_window.js
+++ b/runtime/js/98_global_scope_window.js
@@ -1,6 +1,6 @@
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
-import { core, primordials } from "ext:core/mod.js";
+import { core, internals, primordials } from "ext:core/mod.js";
const {
op_bootstrap_language,
op_bootstrap_numcpus,
@@ -108,7 +108,15 @@ const mainRuntimeGlobalProperties = {
Location: location.locationConstructorDescriptor,
location: location.locationDescriptor,
Window: globalInterfaces.windowConstructorDescriptor,
- window: util.getterOnly(() => globalThis),
+ window: util.getterOnly(() => {
+ internals.warnOnDeprecatedApi(
+ "window",
+ new Error().stack,
+ "Use `globalThis` or `self` instead.",
+ "You can provide `window` in the current scope with: `const window = globalThis`.",
+ );
+ return globalThis;
+ }),
self: util.getterOnly(() => globalThis),
Navigator: util.nonEnumerable(Navigator),
navigator: util.getterOnly(() => navigator),
diff --git a/runtime/js/99_main.js b/runtime/js/99_main.js
index 255c5fb6a..3fee1109b 100644
--- a/runtime/js/99_main.js
+++ b/runtime/js/99_main.js
@@ -99,7 +99,7 @@ let globalThis_;
let deprecatedApiWarningDisabled = false;
const ALREADY_WARNED_DEPRECATED = new SafeSet();
-function warnOnDeprecatedApi(apiName, stack, suggestion) {
+function warnOnDeprecatedApi(apiName, stack, ...suggestions) {
if (deprecatedApiWarningDisabled) {
return;
}
@@ -155,11 +155,14 @@ function warnOnDeprecatedApi(apiName, stack, suggestion) {
"%c\u251c This API will be removed in Deno 2.0. Make sure to upgrade to a stable API before then.",
"color: yellow;",
);
- console.error("%c\u2502", "color: yellow;");
- console.error(
- `%c\u251c Suggestion: ${suggestion}`,
- "color: yellow;",
- );
+ for (let i = 0; i < suggestions.length; i++) {
+ const suggestion = suggestions[i];
+ console.error("%c\u2502", "color: yellow;");
+ console.error(
+ `%c\u251c Suggestion: ${suggestion}`,
+ "color: yellow;",
+ );
+ }
if (isFromRemoteDependency) {
console.error("%c\u2502", "color: yellow;");
console.error(