Branch data Line data Source code
1 : 82 : // SPDX-License-Identifier: MIT OR LGPL-2.0-or-later
2 : : // SPDX-FileCopyrightText: 2013 Red Hat, Inc.
3 : : // SPDX-FileCopyrightText: 2020 Evan Welsh <contact@evanwelsh.com>
4 : :
5 : 82 : (function (exports) {
6 : : 'use strict';
7 : :
8 : : const {
9 : : print,
10 : : printerr,
11 : : log: nativeLog,
12 : : logError: nativeLogError,
13 : : setPrettyPrintFunction,
14 : 41 : } = imports._print;
15 : :
16 : 3 : function log(...args) {
17 [ - + ]: 6 : return nativeLog(args.map(arg => typeof arg === 'string' ? arg : prettyPrint(arg)).join(' '));
18 : : }
19 : :
20 : 69 : function logError(e, ...args) {
21 [ + + ]: 69 : if (args.length === 0)
22 : 52 : return nativeLogError(e);
23 [ - + ]: 34 : return nativeLogError(e, args.map(arg => typeof arg === 'string' ? arg : prettyPrint(arg)).join(' '));
24 : : }
25 : :
26 : : // compare against the %TypedArray% intrinsic object all typed array constructors inherit from
27 : 127 : function _isTypedArray(value) {
28 : 127 : return value instanceof Object.getPrototypeOf(Uint8Array);
29 : : }
30 : :
31 : 132 : function _hasStandardToString(value) {
32 [ + + ]: 132 : return value.toString === Object.prototype.toString ||
33 [ + + ]: 70 : value.toString === Array.prototype.toString ||
34 : : // although TypedArrays have a standard Array.prototype.toString, we currently enforce an override to warn
35 : : // for legacy behaviour, making the toString non-standard for
36 : : // "any Uint8Array instances created in situations where previously a ByteArray would have been created"
37 [ + + ]: 50 : _isTypedArray(value) ||
38 : 49 : value.toString === Date.prototype.toString;
39 : : }
40 : :
41 : 105 : function prettyPrint(value) {
42 [ + + ][ + + ]: 105 : switch (typeof value) {
[ - + ][ + + ]
[ + + ]
43 : : case 'object':
44 [ + + ]: 39 : if (value === null)
45 : 1 : return 'null';
46 : :
47 [ + + ]: 38 : if (_hasStandardToString(value)) {
48 : 37 : const printedObjects = new WeakSet();
49 : 37 : return formatObject(value, printedObjects);
50 : : }
51 : : // If the object has a nonstandard toString, prefer that
52 : 1 : return value.toString();
53 : : case 'function':
54 [ - + ]: 1 : if (value.toString === Function.prototype.toString)
55 : 1 : return formatFunction(value);
56 : 0 : return value.toString();
57 : : case 'string':
58 : 0 : return JSON.stringify(value);
59 : : case 'symbol':
60 : 3 : return formatSymbol(value);
61 : : case 'undefined':
62 : 1 : return 'undefined';
63 : : default:
64 : 61 : return value.toString();
65 : : }
66 : 37 : }
67 : :
68 : 1549 : function formatPropertyKey(key) {
69 [ + + ]: 1549 : if (typeof key === 'symbol')
70 : 3 : return `[${formatSymbol(key)}]`;
71 : 1546 : return `${key}`;
72 : : }
73 : :
74 : 41 : function formatObject(obj, printedObjects) {
75 : 41 : printedObjects.add(obj);
76 [ + + ][ + + ]: 41 : if (Array.isArray(obj) || _isTypedArray(obj))
77 : 8 : return formatArray(obj, printedObjects).toString();
78 : :
79 [ + + ]: 33 : if (obj instanceof Date)
80 : 2 : return formatDate(obj);
81 : :
82 : 31 : const formattedObject = [];
83 : 31 : const keys = Object.getOwnPropertyNames(obj).concat(Object.getOwnPropertySymbols(obj));
84 [ + + ]: 2347 : for (const propertyKey of keys) {
85 : 2308 : const value = obj[propertyKey];
86 : 2308 : const key = formatPropertyKey(propertyKey);
87 [ + + ][ + + ]: 2308 : switch (typeof value) {
[ + + ][ - + ]
88 : : case 'object':
89 [ + + ]: 49 : if (printedObjects.has(value))
90 : 2 : formattedObject.push(`${key}: [Circular]`);
91 [ + + ]: 47 : else if (value === null)
92 : 1 : formattedObject.push(`${key}: null`);
93 [ + + ]: 47 : else if (_hasStandardToString(value))
94 : 25 : formattedObject.push(`${key}: ${formatObject(value, printedObjects)}`);
95 : : else
96 : 23 : formattedObject.push(`${key}: ${value.toString()}`);
97 : : break;
98 : : case 'function':
99 : 45 : formattedObject.push(`${key}: ${formatFunction(value)}`);
100 : : break;
101 : : case 'string':
102 : 4 : formattedObject.push(`${key}: "${value}"`);
103 : : break;
104 : : case 'symbol':
105 : 3 : formattedObject.push(`${key}: ${formatSymbol(value)}`);
106 : : break;
107 : : default:
108 : 2213 : formattedObject.push(`${key}: ${value}`);
109 : : break;
110 : : }
111 : : }
112 [ + - ]: 30 : return Object.keys(formattedObject).length === 0 ? '{}'
113 : 30 : : `{ ${formattedObject.join(', ')} }`;
114 : 40 : }
115 : :
116 : 21 : function formatArray(arr, printedObjects) {
117 : 21 : const formattedArray = [];
118 [ + + ][ - + ]: 86 : for (const [key, value] of arr.entries()) {
[ - + ][ - + ]
[ # # ][ # # ]
[ # # ][ # # ]
119 [ + + ]: 65 : if (printedObjects.has(value))
120 : 2 : formattedArray[key] = '[Circular]';
121 : : else
122 : 63 : formattedArray[key] = prettyPrint(value);
123 : : }
124 : 21 : return `[${formattedArray.join(', ')}]`;
125 : 21 : }
126 : :
127 : 2 : function formatDate(date) {
128 : 2 : return date.toISOString();
129 : : }
130 : :
131 : 165 : function formatFunction(func) {
132 : 165 : let funcOutput = `[ Function: ${func.name} ]`;
133 : 165 : return funcOutput;
134 : 165 : }
135 : :
136 : 9 : function formatSymbol(sym) {
137 : : // Try to format Symbols in the same way that they would be constructed.
138 : :
139 : : // First check if this is a global registered symbol
140 : 9 : const globalKey = Symbol.keyFor(sym);
141 [ + + ]: 9 : if (globalKey !== undefined)
142 : 3 : return `Symbol.for("${globalKey}")`;
143 : :
144 : 6 : const descr = sym.description;
145 : : // Special-case the 'well-known' (built-in) Symbols
146 [ + + ]: 6 : if (descr.startsWith('Symbol.'))
147 : 3 : return descr;
148 : :
149 : : // Otherwise, it's just a regular symbol
150 : 3 : return `Symbol("${descr}")`;
151 : 9 : }
152 : :
153 : 82 : Object.defineProperties(exports, {
154 : 41 : ARGV: {
155 : 41 : configurable: false,
156 : 41 : enumerable: true,
157 : 41 : get() {
158 : : // Wait until after bootstrap or programArgs won't be set.
159 : 3 : return imports.system.programArgs;
160 : : },
161 : : },
162 : 41 : print: {
163 : 41 : configurable: false,
164 : 41 : enumerable: true,
165 : 41 : writable: true,
166 : 41 : value: print,
167 : : },
168 : 41 : printerr: {
169 : 41 : configurable: false,
170 : 41 : enumerable: true,
171 : 41 : writable: true,
172 : 41 : value: printerr,
173 : : },
174 : 41 : log: {
175 : 41 : configurable: false,
176 : 41 : enumerable: true,
177 : 41 : writable: true,
178 : 41 : value: log,
179 : : },
180 : 41 : logError: {
181 : 41 : configurable: false,
182 : 41 : enumerable: true,
183 : 41 : writable: true,
184 : 41 : value: logError,
185 : : },
186 : : });
187 : 41 : setPrettyPrintFunction(exports, prettyPrint);
188 : 41 : })(globalThis);
|