File
Blob: src/node/console.ts
| 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 | |
| 8 | import { ERR_METHOD_NOT_IMPLEMENTED } from 'node-internal:internal_errors'; |
| 9 | import processImpl from 'node-internal:public_process'; |
| 10 | import type { Console as _Console, ConsoleOptions } from 'node:console'; |
| 11 | |
| 12 | const 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. |
| 18 | const 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 | |
| 27 | globalConsole._times = new Map<string, number>(); |
| 28 | globalConsole._ignoreErrors = true; |
| 29 | globalConsole._stderrErrorHandler = noop; |
| 30 | globalConsole._stdoutErrorHandler = noop; |
| 31 | |
| 32 | // We have this assertion because node-internal:public_process has undefined as the type |
| 33 | globalConsole._stderr = processImpl.stderr as unknown as NodeJS.WritableStream; |
| 34 | globalConsole._stdout = processImpl.stdout as unknown as NodeJS.WritableStream; |
| 35 | |
| 36 | export 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. |
| 45 | globalConsole.Console = Console; |
| 46 | |
| 47 | export const log = console.log.bind(console); |
| 48 | Console.prototype.log = log; |
| 49 | export const info = console.info.bind(console); |
| 50 | Console.prototype.info = info; |
| 51 | export const debug = console.debug.bind(console); |
| 52 | Console.prototype.debug = debug; |
| 53 | export const warn = console.warn.bind(console); |
| 54 | Console.prototype.warn = warn; |
| 55 | export const error = console.error.bind(console); |
| 56 | Console.prototype.error = error; |
| 57 | export const dir = console.dir.bind(console); |
| 58 | Console.prototype.dir = dir; |
| 59 | export const time = console.time.bind(console); |
| 60 | Console.prototype.time = time; |
| 61 | export const timeEnd = console.timeEnd.bind(console); |
| 62 | Console.prototype.timeEnd = timeEnd; |
| 63 | export const timeLog = console.timeLog.bind(console); |
| 64 | Console.prototype.timeLog = timeLog; |
| 65 | export const trace = console.trace.bind(console); |
| 66 | Console.prototype.trace = trace; |
| 67 | export const assert = console.assert.bind(console); |
| 68 | Console.prototype.assert = assert; |
| 69 | export const clear = console.clear.bind(console); |
| 70 | Console.prototype.clear = clear; |
| 71 | export const count = console.count.bind(console); |
| 72 | Console.prototype.count = count; |
| 73 | export const countReset = console.countReset.bind(console); |
| 74 | Console.prototype.countReset = countReset; |
| 75 | export const group = console.group.bind(console); |
| 76 | Console.prototype.group = group; |
| 77 | export const groupEnd = console.groupEnd.bind(console); |
| 78 | Console.prototype.groupEnd = groupEnd; |
| 79 | export const table = console.table.bind(console); |
| 80 | Console.prototype.table = table; |
| 81 | |
| 82 | export const dirxml = console.dirxml.bind(console); |
| 83 | Console.prototype.dirxml = dirxml; |
| 84 | export const groupCollapsed = console.groupCollapsed.bind(console); |
| 85 | Console.prototype.groupCollapsed = groupCollapsed; |
| 86 | export const profile = console.profile.bind(console); |
| 87 | Console.prototype.profile = profile; |
| 88 | export const profileEnd = console.profileEnd.bind(console); |
| 89 | Console.prototype.profileEnd = profileEnd; |
| 90 | export const timeStamp = console.timeStamp.bind(console); |
| 91 | Console.prototype.timeStamp = timeStamp; |
| 92 | |
| 93 | export function context(): void { |
| 94 | throw new ERR_METHOD_NOT_IMPLEMENTED('Console.context'); |
| 95 | } |
| 96 | // @ts-expect-error TS2339 This is intentional. |
| 97 | globalConsole.context = context; |
| 98 | Console.prototype.context = context; |
| 99 | |
| 100 | export function createTask(): void { |
| 101 | throw new ERR_METHOD_NOT_IMPLEMENTED('Console.createTask'); |
| 102 | } |
| 103 | // @ts-expect-error TS2339 This is intentional. |
| 104 | globalConsole.createTask = createTask; |
| 105 | Console.prototype.createTask = createTask; |
| 106 | |
| 107 | export default globalConsole; |