prepack
Version:
Execute a JS bundle, serialize global state and side effects to a snapshot that can be quickly restored.
209 lines (176 loc) • 9.49 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 _babelTypes = require("babel-types");
var t = _interopRequireWildcard(_babelTypes);
var _invariant = require("../../invariant");
var _invariant2 = _interopRequireDefault(_invariant);
var _utils = require("../../react/utils.js");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
const fbMagicGlobalFunctions = ["asset", "cx", "cssVar", "csx", "errorDesc", "errorHelpCenterID", "errorSummary", "gkx", "glyph", "ifRequired", "ix", "fbglyph", "requireWeak", "xuiglyph"]; /**
* 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 fbMagicGlobalObjects = ["JSResource", "Bootloader"];
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, _invariant2.default)(objectAssign instanceof _index2.NativeFunctionValue);
let objectAssignCall = objectAssign.$Call;
(0, _invariant2.default)(objectAssignCall !== undefined);
objectAssignCall(realm.intrinsics.undefined, [subClass, superClass]);
(0, _invariant2.default)(superClass instanceof _index2.ObjectValue);
let superClassPrototype = (0, _index3.Get)(realm, superClass, "prototype");
(0, _invariant2.default)(objectCreate instanceof _index2.NativeFunctionValue);
let objectCreateCall = objectCreate.$Call;
(0, _invariant2.default)(typeof objectCreateCall === "function");
let newPrototype = objectCreateCall(realm.intrinsics.undefined, [superClassPrototype]);
(0, _invariant2.default)(subClass instanceof _index2.ObjectValue);
(0, _invariant2.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.$DefineOwnProperty("inherits", {
value: inheritsValue,
writable: false,
enumerable: false,
configurable: true
});
inheritsValue.intrinsicName = `babelHelpers.inherits`;
//babelHelpers.objectWithoutProperties
let objectWithoutPropertiesValue = new _index2.NativeFunctionValue(realm, undefined, `objectWithoutProperties`, 2, (context, [obj, keys]) => {
(0, _invariant2.default)(obj instanceof _index2.ObjectValue || obj instanceof _index2.AbstractObjectValue);
(0, _invariant2.default)(keys instanceof _index2.ArrayValue);
if (obj.isPartialObject() || obj instanceof _index2.AbstractObjectValue) {
let value = _index2.AbstractValue.createTemporalFromBuildFunction(realm, _index2.ObjectValue, [objectWithoutPropertiesValue, obj, keys], ([methodNode, objNode, propRemoveNode]) => {
return t.callExpression(methodNode, [objNode, propRemoveNode]);
});
if (value instanceof _index2.AbstractObjectValue) {
// as we are returning an abstract object, we mark it as simple
value.makeSimple();
}
return value;
} else {
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.enumerable) {
let value = (0, _index3.Get)(realm, obj, propName);
_singletons.Properties.Set(realm, newObject, propName, value, true);
}
}
}
return newObject;
}
});
babelHelpersValue.$DefineOwnProperty("objectWithoutProperties", {
value: 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, _invariant2.default)(strings instanceof _index2.ObjectValue);
_singletons.Properties.Set(realm, strings, "raw", raw, true);
return strings;
});
babelHelpersValue.$DefineOwnProperty("taggedTemplateLiteralLoose", {
value: taggedTemplateLiteralLooseValue,
writable: false,
enumerable: false,
configurable: true
});
taggedTemplateLiteralLooseValue.intrinsicName = `babelHelpers.taggedTemplateLiteralLoose`;
//babelHelpers.extends & babelHelpers._extends
babelHelpersValue.$DefineOwnProperty("extends", {
value: objectAssign,
writable: true,
enumerable: true,
configurable: true
});
babelHelpersValue.$DefineOwnProperty("_extends", {
value: objectAssign,
writable: true,
enumerable: true,
configurable: true
});
//babelHelpers.bind
let functionBind = (0, _index3.Get)(realm, realm.intrinsics.FunctionPrototype, "bind");
babelHelpersValue.$DefineOwnProperty("bind", {
value: functionBind,
writable: true,
enumerable: true,
configurable: true
});
global.$DefineOwnProperty("babelHelpers", {
value: babelHelpersValue,
writable: true,
enumerable: true,
configurable: true
});
babelHelpersValue.refuseSerialization = false;
}
function createMagicGlobalFunction(realm, global, functionName) {
global.$DefineOwnProperty(functionName, {
value: new _index2.NativeFunctionValue(realm, functionName, functionName, 0, (context, args) => {
let types = new _index.TypesDomain(_index2.FunctionValue);
let values = new _index.ValuesDomain();
(0, _invariant2.default)(context.$Realm.generator);
return context.$Realm.generator.derive(types, values, args, _args => t.callExpression(t.identifier(functionName), _args));
}),
writable: true,
enumerable: false,
configurable: true
});
}
function createMagicGlobalObject(realm, global, objectName) {
let globalObject = _index2.AbstractValue.createAbstractObject(realm, objectName);
globalObject.kind = "resolved";
global.$DefineOwnProperty(objectName, {
value: globalObject,
writable: true,
enumerable: false,
configurable: true
});
}
function createFbMocks(realm, global) {
global.$DefineOwnProperty("__DEV__", {
// 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);
}
}
//# sourceMappingURL=fb-mocks.js.map