sveltekit-remote-fn-plugin
Version:
A Vite plugin for SvelteKit remote functions
433 lines (430 loc) • 12.9 kB
JavaScript
function O(n) {
return n && n.__esModule && Object.prototype.hasOwnProperty.call(n, "default") ? n.default : n;
}
var $ = { exports: {} }, c = $.exports = {}, g, h;
function k() {
throw new Error("setTimeout has not been defined");
}
function F() {
throw new Error("clearTimeout has not been defined");
}
(function() {
try {
typeof setTimeout == "function" ? g = setTimeout : g = k;
} catch {
g = k;
}
try {
typeof clearTimeout == "function" ? h = clearTimeout : h = F;
} catch {
h = F;
}
})();
function L(n) {
if (g === setTimeout)
return setTimeout(n, 0);
if ((g === k || !g) && setTimeout)
return g = setTimeout, setTimeout(n, 0);
try {
return g(n, 0);
} catch {
try {
return g.call(null, n, 0);
} catch {
return g.call(this, n, 0);
}
}
}
function U(n) {
if (h === clearTimeout)
return clearTimeout(n);
if ((h === F || !h) && clearTimeout)
return h = clearTimeout, clearTimeout(n);
try {
return h(n);
} catch {
try {
return h.call(null, n);
} catch {
return h.call(this, n);
}
}
}
var y = [], C = !1, b, P = -1;
function q() {
!C || !b || (C = !1, b.length ? y = b.concat(y) : P = -1, y.length && W());
}
function W() {
if (!C) {
var n = L(q);
C = !0;
for (var e = y.length; e; ) {
for (b = y, y = []; ++P < e; )
b && b[P].run();
P = -1, e = y.length;
}
b = null, C = !1, U(n);
}
}
c.nextTick = function(n) {
var e = new Array(arguments.length - 1);
if (arguments.length > 1)
for (var r = 1; r < arguments.length; r++)
e[r - 1] = arguments[r];
y.push(new x(n, e)), y.length === 1 && !C && L(W);
};
function x(n, e) {
this.fun = n, this.array = e;
}
x.prototype.run = function() {
this.fun.apply(null, this.array);
};
c.title = "browser";
c.browser = !0;
c.env = {};
c.argv = [];
c.version = "";
c.versions = {};
function w() {
}
c.on = w;
c.addListener = w;
c.once = w;
c.off = w;
c.removeListener = w;
c.removeAllListeners = w;
c.emit = w;
c.prependListener = w;
c.prependOnceListener = w;
c.listeners = function(n) {
return [];
};
c.binding = function(n) {
throw new Error("process.binding is not supported");
};
c.cwd = function() {
return "/";
};
c.chdir = function(n) {
throw new Error("process.chdir is not supported");
};
c.umask = function() {
return 0;
};
var z = $.exports;
const H = /* @__PURE__ */ O(z);
function d(n) {
if (typeof n != "string")
throw new TypeError("Path must be a string. Received " + JSON.stringify(n));
}
function R(n, e) {
for (var r = "", t = 0, i = -1, s = 0, o, a = 0; a <= n.length; ++a) {
if (a < n.length)
o = n.charCodeAt(a);
else {
if (o === 47)
break;
o = 47;
}
if (o === 47) {
if (!(i === a - 1 || s === 1))
if (i !== a - 1 && s === 2) {
if (r.length < 2 || t !== 2 || r.charCodeAt(r.length - 1) !== 46 || r.charCodeAt(r.length - 2) !== 46) {
if (r.length > 2) {
var l = r.lastIndexOf("/");
if (l !== r.length - 1) {
l === -1 ? (r = "", t = 0) : (r = r.slice(0, l), t = r.length - 1 - r.lastIndexOf("/")), i = a, s = 0;
continue;
}
} else if (r.length === 2 || r.length === 1) {
r = "", t = 0, i = a, s = 0;
continue;
}
}
e && (r.length > 0 ? r += "/.." : r = "..", t = 2);
} else
r.length > 0 ? r += "/" + n.slice(i + 1, a) : r = n.slice(i + 1, a), t = a - i - 1;
i = a, s = 0;
} else
o === 46 && s !== -1 ? ++s : s = -1;
}
return r;
}
function B(n, e) {
var r = e.dir || e.root, t = e.base || (e.name || "") + (e.ext || "");
return r ? r === e.root ? r + t : r + n + t : t;
}
var T = {
// path.resolve([from ...], to)
resolve: function() {
for (var e = "", r = !1, t, i = arguments.length - 1; i >= -1 && !r; i--) {
var s;
i >= 0 ? s = arguments[i] : (t === void 0 && (t = H.cwd()), s = t), d(s), s.length !== 0 && (e = s + "/" + e, r = s.charCodeAt(0) === 47);
}
return e = R(e, !r), r ? e.length > 0 ? "/" + e : "/" : e.length > 0 ? e : ".";
},
normalize: function(e) {
if (d(e), e.length === 0)
return ".";
var r = e.charCodeAt(0) === 47, t = e.charCodeAt(e.length - 1) === 47;
return e = R(e, !r), e.length === 0 && !r && (e = "."), e.length > 0 && t && (e += "/"), r ? "/" + e : e;
},
isAbsolute: function(e) {
return d(e), e.length > 0 && e.charCodeAt(0) === 47;
},
join: function() {
if (arguments.length === 0)
return ".";
for (var e, r = 0; r < arguments.length; ++r) {
var t = arguments[r];
d(t), t.length > 0 && (e === void 0 ? e = t : e += "/" + t);
}
return e === void 0 ? "." : T.normalize(e);
},
relative: function(e, r) {
if (d(e), d(r), e === r || (e = T.resolve(e), r = T.resolve(r), e === r))
return "";
for (var t = 1; t < e.length && e.charCodeAt(t) === 47; ++t)
;
for (var i = e.length, s = i - t, o = 1; o < r.length && r.charCodeAt(o) === 47; ++o)
;
for (var a = r.length, l = a - o, v = s < l ? s : l, f = -1, u = 0; u <= v; ++u) {
if (u === v) {
if (l > v) {
if (r.charCodeAt(o + u) === 47)
return r.slice(o + u + 1);
if (u === 0)
return r.slice(o + u);
} else
s > v && (e.charCodeAt(t + u) === 47 ? f = u : u === 0 && (f = 0));
break;
}
var E = e.charCodeAt(t + u), _ = r.charCodeAt(o + u);
if (E !== _)
break;
E === 47 && (f = u);
}
var p = "";
for (u = t + f + 1; u <= i; ++u)
(u === i || e.charCodeAt(u) === 47) && (p.length === 0 ? p += ".." : p += "/..");
return p.length > 0 ? p + r.slice(o + f) : (o += f, r.charCodeAt(o) === 47 && ++o, r.slice(o));
},
_makeLong: function(e) {
return e;
},
dirname: function(e) {
if (d(e), e.length === 0)
return ".";
for (var r = e.charCodeAt(0), t = r === 47, i = -1, s = !0, o = e.length - 1; o >= 1; --o)
if (r = e.charCodeAt(o), r === 47) {
if (!s) {
i = o;
break;
}
} else
s = !1;
return i === -1 ? t ? "/" : "." : t && i === 1 ? "//" : e.slice(0, i);
},
basename: function(e, r) {
if (r !== void 0 && typeof r != "string")
throw new TypeError('"ext" argument must be a string');
d(e);
var t = 0, i = -1, s = !0, o;
if (r !== void 0 && r.length > 0 && r.length <= e.length) {
if (r.length === e.length && r === e)
return "";
var a = r.length - 1, l = -1;
for (o = e.length - 1; o >= 0; --o) {
var v = e.charCodeAt(o);
if (v === 47) {
if (!s) {
t = o + 1;
break;
}
} else
l === -1 && (s = !1, l = o + 1), a >= 0 && (v === r.charCodeAt(a) ? --a === -1 && (i = o) : (a = -1, i = l));
}
return t === i ? i = l : i === -1 && (i = e.length), e.slice(t, i);
} else {
for (o = e.length - 1; o >= 0; --o)
if (e.charCodeAt(o) === 47) {
if (!s) {
t = o + 1;
break;
}
} else
i === -1 && (s = !1, i = o + 1);
return i === -1 ? "" : e.slice(t, i);
}
},
extname: function(e) {
d(e);
for (var r = -1, t = 0, i = -1, s = !0, o = 0, a = e.length - 1; a >= 0; --a) {
var l = e.charCodeAt(a);
if (l === 47) {
if (!s) {
t = a + 1;
break;
}
continue;
}
i === -1 && (s = !1, i = a + 1), l === 46 ? r === -1 ? r = a : o !== 1 && (o = 1) : r !== -1 && (o = -1);
}
return r === -1 || i === -1 || // We saw a non-dot character immediately before the dot
o === 0 || // The (right-most) trimmed path component is exactly '..'
o === 1 && r === i - 1 && r === t + 1 ? "" : e.slice(r, i);
},
format: function(e) {
if (e === null || typeof e != "object")
throw new TypeError('The "pathObject" argument must be of type Object. Received type ' + typeof e);
return B("/", e);
},
parse: function(e) {
d(e);
var r = { root: "", dir: "", base: "", ext: "", name: "" };
if (e.length === 0)
return r;
var t = e.charCodeAt(0), i = t === 47, s;
i ? (r.root = "/", s = 1) : s = 0;
for (var o = -1, a = 0, l = -1, v = !0, f = e.length - 1, u = 0; f >= s; --f) {
if (t = e.charCodeAt(f), t === 47) {
if (!v) {
a = f + 1;
break;
}
continue;
}
l === -1 && (v = !1, l = f + 1), t === 46 ? o === -1 ? o = f : u !== 1 && (u = 1) : o !== -1 && (u = -1);
}
return o === -1 || l === -1 || // We saw a non-dot character immediately before the dot
u === 0 || // The (right-most) trimmed path component is exactly '..'
u === 1 && o === l - 1 && o === a + 1 ? l !== -1 && (a === 0 && i ? r.base = r.name = e.slice(1, l) : r.base = r.name = e.slice(a, l)) : (a === 0 && i ? (r.name = e.slice(1, o), r.base = e.slice(1, l)) : (r.name = e.slice(a, o), r.base = e.slice(a, l)), r.ext = e.slice(o, l)), a > 0 ? r.dir = e.slice(0, a - 1) : i && (r.dir = "/"), r;
},
sep: "/",
delimiter: ":",
win32: null,
posix: null
};
T.posix = T;
var m = T, J = null, A = J;
const j = m.dirname(new URL(import.meta.url).pathname), D = {
serverFunctionsDir: m.join(
j,
"..",
"src",
"lib",
"server",
"functions"
),
outputDir: m.join(j, "..", "src", "lib"),
apiPrefix: "/api/v1"
};
function N(n, e, r) {
const t = `
import { post } from '@sveltejs/kit/server';
${n.map(
(i) => `
export async function ${i}(...args: any[]) {
try {
const response = await post('${r.apiPrefix}/${i}', { args });
if (!response.ok) {
throw new Error(\`HTTP error! status: \${response.status}\`);
}
return await response.json();
} catch (error) {
console.error(\`Error calling ${i}:\`, error);
throw error;
}
}`
).join(`
`)}
`;
A.writeFileSync(e, t);
}
function Q(n, e, r) {
n.forEach((t) => {
const i = m.join(e, "routes", r.apiPrefix.slice(1), t);
A.existsSync(i) || A.mkdirSync(i, { recursive: !0 });
const s = `
import { ${t} } from '$lib/server/functions/${t}.server';
export async function POST({ request }) {
const { args } = await request.json();
try {
const result = await ${t}(...args);
return new Response(JSON.stringify(result), {
headers: { 'Content-Type': 'application/json' }
});
} catch (error) {
console.error(\`Error in ${t}:\`, error);
return new Response(JSON.stringify({ error: error.message }), {
status: 500,
headers: { 'Content-Type': 'application/json' }
});
}
}
`;
A.writeFileSync(m.join(i, "+server.ts"), s);
});
}
function S(n = {}) {
const e = { ...D, ...n }, r = A.readdirSync(e.serverFunctionsDir), t = [];
r.forEach((s) => {
if (s.endsWith(".server.ts")) {
const o = m.join(e.serverFunctionsDir, s), l = A.readFileSync(o, "utf-8").match(
/export\s+async?\s+function\s+(\w+)/g
);
l && l.forEach((v) => {
const f = v.split(" ").pop();
f && t.push(f);
});
}
});
const i = m.join(e.outputDir, "server.ts");
N(t, i, e), Q(t, e.outputDir, e), console.log("Remote functions and routes generated successfully!");
}
function M(n = {}) {
let e;
return {
name: "sveltekit-remote-fn",
apply(r, { command: t }) {
var i;
return t === "build" && !((i = r.build) != null && i.ssr);
},
configResolved(r) {
console.log("BuildStart Config: ", r), e = r;
},
buildStart() {
console.log("BuildStart Config: ", n), S(n);
},
handleHotUpdate({ file: r }) {
const t = m.relative(e.root, r);
if (console.log("HandleHotUpdate RelativePath: ", t), t.startsWith(
n.serverFunctionsDir || D.serverFunctionsDir
) && r.endsWith(".server.ts"))
return console.log(
"Server function file changed, regenerating remote functions..."
), S(n), [];
},
configureServer(r) {
const t = r.watcher;
t.on("add", (i) => {
const s = m.relative(e.root, i);
console.log("WatcherOn Add RelativePath: ", s), s.startsWith(
n.serverFunctionsDir || D.serverFunctionsDir
) && i.endsWith(".server.ts") && (console.log(
"New server function file added, regenerating remote functions..."
), S(n));
}), t.on("unlink", (i) => {
const s = m.relative(e.root, i);
console.log("WatcherOn Unlink RelativePath: ", s), s.startsWith(
n.serverFunctionsDir || D.serverFunctionsDir
) && i.endsWith(".server.ts") && (console.log(
"Server function file removed, regenerating remote functions..."
), S(n));
});
}
};
}
export {
M as default
};