1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2025-01-03 12:58:54 -05:00

BREAKING: Map-like interface for Deno.env (#4942)

This commit is contained in:
Valentin Anger 2020-04-29 20:48:19 +02:00 committed by GitHub
parent 17cf2ecdac
commit 721a4ad59d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 53 additions and 58 deletions

View file

@ -116,29 +116,35 @@ declare namespace Deno {
*/
export function exit(code?: number): never;
/** Returns a snapshot of the environment variables at invocation. Changing a
* property in the object will set that variable in the environment for the
* process. The environment object will only accept `string`s as values.
*
* const myEnv = Deno.env();
* console.log(myEnv.SHELL);
* myEnv.TEST_VAR = "HELLO";
* const newEnv = Deno.env();
* console.log(myEnv.TEST_VAR === newEnv.TEST_VAR); // outputs "true"
*
* Requires `allow-env` permission. */
export function env(): {
[index: string]: string;
};
export const env: {
/** Retrieve the value of an environment variable. Returns undefined if that
* key doesn't exist.
*
* console.log(Deno.env.get("HOME")); // e.g. outputs "/home/alice"
* console.log(Deno.env.get("MADE_UP_VAR")); // outputs "Undefined"
*
* Requires `allow-env` permission. */
get(key: string): string | undefined;
/** Retrieve the value of an environment variable. Returns undefined if that
* key doesn't exist.
*
* console.log(Deno.env("HOME")); // e.g. outputs "/home/alice"
* console.log(Deno.env("MADE_UP_VAR")); // outputs "Undefined"
*
* Requires `allow-env` permission. */
export function env(key: string): string | undefined;
/** Set the value of an environment variable.
*
* Deno.env.set("SOME_VAR", "Value"));
* Deno.env.get("SOME_VAR"); // outputs "Value"
*
* Requires `allow-env` permission. */
set(key: string, value: string): void;
/** Returns a snapshot of the environment variables at invocation.
*
* Deno.env.set("TEST_VAR", "A");
* const myEnv = Deno.env.toObject();
* console.log(myEnv.SHELL);
* Deno.env.set("TEST_VAR", "B");
* console.log(myEnv.TEST_VAR); // outputs "A"
*
* Requires `allow-env` permission. */
toObject(): { [index: string]: string };
};
/** **UNSTABLE** */
export type DirKind =

View file

@ -27,22 +27,13 @@ function getEnv(key: string): string | undefined {
return sendSync("op_get_env", { key })[0];
}
export function env(): { [index: string]: string };
export function env(key: string): string | undefined;
export function env(
key?: string
): { [index: string]: string } | string | undefined {
if (key) {
return getEnv(key);
}
const env = sendSync("op_env");
return new Proxy(env, {
set(obj, prop: string, value: string): boolean {
setEnv(prop, value);
return Reflect.set(obj, prop, value);
},
});
}
export const env = {
get: getEnv,
toObject(): { [key: string]: string } {
return sendSync("op_env");
},
set: setEnv,
};
type DirKind =
| "home"

View file

@ -8,24 +8,22 @@ import {
} from "./test_util.ts";
unitTest({ perms: { env: true } }, function envSuccess(): void {
const env = Deno.env();
assert(env !== null);
// eslint-disable-next-line @typescript-eslint/camelcase
env.test_var = "Hello World";
const newEnv = Deno.env();
assertEquals(env.test_var, newEnv.test_var);
assertEquals(Deno.env("test_var"), env.test_var);
Deno.env.set("TEST_VAR", "A");
const env = Deno.env.toObject();
Deno.env.set("TEST_VAR", "B");
assertEquals(env["TEST_VAR"], "A");
assertNotEquals(Deno.env.get("TEST_VAR"), env["TEST_VAR"]);
});
unitTest({ perms: { env: true } }, function envNotFound(): void {
const r = Deno.env("env_var_does_not_exist!");
const r = Deno.env.get("env_var_does_not_exist!");
assertEquals(r, undefined);
});
unitTest(function envPermissionDenied1(): void {
let err;
try {
Deno.env();
Deno.env.toObject();
} catch (e) {
err = e;
}
@ -37,7 +35,7 @@ unitTest(function envPermissionDenied1(): void {
unitTest(function envPermissionDenied2(): void {
let err;
try {
Deno.env("PATH");
Deno.env.get("PATH");
} catch (e) {
err = e;
}
@ -62,7 +60,7 @@ unitTest(
): Promise<void> => {
const src = `
console.log(
${JSON.stringify(Object.keys(expectedEnv))}.map(k => Deno.env(k))
${JSON.stringify(Object.keys(expectedEnv))}.map(k => Deno.env.get(k))
)`;
const proc = Deno.run({
cmd: [Deno.execPath(), "eval", src],
@ -79,8 +77,8 @@ unitTest(
proc.close();
};
assertEquals(Deno.env("path"), Deno.env("PATH"));
assertEquals(Deno.env("Path"), Deno.env("PATH"));
assertEquals(Deno.env.get("path"), Deno.env.get("PATH"));
assertEquals(Deno.env.get("Path"), Deno.env.get("PATH"));
// Check 'foo', 'Foo' and 'Foo' are case folded.
await checkChildEnv({ foo: "X" }, { foo: "X", Foo: "X", FOO: "X" });

View file

@ -11,7 +11,7 @@ const test: { [key: string]: Function } = {
makeTempDirSync();
},
envRequired(): void {
env().home;
env.get("home");
},
netRequired(): void {
listen({ transport: "tcp", port: 4541 });

View file

@ -7,7 +7,7 @@ function pathBase(p: string): string {
return parts[parts.length - 1];
}
const token = Deno.env()["GIST_TOKEN"];
const token = Deno.env.get("GIST_TOKEN");
if (!token) {
console.error("GIST_TOKEN environmental variable not set.");
console.error("Get a token here: https://github.com/settings/tokens");

View file

@ -534,8 +534,8 @@ class Module {
}
static _initPaths(): void {
const homeDir = Deno.env("HOME");
const nodePath = Deno.env("NODE_PATH");
const homeDir = Deno.env.get("HOME");
const nodePath = Deno.env.get("NODE_PATH");
// Removed $PREFIX/bin/node case

View file

@ -30,7 +30,7 @@ export const process = {
on,
get env(): { [index: string]: string } {
// using getter to avoid --allow-env unless it's used
return Deno.env();
return Deno.env.toObject();
},
get argv(): string[] {
// Deno.execPath() also requires --allow-env

View file

@ -3,7 +3,7 @@ import { assert, assertThrows, assertEquals } from "../testing/asserts.ts";
import { process } from "./process.ts";
// NOTE: Deno.execPath() (and thus process.argv) currently requires --allow-env
// (Also Deno.env() (and process.env) requires --allow-env but it's more obvious)
// (Also Deno.env.toObject() (and process.env) requires --allow-env but it's more obvious)
test({
name: "process.cwd and process.chdir success",

View file

@ -39,7 +39,7 @@ export function resolve(...pathSegments: string[]): string {
// absolute path, get cwd for that drive, or the process cwd if
// the drive cwd is not available. We're sure the device is not
// a UNC path at this points, because UNC paths are always absolute.
path = env()[`=${resolvedDevice}`] || cwd();
path = env.get(`=${resolvedDevice}`) || cwd();
// Verify that a cwd was found and that it actually points
// to our drive. If not, default to the drive's root.