// node --experimental-vm-modules has-instance_test.mjs import * as assert from 'node:assert/strict'; import './has-instance.mjs'; //========== Object.isObject() ========== assert.equal( Object.isObject(Object.create(null)), true ); assert.equal( Object.isObject(Object.prototype), true ); assert.equal( Object.isObject(null), false ); assert.equal( Object.isObject(undefined), false ); assert.equal( Object.isObject(123), false ); //========== Builtin object types ========== assert.equal( Array.hasInstance([]), true ); assert.equal( Object.hasInstance([]), true ); //========== Local realm instance checks for user classes ========== class MyLocalClass {} assert.equal( MyLocalClass.hasInstance(new MyLocalClass()), true ); assert.equal( MyLocalClass.hasInstance({}), false ); //========== Cross-realm instance checks ========== //----- Setting up the foreign realm ----- import * as vm from 'node:vm'; import * as fs from 'node:fs'; async function linker(specifier, referencingModule) { const src = fs.readFileSync(specifier, {encoding: 'utf-8'}); return new vm.SourceTextModule( src, { context: referencingModule.context, } ); } const foreignContext = vm.createContext({ print: console.log }); // Experimental API: https://nodejs.org/api/vm.html#class-vmmodule const foreignModule = new vm.SourceTextModule( ` import './has-instance.mjs'; export const foreignArray = []; const CrossRealmClassMarker = Symbol.for('com.2ality.MyCrossRealmClass'); class CrossRealmClass { static [Symbol.typeMarker] = CrossRealmClassMarker; get [CrossRealmClassMarker]() {} } export const foreignInstance = new CrossRealmClass(); `, { context: foreignContext, } ); await foreignModule.link(linker); await foreignModule.evaluate(); const {foreignArray, foreignInstance} = foreignModule.namespace; //----- Foreign Array ----- assert.equal( foreignArray instanceof Array, false ); assert.equal( Array.isArray(foreignArray), true ); assert.equal( Array.hasInstance(foreignArray), true ); //----- Foreign instance ----- const CrossRealmClassMarker = Symbol.for('com.2ality.MyCrossRealmClass'); class CrossRealmClass { static [Symbol.typeMarker] = CrossRealmClassMarker; // Create property CrossRealmClass.prototype[CrossRealmClassMarker] // (value doesn’t matter, only key): [CrossRealmClassMarker]() {} } assert.equal( CrossRealmClass.hasInstance(new CrossRealmClass()), true ); assert.equal( CrossRealmClass.hasInstance(foreignInstance), true ); assert.equal( CrossRealmClass.hasInstance({}), false );