194 lines
5.5 KiB
JavaScript
194 lines
5.5 KiB
JavaScript
/**
|
|
* Preload for `brittle-node` / Node-based booter tests:
|
|
* - `bare-type/binding.js` uses Bare-only `require.addon()`.
|
|
* - `bare-inspect` pulls the same; brittle → bare-assert → bare-inspect.
|
|
*
|
|
* Usage: node --require ./scripts/bare-node-test-shim.cjs …
|
|
*/
|
|
'use strict'
|
|
|
|
const path = require('path')
|
|
const Module = require('module')
|
|
const { types } = require('node:util')
|
|
|
|
const constants = {
|
|
UNDEFINED: 0,
|
|
NULL: 1,
|
|
BOOLEAN: 2,
|
|
NUMBER: 3,
|
|
STRING: 4,
|
|
SYMBOL: 5,
|
|
OBJECT: 6,
|
|
FUNCTION: 7,
|
|
EXTERNAL: 8,
|
|
BIGINT: 9,
|
|
INT32: 256,
|
|
UINT32: 512,
|
|
ARRAY: 256,
|
|
ARGUMENTS: 512,
|
|
DATE: 768,
|
|
REGEXP: 1024,
|
|
ERROR: 1280,
|
|
PROMISE: 1536,
|
|
PROXY: 1792,
|
|
GENERATOR: 2048,
|
|
MAP: 2304,
|
|
SET: 2560,
|
|
WEAK_MAP: 2816,
|
|
WEAK_SET: 3072,
|
|
WEAK_REF: 3328,
|
|
ARRAYBUFFER: 3584,
|
|
SHAREDARRAYBUFFER: 3840,
|
|
TYPEDARRAY: 4096,
|
|
DATAVIEW: 4352,
|
|
MODULE_NAMESPACE: 4608,
|
|
INT8ARRAY: 65536,
|
|
UINT8ARRAY: 131072,
|
|
UINT8CLAMPEDARRAY: 196608,
|
|
INT16ARRAY: 262144,
|
|
UINT16ARRAY: 327680,
|
|
INT32ARRAY: 393216,
|
|
UINT32ARRAY: 458752,
|
|
FLOAT16ARRAY: 786432,
|
|
FLOAT32ARRAY: 524288,
|
|
FLOAT64ARRAY: 589824,
|
|
BIGINT64ARRAY: 655360,
|
|
BIGUINT64ARRAY: 720896,
|
|
ASYNC_FUNCTION: 256,
|
|
GENERATOR_FUNCTION: 512
|
|
}
|
|
|
|
const t = constants
|
|
|
|
function typeNumber(value) {
|
|
let ty = t.NUMBER
|
|
if (Number.isSafeInteger(value)) {
|
|
if (value >= -0x80000000 && value <= 0x7fffffff && (value | 0) === value) {
|
|
ty |= t.INT32
|
|
} else if (value >= 0 && value <= 0xffffffff && (value >>> 0) === value) {
|
|
ty |= t.UINT32
|
|
}
|
|
}
|
|
return ty
|
|
}
|
|
|
|
function typeObject(value) {
|
|
if (value === null) return t.NULL
|
|
if (Array.isArray(value)) return t.OBJECT | t.ARRAY
|
|
if (types.isArgumentsObject(value)) return t.OBJECT | t.ARGUMENTS
|
|
if (value instanceof Date) return t.OBJECT | t.DATE
|
|
if (value instanceof RegExp) return t.OBJECT | t.REGEXP
|
|
if (types.isNativeError(value)) return t.OBJECT | t.ERROR
|
|
if (value instanceof Promise) return t.OBJECT | t.PROMISE
|
|
if (types.isProxy(value)) return t.OBJECT | t.PROXY
|
|
if (types.isGeneratorObject(value)) return t.OBJECT | t.GENERATOR
|
|
if (value instanceof Map) return t.OBJECT | t.MAP
|
|
if (value instanceof Set) return t.OBJECT | t.SET
|
|
if (value instanceof WeakMap) return t.OBJECT | t.WEAK_MAP
|
|
if (value instanceof WeakSet) return t.OBJECT | t.WEAK_SET
|
|
if (value instanceof WeakRef) return t.OBJECT | t.WEAK_REF
|
|
if (value instanceof ArrayBuffer) return t.OBJECT | t.ARRAYBUFFER
|
|
if (value instanceof SharedArrayBuffer) return t.OBJECT | t.SHAREDARRAYBUFFER
|
|
if (ArrayBuffer.isView(value) && !(value instanceof DataView)) {
|
|
let ta = t.OBJECT | t.TYPEDARRAY
|
|
if (value instanceof Int8Array) ta |= t.INT8ARRAY
|
|
else if (value instanceof Uint8Array) ta |= t.UINT8ARRAY
|
|
else if (value instanceof Uint8ClampedArray) ta |= t.UINT8CLAMPEDARRAY
|
|
else if (value instanceof Int16Array) ta |= t.INT16ARRAY
|
|
else if (value instanceof Uint16Array) ta |= t.UINT16ARRAY
|
|
else if (value instanceof Int32Array) ta |= t.INT32ARRAY
|
|
else if (value instanceof Uint32Array) ta |= t.UINT32ARRAY
|
|
else if (typeof Float16Array !== 'undefined' && value instanceof Float16Array)
|
|
ta |= t.FLOAT16ARRAY
|
|
else if (value instanceof Float32Array) ta |= t.FLOAT32ARRAY
|
|
else if (value instanceof Float64Array) ta |= t.FLOAT64ARRAY
|
|
else if (value instanceof BigInt64Array) ta |= t.BIGINT64ARRAY
|
|
else if (value instanceof BigUint64Array) ta |= t.BIGUINT64ARRAY
|
|
return ta
|
|
}
|
|
if (value instanceof DataView) return t.OBJECT | t.DATAVIEW
|
|
if (types.isModuleNamespaceObject(value)) return t.OBJECT | t.MODULE_NAMESPACE
|
|
return t.OBJECT
|
|
}
|
|
|
|
function typeFunction(fn) {
|
|
let ty = t.FUNCTION
|
|
if (types.isAsyncFunction(fn)) ty |= t.ASYNC_FUNCTION
|
|
if (types.isGeneratorFunction(fn)) ty |= t.GENERATOR_FUNCTION
|
|
return ty
|
|
}
|
|
|
|
function bareType(value) {
|
|
switch (typeof value) {
|
|
case 'undefined':
|
|
return t.UNDEFINED
|
|
case 'boolean':
|
|
return t.BOOLEAN
|
|
case 'number':
|
|
return typeNumber(value)
|
|
case 'string':
|
|
return t.STRING
|
|
case 'symbol':
|
|
return t.SYMBOL
|
|
case 'object':
|
|
return typeObject(value)
|
|
case 'function':
|
|
return typeFunction(value)
|
|
case 'bigint':
|
|
return t.BIGINT
|
|
default:
|
|
return t.UNDEFINED
|
|
}
|
|
}
|
|
|
|
const bareTypeBinding = {
|
|
constants,
|
|
type: bareType,
|
|
addTag() {},
|
|
checkTag() {
|
|
return false
|
|
}
|
|
}
|
|
|
|
/** @param {string} filename */
|
|
function isBareInspectIndex(filename) {
|
|
const n = filename.replace(/\\/g, '/')
|
|
return n.includes('/bare-inspect/') && n.endsWith('/index.js')
|
|
}
|
|
|
|
const BARE_INSPECT_NODE_SOURCE = `'use strict'
|
|
const util = require('util')
|
|
module.exports = function inspect(value, opts = {}) {
|
|
return util.inspect(value, {
|
|
depth: opts.depth,
|
|
colors: !!opts.colors,
|
|
breakLength: opts.breakLength,
|
|
maxArrayLength: opts.maxArrayLength,
|
|
maxStringLength: opts.maxStringLength
|
|
})
|
|
}
|
|
module.exports.styles = {}
|
|
`
|
|
|
|
const origLoad = Module._load
|
|
Module._load = function (request, parent, isMain) {
|
|
if (
|
|
request === './binding' &&
|
|
parent &&
|
|
typeof parent.filename === 'string' &&
|
|
parent.filename.includes(`${path.sep}bare-type${path.sep}`) &&
|
|
parent.filename.endsWith(`${path.sep}index.js`)
|
|
) {
|
|
return bareTypeBinding
|
|
}
|
|
return origLoad.apply(this, arguments)
|
|
}
|
|
|
|
const origCompile = Module.prototype._compile
|
|
Module.prototype._compile = function (content, filename) {
|
|
if (typeof filename === 'string' && isBareInspectIndex(filename)) {
|
|
return origCompile.call(this, BARE_INSPECT_NODE_SOURCE, filename)
|
|
}
|
|
return origCompile.call(this, content, filename)
|
|
}
|