UNPKG

prepack

Version:

Execute a JS bundle, serialize global state and side effects to a snapshot that can be quickly restored.

943 lines (744 loc) 32.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ResidualOperationSerializer = void 0; var _realm = require("../realm.js"); var _generator = require("../utils/generator.js"); var _PreludeGenerator = require("../utils/PreludeGenerator.js"); var _babelhelpers = require("../utils/babelhelpers.js"); var _invariant = _interopRequireDefault(require("../invariant.js")); var t = _interopRequireWildcard(require("@babel/types")); var _index = require("../values/index.js"); var _singletons = require("../singletons.js"); 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)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } 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. */ function serializeBody(generator, context, valuesToProcess) { let statements = context.serializeGenerator(generator, valuesToProcess); if (statements.length === 1 && statements[0].type === "BlockStatement") return statements[0]; return t.blockStatement(statements); } function isSelfReferential(value, pathNode) { if (value === pathNode) return true; if (value instanceof _index.AbstractValue && pathNode !== undefined) { for (let v of value.args) { if (isSelfReferential(v, pathNode)) return true; } } return false; } class ResidualOperationSerializer { constructor(realm, preludeGenerator) { this.realm = realm; this.preludeGenerator = preludeGenerator; } getErrorStatement(message) { if (this.realm.invariantMode === "throw") return t.throwStatement(t.newExpression(this.preludeGenerator.memoizeReference("Error"), [message]));else { let targetReference = this.realm.invariantMode; let args = [message]; let i = targetReference.indexOf("+"); if (i !== -1) { let s = targetReference.substr(i + 1); let x = Number.parseInt(s, 10); args.push(isNaN(x) ? t.stringLiteral(s) : t.numericLiteral(x)); targetReference = targetReference.substr(0, i); } return t.expressionStatement(t.callExpression(this.preludeGenerator.memoizeReference(targetReference), args)); } } serializeStatement(operationDescriptor, nodes, context, valuesToProcess, declaredId) { let { data, type } = operationDescriptor; let babelNode; switch (type) { case "ASSUME_CALL": babelNode = this._serializeAssumeCall(data, nodes); break; case "CONCRETE_MODEL": babelNode = this._serializeConcreteModel(data, nodes); break; case "CONDITIONAL_PROPERTY_ASSIGNMENT": babelNode = this._serializeConditionalPropertyAssignment(data, nodes, context, valuesToProcess); break; case "CONDITIONAL_THROW": babelNode = this._serializeConditionalThrow(data, nodes, context); break; case "CONSOLE_LOG": babelNode = this._serializeConsoleLog(data, nodes); break; case "DEFINE_PROPERTY": babelNode = this._serializeDefineProperty(data, nodes, context); break; case "DO_WHILE": babelNode = this._serializeDoWhile(data, nodes, context, valuesToProcess); break; case "EMIT_CALL": babelNode = this._serializeEmitCall(data, nodes); break; case "EMIT_PROPERTY_ASSIGNMENT": babelNode = this._serializeEmitPropertyAssignment(data, nodes, context); break; case "FOR_IN": babelNode = this._serializeForIn(data, nodes); break; case "GLOBAL_ASSIGNMENT": babelNode = this._serializeGlobalAssignment(data, nodes); break; case "GLOBAL_DELETE": babelNode = this._serializeGlobalDelete(data, nodes); break; case "JOIN_GENERATORS": babelNode = this._serializeJoinGenerators(data, nodes, context, valuesToProcess); break; case "LOCAL_ASSIGNMENT": babelNode = this._serializeLocalAssignment(data, nodes, context, valuesToProcess); break; case "NOOP": babelNode = t.emptyStatement(); break; case "OBJECT_SET_PARTIAL": babelNode = this._serializeObjectSetPartial(data, nodes); break; case "PROPERTY_ASSIGNMENT": babelNode = this._serializePropertyAssignment(data, nodes, context, valuesToProcess); break; case "PROPERTY_DELETE": babelNode = this._serializePropertyDelete(data, nodes); break; case "THROW": babelNode = this._serializeThrow(data, nodes); break; // Invariants case "INVARIANT": babelNode = this._serializeInvariant(data, nodes); break; // React case "REACT_SSR_REGEX_CONSTANT": return t.variableDeclaration("var", [t.variableDeclarator(t.identifier("matchHtmlRegExp"), t.regExpLiteral("[\"'&<>]"))]); case "REACT_SSR_PREV_TEXT_NODE": return t.variableDeclaration("var", [t.variableDeclarator(t.identifier("previousWasTextNode"), t.booleanLiteral(false))]); default: let babelNodeExpression = this.serializeExpression(operationDescriptor, nodes, context); if (declaredId !== undefined) babelNode = this._serializeDerivedOperationDescriptor(declaredId, babelNodeExpression);else babelNode = this._serializeVoidOperationDescriptor(babelNodeExpression); return babelNode; } (0, _invariant.default)(declaredId === undefined); return babelNode; } serializeExpression(operationDescriptor, nodes, context, valuesToProcess) { let { data, type } = operationDescriptor; let babelNode; switch (type) { case "IDENTIFIER": babelNode = this._serializeIdentifier(data, nodes); break; case "REBUILT_OBJECT": babelNode = this._serializeRebuiltObject(data, nodes); break; case "BINARY_EXPRESSION": babelNode = this._serializeBinaryExpression(data, nodes); break; case "LOGICAL_EXPRESSION": babelNode = this._serializeLogicalExpression(data, nodes); break; case "CONDITIONAL_EXPRESSION": babelNode = this._serializeConditionalExpression(data, nodes); break; case "UNARY_EXPRESSION": babelNode = this._serializeUnaryExpression(data, nodes); break; case "ABSTRACT_PROPERTY": babelNode = this._serializeAbstractProperty(data, nodes); break; case "ABSTRACT_FROM_TEMPLATE": babelNode = this._serializeAbstractFromTemplate(data, nodes); break; case "COERCE_TO_STRING": babelNode = this._serializeCoerceToString(data, nodes); break; case "OBJECT_ASSIGN": babelNode = this._serializeObjectAssign(data, nodes); break; case "SINGLE_ARG": babelNode = this._serializeSingleArg(data, nodes); break; case "CALL_BAILOUT": babelNode = this._serializeCallBailout(data, nodes); break; case "EMIT_CALL_AND_CAPTURE_RESULT": babelNode = this._serializeEmitCallAndCaptureResults(data, nodes); break; case "NEW_EXPRESSION": babelNode = this._serializeNewExpression(data, nodes); break; case "FOR_STATEMENT_FUNC": babelNode = this._serializeForFunctionCall(data, nodes); break; case "GET_BINDING": babelNode = this._serializeGetBinding(data, nodes, context); break; case "UNKNOWN_ARRAY_METHOD_CALL": babelNode = this._serializeUnknownArrayMethodCall(data, nodes); break; case "UNKNOWN_ARRAY_METHOD_PROPERTY_CALL": babelNode = this._serializeUnknownArrayMethodPropertyCall(data, nodes); break; case "UNKNOWN_ARRAY_LENGTH": babelNode = this._serializeUnknownArrayLength(data, nodes); break; case "UNKNOWN_ARRAY_GET_PARTIAL": babelNode = this._serializeUnknownArrayGetPartial(data, nodes); break; case "OBJECT_GET_PARTIAL": babelNode = this._serializeObjectGetPartial(data, nodes); break; case "ABSTRACT_OBJECT_GET_PARTIAL": babelNode = this._serializeAbstractObjectGetPartial(data, nodes); break; case "ABSTRACT_OBJECT_GET_PROTO_OF": babelNode = this._serializeAbstractObjectGetProtoOf(data, nodes); break; case "ABSTRACT_OBJECT_GET": babelNode = this._serializeAbstractObjectGet(data, nodes); break; case "OBJECT_PROTO_HAS_OWN_PROPERTY": babelNode = this._serializeObjectProtoHasOwnProperty(data, nodes); break; case "OBJECT_PROTO_GET_OWN_PROPERTY_DESCRIPTOR": babelNode = this._serializeObjectProtoGetOwnPropertyDescriptor(data, nodes); break; case "DIRECT_CALL_WITH_ARG_LIST": babelNode = this._serializeDirectCallWithArgList(data, nodes); break; case "CALL_ABSTRACT_FUNC": babelNode = this._serializeCallAbstractFunc(data, nodes); break; case "CALL_ABSTRACT_FUNC_THIS": babelNode = this._serializeCallAbstractFuncThis(data, nodes); break; case "LOGICAL_PROPERTY_ASSIGNMENT": babelNode = this._serializeLogicalPropertyAssignment(data, nodes); break; case "UPDATE_INCREMENTOR": babelNode = this._serializeUpdateIncrementor(data, nodes); break; case "MODULES_REQUIRE": babelNode = this._serializeModulesRequires(data, nodes); break; case "RESIDUAL_CALL": babelNode = this._serializeResidualCall(data, nodes); break; case "CANNOT_BECOME_OBJECT": babelNode = this._serializeCannotBecomeObject(data, nodes); break; case "WIDENED_IDENTIFIER": babelNode = this._serializeIdentifier(data, nodes); break; case "WIDEN_PROPERTY": babelNode = this._serializeWidenProperty(data, nodes); break; case "WIDEN_PROPERTY_ASSIGNMENT": babelNode = this._serializeWidenPropertyAssignment(data, nodes); break; // Invariants case "DERIVED_ABSTRACT_INVARIANT": babelNode = this._serializeDerivedAbstractInvariant(data, nodes); break; case "PROPERTY_INVARIANT": babelNode = this._serializePropertyInvariant(data, nodes); break; case "INVARIANT_APPEND": babelNode = this._serializeInvariantAppend(data, nodes); break; case "FULL_INVARIANT": babelNode = this._serializeFullInvariant(data, nodes); break; case "FULL_INVARIANT_ABSTRACT": babelNode = this._serializeFullInvariantAbstract(data, nodes); break; case "FULL_INVARIANT_FUNCTION": babelNode = this._serializeFullInvariantFunction(data, nodes); break; // React case "REACT_DEFAULT_PROPS_HELPER": babelNode = this._serializeReactDefaultPropsHelper(data, nodes); break; case "REACT_SSR_RENDER_VALUE_HELPER": babelNode = this._serializeReactRenderValueHelper(data, nodes); break; case "REACT_SSR_TEMPLATE_LITERAL": babelNode = this._serializeReactSSRTemplateLiteral(data, nodes); break; case "REACT_TEMPORAL_FUNC": babelNode = this._serializeReactTemporalFunc(data, nodes); break; case "REACT_CREATE_CONTEXT_PROVIDER": babelNode = this._serializeReactCreateContextProvider(data, nodes); break; case "REACT_NATIVE_STRING_LITERAL": babelNode = this._serializeReactNativeStringLiteral(data, nodes); break; case "REACT_RELAY_MOCK_CONTAINER": babelNode = this._serializeReactRelayMockContainer(data, nodes); break; // FB Mocks case "FB_MOCKS_BOOTLOADER_LOAD_MODULES": babelNode = this._serializeFBMocksBootloaderLoadModules(data, nodes); break; case "FB_MOCKS_MAGIC_GLOBAL_FUNCTION": babelNode = this._serializeFBMocksMagicGlobalFunction(data, nodes); break; // Babel helpers case "BABEL_HELPERS_OBJECT_WITHOUT_PROPERTIES": babelNode = this._serializeBabelHelpersObjectWithoutProperties(data, nodes); break; default: (0, _invariant.default)(false, `operation descriptor "type" not recognized when serializing operation descriptor`); } return babelNode; } _serializeAssumeCall({}, [c, s]) { let errorLiteral = s.type === "StringLiteral" ? s : t.stringLiteral("Assumption violated"); return t.ifStatement(t.unaryExpression("!", c), t.blockStatement([t.throwStatement(t.newExpression(t.identifier("Error"), [errorLiteral]))])); } _serializeWidenPropertyAssignment({}, [o, propName, v]) { return t.assignmentExpression("=", (0, _babelhelpers.memberExpressionHelper)(o, propName), v); } _serializeWidenAbstractProperty({}, [o, p]) { return (0, _babelhelpers.memberExpressionHelper)(o, p); } _serializeWidenProperty({}, [o, propName]) { return (0, _babelhelpers.memberExpressionHelper)(o, propName); } _serializeAbstractObjectGet({ propertyGetter }, [o, P]) { return propertyGetter !== undefined ? t.callExpression(t.memberExpression(t.identifier("global"), t.identifier("__prop_" + propertyGetter)), [o, P]) : (0, _babelhelpers.memberExpressionHelper)(o, P); } _serializeAbstractObjectGetProtoOf({}, [p]) { (0, _invariant.default)(this.realm.preludeGenerator !== undefined); let getPrototypeOf = this.realm.preludeGenerator.memoizeReference("Object.getPrototypeOf"); return this.realm.isCompatibleWith(this.realm.MOBILE_JSC_VERSION) || this.realm.isCompatibleWith("mobile") ? t.memberExpression(p, _babelhelpers.protoExpression) : t.callExpression(getPrototypeOf, [p]); } _serializeCannotBecomeObject({}, [n]) { let callFunc = t.identifier("global.__cannotBecomeObject"); return t.callExpression(callFunc, [n]); } _serializeResidualCall({}, nodes) { return t.callExpression(nodes[0], nodes.slice(1)); } _serializeModulesRequires({}, [propName]) { return t.callExpression(t.identifier("require"), [propName]); } _serializeConcreteModel({}, [valueNode, propName]) { let propString = propName.value; return t.expressionStatement(t.assignmentExpression("=", this.preludeGenerator.globalReference(propString, false), valueNode)); } _serializeConsoleLog({}, [propName, ...nodes]) { let propString = propName.value; return t.expressionStatement(t.callExpression(t.memberExpression(t.identifier("console"), t.identifier(propString)), [...nodes])); } _serializeDoWhile({ generator, value }, nodes, context, valuesToProcess) { (0, _invariant.default)(context !== undefined); (0, _invariant.default)(valuesToProcess !== undefined); (0, _invariant.default)(value !== undefined); let testId = value.intrinsicName; (0, _invariant.default)(testId !== undefined); (0, _invariant.default)(generator !== undefined); let statements = context.serializeGenerator(generator, valuesToProcess); let block = t.blockStatement(statements); return t.doWhileStatement(t.identifier(testId), block); } _serializeForIn({ boundName, lh }, [obj, tgt, src]) { (0, _invariant.default)(boundName !== undefined); (0, _invariant.default)(lh !== undefined); return t.forInStatement(lh, obj, t.blockStatement([t.expressionStatement(t.assignmentExpression("=", (0, _babelhelpers.memberExpressionHelper)(tgt, boundName), (0, _babelhelpers.memberExpressionHelper)(src, boundName)))])); } _serializeFullInvariant({}, [propName, objectNode, valueNode]) { return t.binaryExpression("!==", (0, _babelhelpers.memberExpressionHelper)(objectNode, propName), valueNode); } _serializeFullInvariantFunction({}, [propName, objectNode]) { return t.binaryExpression("!==", t.unaryExpression("typeof", (0, _babelhelpers.memberExpressionHelper)(objectNode, propName), true), t.stringLiteral("function")); } _serializeFullInvariantAbstract({ concreteComparisons, typeComparisons }, [propName, valueNode]) { (0, _invariant.default)(concreteComparisons !== undefined); (0, _invariant.default)(typeComparisons !== undefined); // Create `object.property !== concreteValue` let checks = concreteComparisons.map(concreteValue => t.binaryExpression("!==", valueNode, t.valueToNode(concreteValue.serialize()))); // Create `typeof object.property !== typeValue` checks = checks.concat([...typeComparisons].map(typeValue => { let typeString = _singletons.Utils.typeToString(typeValue); (0, _invariant.default)(typeString !== undefined, typeValue); return t.binaryExpression("!==", t.unaryExpression("typeof", valueNode, true), t.stringLiteral(typeString)); })); return checks.reduce((expr, newCondition) => t.logicalExpression("&&", expr, newCondition)); } _serializeInvariantAppend({}, [propName, objectNode]) { return (0, _babelhelpers.memberExpressionHelper)(objectNode, propName); } _serializePropertyInvariant({ state }, [propName, objectNode]) { (0, _invariant.default)(state !== undefined); let n = t.callExpression(t.memberExpression(this.preludeGenerator.memoizeReference("Object.prototype.hasOwnProperty"), t.identifier("call")), [objectNode, propName]); if (state !== "MISSING") { n = t.unaryExpression("!", n, true); if (state === "DEFINED") n = t.logicalExpression("||", n, t.binaryExpression("===", (0, _babelhelpers.memberExpressionHelper)(objectNode, propName), t.valueToNode(undefined))); } return n; } _serializeUpdateIncrementor({ incrementor }, [oldValNode]) { (0, _invariant.default)(incrementor !== undefined); return t.binaryExpression(incrementor, oldValNode, t.numericLiteral(1)); } _serializeDerivedAbstractInvariant({}, [typeOfStringNode, typeofNode]) { let typeofString = typeOfStringNode.value; let condition = t.binaryExpression("!==", t.unaryExpression("typeof", typeofNode), t.stringLiteral(typeofString)); if (typeofString === "object") { condition = t.logicalExpression("&&", condition, t.binaryExpression("!==", t.unaryExpression("typeof", typeofNode), t.stringLiteral("function"))); condition = t.logicalExpression("||", condition, t.binaryExpression("===", typeofNode, _babelhelpers.nullExpression)); } return condition; } _serializeInvariant({ appendLastToInvariantOperationDescriptor, violationConditionOperationDescriptor }, nodes) { (0, _invariant.default)(violationConditionOperationDescriptor !== undefined); let messageComponents = [t.stringLiteral("Prepack model invariant violation ("), t.numericLiteral(this.preludeGenerator.nextInvariantId++)]; if (appendLastToInvariantOperationDescriptor) { let propName = nodes[0]; let last = nodes.pop(); messageComponents.push(t.stringLiteral("): ")); messageComponents.push(this.serializeExpression(appendLastToInvariantOperationDescriptor, [propName, last])); } else { messageComponents.push(t.stringLiteral(")")); } let throwString = messageComponents[0]; for (let i = 1; i < messageComponents.length; i++) throwString = t.binaryExpression("+", throwString, messageComponents[i]); let condition = this.serializeExpression(violationConditionOperationDescriptor, nodes); let consequent = this.getErrorStatement(throwString); return t.ifStatement(condition, consequent); } _serializeReactRelayMockContainer({}, [reactRelayIdent, propName, ...otherArgs]) { let propString = propName.value; return t.callExpression(t.memberExpression(reactRelayIdent, t.identifier(propString)), otherArgs); } _serializePropertyAssignment({ path }, [o, p, v, e], context, valuesToProcess) { (0, _invariant.default)(path instanceof _index.AbstractValue); (0, _invariant.default)(path.operationDescriptor !== undefined); let lh = this.serializeExpression(path.operationDescriptor, [o, p], context, valuesToProcess); return t.expressionStatement(t.assignmentExpression("=", lh, v)); } _serializeConditionalPropertyAssignment({ path, value }, [o, v, e, keyKey], context, valuesToProcess) { (0, _invariant.default)(value instanceof _index.AbstractValue); (0, _invariant.default)(path instanceof _index.AbstractValue); let mightHaveBeenDeleted = value.mightHaveBeenDeleted(); let mightBeUndefined = value.mightBeUndefined(); (0, _invariant.default)(path.operationDescriptor !== undefined); let lh = this.serializeExpression(path.operationDescriptor, [o, keyKey], context, valuesToProcess); let r = t.expressionStatement(t.assignmentExpression("=", lh, v)); if (mightHaveBeenDeleted) { // If v === __empty || (v === undefined && !(key.key in o)) then delete it let emptyTest = t.binaryExpression("===", v, e); let undefinedTest = t.binaryExpression("===", v, _babelhelpers.voidExpression); let inTest = t.unaryExpression("!", t.binaryExpression("in", keyKey, o)); let guard = t.logicalExpression("||", emptyTest, t.logicalExpression("&&", undefinedTest, inTest)); let deleteIt = t.expressionStatement(t.unaryExpression("delete", lh)); return t.ifStatement(mightBeUndefined ? emptyTest : guard, deleteIt, r); } return r; } _serializeLogicalPropertyAssignment({ propertyBinding, value }, [o, n]) { (0, _invariant.default)(value instanceof _index.Value); (0, _invariant.default)(propertyBinding !== undefined); if (typeof propertyBinding.key === "string" && value.mightHaveBeenDeleted() && isSelfReferential(value, propertyBinding.pathNode)) { let inTest = t.binaryExpression("in", t.stringLiteral(propertyBinding.key), o); let addEmpty = t.conditionalExpression(inTest, n, _babelhelpers.emptyExpression); n = t.logicalExpression("||", n, addEmpty); } return n; } _serializeLocalAssignment({ value }, [v], context, valuesToProcess) { (0, _invariant.default)(value instanceof _index.AbstractValue); (0, _invariant.default)(value.operationDescriptor !== undefined); let id = this.serializeExpression(value.operationDescriptor, [], context, valuesToProcess); return t.expressionStatement(t.assignmentExpression("=", id, v)); } _serializeReactNativeStringLiteral({}, [propName]) { return propName; } _serializeReactCreateContextProvider({}, [consumerNode]) { return t.memberExpression(consumerNode, t.identifier("Provider")); } _serializeReactTemporalFunc({}, [renderNode, ..._args]) { return t.callExpression(renderNode, _args); } _serializeCallAbstractFunc({}, nodes) { let fun_args = nodes.slice(1); return t.callExpression(nodes[0], fun_args); } _serializeCallAbstractFuncThis({}, nodes) { let fun_args = nodes.slice(1); return t.callExpression(t.memberExpression(nodes[0], t.identifier("call")), fun_args); } _serializeDirectCallWithArgList({}, nodes) { let fun_args = nodes.slice(1); return t.callExpression(nodes[0], fun_args); } _serializeObjectProtoHasOwnProperty({}, [methodNode, objectNode, nameNode]) { return t.callExpression(t.memberExpression(methodNode, t.identifier("call")), [objectNode, nameNode]); } _serializeRebuiltObject({}, [node, propName]) { let propString = propName.value; return t.isValidIdentifier(propString) ? t.memberExpression(node, t.identifier(propString), false) : t.memberExpression(node, propName, true); } _serializeGlobalDelete({}, [propName]) { let propString = propName.value; return t.expressionStatement(t.unaryExpression("delete", this.preludeGenerator.globalReference(propString, false))); } _serializeDefineProperty({ object, descriptor }, [propName], context) { let propString = propName.value; (0, _invariant.default)(object !== undefined); (0, _invariant.default)(descriptor !== undefined); (0, _invariant.default)(context !== undefined); return context.emitDefinePropertyBody(object, propString, descriptor); } _serializeFBMocksMagicGlobalFunction({}, [propName, ...args]) { let propString = propName.value; return t.callExpression(t.identifier(propString), args); } _serializeFBMocksBootloaderLoadModules({}, args) { return t.callExpression(t.memberExpression(t.identifier("Bootloader"), t.identifier("loadModules")), args); } _serializeUnknownArrayGetPartial({}, [o, p]) { return (0, _babelhelpers.memberExpressionHelper)(o, p); } _serializeObjectGetPartial({}, [o, p]) { return (0, _babelhelpers.memberExpressionHelper)(o, p); } _serializeAbstractObjectGetPartial({}, [o, p]) { return (0, _babelhelpers.memberExpressionHelper)(o, p); } _serializeObjectSetPartial({}, [objectNode, keyNode, valueNode]) { return t.expressionStatement(t.assignmentExpression("=", (0, _babelhelpers.memberExpressionHelper)(objectNode, keyNode), valueNode)); } _serializeIdentifier({ id }, nodes) { (0, _invariant.default)(id !== undefined); return t.identifier(id); } _serializeCoerceToString({}, [p]) { return t.binaryExpression("+", t.stringLiteral(""), p); } _serializeBabelHelpersObjectWithoutProperties({}, [methodNode, objNode, propRemoveNode]) { return t.callExpression(methodNode, [objNode, propRemoveNode]); } _serializeReactDefaultPropsHelper({}, [methodNode, ..._args]) { return t.callExpression(methodNode, _args); } _serializeUnknownArrayMethodCall({}, [methodNode, ..._args]) { return t.callExpression(methodNode, _args); } _serializeUnknownArrayLength({}, [o]) { return t.memberExpression(o, t.identifier("length"), false); } _serializeUnknownArrayMethodPropertyCall({}, [objNode, propName, ..._args]) { let propString = propName.value; return t.callExpression(t.memberExpression(objNode, t.identifier(propString)), _args); } _serializeThrow({}, [argument]) { return t.throwStatement(argument); } _serializeConditionalThrow({ value }, nodes, context) { (0, _invariant.default)(value instanceof _index.Value); function createStatement(val) { (0, _invariant.default)(context !== undefined); if (!(val instanceof _index.AbstractValue) || val.kind !== "conditional") { return t.throwStatement(context.serializeValue(val)); } let [cond, trueVal, falseVal] = val.args; let condVal = context.serializeValue(cond); let trueStat, falseStat; if (trueVal instanceof _index.EmptyValue) trueStat = t.blockStatement([]);else trueStat = createStatement(trueVal); if (falseVal instanceof _index.EmptyValue) falseStat = t.blockStatement([]);else falseStat = createStatement(falseVal); return t.ifStatement(condVal, trueStat, falseStat); } return createStatement(value); } _serializeReactSSRTemplateLiteral({ quasis }, valueNodes) { (0, _invariant.default)(quasis !== undefined); return t.templateLiteral(quasis, valueNodes); } _serializeReactRenderValueHelper({}, [helperNode, valueNode]) { return t.callExpression(helperNode, [valueNode]); } _serializePropertyDelete({}, [objectNode, propName]) { return t.expressionStatement(t.unaryExpression("delete", (0, _babelhelpers.memberExpressionHelper)(objectNode, propName))); } _serializeGetBinding({ binding }, nodes, context) { (0, _invariant.default)(binding !== undefined); (0, _invariant.default)(context !== undefined); return context.serializeBinding(binding); } _serializeForFunctionCall({ usesThis }, [func, thisExpr]) { return usesThis ? t.callExpression(t.memberExpression(func, t.identifier("call")), [thisExpr]) : t.callExpression(func, []); } _serializeNewExpression({}, [constructorNode, ...argListNodes]) { return t.newExpression(constructorNode, argListNodes); } _serializeEmitCall({ callFunctionRef }, nodes) { (0, _invariant.default)(callFunctionRef !== undefined); let callFunction = this.preludeGenerator.memoizeReference(callFunctionRef); return t.expressionStatement(t.callExpression(callFunction, [...nodes])); } _serializeEmitCallAndCaptureResults({ callFunctionRef }, nodes) { (0, _invariant.default)(callFunctionRef !== undefined); let callFunction = this.preludeGenerator.memoizeReference(callFunctionRef); return t.callExpression(callFunction, nodes); } _serializeObjectProtoGetOwnPropertyDescriptor({}, [funcNode, ...args]) { return t.callExpression(funcNode, args); } _serializeCallBailout({ propRef, thisArg }, nodes) { let callFunc; let argStart = 1; if (thisArg instanceof _index.Value) { if (typeof propRef === "string") { callFunc = (0, _babelhelpers.memberExpressionHelper)(nodes[0], propRef); } else { callFunc = (0, _babelhelpers.memberExpressionHelper)(nodes[0], nodes[1]); argStart = 2; } } else { callFunc = nodes[0]; } let fun_args = nodes.slice(argStart); return t.callExpression(callFunc, fun_args); } _serializeJoinGenerators({ generators }, [cond], context, valuesToProcess) { (0, _invariant.default)(context !== undefined); (0, _invariant.default)(valuesToProcess !== undefined); (0, _invariant.default)(generators !== undefined); let [generator1, generator2] = generators; let block1 = generator1.empty() ? null : serializeBody(generator1, context, valuesToProcess); let block2 = generator2.empty() ? null : serializeBody(generator2, context, valuesToProcess); if (block1) return t.ifStatement(cond, block1, block2); (0, _invariant.default)(block2); return t.ifStatement(t.unaryExpression("!", cond), block2); } _serializeEmitPropertyAssignment({ value }, [objectNode, valueNode, propName], context) { (0, _invariant.default)(context !== undefined); (0, _invariant.default)(value instanceof _index.Value); return context.getPropertyAssignmentStatement((0, _babelhelpers.memberExpressionHelper)(objectNode, propName), value, value.mightHaveBeenDeleted(), /* deleteIfMightHaveBeenDeleted */ true); } _serializeGlobalAssignment({}, [valueNode, propName]) { let propString = propName.value; return t.expressionStatement(t.assignmentExpression("=", this.preludeGenerator.globalReference(propString, false), valueNode)); } _serializeSingleArg({}, [o]) { return o; } _serializeAbstractProperty({}, [o, propName]) { return (0, _babelhelpers.memberExpressionHelper)(o, propName); } _serializeUnaryExpression({ unaryOperator, prefix }, [x, y]) { (0, _invariant.default)(unaryOperator !== undefined); return t.unaryExpression(unaryOperator, x, prefix); } _serializeBinaryExpression({ binaryOperator }, [x, y]) { (0, _invariant.default)(binaryOperator !== undefined); return t.binaryExpression(binaryOperator, x, y); } _serializeLogicalExpression({ logicalOperator }, [x, y]) { (0, _invariant.default)(logicalOperator !== undefined); return t.logicalExpression(logicalOperator, x, y); } _serializeConditionalExpression({}, [c, x, y]) { return t.conditionalExpression(c, x, y); } _serializeDerivedOperationDescriptor(id, babelNode) { return t.variableDeclaration("var", [t.variableDeclarator(t.identifier(id), babelNode)]); } _serializeVoidOperationDescriptor(babelNode) { return t.expressionStatement(babelNode); } _serializeAbstractFromTemplate({ templateSource }, nodes) { let templateArguments = {}; let i = 0; for (let node of nodes) templateArguments[_PreludeGenerator.Placeholders[i++]] = node; (0, _invariant.default)(templateSource !== undefined); return this.preludeGenerator.buildExpression(templateSource, templateArguments); } _serializeObjectAssign({}, [targetNode, ...sourceNodes]) { return t.callExpression(this.preludeGenerator.memoizeReference("Object.assign"), [targetNode, ...sourceNodes]); } } exports.ResidualOperationSerializer = ResidualOperationSerializer; //# sourceMappingURL=ResidualOperationSerializer.js.map