h3 1.6.4 → 1.6.6
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.cjs +30 -16
- package/dist/index.d.ts +13 -5
- package/dist/index.mjs +21 -13
- package/package.json +25 -25
package/dist/index.cjs
CHANGED
|
@@ -8,6 +8,11 @@ const crypto = require('uncrypto');
|
|
|
8
8
|
const ironWebcrypto = require('iron-webcrypto');
|
|
9
9
|
const defu = require('defu');
|
|
10
10
|
|
|
11
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
|
|
12
|
+
|
|
13
|
+
const destr__default = /*#__PURE__*/_interopDefaultCompat(destr);
|
|
14
|
+
const crypto__default = /*#__PURE__*/_interopDefaultCompat(crypto);
|
|
15
|
+
|
|
11
16
|
function useBase(base, handler) {
|
|
12
17
|
base = ufo.withoutTrailingSlash(base);
|
|
13
18
|
if (!base) {
|
|
@@ -252,23 +257,31 @@ function getRequestHeader(event, name) {
|
|
|
252
257
|
return value;
|
|
253
258
|
}
|
|
254
259
|
const getHeader = getRequestHeader;
|
|
255
|
-
function getRequestHost(event) {
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
260
|
+
function getRequestHost(event, opts = {}) {
|
|
261
|
+
if (opts.xForwardedHost) {
|
|
262
|
+
const xForwardedHost = event.node.req.headers["x-forwarded-host"];
|
|
263
|
+
if (xForwardedHost) {
|
|
264
|
+
return xForwardedHost;
|
|
265
|
+
}
|
|
259
266
|
}
|
|
260
267
|
return event.node.req.headers.host || "localhost";
|
|
261
268
|
}
|
|
262
|
-
function getRequestProtocol(event) {
|
|
263
|
-
if (event.node.req.headers["x-forwarded-proto"] === "https") {
|
|
269
|
+
function getRequestProtocol(event, opts = {}) {
|
|
270
|
+
if (opts.xForwardedProto !== false && event.node.req.headers["x-forwarded-proto"] === "https") {
|
|
264
271
|
return "https";
|
|
265
272
|
}
|
|
266
273
|
return event.node.req.connection.encrypted ? "https" : "http";
|
|
267
274
|
}
|
|
268
|
-
|
|
269
|
-
|
|
275
|
+
const DOUBLE_SLASH_RE = /[/\\]{2,}/g;
|
|
276
|
+
function getRequestPath(event) {
|
|
277
|
+
const path = (event.node.req.url || "/").replace(DOUBLE_SLASH_RE, "/");
|
|
278
|
+
return path;
|
|
279
|
+
}
|
|
280
|
+
function getRequestURL(event, opts = {}) {
|
|
281
|
+
const host = getRequestHost(event, opts);
|
|
270
282
|
const protocol = getRequestProtocol(event);
|
|
271
|
-
|
|
283
|
+
const path = getRequestPath(event);
|
|
284
|
+
return new URL(path, `${protocol}://${host}`);
|
|
272
285
|
}
|
|
273
286
|
|
|
274
287
|
const RawBodySymbol = Symbol.for("h3RawBody");
|
|
@@ -278,8 +291,8 @@ function readRawBody(event, encoding = "utf8") {
|
|
|
278
291
|
assertMethod(event, PayloadMethods$1);
|
|
279
292
|
const _rawBody = event.node.req[RawBodySymbol] || event.node.req.body;
|
|
280
293
|
if (_rawBody) {
|
|
281
|
-
const promise2 = Promise.resolve(
|
|
282
|
-
Buffer.isBuffer(
|
|
294
|
+
const promise2 = Promise.resolve(_rawBody).then(
|
|
295
|
+
(_resolved) => Buffer.isBuffer(_resolved) ? _resolved : Buffer.from(_resolved)
|
|
283
296
|
);
|
|
284
297
|
return encoding ? promise2.then((buff) => buff.toString(encoding)) : promise2;
|
|
285
298
|
}
|
|
@@ -321,7 +334,7 @@ async function readBody(event) {
|
|
|
321
334
|
}
|
|
322
335
|
return parsedForm;
|
|
323
336
|
}
|
|
324
|
-
const json =
|
|
337
|
+
const json = destr__default(body);
|
|
325
338
|
event.node.req[ParsedBodySymbol] = json;
|
|
326
339
|
return json;
|
|
327
340
|
}
|
|
@@ -805,7 +818,7 @@ async function getSession(event, config) {
|
|
|
805
818
|
Object.assign(session, unsealed);
|
|
806
819
|
}
|
|
807
820
|
if (!session.id) {
|
|
808
|
-
session.id = (config.crypto ||
|
|
821
|
+
session.id = (config.crypto || crypto__default).randomUUID();
|
|
809
822
|
session.createdAt = Date.now();
|
|
810
823
|
await updateSession(event, config);
|
|
811
824
|
}
|
|
@@ -833,7 +846,7 @@ async function updateSession(event, config, update) {
|
|
|
833
846
|
async function sealSession(event, config) {
|
|
834
847
|
const sessionName = config.name || DEFAULT_NAME;
|
|
835
848
|
const session = event.context.sessions?.[sessionName] || await getSession(event, config);
|
|
836
|
-
const sealed = await ironWebcrypto.seal(config.crypto ||
|
|
849
|
+
const sealed = await ironWebcrypto.seal(config.crypto || crypto__default, session, config.password, {
|
|
837
850
|
...ironWebcrypto.defaults,
|
|
838
851
|
ttl: config.maxAge ? config.maxAge * 1e3 : 0,
|
|
839
852
|
...config.seal
|
|
@@ -842,7 +855,7 @@ async function sealSession(event, config) {
|
|
|
842
855
|
}
|
|
843
856
|
async function unsealSession(_event, config, sealed) {
|
|
844
857
|
const unsealed = await ironWebcrypto.unseal(
|
|
845
|
-
config.crypto ||
|
|
858
|
+
config.crypto || crypto__default,
|
|
846
859
|
sealed,
|
|
847
860
|
config.password,
|
|
848
861
|
{
|
|
@@ -1080,7 +1093,7 @@ class H3Event {
|
|
|
1080
1093
|
this.node = { req, res };
|
|
1081
1094
|
}
|
|
1082
1095
|
get path() {
|
|
1083
|
-
return this
|
|
1096
|
+
return getRequestPath(this);
|
|
1084
1097
|
}
|
|
1085
1098
|
/** @deprecated Please use `event.node.req` instead. **/
|
|
1086
1099
|
get req() {
|
|
@@ -1474,6 +1487,7 @@ exports.getQuery = getQuery;
|
|
|
1474
1487
|
exports.getRequestHeader = getRequestHeader;
|
|
1475
1488
|
exports.getRequestHeaders = getRequestHeaders;
|
|
1476
1489
|
exports.getRequestHost = getRequestHost;
|
|
1490
|
+
exports.getRequestPath = getRequestPath;
|
|
1477
1491
|
exports.getRequestProtocol = getRequestProtocol;
|
|
1478
1492
|
exports.getRequestURL = getRequestURL;
|
|
1479
1493
|
exports.getResponseHeader = getResponseHeader;
|
package/dist/index.d.ts
CHANGED
|
@@ -108,7 +108,7 @@ declare class H3Event implements Pick<FetchEvent, "respondWith"> {
|
|
|
108
108
|
node: NodeEventContext;
|
|
109
109
|
context: H3EventContext;
|
|
110
110
|
constructor(req: IncomingMessage, res: ServerResponse);
|
|
111
|
-
get path(): string
|
|
111
|
+
get path(): string;
|
|
112
112
|
/** @deprecated Please use `event.node.req` instead. **/
|
|
113
113
|
get req(): IncomingMessage;
|
|
114
114
|
/** @deprecated Please use `event.node.res` instead. **/
|
|
@@ -333,9 +333,17 @@ declare function getRequestHeaders(event: H3Event): RequestHeaders;
|
|
|
333
333
|
declare const getHeaders: typeof getRequestHeaders;
|
|
334
334
|
declare function getRequestHeader(event: H3Event, name: string): RequestHeaders[string];
|
|
335
335
|
declare const getHeader: typeof getRequestHeader;
|
|
336
|
-
declare function getRequestHost(event: H3Event
|
|
337
|
-
|
|
338
|
-
|
|
336
|
+
declare function getRequestHost(event: H3Event, opts?: {
|
|
337
|
+
xForwardedHost?: boolean;
|
|
338
|
+
}): string;
|
|
339
|
+
declare function getRequestProtocol(event: H3Event, opts?: {
|
|
340
|
+
xForwardedProto?: boolean;
|
|
341
|
+
}): "https" | "http";
|
|
342
|
+
declare function getRequestPath(event: H3Event): string;
|
|
343
|
+
declare function getRequestURL(event: H3Event, opts?: {
|
|
344
|
+
xForwardedHost?: boolean;
|
|
345
|
+
xForwardedProto?: boolean;
|
|
346
|
+
}): URL;
|
|
339
347
|
|
|
340
348
|
declare function send(event: H3Event, data?: any, type?: string): Promise<void>;
|
|
341
349
|
/**
|
|
@@ -402,4 +410,4 @@ interface CreateRouterOptions {
|
|
|
402
410
|
}
|
|
403
411
|
declare function createRouter(opts?: CreateRouterOptions): Router;
|
|
404
412
|
|
|
405
|
-
export { AddRouteShortcuts, App, AppOptions, AppUse, CacheConditions, CreateRouterOptions, DynamicEventHandler, Encoding, EventHandler, EventHandlerResponse, H3CorsOptions, H3Error, H3Event, H3EventContext, H3Headers, H3Response, HTTPMethod, InputLayer, InputStack, Layer, LazyEventHandler, MIMES, Matcher, MultiPartData, NodeEventContext, NodeListener, NodeMiddleware, NodePromisifiedHandler, ProxyOptions, RequestHeaders, Router, RouterMethod, RouterUse, Session, SessionConfig, SessionData, Stack, appendCorsHeaders, appendCorsPreflightHeaders, appendHeader, appendHeaders, appendResponseHeader, appendResponseHeaders, assertMethod, callNodeListener, clearSession, createApp, createAppEventHandler, createError, createEvent, createRouter, defaultContentType, defineEventHandler, defineLazyEventHandler, defineNodeListener, defineNodeMiddleware, deleteCookie, dynamicEventHandler, eventHandler, fetchWithEvent, fromNodeMiddleware, getCookie, getHeader, getHeaders, getMethod, getProxyRequestHeaders, getQuery, getRequestHeader, getRequestHeaders, getRequestHost, getRequestProtocol, getRequestURL, getResponseHeader, getResponseHeaders, getResponseStatus, getResponseStatusText, getRouterParam, getRouterParams, getSession, handleCacheHeaders, handleCors, isCorsOriginAllowed, isError, isEvent, isEventHandler, isMethod, isPreflightRequest, isStream, lazyEventHandler, parseCookies, promisifyNodeListener, proxyRequest, readBody, readMultipartFormData, readRawBody, sanitizeStatusCode, sanitizeStatusMessage, sealSession, send, sendError, sendNoContent, sendProxy, sendRedirect, sendStream, setCookie, setHeader, setHeaders, setResponseHeader, setResponseHeaders, setResponseStatus, splitCookiesString, toEventHandler, toNodeListener, unsealSession, updateSession, use, useBase, useSession, writeEarlyHints };
|
|
413
|
+
export { AddRouteShortcuts, App, AppOptions, AppUse, CacheConditions, CreateRouterOptions, DynamicEventHandler, Encoding, EventHandler, EventHandlerResponse, H3CorsOptions, H3Error, H3Event, H3EventContext, H3Headers, H3Response, HTTPMethod, InputLayer, InputStack, Layer, LazyEventHandler, MIMES, Matcher, MultiPartData, NodeEventContext, NodeListener, NodeMiddleware, NodePromisifiedHandler, ProxyOptions, RequestHeaders, Router, RouterMethod, RouterUse, Session, SessionConfig, SessionData, Stack, appendCorsHeaders, appendCorsPreflightHeaders, appendHeader, appendHeaders, appendResponseHeader, appendResponseHeaders, assertMethod, callNodeListener, clearSession, createApp, createAppEventHandler, createError, createEvent, createRouter, defaultContentType, defineEventHandler, defineLazyEventHandler, defineNodeListener, defineNodeMiddleware, deleteCookie, dynamicEventHandler, eventHandler, fetchWithEvent, fromNodeMiddleware, getCookie, getHeader, getHeaders, getMethod, getProxyRequestHeaders, getQuery, getRequestHeader, getRequestHeaders, getRequestHost, getRequestPath, getRequestProtocol, getRequestURL, getResponseHeader, getResponseHeaders, getResponseStatus, getResponseStatusText, getRouterParam, getRouterParams, getSession, handleCacheHeaders, handleCors, isCorsOriginAllowed, isError, isEvent, isEventHandler, isMethod, isPreflightRequest, isStream, lazyEventHandler, parseCookies, promisifyNodeListener, proxyRequest, readBody, readMultipartFormData, readRawBody, sanitizeStatusCode, sanitizeStatusMessage, sealSession, send, sendError, sendNoContent, sendProxy, sendRedirect, sendStream, setCookie, setHeader, setHeaders, setResponseHeader, setResponseHeaders, setResponseStatus, splitCookiesString, toEventHandler, toNodeListener, unsealSession, updateSession, use, useBase, useSession, writeEarlyHints };
|
package/dist/index.mjs
CHANGED
|
@@ -250,23 +250,31 @@ function getRequestHeader(event, name) {
|
|
|
250
250
|
return value;
|
|
251
251
|
}
|
|
252
252
|
const getHeader = getRequestHeader;
|
|
253
|
-
function getRequestHost(event) {
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
253
|
+
function getRequestHost(event, opts = {}) {
|
|
254
|
+
if (opts.xForwardedHost) {
|
|
255
|
+
const xForwardedHost = event.node.req.headers["x-forwarded-host"];
|
|
256
|
+
if (xForwardedHost) {
|
|
257
|
+
return xForwardedHost;
|
|
258
|
+
}
|
|
257
259
|
}
|
|
258
260
|
return event.node.req.headers.host || "localhost";
|
|
259
261
|
}
|
|
260
|
-
function getRequestProtocol(event) {
|
|
261
|
-
if (event.node.req.headers["x-forwarded-proto"] === "https") {
|
|
262
|
+
function getRequestProtocol(event, opts = {}) {
|
|
263
|
+
if (opts.xForwardedProto !== false && event.node.req.headers["x-forwarded-proto"] === "https") {
|
|
262
264
|
return "https";
|
|
263
265
|
}
|
|
264
266
|
return event.node.req.connection.encrypted ? "https" : "http";
|
|
265
267
|
}
|
|
266
|
-
|
|
267
|
-
|
|
268
|
+
const DOUBLE_SLASH_RE = /[/\\]{2,}/g;
|
|
269
|
+
function getRequestPath(event) {
|
|
270
|
+
const path = (event.node.req.url || "/").replace(DOUBLE_SLASH_RE, "/");
|
|
271
|
+
return path;
|
|
272
|
+
}
|
|
273
|
+
function getRequestURL(event, opts = {}) {
|
|
274
|
+
const host = getRequestHost(event, opts);
|
|
268
275
|
const protocol = getRequestProtocol(event);
|
|
269
|
-
|
|
276
|
+
const path = getRequestPath(event);
|
|
277
|
+
return new URL(path, `${protocol}://${host}`);
|
|
270
278
|
}
|
|
271
279
|
|
|
272
280
|
const RawBodySymbol = Symbol.for("h3RawBody");
|
|
@@ -276,8 +284,8 @@ function readRawBody(event, encoding = "utf8") {
|
|
|
276
284
|
assertMethod(event, PayloadMethods$1);
|
|
277
285
|
const _rawBody = event.node.req[RawBodySymbol] || event.node.req.body;
|
|
278
286
|
if (_rawBody) {
|
|
279
|
-
const promise2 = Promise.resolve(
|
|
280
|
-
Buffer.isBuffer(
|
|
287
|
+
const promise2 = Promise.resolve(_rawBody).then(
|
|
288
|
+
(_resolved) => Buffer.isBuffer(_resolved) ? _resolved : Buffer.from(_resolved)
|
|
281
289
|
);
|
|
282
290
|
return encoding ? promise2.then((buff) => buff.toString(encoding)) : promise2;
|
|
283
291
|
}
|
|
@@ -1078,7 +1086,7 @@ class H3Event {
|
|
|
1078
1086
|
this.node = { req, res };
|
|
1079
1087
|
}
|
|
1080
1088
|
get path() {
|
|
1081
|
-
return this
|
|
1089
|
+
return getRequestPath(this);
|
|
1082
1090
|
}
|
|
1083
1091
|
/** @deprecated Please use `event.node.req` instead. **/
|
|
1084
1092
|
get req() {
|
|
@@ -1434,4 +1442,4 @@ function createRouter(opts = {}) {
|
|
|
1434
1442
|
return router;
|
|
1435
1443
|
}
|
|
1436
1444
|
|
|
1437
|
-
export { H3Error, H3Event, H3Headers, H3Response, MIMES, appendCorsHeaders, appendCorsPreflightHeaders, appendHeader, appendHeaders, appendResponseHeader, appendResponseHeaders, assertMethod, callNodeListener, clearSession, createApp, createAppEventHandler, createError, createEvent, createRouter, defaultContentType, defineEventHandler, defineLazyEventHandler, defineNodeListener, defineNodeMiddleware, deleteCookie, dynamicEventHandler, eventHandler, fetchWithEvent, fromNodeMiddleware, getCookie, getHeader, getHeaders, getMethod, getProxyRequestHeaders, getQuery, getRequestHeader, getRequestHeaders, getRequestHost, getRequestProtocol, getRequestURL, getResponseHeader, getResponseHeaders, getResponseStatus, getResponseStatusText, getRouterParam, getRouterParams, getSession, handleCacheHeaders, handleCors, isCorsOriginAllowed, isError, isEvent, isEventHandler, isMethod, isPreflightRequest, isStream, lazyEventHandler, parseCookies, promisifyNodeListener, proxyRequest, readBody, readMultipartFormData, readRawBody, sanitizeStatusCode, sanitizeStatusMessage, sealSession, send, sendError, sendNoContent, sendProxy, sendRedirect, sendStream, setCookie, setHeader, setHeaders, setResponseHeader, setResponseHeaders, setResponseStatus, splitCookiesString, toEventHandler, toNodeListener, unsealSession, updateSession, use, useBase, useSession, writeEarlyHints };
|
|
1445
|
+
export { H3Error, H3Event, H3Headers, H3Response, MIMES, appendCorsHeaders, appendCorsPreflightHeaders, appendHeader, appendHeaders, appendResponseHeader, appendResponseHeaders, assertMethod, callNodeListener, clearSession, createApp, createAppEventHandler, createError, createEvent, createRouter, defaultContentType, defineEventHandler, defineLazyEventHandler, defineNodeListener, defineNodeMiddleware, deleteCookie, dynamicEventHandler, eventHandler, fetchWithEvent, fromNodeMiddleware, getCookie, getHeader, getHeaders, getMethod, getProxyRequestHeaders, getQuery, getRequestHeader, getRequestHeaders, getRequestHost, getRequestPath, getRequestProtocol, getRequestURL, getResponseHeader, getResponseHeaders, getResponseStatus, getResponseStatusText, getRouterParam, getRouterParams, getSession, handleCacheHeaders, handleCors, isCorsOriginAllowed, isError, isEvent, isEventHandler, isMethod, isPreflightRequest, isStream, lazyEventHandler, parseCookies, promisifyNodeListener, proxyRequest, readBody, readMultipartFormData, readRawBody, sanitizeStatusCode, sanitizeStatusMessage, sealSession, send, sendError, sendNoContent, sendProxy, sendRedirect, sendStream, setCookie, setHeader, setHeaders, setResponseHeader, setResponseHeaders, setResponseStatus, splitCookiesString, toEventHandler, toNodeListener, unsealSession, updateSession, use, useBase, useSession, writeEarlyHints };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "h3",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.6",
|
|
4
4
|
"description": "Tiny JavaScript Server",
|
|
5
5
|
"repository": "unjs/h3",
|
|
6
6
|
"license": "MIT",
|
|
@@ -19,46 +19,46 @@
|
|
|
19
19
|
"files": [
|
|
20
20
|
"dist"
|
|
21
21
|
],
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "unbuild",
|
|
24
|
+
"dev": "vitest",
|
|
25
|
+
"lint": "eslint --cache --ext .ts,.js,.mjs,.cjs . && prettier -c src test playground",
|
|
26
|
+
"lint:fix": "eslint --cache --ext .ts,.js,.mjs,.cjs . --fix && prettier -c src test playground -w",
|
|
27
|
+
"play": "jiti ./playground/index.ts",
|
|
28
|
+
"profile": "0x -o -D .profile -P 'autocannon -c 100 -p 10 -d 40 http://localhost:$PORT' ./playground/server.cjs",
|
|
29
|
+
"release": "pnpm test && pnpm build && changelogen --release && pnpm publish && git push --follow-tags",
|
|
30
|
+
"test": "pnpm lint && vitest run --coverage"
|
|
31
|
+
},
|
|
22
32
|
"dependencies": {
|
|
23
|
-
"cookie-es": "^0.
|
|
33
|
+
"cookie-es": "^1.0.0",
|
|
24
34
|
"defu": "^6.1.2",
|
|
25
35
|
"destr": "^1.2.2",
|
|
26
|
-
"iron-webcrypto": "^0.
|
|
36
|
+
"iron-webcrypto": "^0.7.0",
|
|
27
37
|
"radix3": "^1.0.1",
|
|
28
|
-
"ufo": "^1.1.
|
|
38
|
+
"ufo": "^1.1.2",
|
|
29
39
|
"uncrypto": "^0.1.2"
|
|
30
40
|
},
|
|
31
41
|
"devDependencies": {
|
|
32
42
|
"0x": "^5.5.0",
|
|
33
43
|
"@types/express": "^4.17.17",
|
|
34
|
-
"@types/node": "^
|
|
44
|
+
"@types/node": "^20.1.4",
|
|
35
45
|
"@types/supertest": "^2.0.12",
|
|
36
|
-
"@vitest/coverage-c8": "^0.
|
|
37
|
-
"autocannon": "^7.
|
|
38
|
-
"changelogen": "^0.5.
|
|
46
|
+
"@vitest/coverage-c8": "^0.31.0",
|
|
47
|
+
"autocannon": "^7.11.0",
|
|
48
|
+
"changelogen": "^0.5.3",
|
|
39
49
|
"connect": "^3.7.0",
|
|
40
|
-
"eslint": "^8.
|
|
50
|
+
"eslint": "^8.40.0",
|
|
41
51
|
"eslint-config-unjs": "^0.1.0",
|
|
42
52
|
"express": "^4.18.2",
|
|
43
53
|
"get-port": "^6.1.2",
|
|
44
54
|
"jiti": "^1.18.2",
|
|
45
55
|
"listhen": "^1.0.4",
|
|
46
|
-
"node-fetch-native": "^1.
|
|
47
|
-
"prettier": "^2.8.
|
|
56
|
+
"node-fetch-native": "^1.1.1",
|
|
57
|
+
"prettier": "^2.8.8",
|
|
48
58
|
"supertest": "^6.3.3",
|
|
49
|
-
"typescript": "^5.0.
|
|
50
|
-
"unbuild": "^1.1
|
|
51
|
-
"vitest": "^0.
|
|
59
|
+
"typescript": "^5.0.4",
|
|
60
|
+
"unbuild": "^1.2.1",
|
|
61
|
+
"vitest": "^0.31.0"
|
|
52
62
|
},
|
|
53
|
-
"packageManager": "pnpm@8.
|
|
54
|
-
"scripts": {
|
|
55
|
-
"build": "unbuild",
|
|
56
|
-
"dev": "vitest",
|
|
57
|
-
"lint": "eslint --cache --ext .ts,.js,.mjs,.cjs . && prettier -c src test playground",
|
|
58
|
-
"lint:fix": "eslint --cache --ext .ts,.js,.mjs,.cjs . --fix && prettier -c src test playground -w",
|
|
59
|
-
"play": "jiti ./playground/index.ts",
|
|
60
|
-
"profile": "0x -o -D .profile -P 'autocannon -c 100 -p 10 -d 40 http://localhost:$PORT' ./playground/server.cjs",
|
|
61
|
-
"release": "pnpm test && pnpm build && changelogen --release && pnpm publish && git push --follow-tags",
|
|
62
|
-
"test": "pnpm lint && vitest run --coverage"
|
|
63
|
-
}
|
|
63
|
+
"packageManager": "pnpm@8.5.1"
|
|
64
64
|
}
|