mirror of
				https://github.com/docker/login-action.git
				synced 2025-11-01 02:30:10 +08:00 
			
		
		
		
	
						commit
						4e3c9375bb
					
				| @ -1,3 +1,4 @@ | |||||||
|  | import {beforeEach, describe, expect, jest, test} from '@jest/globals'; | ||||||
| import {AuthorizationData} from '@aws-sdk/client-ecr'; | import {AuthorizationData} from '@aws-sdk/client-ecr'; | ||||||
| import * as aws from '../src/aws'; | import * as aws from '../src/aws'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,3 +1,4 @@ | |||||||
|  | import {expect, test} from '@jest/globals'; | ||||||
| import {getInputs} from '../src/context'; | import {getInputs} from '../src/context'; | ||||||
| 
 | 
 | ||||||
| test('with password and username getInputs does not throw error', async () => { | test('with password and username getInputs does not throw error', async () => { | ||||||
|  | |||||||
| @ -1,20 +1,19 @@ | |||||||
|  | import {expect, jest, test} from '@jest/globals'; | ||||||
| import {loginStandard, logout} from '../src/docker'; | import {loginStandard, logout} from '../src/docker'; | ||||||
| 
 |  | ||||||
| import * as path from 'path'; | import * as path from 'path'; | ||||||
| 
 |  | ||||||
| import * as exec from '@actions/exec'; | import * as exec from '@actions/exec'; | ||||||
| 
 | 
 | ||||||
| process.env['RUNNER_TEMP'] = path.join(__dirname, 'runner'); | process.env['RUNNER_TEMP'] = path.join(__dirname, 'runner'); | ||||||
| 
 | 
 | ||||||
| test('loginStandard calls exec', async () => { | test('loginStandard calls exec', async () => { | ||||||
|   const execSpy: jest.SpyInstance = jest.spyOn(exec, 'getExecOutput'); |   // @ts-ignore
 | ||||||
|   execSpy.mockImplementation(() => |   const execSpy = jest.spyOn(exec, 'getExecOutput').mockImplementation(async () => { | ||||||
|     Promise.resolve({ |     return { | ||||||
|       exitCode: expect.any(Number), |       exitCode: expect.any(Number), | ||||||
|       stdout: expect.any(Function), |       stdout: expect.any(Function), | ||||||
|       stderr: expect.any(Function) |       stderr: expect.any(Function) | ||||||
|     }) |     }; | ||||||
|   ); |   }); | ||||||
| 
 | 
 | ||||||
|   const username: string = 'dbowie'; |   const username: string = 'dbowie'; | ||||||
|   const password: string = 'groundcontrol'; |   const password: string = 'groundcontrol'; | ||||||
| @ -30,14 +29,14 @@ test('loginStandard calls exec', async () => { | |||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| test('logout calls exec', async () => { | test('logout calls exec', async () => { | ||||||
|   const execSpy: jest.SpyInstance = jest.spyOn(exec, 'getExecOutput'); |   // @ts-ignore
 | ||||||
|   execSpy.mockImplementation(() => |   const execSpy = jest.spyOn(exec, 'getExecOutput').mockImplementation(async () => { | ||||||
|     Promise.resolve({ |     return { | ||||||
|       exitCode: expect.any(Number), |       exitCode: expect.any(Number), | ||||||
|       stdout: expect.any(Function), |       stdout: expect.any(Function), | ||||||
|       stderr: expect.any(Function) |       stderr: expect.any(Function) | ||||||
|     }) |     }; | ||||||
|   ); |   }); | ||||||
| 
 | 
 | ||||||
|   const registry: string = 'https://ghcr.io'; |   const registry: string = 'https://ghcr.io'; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,3 +1,4 @@ | |||||||
|  | import {expect, jest, test} from '@jest/globals'; | ||||||
| import osm = require('os'); | import osm = require('os'); | ||||||
| 
 | 
 | ||||||
| import {run} from '../src/main'; | import {run} from '../src/main'; | ||||||
| @ -7,26 +8,20 @@ import * as stateHelper from '../src/state-helper'; | |||||||
| import * as core from '@actions/core'; | import * as core from '@actions/core'; | ||||||
| 
 | 
 | ||||||
| test('errors without username and password', async () => { | test('errors without username and password', async () => { | ||||||
|   const platSpy = jest.spyOn(osm, 'platform'); |   const platSpy = jest.spyOn(osm, 'platform').mockImplementation(() => 'linux'); | ||||||
|   platSpy.mockImplementation(() => 'linux'); |  | ||||||
| 
 | 
 | ||||||
|   process.env['INPUT_LOGOUT'] = 'true'; // default value
 |   process.env['INPUT_LOGOUT'] = 'true'; // default value
 | ||||||
| 
 |   const coreSpy = jest.spyOn(core, 'setFailed'); | ||||||
|   const coreSpy: jest.SpyInstance = jest.spyOn(core, 'setFailed'); |  | ||||||
| 
 | 
 | ||||||
|   await run(); |   await run(); | ||||||
| 
 |  | ||||||
|   expect(coreSpy).toHaveBeenCalledWith('Username and password required'); |   expect(coreSpy).toHaveBeenCalledWith('Username and password required'); | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| test('successful with username and password', async () => { | test('successful with username and password', async () => { | ||||||
|   const platSpy = jest.spyOn(osm, 'platform'); |   const platSpy = jest.spyOn(osm, 'platform').mockImplementation(() => 'linux'); | ||||||
|   platSpy.mockImplementation(() => 'linux'); |   const setRegistrySpy = jest.spyOn(stateHelper, 'setRegistry'); | ||||||
| 
 |   const setLogoutSpy = jest.spyOn(stateHelper, 'setLogout'); | ||||||
|   const setRegistrySpy: jest.SpyInstance = jest.spyOn(stateHelper, 'setRegistry'); |   const dockerSpy = jest.spyOn(docker, 'login').mockImplementation(jest.fn()); | ||||||
|   const setLogoutSpy: jest.SpyInstance = jest.spyOn(stateHelper, 'setLogout'); |  | ||||||
|   const dockerSpy: jest.SpyInstance = jest.spyOn(docker, 'login'); |  | ||||||
|   dockerSpy.mockImplementation(() => {}); |  | ||||||
| 
 | 
 | ||||||
|   const username: string = 'dbowie'; |   const username: string = 'dbowie'; | ||||||
|   process.env[`INPUT_USERNAME`] = username; |   process.env[`INPUT_USERNAME`] = username; | ||||||
| @ -48,13 +43,11 @@ test('successful with username and password', async () => { | |||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| test('calls docker login', async () => { | test('calls docker login', async () => { | ||||||
|   const platSpy = jest.spyOn(osm, 'platform'); |   const platSpy = jest.spyOn(osm, 'platform').mockImplementation(() => 'linux'); | ||||||
|   platSpy.mockImplementation(() => 'linux'); |   const setRegistrySpy = jest.spyOn(stateHelper, 'setRegistry'); | ||||||
| 
 |   const setLogoutSpy = jest.spyOn(stateHelper, 'setLogout'); | ||||||
|   const setRegistrySpy: jest.SpyInstance = jest.spyOn(stateHelper, 'setRegistry'); |   const dockerSpy = jest.spyOn(docker, 'login'); | ||||||
|   const setLogoutSpy: jest.SpyInstance = jest.spyOn(stateHelper, 'setLogout'); |   dockerSpy.mockImplementation(jest.fn()); | ||||||
|   const dockerSpy: jest.SpyInstance = jest.spyOn(docker, 'login'); |  | ||||||
|   dockerSpy.mockImplementation(() => {}); |  | ||||||
| 
 | 
 | ||||||
|   const username: string = 'dbowie'; |   const username: string = 'dbowie'; | ||||||
|   process.env[`INPUT_USERNAME`] = username; |   process.env[`INPUT_USERNAME`] = username; | ||||||
|  | |||||||
| @ -26,6 +26,6 @@ inputs: | |||||||
|     required: false |     required: false | ||||||
| 
 | 
 | ||||||
| runs: | runs: | ||||||
|   using: 'node12' |   using: 'node16' | ||||||
|   main: 'dist/index.js' |   main: 'dist/index.js' | ||||||
|   post: 'dist/index.js' |   post: 'dist/index.js' | ||||||
|  | |||||||
							
								
								
									
										984
									
								
								dist/bridge.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										984
									
								
								dist/bridge.js
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,984 +0,0 @@ | |||||||
| /******/ (() => { // webpackBootstrap
 |  | ||||||
| /******/ 	"use strict"; |  | ||||||
| /******/ 	var __webpack_modules__ = ({ |  | ||||||
| 
 |  | ||||||
| /***/ 989: |  | ||||||
| /***/ ((__unused_webpack_module, exports) => { |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| /** |  | ||||||
|  * __        ___    ____  _   _ ___ _   _  ____ |  | ||||||
|  * \ \      / / \  |  _ \| \ | |_ _| \ | |/ ___| |  | ||||||
|  *  \ \ /\ / / _ \ | |_) |  \| || ||  \| | |  _ |  | ||||||
|  *   \ V  V / ___ \|  _ <| |\  || || |\  | |_| | |  | ||||||
|  *    \_/\_/_/   \_\_| \_\_| \_|___|_| \_|\____| |  | ||||||
|  * |  | ||||||
|  * This file is critical for vm2. It implements the bridge between the host and the sandbox. |  | ||||||
|  * If you do not know exactly what you are doing, you should NOT edit this file. |  | ||||||
|  * |  | ||||||
|  * The file is loaded in the host and sandbox to handle objects in both directions. |  | ||||||
|  * This is done to ensure that RangeErrors are from the correct context. |  | ||||||
|  * The boundary between the sandbox and host might throw RangeErrors from both contexts. |  | ||||||
|  * Therefore, thisFromOther and friends can handle objects from both domains. |  | ||||||
|  * |  | ||||||
|  * Method parameters have comments to tell from which context they came. |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| const globalsList = [ |  | ||||||
| 	'Number', |  | ||||||
| 	'String', |  | ||||||
| 	'Boolean', |  | ||||||
| 	'Date', |  | ||||||
| 	'RegExp', |  | ||||||
| 	'Map', |  | ||||||
| 	'WeakMap', |  | ||||||
| 	'Set', |  | ||||||
| 	'WeakSet', |  | ||||||
| 	'Promise', |  | ||||||
| 	'Function' |  | ||||||
| ]; |  | ||||||
| 
 |  | ||||||
| const errorsList = [ |  | ||||||
| 	'RangeError', |  | ||||||
| 	'ReferenceError', |  | ||||||
| 	'SyntaxError', |  | ||||||
| 	'TypeError', |  | ||||||
| 	'EvalError', |  | ||||||
| 	'URIError', |  | ||||||
| 	'Error' |  | ||||||
| ]; |  | ||||||
| 
 |  | ||||||
| const OPNA = 'Operation not allowed on contextified object.'; |  | ||||||
| 
 |  | ||||||
| const thisGlobalPrototypes = { |  | ||||||
| 	__proto__: null, |  | ||||||
| 	Object: Object.prototype, |  | ||||||
| 	Array: Array.prototype |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| for (let i = 0; i < globalsList.length; i++) { |  | ||||||
| 	const key = globalsList[i]; |  | ||||||
| 	const g = global[key]; |  | ||||||
| 	if (g) thisGlobalPrototypes[key] = g.prototype; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| for (let i = 0; i < errorsList.length; i++) { |  | ||||||
| 	const key = errorsList[i]; |  | ||||||
| 	const g = global[key]; |  | ||||||
| 	if (g) thisGlobalPrototypes[key] = g.prototype; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| const { |  | ||||||
| 	getPrototypeOf: thisReflectGetPrototypeOf, |  | ||||||
| 	setPrototypeOf: thisReflectSetPrototypeOf, |  | ||||||
| 	defineProperty: thisReflectDefineProperty, |  | ||||||
| 	deleteProperty: thisReflectDeleteProperty, |  | ||||||
| 	getOwnPropertyDescriptor: thisReflectGetOwnPropertyDescriptor, |  | ||||||
| 	isExtensible: thisReflectIsExtensible, |  | ||||||
| 	preventExtensions: thisReflectPreventExtensions, |  | ||||||
| 	apply: thisReflectApply, |  | ||||||
| 	construct: thisReflectConstruct, |  | ||||||
| 	set: thisReflectSet, |  | ||||||
| 	get: thisReflectGet, |  | ||||||
| 	has: thisReflectHas, |  | ||||||
| 	ownKeys: thisReflectOwnKeys, |  | ||||||
| 	enumerate: thisReflectEnumerate, |  | ||||||
| } = Reflect; |  | ||||||
| 
 |  | ||||||
| const thisObject = Object; |  | ||||||
| const { |  | ||||||
| 	freeze: thisObjectFreeze, |  | ||||||
| 	prototype: thisObjectPrototype |  | ||||||
| } = thisObject; |  | ||||||
| const thisObjectHasOwnProperty = thisObjectPrototype.hasOwnProperty; |  | ||||||
| const ThisProxy = Proxy; |  | ||||||
| const ThisWeakMap = WeakMap; |  | ||||||
| const { |  | ||||||
| 	get: thisWeakMapGet, |  | ||||||
| 	set: thisWeakMapSet |  | ||||||
| } = ThisWeakMap.prototype; |  | ||||||
| const ThisMap = Map; |  | ||||||
| const thisMapGet = ThisMap.prototype.get; |  | ||||||
| const thisMapSet = ThisMap.prototype.set; |  | ||||||
| const thisFunction = Function; |  | ||||||
| const thisFunctionBind = thisFunction.prototype.bind; |  | ||||||
| const thisArrayIsArray = Array.isArray; |  | ||||||
| const thisErrorCaptureStackTrace = Error.captureStackTrace; |  | ||||||
| 
 |  | ||||||
| const thisSymbolToString = Symbol.prototype.toString; |  | ||||||
| const thisSymbolToStringTag = Symbol.toStringTag; |  | ||||||
| 
 |  | ||||||
| /** |  | ||||||
|  * VMError. |  | ||||||
|  * |  | ||||||
|  * @public |  | ||||||
|  * @extends {Error} |  | ||||||
|  */ |  | ||||||
| class VMError extends Error { |  | ||||||
| 
 |  | ||||||
| 	/** |  | ||||||
| 	 * Create VMError instance. |  | ||||||
| 	 * |  | ||||||
| 	 * @public |  | ||||||
| 	 * @param {string} message - Error message. |  | ||||||
| 	 * @param {string} code - Error code. |  | ||||||
| 	 */ |  | ||||||
| 	constructor(message, code) { |  | ||||||
| 		super(message); |  | ||||||
| 
 |  | ||||||
| 		this.name = 'VMError'; |  | ||||||
| 		this.code = code; |  | ||||||
| 
 |  | ||||||
| 		thisErrorCaptureStackTrace(this, this.constructor); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| thisGlobalPrototypes['VMError'] = VMError.prototype; |  | ||||||
| 
 |  | ||||||
| function thisUnexpected() { |  | ||||||
| 	return new VMError('Unexpected'); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| if (!thisReflectSetPrototypeOf(exports, null)) throw thisUnexpected(); |  | ||||||
| 
 |  | ||||||
| function thisSafeGetOwnPropertyDescriptor(obj, key) { |  | ||||||
| 	const desc = thisReflectGetOwnPropertyDescriptor(obj, key); |  | ||||||
| 	if (!desc) return desc; |  | ||||||
| 	if (!thisReflectSetPrototypeOf(desc, null)) throw thisUnexpected(); |  | ||||||
| 	return desc; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function thisThrowCallerCalleeArgumentsAccess(key) { |  | ||||||
| 	'use strict'; |  | ||||||
| 	thisThrowCallerCalleeArgumentsAccess[key]; |  | ||||||
| 	return thisUnexpected(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function thisIdMapping(factory, other) { |  | ||||||
| 	return other; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| const thisThrowOnKeyAccessHandler = thisObjectFreeze({ |  | ||||||
| 	__proto__: null, |  | ||||||
| 	get(target, key, receiver) { |  | ||||||
| 		if (typeof key === 'symbol') { |  | ||||||
| 			key = thisReflectApply(thisSymbolToString, key, []); |  | ||||||
| 		} |  | ||||||
| 		throw new VMError(`Unexpected access to key '${key}'`); |  | ||||||
| 	} |  | ||||||
| }); |  | ||||||
| 
 |  | ||||||
| const emptyForzenObject = thisObjectFreeze({ |  | ||||||
| 	__proto__: null |  | ||||||
| }); |  | ||||||
| 
 |  | ||||||
| const thisThrowOnKeyAccess = new ThisProxy(emptyForzenObject, thisThrowOnKeyAccessHandler); |  | ||||||
| 
 |  | ||||||
| function SafeBase() {} |  | ||||||
| 
 |  | ||||||
| if (!thisReflectDefineProperty(SafeBase, 'prototype', { |  | ||||||
| 	__proto__: null, |  | ||||||
| 	value: thisThrowOnKeyAccess |  | ||||||
| })) throw thisUnexpected(); |  | ||||||
| 
 |  | ||||||
| function SHARED_FUNCTION() {} |  | ||||||
| 
 |  | ||||||
| const TEST_PROXY_HANDLER = thisObjectFreeze({ |  | ||||||
| 	__proto__: thisThrowOnKeyAccess, |  | ||||||
| 	construct() { |  | ||||||
| 		return this; |  | ||||||
| 	} |  | ||||||
| }); |  | ||||||
| 
 |  | ||||||
| function thisIsConstructor(obj) { |  | ||||||
| 	// Note: obj@any(unsafe)
 |  | ||||||
| 	const Func = new ThisProxy(obj, TEST_PROXY_HANDLER); |  | ||||||
| 	try { |  | ||||||
| 		// eslint-disable-next-line no-new
 |  | ||||||
| 		new Func(); |  | ||||||
| 		return true; |  | ||||||
| 	} catch (e) { |  | ||||||
| 		return false; |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function thisCreateTargetObject(obj, proto) { |  | ||||||
| 	// Note: obj@any(unsafe) proto@any(unsafe) returns@this(unsafe) throws@this(unsafe)
 |  | ||||||
| 	let base; |  | ||||||
| 	if (typeof obj === 'function') { |  | ||||||
| 		if (thisIsConstructor(obj)) { |  | ||||||
| 			// Bind the function since bound functions do not have a prototype property.
 |  | ||||||
| 			base = thisReflectApply(thisFunctionBind, SHARED_FUNCTION, [null]); |  | ||||||
| 		} else { |  | ||||||
| 			base = () => {}; |  | ||||||
| 		} |  | ||||||
| 	} else if (thisArrayIsArray(obj)) { |  | ||||||
| 		base = []; |  | ||||||
| 	} else { |  | ||||||
| 		return {__proto__: proto}; |  | ||||||
| 	} |  | ||||||
| 	if (!thisReflectSetPrototypeOf(base, proto)) throw thisUnexpected(); |  | ||||||
| 	return base; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function createBridge(otherInit, registerProxy) { |  | ||||||
| 
 |  | ||||||
| 	const mappingOtherToThis = new ThisWeakMap(); |  | ||||||
| 	const protoMappings = new ThisMap(); |  | ||||||
| 	const protoName = new ThisMap(); |  | ||||||
| 
 |  | ||||||
| 	function thisAddProtoMapping(proto, other, name) { |  | ||||||
| 		// Note: proto@this(unsafe) other@other(unsafe) name@this(unsafe) throws@this(unsafe)
 |  | ||||||
| 		thisReflectApply(thisMapSet, protoMappings, [proto, thisIdMapping]); |  | ||||||
| 		thisReflectApply(thisMapSet, protoMappings, [other, |  | ||||||
| 			(factory, object) => thisProxyOther(factory, object, proto)]); |  | ||||||
| 		if (name) thisReflectApply(thisMapSet, protoName, [proto, name]); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	function thisAddProtoMappingFactory(protoFactory, other, name) { |  | ||||||
| 		// Note: protoFactory@this(unsafe) other@other(unsafe) name@this(unsafe) throws@this(unsafe)
 |  | ||||||
| 		let proto; |  | ||||||
| 		thisReflectApply(thisMapSet, protoMappings, [other, |  | ||||||
| 			(factory, object) => { |  | ||||||
| 				if (!proto) { |  | ||||||
| 					proto = protoFactory(); |  | ||||||
| 					thisReflectApply(thisMapSet, protoMappings, [proto, thisIdMapping]); |  | ||||||
| 					if (name) thisReflectApply(thisMapSet, protoName, [proto, name]); |  | ||||||
| 				} |  | ||||||
| 				return thisProxyOther(factory, object, proto); |  | ||||||
| 			}]); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	const result = { |  | ||||||
| 		__proto__: null, |  | ||||||
| 		globalPrototypes: thisGlobalPrototypes, |  | ||||||
| 		safeGetOwnPropertyDescriptor: thisSafeGetOwnPropertyDescriptor, |  | ||||||
| 		fromArguments: thisFromOtherArguments, |  | ||||||
| 		from: thisFromOther, |  | ||||||
| 		fromWithFactory: thisFromOtherWithFactory, |  | ||||||
| 		ensureThis: thisEnsureThis, |  | ||||||
| 		mapping: mappingOtherToThis, |  | ||||||
| 		connect: thisConnect, |  | ||||||
| 		reflectSet: thisReflectSet, |  | ||||||
| 		reflectGet: thisReflectGet, |  | ||||||
| 		reflectDefineProperty: thisReflectDefineProperty, |  | ||||||
| 		reflectDeleteProperty: thisReflectDeleteProperty, |  | ||||||
| 		reflectApply: thisReflectApply, |  | ||||||
| 		reflectConstruct: thisReflectConstruct, |  | ||||||
| 		reflectHas: thisReflectHas, |  | ||||||
| 		reflectOwnKeys: thisReflectOwnKeys, |  | ||||||
| 		reflectEnumerate: thisReflectEnumerate, |  | ||||||
| 		reflectGetPrototypeOf: thisReflectGetPrototypeOf, |  | ||||||
| 		reflectIsExtensible: thisReflectIsExtensible, |  | ||||||
| 		reflectPreventExtensions: thisReflectPreventExtensions, |  | ||||||
| 		objectHasOwnProperty: thisObjectHasOwnProperty, |  | ||||||
| 		weakMapSet: thisWeakMapSet, |  | ||||||
| 		addProtoMapping: thisAddProtoMapping, |  | ||||||
| 		addProtoMappingFactory: thisAddProtoMappingFactory, |  | ||||||
| 		defaultFactory, |  | ||||||
| 		protectedFactory, |  | ||||||
| 		readonlyFactory, |  | ||||||
| 		VMError |  | ||||||
| 	}; |  | ||||||
| 
 |  | ||||||
| 	const isHost = typeof otherInit !== 'object'; |  | ||||||
| 
 |  | ||||||
| 	if (isHost) { |  | ||||||
| 		otherInit = otherInit(result, registerProxy); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	result.other = otherInit; |  | ||||||
| 
 |  | ||||||
| 	const { |  | ||||||
| 		globalPrototypes: otherGlobalPrototypes, |  | ||||||
| 		safeGetOwnPropertyDescriptor: otherSafeGetOwnPropertyDescriptor, |  | ||||||
| 		fromArguments: otherFromThisArguments, |  | ||||||
| 		from: otherFromThis, |  | ||||||
| 		mapping: mappingThisToOther, |  | ||||||
| 		reflectSet: otherReflectSet, |  | ||||||
| 		reflectGet: otherReflectGet, |  | ||||||
| 		reflectDefineProperty: otherReflectDefineProperty, |  | ||||||
| 		reflectDeleteProperty: otherReflectDeleteProperty, |  | ||||||
| 		reflectApply: otherReflectApply, |  | ||||||
| 		reflectConstruct: otherReflectConstruct, |  | ||||||
| 		reflectHas: otherReflectHas, |  | ||||||
| 		reflectOwnKeys: otherReflectOwnKeys, |  | ||||||
| 		reflectEnumerate: otherReflectEnumerate, |  | ||||||
| 		reflectGetPrototypeOf: otherReflectGetPrototypeOf, |  | ||||||
| 		reflectIsExtensible: otherReflectIsExtensible, |  | ||||||
| 		reflectPreventExtensions: otherReflectPreventExtensions, |  | ||||||
| 		objectHasOwnProperty: otherObjectHasOwnProperty, |  | ||||||
| 		weakMapSet: otherWeakMapSet |  | ||||||
| 	} = otherInit; |  | ||||||
| 
 |  | ||||||
| 	function thisOtherHasOwnProperty(object, key) { |  | ||||||
| 		// Note: object@other(safe) key@prim throws@this(unsafe)
 |  | ||||||
| 		try { |  | ||||||
| 			return otherReflectApply(otherObjectHasOwnProperty, object, [key]) === true; |  | ||||||
| 		} catch (e) { // @other(unsafe)
 |  | ||||||
| 			throw thisFromOther(e); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	function thisDefaultGet(handler, object, key, desc) { |  | ||||||
| 		// Note: object@other(unsafe) key@prim desc@other(safe)
 |  | ||||||
| 		let ret; // @other(unsafe)
 |  | ||||||
| 		if (desc.get || desc.set) { |  | ||||||
| 			const getter = desc.get; |  | ||||||
| 			if (!getter) return undefined; |  | ||||||
| 			try { |  | ||||||
| 				ret = otherReflectApply(getter, object, [key]); |  | ||||||
| 			} catch (e) { |  | ||||||
| 				throw thisFromOther(e); |  | ||||||
| 			} |  | ||||||
| 		} else { |  | ||||||
| 			ret = desc.value; |  | ||||||
| 		} |  | ||||||
| 		return handler.fromOtherWithContext(ret); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	function otherFromThisIfAvailable(to, from, key) { |  | ||||||
| 		// Note: to@other(safe) from@this(safe) key@prim throws@this(unsafe)
 |  | ||||||
| 		if (!thisReflectApply(thisObjectHasOwnProperty, from, [key])) return false; |  | ||||||
| 		try { |  | ||||||
| 			to[key] = otherFromThis(from[key]); |  | ||||||
| 		} catch (e) { // @other(unsafe)
 |  | ||||||
| 			throw thisFromOther(e); |  | ||||||
| 		} |  | ||||||
| 		return true; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	class BaseHandler extends SafeBase { |  | ||||||
| 
 |  | ||||||
| 		constructor(object) { |  | ||||||
| 			// Note: object@other(unsafe) throws@this(unsafe)
 |  | ||||||
| 			super(); |  | ||||||
| 			this.object = object; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		getFactory() { |  | ||||||
| 			return defaultFactory; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		fromOtherWithContext(other) { |  | ||||||
| 			// Note: other@other(unsafe) throws@this(unsafe)
 |  | ||||||
| 			return thisFromOtherWithFactory(this.getFactory(), other); |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		doPreventExtensions(target, object, factory) { |  | ||||||
| 			// Note: target@this(unsafe) object@other(unsafe) throws@this(unsafe)
 |  | ||||||
| 			let keys; // @other(safe-array-of-prim)
 |  | ||||||
| 			try { |  | ||||||
| 				keys = otherReflectOwnKeys(object); |  | ||||||
| 			} catch (e) { // @other(unsafe)
 |  | ||||||
| 				throw thisFromOther(e); |  | ||||||
| 			} |  | ||||||
| 			for (let i = 0; i < keys.length; i++) { |  | ||||||
| 				const key = keys[i]; // @prim
 |  | ||||||
| 				let desc; |  | ||||||
| 				try { |  | ||||||
| 					desc = otherSafeGetOwnPropertyDescriptor(object, key); |  | ||||||
| 				} catch (e) { // @other(unsafe)
 |  | ||||||
| 					throw thisFromOther(e); |  | ||||||
| 				} |  | ||||||
| 				if (!desc) continue; |  | ||||||
| 				if (!desc.configurable) { |  | ||||||
| 					const current = thisSafeGetOwnPropertyDescriptor(target, key); |  | ||||||
| 					if (current && !current.configurable) continue; |  | ||||||
| 					if (desc.get || desc.set) { |  | ||||||
| 						desc.get = this.fromOtherWithContext(desc.get); |  | ||||||
| 						desc.set = this.fromOtherWithContext(desc.set); |  | ||||||
| 					} else if (typeof object === 'function' && (key === 'caller' || key === 'callee' || key === 'arguments')) { |  | ||||||
| 						desc.value = null; |  | ||||||
| 					} else { |  | ||||||
| 						desc.value = this.fromOtherWithContext(desc.value); |  | ||||||
| 					} |  | ||||||
| 				} else { |  | ||||||
| 					if (desc.get || desc.set) { |  | ||||||
| 						desc = { |  | ||||||
| 							__proto__: null, |  | ||||||
| 							configurable: true, |  | ||||||
| 							enumerable: desc.enumerable, |  | ||||||
| 							writable: true, |  | ||||||
| 							value: null |  | ||||||
| 						}; |  | ||||||
| 					} else { |  | ||||||
| 						desc.value = null; |  | ||||||
| 					} |  | ||||||
| 				} |  | ||||||
| 				if (!thisReflectDefineProperty(target, key, desc)) throw thisUnexpected(); |  | ||||||
| 			} |  | ||||||
| 			if (!thisReflectPreventExtensions(target)) throw thisUnexpected(); |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		get(target, key, receiver) { |  | ||||||
| 			// Note: target@this(unsafe) key@prim receiver@this(unsafe) throws@this(unsafe)
 |  | ||||||
| 			const object = this.object; // @other(unsafe)
 |  | ||||||
| 			switch (key) { |  | ||||||
| 				case 'constructor': { |  | ||||||
| 					const desc = otherSafeGetOwnPropertyDescriptor(object, key); |  | ||||||
| 					if (desc) return thisDefaultGet(this, object, key, desc); |  | ||||||
| 					const proto = thisReflectGetPrototypeOf(target); |  | ||||||
| 					return proto === null ? undefined : proto.constructor; |  | ||||||
| 				} |  | ||||||
| 				case '__proto__': { |  | ||||||
| 					const desc = otherSafeGetOwnPropertyDescriptor(object, key); |  | ||||||
| 					if (desc) return thisDefaultGet(this, object, key, desc); |  | ||||||
| 					return thisReflectGetPrototypeOf(target); |  | ||||||
| 				} |  | ||||||
| 				case thisSymbolToStringTag: |  | ||||||
| 					if (!thisOtherHasOwnProperty(object, thisSymbolToStringTag)) { |  | ||||||
| 						const proto = thisReflectGetPrototypeOf(target); |  | ||||||
| 						const name = thisReflectApply(thisMapGet, protoName, [proto]); |  | ||||||
| 						if (name) return name; |  | ||||||
| 					} |  | ||||||
| 					break; |  | ||||||
| 				case 'arguments': |  | ||||||
| 				case 'caller': |  | ||||||
| 				case 'callee': |  | ||||||
| 					if (thisOtherHasOwnProperty(object, key)) throw thisThrowCallerCalleeArgumentsAccess(key); |  | ||||||
| 					break; |  | ||||||
| 			} |  | ||||||
| 			let ret; // @other(unsafe)
 |  | ||||||
| 			try { |  | ||||||
| 				ret = otherReflectGet(object, key); |  | ||||||
| 			} catch (e) { // @other(unsafe)
 |  | ||||||
| 				throw thisFromOther(e); |  | ||||||
| 			} |  | ||||||
| 			return this.fromOtherWithContext(ret); |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		set(target, key, value, receiver) { |  | ||||||
| 			// Note: target@this(unsafe) key@prim value@this(unsafe) receiver@this(unsafe) throws@this(unsafe)
 |  | ||||||
| 			const object = this.object; // @other(unsafe)
 |  | ||||||
| 			if (key === '__proto__' && !thisOtherHasOwnProperty(object, key)) { |  | ||||||
| 				return this.setPrototypeOf(target, value); |  | ||||||
| 			} |  | ||||||
| 			try { |  | ||||||
| 				value = otherFromThis(value); |  | ||||||
| 				return otherReflectSet(object, key, value) === true; |  | ||||||
| 			} catch (e) { // @other(unsafe)
 |  | ||||||
| 				throw thisFromOther(e); |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		getPrototypeOf(target) { |  | ||||||
| 			// Note: target@this(unsafe)
 |  | ||||||
| 			return thisReflectGetPrototypeOf(target); |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		setPrototypeOf(target, value) { |  | ||||||
| 			// Note: target@this(unsafe) throws@this(unsafe)
 |  | ||||||
| 			throw new VMError(OPNA); |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		apply(target, context, args) { |  | ||||||
| 			// Note: target@this(unsafe) context@this(unsafe) args@this(safe-array) throws@this(unsafe)
 |  | ||||||
| 			const object = this.object; // @other(unsafe)
 |  | ||||||
| 			let ret; // @other(unsafe)
 |  | ||||||
| 			try { |  | ||||||
| 				context = otherFromThis(context); |  | ||||||
| 				args = otherFromThisArguments(args); |  | ||||||
| 				ret = otherReflectApply(object, context, args); |  | ||||||
| 			} catch (e) { // @other(unsafe)
 |  | ||||||
| 				throw thisFromOther(e); |  | ||||||
| 			} |  | ||||||
| 			return thisFromOther(ret); |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		construct(target, args, newTarget) { |  | ||||||
| 			// Note: target@this(unsafe) args@this(safe-array) newTarget@this(unsafe) throws@this(unsafe)
 |  | ||||||
| 			const object = this.object; // @other(unsafe)
 |  | ||||||
| 			let ret; // @other(unsafe)
 |  | ||||||
| 			try { |  | ||||||
| 				args = otherFromThisArguments(args); |  | ||||||
| 				ret = otherReflectConstruct(object, args); |  | ||||||
| 			} catch (e) { // @other(unsafe)
 |  | ||||||
| 				throw thisFromOther(e); |  | ||||||
| 			} |  | ||||||
| 			return thisFromOtherWithFactory(this.getFactory(), ret, thisFromOther(object)); |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		getOwnPropertyDescriptorDesc(target, prop, desc) { |  | ||||||
| 			// Note: target@this(unsafe) prop@prim desc@other{safe} throws@this(unsafe)
 |  | ||||||
| 			const object = this.object; // @other(unsafe)
 |  | ||||||
| 			if (desc && typeof object === 'function' && (prop === 'arguments' || prop === 'caller' || prop === 'callee')) desc.value = null; |  | ||||||
| 			return desc; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		getOwnPropertyDescriptor(target, prop) { |  | ||||||
| 			// Note: target@this(unsafe) prop@prim throws@this(unsafe)
 |  | ||||||
| 			const object = this.object; // @other(unsafe)
 |  | ||||||
| 			let desc; // @other(safe)
 |  | ||||||
| 			try { |  | ||||||
| 				desc = otherSafeGetOwnPropertyDescriptor(object, prop); |  | ||||||
| 			} catch (e) { // @other(unsafe)
 |  | ||||||
| 				throw thisFromOther(e); |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			desc = this.getOwnPropertyDescriptorDesc(target, prop, desc); |  | ||||||
| 
 |  | ||||||
| 			if (!desc) return undefined; |  | ||||||
| 
 |  | ||||||
| 			let thisDesc; |  | ||||||
| 			if (desc.get || desc.set) { |  | ||||||
| 				thisDesc = { |  | ||||||
| 					__proto__: null, |  | ||||||
| 					get: this.fromOtherWithContext(desc.get), |  | ||||||
| 					set: this.fromOtherWithContext(desc.set), |  | ||||||
| 					enumerable: desc.enumerable === true, |  | ||||||
| 					configurable: desc.configurable === true |  | ||||||
| 				}; |  | ||||||
| 			} else { |  | ||||||
| 				thisDesc = { |  | ||||||
| 					__proto__: null, |  | ||||||
| 					value: this.fromOtherWithContext(desc.value), |  | ||||||
| 					writable: desc.writable === true, |  | ||||||
| 					enumerable: desc.enumerable === true, |  | ||||||
| 					configurable: desc.configurable === true |  | ||||||
| 				}; |  | ||||||
| 			} |  | ||||||
| 			if (!thisDesc.configurable) { |  | ||||||
| 				const oldDesc = thisSafeGetOwnPropertyDescriptor(target, prop); |  | ||||||
| 				if (!oldDesc || oldDesc.configurable || oldDesc.writable !== thisDesc.writable) { |  | ||||||
| 					if (!thisReflectDefineProperty(target, prop, thisDesc)) throw thisUnexpected(); |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 			return thisDesc; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		definePropertyDesc(target, prop, desc) { |  | ||||||
| 			// Note: target@this(unsafe) prop@prim desc@this(safe) throws@this(unsafe)
 |  | ||||||
| 			return desc; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		defineProperty(target, prop, desc) { |  | ||||||
| 			// Note: target@this(unsafe) prop@prim desc@this(unsafe) throws@this(unsafe)
 |  | ||||||
| 			const object = this.object; // @other(unsafe)
 |  | ||||||
| 			if (!thisReflectSetPrototypeOf(desc, null)) throw thisUnexpected(); |  | ||||||
| 
 |  | ||||||
| 			desc = this.definePropertyDesc(target, prop, desc); |  | ||||||
| 
 |  | ||||||
| 			if (!desc) return false; |  | ||||||
| 
 |  | ||||||
| 			let otherDesc = {__proto__: null}; |  | ||||||
| 			let hasFunc = true; |  | ||||||
| 			let hasValue = true; |  | ||||||
| 			let hasBasic = true; |  | ||||||
| 			hasFunc &= otherFromThisIfAvailable(otherDesc, desc, 'get'); |  | ||||||
| 			hasFunc &= otherFromThisIfAvailable(otherDesc, desc, 'set'); |  | ||||||
| 			hasValue &= otherFromThisIfAvailable(otherDesc, desc, 'value'); |  | ||||||
| 			hasValue &= otherFromThisIfAvailable(otherDesc, desc, 'writable'); |  | ||||||
| 			hasBasic &= otherFromThisIfAvailable(otherDesc, desc, 'enumerable'); |  | ||||||
| 			hasBasic &= otherFromThisIfAvailable(otherDesc, desc, 'configurable'); |  | ||||||
| 
 |  | ||||||
| 			try { |  | ||||||
| 				if (!otherReflectDefineProperty(object, prop, otherDesc)) return false; |  | ||||||
| 				if (otherDesc.configurable !== true && (!hasBasic || !(hasFunc || hasValue))) { |  | ||||||
| 					otherDesc = otherSafeGetOwnPropertyDescriptor(object, prop); |  | ||||||
| 				} |  | ||||||
| 			} catch (e) { // @other(unsafe)
 |  | ||||||
| 				throw thisFromOther(e); |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			if (!otherDesc.configurable) { |  | ||||||
| 				let thisDesc; |  | ||||||
| 				if (otherDesc.get || otherDesc.set) { |  | ||||||
| 					thisDesc = { |  | ||||||
| 						__proto__: null, |  | ||||||
| 						get: this.fromOtherWithContext(otherDesc.get), |  | ||||||
| 						set: this.fromOtherWithContext(otherDesc.set), |  | ||||||
| 						enumerable: otherDesc.enumerable, |  | ||||||
| 						configurable: otherDesc.configurable |  | ||||||
| 					}; |  | ||||||
| 				} else { |  | ||||||
| 					thisDesc = { |  | ||||||
| 						__proto__: null, |  | ||||||
| 						value: this.fromOtherWithContext(otherDesc.value), |  | ||||||
| 						writable: otherDesc.writable, |  | ||||||
| 						enumerable: otherDesc.enumerable, |  | ||||||
| 						configurable: otherDesc.configurable |  | ||||||
| 					}; |  | ||||||
| 				} |  | ||||||
| 				if (!thisReflectDefineProperty(target, prop, thisDesc)) throw thisUnexpected(); |  | ||||||
| 			} |  | ||||||
| 			return true; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		deleteProperty(target, prop) { |  | ||||||
| 			// Note: target@this(unsafe) prop@prim throws@this(unsafe)
 |  | ||||||
| 			const object = this.object; // @other(unsafe)
 |  | ||||||
| 			try { |  | ||||||
| 				return otherReflectDeleteProperty(object, prop) === true; |  | ||||||
| 			} catch (e) { // @other(unsafe)
 |  | ||||||
| 				throw thisFromOther(e); |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		has(target, key) { |  | ||||||
| 			// Note: target@this(unsafe) key@prim throws@this(unsafe)
 |  | ||||||
| 			const object = this.object; // @other(unsafe)
 |  | ||||||
| 			try { |  | ||||||
| 				return otherReflectHas(object, key) === true; |  | ||||||
| 			} catch (e) { // @other(unsafe)
 |  | ||||||
| 				throw thisFromOther(e); |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		isExtensible(target) { |  | ||||||
| 			// Note: target@this(unsafe) throws@this(unsafe)
 |  | ||||||
| 			const object = this.object; // @other(unsafe)
 |  | ||||||
| 			try { |  | ||||||
| 				if (otherReflectIsExtensible(object)) return true; |  | ||||||
| 			} catch (e) { // @other(unsafe)
 |  | ||||||
| 				throw thisFromOther(e); |  | ||||||
| 			} |  | ||||||
| 			if (thisReflectIsExtensible(target)) { |  | ||||||
| 				this.doPreventExtensions(target, object, this); |  | ||||||
| 			} |  | ||||||
| 			return false; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		ownKeys(target) { |  | ||||||
| 			// Note: target@this(unsafe) throws@this(unsafe)
 |  | ||||||
| 			const object = this.object; // @other(unsafe)
 |  | ||||||
| 			let res; // @other(unsafe)
 |  | ||||||
| 			try { |  | ||||||
| 				res = otherReflectOwnKeys(object); |  | ||||||
| 			} catch (e) { // @other(unsafe)
 |  | ||||||
| 				throw thisFromOther(e); |  | ||||||
| 			} |  | ||||||
| 			return thisFromOther(res); |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		preventExtensions(target) { |  | ||||||
| 			// Note: target@this(unsafe) throws@this(unsafe)
 |  | ||||||
| 			const object = this.object; // @other(unsafe)
 |  | ||||||
| 			try { |  | ||||||
| 				if (!otherReflectPreventExtensions(object)) return false; |  | ||||||
| 			} catch (e) { // @other(unsafe)
 |  | ||||||
| 				throw thisFromOther(e); |  | ||||||
| 			} |  | ||||||
| 			if (thisReflectIsExtensible(target)) { |  | ||||||
| 				this.doPreventExtensions(target, object, this); |  | ||||||
| 			} |  | ||||||
| 			return true; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		enumerate(target) { |  | ||||||
| 			// Note: target@this(unsafe) throws@this(unsafe)
 |  | ||||||
| 			const object = this.object; // @other(unsafe)
 |  | ||||||
| 			let res; // @other(unsafe)
 |  | ||||||
| 			try { |  | ||||||
| 				res = otherReflectEnumerate(object); |  | ||||||
| 			} catch (e) { // @other(unsafe)
 |  | ||||||
| 				throw thisFromOther(e); |  | ||||||
| 			} |  | ||||||
| 			return this.fromOtherWithContext(res); |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	function defaultFactory(object) { |  | ||||||
| 		// Note: other@other(unsafe) returns@this(unsafe) throws@this(unsafe)
 |  | ||||||
| 		return new BaseHandler(object); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	class ProtectedHandler extends BaseHandler { |  | ||||||
| 
 |  | ||||||
| 		getFactory() { |  | ||||||
| 			return protectedFactory; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		set(target, key, value, receiver) { |  | ||||||
| 			// Note: target@this(unsafe) key@prim value@this(unsafe) receiver@this(unsafe) throws@this(unsafe)
 |  | ||||||
| 			if (typeof value === 'function') { |  | ||||||
| 				return thisReflectDefineProperty(receiver, key, { |  | ||||||
| 					__proto__: null, |  | ||||||
| 					value: value, |  | ||||||
| 					writable: true, |  | ||||||
| 					enumerable: true, |  | ||||||
| 					configurable: true |  | ||||||
| 				}) === true; |  | ||||||
| 			} |  | ||||||
| 			return super.set(target, key, value, receiver); |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		definePropertyDesc(target, prop, desc) { |  | ||||||
| 			// Note: target@this(unsafe) prop@prim desc@this(safe) throws@this(unsafe)
 |  | ||||||
| 			if (desc && (desc.set || desc.get || typeof desc.value === 'function')) return undefined; |  | ||||||
| 			return desc; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	function protectedFactory(object) { |  | ||||||
| 		// Note: other@other(unsafe) returns@this(unsafe) throws@this(unsafe)
 |  | ||||||
| 		return new ProtectedHandler(object); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	class ReadOnlyHandler extends BaseHandler { |  | ||||||
| 
 |  | ||||||
| 		getFactory() { |  | ||||||
| 			return readonlyFactory; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		set(target, key, value, receiver) { |  | ||||||
| 			// Note: target@this(unsafe) key@prim value@this(unsafe) receiver@this(unsafe) throws@this(unsafe)
 |  | ||||||
| 			return thisReflectDefineProperty(receiver, key, { |  | ||||||
| 				__proto__: null, |  | ||||||
| 				value: value, |  | ||||||
| 				writable: true, |  | ||||||
| 				enumerable: true, |  | ||||||
| 				configurable: true |  | ||||||
| 			}); |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		setPrototypeOf(target, value) { |  | ||||||
| 			// Note: target@this(unsafe) throws@this(unsafe)
 |  | ||||||
| 			return false; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		defineProperty(target, prop, desc) { |  | ||||||
| 			// Note: target@this(unsafe) prop@prim desc@this(unsafe) throws@this(unsafe)
 |  | ||||||
| 			return false; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		deleteProperty(target, prop) { |  | ||||||
| 			// Note: target@this(unsafe) prop@prim throws@this(unsafe)
 |  | ||||||
| 			return false; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		isExtensible(target) { |  | ||||||
| 			// Note: target@this(unsafe) throws@this(unsafe)
 |  | ||||||
| 			return false; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		preventExtensions(target) { |  | ||||||
| 			// Note: target@this(unsafe) throws@this(unsafe)
 |  | ||||||
| 			return false; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	function readonlyFactory(object) { |  | ||||||
| 		// Note: other@other(unsafe) returns@this(unsafe) throws@this(unsafe)
 |  | ||||||
| 		return new ReadOnlyHandler(object); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	class ReadOnlyMockHandler extends ReadOnlyHandler { |  | ||||||
| 
 |  | ||||||
| 		constructor(object, mock) { |  | ||||||
| 			// Note: object@other(unsafe) mock:this(unsafe) throws@this(unsafe)
 |  | ||||||
| 			super(object); |  | ||||||
| 			this.mock = mock; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		get(target, key, receiver) { |  | ||||||
| 			// Note: target@this(unsafe) key@prim receiver@this(unsafe) throws@this(unsafe)
 |  | ||||||
| 			const object = this.object; // @other(unsafe)
 |  | ||||||
| 			const mock = this.mock; |  | ||||||
| 			if (thisReflectApply(thisObjectHasOwnProperty, mock, key) && !thisOtherHasOwnProperty(object, key)) { |  | ||||||
| 				return mock[key]; |  | ||||||
| 			} |  | ||||||
| 			return super.get(target, key, receiver); |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	function thisFromOther(other) { |  | ||||||
| 		// Note: other@other(unsafe) returns@this(unsafe) throws@this(unsafe)
 |  | ||||||
| 		return thisFromOtherWithFactory(defaultFactory, other); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	function thisProxyOther(factory, other, proto) { |  | ||||||
| 		const target = thisCreateTargetObject(other, proto); |  | ||||||
| 		const handler = factory(other); |  | ||||||
| 		const proxy = new ThisProxy(target, handler); |  | ||||||
| 		try { |  | ||||||
| 			otherReflectApply(otherWeakMapSet, mappingThisToOther, [proxy, other]); |  | ||||||
| 			registerProxy(proxy, handler); |  | ||||||
| 		} catch (e) { |  | ||||||
| 			throw new VMError('Unexpected error'); |  | ||||||
| 		} |  | ||||||
| 		if (!isHost) { |  | ||||||
| 			thisReflectApply(thisWeakMapSet, mappingOtherToThis, [other, proxy]); |  | ||||||
| 			return proxy; |  | ||||||
| 		} |  | ||||||
| 		const proxy2 = new ThisProxy(proxy, emptyForzenObject); |  | ||||||
| 		try { |  | ||||||
| 			otherReflectApply(otherWeakMapSet, mappingThisToOther, [proxy2, other]); |  | ||||||
| 			registerProxy(proxy2, handler); |  | ||||||
| 		} catch (e) { |  | ||||||
| 			throw new VMError('Unexpected error'); |  | ||||||
| 		} |  | ||||||
| 		thisReflectApply(thisWeakMapSet, mappingOtherToThis, [other, proxy2]); |  | ||||||
| 		return proxy2; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	function thisEnsureThis(other) { |  | ||||||
| 		const type = typeof other; |  | ||||||
| 		switch (type) { |  | ||||||
| 			case 'object': |  | ||||||
| 			case 'function': |  | ||||||
| 				if (other === null) { |  | ||||||
| 					return null; |  | ||||||
| 				} else { |  | ||||||
| 					let proto = thisReflectGetPrototypeOf(other); |  | ||||||
| 					if (!proto) { |  | ||||||
| 						return other; |  | ||||||
| 					} |  | ||||||
| 					while (proto) { |  | ||||||
| 						const mapping = thisReflectApply(thisMapGet, protoMappings, [proto]); |  | ||||||
| 						if (mapping) { |  | ||||||
| 							const mapped = thisReflectApply(thisWeakMapGet, mappingOtherToThis, [other]); |  | ||||||
| 							if (mapped) return mapped; |  | ||||||
| 							return mapping(defaultFactory, other); |  | ||||||
| 						} |  | ||||||
| 						proto = thisReflectGetPrototypeOf(proto); |  | ||||||
| 					} |  | ||||||
| 					return other; |  | ||||||
| 				} |  | ||||||
| 
 |  | ||||||
| 			case 'undefined': |  | ||||||
| 			case 'string': |  | ||||||
| 			case 'number': |  | ||||||
| 			case 'boolean': |  | ||||||
| 			case 'symbol': |  | ||||||
| 			case 'bigint': |  | ||||||
| 				return other; |  | ||||||
| 
 |  | ||||||
| 			default: // new, unknown types can be dangerous
 |  | ||||||
| 				throw new VMError(`Unknown type '${type}'`); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	function thisFromOtherWithFactory(factory, other, proto) { |  | ||||||
| 		for (let loop = 0; loop < 10; loop++) { |  | ||||||
| 			const type = typeof other; |  | ||||||
| 			switch (type) { |  | ||||||
| 				case 'object': |  | ||||||
| 				case 'function': |  | ||||||
| 					if (other === null) { |  | ||||||
| 						return null; |  | ||||||
| 					} else { |  | ||||||
| 						const mapped = thisReflectApply(thisWeakMapGet, mappingOtherToThis, [other]); |  | ||||||
| 						if (mapped) return mapped; |  | ||||||
| 						if (proto) { |  | ||||||
| 							return thisProxyOther(factory, other, proto); |  | ||||||
| 						} |  | ||||||
| 						try { |  | ||||||
| 							proto = otherReflectGetPrototypeOf(other); |  | ||||||
| 						} catch (e) { // @other(unsafe)
 |  | ||||||
| 							other = e; |  | ||||||
| 							break; |  | ||||||
| 						} |  | ||||||
| 						if (!proto) { |  | ||||||
| 							return thisProxyOther(factory, other, null); |  | ||||||
| 						} |  | ||||||
| 						while (proto) { |  | ||||||
| 							const mapping = thisReflectApply(thisMapGet, protoMappings, [proto]); |  | ||||||
| 							if (mapping) return mapping(factory, other); |  | ||||||
| 							try { |  | ||||||
| 								proto = otherReflectGetPrototypeOf(proto); |  | ||||||
| 							} catch (e) { // @other(unsafe)
 |  | ||||||
| 								other = e; |  | ||||||
| 								break; |  | ||||||
| 							} |  | ||||||
| 						} |  | ||||||
| 						return thisProxyOther(factory, other, thisObjectPrototype); |  | ||||||
| 					} |  | ||||||
| 
 |  | ||||||
| 				case 'undefined': |  | ||||||
| 				case 'string': |  | ||||||
| 				case 'number': |  | ||||||
| 				case 'boolean': |  | ||||||
| 				case 'symbol': |  | ||||||
| 				case 'bigint': |  | ||||||
| 					return other; |  | ||||||
| 
 |  | ||||||
| 				default: // new, unknown types can be dangerous
 |  | ||||||
| 					throw new VMError(`Unknown type '${type}'`); |  | ||||||
| 			} |  | ||||||
| 			factory = defaultFactory; |  | ||||||
| 			proto = undefined; |  | ||||||
| 		} |  | ||||||
| 		throw new VMError('Exception recursion depth'); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	function thisFromOtherArguments(args) { |  | ||||||
| 		// Note: args@other(safe-array) returns@this(safe-array) throws@this(unsafe)
 |  | ||||||
| 		const arr = []; |  | ||||||
| 		for (let i = 0; i < args.length; i++) { |  | ||||||
| 			const value = thisFromOther(args[i]); |  | ||||||
| 			thisReflectDefineProperty(arr, i, { |  | ||||||
| 				__proto__: null, |  | ||||||
| 				value: value, |  | ||||||
| 				writable: true, |  | ||||||
| 				enumerable: true, |  | ||||||
| 				configurable: true |  | ||||||
| 			}); |  | ||||||
| 		} |  | ||||||
| 		return arr; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	function thisConnect(obj, other) { |  | ||||||
| 		// Note: obj@this(unsafe) other@other(unsafe) throws@this(unsafe)
 |  | ||||||
| 		try { |  | ||||||
| 			otherReflectApply(otherWeakMapSet, mappingThisToOther, [obj, other]); |  | ||||||
| 		} catch (e) { |  | ||||||
| 			throw new VMError('Unexpected error'); |  | ||||||
| 		} |  | ||||||
| 		thisReflectApply(thisWeakMapSet, mappingOtherToThis, [other, obj]); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	thisAddProtoMapping(thisGlobalPrototypes.Object, otherGlobalPrototypes.Object); |  | ||||||
| 	thisAddProtoMapping(thisGlobalPrototypes.Array, otherGlobalPrototypes.Array); |  | ||||||
| 
 |  | ||||||
| 	for (let i = 0; i < globalsList.length; i++) { |  | ||||||
| 		const key = globalsList[i]; |  | ||||||
| 		const tp = thisGlobalPrototypes[key]; |  | ||||||
| 		const op = otherGlobalPrototypes[key]; |  | ||||||
| 		if (tp && op) thisAddProtoMapping(tp, op, key); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	for (let i = 0; i < errorsList.length; i++) { |  | ||||||
| 		const key = errorsList[i]; |  | ||||||
| 		const tp = thisGlobalPrototypes[key]; |  | ||||||
| 		const op = otherGlobalPrototypes[key]; |  | ||||||
| 		if (tp && op) thisAddProtoMapping(tp, op, 'Error'); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	thisAddProtoMapping(thisGlobalPrototypes.VMError, otherGlobalPrototypes.VMError, 'Error'); |  | ||||||
| 
 |  | ||||||
| 	result.BaseHandler = BaseHandler; |  | ||||||
| 	result.ProtectedHandler = ProtectedHandler; |  | ||||||
| 	result.ReadOnlyHandler = ReadOnlyHandler; |  | ||||||
| 	result.ReadOnlyMockHandler = ReadOnlyMockHandler; |  | ||||||
| 
 |  | ||||||
| 	return result; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| exports.createBridge = createBridge; |  | ||||||
| exports.VMError = VMError; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| /***/ }) |  | ||||||
| 
 |  | ||||||
| /******/ 	}); |  | ||||||
| /************************************************************************/ |  | ||||||
| /******/ 	/* webpack/runtime/compat */ |  | ||||||
| /******/ 	 |  | ||||||
| /******/ 	if (typeof __nccwpck_require__ !== 'undefined') __nccwpck_require__.ab = __dirname + "/";/************************************************************************/ |  | ||||||
| /******/ 	 |  | ||||||
| /******/ 	// startup
 |  | ||||||
| /******/ 	// Load entry module and return exports
 |  | ||||||
| /******/ 	// This entry module is referenced by other modules so it can't be inlined
 |  | ||||||
| /******/ 	var __webpack_exports__ = {}; |  | ||||||
| /******/ 	__webpack_modules__[989](0, __webpack_exports__); |  | ||||||
| /******/ 	module.exports = __webpack_exports__; |  | ||||||
| /******/ 	 |  | ||||||
| /******/ })() |  | ||||||
| ; |  | ||||||
							
								
								
									
										1033
									
								
								dist/events.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1033
									
								
								dist/events.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										52721
									
								
								dist/index.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										52721
									
								
								dist/index.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										473
									
								
								dist/setup-node-sandbox.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										473
									
								
								dist/setup-node-sandbox.js
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,473 +0,0 @@ | |||||||
| /******/ (() => { // webpackBootstrap
 |  | ||||||
| /******/ 	"use strict"; |  | ||||||
| /******/ 	/* webpack/runtime/compat */ |  | ||||||
| /******/ 	 |  | ||||||
| /******/ 	if (typeof __nccwpck_require__ !== 'undefined') __nccwpck_require__.ab = __dirname + "/";/************************************************************************/ |  | ||||||
| var __webpack_exports__ = {}; |  | ||||||
| /* global host, data, VMError */ |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| const LocalError = Error; |  | ||||||
| const LocalTypeError = TypeError; |  | ||||||
| const LocalWeakMap = WeakMap; |  | ||||||
| 
 |  | ||||||
| const { |  | ||||||
| 	apply: localReflectApply, |  | ||||||
| 	defineProperty: localReflectDefineProperty |  | ||||||
| } = Reflect; |  | ||||||
| 
 |  | ||||||
| const { |  | ||||||
| 	set: localWeakMapSet, |  | ||||||
| 	get: localWeakMapGet |  | ||||||
| } = LocalWeakMap.prototype; |  | ||||||
| 
 |  | ||||||
| const { |  | ||||||
| 	isArray: localArrayIsArray |  | ||||||
| } = Array; |  | ||||||
| 
 |  | ||||||
| function uncurryThis(func) { |  | ||||||
| 	return (thiz, ...args) => localReflectApply(func, thiz, args); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| const localArrayPrototypeSlice = uncurryThis(Array.prototype.slice); |  | ||||||
| const localArrayPrototypeIncludes = uncurryThis(Array.prototype.includes); |  | ||||||
| const localArrayPrototypePush = uncurryThis(Array.prototype.push); |  | ||||||
| const localArrayPrototypeIndexOf = uncurryThis(Array.prototype.indexOf); |  | ||||||
| const localArrayPrototypeSplice = uncurryThis(Array.prototype.splice); |  | ||||||
| const localStringPrototypeStartsWith = uncurryThis(String.prototype.startsWith); |  | ||||||
| const localStringPrototypeSlice = uncurryThis(String.prototype.slice); |  | ||||||
| const localStringPrototypeIndexOf = uncurryThis(String.prototype.indexOf); |  | ||||||
| 
 |  | ||||||
| const { |  | ||||||
| 	argv: optionArgv, |  | ||||||
| 	env: optionEnv, |  | ||||||
| 	console: optionConsole, |  | ||||||
| 	vm, |  | ||||||
| 	resolver, |  | ||||||
| 	extensions |  | ||||||
| } = data; |  | ||||||
| 
 |  | ||||||
| function ensureSandboxArray(a) { |  | ||||||
| 	return localArrayPrototypeSlice(a); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| const globalPaths = ensureSandboxArray(resolver.globalPaths); |  | ||||||
| 
 |  | ||||||
| class Module { |  | ||||||
| 
 |  | ||||||
| 	constructor(id, path, parent) { |  | ||||||
| 		this.id = id; |  | ||||||
| 		this.filename = id; |  | ||||||
| 		this.path = path; |  | ||||||
| 		this.parent = parent; |  | ||||||
| 		this.loaded = false; |  | ||||||
| 		this.paths = path ? ensureSandboxArray(resolver.genLookupPaths(path)) : []; |  | ||||||
| 		this.children = []; |  | ||||||
| 		this.exports = {}; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	_updateChildren(child, isNew) { |  | ||||||
| 		const children = this.children; |  | ||||||
| 		if (children && (isNew || !localArrayPrototypeIncludes(children, child))) { |  | ||||||
| 			localArrayPrototypePush(children, child); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	require(id) { |  | ||||||
| 		return requireImpl(this, id, false); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| const originalRequire = Module.prototype.require; |  | ||||||
| const cacheBuiltins = {__proto__: null}; |  | ||||||
| 
 |  | ||||||
| function requireImpl(mod, id, direct) { |  | ||||||
| 	if (direct && mod.require !== originalRequire) { |  | ||||||
| 		return mod.require(id); |  | ||||||
| 	} |  | ||||||
| 	const filename = resolver.resolve(mod, id, undefined, Module._extensions, direct); |  | ||||||
| 	if (localStringPrototypeStartsWith(filename, 'node:')) { |  | ||||||
| 		id = localStringPrototypeSlice(filename, 5); |  | ||||||
| 		let nmod = cacheBuiltins[id]; |  | ||||||
| 		if (!nmod) { |  | ||||||
| 			nmod = resolver.loadBuiltinModule(vm, id); |  | ||||||
| 			if (!nmod) throw new VMError(`Cannot find module '${filename}'`, 'ENOTFOUND'); |  | ||||||
| 			cacheBuiltins[id] = nmod; |  | ||||||
| 		} |  | ||||||
| 		return nmod; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	const cachedModule = Module._cache[filename]; |  | ||||||
| 	if (cachedModule !== undefined) { |  | ||||||
| 		mod._updateChildren(cachedModule, false); |  | ||||||
| 		return cachedModule.exports; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	let nmod = cacheBuiltins[id]; |  | ||||||
| 	if (nmod) return nmod; |  | ||||||
| 	nmod = resolver.loadBuiltinModule(vm, id); |  | ||||||
| 	if (nmod) { |  | ||||||
| 		cacheBuiltins[id] = nmod; |  | ||||||
| 		return nmod; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	const path = resolver.pathDirname(filename); |  | ||||||
| 	const module = new Module(filename, path, mod); |  | ||||||
| 	resolver.registerModule(module, filename, path, mod, direct); |  | ||||||
| 	mod._updateChildren(module, true); |  | ||||||
| 	try { |  | ||||||
| 		Module._cache[filename] = module; |  | ||||||
| 		const handler = findBestExtensionHandler(filename); |  | ||||||
| 		handler(module, filename); |  | ||||||
| 		module.loaded = true; |  | ||||||
| 	} catch (e) { |  | ||||||
| 		delete Module._cache[filename]; |  | ||||||
| 		const children = mod.children; |  | ||||||
| 		if (localArrayIsArray(children)) { |  | ||||||
| 			const index = localArrayPrototypeIndexOf(children, module); |  | ||||||
| 			if (index !== -1) { |  | ||||||
| 				localArrayPrototypeSplice(children, index, 1); |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		throw e; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return module.exports; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| Module.builtinModules = ensureSandboxArray(resolver.getBuiltinModulesList()); |  | ||||||
| Module.globalPaths = globalPaths; |  | ||||||
| Module._extensions = {__proto__: null}; |  | ||||||
| Module._cache = {__proto__: null}; |  | ||||||
| 
 |  | ||||||
| { |  | ||||||
| 	const keys = Object.getOwnPropertyNames(extensions); |  | ||||||
| 	for (let i = 0; i < keys.length; i++) { |  | ||||||
| 		const key = keys[i]; |  | ||||||
| 		const handler = extensions[key]; |  | ||||||
| 		Module._extensions[key] = (mod, filename) => handler(mod, filename); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function findBestExtensionHandler(filename) { |  | ||||||
| 	const name = resolver.pathBasename(filename); |  | ||||||
| 	for (let i = 0; (i = localStringPrototypeIndexOf(name, '.', i + 1)) !== -1;) { |  | ||||||
| 		const ext = localStringPrototypeSlice(name, i + 1); |  | ||||||
| 		const handler = Module._extensions[ext]; |  | ||||||
| 		if (handler) return handler; |  | ||||||
| 	} |  | ||||||
| 	const js = Module._extensions['.js']; |  | ||||||
| 	if (js) return js; |  | ||||||
| 	const keys = Object.getOwnPropertyNames(Module._extensions); |  | ||||||
| 	if (keys.length === 0) throw new VMError(`Failed to load '${filename}': Unknown type.`, 'ELOADFAIL'); |  | ||||||
| 	return Module._extensions[keys[0]]; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function createRequireForModule(mod) { |  | ||||||
| 	// eslint-disable-next-line no-shadow
 |  | ||||||
| 	function require(id) { |  | ||||||
| 		return requireImpl(mod, id, true); |  | ||||||
| 	} |  | ||||||
| 	function resolve(id, options) { |  | ||||||
| 		return resolver.resolve(mod, id, options, Module._extensions, true); |  | ||||||
| 	} |  | ||||||
| 	require.resolve = resolve; |  | ||||||
| 	function paths(id) { |  | ||||||
| 		return ensureSandboxArray(resolver.lookupPaths(mod, id)); |  | ||||||
| 	} |  | ||||||
| 	resolve.paths = paths; |  | ||||||
| 
 |  | ||||||
| 	require.extensions = Module._extensions; |  | ||||||
| 
 |  | ||||||
| 	require.cache = Module._cache; |  | ||||||
| 
 |  | ||||||
| 	return require; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /** |  | ||||||
|  * Prepare sandbox. |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| const TIMERS = new LocalWeakMap(); |  | ||||||
| 
 |  | ||||||
| class Timeout { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| class Interval { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| class Immediate { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function clearTimer(timer) { |  | ||||||
| 	const obj = localReflectApply(localWeakMapGet, TIMERS, [timer]); |  | ||||||
| 	if (obj) { |  | ||||||
| 		obj.clear(obj.value); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // This is a function and not an arrow function, since the original is also a function
 |  | ||||||
| // eslint-disable-next-line no-shadow
 |  | ||||||
| global.setTimeout = function setTimeout(callback, delay, ...args) { |  | ||||||
| 	if (typeof callback !== 'function') throw new LocalTypeError('"callback" argument must be a function'); |  | ||||||
| 	const obj = new Timeout(callback, args); |  | ||||||
| 	const cb = () => { |  | ||||||
| 		localReflectApply(callback, null, args); |  | ||||||
| 	}; |  | ||||||
| 	const tmr = host.setTimeout(cb, delay); |  | ||||||
| 
 |  | ||||||
| 	const ref = { |  | ||||||
| 		__proto__: null, |  | ||||||
| 		clear: host.clearTimeout, |  | ||||||
| 		value: tmr |  | ||||||
| 	}; |  | ||||||
| 
 |  | ||||||
| 	localReflectApply(localWeakMapSet, TIMERS, [obj, ref]); |  | ||||||
| 	return obj; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| // eslint-disable-next-line no-shadow
 |  | ||||||
| global.setInterval = function setInterval(callback, interval, ...args) { |  | ||||||
| 	if (typeof callback !== 'function') throw new LocalTypeError('"callback" argument must be a function'); |  | ||||||
| 	const obj = new Interval(); |  | ||||||
| 	const cb = () => { |  | ||||||
| 		localReflectApply(callback, null, args); |  | ||||||
| 	}; |  | ||||||
| 	const tmr = host.setInterval(cb, interval); |  | ||||||
| 
 |  | ||||||
| 	const ref = { |  | ||||||
| 		__proto__: null, |  | ||||||
| 		clear: host.clearInterval, |  | ||||||
| 		value: tmr |  | ||||||
| 	}; |  | ||||||
| 
 |  | ||||||
| 	localReflectApply(localWeakMapSet, TIMERS, [obj, ref]); |  | ||||||
| 	return obj; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| // eslint-disable-next-line no-shadow
 |  | ||||||
| global.setImmediate = function setImmediate(callback, ...args) { |  | ||||||
| 	if (typeof callback !== 'function') throw new LocalTypeError('"callback" argument must be a function'); |  | ||||||
| 	const obj = new Immediate(); |  | ||||||
| 	const cb = () => { |  | ||||||
| 		localReflectApply(callback, null, args); |  | ||||||
| 	}; |  | ||||||
| 	const tmr = host.setImmediate(cb); |  | ||||||
| 
 |  | ||||||
| 	const ref = { |  | ||||||
| 		__proto__: null, |  | ||||||
| 		clear: host.clearImmediate, |  | ||||||
| 		value: tmr |  | ||||||
| 	}; |  | ||||||
| 
 |  | ||||||
| 	localReflectApply(localWeakMapSet, TIMERS, [obj, ref]); |  | ||||||
| 	return obj; |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| // eslint-disable-next-line no-shadow
 |  | ||||||
| global.clearTimeout = function clearTimeout(timeout) { |  | ||||||
| 	clearTimer(timeout); |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| // eslint-disable-next-line no-shadow
 |  | ||||||
| global.clearInterval = function clearInterval(interval) { |  | ||||||
| 	clearTimer(interval); |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| // eslint-disable-next-line no-shadow
 |  | ||||||
| global.clearImmediate = function clearImmediate(immediate) { |  | ||||||
| 	clearTimer(immediate); |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| const localProcess = host.process; |  | ||||||
| 
 |  | ||||||
| function vmEmitArgs(event, args) { |  | ||||||
| 	const allargs = [event]; |  | ||||||
| 	for (let i = 0; i < args.length; i++) { |  | ||||||
| 		if (!localReflectDefineProperty(allargs, i + 1, { |  | ||||||
| 			__proto__: null, |  | ||||||
| 			value: args[i], |  | ||||||
| 			writable: true, |  | ||||||
| 			enumerable: true, |  | ||||||
| 			configurable: true |  | ||||||
| 		})) throw new LocalError('Unexpected'); |  | ||||||
| 	} |  | ||||||
| 	return localReflectApply(vm.emit, vm, allargs); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| const LISTENERS = new LocalWeakMap(); |  | ||||||
| const LISTENER_HANDLER = new LocalWeakMap(); |  | ||||||
| 
 |  | ||||||
| /** |  | ||||||
|  * |  | ||||||
|  * @param {*} name |  | ||||||
|  * @param {*} handler |  | ||||||
|  * @this process |  | ||||||
|  * @return {this} |  | ||||||
|  */ |  | ||||||
| function addListener(name, handler) { |  | ||||||
| 	if (name !== 'beforeExit' && name !== 'exit') { |  | ||||||
| 		throw new LocalError(`Access denied to listen for '${name}' event.`); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	let cb = localReflectApply(localWeakMapGet, LISTENERS, [handler]); |  | ||||||
| 	if (!cb) { |  | ||||||
| 		cb = () => { |  | ||||||
| 			handler(); |  | ||||||
| 		}; |  | ||||||
| 		localReflectApply(localWeakMapSet, LISTENER_HANDLER, [cb, handler]); |  | ||||||
| 		localReflectApply(localWeakMapSet, LISTENERS, [handler, cb]); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	localProcess.on(name, cb); |  | ||||||
| 
 |  | ||||||
| 	return this; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /** |  | ||||||
|  * |  | ||||||
|  * @this process |  | ||||||
|  * @return {this} |  | ||||||
|  */ |  | ||||||
| // eslint-disable-next-line no-shadow
 |  | ||||||
| function process() { |  | ||||||
| 	return this; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // FIXME wrong class structure
 |  | ||||||
| global.process = { |  | ||||||
| 	__proto__: process.prototype, |  | ||||||
| 	argv: optionArgv !== undefined ? optionArgv : [], |  | ||||||
| 	title: localProcess.title, |  | ||||||
| 	version: localProcess.version, |  | ||||||
| 	versions: localProcess.versions, |  | ||||||
| 	arch: localProcess.arch, |  | ||||||
| 	platform: localProcess.platform, |  | ||||||
| 	env: optionEnv !== undefined ? optionEnv : {}, |  | ||||||
| 	pid: localProcess.pid, |  | ||||||
| 	features: localProcess.features, |  | ||||||
| 	nextTick: function nextTick(callback, ...args) { |  | ||||||
| 		if (typeof callback !== 'function') { |  | ||||||
| 			throw new LocalError('Callback must be a function.'); |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		localProcess.nextTick(()=>{ |  | ||||||
| 			localReflectApply(callback, null, args); |  | ||||||
| 		}); |  | ||||||
| 	}, |  | ||||||
| 	hrtime: function hrtime(time) { |  | ||||||
| 		return localProcess.hrtime(time); |  | ||||||
| 	}, |  | ||||||
| 	cwd: function cwd() { |  | ||||||
| 		return localProcess.cwd(); |  | ||||||
| 	}, |  | ||||||
| 	addListener, |  | ||||||
| 	on: addListener, |  | ||||||
| 
 |  | ||||||
| 	once: function once(name, handler) { |  | ||||||
| 		if (name !== 'beforeExit' && name !== 'exit') { |  | ||||||
| 			throw new LocalError(`Access denied to listen for '${name}' event.`); |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		let triggered = false; |  | ||||||
| 		const cb = () => { |  | ||||||
| 			if (triggered) return; |  | ||||||
| 			triggered = true; |  | ||||||
| 			localProcess.removeListener(name, cb); |  | ||||||
| 			handler(); |  | ||||||
| 		}; |  | ||||||
| 		localReflectApply(localWeakMapSet, LISTENER_HANDLER, [cb, handler]); |  | ||||||
| 
 |  | ||||||
| 		localProcess.on(name, cb); |  | ||||||
| 
 |  | ||||||
| 		return this; |  | ||||||
| 	}, |  | ||||||
| 
 |  | ||||||
| 	listeners: function listeners(name) { |  | ||||||
| 		if (name !== 'beforeExit' && name !== 'exit') { |  | ||||||
| 			// Maybe add ({__proto__:null})[name] to throw when name fails in https://tc39.es/ecma262/#sec-topropertykey.
 |  | ||||||
| 			return []; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		// Filter out listeners, which were not created in this sandbox
 |  | ||||||
| 		const all = localProcess.listeners(name); |  | ||||||
| 		const filtered = []; |  | ||||||
| 		let j = 0; |  | ||||||
| 		for (let i = 0; i < all.length; i++) { |  | ||||||
| 			const h = localReflectApply(localWeakMapGet, LISTENER_HANDLER, [all[i]]); |  | ||||||
| 			if (h) { |  | ||||||
| 				if (!localReflectDefineProperty(filtered, j, { |  | ||||||
| 					__proto__: null, |  | ||||||
| 					value: h, |  | ||||||
| 					writable: true, |  | ||||||
| 					enumerable: true, |  | ||||||
| 					configurable: true |  | ||||||
| 				})) throw new LocalError('Unexpected'); |  | ||||||
| 				j++; |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		return filtered; |  | ||||||
| 	}, |  | ||||||
| 
 |  | ||||||
| 	removeListener: function removeListener(name, handler) { |  | ||||||
| 		if (name !== 'beforeExit' && name !== 'exit') { |  | ||||||
| 			return this; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		const cb = localReflectApply(localWeakMapGet, LISTENERS, [handler]); |  | ||||||
| 		if (cb) localProcess.removeListener(name, cb); |  | ||||||
| 
 |  | ||||||
| 		return this; |  | ||||||
| 	}, |  | ||||||
| 
 |  | ||||||
| 	umask: function umask() { |  | ||||||
| 		if (arguments.length) { |  | ||||||
| 			throw new LocalError('Access denied to set umask.'); |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		return localProcess.umask(); |  | ||||||
| 	} |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| if (optionConsole === 'inherit') { |  | ||||||
| 	global.console = host.console; |  | ||||||
| } else if (optionConsole === 'redirect') { |  | ||||||
| 	global.console = { |  | ||||||
| 		debug(...args) { |  | ||||||
| 			vmEmitArgs('console.debug', args); |  | ||||||
| 		}, |  | ||||||
| 		log(...args) { |  | ||||||
| 			vmEmitArgs('console.log', args); |  | ||||||
| 		}, |  | ||||||
| 		info(...args) { |  | ||||||
| 			vmEmitArgs('console.info', args); |  | ||||||
| 		}, |  | ||||||
| 		warn(...args) { |  | ||||||
| 			vmEmitArgs('console.warn', args); |  | ||||||
| 		}, |  | ||||||
| 		error(...args) { |  | ||||||
| 			vmEmitArgs('console.error', args); |  | ||||||
| 		}, |  | ||||||
| 		dir(...args) { |  | ||||||
| 			vmEmitArgs('console.dir', args); |  | ||||||
| 		}, |  | ||||||
| 		time() {}, |  | ||||||
| 		timeEnd() {}, |  | ||||||
| 		trace(...args) { |  | ||||||
| 			vmEmitArgs('console.trace', args); |  | ||||||
| 		} |  | ||||||
| 	}; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| return { |  | ||||||
| 	__proto__: null, |  | ||||||
| 	Module, |  | ||||||
| 	jsonParse: JSON.parse, |  | ||||||
| 	createRequireForModule |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| module.exports = __webpack_exports__; |  | ||||||
| /******/ })() |  | ||||||
| ; |  | ||||||
							
								
								
									
										462
									
								
								dist/setup-sandbox.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										462
									
								
								dist/setup-sandbox.js
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1,462 +0,0 @@ | |||||||
| /******/ (() => { // webpackBootstrap
 |  | ||||||
| /******/ 	"use strict"; |  | ||||||
| /******/ 	/* webpack/runtime/compat */ |  | ||||||
| /******/ 	 |  | ||||||
| /******/ 	if (typeof __nccwpck_require__ !== 'undefined') __nccwpck_require__.ab = __dirname + "/";/************************************************************************/ |  | ||||||
| var __webpack_exports__ = {}; |  | ||||||
| /* global host, bridge, data, context */ |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| const { |  | ||||||
| 	Object: localObject, |  | ||||||
| 	Array: localArray, |  | ||||||
| 	Error: LocalError, |  | ||||||
| 	Reflect: localReflect, |  | ||||||
| 	Proxy: LocalProxy, |  | ||||||
| 	WeakMap: LocalWeakMap, |  | ||||||
| 	Function: localFunction, |  | ||||||
| 	Promise: localPromise, |  | ||||||
| 	eval: localEval |  | ||||||
| } = global; |  | ||||||
| 
 |  | ||||||
| const { |  | ||||||
| 	freeze: localObjectFreeze |  | ||||||
| } = localObject; |  | ||||||
| 
 |  | ||||||
| const { |  | ||||||
| 	getPrototypeOf: localReflectGetPrototypeOf, |  | ||||||
| 	apply: localReflectApply, |  | ||||||
| 	deleteProperty: localReflectDeleteProperty, |  | ||||||
| 	has: localReflectHas, |  | ||||||
| 	defineProperty: localReflectDefineProperty, |  | ||||||
| 	setPrototypeOf: localReflectSetPrototypeOf, |  | ||||||
| 	getOwnPropertyDescriptor: localReflectGetOwnPropertyDescriptor |  | ||||||
| } = localReflect; |  | ||||||
| 
 |  | ||||||
| const { |  | ||||||
| 	isArray: localArrayIsArray |  | ||||||
| } = localArray; |  | ||||||
| 
 |  | ||||||
| const { |  | ||||||
| 	ensureThis, |  | ||||||
| 	ReadOnlyHandler, |  | ||||||
| 	from, |  | ||||||
| 	fromWithFactory, |  | ||||||
| 	readonlyFactory, |  | ||||||
| 	connect, |  | ||||||
| 	addProtoMapping, |  | ||||||
| 	VMError, |  | ||||||
| 	ReadOnlyMockHandler |  | ||||||
| } = bridge; |  | ||||||
| 
 |  | ||||||
| const { |  | ||||||
| 	allowAsync, |  | ||||||
| 	GeneratorFunction, |  | ||||||
| 	AsyncFunction, |  | ||||||
| 	AsyncGeneratorFunction |  | ||||||
| } = data; |  | ||||||
| 
 |  | ||||||
| const localWeakMapGet = LocalWeakMap.prototype.get; |  | ||||||
| 
 |  | ||||||
| function localUnexpected() { |  | ||||||
| 	return new VMError('Should not happen'); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // global is originally prototype of host.Object so it can be used to climb up from the sandbox.
 |  | ||||||
| if (!localReflectSetPrototypeOf(context, localObject.prototype)) throw localUnexpected(); |  | ||||||
| 
 |  | ||||||
| Object.defineProperties(global, { |  | ||||||
| 	global: {value: global, writable: true, configurable: true, enumerable: true}, |  | ||||||
| 	globalThis: {value: global, writable: true, configurable: true}, |  | ||||||
| 	GLOBAL: {value: global, writable: true, configurable: true}, |  | ||||||
| 	root: {value: global, writable: true, configurable: true} |  | ||||||
| }); |  | ||||||
| 
 |  | ||||||
| if (!localReflectDefineProperty(global, 'VMError', { |  | ||||||
| 	__proto__: null, |  | ||||||
| 	value: VMError, |  | ||||||
| 	writable: true, |  | ||||||
| 	enumerable: false, |  | ||||||
| 	configurable: true |  | ||||||
| })) throw localUnexpected(); |  | ||||||
| 
 |  | ||||||
| // Fixes buffer unsafe allocation
 |  | ||||||
| /* eslint-disable no-use-before-define */ |  | ||||||
| class BufferHandler extends ReadOnlyHandler { |  | ||||||
| 
 |  | ||||||
| 	apply(target, thiz, args) { |  | ||||||
| 		if (args.length > 0 && typeof args[0] === 'number') { |  | ||||||
| 			return LocalBuffer.alloc(args[0]); |  | ||||||
| 		} |  | ||||||
| 		return localReflectApply(LocalBuffer.from, LocalBuffer, args); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	construct(target, args, newTarget) { |  | ||||||
| 		if (args.length > 0 && typeof args[0] === 'number') { |  | ||||||
| 			return LocalBuffer.alloc(args[0]); |  | ||||||
| 		} |  | ||||||
| 		return localReflectApply(LocalBuffer.from, LocalBuffer, args); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
| /* eslint-enable no-use-before-define */ |  | ||||||
| 
 |  | ||||||
| const LocalBuffer = fromWithFactory(obj => new BufferHandler(obj), host.Buffer); |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| if (!localReflectDefineProperty(global, 'Buffer', { |  | ||||||
| 	__proto__: null, |  | ||||||
| 	value: LocalBuffer, |  | ||||||
| 	writable: true, |  | ||||||
| 	enumerable: false, |  | ||||||
| 	configurable: true |  | ||||||
| })) throw localUnexpected(); |  | ||||||
| 
 |  | ||||||
| addProtoMapping(LocalBuffer.prototype, host.Buffer.prototype, 'Uint8Array'); |  | ||||||
| 
 |  | ||||||
| /** |  | ||||||
|  * |  | ||||||
|  * @param {*} size Size of new buffer |  | ||||||
|  * @this LocalBuffer |  | ||||||
|  * @return {LocalBuffer} |  | ||||||
|  */ |  | ||||||
| function allocUnsafe(size) { |  | ||||||
| 	return LocalBuffer.alloc(size); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| connect(allocUnsafe, host.Buffer.allocUnsafe); |  | ||||||
| 
 |  | ||||||
| /** |  | ||||||
|  * |  | ||||||
|  * @param {*} size Size of new buffer |  | ||||||
|  * @this LocalBuffer |  | ||||||
|  * @return {LocalBuffer} |  | ||||||
|  */ |  | ||||||
| function allocUnsafeSlow(size) { |  | ||||||
| 	return LocalBuffer.alloc(size); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| connect(allocUnsafeSlow, host.Buffer.allocUnsafeSlow); |  | ||||||
| 
 |  | ||||||
| /** |  | ||||||
|  * Replacement for Buffer inspect |  | ||||||
|  * |  | ||||||
|  * @param {*} recurseTimes |  | ||||||
|  * @param {*} ctx |  | ||||||
|  * @this LocalBuffer |  | ||||||
|  * @return {string} |  | ||||||
|  */ |  | ||||||
| function inspect(recurseTimes, ctx) { |  | ||||||
| 	// Mimic old behavior, could throw but didn't pass a test.
 |  | ||||||
| 	const max = host.INSPECT_MAX_BYTES; |  | ||||||
| 	const actualMax = Math.min(max, this.length); |  | ||||||
| 	const remaining = this.length - max; |  | ||||||
| 	let str = this.hexSlice(0, actualMax).replace(/(.{2})/g, '$1 ').trim(); |  | ||||||
| 	if (remaining > 0) str += ` ... ${remaining} more byte${remaining > 1 ? 's' : ''}`; |  | ||||||
| 	return `<${this.constructor.name} ${str}>`; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| connect(inspect, host.Buffer.prototype.inspect); |  | ||||||
| 
 |  | ||||||
| connect(localFunction.prototype.bind, host.Function.prototype.bind); |  | ||||||
| 
 |  | ||||||
| connect(localObject.prototype.__defineGetter__, host.Object.prototype.__defineGetter__); |  | ||||||
| connect(localObject.prototype.__defineSetter__, host.Object.prototype.__defineSetter__); |  | ||||||
| connect(localObject.prototype.__lookupGetter__, host.Object.prototype.__lookupGetter__); |  | ||||||
| connect(localObject.prototype.__lookupSetter__, host.Object.prototype.__lookupSetter__); |  | ||||||
| 
 |  | ||||||
| /* |  | ||||||
|  * PrepareStackTrace sanitization |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| const oldPrepareStackTraceDesc = localReflectGetOwnPropertyDescriptor(LocalError, 'prepareStackTrace'); |  | ||||||
| 
 |  | ||||||
| let currentPrepareStackTrace = LocalError.prepareStackTrace; |  | ||||||
| const wrappedPrepareStackTrace = new LocalWeakMap(); |  | ||||||
| if (typeof currentPrepareStackTrace === 'function') { |  | ||||||
| 	wrappedPrepareStackTrace.set(currentPrepareStackTrace, currentPrepareStackTrace); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| let OriginalCallSite; |  | ||||||
| LocalError.prepareStackTrace = (e, sst) => { |  | ||||||
| 	OriginalCallSite = sst[0].constructor; |  | ||||||
| }; |  | ||||||
| new LocalError().stack; |  | ||||||
| if (typeof OriginalCallSite === 'function') { |  | ||||||
| 	LocalError.prepareStackTrace = undefined; |  | ||||||
| 
 |  | ||||||
| 	function makeCallSiteGetters(list) { |  | ||||||
| 		const callSiteGetters = []; |  | ||||||
| 		for (let i=0; i<list.length; i++) { |  | ||||||
| 			const name = list[i]; |  | ||||||
| 			const func = OriginalCallSite.prototype[name]; |  | ||||||
| 			callSiteGetters[i] = {__proto__: null, |  | ||||||
| 				name, |  | ||||||
| 				propName: '_' + name, |  | ||||||
| 				func: (thiz) => { |  | ||||||
| 					return localReflectApply(func, thiz, []); |  | ||||||
| 				} |  | ||||||
| 			}; |  | ||||||
| 		} |  | ||||||
| 		return callSiteGetters; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	function applyCallSiteGetters(thiz, callSite, getters) { |  | ||||||
| 		for (let i=0; i<getters.length; i++) { |  | ||||||
| 			const getter = getters[i]; |  | ||||||
| 			localReflectDefineProperty(thiz, getter.propName, { |  | ||||||
| 				__proto__: null, |  | ||||||
| 				value: getter.func(callSite) |  | ||||||
| 			}); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	const callSiteGetters = makeCallSiteGetters([ |  | ||||||
| 		'getTypeName', |  | ||||||
| 		'getFunctionName', |  | ||||||
| 		'getMethodName', |  | ||||||
| 		'getFileName', |  | ||||||
| 		'getLineNumber', |  | ||||||
| 		'getColumnNumber', |  | ||||||
| 		'getEvalOrigin', |  | ||||||
| 		'isToplevel', |  | ||||||
| 		'isEval', |  | ||||||
| 		'isNative', |  | ||||||
| 		'isConstructor', |  | ||||||
| 		'isAsync', |  | ||||||
| 		'isPromiseAll', |  | ||||||
| 		'getPromiseIndex' |  | ||||||
| 	]); |  | ||||||
| 
 |  | ||||||
| 	class CallSite { |  | ||||||
| 		constructor(callSite) { |  | ||||||
| 			applyCallSiteGetters(this, callSite, callSiteGetters); |  | ||||||
| 		} |  | ||||||
| 		getThis() { |  | ||||||
| 			return undefined; |  | ||||||
| 		} |  | ||||||
| 		getFunction() { |  | ||||||
| 			return undefined; |  | ||||||
| 		} |  | ||||||
| 		toString() { |  | ||||||
| 			return 'CallSite {}'; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 	for (let i=0; i<callSiteGetters.length; i++) { |  | ||||||
| 		const name = callSiteGetters[i].name; |  | ||||||
| 		const funcProp = localReflectGetOwnPropertyDescriptor(OriginalCallSite.prototype, name); |  | ||||||
| 		if (!funcProp) continue; |  | ||||||
| 		const propertyName = callSiteGetters[i].propName; |  | ||||||
| 		const func = {func() { |  | ||||||
| 			return this[propertyName]; |  | ||||||
| 		}}.func; |  | ||||||
| 		const nameProp = localReflectGetOwnPropertyDescriptor(func, 'name'); |  | ||||||
| 		if (!nameProp) throw localUnexpected(); |  | ||||||
| 		nameProp.value = name; |  | ||||||
| 		if (!localReflectDefineProperty(func, 'name', nameProp)) throw localUnexpected(); |  | ||||||
| 		funcProp.value = func; |  | ||||||
| 		if (!localReflectDefineProperty(CallSite.prototype, name, funcProp)) throw localUnexpected(); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if (!localReflectDefineProperty(LocalError, 'prepareStackTrace', { |  | ||||||
| 		configurable: false, |  | ||||||
| 		enumerable: false, |  | ||||||
| 		get() { |  | ||||||
| 			return currentPrepareStackTrace; |  | ||||||
| 		}, |  | ||||||
| 		set(value) { |  | ||||||
| 			if (typeof(value) !== 'function') { |  | ||||||
| 				currentPrepareStackTrace = value; |  | ||||||
| 				return; |  | ||||||
| 			} |  | ||||||
| 			const wrapped = localReflectApply(localWeakMapGet, wrappedPrepareStackTrace, [value]); |  | ||||||
| 			if (wrapped) { |  | ||||||
| 				currentPrepareStackTrace = wrapped; |  | ||||||
| 				return; |  | ||||||
| 			} |  | ||||||
| 			const newWrapped = (error, sst) => { |  | ||||||
| 				if (localArrayIsArray(sst)) { |  | ||||||
| 					for (let i=0; i < sst.length; i++) { |  | ||||||
| 						const cs = sst[i]; |  | ||||||
| 						if (typeof cs === 'object' && localReflectGetPrototypeOf(cs) === OriginalCallSite.prototype) { |  | ||||||
| 							sst[i] = new CallSite(cs); |  | ||||||
| 						} |  | ||||||
| 					} |  | ||||||
| 				} |  | ||||||
| 				return value(error, sst); |  | ||||||
| 			}; |  | ||||||
| 			wrappedPrepareStackTrace.set(value, newWrapped); |  | ||||||
| 			wrappedPrepareStackTrace.set(newWrapped, newWrapped); |  | ||||||
| 			currentPrepareStackTrace = newWrapped; |  | ||||||
| 		} |  | ||||||
| 	})) throw localUnexpected(); |  | ||||||
| } else if (oldPrepareStackTraceDesc) { |  | ||||||
| 	localReflectDefineProperty(LocalError, 'prepareStackTrace', oldPrepareStackTraceDesc); |  | ||||||
| } else { |  | ||||||
| 	localReflectDeleteProperty(LocalError, 'prepareStackTrace'); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* |  | ||||||
|  * Exception sanitization |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| const withProxy = localObjectFreeze({ |  | ||||||
| 	__proto__: null, |  | ||||||
| 	has(target, key) { |  | ||||||
| 		if (key === host.INTERNAL_STATE_NAME) return false; |  | ||||||
| 		return localReflectHas(target, key); |  | ||||||
| 	} |  | ||||||
| }); |  | ||||||
| 
 |  | ||||||
| const interanState = localObjectFreeze({ |  | ||||||
| 	__proto__: null, |  | ||||||
| 	wrapWith(x) { |  | ||||||
| 		return new LocalProxy(x, withProxy); |  | ||||||
| 	}, |  | ||||||
| 	handleException: ensureThis, |  | ||||||
| 	import(what) { |  | ||||||
| 		throw new VMError('Dynamic Import not supported'); |  | ||||||
| 	} |  | ||||||
| }); |  | ||||||
| 
 |  | ||||||
| if (!localReflectDefineProperty(global, host.INTERNAL_STATE_NAME, { |  | ||||||
| 	__proto__: null, |  | ||||||
| 	configurable: false, |  | ||||||
| 	enumerable: false, |  | ||||||
| 	writable: false, |  | ||||||
| 	value: interanState |  | ||||||
| })) throw localUnexpected(); |  | ||||||
| 
 |  | ||||||
| /* |  | ||||||
|  * Eval sanitization |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| function throwAsync() { |  | ||||||
| 	return new VMError('Async not available'); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function makeFunction(inputArgs, isAsync, isGenerator) { |  | ||||||
| 	const lastArgs = inputArgs.length - 1; |  | ||||||
| 	let code = lastArgs >= 0 ? `${inputArgs[lastArgs]}` : ''; |  | ||||||
| 	let args = lastArgs > 0 ? `${inputArgs[0]}` : ''; |  | ||||||
| 	for (let i = 1; i < lastArgs; i++) { |  | ||||||
| 		args += `,${inputArgs[i]}`; |  | ||||||
| 	} |  | ||||||
| 	try { |  | ||||||
| 		code = host.transformAndCheck(args, code, isAsync, isGenerator, allowAsync); |  | ||||||
| 	} catch (e) { |  | ||||||
| 		throw bridge.from(e); |  | ||||||
| 	} |  | ||||||
| 	return localEval(code); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| const FunctionHandler = { |  | ||||||
| 	__proto__: null, |  | ||||||
| 	apply(target, thiz, args) { |  | ||||||
| 		return makeFunction(args, this.isAsync, this.isGenerator); |  | ||||||
| 	}, |  | ||||||
| 	construct(target, args, newTarget) { |  | ||||||
| 		return makeFunction(args, this.isAsync, this.isGenerator); |  | ||||||
| 	} |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| const EvalHandler = { |  | ||||||
| 	__proto__: null, |  | ||||||
| 	apply(target, thiz, args) { |  | ||||||
| 		if (args.length === 0) return undefined; |  | ||||||
| 		let code = `${args[0]}`; |  | ||||||
| 		try { |  | ||||||
| 			code = host.transformAndCheck(null, code, false, false, allowAsync); |  | ||||||
| 		} catch (e) { |  | ||||||
| 			throw bridge.from(e); |  | ||||||
| 		} |  | ||||||
| 		return localEval(code); |  | ||||||
| 	} |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| const AsyncErrorHandler = { |  | ||||||
| 	__proto__: null, |  | ||||||
| 	apply(target, thiz, args) { |  | ||||||
| 		throw throwAsync(); |  | ||||||
| 	}, |  | ||||||
| 	construct(target, args, newTarget) { |  | ||||||
| 		throw throwAsync(); |  | ||||||
| 	} |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| function makeCheckFunction(isAsync, isGenerator) { |  | ||||||
| 	if (isAsync && !allowAsync) return AsyncErrorHandler; |  | ||||||
| 	return { |  | ||||||
| 		__proto__: FunctionHandler, |  | ||||||
| 		isAsync, |  | ||||||
| 		isGenerator |  | ||||||
| 	}; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function overrideWithProxy(obj, prop, value, handler) { |  | ||||||
| 	const proxy = new LocalProxy(value, handler); |  | ||||||
| 	if (!localReflectDefineProperty(obj, prop, {__proto__: null, value: proxy})) throw localUnexpected(); |  | ||||||
| 	return proxy; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| const proxiedFunction = overrideWithProxy(localFunction.prototype, 'constructor', localFunction, makeCheckFunction(false, false)); |  | ||||||
| if (GeneratorFunction) { |  | ||||||
| 	if (!localReflectSetPrototypeOf(GeneratorFunction, proxiedFunction)) throw localUnexpected(); |  | ||||||
| 	overrideWithProxy(GeneratorFunction.prototype, 'constructor', GeneratorFunction, makeCheckFunction(false, true)); |  | ||||||
| } |  | ||||||
| if (AsyncFunction) { |  | ||||||
| 	if (!localReflectSetPrototypeOf(AsyncFunction, proxiedFunction)) throw localUnexpected(); |  | ||||||
| 	overrideWithProxy(AsyncFunction.prototype, 'constructor', AsyncFunction, makeCheckFunction(true, false)); |  | ||||||
| } |  | ||||||
| if (AsyncGeneratorFunction) { |  | ||||||
| 	if (!localReflectSetPrototypeOf(AsyncGeneratorFunction, proxiedFunction)) throw localUnexpected(); |  | ||||||
| 	overrideWithProxy(AsyncGeneratorFunction.prototype, 'constructor', AsyncGeneratorFunction, makeCheckFunction(true, true)); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| global.Function = proxiedFunction; |  | ||||||
| global.eval = new LocalProxy(localEval, EvalHandler); |  | ||||||
| 
 |  | ||||||
| /* |  | ||||||
|  * Promise sanitization |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| if (localPromise && !allowAsync) { |  | ||||||
| 
 |  | ||||||
| 	const PromisePrototype = localPromise.prototype; |  | ||||||
| 
 |  | ||||||
| 	overrideWithProxy(PromisePrototype, 'then', PromisePrototype.then, AsyncErrorHandler); |  | ||||||
| 	// This seems not to work, and will produce
 |  | ||||||
| 	// UnhandledPromiseRejectionWarning: TypeError: Method Promise.prototype.then called on incompatible receiver [object Object].
 |  | ||||||
| 	// This is likely caused since the host.Promise.prototype.then cannot use the VM Proxy object.
 |  | ||||||
| 	// Contextify.connect(host.Promise.prototype.then, Promise.prototype.then);
 |  | ||||||
| 
 |  | ||||||
| 	if (PromisePrototype.finally) { |  | ||||||
| 		overrideWithProxy(PromisePrototype, 'finally', PromisePrototype.finally, AsyncErrorHandler); |  | ||||||
| 		// Contextify.connect(host.Promise.prototype.finally, Promise.prototype.finally);
 |  | ||||||
| 	} |  | ||||||
| 	if (Promise.prototype.catch) { |  | ||||||
| 		overrideWithProxy(PromisePrototype, 'catch', PromisePrototype.catch, AsyncErrorHandler); |  | ||||||
| 		// Contextify.connect(host.Promise.prototype.catch, Promise.prototype.catch);
 |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function readonly(other, mock) { |  | ||||||
| 	// Note: other@other(unsafe) mock@other(unsafe) returns@this(unsafe) throws@this(unsafe)
 |  | ||||||
| 	if (!mock) return fromWithFactory(readonlyFactory, other); |  | ||||||
| 	const tmock = from(mock); |  | ||||||
| 	return fromWithFactory(obj=>new ReadOnlyMockHandler(obj, tmock), other); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| return { |  | ||||||
| 	__proto__: null, |  | ||||||
| 	readonly, |  | ||||||
| 	global |  | ||||||
| }; |  | ||||||
| 
 |  | ||||||
| module.exports = __webpack_exports__; |  | ||||||
| /******/ })() |  | ||||||
| ; |  | ||||||
| @ -1,5 +1,5 @@ | |||||||
| variable "NODE_VERSION" { | variable "NODE_VERSION" { | ||||||
|   default = "12" |   default = "16" | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| target "node-version" { | target "node-version" { | ||||||
|  | |||||||
| @ -2,9 +2,7 @@ module.exports = { | |||||||
|   clearMocks: true, |   clearMocks: true, | ||||||
|   moduleFileExtensions: ['js', 'ts'], |   moduleFileExtensions: ['js', 'ts'], | ||||||
|   setupFiles: ["dotenv/config"], |   setupFiles: ["dotenv/config"], | ||||||
|   testEnvironment: 'node', |  | ||||||
|   testMatch: ['**/*.test.ts'], |   testMatch: ['**/*.test.ts'], | ||||||
|   testRunner: 'jest-circus/runner', |  | ||||||
|   transform: { |   transform: { | ||||||
|     '^.+\\.ts$': 'ts-jest' |     '^.+\\.ts$': 'ts-jest' | ||||||
|   }, |   }, | ||||||
|  | |||||||
							
								
								
									
										28
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								package.json
									
									
									
									
									
								
							| @ -4,8 +4,8 @@ | |||||||
|   "main": "lib/main.js", |   "main": "lib/main.js", | ||||||
|   "scripts": { |   "scripts": { | ||||||
|     "build": "tsc && ncc build", |     "build": "tsc && ncc build", | ||||||
|     "format": "prettier --write **/*.ts", |     "format": "prettier --write '**/*.ts'", | ||||||
|     "format-check": "prettier --check **/*.ts", |     "format-check": "prettier --check '**/*.ts'", | ||||||
|     "test": "jest --coverage", |     "test": "jest --coverage", | ||||||
|     "pre-checkin": "yarn run format && yarn run build" |     "pre-checkin": "yarn run format && yarn run build" | ||||||
|   }, |   }, | ||||||
| @ -13,6 +13,9 @@ | |||||||
|     "type": "git", |     "type": "git", | ||||||
|     "url": "git+https://github.com/docker/login-action.git" |     "url": "git+https://github.com/docker/login-action.git" | ||||||
|   }, |   }, | ||||||
|  |   "engines": { | ||||||
|  |     "node": "^16" | ||||||
|  |   }, | ||||||
|   "keywords": [ |   "keywords": [ | ||||||
|     "actions", |     "actions", | ||||||
|     "docker", |     "docker", | ||||||
| @ -32,19 +35,16 @@ | |||||||
|     "@actions/io": "^1.1.1", |     "@actions/io": "^1.1.1", | ||||||
|     "@aws-sdk/client-ecr": "^3.45.0", |     "@aws-sdk/client-ecr": "^3.45.0", | ||||||
|     "@aws-sdk/client-ecr-public": "^3.45.0", |     "@aws-sdk/client-ecr-public": "^3.45.0", | ||||||
|     "proxy-agent": "^5.0.0" |     "http-proxy-agent": "^5.0.0", | ||||||
|  |     "https-proxy-agent": "^5.0.0" | ||||||
|   }, |   }, | ||||||
|   "devDependencies": { |   "devDependencies": { | ||||||
|     "@types/jest": "^26.0.23", |     "@types/node": "^16.11.26", | ||||||
|     "@types/node": "^14.17.4", |     "@vercel/ncc": "^0.33.3", | ||||||
|     "@vercel/ncc": "^0.28.6", |     "dotenv": "^16.0.0", | ||||||
|     "dotenv": "^8.6.0", |     "jest": "^27.2.5", | ||||||
|     "jest": "^26.6.3", |     "prettier": "^2.5.1", | ||||||
|     "jest-circus": "^26.6.3", |     "ts-jest": "^27.1.2", | ||||||
|     "jest-runtime": "^26.6.3", |     "typescript": "^4.4.4" | ||||||
|     "prettier": "^2.3.2", |  | ||||||
|     "ts-jest": "^26.5.6", |  | ||||||
|     "typescript": "^3.9.10", |  | ||||||
|     "typescript-formatter": "^7.2.2" |  | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | |||||||
| @ -2,7 +2,8 @@ import * as core from '@actions/core'; | |||||||
| import {ECR} from '@aws-sdk/client-ecr'; | import {ECR} from '@aws-sdk/client-ecr'; | ||||||
| import {ECRPUBLIC} from '@aws-sdk/client-ecr-public'; | import {ECRPUBLIC} from '@aws-sdk/client-ecr-public'; | ||||||
| import {NodeHttpHandler} from '@aws-sdk/node-http-handler'; | import {NodeHttpHandler} from '@aws-sdk/node-http-handler'; | ||||||
| import ProxyAgent from 'proxy-agent'; | import {HttpProxyAgent} from 'http-proxy-agent'; | ||||||
|  | import {HttpsProxyAgent} from 'https-proxy-agent'; | ||||||
| 
 | 
 | ||||||
| const ecrRegistryRegex = /^(([0-9]{12})\.dkr\.ecr\.(.+)\.amazonaws\.com(.cn)?)(\/([^:]+)(:.+)?)?$/; | const ecrRegistryRegex = /^(([0-9]{12})\.dkr\.ecr\.(.+)\.amazonaws\.com(.cn)?)(\/([^:]+)(:.+)?)?$/; | ||||||
| 
 | 
 | ||||||
| @ -60,14 +61,14 @@ export const getRegistriesData = async (registry: string, username?: string, pas | |||||||
|   const httpProxy = process.env.http_proxy || process.env.HTTP_PROXY || ''; |   const httpProxy = process.env.http_proxy || process.env.HTTP_PROXY || ''; | ||||||
|   if (httpProxy) { |   if (httpProxy) { | ||||||
|     core.debug(`Using http proxy ${httpProxy}`); |     core.debug(`Using http proxy ${httpProxy}`); | ||||||
|     httpProxyAgent = new ProxyAgent(httpProxy); |     httpProxyAgent = new HttpProxyAgent(httpProxy); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   let httpsProxyAgent: any = null; |   let httpsProxyAgent: any = null; | ||||||
|   const httpsProxy = process.env.https_proxy || process.env.HTTPS_PROXY || ''; |   const httpsProxy = process.env.https_proxy || process.env.HTTPS_PROXY || ''; | ||||||
|   if (httpsProxy) { |   if (httpsProxy) { | ||||||
|     core.debug(`Using https proxy ${httpsProxy}`); |     core.debug(`Using https proxy ${httpsProxy}`); | ||||||
|     httpsProxyAgent = new ProxyAgent(httpsProxy); |     httpsProxyAgent = new HttpsProxyAgent(httpsProxy); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   const credentials = |   const credentials = | ||||||
|  | |||||||
| @ -9,7 +9,7 @@ export async function run(): Promise<void> { | |||||||
|     stateHelper.setRegistry(input.registry); |     stateHelper.setRegistry(input.registry); | ||||||
|     stateHelper.setLogout(input.logout); |     stateHelper.setLogout(input.logout); | ||||||
|     await docker.login(input.registry, input.username, input.password, input.ecr); |     await docker.login(input.registry, input.username, input.password, input.ecr); | ||||||
|   } catch (error) { |   } catch (error: any) { | ||||||
|     core.setFailed(error.message); |     core.setFailed(error.message); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,11 +1,7 @@ | |||||||
| { | { | ||||||
|   "compilerOptions": { |   "compilerOptions": { | ||||||
|     "target": "es6", |     "target": "esnext", | ||||||
|     "module": "commonjs", |     "module": "commonjs", | ||||||
|     "lib": [ |  | ||||||
|       "es6", |  | ||||||
|       "dom" |  | ||||||
|     ], |  | ||||||
|     "newLine": "lf", |     "newLine": "lf", | ||||||
|     "outDir": "./lib", |     "outDir": "./lib", | ||||||
|     "rootDir": "./src", |     "rootDir": "./src", | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 CrazyMax
						CrazyMax