218 lines
6.6 KiB
JavaScript
218 lines
6.6 KiB
JavaScript
|
|
// DO NOT EDIT! THIS FILE IS GENERATED FROM "runtime-cjs-template.js" BY RUNNING "builder-runtime.js"
|
||
|
|
|
||
|
|
// eslint-disable-next-line no-extra-semi
|
||
|
|
;(function() {
|
||
|
|
function getGlobalRef () {
|
||
|
|
if (typeof globalThis !== 'undefined') {
|
||
|
|
return globalThis
|
||
|
|
}
|
||
|
|
const globalRef = typeof self !== 'undefined' ? self : (typeof global !== 'undefined' ? global : undefined)
|
||
|
|
if (typeof globalRef !== 'undefined') {
|
||
|
|
console.error('LavaMoat - Deprecation Warning: global reference is expected as `globalThis`')
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
const globalRef = getGlobalRef()
|
||
|
|
|
||
|
|
if (!globalRef) {
|
||
|
|
throw new Error('Lavamoat - globalThis not defined')
|
||
|
|
}
|
||
|
|
|
||
|
|
// polyfill globalThis
|
||
|
|
if (globalRef.globalThis !== globalRef) {
|
||
|
|
globalRef.globalThis = globalRef
|
||
|
|
}
|
||
|
|
// polyfill node/browserify's globalRef
|
||
|
|
if (globalRef.global !== globalRef) {
|
||
|
|
globalRef.global = globalRef
|
||
|
|
}
|
||
|
|
|
||
|
|
const {strictScopeTerminator} = // define strict-scope-terminator
|
||
|
|
(function(){
|
||
|
|
const global = globalRef
|
||
|
|
const exports = {}
|
||
|
|
const module = { exports }
|
||
|
|
;(function(){
|
||
|
|
// START of injected code from strict-scope-terminator
|
||
|
|
// import {
|
||
|
|
// Proxy,
|
||
|
|
// String,
|
||
|
|
// TypeError,
|
||
|
|
// ReferenceError,
|
||
|
|
// create,
|
||
|
|
// freeze,
|
||
|
|
// getOwnPropertyDescriptors,
|
||
|
|
// globalThis,
|
||
|
|
// immutableObject,
|
||
|
|
// } from './commons.js';
|
||
|
|
const { freeze, create, getOwnPropertyDescriptors } = Object
|
||
|
|
const immutableObject = freeze(create(null))
|
||
|
|
|
||
|
|
// import { assert } from './error/assert.js';
|
||
|
|
const assert = {
|
||
|
|
fail: (msg) => {
|
||
|
|
throw new Error(msg)
|
||
|
|
},
|
||
|
|
}
|
||
|
|
|
||
|
|
// const { details: d, quote: q } = assert;
|
||
|
|
const d = (strings, args) => strings.join() + args.join()
|
||
|
|
const q = (arg) => arg
|
||
|
|
|
||
|
|
/**
|
||
|
|
* AlwaysThrowHandler This is an object that throws if any property is called.
|
||
|
|
* It's used as a proxy handler which throws on any trap called. It's made from
|
||
|
|
* a proxy with a get trap that throws. It's safe to create one and share it
|
||
|
|
* between all Proxy handlers.
|
||
|
|
*/
|
||
|
|
const alwaysThrowHandler = new Proxy(
|
||
|
|
immutableObject,
|
||
|
|
freeze({
|
||
|
|
get(_shadow, prop) {
|
||
|
|
assert.fail(
|
||
|
|
d`Please report unexpected scope handler trap: ${q(String(prop))}`
|
||
|
|
)
|
||
|
|
},
|
||
|
|
})
|
||
|
|
)
|
||
|
|
|
||
|
|
/**
|
||
|
|
* ScopeTerminatorHandler manages a strictScopeTerminator Proxy which serves as
|
||
|
|
* the final scope boundary that will always return "undefined" in order to
|
||
|
|
* prevent access to "start compartment globals".
|
||
|
|
*
|
||
|
|
* @type {ProxyHandler}
|
||
|
|
*/
|
||
|
|
const scopeProxyHandlerProperties = {
|
||
|
|
// eslint-disable-next-line no-unused-vars
|
||
|
|
get(_shadow, _prop) {
|
||
|
|
return undefined
|
||
|
|
},
|
||
|
|
|
||
|
|
// eslint-disable-next-line no-unused-vars
|
||
|
|
set(_shadow, prop, _value) {
|
||
|
|
// We should only hit this if the has() hook returned true matches the v8
|
||
|
|
// ReferenceError message "Uncaught ReferenceError: xyz is not defined"
|
||
|
|
throw new ReferenceError(`${String(prop)} is not defined`)
|
||
|
|
},
|
||
|
|
|
||
|
|
has(_shadow, prop) {
|
||
|
|
// we must at least return true for all properties on the realm globalThis
|
||
|
|
return prop in globalThis
|
||
|
|
},
|
||
|
|
|
||
|
|
// note: this is likely a bug of safari
|
||
|
|
// https://bugs.webkit.org/show_bug.cgi?id=195534
|
||
|
|
getPrototypeOf() {
|
||
|
|
return null
|
||
|
|
},
|
||
|
|
|
||
|
|
// Chip has seen this happen single stepping under the Chrome/v8 debugger.
|
||
|
|
// TODO record how to reliably reproduce, and to test if this fix helps.
|
||
|
|
// TODO report as bug to v8 or Chrome, and record issue link here.
|
||
|
|
getOwnPropertyDescriptor(_target, prop) {
|
||
|
|
// Coerce with `String` in case prop is a symbol.
|
||
|
|
const quotedProp = q(String(prop))
|
||
|
|
console.warn(
|
||
|
|
`getOwnPropertyDescriptor trap on scopeTerminatorHandler for ${quotedProp}`,
|
||
|
|
new TypeError().stack
|
||
|
|
)
|
||
|
|
return undefined
|
||
|
|
},
|
||
|
|
}
|
||
|
|
|
||
|
|
// The scope handler's prototype is a proxy that throws if any trap other
|
||
|
|
// than get/set/has are run (like getOwnPropertyDescriptors, apply,
|
||
|
|
// getPrototypeOf).
|
||
|
|
const strictScopeTerminatorHandler = freeze(
|
||
|
|
create(
|
||
|
|
alwaysThrowHandler,
|
||
|
|
getOwnPropertyDescriptors(scopeProxyHandlerProperties)
|
||
|
|
)
|
||
|
|
)
|
||
|
|
|
||
|
|
const strictScopeTerminator = new Proxy(
|
||
|
|
immutableObject,
|
||
|
|
strictScopeTerminatorHandler
|
||
|
|
)
|
||
|
|
|
||
|
|
module.exports = {
|
||
|
|
alwaysThrowHandler,
|
||
|
|
strictScopeTerminatorHandler,
|
||
|
|
strictScopeTerminator,
|
||
|
|
}
|
||
|
|
|
||
|
|
// END of injected code from strict-scope-terminator
|
||
|
|
})()
|
||
|
|
return module.exports
|
||
|
|
})()
|
||
|
|
|
||
|
|
const moduleRegistry = new Map()
|
||
|
|
const moduleCache = new Map()
|
||
|
|
|
||
|
|
// create a lavamoat pulic API for loading modules over multiple files
|
||
|
|
const LavaPack = Object.freeze({
|
||
|
|
loadPolicy: Object.freeze(loadPolicy),
|
||
|
|
loadBundle: Object.freeze(loadBundle),
|
||
|
|
runModule: Object.freeze(runModule),
|
||
|
|
})
|
||
|
|
|
||
|
|
Object.defineProperty(globalRef, 'LavaPack', {value: LavaPack})
|
||
|
|
|
||
|
|
function loadPolicy () {
|
||
|
|
throw new Error('runtime-cjs: unable to enforce policy')
|
||
|
|
}
|
||
|
|
|
||
|
|
// it is called by the modules collection that will be appended to this file
|
||
|
|
// eslint-disable-next-line no-unused-vars
|
||
|
|
function loadBundle (newModules, entryPoints, bundlePolicy) {
|
||
|
|
// ignore bundlePolicy as we wont be enforcing it
|
||
|
|
// verify + load in each module
|
||
|
|
for (const [moduleId, moduleDeps, initFn] of newModules) {
|
||
|
|
// verify that module is new
|
||
|
|
if (moduleRegistry.has(moduleId)) {
|
||
|
|
throw new Error(`LavaMoat - loadBundle encountered redundant module definition for id "${moduleId}"`)
|
||
|
|
}
|
||
|
|
// add the module
|
||
|
|
moduleRegistry.set(moduleId, { deps: moduleDeps, precompiledInitializer: initFn })
|
||
|
|
}
|
||
|
|
// run each of entryPoints
|
||
|
|
const entryExports = Array.prototype.map.call(entryPoints, (entryId) => {
|
||
|
|
return runModule(entryId)
|
||
|
|
})
|
||
|
|
// webpack compat: return the first module's exports
|
||
|
|
return entryExports[0]
|
||
|
|
}
|
||
|
|
|
||
|
|
function runModule (moduleId) {
|
||
|
|
if (!moduleRegistry.has(moduleId)) {
|
||
|
|
throw new Error(`no module registered for "${moduleId}" (${typeof moduleId})`)
|
||
|
|
}
|
||
|
|
if (moduleCache.has(moduleId)) {
|
||
|
|
const moduleObject = moduleCache.get(moduleId)
|
||
|
|
return moduleObject.exports
|
||
|
|
}
|
||
|
|
const moduleObject = { exports: {} }
|
||
|
|
const evalKit = {
|
||
|
|
scopeTerminator: strictScopeTerminator,
|
||
|
|
globalThis: globalRef,
|
||
|
|
}
|
||
|
|
moduleCache.set(moduleId, moduleObject)
|
||
|
|
const moduleData = moduleRegistry.get(moduleId)
|
||
|
|
const localRequire = requireRelative.bind(null, moduleId, moduleData)
|
||
|
|
const { precompiledInitializer } = moduleData
|
||
|
|
// this invokes the with-proxy wrapper (proxy replace by start compartment global)
|
||
|
|
const moduleInitializerFactory = precompiledInitializer.call(evalKit)
|
||
|
|
// this ensures strict mode
|
||
|
|
const moduleInitializer = moduleInitializerFactory()
|
||
|
|
moduleInitializer.call(moduleObject.exports, localRequire, moduleObject, moduleObject.exports)
|
||
|
|
return moduleObject.exports
|
||
|
|
}
|
||
|
|
|
||
|
|
function requireRelative (parentId, parentData, requestedName) {
|
||
|
|
const resolvedId = (parentData.deps || {})[requestedName] || requestedName
|
||
|
|
return runModule(resolvedId)
|
||
|
|
}
|
||
|
|
|
||
|
|
})()
|