@ssgoi/react
Version:
React bindings for SSGOI - Native app-like page transitions for React applications
117 lines (116 loc) • 3.53 kB
JavaScript
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
};