@vercel/backends 0.8.17 → 0.8.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +6 -2
- package/dist/index.mjs +300 -6
- package/package.json +3 -3
package/dist/index.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as _vercel_build_utils0 from "@vercel/build-utils";
|
|
2
|
-
import { BuildOptions, BuildV2, DetectEntrypointFn, Files, PrepareCache, Span } from "@vercel/build-utils";
|
|
2
|
+
import { BuildOptions, BuildV2, DetectEntrypointFn, Files, PrepareCache, ShouldServe, Span, StartDevServer } from "@vercel/build-utils";
|
|
3
3
|
import { ParseArgsConfig } from "node:util";
|
|
4
4
|
|
|
5
5
|
//#region src/find-entrypoint.d.ts
|
|
@@ -105,9 +105,13 @@ declare const introspectApp: (args: {
|
|
|
105
105
|
//#region src/diagnostics.d.ts
|
|
106
106
|
declare const diagnostics: _vercel_build_utils0.Diagnostics;
|
|
107
107
|
//#endregion
|
|
108
|
+
//#region src/start-dev-server.d.ts
|
|
109
|
+
declare const shouldServe: ShouldServe;
|
|
110
|
+
declare const startDevServer: StartDevServer;
|
|
111
|
+
//#endregion
|
|
108
112
|
//#region src/index.d.ts
|
|
109
113
|
declare const version = 2;
|
|
110
114
|
declare const build: BuildV2;
|
|
111
115
|
declare const prepareCache: PrepareCache;
|
|
112
116
|
//#endregion
|
|
113
|
-
export { type CervelBuildOptions, type CervelServeOptions, type PathOptions, build, build$1 as cervelBuild, serve as cervelServe, detectEntrypoint, diagnostics, findEntrypoint, findEntrypointOrThrow, getBuildSummary, introspectApp, nodeFileTrace, prepareCache, srvxOptions, version };
|
|
117
|
+
export { type CervelBuildOptions, type CervelServeOptions, type PathOptions, build, build$1 as cervelBuild, serve as cervelServe, detectEntrypoint, diagnostics, findEntrypoint, findEntrypointOrThrow, getBuildSummary, introspectApp, nodeFileTrace, prepareCache, shouldServe, srvxOptions, startDevServer, version };
|
package/dist/index.mjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { builtinModules, createRequire } from "node:module";
|
|
2
2
|
import { basename, delimiter, dirname, extname, isAbsolute, join, posix, relative, resolve, sep } from "node:path";
|
|
3
3
|
import { delimiter as delimiter$1, dirname as dirname$1, join as join$1 } from "path";
|
|
4
|
-
import { FileBlob, FileFsRef, NodejsLambda, Span, createDiagnostics, debug, defaultCachePathGlob, download, execCommand, generateProjectManifest, getEnvForPackageManager, getInternalServiceCronPath, getLambdaOptionsFromFunction, getNodeBinPaths, getNodeVersion, getReportedServiceType, glob, isBackendFramework, isBunVersion, isExperimentalBackendsWithoutIntrospectionEnabled, isScheduleTriggeredService, runNpmInstall, runPackageJsonScript, scanParentDirs } from "@vercel/build-utils";
|
|
4
|
+
import { FileBlob, FileFsRef, NodejsLambda, Span, cloneEnv, createDiagnostics, debug, defaultCachePathGlob, download, execCommand, generateProjectManifest, getEnvForPackageManager, getInternalServiceCronPath, getLambdaOptionsFromFunction, getNodeBinPaths, getNodeVersion, getReportedServiceType, glob, isBackendFramework, isBunVersion, isExperimentalBackendsWithoutIntrospectionEnabled, isScheduleTriggeredService, runNpmInstall, runPackageJsonScript, scanParentDirs } from "@vercel/build-utils";
|
|
5
5
|
import { createWriteStream, existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, unlinkSync, writeFileSync } from "node:fs";
|
|
6
6
|
import { lstat, readFile, readlink, rm, stat } from "node:fs/promises";
|
|
7
|
-
import { fileURLToPath } from "node:url";
|
|
7
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
8
8
|
import { build as build$2 } from "rolldown";
|
|
9
9
|
import { exports } from "resolve.exports";
|
|
10
10
|
import { isNativeError } from "node:util/types";
|
|
@@ -12,9 +12,11 @@ import { nodeFileTrace as nodeFileTrace$1, resolve as resolve$1 } from "@vercel/
|
|
|
12
12
|
import { transform } from "oxc-transform";
|
|
13
13
|
import execa from "execa";
|
|
14
14
|
import { readFile as readFile$1, writeFile } from "fs/promises";
|
|
15
|
-
import { spawn } from "node:child_process";
|
|
15
|
+
import { fork, spawn } from "node:child_process";
|
|
16
16
|
import { tmpdir } from "node:os";
|
|
17
17
|
import { z } from "zod";
|
|
18
|
+
import { createConnection } from "node:net";
|
|
19
|
+
import getPort from "get-port";
|
|
18
20
|
|
|
19
21
|
//#region src/utils.ts
|
|
20
22
|
async function downloadInstallAndBundle(args) {
|
|
@@ -818,7 +820,7 @@ const Colors = {
|
|
|
818
820
|
*
|
|
819
821
|
* The `typescript` package is resolved with `require` from the user's app (peer dependency), not bundled.
|
|
820
822
|
*/
|
|
821
|
-
const require_ = createRequire(import.meta.url);
|
|
823
|
+
const require_$1 = createRequire(import.meta.url);
|
|
822
824
|
const typescript = (args) => {
|
|
823
825
|
const { span } = args;
|
|
824
826
|
return span.child("vc.builder.backends.tsCompile").trace(async () => {
|
|
@@ -888,7 +890,7 @@ async function doTypeCheck(args, ts) {
|
|
|
888
890
|
}
|
|
889
891
|
function resolveTypeScriptModule(workPath) {
|
|
890
892
|
try {
|
|
891
|
-
return require_(require_.resolve("typescript", { paths: [workPath] }));
|
|
893
|
+
return require_$1(require_$1.resolve("typescript", { paths: [workPath] }));
|
|
892
894
|
} catch (_e) {
|
|
893
895
|
return null;
|
|
894
896
|
}
|
|
@@ -1806,6 +1808,298 @@ const getFramework = (args) => {
|
|
|
1806
1808
|
}
|
|
1807
1809
|
};
|
|
1808
1810
|
|
|
1811
|
+
//#endregion
|
|
1812
|
+
//#region src/dev/spawn-srvx.ts
|
|
1813
|
+
const require_ = createRequire(import.meta.url);
|
|
1814
|
+
const srvxBinPath = resolve(dirname(require_.resolve("srvx/cli")), "../bin/srvx.mjs");
|
|
1815
|
+
const tsxPath = pathToFileURL(require_.resolve("tsx")).href;
|
|
1816
|
+
const STARTUP_TIMEOUT = 5 * 6e4;
|
|
1817
|
+
const SHUTDOWN_TIMEOUT = 5e3;
|
|
1818
|
+
function forwardOutput(callback, stream) {
|
|
1819
|
+
return (data) => {
|
|
1820
|
+
if (callback) callback(data);
|
|
1821
|
+
else stream.write(data.toString());
|
|
1822
|
+
};
|
|
1823
|
+
}
|
|
1824
|
+
function canConnect(port) {
|
|
1825
|
+
return new Promise((resolve$2) => {
|
|
1826
|
+
const socket = createConnection({
|
|
1827
|
+
host: "127.0.0.1",
|
|
1828
|
+
port
|
|
1829
|
+
});
|
|
1830
|
+
let settled = false;
|
|
1831
|
+
const finish = (connected) => {
|
|
1832
|
+
if (settled) return;
|
|
1833
|
+
settled = true;
|
|
1834
|
+
socket.destroy();
|
|
1835
|
+
resolve$2(connected);
|
|
1836
|
+
};
|
|
1837
|
+
socket.once("connect", () => finish(true));
|
|
1838
|
+
socket.once("error", () => finish(false));
|
|
1839
|
+
socket.setTimeout(100, () => finish(false));
|
|
1840
|
+
});
|
|
1841
|
+
}
|
|
1842
|
+
function waitUntilReady(child, port, entrypoint, signal) {
|
|
1843
|
+
return new Promise((resolve$2, reject) => {
|
|
1844
|
+
const deadline = Date.now() + STARTUP_TIMEOUT;
|
|
1845
|
+
let retryTimer;
|
|
1846
|
+
let settled = false;
|
|
1847
|
+
const cleanup = () => {
|
|
1848
|
+
if (retryTimer) clearTimeout(retryTimer);
|
|
1849
|
+
child.off("error", onError);
|
|
1850
|
+
child.off("exit", onExit);
|
|
1851
|
+
signal?.removeEventListener("abort", onAbort);
|
|
1852
|
+
};
|
|
1853
|
+
const succeed = () => {
|
|
1854
|
+
if (settled) return;
|
|
1855
|
+
settled = true;
|
|
1856
|
+
cleanup();
|
|
1857
|
+
resolve$2();
|
|
1858
|
+
};
|
|
1859
|
+
const fail = (error) => {
|
|
1860
|
+
if (settled) return;
|
|
1861
|
+
settled = true;
|
|
1862
|
+
cleanup();
|
|
1863
|
+
reject(error);
|
|
1864
|
+
};
|
|
1865
|
+
const onError = (error) => fail(error);
|
|
1866
|
+
const onExit = (code, signal$1) => {
|
|
1867
|
+
const reason = signal$1 ? `signal ${signal$1}` : `exit code ${code}`;
|
|
1868
|
+
fail(/* @__PURE__ */ new Error(`Server \`${entrypoint}\` exited with ${reason}`));
|
|
1869
|
+
};
|
|
1870
|
+
const onAbort = () => {
|
|
1871
|
+
child.kill("SIGTERM");
|
|
1872
|
+
fail(/* @__PURE__ */ new Error(`Server \`${entrypoint}\` cancelled`));
|
|
1873
|
+
};
|
|
1874
|
+
const probe = async () => {
|
|
1875
|
+
if (settled) return;
|
|
1876
|
+
if (await canConnect(port)) succeed();
|
|
1877
|
+
else if (Date.now() >= deadline) fail(/* @__PURE__ */ new Error(`Server \`${entrypoint}\` did not listen on port ${port} within ${STARTUP_TIMEOUT}ms`));
|
|
1878
|
+
else retryTimer = setTimeout(probe, 50);
|
|
1879
|
+
};
|
|
1880
|
+
child.once("error", onError);
|
|
1881
|
+
child.once("exit", onExit);
|
|
1882
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
1883
|
+
if (signal?.aborted) {
|
|
1884
|
+
onAbort();
|
|
1885
|
+
return;
|
|
1886
|
+
}
|
|
1887
|
+
probe();
|
|
1888
|
+
});
|
|
1889
|
+
}
|
|
1890
|
+
function waitForExit(child, timeout) {
|
|
1891
|
+
if (child.exitCode !== null || child.signalCode !== null) return Promise.resolve(true);
|
|
1892
|
+
return new Promise((resolve$2) => {
|
|
1893
|
+
const onExit = () => {
|
|
1894
|
+
clearTimeout(timer);
|
|
1895
|
+
resolve$2(true);
|
|
1896
|
+
};
|
|
1897
|
+
const timer = setTimeout(() => {
|
|
1898
|
+
child.off("exit", onExit);
|
|
1899
|
+
resolve$2(false);
|
|
1900
|
+
}, timeout);
|
|
1901
|
+
child.once("exit", onExit);
|
|
1902
|
+
});
|
|
1903
|
+
}
|
|
1904
|
+
async function stopChild(child) {
|
|
1905
|
+
if (child.exitCode !== null || child.signalCode !== null) return;
|
|
1906
|
+
child.kill("SIGTERM");
|
|
1907
|
+
if (await waitForExit(child, SHUTDOWN_TIMEOUT)) return;
|
|
1908
|
+
child.kill("SIGKILL");
|
|
1909
|
+
await waitForExit(child, 1e3);
|
|
1910
|
+
}
|
|
1911
|
+
async function spawnSrvx(opts) {
|
|
1912
|
+
const port = await getPort({ host: "127.0.0.1" });
|
|
1913
|
+
const env = cloneEnv(process.env, opts.env, {
|
|
1914
|
+
HOST: "127.0.0.1",
|
|
1915
|
+
PORT: String(port)
|
|
1916
|
+
});
|
|
1917
|
+
if (!env.NODE_ENV) env.NODE_ENV = "development";
|
|
1918
|
+
const child = fork(srvxBinPath, [
|
|
1919
|
+
`--port=${port}`,
|
|
1920
|
+
"--host=127.0.0.1",
|
|
1921
|
+
`--static=${resolve(opts.workPath, opts.publicDir)}`,
|
|
1922
|
+
opts.entrypoint
|
|
1923
|
+
], {
|
|
1924
|
+
cwd: opts.workPath,
|
|
1925
|
+
env,
|
|
1926
|
+
execArgv: ["--import", tsxPath],
|
|
1927
|
+
stdio: [
|
|
1928
|
+
"ignore",
|
|
1929
|
+
"pipe",
|
|
1930
|
+
"pipe",
|
|
1931
|
+
"ipc"
|
|
1932
|
+
]
|
|
1933
|
+
});
|
|
1934
|
+
child.stdout?.on("data", forwardOutput(opts.onStdout, process.stdout));
|
|
1935
|
+
child.stderr?.on("data", forwardOutput(opts.onStderr, process.stderr));
|
|
1936
|
+
if (!child.pid) throw new Error("srvx child failed to spawn");
|
|
1937
|
+
try {
|
|
1938
|
+
await waitUntilReady(child, port, opts.entrypoint, opts.signal);
|
|
1939
|
+
} catch (error) {
|
|
1940
|
+
await stopChild(child);
|
|
1941
|
+
throw error;
|
|
1942
|
+
}
|
|
1943
|
+
return {
|
|
1944
|
+
pid: child.pid,
|
|
1945
|
+
port,
|
|
1946
|
+
shutdown: () => stopChild(child)
|
|
1947
|
+
};
|
|
1948
|
+
}
|
|
1949
|
+
|
|
1950
|
+
//#endregion
|
|
1951
|
+
//#region src/start-dev-server.ts
|
|
1952
|
+
const persistentDevServers = /* @__PURE__ */ new Map();
|
|
1953
|
+
const pendingDevServers = /* @__PURE__ */ new Map();
|
|
1954
|
+
let cleanupHandlersInstalled = false;
|
|
1955
|
+
let shuttingDown = false;
|
|
1956
|
+
function snapshotFiles(files) {
|
|
1957
|
+
return { ...files };
|
|
1958
|
+
}
|
|
1959
|
+
function filesAreEqual(previous, current) {
|
|
1960
|
+
const previousNames = Object.keys(previous);
|
|
1961
|
+
const currentNames = Object.keys(current);
|
|
1962
|
+
return previousNames.length === currentNames.length && previousNames.every((name) => previous[name] === current[name]);
|
|
1963
|
+
}
|
|
1964
|
+
function envsAreEqual(previous, current) {
|
|
1965
|
+
const previousNames = Object.keys(previous);
|
|
1966
|
+
const currentNames = Object.keys(current);
|
|
1967
|
+
return previousNames.length === currentNames.length && previousNames.every((name) => previous[name] === current[name]);
|
|
1968
|
+
}
|
|
1969
|
+
function stateMatches(state, files, env) {
|
|
1970
|
+
return filesAreEqual(state.files, files) && envsAreEqual(state.env, env);
|
|
1971
|
+
}
|
|
1972
|
+
function isProcessRunning(pid) {
|
|
1973
|
+
try {
|
|
1974
|
+
process.kill(pid, 0);
|
|
1975
|
+
return true;
|
|
1976
|
+
} catch {
|
|
1977
|
+
return false;
|
|
1978
|
+
}
|
|
1979
|
+
}
|
|
1980
|
+
function terminateProcess(pid) {
|
|
1981
|
+
try {
|
|
1982
|
+
process.kill(pid, "SIGTERM");
|
|
1983
|
+
} catch {}
|
|
1984
|
+
}
|
|
1985
|
+
function stopPersistentDevServer(key, server) {
|
|
1986
|
+
if (!server.stopPromise) server.stopPromise = (async () => {
|
|
1987
|
+
try {
|
|
1988
|
+
if (server.result.shutdown) await server.result.shutdown();
|
|
1989
|
+
else terminateProcess(server.result.pid);
|
|
1990
|
+
} catch {
|
|
1991
|
+
terminateProcess(server.result.pid);
|
|
1992
|
+
} finally {
|
|
1993
|
+
if (persistentDevServers.get(key) === server) persistentDevServers.delete(key);
|
|
1994
|
+
}
|
|
1995
|
+
})();
|
|
1996
|
+
return server.stopPromise;
|
|
1997
|
+
}
|
|
1998
|
+
function persistentResult(key, server) {
|
|
1999
|
+
const { pid } = server.result;
|
|
2000
|
+
return {
|
|
2001
|
+
...server.result,
|
|
2002
|
+
persistent: true,
|
|
2003
|
+
shutdown: () => {
|
|
2004
|
+
const current = persistentDevServers.get(key);
|
|
2005
|
+
return current?.result.pid === pid ? stopPersistentDevServer(key, current) : Promise.resolve();
|
|
2006
|
+
}
|
|
2007
|
+
};
|
|
2008
|
+
}
|
|
2009
|
+
function installCleanupHandlers() {
|
|
2010
|
+
if (cleanupHandlersInstalled) return;
|
|
2011
|
+
cleanupHandlersInstalled = true;
|
|
2012
|
+
const stopAll = () => {
|
|
2013
|
+
shuttingDown = true;
|
|
2014
|
+
for (const pending of pendingDevServers.values()) pending.controller.abort();
|
|
2015
|
+
for (const [key, server] of persistentDevServers) stopPersistentDevServer(key, server);
|
|
2016
|
+
};
|
|
2017
|
+
const killAll = () => {
|
|
2018
|
+
for (const pending of pendingDevServers.values()) pending.controller.abort();
|
|
2019
|
+
for (const server of persistentDevServers.values()) terminateProcess(server.result.pid);
|
|
2020
|
+
};
|
|
2021
|
+
process.on("SIGINT", stopAll);
|
|
2022
|
+
process.on("SIGTERM", stopAll);
|
|
2023
|
+
process.on("exit", killAll);
|
|
2024
|
+
}
|
|
2025
|
+
const shouldServe = (opts) => {
|
|
2026
|
+
if (opts.requestPath.replace(/\/$/, "").startsWith("api") && opts.hasMatched) return false;
|
|
2027
|
+
return true;
|
|
2028
|
+
};
|
|
2029
|
+
const startDevServer = async (opts) => {
|
|
2030
|
+
if (opts.service) return null;
|
|
2031
|
+
const key = `${opts.workPath}::${opts.entrypoint ?? "<detect>"}`;
|
|
2032
|
+
const entrypoint = await findEntrypointWithHintOrThrow(opts.workPath, opts.entrypoint);
|
|
2033
|
+
const env = { ...opts.meta?.env };
|
|
2034
|
+
installCleanupHandlers();
|
|
2035
|
+
while (!shuttingDown) {
|
|
2036
|
+
const existing = persistentDevServers.get(key);
|
|
2037
|
+
if (existing) {
|
|
2038
|
+
if (!existing.stopPromise && stateMatches(existing, opts.files, env) && isProcessRunning(existing.result.pid)) return persistentResult(key, existing);
|
|
2039
|
+
await stopPersistentDevServer(key, existing);
|
|
2040
|
+
continue;
|
|
2041
|
+
}
|
|
2042
|
+
const pending = pendingDevServers.get(key);
|
|
2043
|
+
if (pending) {
|
|
2044
|
+
if (!stateMatches(pending, opts.files, env)) pending.controller.abort();
|
|
2045
|
+
let server;
|
|
2046
|
+
try {
|
|
2047
|
+
server = await pending.promise;
|
|
2048
|
+
} catch (error) {
|
|
2049
|
+
if (stateMatches(pending, opts.files, env)) throw error;
|
|
2050
|
+
continue;
|
|
2051
|
+
}
|
|
2052
|
+
if (stateMatches(pending, opts.files, env)) {
|
|
2053
|
+
if (!server) return null;
|
|
2054
|
+
if (isProcessRunning(server.result.pid)) return persistentResult(key, server);
|
|
2055
|
+
}
|
|
2056
|
+
if (server) await stopPersistentDevServer(key, server);
|
|
2057
|
+
continue;
|
|
2058
|
+
}
|
|
2059
|
+
const files = snapshotFiles(opts.files);
|
|
2060
|
+
const controller = new AbortController();
|
|
2061
|
+
const promise = spawnSrvx({
|
|
2062
|
+
workPath: opts.workPath,
|
|
2063
|
+
entrypoint,
|
|
2064
|
+
publicDir: opts.publicDir ?? "public",
|
|
2065
|
+
env,
|
|
2066
|
+
signal: controller.signal,
|
|
2067
|
+
onStdout: opts.onStdout,
|
|
2068
|
+
onStderr: opts.onStderr
|
|
2069
|
+
}).then(async (result) => {
|
|
2070
|
+
const server = {
|
|
2071
|
+
files,
|
|
2072
|
+
env,
|
|
2073
|
+
result
|
|
2074
|
+
};
|
|
2075
|
+
if (shuttingDown) {
|
|
2076
|
+
await stopPersistentDevServer(key, server);
|
|
2077
|
+
return null;
|
|
2078
|
+
}
|
|
2079
|
+
persistentDevServers.set(key, server);
|
|
2080
|
+
return server;
|
|
2081
|
+
});
|
|
2082
|
+
const pendingServer = {
|
|
2083
|
+
files,
|
|
2084
|
+
env,
|
|
2085
|
+
controller,
|
|
2086
|
+
promise
|
|
2087
|
+
};
|
|
2088
|
+
pendingDevServers.set(key, pendingServer);
|
|
2089
|
+
try {
|
|
2090
|
+
const server = await promise;
|
|
2091
|
+
if (!stateMatches(pendingServer, opts.files, env)) {
|
|
2092
|
+
if (server) await stopPersistentDevServer(key, server);
|
|
2093
|
+
continue;
|
|
2094
|
+
}
|
|
2095
|
+
return server ? persistentResult(key, server) : null;
|
|
2096
|
+
} finally {
|
|
2097
|
+
if (pendingDevServers.get(key) === pendingServer) pendingDevServers.delete(key);
|
|
2098
|
+
}
|
|
2099
|
+
}
|
|
2100
|
+
return null;
|
|
2101
|
+
};
|
|
2102
|
+
|
|
1809
2103
|
//#endregion
|
|
1810
2104
|
//#region src/index.ts
|
|
1811
2105
|
const version = 2;
|
|
@@ -2024,4 +2318,4 @@ const escapeForRegex = (value) => value.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&");
|
|
|
2024
2318
|
const toRegexSource = (value) => escapeForRegex(value).replaceAll("/", "\\/");
|
|
2025
2319
|
|
|
2026
2320
|
//#endregion
|
|
2027
|
-
export { build, build$1 as cervelBuild, serve as cervelServe, detectEntrypoint, diagnostics, findEntrypoint, findEntrypointOrThrow, getBuildSummary, introspectApp, nodeFileTrace, prepareCache, srvxOptions, version };
|
|
2321
|
+
export { build, build$1 as cervelBuild, serve as cervelServe, detectEntrypoint, diagnostics, findEntrypoint, findEntrypointOrThrow, getBuildSummary, introspectApp, nodeFileTrace, prepareCache, shouldServe, srvxOptions, startDevServer, version };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vercel/backends",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.18",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"main": "./dist/index.mjs",
|
|
6
6
|
"homepage": "https://vercel.com/docs",
|
|
@@ -33,10 +33,10 @@
|
|
|
33
33
|
"path-to-regexp": "8.3.0",
|
|
34
34
|
"resolve.exports": "2.0.3",
|
|
35
35
|
"rolldown": "1.0.0-rc.1",
|
|
36
|
-
"srvx": "0.
|
|
36
|
+
"srvx": "0.11.16",
|
|
37
37
|
"tsx": "4.21.0",
|
|
38
38
|
"zod": "3.22.4",
|
|
39
|
-
"@vercel/build-utils": "13.32.
|
|
39
|
+
"@vercel/build-utils": "13.32.1"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"@types/express": "5.0.3",
|