UNPKG

@ssgoi/react

Version:

React bindings for SSGOI - Native app-like page transitions for React applications

117 lines (116 loc) 3.53 kB
import { createUnplugin as b } from "unplugin"; import { transformSync as S } from "@babel/core"; const j = { include: [".tsx", ".jsx"], exclude: [/node_modules/] }; function P() { return function({ types: e }) { return { name: "babel-plugin-ssgoi-auto-key", visitor: { CallExpression(r, l) { const n = r.node.callee; if (!e.isIdentifier(n) || n.name !== "transition" || r.node._ssgoiProcessed) return; r.node._ssgoiProcessed = !0; const a = r.node.arguments; if (a.length === 0) return; const s = a[0]; if (e.isObjectExpression(s) && s.properties.length >= 2 && e.isSpreadElement(s.properties[0]) && e.isObjectProperty( s.properties[s.properties.length - 1] ) && e.isIdentifier( s.properties[s.properties.length - 1].key ) && s.properties[s.properties.length - 1].key.name === "key") return; const m = l.filename || "unknown", x = m.split("/").pop() || m, d = r.node.loc, E = d?.start?.line ?? 0, k = d?.start?.column ?? 0, c = `${x}:${E}:${k}`; let u = null; const p = r.findParent( (i) => i.isJSXElement() || i.isJSXFragment() ); if (p && e.isJSXElement(p.node)) { const i = p.node.openingElement.attributes.find( (t) => e.isJSXAttribute(t) && e.isJSXIdentifier(t.name) && t.name.name === "key" ); i && (e.isJSXExpressionContainer(i.value) ? e.isJSXEmptyExpression(i.value.expression) || (u = i.value.expression) : e.isStringLiteral(i.value) && (u = i.value)); } let f; u ? f = e.templateLiteral( [ e.templateElement({ raw: `${c}:`, cooked: `${c}:` }), e.templateElement({ raw: "", cooked: "" }, !0) ], [u] ) : f = e.stringLiteral(c); const g = e.objectProperty(e.identifier("key"), f); if (e.isObjectExpression(s)) { if (s.properties.some( (t) => e.isObjectProperty(t) && e.isIdentifier(t.key) && t.key.name === "key" )) return; s.properties.push(g); } else e.isExpression(s) && !e.isSpreadElement(s) && (a[0] = e.objectExpression([ e.spreadElement(s), g ])); } } }; }; } function y(o, e) { return e.include.some((n) => o.endsWith(n)) ? !e.exclude.some((n) => typeof n == "string" ? o.includes(n) : n.test(o)) : !1; } const h = (o) => { const e = { ...j, ...o }; return { name: "unplugin-ssgoi-auto-key", enforce: "pre", transformInclude(r) { return y(r, e); }, transform(r, l) { if (!y(l, e)) return null; try { const n = S(r, { filename: l, plugins: [P()], parserOpts: { plugins: ["jsx", "typescript"] }, generatorOpts: { retainLines: !0 }, sourceMaps: !0, configFile: !1, babelrc: !1 }); if (n && n.code) return { code: n.code, map: n.map }; } catch (n) { console.error( `[unplugin-ssgoi-auto-key] Error transforming ${l}:`, n ); } return null; } }; }, X = /* @__PURE__ */ b(h); export { X as default, X as unplugin };