summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTuan Le <23419763+tumile@users.noreply.github.com>2020-06-09 08:58:30 -0400
committerGitHub <noreply@github.com>2020-06-09 14:58:30 +0200
commit878f306a39812eb71e31cc4dd6e8e0b313c3cecb (patch)
tree6034aa77561d5b1fec0c6b5c25b066506e51d255
parent44251ce8eaa0def807b9867f73ee23adfb539487 (diff)
feat(cli): Add Deno.env.delete() (#5859)
-rw-r--r--cli/js/lib.deno.ns.d.ts10
-rw-r--r--cli/js/ops/os.ts5
-rw-r--r--cli/ops/os.rs17
-rw-r--r--cli/tests/unit/os_test.ts7
4 files changed, 39 insertions, 0 deletions
diff --git a/cli/js/lib.deno.ns.d.ts b/cli/js/lib.deno.ns.d.ts
index c79007ebd..972405680 100644
--- a/cli/js/lib.deno.ns.d.ts
+++ b/cli/js/lib.deno.ns.d.ts
@@ -130,6 +130,16 @@ declare namespace Deno {
* Requires `allow-env` permission. */
set(key: string, value: string): void;
+ /** Delete the value of an environment variable.
+ *
+ * ```ts
+ * Deno.env.set("SOME_VAR", "Value"));
+ * Deno.env.delete("SOME_VAR"); // outputs "Undefined"
+ * ```
+ *
+ * Requires `allow-env` permission. */
+ delete(key: string): void;
+
/** Returns a snapshot of the environment variables at invocation.
*
* ```ts
diff --git a/cli/js/ops/os.ts b/cli/js/ops/os.ts
index 30aa6d0d4..e63d8b358 100644
--- a/cli/js/ops/os.ts
+++ b/cli/js/ops/os.ts
@@ -27,12 +27,17 @@ function getEnv(key: string): string | undefined {
return sendSync("op_get_env", { key })[0];
}
+function deleteEnv(key: string): void {
+ sendSync("op_delete_env", { key });
+}
+
export const env = {
get: getEnv,
toObject(): { [key: string]: string } {
return sendSync("op_env");
},
set: setEnv,
+ delete: deleteEnv,
};
type DirKind =
diff --git a/cli/ops/os.rs b/cli/ops/os.rs
index 36cd99577..ab7ed2876 100644
--- a/cli/ops/os.rs
+++ b/cli/ops/os.rs
@@ -15,6 +15,7 @@ pub fn init(i: &mut CoreIsolate, s: &State) {
i.register_op("op_exec_path", s.stateful_json_op(op_exec_path));
i.register_op("op_set_env", s.stateful_json_op(op_set_env));
i.register_op("op_get_env", s.stateful_json_op(op_get_env));
+ i.register_op("op_delete_env", s.stateful_json_op(op_delete_env));
i.register_op("op_get_dir", s.stateful_json_op(op_get_dir));
i.register_op("op_hostname", s.stateful_json_op(op_hostname));
i.register_op("op_loadavg", s.stateful_json_op(op_loadavg));
@@ -138,6 +139,22 @@ fn op_get_env(
}
#[derive(Deserialize)]
+struct DeleteEnv {
+ key: String,
+}
+
+fn op_delete_env(
+ state: &State,
+ args: Value,
+ _zero_copy: &mut [ZeroCopyBuf],
+) -> Result<JsonOp, OpError> {
+ let args: DeleteEnv = serde_json::from_value(args)?;
+ state.check_env()?;
+ env::remove_var(args.key);
+ Ok(JsonOp::Sync(json!({})))
+}
+
+#[derive(Deserialize)]
struct Exit {
code: i32,
}
diff --git a/cli/tests/unit/os_test.ts b/cli/tests/unit/os_test.ts
index 72c88b0e1..9698692c7 100644
--- a/cli/tests/unit/os_test.ts
+++ b/cli/tests/unit/os_test.ts
@@ -20,6 +20,13 @@ unitTest({ perms: { env: true } }, function envNotFound(): void {
assertEquals(r, undefined);
});
+unitTest({ perms: { env: true } }, function deleteEnv(): void {
+ Deno.env.set("TEST_VAR", "A");
+ assertEquals(Deno.env.get("TEST_VAR"), "A");
+ assertEquals(Deno.env.delete("TEST_VAR"), undefined);
+ assertEquals(Deno.env.get("TEST_VAR"), undefined);
+});
+
unitTest(function envPermissionDenied1(): void {
let err;
try {