// deno-fmt-ignore-file // deno-lint-ignore-file // Copyright Joyent and Node contributors. All rights reserved. MIT license. // Taken from Node 18.12.1 // This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually 'use strict'; require('../common'); const assert = require('assert'); const { Console } = require('console'); const queue = []; const console = new Console({ write: (x) => { queue.push(x); }, removeListener: () => {} }, process.stderr, false); function test(data, only, expected) { if (arguments.length === 2) { expected = only; only = undefined; } console.table(data, only); assert.deepStrictEqual( queue.shift().split('\n'), expected.trimLeft().split('\n') ); } assert.throws(() => console.table([], false), { code: 'ERR_INVALID_ARG_TYPE', }); test(null, 'null\n'); test(undefined, 'undefined\n'); test(false, 'false\n'); test('hi', 'hi\n'); test(Symbol(), 'Symbol()\n'); test(function() {}, '[Function (anonymous)]\n'); test([1, 2, 3], ` ┌─────────┬────────┐ │ (index) │ Values │ ├─────────┼────────┤ │ 0 │ 1 │ │ 1 │ 2 │ │ 2 │ 3 │ └─────────┴────────┘ `); test([Symbol(), 5, [10]], ` ┌─────────┬────┬──────────┐ │ (index) │ 0 │ Values │ ├─────────┼────┼──────────┤ │ 0 │ │ Symbol() │ │ 1 │ │ 5 │ │ 2 │ 10 │ │ └─────────┴────┴──────────┘ `); test([null, 5], ` ┌─────────┬────────┐ │ (index) │ Values │ ├─────────┼────────┤ │ 0 │ null │ │ 1 │ 5 │ └─────────┴────────┘ `); test([undefined, 5], ` ┌─────────┬───────────┐ │ (index) │ Values │ ├─────────┼───────────┤ │ 0 │ undefined │ │ 1 │ 5 │ └─────────┴───────────┘ `); test({ a: 1, b: Symbol(), c: [10] }, ` ┌─────────┬────┬──────────┐ │ (index) │ 0 │ Values │ ├─────────┼────┼──────────┤ │ a │ │ 1 │ │ b │ │ Symbol() │ │ c │ 10 │ │ └─────────┴────┴──────────┘ `); test(new Map([ ['a', 1], [Symbol(), [2]] ]), ` ┌───────────────────┬──────────┬────────┐ │ (iteration index) │ Key │ Values │ ├───────────────────┼──────────┼────────┤ │ 0 │ 'a' │ 1 │ │ 1 │ Symbol() │ [ 2 ] │ └───────────────────┴──────────┴────────┘ `); test(new Set([1, 2, Symbol()]), ` ┌───────────────────┬──────────┐ │ (iteration index) │ Values │ ├───────────────────┼──────────┤ │ 0 │ 1 │ │ 1 │ 2 │ │ 2 │ Symbol() │ └───────────────────┴──────────┘ `); test({ a: 1, b: 2 }, ['a'], ` ┌─────────┬───┐ │ (index) │ a │ ├─────────┼───┤ │ a │ │ │ b │ │ └─────────┴───┘ `); test([{ a: 1, b: 2 }, { a: 3, c: 4 }], ['a'], ` ┌─────────┬───┐ │ (index) │ a │ ├─────────┼───┤ │ 0 │ 1 │ │ 1 │ 3 │ └─────────┴───┘ `); test(new Map([[1, 1], [2, 2], [3, 3]]).entries(), ` ┌───────────────────┬─────┬────────┐ │ (iteration index) │ Key │ Values │ ├───────────────────┼─────┼────────┤ │ 0 │ 1 │ 1 │ │ 1 │ 2 │ 2 │ │ 2 │ 3 │ 3 │ └───────────────────┴─────┴────────┘ `); test(new Map([[1, 1], [2, 2], [3, 3]]).values(), ` ┌───────────────────┬────────┐ │ (iteration index) │ Values │ ├───────────────────┼────────┤ │ 0 │ 1 │ │ 1 │ 2 │ │ 2 │ 3 │ └───────────────────┴────────┘ `); test(new Map([[1, 1], [2, 2], [3, 3]]).keys(), ` ┌───────────────────┬────────┐ │ (iteration index) │ Values │ ├───────────────────┼────────┤ │ 0 │ 1 │ │ 1 │ 2 │ │ 2 │ 3 │ └───────────────────┴────────┘ `); test(new Set([1, 2, 3]).values(), ` ┌───────────────────┬────────┐ │ (iteration index) │ Values │ ├───────────────────┼────────┤ │ 0 │ 1 │ │ 1 │ 2 │ │ 2 │ 3 │ └───────────────────┴────────┘ `); test({ a: { a: 1, b: 2, c: 3 } }, ` ┌─────────┬───┬───┬───┐ │ (index) │ a │ b │ c │ ├─────────┼───┼───┼───┤ │ a │ 1 │ 2 │ 3 │ └─────────┴───┴───┴───┘ `); test({ a: { a: { a: 1, b: 2, c: 3 } } }, ` ┌─────────┬──────────┐ │ (index) │ a │ ├─────────┼──────────┤ │ a │ [Object] │ └─────────┴──────────┘ `); test({ a: [1, 2] }, ` ┌─────────┬───┬───┐ │ (index) │ 0 │ 1 │ ├─────────┼───┼───┤ │ a │ 1 │ 2 │ └─────────┴───┴───┘ `); test({ a: [1, 2, 3, 4, 5], b: 5, c: { e: 5 } }, ` ┌─────────┬───┬───┬───┬───┬───┬───┬────────┐ │ (index) │ 0 │ 1 │ 2 │ 3 │ 4 │ e │ Values │ ├─────────┼───┼───┼───┼───┼───┼───┼────────┤ │ a │ 1 │ 2 │ 3 │ 4 │ 5 │ │ │ │ b │ │ │ │ │ │ │ 5 │ │ c │ │ │ │ │ │ 5 │ │ └─────────┴───┴───┴───┴───┴───┴───┴────────┘ `); test(new Uint8Array([1, 2, 3]), ` ┌─────────┬────────┐ │ (index) │ Values │ ├─────────┼────────┤ │ 0 │ 1 │ │ 1 │ 2 │ │ 2 │ 3 │ └─────────┴────────┘ `); test(Buffer.from([1, 2, 3]), ` ┌─────────┬────────┐ │ (index) │ Values │ ├─────────┼────────┤ │ 0 │ 1 │ │ 1 │ 2 │ │ 2 │ 3 │ └─────────┴────────┘ `); test({ a: undefined }, ['x'], ` ┌─────────┬───┐ │ (index) │ x │ ├─────────┼───┤ │ a │ │ └─────────┴───┘ `); test([], ` ┌─────────┐ │ (index) │ ├─────────┤ └─────────┘ `); test(new Map(), ` ┌───────────────────┬─────┬────────┐ │ (iteration index) │ Key │ Values │ ├───────────────────┼─────┼────────┤ └───────────────────┴─────┴────────┘ `); test([{ a: 1, b: 'Y' }, { a: 'Z', b: 2 }], ` ┌─────────┬─────┬─────┐ │ (index) │ a │ b │ ├─────────┼─────┼─────┤ │ 0 │ 1 │ 'Y' │ │ 1 │ 'Z' │ 2 │ └─────────┴─────┴─────┘ `); { const line = '─'.repeat(79); const header = `${' '.repeat(37)}name${' '.repeat(40)}`; const name = 'very long long long long long long long long long long long ' + 'long long long long'; test([{ name }], ` ┌─────────┬──${line}──┐ │ (index) │ ${header}│ ├─────────┼──${line}──┤ │ 0 │ '${name}' │ └─────────┴──${line}──┘ `); } test({ foo: '¥', bar: '¥' }, ` ┌─────────┬────────┐ │ (index) │ Values │ ├─────────┼────────┤ │ foo │ '¥' │ │ bar │ '¥' │ └─────────┴────────┘ `); test({ foo: '你好', bar: 'hello' }, ` ┌─────────┬─────────┐ │ (index) │ Values │ ├─────────┼─────────┤ │ foo │ '你好' │ │ bar │ 'hello' │ └─────────┴─────────┘ `); // Regression test for prototype pollution via console.table. Earlier versions // of Node.js created an object with a non-null prototype within console.table // and then wrote to object[column][index], which lead to an error as well as // modifications to Object.prototype. test([{ foo: 10 }, { foo: 20 }], ['__proto__'], ` ┌─────────┬───────────┐ │ (index) │ __proto__ │ ├─────────┼───────────┤ │ 0 │ │ │ 1 │ │ └─────────┴───────────┘ `); assert.strictEqual('0' in Object.prototype, false); assert.strictEqual('1' in Object.prototype, false);