summaryrefslogtreecommitdiff
path: root/cli
diff options
context:
space:
mode:
authorBartek Iwańczuk <biwanczuk@gmail.com>2024-01-19 00:30:49 +0100
committerGitHub <noreply@github.com>2024-01-18 23:30:49 +0000
commitc62615bfe5a070c2517f3af3208d4308c72eb054 (patch)
treee95abadb1b93e79bdc9aa3449ee88dd3c1c29ce4 /cli
parent99f9fa5556e60c8149403bbe88411f45b080ca11 (diff)
feat: Start warning on each use of a deprecated API (#21939)
This commit introduces deprecation warnings for "Deno.*" APIs. This is gonna be quite noisy, but should tremendously help with user code updates to ensure smooth migration to Deno 2.0. The warning is printed at each unique call site to help quickly identify where code needs to be adjusted. There's some stack frame filtering going on to remove frames that are not useful to the user and would only cause confusion. The warning can be silenced using "--quiet" flag or "DENO_NO_DEPRECATION_WARNINGS" env var. "Deno.run()" API is now using this warning. Other deprecated APIs will start warning in follow up PRs. Example: ```js import { runEcho as runEcho2 } from "http://localhost:4545/run/warn_on_deprecated_api/mod.ts"; const p = Deno.run({ cmd: [ Deno.execPath(), "eval", "console.log('hello world')", ], }); await p.status(); p.close(); async function runEcho() { const p = Deno.run({ cmd: [ Deno.execPath(), "eval", "console.log('hello world')", ], }); await p.status(); p.close(); } await runEcho(); await runEcho(); for (let i = 0; i < 10; i++) { await runEcho(); } await runEcho2(); ``` ``` $ deno run --allow-read foo.js Warning ├ Use of deprecated "Deno.run()" API. │ ├ This API will be removed in Deno 2.0. Make sure to upgrade to a stable API before then. │ ├ Suggestion: Use "Deno.Command()" API instead. │ └ Stack trace: └─ at file:///Users/ib/dev/deno/foo.js:3:16 hello world Warning ├ Use of deprecated "Deno.run()" API. │ ├ This API will be removed in Deno 2.0. Make sure to upgrade to a stable API before then. │ ├ Suggestion: Use "Deno.Command()" API instead. │ └ Stack trace: ├─ at runEcho (file:///Users/ib/dev/deno/foo.js:8:18) └─ at file:///Users/ib/dev/deno/foo.js:13:7 hello world Warning ├ Use of deprecated "Deno.run()" API. │ ├ This API will be removed in Deno 2.0. Make sure to upgrade to a stable API before then. │ ├ Suggestion: Use "Deno.Command()" API instead. │ └ Stack trace: ├─ at runEcho (file:///Users/ib/dev/deno/foo.js:8:18) └─ at file:///Users/ib/dev/deno/foo.js:14:7 hello world Warning ├ Use of deprecated "Deno.run()" API. │ ├ This API will be removed in Deno 2.0. Make sure to upgrade to a stable API before then. │ ├ Suggestion: Use "Deno.Command()" API instead. │ └ Stack trace: ├─ at runEcho (file:///Users/ib/dev/deno/foo.js:8:18) └─ at file:///Users/ib/dev/deno/foo.js:17:9 hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world Warning ├ Use of deprecated "Deno.run()" API. │ ├ This API will be removed in Deno 2.0. Make sure to upgrade to a stable API before then. │ ├ Suggestion: Use "Deno.Command()" API instead. │ ├ Suggestion: It appears this API is used by a remote dependency. │ Try upgrading to the latest version of that dependency. │ └ Stack trace: ├─ at runEcho (http://localhost:4545/run/warn_on_deprecated_api/mod.ts:2:18) └─ at file:///Users/ib/dev/deno/foo.js:20:7 hello world ``` Closes #21839
Diffstat (limited to 'cli')
-rw-r--r--cli/args/mod.rs7
-rw-r--r--cli/factory.rs1
-rw-r--r--cli/standalone/binary.rs3
-rw-r--r--cli/standalone/mod.rs1
-rw-r--r--cli/tests/integration/run_tests.rs22
-rw-r--r--cli/tests/testdata/run/warn_on_deprecated_api/main.js32
-rw-r--r--cli/tests/testdata/run/warn_on_deprecated_api/main.out72
-rw-r--r--cli/tests/testdata/run/warn_on_deprecated_api/main_disabled_env.out15
-rw-r--r--cli/tests/testdata/run/warn_on_deprecated_api/main_disabled_flag.out14
-rw-r--r--cli/tests/testdata/run/warn_on_deprecated_api/mod.ts11
-rw-r--r--cli/worker.rs5
11 files changed, 183 insertions, 0 deletions
diff --git a/cli/args/mod.rs b/cli/args/mod.rs
index 3ca7b5e32..c07df3a80 100644
--- a/cli/args/mod.rs
+++ b/cli/args/mod.rs
@@ -682,6 +682,7 @@ pub struct CliOptions {
maybe_lockfile: Option<Arc<Mutex<Lockfile>>>,
overrides: CliOptionOverrides,
maybe_workspace_config: Option<WorkspaceConfig>,
+ pub disable_deprecated_api_warning: bool,
}
impl CliOptions {
@@ -728,6 +729,10 @@ impl CliOptions {
}
}
+ let disable_deprecated_api_warning = flags.log_level
+ == Some(log::Level::Error)
+ || std::env::var("DENO_NO_DEPRECATION_WARNINGS").ok().is_some();
+
Ok(Self {
flags,
initial_cwd,
@@ -738,6 +743,7 @@ impl CliOptions {
maybe_vendor_folder,
overrides: Default::default(),
maybe_workspace_config,
+ disable_deprecated_api_warning,
})
}
@@ -1058,6 +1064,7 @@ impl CliOptions {
maybe_lockfile: self.maybe_lockfile.clone(),
maybe_workspace_config: self.maybe_workspace_config.clone(),
overrides: self.overrides.clone(),
+ disable_deprecated_api_warning: self.disable_deprecated_api_warning,
}
}
diff --git a/cli/factory.rs b/cli/factory.rs
index 204ea7e87..ed5232470 100644
--- a/cli/factory.rs
+++ b/cli/factory.rs
@@ -673,6 +673,7 @@ impl CliFactory {
self.feature_checker().clone(),
self.create_cli_main_worker_options()?,
self.options.node_ipc_fd(),
+ self.options.disable_deprecated_api_warning,
))
}
diff --git a/cli/standalone/binary.rs b/cli/standalone/binary.rs
index 18880b7a1..cdf86fffa 100644
--- a/cli/standalone/binary.rs
+++ b/cli/standalone/binary.rs
@@ -150,6 +150,7 @@ pub struct Metadata {
pub maybe_import_map: Option<(Url, String)>,
pub entrypoint: ModuleSpecifier,
pub node_modules: Option<NodeModules>,
+ pub disable_deprecated_api_warning: bool,
}
pub fn load_npm_vfs(root_dir_path: PathBuf) -> Result<FileBackedVfs, AnyError> {
@@ -557,6 +558,8 @@ impl<'a> DenoCompileBinaryWriter<'a> {
entrypoint: entrypoint.clone(),
maybe_import_map,
node_modules,
+ disable_deprecated_api_warning: cli_options
+ .disable_deprecated_api_warning,
};
write_binary_bytes(
diff --git a/cli/standalone/mod.rs b/cli/standalone/mod.rs
index 55c3db48c..8a98636a4 100644
--- a/cli/standalone/mod.rs
+++ b/cli/standalone/mod.rs
@@ -539,6 +539,7 @@ pub async fn run(
maybe_root_package_json_deps: package_json_deps_provider.deps().cloned(),
},
None,
+ metadata.disable_deprecated_api_warning,
);
v8_set_flags(construct_v8_flags(&[], &metadata.v8_flags, vec![]));
diff --git a/cli/tests/integration/run_tests.rs b/cli/tests/integration/run_tests.rs
index 8db06470d..3fd013376 100644
--- a/cli/tests/integration/run_tests.rs
+++ b/cli/tests/integration/run_tests.rs
@@ -4939,3 +4939,25 @@ itest!(unstable_temporal_api_missing_flag {
http_server: false,
exit_code: 1,
});
+
+itest!(warn_on_deprecated_api {
+ args: "run -A run/warn_on_deprecated_api/main.js",
+ output: "run/warn_on_deprecated_api/main.out",
+ http_server: true,
+ exit_code: 0,
+});
+
+itest!(warn_on_deprecated_api_with_flag {
+ args: "run -A --quiet run/warn_on_deprecated_api/main.js",
+ output: "run/warn_on_deprecated_api/main_disabled_flag.out",
+ http_server: true,
+ exit_code: 0,
+});
+
+itest!(warn_on_deprecated_api_with_env_var {
+ args: "run -A run/warn_on_deprecated_api/main.js",
+ envs: vec![("DENO_NO_DEPRECATION_WARNINGS".to_string(), "1".to_string())],
+ output: "run/warn_on_deprecated_api/main_disabled_env.out",
+ http_server: true,
+ exit_code: 0,
+});
diff --git a/cli/tests/testdata/run/warn_on_deprecated_api/main.js b/cli/tests/testdata/run/warn_on_deprecated_api/main.js
new file mode 100644
index 000000000..a464be60a
--- /dev/null
+++ b/cli/tests/testdata/run/warn_on_deprecated_api/main.js
@@ -0,0 +1,32 @@
+import { runEcho as runEcho2 } from "http://localhost:4545/run/warn_on_deprecated_api/mod.ts";
+
+const p = Deno.run({
+ cmd: [
+ Deno.execPath(),
+ "eval",
+ "console.log('hello world')",
+ ],
+});
+await p.status();
+p.close();
+
+async function runEcho() {
+ const p = Deno.run({
+ cmd: [
+ Deno.execPath(),
+ "eval",
+ "console.log('hello world')",
+ ],
+ });
+ await p.status();
+ p.close();
+}
+
+await runEcho();
+await runEcho();
+
+for (let i = 0; i < 10; i++) {
+ await runEcho();
+}
+
+await runEcho2();
diff --git a/cli/tests/testdata/run/warn_on_deprecated_api/main.out b/cli/tests/testdata/run/warn_on_deprecated_api/main.out
new file mode 100644
index 000000000..984dbc291
--- /dev/null
+++ b/cli/tests/testdata/run/warn_on_deprecated_api/main.out
@@ -0,0 +1,72 @@
+Download http://localhost:4545/run/warn_on_deprecated_api/mod.ts
+Warning
+├ Use of deprecated "Deno.run()" API.
+│
+├ This API will be removed in Deno 2.0. Make sure to upgrade to a stable API before then.
+│
+├ Suggestion: Use "Deno.Command()" API instead.
+│
+└ Stack trace:
+ └─ at [WILDCARD]warn_on_deprecated_api/main.js:3:16
+
+hello world
+Warning
+├ Use of deprecated "Deno.run()" API.
+│
+├ This API will be removed in Deno 2.0. Make sure to upgrade to a stable API before then.
+│
+├ Suggestion: Use "Deno.Command()" API instead.
+│
+└ Stack trace:
+ ├─ at runEcho ([WILDCARD]warn_on_deprecated_api/main.js:14:18)
+ └─ at [WILDCARD]warn_on_deprecated_api/main.js:25:7
+
+hello world
+Warning
+├ Use of deprecated "Deno.run()" API.
+│
+├ This API will be removed in Deno 2.0. Make sure to upgrade to a stable API before then.
+│
+├ Suggestion: Use "Deno.Command()" API instead.
+│
+└ Stack trace:
+ ├─ at runEcho ([WILDCARD]warn_on_deprecated_api/main.js:14:18)
+ └─ at [WILDCARD]warn_on_deprecated_api/main.js:26:7
+
+hello world
+Warning
+├ Use of deprecated "Deno.run()" API.
+│
+├ This API will be removed in Deno 2.0. Make sure to upgrade to a stable API before then.
+│
+├ Suggestion: Use "Deno.Command()" API instead.
+│
+└ Stack trace:
+ ├─ at runEcho ([WILDCARD]warn_on_deprecated_api/main.js:14:18)
+ └─ at [WILDCARD]warn_on_deprecated_api/main.js:29:9
+
+hello world
+hello world
+hello world
+hello world
+hello world
+hello world
+hello world
+hello world
+hello world
+hello world
+Warning
+├ Use of deprecated "Deno.run()" API.
+│
+├ This API will be removed in Deno 2.0. Make sure to upgrade to a stable API before then.
+│
+├ Suggestion: Use "Deno.Command()" API instead.
+│
+├ Suggestion: It appears this API is used by a remote dependency.
+│ Try upgrading to the latest version of that dependency.
+│
+└ Stack trace:
+ ├─ at runEcho (http://localhost:4545/run/warn_on_deprecated_api/mod.ts:2:18)
+ └─ at [WILDCARD]warn_on_deprecated_api/main.js:32:7
+
+hello world
diff --git a/cli/tests/testdata/run/warn_on_deprecated_api/main_disabled_env.out b/cli/tests/testdata/run/warn_on_deprecated_api/main_disabled_env.out
new file mode 100644
index 000000000..ef85a6f99
--- /dev/null
+++ b/cli/tests/testdata/run/warn_on_deprecated_api/main_disabled_env.out
@@ -0,0 +1,15 @@
+Download http://localhost:4545/run/warn_on_deprecated_api/mod.ts
+hello world
+hello world
+hello world
+hello world
+hello world
+hello world
+hello world
+hello world
+hello world
+hello world
+hello world
+hello world
+hello world
+hello world
diff --git a/cli/tests/testdata/run/warn_on_deprecated_api/main_disabled_flag.out b/cli/tests/testdata/run/warn_on_deprecated_api/main_disabled_flag.out
new file mode 100644
index 000000000..ce3755d16
--- /dev/null
+++ b/cli/tests/testdata/run/warn_on_deprecated_api/main_disabled_flag.out
@@ -0,0 +1,14 @@
+hello world
+hello world
+hello world
+hello world
+hello world
+hello world
+hello world
+hello world
+hello world
+hello world
+hello world
+hello world
+hello world
+hello world
diff --git a/cli/tests/testdata/run/warn_on_deprecated_api/mod.ts b/cli/tests/testdata/run/warn_on_deprecated_api/mod.ts
new file mode 100644
index 000000000..f74632b2c
--- /dev/null
+++ b/cli/tests/testdata/run/warn_on_deprecated_api/mod.ts
@@ -0,0 +1,11 @@
+export async function runEcho() {
+ const p = Deno.run({
+ cmd: [
+ Deno.execPath(),
+ "eval",
+ "console.log('hello world')",
+ ],
+ });
+ await p.status();
+ p.close();
+}
diff --git a/cli/worker.rs b/cli/worker.rs
index 8c2eed0c6..4807e2699 100644
--- a/cli/worker.rs
+++ b/cli/worker.rs
@@ -125,6 +125,7 @@ struct SharedWorkerState {
maybe_lockfile: Option<Arc<Mutex<Lockfile>>>,
feature_checker: Arc<FeatureChecker>,
node_ipc: Option<i64>,
+ disable_deprecated_api_warning: bool,
}
impl SharedWorkerState {
@@ -405,6 +406,7 @@ impl CliMainWorkerFactory {
feature_checker: Arc<FeatureChecker>,
options: CliMainWorkerOptions,
node_ipc: Option<i64>,
+ disable_deprecated_api_warning: bool,
) -> Self {
Self {
shared: Arc::new(SharedWorkerState {
@@ -426,6 +428,7 @@ impl CliMainWorkerFactory {
maybe_lockfile,
feature_checker,
node_ipc,
+ disable_deprecated_api_warning,
}),
}
}
@@ -588,6 +591,7 @@ impl CliMainWorkerFactory {
.maybe_binary_npm_command_name
.clone(),
node_ipc_fd: shared.node_ipc,
+ disable_deprecated_api_warning: shared.disable_deprecated_api_warning,
},
extensions: custom_extensions,
startup_snapshot: crate::js::deno_isolate_init(),
@@ -786,6 +790,7 @@ fn create_web_worker_callback(
.maybe_binary_npm_command_name
.clone(),
node_ipc_fd: None,
+ disable_deprecated_api_warning: shared.disable_deprecated_api_warning,
},
extensions: vec![],
startup_snapshot: crate::js::deno_isolate_init(),