vtjump
Version:
A vite plugin for vtjump
303 lines (302 loc) • 10.1 kB
JavaScript
import R from "magic-string";
import V from "child_process";
import { parse as L, compileTemplate as J } from "@vue/compiler-sfc";
const C = /* @__PURE__ */ new Map();
let P = 0;
function h(o, t) {
const s = `vtj-${++P}`;
return C.set(s, {
file: o,
startLine: t,
endLine: t
}), { id: s, line: t };
}
/**
* @vue/shared v3.5.13
* (c) 2018-present Yuxi (Evan) You and Vue contributors
* @license MIT
**/
process.env.NODE_ENV !== "production" && Object.freeze({});
process.env.NODE_ENV !== "production" && Object.freeze([]);
const T = () => !1;
/**
* @vue/compiler-core v3.5.13
* (c) 2018-present Yuxi (Evan) You and Vue contributors
* @license MIT
**/
Symbol(process.env.NODE_ENV !== "production" ? "Fragment" : "");
Symbol(process.env.NODE_ENV !== "production" ? "Teleport" : "");
Symbol(process.env.NODE_ENV !== "production" ? "Suspense" : "");
Symbol(process.env.NODE_ENV !== "production" ? "KeepAlive" : "");
Symbol(
process.env.NODE_ENV !== "production" ? "BaseTransition" : ""
);
Symbol(process.env.NODE_ENV !== "production" ? "openBlock" : "");
Symbol(process.env.NODE_ENV !== "production" ? "createBlock" : "");
Symbol(
process.env.NODE_ENV !== "production" ? "createElementBlock" : ""
);
Symbol(process.env.NODE_ENV !== "production" ? "createVNode" : "");
Symbol(
process.env.NODE_ENV !== "production" ? "createElementVNode" : ""
);
Symbol(
process.env.NODE_ENV !== "production" ? "createCommentVNode" : ""
);
Symbol(
process.env.NODE_ENV !== "production" ? "createTextVNode" : ""
);
Symbol(
process.env.NODE_ENV !== "production" ? "createStaticVNode" : ""
);
Symbol(
process.env.NODE_ENV !== "production" ? "resolveComponent" : ""
);
Symbol(
process.env.NODE_ENV !== "production" ? "resolveDynamicComponent" : ""
);
Symbol(
process.env.NODE_ENV !== "production" ? "resolveDirective" : ""
);
Symbol(
process.env.NODE_ENV !== "production" ? "resolveFilter" : ""
);
Symbol(
process.env.NODE_ENV !== "production" ? "withDirectives" : ""
);
Symbol(process.env.NODE_ENV !== "production" ? "renderList" : "");
Symbol(process.env.NODE_ENV !== "production" ? "renderSlot" : "");
Symbol(process.env.NODE_ENV !== "production" ? "createSlots" : "");
Symbol(
process.env.NODE_ENV !== "production" ? "toDisplayString" : ""
);
Symbol(process.env.NODE_ENV !== "production" ? "mergeProps" : "");
Symbol(
process.env.NODE_ENV !== "production" ? "normalizeClass" : ""
);
Symbol(
process.env.NODE_ENV !== "production" ? "normalizeStyle" : ""
);
Symbol(
process.env.NODE_ENV !== "production" ? "normalizeProps" : ""
);
Symbol(
process.env.NODE_ENV !== "production" ? "guardReactiveProps" : ""
);
Symbol(process.env.NODE_ENV !== "production" ? "toHandlers" : "");
Symbol(process.env.NODE_ENV !== "production" ? "camelize" : "");
Symbol(process.env.NODE_ENV !== "production" ? "capitalize" : "");
Symbol(
process.env.NODE_ENV !== "production" ? "toHandlerKey" : ""
);
Symbol(
process.env.NODE_ENV !== "production" ? "setBlockTracking" : ""
);
Symbol(process.env.NODE_ENV !== "production" ? "pushScopeId" : "");
Symbol(process.env.NODE_ENV !== "production" ? "popScopeId" : "");
Symbol(process.env.NODE_ENV !== "production" ? "withCtx" : "");
Symbol(process.env.NODE_ENV !== "production" ? "unref" : "");
Symbol(process.env.NODE_ENV !== "production" ? "isRef" : "");
Symbol(process.env.NODE_ENV !== "production" ? "withMemo" : "");
Symbol(process.env.NODE_ENV !== "production" ? "isMemoSame" : "");
const g = {
ROOT: 0,
0: "ROOT",
ELEMENT: 1,
1: "ELEMENT",
TEXT: 2,
2: "TEXT",
COMMENT: 3,
3: "COMMENT",
SIMPLE_EXPRESSION: 4,
4: "SIMPLE_EXPRESSION",
INTERPOLATION: 5,
5: "INTERPOLATION",
ATTRIBUTE: 6,
6: "ATTRIBUTE",
DIRECTIVE: 7,
7: "DIRECTIVE",
COMPOUND_EXPRESSION: 8,
8: "COMPOUND_EXPRESSION",
IF: 9,
9: "IF",
IF_BRANCH: 10,
10: "IF_BRANCH",
FOR: 11,
11: "FOR",
TEXT_CALL: 12,
12: "TEXT_CALL",
VNODE_CALL: 13,
13: "VNODE_CALL",
JS_CALL_EXPRESSION: 14,
14: "JS_CALL_EXPRESSION",
JS_OBJECT_EXPRESSION: 15,
15: "JS_OBJECT_EXPRESSION",
JS_PROPERTY: 16,
16: "JS_PROPERTY",
JS_ARRAY_EXPRESSION: 17,
17: "JS_ARRAY_EXPRESSION",
JS_FUNCTION_EXPRESSION: 18,
18: "JS_FUNCTION_EXPRESSION",
JS_CONDITIONAL_EXPRESSION: 19,
19: "JS_CONDITIONAL_EXPRESSION",
JS_CACHE_EXPRESSION: 20,
20: "JS_CACHE_EXPRESSION",
JS_BLOCK_STATEMENT: 21,
21: "JS_BLOCK_STATEMENT",
JS_TEMPLATE_LITERAL: 22,
22: "JS_TEMPLATE_LITERAL",
JS_IF_STATEMENT: 23,
23: "JS_IF_STATEMENT",
JS_ASSIGNMENT_EXPRESSION: 24,
24: "JS_ASSIGNMENT_EXPRESSION",
JS_SEQUENCE_EXPRESSION: 25,
25: "JS_SEQUENCE_EXPRESSION",
JS_RETURN_STATEMENT: 26,
26: "JS_RETURN_STATEMENT"
};
function M(o) {
throw o;
}
function w(o) {
process.env.NODE_ENV !== "production" && console.warn(`[Vue warn] ${o.message}`);
}
process.env.NODE_ENV;
new RegExp(
"\\b" + "arguments,await,break,case,catch,class,const,continue,debugger,default,delete,do,else,export,extends,finally,for,function,if,import,let,new,return,super,switch,throw,try,var,void,while,with,yield".split(",").join("\\b|\\b") + "\\b"
);
function $(o) {
return /\bdata-vtjump(?:=|\s|$)|\bdata-vtjump-line(?:=|\s|$)|\bdata-vtjump-file(?:=|\s|$)/.test(
o
);
}
function j(o) {
let t = !1, s = !1;
for (let n = 0; n < o.length; n++) {
const e = o[n];
if (e === "'" && !s)
t = !t;
else if (e === '"' && !t)
s = !s;
else if (e === ">" && !t && !s)
return n;
}
return -1;
}
function X(o, t) {
if (!t.endsWith(".vue")) return null;
const { descriptor: s } = L(o);
if (!s.template) return null;
const n = new R(o), e = s.template.content, O = s.template.loc.start.offset, S = /* @__PURE__ */ new Set(), l = (i) => {
if (i.type === g.ELEMENT) {
const r = i, u = `${r.loc.start.offset}-${r.loc.end.offset}`;
if (S.has(u))
return;
const a = O + r.loc.start.offset, v = O + r.loc.end.offset, _ = o.slice(0, a).split(`
`).length, c = o.slice(a, v), p = j(c);
if (p !== -1) {
const E = c.slice(0, p + 1), N = /^<([a-zA-Z][\w-]*)(?:\s+([\s\S]*?))?(?:\/)?>/i.exec(E);
if (N) {
const [, , m = ""] = N;
if (!$(m)) {
const { id: I, line: f } = h(t, _), A = ` data-vtjump="${I}" data-vtjump-line="${f}" data-vtjump-file="${t}"`;
let b = a + p;
const D = c[p - 1];
D && D === "/" && (b = a + p - 1), n.appendLeft(b, A), S.add(u);
}
}
}
r.children && r.children.forEach((E) => {
E.type === g.ELEMENT && l(E);
});
}
}, d = J({
source: e,
filename: t,
id: t,
compilerOptions: {
nodeTransforms: [l]
}
});
return d.errors && d.errors.length ? (console.error(d.errors), null) : n.hasChanged() ? {
code: n.toString(),
map: n.generateMap()
} : null;
}
const B = (o = {}) => {
let t;
return {
name: "vite:vtjump",
configureServer(s) {
t = s, t.middlewares.use(async (n, e, O) => {
if (n.url === "/__vtjump") {
if (e.setHeader("Access-Control-Allow-Origin", "*"), e.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS"), e.setHeader("Access-Control-Allow-Headers", "Content-Type"), n.method === "GET" || n.method === "OPTIONS") {
e.setHeader("Content-Type", "application/json"), e.end("__vtjump");
return;
}
const S = [];
n.on("data", (l) => S.push(l)), n.on("end", () => {
const l = JSON.parse(Buffer.concat(S).toString()), { getConfig: d } = l;
let { protocols: i, jumpEndpoints: r } = o;
if (i || (i = ["cursor", "cursor"]), i.length === 1 && (i = [i[0], i[0]]), r || (r = ["vite", "vite"]), r.length === 1 && (r = [r[0], r[0]]), d) {
e.setHeader("Content-Type", "application/json"), e.end(
JSON.stringify({
protocols: i,
jumpEndpoints: r,
workingDir: process.cwd(),
assets: o.assets || "/node_modules/vtjump/dist/client/vtjump.js"
})
);
return;
}
function u(c, p) {
const E = i[0] || "cursor";
if (r[0] === "browser")
e.setHeader("Content-Type", "application/json"), e.end(JSON.stringify({ url: `${E}://file/${c}` }));
else if (r[0] === "vite") {
let N = "";
process.platform === "win32" ? N = `start ${`${E}://file/${c}:${p}`}` : E === "vscode" ? N = `code -g "${c}:${p}"` : N = `${E} -g "${c}:${p}"`, V.exec(N, (m) => {
if (m) {
console.warn("Failed to open URL with system command:", m);
const I = process.platform === "win32" ? `${E} "${c}:${p}"` : `${E} "${c}"`;
V.exec(I, (f) => {
f ? (console.error("Failed to open with protocol command:", f), e.statusCode = 500, e.end(JSON.stringify({ error: "Failed to open file" }))) : e.end(JSON.stringify({ success: !0 }));
});
} else
e.end(JSON.stringify({ success: !0 }));
});
}
}
const { id: a, getInfo: v, path: y, line: _ } = l;
if (a) {
const c = C.get(a);
if (!c) {
e.statusCode = 404, e.end(JSON.stringify({ error: "Location not found" }));
return;
}
v ? (e.setHeader("Content-Type", "application/json"), e.end(JSON.stringify({ location: c }))) : u(c.file, c.startLine.toString());
} else y && _ && u(y, _);
});
return;
}
O();
});
},
transform(s, n) {
return X(s, n);
}
};
}, U = (o = {}) => {
const t = B(o);
return t.transformIndexHtml = (s) => {
const n = new R(s), e = s.match(/<\/body>/i);
return e && n.appendLeft(e.index, `<script type="module" src="${o.assets}"><\/script>
</body>`), {
html: n.toString(),
tags: []
};
}, t;
};
export {
U as default
};