From 16038b8f82d0f3f610d97d721c39d6585fe90295 Mon Sep 17 00:00:00 2001 From: Benjamin Lupton Date: Thu, 25 Jun 2020 21:18:01 +1000 Subject: [PATCH] fix(std/node/process): env, argv exports (#6455) The promise approach still required permissions to be specified at initialisation, rather than at request. Using a Proxy instance solves this permission issue. The Proxy instance approach also eliminates the need for the await. Achieving direct compatibility with Node.js. /ref pr #6392 /ref commit d16337cc9c59732fe81655482e08b72d844472e6 --- std/node/process.ts | 51 ++++++++++++++++++++++------------------ std/node/process_test.ts | 8 +++---- 2 files changed, 32 insertions(+), 27 deletions(-) diff --git a/std/node/process.ts b/std/node/process.ts index 12cd1b4a94..ce5f828c07 100644 --- a/std/node/process.ts +++ b/std/node/process.ts @@ -28,7 +28,7 @@ export const versions = { }; /** https://nodejs.org/api/process.html#process_process */ -// @deprecated exported only for backwards compatibility with old deno versions +// @deprecated `import { process } from 'process'` for backwards compatibility with old deno versions export const process = { arch, chdir, @@ -40,43 +40,48 @@ export const process = { versions, /** https://nodejs.org/api/process.html#process_process_events */ - // node --input-type=module -e "import {on} from 'process'; console.log(on)" - // on is not exported by node, it is only available within process + // on is not exported by node, it is only available within process: + // node --input-type=module -e "import { on } from 'process'; console.log(on)" on(_event: string, _callback: Function): void { // TODO(rsp): to be implemented notImplemented(); }, - /** https://nodejs.org/api/process.html#process_process_env */ - get env(): { [index: string]: string } { - // using getter to avoid --allow-env unless it's used - return Deno.env.toObject(); - }, - /** https://nodejs.org/api/process.html#process_process_argv */ get argv(): string[] { - // Deno.execPath() also requires --allow-env + // Getter delegates --allow-env and --allow-read until request + // Getter also allows the export Proxy instance to function as intended return [Deno.execPath(), ...Deno.args]; }, + + /** https://nodejs.org/api/process.html#process_process_env */ + get env(): { [index: string]: string } { + // Getter delegates --allow-env and --allow-read until request + // Getter also allows the export Proxy instance to function as intended + return Deno.env.toObject(); + }, }; -// define the type for configuring the env and argv promises -// as well as for the global.process declaration -type Process = typeof process; +/** + * https://nodejs.org/api/process.html#process_process_argv + * @example `import { argv } from './std/node/process.ts'; console.log(argv)` + */ +// Proxy delegates --allow-env and --allow-read to request time, even for exports +export const argv = new Proxy(process.argv, {}); -/** requires the use of await for compatibility with deno */ -export const env = new Promise((resolve) => - resolve(process.env) -); +/** + * https://nodejs.org/api/process.html#process_process_env + * @example `import { env } from './std/node/process.ts'; console.log(env)` + */ +// Proxy delegates --allow-env and --allow-read to request time, even for exports +export const env = new Proxy(process.env, {}); -/** requires the use of await for compatibility with deno */ -export const argv = new Promise((resolve) => - resolve(process.argv) -); - -/** use this for access to `process.env` and `process.argv` without the need for await */ +// import process from './std/node/process.ts' export default process; +// Define the type for the global declration +type Process = typeof process; + Object.defineProperty(process, Symbol.toStringTag, { enumerable: false, writable: true, diff --git a/std/node/process_test.ts b/std/node/process_test.ts index 043a954f8c..c4332af335 100644 --- a/std/node/process_test.ts +++ b/std/node/process_test.ts @@ -102,9 +102,9 @@ Deno.test({ Deno.test({ name: "process.argv", - async fn() { + fn() { assert(Array.isArray(process.argv)); - assert(Array.isArray(await argv)); + assert(Array.isArray(argv)); assert( process.argv[0].match(/[^/\\]*deno[^/\\]*$/), "deno included in the file name of argv[0]" @@ -115,8 +115,8 @@ Deno.test({ Deno.test({ name: "process.env", - async fn() { + fn() { assertEquals(typeof process.env.PATH, "string"); - assertEquals(typeof (await env).PATH, "string"); + assertEquals(typeof env.PATH, "string"); }, });