UNPKG

react-native-reanimated

Version:

More powerful alternative to Animated library for React Native.

1,067 lines (1,053 loc) • 42.9 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __commonJS = (cb, mod) => function __require() { return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); // lib/types.js var require_types = __commonJS({ "lib/types.js"(exports2) { "use strict"; Object.defineProperty(exports2, "__esModule", { value: true }); exports2.isWorkletizableFunctionType = exports2.WorkletizableFunction = void 0; exports2.WorkletizableFunction = "FunctionDeclaration|FunctionExpression|ArrowFunctionExpression|ObjectMethod"; function isWorkletizableFunctionType(path) { return path.isFunctionDeclaration() || path.isFunctionExpression() || path.isArrowFunctionExpression() || path.isObjectMethod(); } exports2.isWorkletizableFunctionType = isWorkletizableFunctionType; } }); // lib/globals.js var require_globals = __commonJS({ "lib/globals.js"(exports2) { "use strict"; Object.defineProperty(exports2, "__esModule", { value: true }); exports2.initializeGlobals = exports2.globals = exports2.defaultGlobals = void 0; var notCapturedIdentifiers = [ "globalThis", "Infinity", "NaN", "undefined", "eval", "isFinite", "isNaN", "parseFloat", "parseInt", "decodeURI", "decodeURIComponent", "encodeURI", "encodeURIComponent", "escape", "unescape", "Object", "Function", "Boolean", "Symbol", "Error", "AggregateError", "EvalError", "RangeError", "ReferenceError", "SyntaxError", "TypeError", "URIError", "InternalError", "Number", "BigInt", "Math", "Date", "String", "RegExp", "Array", "Int8Array", "Uint8Array", "Uint8ClampedArray", "Int16Array", "Uint16Array", "Int32Array", "Uint32Array", "BigInt64Array", "BigUint64Array", "Float32Array", "Float64Array", "Map", "Set", "WeakMap", "WeakSet", "ArrayBuffer", "SharedArrayBuffer", "DataView", "Atomics", "JSON", "WeakRef", "FinalizationRegistry", "Iterator", "AsyncIterator", "Promise", "GeneratorFunction", "AsyncGeneratorFunction", "Generator", "AsyncGenerator", "AsyncFunction", "Reflect", "Proxy", "Intl", "null", "this", "global", "console", "performance", "queueMicrotask", "requestAnimationFrame", "setImmediate", "arguments", "HermesInternal", "_WORKLET" ]; var notCapturedIdentifiers_DEPRECATED = [ "_IS_FABRIC", "_log", "_toString", "_scheduleOnJS", "_scheduleOnRuntime", "_makeShareableClone", "_updatePropsPaper", "_updatePropsFabric", "_removeFromPropsRegistry", "_measurePaper", "_measureFabric", "_scrollToPaper", "_dispatchCommandPaper", "_dispatchCommandFabric", "_setGestureState", "_notifyAboutProgress", "_notifyAboutEnd", "_runOnUIQueue", "_getAnimationTimestamp" ]; exports2.defaultGlobals = new Set(notCapturedIdentifiers.concat(notCapturedIdentifiers_DEPRECATED)); function initializeGlobals() { exports2.globals = new Set(exports2.defaultGlobals); } exports2.initializeGlobals = initializeGlobals; } }); // lib/utils.js var require_utils = __commonJS({ "lib/utils.js"(exports2) { "use strict"; Object.defineProperty(exports2, "__esModule", { value: true }); exports2.addCustomGlobals = exports2.isRelease = void 0; var globals_12 = require_globals(); function isRelease() { var _a, _b; const pattern = /(prod|release|stag[ei])/i; return !!(((_a = process.env.BABEL_ENV) === null || _a === void 0 ? void 0 : _a.match(pattern)) || ((_b = process.env.NODE_ENV) === null || _b === void 0 ? void 0 : _b.match(pattern))); } exports2.isRelease = isRelease; function addCustomGlobals() { if (this.opts && Array.isArray(this.opts.globals)) { this.opts.globals.forEach((name) => { globals_12.globals.add(name); }); } } exports2.addCustomGlobals = addCustomGlobals; } }); // lib/workletStringCode.js var require_workletStringCode = __commonJS({ "lib/workletStringCode.js"(exports2) { "use strict"; var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) { if (k2 === void 0) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); } : function(o, m, k, k2) { if (k2 === void 0) k2 = k; o[k2] = m[k]; }); var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); } : function(o, v) { o["default"] = v; }); var __importStar = exports2 && exports2.__importStar || function(mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) { for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); } __setModuleDefault(result, mod); return result; }; var __importDefault = exports2 && exports2.__importDefault || function(mod) { return mod && mod.__esModule ? mod : { "default": mod }; }; Object.defineProperty(exports2, "__esModule", { value: true }); exports2.buildWorkletString = void 0; var core_1 = require("@babel/core"); var generator_1 = __importDefault(require("@babel/generator")); var types_12 = require("@babel/types"); var assert_1 = require("assert"); var convertSourceMap = __importStar(require("convert-source-map")); var fs = __importStar(require("fs")); var utils_12 = require_utils(); var MOCK_SOURCE_MAP = "mock source map"; function buildWorkletString(fun, closureVariables, name, inputMap) { const draftExpression = fun.program.body.find((obj) => (0, types_12.isFunctionDeclaration)(obj)) || fun.program.body.find((obj) => (0, types_12.isExpressionStatement)(obj)) || void 0; (0, assert_1.strict)(draftExpression, "[Reanimated] `draftExpression` is undefined."); const expression = (0, types_12.isFunctionDeclaration)(draftExpression) ? draftExpression : draftExpression.expression; (0, assert_1.strict)("params" in expression, "'params' property is undefined in 'expression'"); (0, assert_1.strict)((0, types_12.isBlockStatement)(expression.body), "[Reanimated] `expression.body` is not a `BlockStatement`"); const workletFunction = (0, types_12.functionExpression)((0, types_12.identifier)(name), expression.params, expression.body, expression.generator, expression.async); const code = (0, generator_1.default)(workletFunction).code; (0, assert_1.strict)(inputMap, "[Reanimated] `inputMap` is undefined."); const includeSourceMap = !(0, utils_12.isRelease)(); if (includeSourceMap) { inputMap.sourcesContent = []; for (const sourceFile of inputMap.sources) { inputMap.sourcesContent.push(fs.readFileSync(sourceFile).toString("utf-8")); } } const transformed = (0, core_1.transformSync)(code, { plugins: [prependClosureVariablesIfNecessary(closureVariables)], compact: true, sourceMaps: includeSourceMap, inputSourceMap: inputMap, ast: false, babelrc: false, configFile: false, comments: false }); (0, assert_1.strict)(transformed, "[Reanimated] `transformed` is null."); let sourceMap; if (includeSourceMap) { if (shouldMockSourceMap()) { sourceMap = MOCK_SOURCE_MAP; } else { sourceMap = convertSourceMap.fromObject(transformed.map).toObject(); delete sourceMap.sourcesContent; } } return [transformed.code, JSON.stringify(sourceMap)]; } exports2.buildWorkletString = buildWorkletString; function shouldMockSourceMap() { return process.env.REANIMATED_JEST_SHOULD_MOCK_SOURCE_MAP === "1"; } function prependClosure(path, closureVariables, closureDeclaration) { if (closureVariables.length === 0 || !(0, types_12.isProgram)(path.parent)) { return; } if (!(0, types_12.isExpression)(path.node.body)) { path.node.body.body.unshift(closureDeclaration); } } function prependRecursiveDeclaration(path) { var _a; if ((0, types_12.isProgram)(path.parent) && !(0, types_12.isArrowFunctionExpression)(path.node) && !(0, types_12.isObjectMethod)(path.node) && path.node.id && path.scope.parent) { const hasRecursiveCalls = ((_a = path.scope.parent.bindings[path.node.id.name]) === null || _a === void 0 ? void 0 : _a.references) > 0; if (hasRecursiveCalls) { path.node.body.body.unshift((0, types_12.variableDeclaration)("const", [ (0, types_12.variableDeclarator)((0, types_12.identifier)(path.node.id.name), (0, types_12.memberExpression)((0, types_12.thisExpression)(), (0, types_12.identifier)("_recur"))) ])); } } } function prependClosureVariablesIfNecessary(closureVariables) { const closureDeclaration = (0, types_12.variableDeclaration)("const", [ (0, types_12.variableDeclarator)((0, types_12.objectPattern)(closureVariables.map((variable) => (0, types_12.objectProperty)((0, types_12.identifier)(variable.name), (0, types_12.identifier)(variable.name), false, true))), (0, types_12.memberExpression)((0, types_12.thisExpression)(), (0, types_12.identifier)("__closure"))) ]); return { visitor: { "FunctionDeclaration|FunctionExpression|ArrowFunctionExpression|ObjectMethod": (path) => { prependClosure(path, closureVariables, closureDeclaration); prependRecursiveDeclaration(path); } } }; } } }); // lib/workletFactory.js var require_workletFactory = __commonJS({ "lib/workletFactory.js"(exports2) { "use strict"; var __importDefault = exports2 && exports2.__importDefault || function(mod) { return mod && mod.__esModule ? mod : { "default": mod }; }; Object.defineProperty(exports2, "__esModule", { value: true }); exports2.makeWorkletFactory = void 0; var core_1 = require("@babel/core"); var generator_1 = __importDefault(require("@babel/generator")); var types_12 = require("@babel/types"); var assert_1 = require("assert"); var path_1 = require("path"); var workletStringCode_1 = require_workletStringCode(); var globals_12 = require_globals(); var utils_12 = require_utils(); var REAL_VERSION = require("../../package.json").version; var MOCK_VERSION = "x.y.z"; var workletStringTransformPresets = [ require.resolve("@babel/preset-typescript") ]; var workletStringTransformPlugins = [ require.resolve("@babel/plugin-transform-shorthand-properties"), require.resolve("@babel/plugin-transform-arrow-functions"), require.resolve("@babel/plugin-transform-optional-chaining"), require.resolve("@babel/plugin-transform-nullish-coalescing-operator"), [ require.resolve("@babel/plugin-transform-template-literals"), { loose: true } ] ]; function makeWorkletFactory(fun, state) { removeWorkletDirective(fun); (0, assert_1.strict)(state.file.opts.filename, "[Reanimated] `state.file.opts.filename` is undefined."); const codeObject = (0, generator_1.default)(fun.node, { sourceMaps: true, sourceFileName: state.file.opts.filename }); codeObject.code = "(" + (fun.isObjectMethod() ? "function " : "") + codeObject.code + "\n)"; const transformed = (0, core_1.transformSync)(codeObject.code, { filename: state.file.opts.filename, presets: workletStringTransformPresets, plugins: workletStringTransformPlugins, ast: true, babelrc: false, configFile: false, inputSourceMap: codeObject.map }); (0, assert_1.strict)(transformed, "[Reanimated] `transformed` is undefined."); (0, assert_1.strict)(transformed.ast, "[Reanimated] `transformed.ast` is undefined."); const variables = makeArrayFromCapturedBindings(transformed.ast, fun); const functionName = makeWorkletName(fun); const functionIdentifier = (0, types_12.identifier)(functionName); const clone = (0, types_12.cloneNode)(fun.node); const funExpression = (0, types_12.isBlockStatement)(clone.body) ? (0, types_12.functionExpression)(null, clone.params, clone.body, clone.generator, clone.async) : clone; let [funString, sourceMapString] = (0, workletStringCode_1.buildWorkletString)(transformed.ast, variables, functionName, transformed.map); (0, assert_1.strict)(funString, "[Reanimated] `funString` is undefined."); const workletHash = hash(funString); let lineOffset = 1; if (variables.length > 0) { lineOffset -= variables.length + 2; } const pathForStringDefinitions = fun.parentPath.isProgram() ? fun : fun.findParent((path) => { var _a, _b; return (_b = (_a = path.parentPath) === null || _a === void 0 ? void 0 : _a.isProgram()) !== null && _b !== void 0 ? _b : false; }); (0, assert_1.strict)(pathForStringDefinitions, "[Reanimated] `pathForStringDefinitions` is null."); (0, assert_1.strict)(pathForStringDefinitions.parentPath, "[Reanimated] `pathForStringDefinitions.parentPath` is null."); const initDataId = pathForStringDefinitions.parentPath.scope.generateUidIdentifier(`worklet_${workletHash}_init_data`); const initDataObjectExpression = (0, types_12.objectExpression)([ (0, types_12.objectProperty)((0, types_12.identifier)("code"), (0, types_12.stringLiteral)(funString)) ]); const shouldInjectLocation = !(0, utils_12.isRelease)(); if (shouldInjectLocation) { let location = state.file.opts.filename; if (state.opts.relativeSourceLocation) { location = (0, path_1.relative)(state.cwd, location); sourceMapString = sourceMapString === null || sourceMapString === void 0 ? void 0 : sourceMapString.replace(state.file.opts.filename, location); } initDataObjectExpression.properties.push((0, types_12.objectProperty)((0, types_12.identifier)("location"), (0, types_12.stringLiteral)(location))); } if (sourceMapString) { initDataObjectExpression.properties.push((0, types_12.objectProperty)((0, types_12.identifier)("sourceMap"), (0, types_12.stringLiteral)(sourceMapString))); } const shouldInjectVersion = !(0, utils_12.isRelease)(); if (shouldInjectVersion) { initDataObjectExpression.properties.push((0, types_12.objectProperty)((0, types_12.identifier)("version"), (0, types_12.stringLiteral)(shouldMockVersion() ? MOCK_VERSION : REAL_VERSION))); } const shouldIncludeInitData = !state.opts.omitNativeOnlyData; if (shouldIncludeInitData) { pathForStringDefinitions.insertBefore((0, types_12.variableDeclaration)("const", [ (0, types_12.variableDeclarator)(initDataId, initDataObjectExpression) ])); } (0, assert_1.strict)(!(0, types_12.isFunctionDeclaration)(funExpression), "[Reanimated] `funExpression` is a `FunctionDeclaration`."); (0, assert_1.strict)(!(0, types_12.isObjectMethod)(funExpression), "[Reanimated] `funExpression` is an `ObjectMethod`."); const statements = [ (0, types_12.variableDeclaration)("const", [ (0, types_12.variableDeclarator)(functionIdentifier, funExpression) ]), (0, types_12.expressionStatement)((0, types_12.assignmentExpression)("=", (0, types_12.memberExpression)(functionIdentifier, (0, types_12.identifier)("__closure"), false), (0, types_12.objectExpression)(variables.map((variable) => (0, types_12.objectProperty)((0, types_12.identifier)(variable.name), variable, false, true))))), (0, types_12.expressionStatement)((0, types_12.assignmentExpression)("=", (0, types_12.memberExpression)(functionIdentifier, (0, types_12.identifier)("__workletHash"), false), (0, types_12.numericLiteral)(workletHash))) ]; if (shouldIncludeInitData) { statements.push((0, types_12.expressionStatement)((0, types_12.assignmentExpression)("=", (0, types_12.memberExpression)(functionIdentifier, (0, types_12.identifier)("__initData"), false), initDataId))); } if (!(0, utils_12.isRelease)()) { statements.unshift((0, types_12.variableDeclaration)("const", [ (0, types_12.variableDeclarator)((0, types_12.identifier)("_e"), (0, types_12.arrayExpression)([ (0, types_12.newExpression)((0, types_12.memberExpression)((0, types_12.identifier)("global"), (0, types_12.identifier)("Error")), []), (0, types_12.numericLiteral)(lineOffset), (0, types_12.numericLiteral)(-27) ])) ])); statements.push((0, types_12.expressionStatement)((0, types_12.assignmentExpression)("=", (0, types_12.memberExpression)(functionIdentifier, (0, types_12.identifier)("__stackDetails"), false), (0, types_12.identifier)("_e")))); } statements.push((0, types_12.returnStatement)(functionIdentifier)); const newFun = (0, types_12.functionExpression)(void 0, [], (0, types_12.blockStatement)(statements)); return newFun; } exports2.makeWorkletFactory = makeWorkletFactory; function removeWorkletDirective(fun) { fun.traverse({ DirectiveLiteral(path) { if (path.node.value === "worklet" && path.getFunctionParent() === fun) { path.parentPath.remove(); } } }); } function shouldMockVersion() { return process.env.REANIMATED_JEST_SHOULD_MOCK_VERSION === "1"; } function hash(str) { let i = str.length; let hash1 = 5381; let hash2 = 52711; while (i--) { const char = str.charCodeAt(i); hash1 = hash1 * 33 ^ char; hash2 = hash2 * 33 ^ char; } return (hash1 >>> 0) * 4096 + (hash2 >>> 0); } function makeWorkletName(fun) { if ((0, types_12.isObjectMethod)(fun.node) && (0, types_12.isIdentifier)(fun.node.key)) { return fun.node.key.name; } if ((0, types_12.isFunctionDeclaration)(fun.node) && (0, types_12.isIdentifier)(fun.node.id)) { return fun.node.id.name; } if ((0, types_12.isFunctionExpression)(fun.node) && (0, types_12.isIdentifier)(fun.node.id)) { return fun.node.id.name; } return "anonymous"; } function makeArrayFromCapturedBindings(ast, fun) { const closure = /* @__PURE__ */ new Map(); const isLocationAssignedMap = /* @__PURE__ */ new Map(); (0, core_1.traverse)(ast, { Identifier(path) { if (!path.isReferencedIdentifier()) { return; } const name = path.node.name; if (globals_12.globals.has(name)) { return; } if ("id" in fun.node && fun.node.id && fun.node.id.name === name) { return; } const parentNode = path.parent; if ((0, types_12.isMemberExpression)(parentNode) && parentNode.property === path.node && !parentNode.computed) { return; } if ((0, types_12.isObjectProperty)(parentNode) && (0, types_12.isObjectExpression)(path.parentPath.parent) && path.node !== parentNode.value) { return; } let currentScope = path.scope; while (currentScope != null) { if (currentScope.bindings[name] != null) { return; } currentScope = currentScope.parent; } closure.set(name, path.node); isLocationAssignedMap.set(name, false); } }); fun.traverse({ Identifier(path) { if (!path.isReferencedIdentifier()) { return; } const node = closure.get(path.node.name); if (!node || isLocationAssignedMap.get(path.node.name)) { return; } node.loc = path.node.loc; isLocationAssignedMap.set(path.node.name, true); } }); return Array.from(closure.values()); } } }); // lib/workletFactoryCall.js var require_workletFactoryCall = __commonJS({ "lib/workletFactoryCall.js"(exports2) { "use strict"; Object.defineProperty(exports2, "__esModule", { value: true }); exports2.makeWorkletFactoryCall = void 0; var types_12 = require("@babel/types"); var workletFactory_1 = require_workletFactory(); function makeWorkletFactoryCall(path, state) { const workletFactory = (0, workletFactory_1.makeWorkletFactory)(path, state); const workletFactoryCall = (0, types_12.callExpression)(workletFactory, []); addStackTraceDataToWorkletFactory(path, workletFactoryCall); const replacement = workletFactoryCall; return replacement; } exports2.makeWorkletFactoryCall = makeWorkletFactoryCall; function addStackTraceDataToWorkletFactory(path, workletFactoryCall) { const originalWorkletLocation = path.node.loc; if (originalWorkletLocation) { workletFactoryCall.callee.loc = { filename: originalWorkletLocation.filename, identifierName: originalWorkletLocation.identifierName, start: originalWorkletLocation.start, end: originalWorkletLocation.start }; } } } }); // lib/workletSubstitution.js var require_workletSubstitution = __commonJS({ "lib/workletSubstitution.js"(exports2) { "use strict"; Object.defineProperty(exports2, "__esModule", { value: true }); exports2.maybeSubstituteFunctionDeclarationWithVariableDeclaration = exports2.substituteObjectMethodWithObjectProperty = exports2.processWorklet = exports2.processIfWithWorkletDirective = void 0; var types_12 = require("@babel/types"); var workletFactoryCall_1 = require_workletFactoryCall(); var types_2 = require_types(); function processIfWithWorkletDirective(path, state) { if (!(0, types_12.isBlockStatement)(path.node.body)) { return false; } if (!hasWorkletDirective(path.node.body.directives)) { return false; } processWorklet(path, state); return true; } exports2.processIfWithWorkletDirective = processIfWithWorkletDirective; function processWorklet(path, state) { if (state.opts.processNestedWorklets) { path.traverse({ [types_2.WorkletizableFunction](subPath, passedState) { processIfWithWorkletDirective(subPath, passedState); } }, state); } const workletFactoryCall = (0, workletFactoryCall_1.makeWorkletFactoryCall)(path, state); substituteWithWorkletFactoryCall(path, workletFactoryCall); } exports2.processWorklet = processWorklet; function hasWorkletDirective(directives) { return directives.some((directive) => (0, types_12.isDirectiveLiteral)(directive.value) && directive.value.value === "worklet"); } function substituteWithWorkletFactoryCall(path, workletFactoryCall) { if (path.isObjectMethod()) { substituteObjectMethodWithObjectProperty(path, workletFactoryCall); } else if (path.isFunctionDeclaration()) { maybeSubstituteFunctionDeclarationWithVariableDeclaration(path, workletFactoryCall); } else { path.replaceWith(workletFactoryCall); } } function substituteObjectMethodWithObjectProperty(path, workletFactoryCall) { const replacement = (0, types_12.objectProperty)(path.node.key, workletFactoryCall); path.replaceWith(replacement); } exports2.substituteObjectMethodWithObjectProperty = substituteObjectMethodWithObjectProperty; function maybeSubstituteFunctionDeclarationWithVariableDeclaration(path, workletFactoryCall) { const needDeclaration = (0, types_12.isScopable)(path.parent) || (0, types_12.isExportNamedDeclaration)(path.parent); const replacement = "id" in path.node && path.node.id && needDeclaration ? (0, types_12.variableDeclaration)("const", [ (0, types_12.variableDeclarator)(path.node.id, workletFactoryCall) ]) : workletFactoryCall; path.replaceWith(replacement); } exports2.maybeSubstituteFunctionDeclarationWithVariableDeclaration = maybeSubstituteFunctionDeclarationWithVariableDeclaration; } }); // lib/gestureHandlerAutoworkletization.js var require_gestureHandlerAutoworkletization = __commonJS({ "lib/gestureHandlerAutoworkletization.js"(exports2) { "use strict"; Object.defineProperty(exports2, "__esModule", { value: true }); exports2.isGestureHandlerEventCallback = void 0; var types_12 = require("@babel/types"); var gestureHandlerGestureObjects = /* @__PURE__ */ new Set([ "Tap", "Pan", "Pinch", "Rotation", "Fling", "LongPress", "ForceTouch", "Native", "Manual", "Race", "Simultaneous", "Exclusive", "Hover" ]); var gestureHandlerBuilderMethods = /* @__PURE__ */ new Set([ "onBegin", "onStart", "onEnd", "onFinalize", "onUpdate", "onChange", "onTouchesDown", "onTouchesMove", "onTouchesUp", "onTouchesCancelled" ]); function isGestureHandlerEventCallback(path) { return (0, types_12.isCallExpression)(path.parent) && (0, types_12.isExpression)(path.parent.callee) && isGestureObjectEventCallbackMethod(path.parent.callee); } exports2.isGestureHandlerEventCallback = isGestureHandlerEventCallback; function isGestureObjectEventCallbackMethod(exp) { return (0, types_12.isMemberExpression)(exp) && (0, types_12.isIdentifier)(exp.property) && gestureHandlerBuilderMethods.has(exp.property.name) && containsGestureObject(exp.object); } function containsGestureObject(exp) { if (isGestureObject(exp)) { return true; } if ((0, types_12.isCallExpression)(exp) && (0, types_12.isMemberExpression)(exp.callee) && containsGestureObject(exp.callee.object)) { return true; } return false; } function isGestureObject(exp) { return (0, types_12.isCallExpression)(exp) && (0, types_12.isMemberExpression)(exp.callee) && (0, types_12.isIdentifier)(exp.callee.object) && exp.callee.object.name === "Gesture" && (0, types_12.isIdentifier)(exp.callee.property) && gestureHandlerGestureObjects.has(exp.callee.property.name); } } }); // lib/layoutAnimationAutoworkletization.js var require_layoutAnimationAutoworkletization = __commonJS({ "lib/layoutAnimationAutoworkletization.js"(exports2) { "use strict"; Object.defineProperty(exports2, "__esModule", { value: true }); exports2.isLayoutAnimationCallback = void 0; var types_12 = require("@babel/types"); var EntryExitAnimations = /* @__PURE__ */ new Set([ "BounceIn", "BounceInDown", "BounceInLeft", "BounceInRight", "BounceInUp", "BounceOut", "BounceOutDown", "BounceOutLeft", "BounceOutRight", "BounceOutUp", "FadeIn", "FadeInDown", "FadeInLeft", "FadeInRight", "FadeInUp", "FadeOut", "FadeOutDown", "FadeOutLeft", "FadeOutRight", "FadeOutUp", "FlipInEasyX", "FlipInEasyY", "FlipInXDown", "FlipInXUp", "FlipInYLeft", "FlipInYRight", "FlipOutEasyX", "FlipOutEasyY", "FlipOutXDown", "FlipOutXUp", "FlipOutYLeft", "FlipOutYRight", "LightSpeedInLeft", "LightSpeedInRight", "LightSpeedOutLeft", "LightSpeedOutRight", "PinwheelIn", "PinwheelOut", "RollInLeft", "RollInRight", "RollOutLeft", "RollOutRight", "RotateInDownLeft", "RotateInDownRight", "RotateInUpLeft", "RotateInUpRight", "RotateOutDownLeft", "RotateOutDownRight", "RotateOutUpLeft", "RotateOutUpRight", "SlideInDown", "SlideInLeft", "SlideInRight", "SlideInUp", "SlideOutDown", "SlideOutLeft", "SlideOutRight", "SlideOutUp", "StretchInX", "StretchInY", "StretchOutX", "StretchOutY", "ZoomIn", "ZoomInDown", "ZoomInEasyDown", "ZoomInEasyUp", "ZoomInLeft", "ZoomInRight", "ZoomInRotate", "ZoomInUp", "ZoomOut", "ZoomOutDown", "ZoomOutEasyDown", "ZoomOutEasyUp", "ZoomOutLeft", "ZoomOutRight", "ZoomOutRotate", "ZoomOutUp" ]); var LayoutTransitions = /* @__PURE__ */ new Set([ "Layout", "LinearTransition", "SequencedTransition", "FadingTransition", "JumpingTransition", "CurvedTransition", "EntryExitTransition" ]); var LayoutAnimations = /* @__PURE__ */ new Set([ ...EntryExitAnimations, ...LayoutTransitions ]); var BaseAnimationsChainableMethods = /* @__PURE__ */ new Set([ "build", "duration", "delay", "getDuration", "randomDelay", "getDelay", "getDelayFunction" ]); var ComplexAnimationsChainableMethods = /* @__PURE__ */ new Set([ "easing", "rotate", "springify", "damping", "mass", "stiffness", "overshootClamping", "restDisplacementThreshold", "restSpeedThreshold", "withInitialValues", "getAnimationAndConfig" ]); var DefaultTransitionChainableMethods = /* @__PURE__ */ new Set([ "easingX", "easingY", "easingWidth", "easingHeight", "entering", "exiting", "reverse" ]); var LayoutAnimationsChainableMethods = /* @__PURE__ */ new Set([ ...BaseAnimationsChainableMethods, ...ComplexAnimationsChainableMethods, ...DefaultTransitionChainableMethods ]); var LayoutAnimationsCallbacks = /* @__PURE__ */ new Set(["withCallback"]); function isLayoutAnimationCallback(path) { return (0, types_12.isCallExpression)(path.parent) && (0, types_12.isExpression)(path.parent.callee) && isLayoutAnimationCallbackMethod(path.parent.callee); } exports2.isLayoutAnimationCallback = isLayoutAnimationCallback; function isLayoutAnimationCallbackMethod(exp) { return (0, types_12.isMemberExpression)(exp) && (0, types_12.isIdentifier)(exp.property) && LayoutAnimationsCallbacks.has(exp.property.name) && isLayoutAnimationsChainableOrNewOperator(exp.object); } function isLayoutAnimationsChainableOrNewOperator(exp) { if ((0, types_12.isIdentifier)(exp) && LayoutAnimations.has(exp.name)) { return true; } else if ((0, types_12.isNewExpression)(exp) && (0, types_12.isIdentifier)(exp.callee) && LayoutAnimations.has(exp.callee.name)) { return true; } if ((0, types_12.isCallExpression)(exp) && (0, types_12.isMemberExpression)(exp.callee) && (0, types_12.isIdentifier)(exp.callee.property) && LayoutAnimationsChainableMethods.has(exp.callee.property.name) && isLayoutAnimationsChainableOrNewOperator(exp.callee.object)) { return true; } return false; } } }); // lib/autoworkletization.js var require_autoworkletization = __commonJS({ "lib/autoworkletization.js"(exports2) { "use strict"; Object.defineProperty(exports2, "__esModule", { value: true }); exports2.processCalleesAutoworkletizableCallbacks = exports2.processIfAutoworkletizableCallback = void 0; var types_12 = require("@babel/types"); var types_2 = require_types(); var assert_1 = require("assert"); var workletSubstitution_12 = require_workletSubstitution(); var gestureHandlerAutoworkletization_1 = require_gestureHandlerAutoworkletization(); var layoutAnimationAutoworkletization_1 = require_layoutAnimationAutoworkletization(); var functionArgsToWorkletize = /* @__PURE__ */ new Map([ ["useFrameCallback", [0]], ["useAnimatedStyle", [0]], ["useAnimatedProps", [0]], ["createAnimatedPropAdapter", [0]], ["useDerivedValue", [0]], ["useAnimatedScrollHandler", [0]], ["useAnimatedReaction", [0, 1]], ["useWorkletCallback", [0]], ["withTiming", [2]], ["withSpring", [2]], ["withDecay", [1]], ["withRepeat", [3]], ["runOnUI", [0]], ["executeOnUIRuntimeSync", [0]] ]); var objectHooks = /* @__PURE__ */ new Set([ "useAnimatedGestureHandler", "useAnimatedScrollHandler" ]); function processIfAutoworkletizableCallback(path, state) { if ((0, gestureHandlerAutoworkletization_1.isGestureHandlerEventCallback)(path) || (0, layoutAnimationAutoworkletization_1.isLayoutAnimationCallback)(path)) { (0, workletSubstitution_12.processWorklet)(path, state); return true; } return false; } exports2.processIfAutoworkletizableCallback = processIfAutoworkletizableCallback; function processCalleesAutoworkletizableCallbacks(path, state) { const callee = (0, types_12.isSequenceExpression)(path.node.callee) ? path.node.callee.expressions[path.node.callee.expressions.length - 1] : path.node.callee; const name = "name" in callee ? callee.name : "property" in callee && "name" in callee.property ? callee.property.name : void 0; if (name === void 0) { return; } if (objectHooks.has(name)) { const maybeWorklet = path.get("arguments.0"); (0, assert_1.strict)(!Array.isArray(maybeWorklet), "[Reanimated] `workletToProcess` is an array."); if (maybeWorklet.isObjectExpression()) { processObjectHook(maybeWorklet, state); } else if (name === "useAnimatedScrollHandler") { if ((0, types_2.isWorkletizableFunctionType)(maybeWorklet)) { (0, workletSubstitution_12.processWorklet)(maybeWorklet, state); } } } else { const indices = functionArgsToWorkletize.get(name); if (indices === void 0) { return; } processArguments(path, indices, state); } } exports2.processCalleesAutoworkletizableCallbacks = processCalleesAutoworkletizableCallbacks; function processObjectHook(path, state) { const properties = path.get("properties"); for (const property of properties) { if (property.isObjectMethod()) { (0, workletSubstitution_12.processWorklet)(property, state); } else if (property.isObjectProperty()) { const value = property.get("value"); if ((0, types_2.isWorkletizableFunctionType)(value)) { (0, workletSubstitution_12.processWorklet)(value, state); } } else { throw new Error(`[Reanimated] '${property.type}' as to-be workletized argument is not supported for object hooks.`); } } } function processArguments(path, indices, state) { const argumentsArray = path.get("arguments"); indices.forEach((index) => { const maybeWorklet = argumentsArray[index]; if (!maybeWorklet) { return; } if ((0, types_2.isWorkletizableFunctionType)(maybeWorklet)) { (0, workletSubstitution_12.processWorklet)(maybeWorklet, state); } }); } } }); // lib/inlineStylesWarning.js var require_inlineStylesWarning = __commonJS({ "lib/inlineStylesWarning.js"(exports2) { "use strict"; Object.defineProperty(exports2, "__esModule", { value: true }); exports2.processInlineStylesWarning = void 0; var types_12 = require("@babel/types"); var utils_12 = require_utils(); var assert_1 = require("assert"); function generateInlineStylesWarning(path) { return (0, types_12.callExpression)((0, types_12.arrowFunctionExpression)([], (0, types_12.blockStatement)([ (0, types_12.expressionStatement)((0, types_12.callExpression)((0, types_12.memberExpression)((0, types_12.identifier)("console"), (0, types_12.identifier)("warn")), [ (0, types_12.callExpression)((0, types_12.memberExpression)((0, types_12.callExpression)((0, types_12.identifier)("require"), [ (0, types_12.stringLiteral)("react-native-reanimated") ]), (0, types_12.identifier)("getUseOfValueInStyleWarning")), []) ])), (0, types_12.returnStatement)(path.node) ])), []); } function processPropertyValueForInlineStylesWarning(path) { if (path.isMemberExpression() && (0, types_12.isIdentifier)(path.node.property)) { if (path.node.property.name === "value") { path.replaceWith(generateInlineStylesWarning(path)); } } } function processTransformPropertyForInlineStylesWarning(path) { if ((0, types_12.isArrayExpression)(path.node)) { const elements = path.get("elements"); (0, assert_1.strict)(Array.isArray(elements), "[Reanimated] `elements` should be an array."); for (const element of elements) { if (element.isObjectExpression()) { processStyleObjectForInlineStylesWarning(element); } } } } function processStyleObjectForInlineStylesWarning(path) { const properties = path.get("properties"); for (const property of properties) { if (property.isObjectProperty()) { const value = property.get("value"); if ((0, types_12.isIdentifier)(property.node.key) && property.node.key.name === "transform") { processTransformPropertyForInlineStylesWarning(value); } else { processPropertyValueForInlineStylesWarning(value); } } } } function processInlineStylesWarning(path, state) { if ((0, utils_12.isRelease)()) { return; } if (state.opts.disableInlineStylesWarning) { return; } if (path.node.name.name !== "style") { return; } if (!(0, types_12.isJSXExpressionContainer)(path.node.value)) { return; } const expression = path.get("value").get("expression"); (0, assert_1.strict)(!Array.isArray(expression), "[Reanimated] `expression` should not be an array."); if (expression.isArrayExpression()) { const elements = expression.get("elements"); (0, assert_1.strict)(Array.isArray(elements), "[Reanimated] `elements` should be an array."); for (const element of elements) { if (element.isObjectExpression()) { processStyleObjectForInlineStylesWarning(element); } } } else if (expression.isObjectExpression()) { processStyleObjectForInlineStylesWarning(expression); } } exports2.processInlineStylesWarning = processInlineStylesWarning; } }); // lib/webOptimization.js var require_webOptimization = __commonJS({ "lib/webOptimization.js"(exports2) { "use strict"; Object.defineProperty(exports2, "__esModule", { value: true }); exports2.substituteWebCallExpression = void 0; var types_12 = require("@babel/types"); function substituteWebCallExpression(path) { const callee = path.node.callee; if ((0, types_12.isIdentifier)(callee)) { const name = callee.name; if (name === "isWeb" || name === "shouldBeUseWeb") { path.replaceWith((0, types_12.booleanLiteral)(true)); } } } exports2.substituteWebCallExpression = substituteWebCallExpression; } }); // lib/plugin.js Object.defineProperty(exports, "__esModule", { value: true }); var autoworkletization_1 = require_autoworkletization(); var types_1 = require_types(); var workletSubstitution_1 = require_workletSubstitution(); var inlineStylesWarning_1 = require_inlineStylesWarning(); var utils_1 = require_utils(); var globals_1 = require_globals(); var webOptimization_1 = require_webOptimization(); module.exports = function() { function runWithTaggedExceptions(fun) { try { fun(); } catch (e) { throw new Error(`[Reanimated] Babel plugin exception: ${e}`); } } return { pre() { runWithTaggedExceptions(() => { (0, globals_1.initializeGlobals)(); utils_1.addCustomGlobals.call(this); }); }, visitor: { CallExpression: { enter(path, state) { runWithTaggedExceptions(() => { (0, autoworkletization_1.processCalleesAutoworkletizableCallbacks)(path, state); if (state.opts.substituteWebPlatformChecks) { (0, webOptimization_1.substituteWebCallExpression)(path); } }); } }, [types_1.WorkletizableFunction]: { enter(path, state) { runWithTaggedExceptions(() => { (0, workletSubstitution_1.processIfWithWorkletDirective)(path, state) || (0, autoworkletization_1.processIfAutoworkletizableCallback)(path, state); }); } }, JSXAttribute: { enter(path, state) { runWithTaggedExceptions(() => (0, inlineStylesWarning_1.processInlineStylesWarning)(path, state)); } } } }; }; //# sourceMappingURL=plugin.js.map