hono 4.7.0 → 4.7.2
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/adapter/aws-lambda/handler.js +0 -2
- package/dist/cjs/adapter/aws-lambda/handler.js +0 -8
- package/dist/cjs/compose.js +8 -14
- package/dist/cjs/helper/proxy/index.js +23 -9
- package/dist/cjs/middleware/combine/index.js +10 -3
- package/dist/cjs/middleware/etag/digest.js +1 -1
- package/dist/cjs/middleware/etag/index.js +17 -6
- package/dist/cjs/utils/url.js +4 -20
- package/dist/compose.js +8 -14
- package/dist/helper/proxy/index.js +23 -9
- package/dist/middleware/combine/index.js +10 -3
- package/dist/middleware/etag/digest.js +1 -1
- package/dist/middleware/etag/index.js +17 -6
- package/dist/types/compose.d.ts +4 -19
- package/dist/types/utils/url.d.ts +10 -0
- package/dist/utils/url.js +4 -20
- package/package.json +1 -1
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __create = Object.create;
|
|
3
2
|
var __defProp = Object.defineProperty;
|
|
4
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
7
5
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
6
|
var __export = (target, all) => {
|
|
9
7
|
for (var name in all)
|
|
@@ -17,10 +15,6 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
17
15
|
}
|
|
18
16
|
return to;
|
|
19
17
|
};
|
|
20
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
22
|
-
mod
|
|
23
|
-
));
|
|
24
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
25
19
|
var handler_exports = {};
|
|
26
20
|
__export(handler_exports, {
|
|
@@ -35,9 +29,7 @@ __export(handler_exports, {
|
|
|
35
29
|
streamHandle: () => streamHandle
|
|
36
30
|
});
|
|
37
31
|
module.exports = __toCommonJS(handler_exports);
|
|
38
|
-
var import_node_crypto = __toESM(require("node:crypto"), 1);
|
|
39
32
|
var import_encode = require("../../utils/encode");
|
|
40
|
-
globalThis.crypto ??= import_node_crypto.default;
|
|
41
33
|
const getRequestContext = (event) => {
|
|
42
34
|
return event.requestContext;
|
|
43
35
|
};
|
package/dist/cjs/compose.js
CHANGED
|
@@ -21,11 +21,9 @@ __export(compose_exports, {
|
|
|
21
21
|
compose: () => compose
|
|
22
22
|
});
|
|
23
23
|
module.exports = __toCommonJS(compose_exports);
|
|
24
|
-
var import_context = require("./context");
|
|
25
24
|
const compose = (middleware, onError, onNotFound) => {
|
|
26
25
|
return (context, next) => {
|
|
27
26
|
let index = -1;
|
|
28
|
-
const isContext = context instanceof import_context.Context;
|
|
29
27
|
return dispatch(0);
|
|
30
28
|
async function dispatch(i) {
|
|
31
29
|
if (i <= index) {
|
|
@@ -37,23 +35,15 @@ const compose = (middleware, onError, onNotFound) => {
|
|
|
37
35
|
let handler;
|
|
38
36
|
if (middleware[i]) {
|
|
39
37
|
handler = middleware[i][0][0];
|
|
40
|
-
|
|
41
|
-
context.req.routeIndex = i;
|
|
42
|
-
}
|
|
38
|
+
context.req.routeIndex = i;
|
|
43
39
|
} else {
|
|
44
40
|
handler = i === middleware.length && next || void 0;
|
|
45
41
|
}
|
|
46
|
-
if (
|
|
47
|
-
if (isContext && context.finalized === false && onNotFound) {
|
|
48
|
-
res = await onNotFound(context);
|
|
49
|
-
}
|
|
50
|
-
} else {
|
|
42
|
+
if (handler) {
|
|
51
43
|
try {
|
|
52
|
-
res = await handler(context, () =>
|
|
53
|
-
return dispatch(i + 1);
|
|
54
|
-
});
|
|
44
|
+
res = await handler(context, () => dispatch(i + 1));
|
|
55
45
|
} catch (err) {
|
|
56
|
-
if (err instanceof Error &&
|
|
46
|
+
if (err instanceof Error && onError) {
|
|
57
47
|
context.error = err;
|
|
58
48
|
res = await onError(err, context);
|
|
59
49
|
isError = true;
|
|
@@ -61,6 +51,10 @@ const compose = (middleware, onError, onNotFound) => {
|
|
|
61
51
|
throw err;
|
|
62
52
|
}
|
|
63
53
|
}
|
|
54
|
+
} else {
|
|
55
|
+
if (context.finalized === false && onNotFound) {
|
|
56
|
+
res = await onNotFound(context);
|
|
57
|
+
}
|
|
64
58
|
}
|
|
65
59
|
if (res && (context.finalized === false || isError)) {
|
|
66
60
|
context.res = res;
|
|
@@ -42,18 +42,31 @@ const buildRequestInitFromRequest = (request) => {
|
|
|
42
42
|
method: request.method,
|
|
43
43
|
body: request.body,
|
|
44
44
|
duplex: request.body ? "half" : void 0,
|
|
45
|
-
headers
|
|
45
|
+
headers,
|
|
46
|
+
signal: request.signal
|
|
46
47
|
};
|
|
47
48
|
};
|
|
49
|
+
const preprocessRequestInit = (requestInit) => {
|
|
50
|
+
if (!requestInit.headers || Array.isArray(requestInit.headers) || requestInit.headers instanceof Headers) {
|
|
51
|
+
return requestInit;
|
|
52
|
+
}
|
|
53
|
+
const headers = new Headers();
|
|
54
|
+
for (const [key, value] of Object.entries(requestInit.headers)) {
|
|
55
|
+
if (value == null) {
|
|
56
|
+
headers.delete(key);
|
|
57
|
+
} else {
|
|
58
|
+
headers.set(key, value);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
requestInit.headers = headers;
|
|
62
|
+
return requestInit;
|
|
63
|
+
};
|
|
48
64
|
const proxy = async (input, proxyInit) => {
|
|
49
65
|
const { raw, ...requestInit } = proxyInit ?? {};
|
|
50
|
-
const req = new Request(
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
...requestInit
|
|
55
|
-
}
|
|
56
|
-
);
|
|
66
|
+
const req = new Request(input, {
|
|
67
|
+
...buildRequestInitFromRequest(raw),
|
|
68
|
+
...preprocessRequestInit(requestInit)
|
|
69
|
+
});
|
|
57
70
|
req.headers.delete("accept-encoding");
|
|
58
71
|
const res = await fetch(req);
|
|
59
72
|
const resHeaders = new Headers(res.headers);
|
|
@@ -65,7 +78,8 @@ const proxy = async (input, proxyInit) => {
|
|
|
65
78
|
resHeaders.delete("content-length");
|
|
66
79
|
}
|
|
67
80
|
return new Response(res.body, {
|
|
68
|
-
|
|
81
|
+
status: res.status,
|
|
82
|
+
statusText: res.statusText,
|
|
69
83
|
headers: resHeaders
|
|
70
84
|
});
|
|
71
85
|
};
|
|
@@ -28,12 +28,17 @@ var import_router = require("../../router");
|
|
|
28
28
|
var import_trie_router = require("../../router/trie-router");
|
|
29
29
|
const some = (...middleware) => {
|
|
30
30
|
return async function some2(c, next) {
|
|
31
|
+
let isNextCalled = false;
|
|
32
|
+
const wrappedNext = () => {
|
|
33
|
+
isNextCalled = true;
|
|
34
|
+
return next();
|
|
35
|
+
};
|
|
31
36
|
let lastError;
|
|
32
37
|
for (const handler of middleware) {
|
|
33
38
|
try {
|
|
34
|
-
const result = await handler(c,
|
|
39
|
+
const result = await handler(c, wrappedNext);
|
|
35
40
|
if (result === true && !c.finalized) {
|
|
36
|
-
await
|
|
41
|
+
await wrappedNext();
|
|
37
42
|
} else if (result === false) {
|
|
38
43
|
lastError = new Error("No successful middleware found");
|
|
39
44
|
continue;
|
|
@@ -42,7 +47,9 @@ const some = (...middleware) => {
|
|
|
42
47
|
break;
|
|
43
48
|
} catch (error) {
|
|
44
49
|
lastError = error;
|
|
45
|
-
|
|
50
|
+
if (isNextCalled) {
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
46
53
|
}
|
|
47
54
|
}
|
|
48
55
|
if (lastError) {
|
|
@@ -34,21 +34,32 @@ const RETAINED_304_HEADERS = [
|
|
|
34
34
|
function etagMatches(etag2, ifNoneMatch) {
|
|
35
35
|
return ifNoneMatch != null && ifNoneMatch.split(/,\s*/).indexOf(etag2) > -1;
|
|
36
36
|
}
|
|
37
|
+
function initializeGenerator(generator) {
|
|
38
|
+
if (!generator) {
|
|
39
|
+
if (crypto && crypto.subtle) {
|
|
40
|
+
generator = (body) => crypto.subtle.digest(
|
|
41
|
+
{
|
|
42
|
+
name: "SHA-1"
|
|
43
|
+
},
|
|
44
|
+
body
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return generator;
|
|
49
|
+
}
|
|
37
50
|
const etag = (options) => {
|
|
38
51
|
const retainedHeaders = options?.retainedHeaders ?? RETAINED_304_HEADERS;
|
|
39
52
|
const weak = options?.weak ?? false;
|
|
40
|
-
const generator = options?.generateDigest
|
|
41
|
-
{
|
|
42
|
-
name: "SHA-1"
|
|
43
|
-
},
|
|
44
|
-
body
|
|
45
|
-
));
|
|
53
|
+
const generator = initializeGenerator(options?.generateDigest);
|
|
46
54
|
return async function etag2(c, next) {
|
|
47
55
|
const ifNoneMatch = c.req.header("If-None-Match") ?? null;
|
|
48
56
|
await next();
|
|
49
57
|
const res = c.res;
|
|
50
58
|
let etag3 = res.headers.get("ETag");
|
|
51
59
|
if (!etag3) {
|
|
60
|
+
if (!generator) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
52
63
|
const hash = await (0, import_digest.generateDigest)(res.clone().body, generator);
|
|
53
64
|
if (hash === null) {
|
|
54
65
|
return;
|
package/dist/cjs/utils/url.js
CHANGED
|
@@ -122,27 +122,11 @@ const getPathNoStrict = (request) => {
|
|
|
122
122
|
const result = getPath(request);
|
|
123
123
|
return result.length > 1 && result.at(-1) === "/" ? result.slice(0, -1) : result;
|
|
124
124
|
};
|
|
125
|
-
const mergePath = (...
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
for (let path of paths) {
|
|
129
|
-
if (p.at(-1) === "/") {
|
|
130
|
-
p = p.slice(0, -1);
|
|
131
|
-
endsWithSlash = true;
|
|
132
|
-
}
|
|
133
|
-
if (path[0] !== "/") {
|
|
134
|
-
path = `/${path}`;
|
|
135
|
-
}
|
|
136
|
-
if (path === "/" && endsWithSlash) {
|
|
137
|
-
p = `${p}/`;
|
|
138
|
-
} else if (path !== "/") {
|
|
139
|
-
p = `${p}${path}`;
|
|
140
|
-
}
|
|
141
|
-
if (path === "/" && p === "") {
|
|
142
|
-
p = "/";
|
|
143
|
-
}
|
|
125
|
+
const mergePath = (base, sub, ...rest) => {
|
|
126
|
+
if (rest.length) {
|
|
127
|
+
sub = mergePath(sub, ...rest);
|
|
144
128
|
}
|
|
145
|
-
return
|
|
129
|
+
return `${base?.[0] === "/" ? "" : "/"}${base}${sub === "/" ? "" : `${base?.at(-1) === "/" ? "" : "/"}${sub?.[0] === "/" ? sub.slice(1) : sub}`}`;
|
|
146
130
|
};
|
|
147
131
|
const checkOptionalParameter = (path) => {
|
|
148
132
|
if (!path.match(/\:.+\?$/)) {
|
package/dist/compose.js
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
// src/compose.ts
|
|
2
|
-
import { Context } from "./context.js";
|
|
3
2
|
var compose = (middleware, onError, onNotFound) => {
|
|
4
3
|
return (context, next) => {
|
|
5
4
|
let index = -1;
|
|
6
|
-
const isContext = context instanceof Context;
|
|
7
5
|
return dispatch(0);
|
|
8
6
|
async function dispatch(i) {
|
|
9
7
|
if (i <= index) {
|
|
@@ -15,23 +13,15 @@ var compose = (middleware, onError, onNotFound) => {
|
|
|
15
13
|
let handler;
|
|
16
14
|
if (middleware[i]) {
|
|
17
15
|
handler = middleware[i][0][0];
|
|
18
|
-
|
|
19
|
-
context.req.routeIndex = i;
|
|
20
|
-
}
|
|
16
|
+
context.req.routeIndex = i;
|
|
21
17
|
} else {
|
|
22
18
|
handler = i === middleware.length && next || void 0;
|
|
23
19
|
}
|
|
24
|
-
if (
|
|
25
|
-
if (isContext && context.finalized === false && onNotFound) {
|
|
26
|
-
res = await onNotFound(context);
|
|
27
|
-
}
|
|
28
|
-
} else {
|
|
20
|
+
if (handler) {
|
|
29
21
|
try {
|
|
30
|
-
res = await handler(context, () =>
|
|
31
|
-
return dispatch(i + 1);
|
|
32
|
-
});
|
|
22
|
+
res = await handler(context, () => dispatch(i + 1));
|
|
33
23
|
} catch (err) {
|
|
34
|
-
if (err instanceof Error &&
|
|
24
|
+
if (err instanceof Error && onError) {
|
|
35
25
|
context.error = err;
|
|
36
26
|
res = await onError(err, context);
|
|
37
27
|
isError = true;
|
|
@@ -39,6 +29,10 @@ var compose = (middleware, onError, onNotFound) => {
|
|
|
39
29
|
throw err;
|
|
40
30
|
}
|
|
41
31
|
}
|
|
32
|
+
} else {
|
|
33
|
+
if (context.finalized === false && onNotFound) {
|
|
34
|
+
res = await onNotFound(context);
|
|
35
|
+
}
|
|
42
36
|
}
|
|
43
37
|
if (res && (context.finalized === false || isError)) {
|
|
44
38
|
context.res = res;
|
|
@@ -20,18 +20,31 @@ var buildRequestInitFromRequest = (request) => {
|
|
|
20
20
|
method: request.method,
|
|
21
21
|
body: request.body,
|
|
22
22
|
duplex: request.body ? "half" : void 0,
|
|
23
|
-
headers
|
|
23
|
+
headers,
|
|
24
|
+
signal: request.signal
|
|
24
25
|
};
|
|
25
26
|
};
|
|
27
|
+
var preprocessRequestInit = (requestInit) => {
|
|
28
|
+
if (!requestInit.headers || Array.isArray(requestInit.headers) || requestInit.headers instanceof Headers) {
|
|
29
|
+
return requestInit;
|
|
30
|
+
}
|
|
31
|
+
const headers = new Headers();
|
|
32
|
+
for (const [key, value] of Object.entries(requestInit.headers)) {
|
|
33
|
+
if (value == null) {
|
|
34
|
+
headers.delete(key);
|
|
35
|
+
} else {
|
|
36
|
+
headers.set(key, value);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
requestInit.headers = headers;
|
|
40
|
+
return requestInit;
|
|
41
|
+
};
|
|
26
42
|
var proxy = async (input, proxyInit) => {
|
|
27
43
|
const { raw, ...requestInit } = proxyInit ?? {};
|
|
28
|
-
const req = new Request(
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
...requestInit
|
|
33
|
-
}
|
|
34
|
-
);
|
|
44
|
+
const req = new Request(input, {
|
|
45
|
+
...buildRequestInitFromRequest(raw),
|
|
46
|
+
...preprocessRequestInit(requestInit)
|
|
47
|
+
});
|
|
35
48
|
req.headers.delete("accept-encoding");
|
|
36
49
|
const res = await fetch(req);
|
|
37
50
|
const resHeaders = new Headers(res.headers);
|
|
@@ -43,7 +56,8 @@ var proxy = async (input, proxyInit) => {
|
|
|
43
56
|
resHeaders.delete("content-length");
|
|
44
57
|
}
|
|
45
58
|
return new Response(res.body, {
|
|
46
|
-
|
|
59
|
+
status: res.status,
|
|
60
|
+
statusText: res.statusText,
|
|
47
61
|
headers: resHeaders
|
|
48
62
|
});
|
|
49
63
|
};
|
|
@@ -4,12 +4,17 @@ import { METHOD_NAME_ALL } from "../../router.js";
|
|
|
4
4
|
import { TrieRouter } from "../../router/trie-router/index.js";
|
|
5
5
|
var some = (...middleware) => {
|
|
6
6
|
return async function some2(c, next) {
|
|
7
|
+
let isNextCalled = false;
|
|
8
|
+
const wrappedNext = () => {
|
|
9
|
+
isNextCalled = true;
|
|
10
|
+
return next();
|
|
11
|
+
};
|
|
7
12
|
let lastError;
|
|
8
13
|
for (const handler of middleware) {
|
|
9
14
|
try {
|
|
10
|
-
const result = await handler(c,
|
|
15
|
+
const result = await handler(c, wrappedNext);
|
|
11
16
|
if (result === true && !c.finalized) {
|
|
12
|
-
await
|
|
17
|
+
await wrappedNext();
|
|
13
18
|
} else if (result === false) {
|
|
14
19
|
lastError = new Error("No successful middleware found");
|
|
15
20
|
continue;
|
|
@@ -18,7 +23,9 @@ var some = (...middleware) => {
|
|
|
18
23
|
break;
|
|
19
24
|
} catch (error) {
|
|
20
25
|
lastError = error;
|
|
21
|
-
|
|
26
|
+
if (isNextCalled) {
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
22
29
|
}
|
|
23
30
|
}
|
|
24
31
|
if (lastError) {
|
|
@@ -11,21 +11,32 @@ var RETAINED_304_HEADERS = [
|
|
|
11
11
|
function etagMatches(etag2, ifNoneMatch) {
|
|
12
12
|
return ifNoneMatch != null && ifNoneMatch.split(/,\s*/).indexOf(etag2) > -1;
|
|
13
13
|
}
|
|
14
|
+
function initializeGenerator(generator) {
|
|
15
|
+
if (!generator) {
|
|
16
|
+
if (crypto && crypto.subtle) {
|
|
17
|
+
generator = (body) => crypto.subtle.digest(
|
|
18
|
+
{
|
|
19
|
+
name: "SHA-1"
|
|
20
|
+
},
|
|
21
|
+
body
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return generator;
|
|
26
|
+
}
|
|
14
27
|
var etag = (options) => {
|
|
15
28
|
const retainedHeaders = options?.retainedHeaders ?? RETAINED_304_HEADERS;
|
|
16
29
|
const weak = options?.weak ?? false;
|
|
17
|
-
const generator = options?.generateDigest
|
|
18
|
-
{
|
|
19
|
-
name: "SHA-1"
|
|
20
|
-
},
|
|
21
|
-
body
|
|
22
|
-
));
|
|
30
|
+
const generator = initializeGenerator(options?.generateDigest);
|
|
23
31
|
return async function etag2(c, next) {
|
|
24
32
|
const ifNoneMatch = c.req.header("If-None-Match") ?? null;
|
|
25
33
|
await next();
|
|
26
34
|
const res = c.res;
|
|
27
35
|
let etag3 = res.headers.get("ETag");
|
|
28
36
|
if (!etag3) {
|
|
37
|
+
if (!generator) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
29
40
|
const hash = await generateDigest(res.clone().body, generator);
|
|
30
41
|
if (hash === null) {
|
|
31
42
|
return;
|
package/dist/types/compose.d.ts
CHANGED
|
@@ -1,31 +1,17 @@
|
|
|
1
|
+
import type { Context } from './context';
|
|
1
2
|
import type { Env, ErrorHandler, NotFoundHandler } from './types';
|
|
2
|
-
/**
|
|
3
|
-
* Interface representing the context for a composition operation.
|
|
4
|
-
*/
|
|
5
|
-
interface ComposeContext {
|
|
6
|
-
/**
|
|
7
|
-
* Indicates whether the composition process has been finalized.
|
|
8
|
-
*/
|
|
9
|
-
finalized: boolean;
|
|
10
|
-
/**
|
|
11
|
-
* The result of the composition process. The type is unknown and should be
|
|
12
|
-
* specified based on the context where this interface is used.
|
|
13
|
-
*/
|
|
14
|
-
res: unknown;
|
|
15
|
-
}
|
|
16
3
|
/**
|
|
17
4
|
* Compose middleware functions into a single function based on `koa-compose` package.
|
|
18
5
|
*
|
|
19
|
-
* @template C - The context type.
|
|
20
6
|
* @template E - The environment type.
|
|
21
7
|
*
|
|
22
8
|
* @param {[[Function, unknown], ParamIndexMap | Params][]} middleware - An array of middleware functions and their corresponding parameters.
|
|
23
9
|
* @param {ErrorHandler<E>} [onError] - An optional error handler function.
|
|
24
10
|
* @param {NotFoundHandler<E>} [onNotFound] - An optional not-found handler function.
|
|
25
11
|
*
|
|
26
|
-
* @returns {(context:
|
|
12
|
+
* @returns {(context: Context, next?: Function) => Promise<>} - A composed middleware function.
|
|
27
13
|
*/
|
|
28
|
-
export declare const compose: <
|
|
14
|
+
export declare const compose: <E extends Env = Env>(middleware: [
|
|
29
15
|
[
|
|
30
16
|
Function,
|
|
31
17
|
unknown
|
|
@@ -35,5 +21,4 @@ export declare const compose: <C extends ComposeContext, E extends Env = Env>(mi
|
|
|
35
21
|
[
|
|
36
22
|
Function
|
|
37
23
|
]
|
|
38
|
-
][], onError?: ErrorHandler<E>, onNotFound?: NotFoundHandler<E>) => ((context:
|
|
39
|
-
export {};
|
|
24
|
+
][], onError?: ErrorHandler<E>, onNotFound?: NotFoundHandler<E>) => ((context: Context, next?: Function) => Promise<Context>);
|
|
@@ -15,6 +15,16 @@ export declare const tryDecode: (str: string, decoder: Decoder) => string;
|
|
|
15
15
|
export declare const getPath: (request: Request) => string;
|
|
16
16
|
export declare const getQueryStrings: (url: string) => string;
|
|
17
17
|
export declare const getPathNoStrict: (request: Request) => string;
|
|
18
|
+
/**
|
|
19
|
+
* Merge paths.
|
|
20
|
+
* @param {string[]} ...paths - The paths to merge.
|
|
21
|
+
* @returns {string} The merged path.
|
|
22
|
+
* @example
|
|
23
|
+
* mergePath('/api', '/users') // '/api/users'
|
|
24
|
+
* mergePath('/api/', '/users') // '/api/users'
|
|
25
|
+
* mergePath('/api', '/') // '/api'
|
|
26
|
+
* mergePath('/api/', '/') // '/api/'
|
|
27
|
+
*/
|
|
18
28
|
export declare const mergePath: (...paths: string[]) => string;
|
|
19
29
|
export declare const checkOptionalParameter: (path: string) => string[] | null;
|
|
20
30
|
export declare const getQueryParam: (url: string, key?: string) => string | undefined | Record<string, string>;
|
package/dist/utils/url.js
CHANGED
|
@@ -89,27 +89,11 @@ var getPathNoStrict = (request) => {
|
|
|
89
89
|
const result = getPath(request);
|
|
90
90
|
return result.length > 1 && result.at(-1) === "/" ? result.slice(0, -1) : result;
|
|
91
91
|
};
|
|
92
|
-
var mergePath = (...
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
for (let path of paths) {
|
|
96
|
-
if (p.at(-1) === "/") {
|
|
97
|
-
p = p.slice(0, -1);
|
|
98
|
-
endsWithSlash = true;
|
|
99
|
-
}
|
|
100
|
-
if (path[0] !== "/") {
|
|
101
|
-
path = `/${path}`;
|
|
102
|
-
}
|
|
103
|
-
if (path === "/" && endsWithSlash) {
|
|
104
|
-
p = `${p}/`;
|
|
105
|
-
} else if (path !== "/") {
|
|
106
|
-
p = `${p}${path}`;
|
|
107
|
-
}
|
|
108
|
-
if (path === "/" && p === "") {
|
|
109
|
-
p = "/";
|
|
110
|
-
}
|
|
92
|
+
var mergePath = (base, sub, ...rest) => {
|
|
93
|
+
if (rest.length) {
|
|
94
|
+
sub = mergePath(sub, ...rest);
|
|
111
95
|
}
|
|
112
|
-
return
|
|
96
|
+
return `${base?.[0] === "/" ? "" : "/"}${base}${sub === "/" ? "" : `${base?.at(-1) === "/" ? "" : "/"}${sub?.[0] === "/" ? sub.slice(1) : sub}`}`;
|
|
113
97
|
};
|
|
114
98
|
var checkOptionalParameter = (path) => {
|
|
115
99
|
if (!path.match(/\:.+\?$/)) {
|