Skip to content
File

Blob: src/node/console.ts

typescript108 lines
1// Copyright (c) 2017-2022 Cloudflare, Inc.
2// Licensed under the Apache 2.0 license found in the LICENSE file or at:
3// https://opensource.org/licenses/Apache-2.0
4// Copyright Joyent and Node contributors. All rights reserved. MIT license.
5 
6/* eslint-disable @typescript-eslint/no-unsafe-member-access */
7 
8import { ERR_METHOD_NOT_IMPLEMENTED } from 'node-internal:internal_errors';
9import processImpl from 'node-internal:public_process';
10import type { Console as _Console, ConsoleOptions } from 'node:console';
11 
12const noop: VoidFunction = () => {};
13 
14// TODO(soon): This class is Node.js compatible but globalThis.console is not.
15// This is because globalThis.console is provided by the v8 runtime.
16// We need to find a way to patch and add createTask and context methods whenever
17// `enable_nodejs_console_module` flag is enabled.
18const globalConsole = globalThis.console as typeof globalThis.console & {
19 _times: Map<string, number>;
20 _ignoreErrors: boolean;
21 _stderrErrorHandler: () => void;
22 _stdoutErrorHandler: () => void;
23 _stderr: NodeJS.WritableStream;
24 _stdout: NodeJS.WritableStream;
25};
26 
27globalConsole._times = new Map<string, number>();
28globalConsole._ignoreErrors = true;
29globalConsole._stderrErrorHandler = noop;
30globalConsole._stdoutErrorHandler = noop;
31 
32// We have this assertion because node-internal:public_process has undefined as the type
33globalConsole._stderr = processImpl.stderr as unknown as NodeJS.WritableStream;
34globalConsole._stdout = processImpl.stdout as unknown as NodeJS.WritableStream;
35 
36export function Console(_options: ConsoleOptions): Console {
37 throw new ERR_METHOD_NOT_IMPLEMENTED('Console');
38}
39// We want to make sure the following works:
40// ```js
41// import mod from 'node:console`;
42// new mod.Console(...)
43// ```
44// @ts-expect-error TS2322 This is intentional.
45globalConsole.Console = Console;
46 
47export const log = console.log.bind(console);
48Console.prototype.log = log;
49export const info = console.info.bind(console);
50Console.prototype.info = info;
51export const debug = console.debug.bind(console);
52Console.prototype.debug = debug;
53export const warn = console.warn.bind(console);
54Console.prototype.warn = warn;
55export const error = console.error.bind(console);
56Console.prototype.error = error;
57export const dir = console.dir.bind(console);
58Console.prototype.dir = dir;
59export const time = console.time.bind(console);
60Console.prototype.time = time;
61export const timeEnd = console.timeEnd.bind(console);
62Console.prototype.timeEnd = timeEnd;
63export const timeLog = console.timeLog.bind(console);
64Console.prototype.timeLog = timeLog;
65export const trace = console.trace.bind(console);
66Console.prototype.trace = trace;
67export const assert = console.assert.bind(console);
68Console.prototype.assert = assert;
69export const clear = console.clear.bind(console);
70Console.prototype.clear = clear;
71export const count = console.count.bind(console);
72Console.prototype.count = count;
73export const countReset = console.countReset.bind(console);
74Console.prototype.countReset = countReset;
75export const group = console.group.bind(console);
76Console.prototype.group = group;
77export const groupEnd = console.groupEnd.bind(console);
78Console.prototype.groupEnd = groupEnd;
79export const table = console.table.bind(console);
80Console.prototype.table = table;
81 
82export const dirxml = console.dirxml.bind(console);
83Console.prototype.dirxml = dirxml;
84export const groupCollapsed = console.groupCollapsed.bind(console);
85Console.prototype.groupCollapsed = groupCollapsed;
86export const profile = console.profile.bind(console);
87Console.prototype.profile = profile;
88export const profileEnd = console.profileEnd.bind(console);
89Console.prototype.profileEnd = profileEnd;
90export const timeStamp = console.timeStamp.bind(console);
91Console.prototype.timeStamp = timeStamp;
92 
93export function context(): void {
94 throw new ERR_METHOD_NOT_IMPLEMENTED('Console.context');
95}
96// @ts-expect-error TS2339 This is intentional.
97globalConsole.context = context;
98Console.prototype.context = context;
99 
100export function createTask(): void {
101 throw new ERR_METHOD_NOT_IMPLEMENTED('Console.createTask');
102}
103// @ts-expect-error TS2339 This is intentional.
104globalConsole.createTask = createTask;
105Console.prototype.createTask = createTask;
106 
107export default globalConsole;