prepack
Version:
Execute a JS bundle, serialize global state and side effects to a snapshot that can be quickly restored.
243 lines (195 loc) • 9.58 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createFbMocks = createFbMocks;
var _index = require("../../domains/index.js");
var _index2 = require("../../values/index.js");
var _singletons = require("../../singletons.js");
var _index3 = require("../../methods/index.js");
var _invariant = _interopRequireDefault(require("../../invariant.js"));
var _utils = require("../../react/utils.js");
var _generator = require("../../utils/generator.js");
var _descriptors = require("../../descriptors.js");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* Copyright (c) 2017-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
const fbMagicGlobalFunctions = ["asset", "cx", "cssVar", "csx", "errorDesc", "errorHelpCenterID", "errorSummary", "gkx", "glyph", "ifRequired", "ix", "fbglyph", "requireWeak", "xuiglyph"];
const fbMagicGlobalObjects = ["JSResource", "fbt"];
function createBabelHelpers(realm, global) {
let babelHelpersValue = new _index2.ObjectValue(realm, realm.intrinsics.ObjectPrototype, `babelHelpers`, true);
let objectAssign = (0, _index3.Get)(realm, realm.intrinsics.Object, "assign");
let objectCreate = (0, _index3.Get)(realm, realm.intrinsics.Object, "create"); //babelHelpers.objectWithoutProperties
let inheritsValue = new _index2.NativeFunctionValue(realm, undefined, `inherits`, 2, (context, [subClass, superClass]) => {
(0, _invariant.default)(objectAssign instanceof _index2.NativeFunctionValue);
let objectAssignCall = objectAssign.$Call;
(0, _invariant.default)(objectAssignCall !== undefined);
objectAssignCall(realm.intrinsics.undefined, [subClass, superClass]);
(0, _invariant.default)(superClass instanceof _index2.ObjectValue);
let superClassPrototype = (0, _index3.Get)(realm, superClass, "prototype");
(0, _invariant.default)(objectCreate instanceof _index2.NativeFunctionValue);
let objectCreateCall = objectCreate.$Call;
(0, _invariant.default)(typeof objectCreateCall === "function");
let newPrototype = objectCreateCall(realm.intrinsics.undefined, [superClassPrototype]);
(0, _invariant.default)(subClass instanceof _index2.ObjectValue);
(0, _invariant.default)(newPrototype instanceof _index2.ObjectValue);
_singletons.Properties.Set(realm, subClass, "prototype", newPrototype, true);
_singletons.Properties.Set(realm, newPrototype, "constructor", subClass, true);
_singletons.Properties.Set(realm, subClass, "__superConstructor__", superClass, true);
return superClass;
});
babelHelpersValue.defineNativeProperty("inherits", inheritsValue, {
writable: false,
enumerable: false,
configurable: true
});
inheritsValue.intrinsicName = `babelHelpers.inherits`;
const createObjectWithoutProperties = (obj, keys) => {
let removeKeys = new Set();
(0, _utils.forEachArrayValue)(realm, keys, key => {
if (key instanceof _index2.StringValue || key instanceof _index2.NumberValue) {
removeKeys.add(key.value);
}
});
let newObject = _singletons.Create.ObjectCreate(realm, realm.intrinsics.ObjectPrototype);
for (let [propName, binding] of obj.properties) {
if (!removeKeys.has(propName)) {
if (binding && binding.descriptor && binding.descriptor.throwIfNotConcrete(realm).enumerable) {
let value = (0, _index3.Get)(realm, obj, propName);
_singletons.Properties.Set(realm, newObject, propName, value, true);
}
}
}
return newObject;
}; //babelHelpers.objectWithoutProperties
let objectWithoutPropertiesValue = new _index2.NativeFunctionValue(realm, undefined, `objectWithoutProperties`, 2, (context, [obj, keys]) => {
(0, _invariant.default)(obj instanceof _index2.ObjectValue || obj instanceof _index2.AbstractObjectValue || obj instanceof _index2.AbstractValue);
(0, _invariant.default)(keys instanceof _index2.ArrayValue);
if (obj.mightBeObject() && (obj instanceof _index2.AbstractValue && obj.values.isTop() || obj.isPartialObject())) {
let temporalArgs = [objectWithoutPropertiesValue, obj, keys];
let temporalConfig = {
skipInvariant: true,
isPure: true
};
let value = _index2.AbstractValue.createTemporalFromBuildFunction(realm, _index2.ObjectValue, temporalArgs, (0, _generator.createOperationDescriptor)("BABEL_HELPERS_OBJECT_WITHOUT_PROPERTIES"), temporalConfig);
(0, _invariant.default)(value instanceof _index2.AbstractObjectValue);
if (obj instanceof _index2.ObjectValue) {
let template = createObjectWithoutProperties(obj, keys);
value.values = new _index.ValuesDomain(template);
} // as we are returning an abstract object, we mark it as simple
value.makeSimple();
return value;
} else {
(0, _invariant.default)(obj instanceof _index2.ObjectValue);
return createObjectWithoutProperties(obj, keys);
}
});
babelHelpersValue.defineNativeProperty("objectWithoutProperties", objectWithoutPropertiesValue, {
writable: false,
enumerable: false,
configurable: true
});
objectWithoutPropertiesValue.intrinsicName = `babelHelpers.objectWithoutProperties`; //babelHelpers.taggedTemplateLiteralLoose
let taggedTemplateLiteralLooseValue = new _index2.NativeFunctionValue(realm, undefined, `taggedTemplateLiteralLoose`, 2, (context, [strings, raw]) => {
(0, _invariant.default)(strings instanceof _index2.ObjectValue);
_singletons.Properties.Set(realm, strings, "raw", raw, true);
return strings;
});
babelHelpersValue.defineNativeProperty("taggedTemplateLiteralLoose", taggedTemplateLiteralLooseValue, {
writable: false,
enumerable: false,
configurable: true
});
taggedTemplateLiteralLooseValue.intrinsicName = `babelHelpers.taggedTemplateLiteralLoose`; //babelHelpers.extends & babelHelpers._extends
babelHelpersValue.defineNativeProperty("extends", objectAssign, {
writable: true,
enumerable: true,
configurable: true
});
babelHelpersValue.defineNativeProperty("_extends", objectAssign, {
writable: true,
enumerable: true,
configurable: true
}); //babelHelpers.bind
let functionBind = (0, _index3.Get)(realm, realm.intrinsics.FunctionPrototype, "bind");
babelHelpersValue.defineNativeProperty("bind", functionBind, {
writable: true,
enumerable: true,
configurable: true
});
global.$DefineOwnProperty("babelHelpers", new _descriptors.PropertyDescriptor({
value: babelHelpersValue,
writable: true,
enumerable: true,
configurable: true
}));
babelHelpersValue.refuseSerialization = false;
}
function createMagicGlobalFunction(realm, global, functionName) {
global.$DefineOwnProperty(functionName, new _descriptors.PropertyDescriptor({
value: new _index2.NativeFunctionValue(realm, functionName, functionName, 0, (context, args) => {
let val = _index2.AbstractValue.createTemporalFromBuildFunction(realm, _index2.FunctionValue, [new _index2.StringValue(realm, functionName), ...args], (0, _generator.createOperationDescriptor)("FB_MOCKS_MAGIC_GLOBAL_FUNCTION"), {
skipInvariant: true,
isPure: true
});
(0, _invariant.default)(val instanceof _index2.AbstractValue);
return val;
}),
writable: true,
enumerable: false,
configurable: true
}));
}
function createMagicGlobalObject(realm, global, objectName) {
let globalObject = _index2.AbstractValue.createAbstractObject(realm, objectName);
globalObject.kind = "resolved";
global.$DefineOwnProperty(objectName, new _descriptors.PropertyDescriptor({
value: globalObject,
writable: true,
enumerable: false,
configurable: true
}));
}
function createBootloader(realm, global) {
let bootloader = new _index2.ObjectValue(realm, realm.intrinsics.ObjectPrototype);
let loadModules = new _index2.NativeFunctionValue(realm, "loadModules", "loadModules", 1, (context, args) => {
(0, _invariant.default)(context.$Realm.generator);
let val = _index2.AbstractValue.createTemporalFromBuildFunction(realm, _index2.FunctionValue, args, (0, _generator.createOperationDescriptor)("FB_MOCKS_BOOTLOADER_LOAD_MODULES"), {
skipInvariant: true
});
(0, _invariant.default)(val instanceof _index2.AbstractValue);
return val;
});
_singletons.Properties.Set(realm, bootloader, "loadModules", loadModules, false);
global.$DefineOwnProperty("Bootloader", new _descriptors.PropertyDescriptor({
value: bootloader,
writable: true,
enumerable: false,
configurable: true
}));
return _index2.AbstractValue.createAbstractObject(realm, "Bootloader", bootloader);
}
function createFbMocks(realm, global) {
global.$DefineOwnProperty("__DEV__", new _descriptors.PropertyDescriptor({
// TODO: we'll likely want to make this configurable from the outside.
value: realm.intrinsics.false,
writable: true,
enumerable: false,
configurable: true
}));
createBabelHelpers(realm, global);
for (let functionName of fbMagicGlobalFunctions) {
createMagicGlobalFunction(realm, global, functionName);
}
for (let objectName of fbMagicGlobalObjects) {
createMagicGlobalObject(realm, global, objectName);
}
createBootloader(realm, global);
}
//# sourceMappingURL=fb-mocks.js.map