| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586 |
- /**
- * @license React
- * react-refresh-babel.production.js
- *
- * Copyright (c) Meta Platforms, Inc. and affiliates.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
- "use strict";
- module.exports = function (babel) {
- function createRegistration(programPath, persistentID) {
- var handle = programPath.scope.generateUidIdentifier("c");
- registrationsByProgramPath.has(programPath) ||
- registrationsByProgramPath.set(programPath, []);
- registrationsByProgramPath
- .get(programPath)
- .push({ handle: handle, persistentID: persistentID });
- return handle;
- }
- function isComponentishName(name) {
- return "string" === typeof name && "A" <= name[0] && "Z" >= name[0];
- }
- function findInnerComponents(inferredName, path, callback) {
- var node = path.node;
- switch (node.type) {
- case "Identifier":
- if (!isComponentishName(node.name)) break;
- callback(inferredName, node, null);
- return !0;
- case "FunctionDeclaration":
- return callback(inferredName, node.id, null), !0;
- case "ArrowFunctionExpression":
- if ("ArrowFunctionExpression" === node.body.type) break;
- callback(inferredName, node, path);
- return !0;
- case "FunctionExpression":
- return callback(inferredName, node, path), !0;
- case "CallExpression":
- var argsPath = path.get("arguments");
- if (void 0 === argsPath || 0 === argsPath.length) break;
- var calleePath = path.get("callee");
- switch (calleePath.node.type) {
- case "MemberExpression":
- case "Identifier":
- calleePath = calleePath.getSource();
- if (
- !findInnerComponents(
- inferredName + "$" + calleePath,
- argsPath[0],
- callback
- )
- )
- return !1;
- callback(inferredName, node, path);
- return !0;
- default:
- return !1;
- }
- case "VariableDeclarator":
- if (
- ((argsPath = node.init),
- null !== argsPath &&
- ((calleePath = node.id.name), isComponentishName(calleePath)))
- ) {
- switch (argsPath.type) {
- case "ArrowFunctionExpression":
- case "FunctionExpression":
- break;
- case "CallExpression":
- node = argsPath.callee;
- var calleeType = node.type;
- if (
- "Import" === calleeType ||
- ("Identifier" === calleeType &&
- (0 === node.name.indexOf("require") ||
- 0 === node.name.indexOf("import")))
- )
- return !1;
- break;
- case "TaggedTemplateExpression":
- break;
- default:
- return !1;
- }
- node = path.get("init");
- if (findInnerComponents(inferredName, node, callback)) return !0;
- calleePath = path.scope.getBinding(calleePath);
- if (void 0 === calleePath) return;
- path = !1;
- calleePath = calleePath.referencePaths;
- for (calleeType = 0; calleeType < calleePath.length; calleeType++) {
- var ref = calleePath[calleeType];
- if (
- !ref.node ||
- "JSXIdentifier" === ref.node.type ||
- "Identifier" === ref.node.type
- ) {
- ref = ref.parent;
- if ("JSXOpeningElement" === ref.type) path = !0;
- else if ("CallExpression" === ref.type) {
- ref = ref.callee;
- var fnName = void 0;
- switch (ref.type) {
- case "Identifier":
- fnName = ref.name;
- break;
- case "MemberExpression":
- fnName = ref.property.name;
- }
- switch (fnName) {
- case "createElement":
- case "jsx":
- case "jsxDEV":
- case "jsxs":
- path = !0;
- }
- }
- if (path) return callback(inferredName, argsPath, node), !0;
- }
- }
- }
- }
- return !1;
- }
- function getHookCallsSignature(functionNode) {
- functionNode = hookCalls.get(functionNode);
- return void 0 === functionNode
- ? null
- : {
- key: functionNode
- .map(function (call) {
- return call.name + "{" + call.key + "}";
- })
- .join("\n"),
- customHooks: functionNode
- .filter(function (call) {
- a: switch (call.name) {
- case "useState":
- case "React.useState":
- case "useReducer":
- case "React.useReducer":
- case "useEffect":
- case "React.useEffect":
- case "useLayoutEffect":
- case "React.useLayoutEffect":
- case "useMemo":
- case "React.useMemo":
- case "useCallback":
- case "React.useCallback":
- case "useRef":
- case "React.useRef":
- case "useContext":
- case "React.useContext":
- case "useImperativeHandle":
- case "React.useImperativeHandle":
- case "useDebugValue":
- case "React.useDebugValue":
- case "useId":
- case "React.useId":
- case "useDeferredValue":
- case "React.useDeferredValue":
- case "useTransition":
- case "React.useTransition":
- case "useInsertionEffect":
- case "React.useInsertionEffect":
- case "useSyncExternalStore":
- case "React.useSyncExternalStore":
- case "useFormStatus":
- case "React.useFormStatus":
- case "useFormState":
- case "React.useFormState":
- case "useActionState":
- case "React.useActionState":
- case "useOptimistic":
- case "React.useOptimistic":
- call = !0;
- break a;
- default:
- call = !1;
- }
- return !call;
- })
- .map(function (call) {
- return t.cloneDeep(call.callee);
- })
- };
- }
- function hasForceResetComment(path) {
- path = path.hub.file;
- var hasForceReset = hasForceResetCommentByFile.get(path);
- if (void 0 !== hasForceReset) return hasForceReset;
- hasForceReset = !1;
- for (var comments = path.ast.comments, i = 0; i < comments.length; i++)
- if (-1 !== comments[i].value.indexOf("@refresh reset")) {
- hasForceReset = !0;
- break;
- }
- hasForceResetCommentByFile.set(path, hasForceReset);
- return hasForceReset;
- }
- function createArgumentsForSignature(node, signature, scope) {
- var key = signature.key;
- signature = signature.customHooks;
- var forceReset = hasForceResetComment(scope.path),
- customHooksInScope = [];
- signature.forEach(function (callee) {
- switch (callee.type) {
- case "MemberExpression":
- if ("Identifier" === callee.object.type)
- var bindingName = callee.object.name;
- break;
- case "Identifier":
- bindingName = callee.name;
- }
- scope.hasBinding(bindingName)
- ? customHooksInScope.push(callee)
- : (forceReset = !0);
- });
- signature = key;
- "function" !== typeof require ||
- opts.emitFullSignatures ||
- (signature = require("crypto")
- .createHash("sha1")
- .update(key)
- .digest("base64"));
- node = [node, t.stringLiteral(signature)];
- (forceReset || 0 < customHooksInScope.length) &&
- node.push(t.booleanLiteral(forceReset));
- 0 < customHooksInScope.length &&
- node.push(
- t.functionExpression(
- null,
- [],
- t.blockStatement([
- t.returnStatement(t.arrayExpression(customHooksInScope))
- ])
- )
- );
- return node;
- }
- function findHOCCallPathsAbove(path) {
- for (var calls = []; ; ) {
- if (!path) return calls;
- var parentPath = path.parentPath;
- if (!parentPath) return calls;
- if (
- "AssignmentExpression" === parentPath.node.type &&
- path.node === parentPath.node.right
- )
- path = parentPath;
- else if (
- "CallExpression" === parentPath.node.type &&
- path.node !== parentPath.node.callee
- )
- calls.push(parentPath), (path = parentPath);
- else return calls;
- }
- }
- var opts =
- 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {};
- if ("function" === typeof babel.env) {
- var env = babel.env();
- if ("development" !== env && !opts.skipEnvCheck)
- throw Error(
- 'React Refresh Babel transform should only be enabled in development environment. Instead, the environment is: "' +
- env +
- '". If you want to override this check, pass {skipEnvCheck: true} as plugin options.'
- );
- }
- var t = babel.types,
- refreshReg = t.identifier(opts.refreshReg || "$RefreshReg$"),
- refreshSig = t.identifier(opts.refreshSig || "$RefreshSig$"),
- registrationsByProgramPath = new Map(),
- hasForceResetCommentByFile = new WeakMap(),
- seenForRegistration = new WeakSet(),
- seenForSignature = new WeakSet(),
- seenForOutro = new WeakSet(),
- hookCalls = new WeakMap(),
- HookCallsVisitor = {
- CallExpression: function (path) {
- var callee = path.node.callee,
- name = null;
- switch (callee.type) {
- case "Identifier":
- name = callee.name;
- break;
- case "MemberExpression":
- name = callee.property.name;
- }
- if (
- null !== name &&
- /^use[A-Z]/.test(name) &&
- ((callee = path.scope.getFunctionParent()), null !== callee)
- ) {
- callee = callee.block;
- hookCalls.has(callee) || hookCalls.set(callee, []);
- callee = hookCalls.get(callee);
- var key = "";
- "VariableDeclarator" === path.parent.type &&
- (key = path.parentPath.get("id").getSource());
- var args = path.get("arguments");
- "useState" === name && 0 < args.length
- ? (key += "(" + args[0].getSource() + ")")
- : "useReducer" === name &&
- 1 < args.length &&
- (key += "(" + args[1].getSource() + ")");
- callee.push({ callee: path.node.callee, name: name, key: key });
- }
- }
- };
- return {
- visitor: {
- ExportDefaultDeclaration: function (path) {
- var node = path.node,
- decl = node.declaration,
- declPath = path.get("declaration");
- if ("CallExpression" === decl.type && !seenForRegistration.has(node)) {
- seenForRegistration.add(node);
- var programPath = path.parentPath;
- findInnerComponents(
- "%default%",
- declPath,
- function (persistentID, targetExpr, targetPath) {
- null !== targetPath &&
- ((persistentID = createRegistration(programPath, persistentID)),
- targetPath.replaceWith(
- t.assignmentExpression("=", persistentID, targetExpr)
- ));
- }
- );
- }
- },
- FunctionDeclaration: {
- enter: function (path) {
- var node = path.node,
- modulePrefix = "";
- switch (path.parent.type) {
- case "Program":
- var insertAfterPath = path;
- var programPath = path.parentPath;
- break;
- case "TSModuleBlock":
- insertAfterPath = path;
- programPath = insertAfterPath.parentPath.parentPath;
- break;
- case "ExportNamedDeclaration":
- insertAfterPath = path.parentPath;
- programPath = insertAfterPath.parentPath;
- break;
- case "ExportDefaultDeclaration":
- insertAfterPath = path.parentPath;
- programPath = insertAfterPath.parentPath;
- break;
- default:
- return;
- }
- if (
- "TSModuleBlock" === path.parent.type ||
- "ExportNamedDeclaration" === path.parent.type
- )
- for (; "Program" !== programPath.type; ) {
- if ("TSModuleDeclaration" === programPath.type) {
- if (
- "Program" !== programPath.parentPath.type &&
- "ExportNamedDeclaration" !== programPath.parentPath.type
- )
- return;
- modulePrefix = programPath.node.id.name + "$" + modulePrefix;
- }
- programPath = programPath.parentPath;
- }
- var id = node.id;
- null !== id &&
- ((id = id.name),
- isComponentishName(id) &&
- !seenForRegistration.has(node) &&
- (seenForRegistration.add(node),
- findInnerComponents(
- modulePrefix + id,
- path,
- function (persistentID, targetExpr) {
- persistentID = createRegistration(programPath, persistentID);
- insertAfterPath.insertAfter(
- t.expressionStatement(
- t.assignmentExpression("=", persistentID, targetExpr)
- )
- );
- }
- )));
- },
- exit: function (path) {
- var node = path.node,
- id = node.id;
- if (null !== id) {
- var signature = getHookCallsSignature(node);
- if (null !== signature && !seenForSignature.has(node)) {
- seenForSignature.add(node);
- node = path.scope.generateUidIdentifier("_s");
- path.scope.parent.push({
- id: node,
- init: t.callExpression(refreshSig, [])
- });
- path
- .get("body")
- .unshiftContainer(
- "body",
- t.expressionStatement(t.callExpression(node, []))
- );
- var insertAfterPath = null;
- path.find(function (p) {
- if (p.parentPath.isBlock()) return (insertAfterPath = p), !0;
- });
- null !== insertAfterPath &&
- insertAfterPath.insertAfter(
- t.expressionStatement(
- t.callExpression(
- node,
- createArgumentsForSignature(
- id,
- signature,
- insertAfterPath.scope
- )
- )
- )
- );
- }
- }
- }
- },
- "ArrowFunctionExpression|FunctionExpression": {
- exit: function (path) {
- var node = path.node,
- signature = getHookCallsSignature(node);
- if (null !== signature && !seenForSignature.has(node)) {
- seenForSignature.add(node);
- var sigCallID = path.scope.generateUidIdentifier("_s");
- path.scope.parent.push({
- id: sigCallID,
- init: t.callExpression(refreshSig, [])
- });
- "BlockStatement" !== path.node.body.type &&
- (path.node.body = t.blockStatement([
- t.returnStatement(path.node.body)
- ]));
- path
- .get("body")
- .unshiftContainer(
- "body",
- t.expressionStatement(t.callExpression(sigCallID, []))
- );
- if ("VariableDeclarator" === path.parent.type) {
- var insertAfterPath = null;
- path.find(function (p) {
- if (p.parentPath.isBlock()) return (insertAfterPath = p), !0;
- });
- null !== insertAfterPath &&
- insertAfterPath.insertAfter(
- t.expressionStatement(
- t.callExpression(
- sigCallID,
- createArgumentsForSignature(
- path.parent.id,
- signature,
- insertAfterPath.scope
- )
- )
- )
- );
- } else
- [path].concat(findHOCCallPathsAbove(path)).forEach(function (p) {
- p.replaceWith(
- t.callExpression(
- sigCallID,
- createArgumentsForSignature(p.node, signature, p.scope)
- )
- );
- });
- }
- }
- },
- VariableDeclaration: function (path) {
- var node = path.node,
- modulePrefix = "";
- switch (path.parent.type) {
- case "Program":
- var insertAfterPath = path;
- var programPath = path.parentPath;
- break;
- case "TSModuleBlock":
- insertAfterPath = path;
- programPath = insertAfterPath.parentPath.parentPath;
- break;
- case "ExportNamedDeclaration":
- insertAfterPath = path.parentPath;
- programPath = insertAfterPath.parentPath;
- break;
- case "ExportDefaultDeclaration":
- insertAfterPath = path.parentPath;
- programPath = insertAfterPath.parentPath;
- break;
- default:
- return;
- }
- if (
- "TSModuleBlock" === path.parent.type ||
- "ExportNamedDeclaration" === path.parent.type
- )
- for (; "Program" !== programPath.type; ) {
- if ("TSModuleDeclaration" === programPath.type) {
- if (
- "Program" !== programPath.parentPath.type &&
- "ExportNamedDeclaration" !== programPath.parentPath.type
- )
- return;
- modulePrefix = programPath.node.id.name + "$" + modulePrefix;
- }
- programPath = programPath.parentPath;
- }
- if (
- !seenForRegistration.has(node) &&
- (seenForRegistration.add(node),
- (path = path.get("declarations")),
- 1 === path.length)
- ) {
- var declPath = path[0];
- findInnerComponents(
- modulePrefix + declPath.node.id.name,
- declPath,
- function (persistentID, targetExpr, targetPath) {
- null !== targetPath &&
- ((persistentID = createRegistration(programPath, persistentID)),
- "VariableDeclarator" === targetPath.parent.type
- ? insertAfterPath.insertAfter(
- t.expressionStatement(
- t.assignmentExpression(
- "=",
- persistentID,
- declPath.node.id
- )
- )
- )
- : targetPath.replaceWith(
- t.assignmentExpression("=", persistentID, targetExpr)
- ));
- }
- );
- }
- },
- Program: {
- enter: function (path) {
- path.traverse(HookCallsVisitor);
- },
- exit: function (path) {
- var registrations = registrationsByProgramPath.get(path);
- if (void 0 !== registrations) {
- var node = path.node;
- if (!seenForOutro.has(node)) {
- seenForOutro.add(node);
- registrationsByProgramPath.delete(path);
- var declarators = [];
- path.pushContainer(
- "body",
- t.variableDeclaration("var", declarators)
- );
- registrations.forEach(function (_ref) {
- var handle = _ref.handle;
- path.pushContainer(
- "body",
- t.expressionStatement(
- t.callExpression(refreshReg, [
- handle,
- t.stringLiteral(_ref.persistentID)
- ])
- )
- );
- declarators.push(t.variableDeclarator(handle));
- });
- }
- }
- }
- }
- }
- };
- };
|