summaryrefslogtreecommitdiff
path: root/std/node/process.ts
diff options
context:
space:
mode:
Diffstat (limited to 'std/node/process.ts')
-rw-r--r--std/node/process.ts282
1 files changed, 215 insertions, 67 deletions
diff --git a/std/node/process.ts b/std/node/process.ts
index 5d6791fc4..419eb8cec 100644
--- a/std/node/process.ts
+++ b/std/node/process.ts
@@ -1,32 +1,109 @@
// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
import { notImplemented } from "./_utils.ts";
+import EventEmitter from "./events.ts";
+import { fromFileUrl } from "../path/mod.ts";
+
+const notImplementedEvents = [
+ "beforeExit",
+ "disconnect",
+ "message",
+ "multipleResolves",
+ "rejectionHandled",
+ "SIGBREAK",
+ "SIGBUS",
+ "SIGFPE",
+ "SIGHUP",
+ "SIGILL",
+ "SIGINT",
+ "SIGSEGV",
+ "SIGTERM",
+ "SIGWINCH",
+ "uncaughtException",
+ "uncaughtExceptionMonitor",
+ "unhandledRejection",
+ "warning",
+];
/** https://nodejs.org/api/process.html#process_process_arch */
export const arch = Deno.build.arch;
+function getArguments() {
+ return [Deno.execPath(), fromFileUrl(Deno.mainModule), ...Deno.args];
+}
+
+//deno-lint-ignore ban-ts-comment
+//@ts-ignore
+const _argv: {
+ [Deno.customInspect]: () => string;
+ [key: number]: string;
+} = [];
+
+Object.defineProperty(_argv, Deno.customInspect, {
+ enumerable: false,
+ configurable: false,
+ get: function () {
+ return getArguments();
+ },
+});
+
+/**
+ * https://nodejs.org/api/process.html#process_process_argv
+ * Read permissions are required in order to get the executable route
+ * */
+export const argv: Record<string, string> = new Proxy(_argv, {
+ get(target, prop) {
+ if (prop === Deno.customInspect) {
+ return target[Deno.customInspect];
+ }
+ return getArguments()[prop as number];
+ },
+ ownKeys() {
+ return Reflect.ownKeys(getArguments());
+ },
+});
+
/** https://nodejs.org/api/process.html#process_process_chdir_directory */
export const chdir = Deno.chdir;
/** https://nodejs.org/api/process.html#process_process_cwd */
export const cwd = Deno.cwd;
-/** https://nodejs.org/api/process.html#process_process_exit_code */
-export const exit = Deno.exit;
+//deno-lint-ignore ban-ts-comment
+//@ts-ignore
+const _env: {
+ [Deno.customInspect]: () => string;
+} = {};
-/** https://nodejs.org/api/process.html#process_process_pid */
-export const pid = Deno.pid;
-
-/** https://nodejs.org/api/process.html#process_process_platform */
-export const platform = Deno.build.os === "windows" ? "win32" : Deno.build.os;
+Object.defineProperty(_env, Deno.customInspect, {
+ enumerable: false,
+ configurable: false,
+ get: function () {
+ return Deno.env.toObject();
+ },
+});
-/** https://nodejs.org/api/process.html#process_process_version */
-export const version = `v${Deno.version.deno}`;
+/**
+ * https://nodejs.org/api/process.html#process_process_env
+ * Requires env permissions
+ * */
+export const env: Record<string, string> = new Proxy(_env, {
+ get(target, prop) {
+ if (prop === Deno.customInspect) {
+ return target[Deno.customInspect];
+ }
+ return Deno.env.get(String(prop));
+ },
+ ownKeys() {
+ return Reflect.ownKeys(Deno.env.toObject());
+ },
+ set(_target, prop, value) {
+ Deno.env.set(String(prop), String(value));
+ return value;
+ },
+});
-/** https://nodejs.org/api/process.html#process_process_versions */
-export const versions = {
- node: Deno.version.deno,
- ...Deno.version,
-};
+/** https://nodejs.org/api/process.html#process_process_exit_code */
+export const exit = Deno.exit;
/** https://nodejs.org/api/process.html#process_process_nexttick_callback_args */
export function nextTick(this: unknown, cb: () => void): void;
@@ -47,17 +124,103 @@ export function nextTick<T extends Array<unknown>>(
}
}
-/** https://nodejs.org/api/process.html#process_process */
-// @deprecated `import { process } from 'process'` for backwards compatibility with old deno versions
-export const process = {
- arch,
- chdir,
- cwd,
- exit,
- pid,
- platform,
- version,
- versions,
+/** https://nodejs.org/api/process.html#process_process_pid */
+export const pid = Deno.pid;
+
+/** https://nodejs.org/api/process.html#process_process_platform */
+export const platform = Deno.build.os === "windows" ? "win32" : Deno.build.os;
+
+/** https://nodejs.org/api/process.html#process_process_version */
+export const version = `v${Deno.version.deno}`;
+
+/** https://nodejs.org/api/process.html#process_process_versions */
+export const versions = {
+ node: Deno.version.deno,
+ ...Deno.version,
+};
+
+class Process extends EventEmitter {
+ constructor() {
+ super();
+
+ //This causes the exit event to be binded to the unload event
+ window.addEventListener("unload", () => {
+ //TODO(Soremwar)
+ //Get the exit code from the unload event
+ super.emit("exit", 0);
+ });
+ }
+
+ /** https://nodejs.org/api/process.html#process_process_arch */
+ arch = arch;
+
+ /**
+ * https://nodejs.org/api/process.html#process_process_argv
+ * Read permissions are required in order to get the executable route
+ * */
+ argv = argv;
+
+ /** https://nodejs.org/api/process.html#process_process_chdir_directory */
+ chdir = chdir;
+
+ /** https://nodejs.org/api/process.html#process_process_cwd */
+ cwd = cwd;
+
+ /** https://nodejs.org/api/process.html#process_process_exit_code */
+ exit = exit;
+
+ /**
+ * https://nodejs.org/api/process.html#process_process_env
+ * Requires env permissions
+ * */
+ env = env;
+
+ /** https://nodejs.org/api/process.html#process_process_nexttick_callback_args */
+ nextTick = nextTick;
+
+ /** https://nodejs.org/api/process.html#process_process_events */
+ //deno-lint-ignore ban-types
+ on(event: typeof notImplementedEvents[number], listener: Function): never;
+ on(event: "exit", listener: (code: number) => void): this;
+ //deno-lint-ignore no-explicit-any
+ on(event: string, listener: (...args: any[]) => void): this {
+ if (notImplementedEvents.includes(event)) {
+ notImplemented();
+ }
+
+ super.on(event, listener);
+
+ return this;
+ }
+
+ /** https://nodejs.org/api/process.html#process_process_pid */
+ pid = pid;
+
+ /** https://nodejs.org/api/process.html#process_process_platform */
+ platform = platform;
+
+ removeAllListeners(_event: string): never {
+ notImplemented();
+ }
+
+ removeListener(
+ event: typeof notImplementedEvents[number],
+ //deno-lint-ignore ban-types
+ listener: Function,
+ ): never;
+ removeListener(event: "exit", listener: (code: number) => void): this;
+ //deno-lint-ignore no-explicit-any
+ removeListener(event: string, listener: (...args: any[]) => void): this {
+ if (notImplementedEvents.includes(event)) {
+ notImplemented();
+ }
+
+ super.removeListener("exit", listener);
+
+ return this;
+ }
+
+ /** https://nodejs.org/api/process.html#process_process_stderr */
get stderr() {
return {
fd: Deno.stderr.rid,
@@ -79,7 +242,9 @@ export const process = {
notImplemented();
},
};
- },
+ }
+
+ /** https://nodejs.org/api/process.html#process_process_stdin */
get stdin() {
return {
fd: Deno.stdin.rid,
@@ -96,7 +261,9 @@ export const process = {
notImplemented();
},
};
- },
+ }
+
+ /** https://nodejs.org/api/process.html#process_process_stdout */
get stdout() {
return {
fd: Deno.stdout.rid,
@@ -118,49 +285,17 @@ export const process = {
notImplemented();
},
};
- },
-
- /** https://nodejs.org/api/process.html#process_process_events */
- // on is not exported by node, it is only available within process:
- // node --input-type=module -e "import { on } from 'process'; console.log(on)"
- // deno-lint-ignore ban-types
- on(_event: string, _callback: Function): void {
- // TODO(rsp): to be implemented
- notImplemented();
- },
-
- /** https://nodejs.org/api/process.html#process_process_argv */
- get argv(): string[] {
- // 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();
- },
- nextTick,
-};
+ }
-/**
- * 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, {});
+ /** https://nodejs.org/api/process.html#process_process_version */
+ version = version;
-/**
- * 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, {});
+ /** https://nodejs.org/api/process.html#process_process_versions */
+ versions = versions;
+}
-// import process from './std/node/process.ts'
-export default process;
+/** https://nodejs.org/api/process.html#process_process */
+const process = new Process();
Object.defineProperty(process, Symbol.toStringTag, {
enumerable: false,
@@ -168,3 +303,16 @@ Object.defineProperty(process, Symbol.toStringTag, {
configurable: false,
value: "process",
});
+
+export const removeListener = process.removeListener;
+export const removeAllListeners = process.removeAllListeners;
+export const stderr = process.stderr;
+export const stdin = process.stdin;
+export const stdout = process.stdout;
+
+export default process;
+
+//TODO(Soremwar)
+//Remove on 1.0
+//Kept for backwars compatibility with std
+export { process };