@lovrozagar/honey 0.3.3 → 0.3.5
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/README.md +15 -0
- package/dist/client/defaults.d.ts +12 -0
- package/dist/client/defaults.d.ts.map +1 -0
- package/dist/client/http.d.ts +2 -0
- package/dist/client/http.d.ts.map +1 -1
- package/dist/codegen.d.ts.map +1 -1
- package/docs/sdk.md +10 -0
- package/package.json +1 -1
- package/src/client/defaults.ts +47 -0
- package/src/client/http.ts +5 -2
- package/src/codegen.ts +70 -6
package/README.md
CHANGED
|
@@ -1345,6 +1345,13 @@ const client = createClient<typeof app>({
|
|
|
1345
1345
|
onResponse: [async (ctx) => ctx.response],
|
|
1346
1346
|
})
|
|
1347
1347
|
|
|
1348
|
+
/* Browser, same-origin: a path is resolved against location.origin.
|
|
1349
|
+
Omit fetch — the default is the environment fetch, bound for window. */
|
|
1350
|
+
const sameOrigin = createClient<typeof app>({
|
|
1351
|
+
baseURL: "/api",
|
|
1352
|
+
credentials: "include",
|
|
1353
|
+
})
|
|
1354
|
+
|
|
1348
1355
|
const res = await client.get("/api/health")
|
|
1349
1356
|
const created = await client.post("/api/users", { json: { email: "a@b.com", name: "Ada" } })
|
|
1350
1357
|
|
|
@@ -1353,6 +1360,8 @@ client.$path("/api/users/:id", { params: { id: "1" } })
|
|
|
1353
1360
|
const ws = client.ws("/echo-ws", { reconnectToken: "t" })
|
|
1354
1361
|
```
|
|
1355
1362
|
|
|
1363
|
+
`baseURL` may be an absolute `http(s):` / `ws(s):` URL or a same-origin path (`"/api"`). Paths resolve against `location.origin`. Omit `fetch` to use the environment `fetch` (bound for browsers). In Node and Workers without an origin, pass an absolute URL.
|
|
1364
|
+
|
|
1356
1365
|
Per-call options: `json`, `form`, `search`, `params`, `headers`, `cookies`, `timeout`, `signal`, `lastEventId`.
|
|
1357
1366
|
|
|
1358
1367
|
`throwOnError: true` throws `ClientError` subclasses (`BadRequestError`, `UnauthorizedError`, …). `isClientError(e)` is the guard.
|
|
@@ -1379,6 +1388,12 @@ const sdk = new MySDK({
|
|
|
1379
1388
|
invalidation: { staleTime: 5 },
|
|
1380
1389
|
})
|
|
1381
1390
|
|
|
1391
|
+
const browserSdk = new MySDK({
|
|
1392
|
+
baseURL: "/api",
|
|
1393
|
+
credentials: "include",
|
|
1394
|
+
throwOnError: true,
|
|
1395
|
+
})
|
|
1396
|
+
|
|
1382
1397
|
const user = await sdk.createUser({ json: { email: "a@b.com", name: "Ada" } })
|
|
1383
1398
|
```
|
|
1384
1399
|
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare function invalidBaseURLError(baseURL: string): Error;
|
|
2
|
+
/**
|
|
3
|
+
* Honor `config.fetch` as-is. If omitted, bind the environment fetch so storing
|
|
4
|
+
* it on a client field does not throw `Illegal invocation` in browsers.
|
|
5
|
+
*/
|
|
6
|
+
export declare function bindDefaultFetch(custom?: typeof fetch): typeof fetch;
|
|
7
|
+
/**
|
|
8
|
+
* Parse `baseURL`. Absolute `http(s):` / `ws(s):` URLs are unchanged. Path-only
|
|
9
|
+
* values such as `/api` resolve against `location.origin` when present.
|
|
10
|
+
*/
|
|
11
|
+
export declare function parseClientBaseURL(baseURL: string): URL;
|
|
12
|
+
//# sourceMappingURL=defaults.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/client/defaults.ts"],"names":[],"mappings":"AAGA,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAI1D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,OAAO,KAAK,GAAG,OAAO,KAAK,CAIpE;AAcD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAWvD"}
|
package/dist/client/http.d.ts
CHANGED
|
@@ -36,9 +36,11 @@ export type OnResponseContext = {
|
|
|
36
36
|
url: string;
|
|
37
37
|
};
|
|
38
38
|
export type ClientConfig = {
|
|
39
|
+
/** Absolute `http(s):` / `ws(s):` URL, or a same-origin path such as `"/api"`. */
|
|
39
40
|
baseURL: string;
|
|
40
41
|
buildSearchParams?: (query: Record<string, unknown>) => URLSearchParams;
|
|
41
42
|
credentials?: RequestCredentials;
|
|
43
|
+
/** Defaults to the environment `fetch`, bound so it is safe to call in browsers. */
|
|
42
44
|
fetch?: typeof fetch;
|
|
43
45
|
headers?: HeadersInit;
|
|
44
46
|
mode?: RequestMode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/client/http.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/client/http.ts"],"names":[],"mappings":"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"}
|
package/dist/codegen.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../src/codegen.ts"],"names":[],"mappings":"AAOA,OAAO,EACN,KAAK,qBAAqB,EAG1B,MAAM,uBAAuB,CAAA;AAY9B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,KAAK,EAAgB,QAAQ,EAAE,MAAM,WAAW,CAAA;AAcvD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,YAAY,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AACxF,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AA8NnD,KAAK,UAAU,GAAG;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,KAAK,kBAAkB,GAAG;IACzB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,KAAK,aAAa,GAAG;IACpB,MAAM,EAAE,UAAU,EAAE,CAAA;IACpB,MAAM,EAAE,kBAAkB,EAAE,CAAA;CAC5B,CAAA;AAED,KAAK,WAAW,GAAG;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACzB,UAAU,CAAC,EAAE;QACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;QACjD,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KACzC,CAAA;IACD,IAAI,EAAE,WAAW,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;CAC9D,CAAA;AAgHD,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAyB7D,CAAA;AAmCD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"codegen.d.ts","sourceRoot":"","sources":["../src/codegen.ts"],"names":[],"mappings":"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"}
|
package/docs/sdk.md
CHANGED
|
@@ -61,6 +61,16 @@ const sdk = new MockSDK({
|
|
|
61
61
|
})
|
|
62
62
|
```
|
|
63
63
|
|
|
64
|
+
In a browser, `baseURL` may be a same-origin path. It resolves against `location.origin`. Omit `fetch` — the default is the environment `fetch`, bound so it is safe to call on `window`. In Node and Workers without an origin, pass an absolute `http(s):` or `ws(s):` URL.
|
|
65
|
+
|
|
66
|
+
```ts
|
|
67
|
+
const browserSdk = new MockSDK({
|
|
68
|
+
baseURL: "/api",
|
|
69
|
+
credentials: "include",
|
|
70
|
+
throwOnError: true,
|
|
71
|
+
})
|
|
72
|
+
```
|
|
73
|
+
|
|
64
74
|
```py
|
|
65
75
|
sdk = AsyncSDK(ClientConfig(
|
|
66
76
|
base_url=BASE_URL,
|
package/package.json
CHANGED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/** Absolute client bases: http(s) and ws(s). Case-insensitive per WHATWG. */
|
|
2
|
+
const ABSOLUTE_CLIENT_URL = /^(?:https?|wss?):\/\//i
|
|
3
|
+
|
|
4
|
+
export function invalidBaseURLError(baseURL: string): Error {
|
|
5
|
+
return new Error(
|
|
6
|
+
`Invalid baseURL ${JSON.stringify(baseURL)}: expected an absolute http(s): or ws(s): URL. Path-only values such as "/api" resolve against location.origin in browsers.`,
|
|
7
|
+
)
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Honor `config.fetch` as-is. If omitted, bind the environment fetch so storing
|
|
12
|
+
* it on a client field does not throw `Illegal invocation` in browsers.
|
|
13
|
+
*/
|
|
14
|
+
export function bindDefaultFetch(custom?: typeof fetch): typeof fetch {
|
|
15
|
+
if (custom) return custom
|
|
16
|
+
const nativeFetch = globalThis.fetch
|
|
17
|
+
return typeof nativeFetch === "function" ? nativeFetch.bind(globalThis) : (nativeFetch as typeof fetch)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function currentLocationOrigin(): string | undefined {
|
|
21
|
+
let origin: unknown
|
|
22
|
+
try {
|
|
23
|
+
origin = globalThis.location?.origin
|
|
24
|
+
} catch {
|
|
25
|
+
return undefined
|
|
26
|
+
}
|
|
27
|
+
if (typeof origin !== "string" || origin === "" || origin === "null") return undefined
|
|
28
|
+
if (!ABSOLUTE_CLIENT_URL.test(origin)) return undefined
|
|
29
|
+
return origin
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Parse `baseURL`. Absolute `http(s):` / `ws(s):` URLs are unchanged. Path-only
|
|
34
|
+
* values such as `/api` resolve against `location.origin` when present.
|
|
35
|
+
*/
|
|
36
|
+
export function parseClientBaseURL(baseURL: string): URL {
|
|
37
|
+
if (ABSOLUTE_CLIENT_URL.test(baseURL)) return new URL(baseURL)
|
|
38
|
+
const origin = currentLocationOrigin()
|
|
39
|
+
if (origin !== undefined) {
|
|
40
|
+
try {
|
|
41
|
+
return new URL(baseURL, origin)
|
|
42
|
+
} catch {
|
|
43
|
+
throw invalidBaseURLError(baseURL)
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
throw invalidBaseURLError(baseURL)
|
|
47
|
+
}
|
package/src/client/http.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bindDefaultFetch, parseClientBaseURL } from "./defaults.ts"
|
|
1
2
|
import { ClientError } from "./error.ts"
|
|
2
3
|
import type { SSEEvent } from "./sse.ts"
|
|
3
4
|
import { parseSSEStream } from "./sse.ts"
|
|
@@ -45,9 +46,11 @@ export type OnResponseContext = {
|
|
|
45
46
|
}
|
|
46
47
|
|
|
47
48
|
export type ClientConfig = {
|
|
49
|
+
/** Absolute `http(s):` / `ws(s):` URL, or a same-origin path such as `"/api"`. */
|
|
48
50
|
baseURL: string
|
|
49
51
|
buildSearchParams?: (query: Record<string, unknown>) => URLSearchParams
|
|
50
52
|
credentials?: RequestCredentials
|
|
53
|
+
/** Defaults to the environment `fetch`, bound so it is safe to call in browsers. */
|
|
51
54
|
fetch?: typeof fetch
|
|
52
55
|
headers?: HeadersInit
|
|
53
56
|
mode?: RequestMode
|
|
@@ -120,7 +123,7 @@ function buildURL(config: ClientConfig, path: string, opts: RequestOptions): str
|
|
|
120
123
|
let resolvedPath = path
|
|
121
124
|
if (opts.params) resolvedPath = interpolatePath(path, opts.params)
|
|
122
125
|
|
|
123
|
-
const baseUrl =
|
|
126
|
+
const baseUrl = parseClientBaseURL(config.baseURL)
|
|
124
127
|
const basePath = baseUrl.pathname.endsWith("/") ? baseUrl.pathname : `${baseUrl.pathname}/`
|
|
125
128
|
const relative = resolvedPath.startsWith("/") ? resolvedPath.slice(1) : resolvedPath
|
|
126
129
|
const url = new URL(`${basePath}${relative}`, baseUrl)
|
|
@@ -222,7 +225,7 @@ export class HTTPClient {
|
|
|
222
225
|
|
|
223
226
|
constructor(config: ClientConfig) {
|
|
224
227
|
this._config = config
|
|
225
|
-
this._fetch = config.fetch
|
|
228
|
+
this._fetch = bindDefaultFetch(config.fetch)
|
|
226
229
|
}
|
|
227
230
|
|
|
228
231
|
private async _doRequest(
|
package/src/codegen.ts
CHANGED
|
@@ -487,6 +487,32 @@ function stripInternalProps(schema: Record<string, unknown>): Record<string, unk
|
|
|
487
487
|
return result
|
|
488
488
|
}
|
|
489
489
|
|
|
490
|
+
const BINARY_FORM_FORMATS = new Set(["binary", "byte", "file"])
|
|
491
|
+
|
|
492
|
+
/** File parts cannot ride application/x-www-form-urlencoded. */
|
|
493
|
+
function isBinaryFormPart(schema: Record<string, unknown> | undefined): boolean {
|
|
494
|
+
if (!schema) return false
|
|
495
|
+
const format = schema.format
|
|
496
|
+
if (typeof format === "string" && BINARY_FORM_FORMATS.has(format)) return true
|
|
497
|
+
if (schema.type === "file") return true
|
|
498
|
+
if (schema.type === "array") {
|
|
499
|
+
const items = schema.items
|
|
500
|
+
if (items !== null && typeof items === "object" && !Array.isArray(items)) {
|
|
501
|
+
return isBinaryFormPart(items as Record<string, unknown>)
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
return false
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
function formSchemaHasBinaryPart(schema: Record<string, unknown>): boolean {
|
|
508
|
+
const props = schema.properties as Record<string, Record<string, unknown>> | undefined
|
|
509
|
+
if (!props) return false
|
|
510
|
+
for (const prop of Object.values(props)) {
|
|
511
|
+
if (isBinaryFormPart(prop)) return true
|
|
512
|
+
}
|
|
513
|
+
return false
|
|
514
|
+
}
|
|
515
|
+
|
|
490
516
|
export function canonicalizeSchema(schema: Record<string, unknown>): string {
|
|
491
517
|
return JSON.stringify(schema, (_, value) => {
|
|
492
518
|
if (value && typeof value === "object" && !Array.isArray(value)) {
|
|
@@ -1143,6 +1169,10 @@ function zodDefToJsonSchema(schema: unknown, depth = 0): Record<string, unknown>
|
|
|
1143
1169
|
case "ZodDate":
|
|
1144
1170
|
case "date":
|
|
1145
1171
|
return { format: "date-time", type: "string" }
|
|
1172
|
+
case "ZodFile":
|
|
1173
|
+
case "file":
|
|
1174
|
+
/* so form emit can see format:binary when toJSONSchema is unavailable */
|
|
1175
|
+
return { contentEncoding: "binary", format: "binary", type: "string" }
|
|
1146
1176
|
case "ZodNull":
|
|
1147
1177
|
case "null":
|
|
1148
1178
|
return { type: "null" }
|
|
@@ -1563,14 +1593,24 @@ export async function generateOpenApi<TEnv, TCtx, TMeta = unknown>(
|
|
|
1563
1593
|
if (handler.iv) {
|
|
1564
1594
|
for (const [source, entry] of Object.entries(handler.iv)) {
|
|
1565
1595
|
if (entry === undefined) continue
|
|
1566
|
-
|
|
1567
|
-
|
|
1596
|
+
/* readableStream() is a runtime tag; the document describes the inner schema */
|
|
1597
|
+
const unwrapped = unwrapEntry(entry as InputSchemaEntry)
|
|
1568
1598
|
const jsonSchema = asJsonSchema(unwrapped, "input")
|
|
1569
1599
|
|
|
1570
1600
|
if (source === "json" || source === "form") {
|
|
1571
|
-
const
|
|
1601
|
+
const schema = stripInternalProps(jsonSchema)
|
|
1602
|
+
const content: Record<string, { schema: Record<string, unknown> }> = {}
|
|
1603
|
+
if (source === "form") {
|
|
1604
|
+
/* z.file() is format:binary — illegal on urlencoded; oat only builds FormData for multipart/* */
|
|
1605
|
+
if (formSchemaHasBinaryPart(schema)) {
|
|
1606
|
+
content["multipart/form-data"] = { schema }
|
|
1607
|
+
}
|
|
1608
|
+
content["application/x-www-form-urlencoded"] = { schema }
|
|
1609
|
+
} else {
|
|
1610
|
+
content["application/json"] = { schema }
|
|
1611
|
+
}
|
|
1572
1612
|
operation.requestBody = {
|
|
1573
|
-
content
|
|
1613
|
+
content,
|
|
1574
1614
|
required: true,
|
|
1575
1615
|
}
|
|
1576
1616
|
} else if (source === "search" || source === "headers" || source === "cookies") {
|
|
@@ -3349,6 +3389,7 @@ function buildSDKClient(sdkName: string, stem: string): string {
|
|
|
3349
3389
|
sdkClientLookupStale(),
|
|
3350
3390
|
sdkClientCreateTypedWebSocket(),
|
|
3351
3391
|
sdkClientSerializeSearch(),
|
|
3392
|
+
sdkClientResolveBaseURL(),
|
|
3352
3393
|
sdkClientBuildURL(),
|
|
3353
3394
|
sdkClientBuildHeaders(),
|
|
3354
3395
|
sdkClientDoRequest(),
|
|
@@ -4072,7 +4113,7 @@ function sdkClientConstructor(n: string): string {
|
|
|
4072
4113
|
\t\tconst ownState = config.state ?? {}
|
|
4073
4114
|
\t\tthis.state = ownState
|
|
4074
4115
|
\t\tthis.#config = { ...config, state: ownState }
|
|
4075
|
-
\t\tthis.#fetchFn = config.fetch ?? globalThis.fetch
|
|
4116
|
+
\t\tthis.#fetchFn = config.fetch ?? (typeof globalThis.fetch === "function" ? globalThis.fetch.bind(globalThis) : globalThis.fetch)
|
|
4076
4117
|
\t\tthis.#searchSerializer = config.buildSearchParams ?? ((q: Record<string, unknown>) => this.#serializeSearch(q))
|
|
4077
4118
|
\t\tthis.#staleTime = config.invalidation?.staleTime ?? 0
|
|
4078
4119
|
\t\tthis.#staleUntil = this.#staleTime > 0
|
|
@@ -4379,12 +4420,35 @@ function sdkClientSerializeSearch(): string {
|
|
|
4379
4420
|
`
|
|
4380
4421
|
}
|
|
4381
4422
|
|
|
4423
|
+
/* Keep in sync with client/defaults.ts — generated SDKs have zero runtime imports. */
|
|
4424
|
+
function sdkClientResolveBaseURL(): string {
|
|
4425
|
+
return `
|
|
4426
|
+
#resolveBaseURL(baseURL: string): URL {
|
|
4427
|
+
if (/^(?:https?|wss?):\\/\\//i.test(baseURL)) return new URL(baseURL)
|
|
4428
|
+
let origin: unknown
|
|
4429
|
+
try {
|
|
4430
|
+
origin = globalThis.location?.origin
|
|
4431
|
+
} catch {
|
|
4432
|
+
origin = undefined
|
|
4433
|
+
}
|
|
4434
|
+
if (typeof origin === "string" && origin !== "" && origin !== "null" && /^(?:https?|wss?):\\/\\//i.test(origin)) {
|
|
4435
|
+
try {
|
|
4436
|
+
return new URL(baseURL, origin)
|
|
4437
|
+
} catch {
|
|
4438
|
+
throw new Error(\`Invalid baseURL \${JSON.stringify(baseURL)}: expected an absolute http(s): or ws(s): URL. Path-only values such as "/api" resolve against location.origin in browsers.\`)
|
|
4439
|
+
}
|
|
4440
|
+
}
|
|
4441
|
+
throw new Error(\`Invalid baseURL \${JSON.stringify(baseURL)}: expected an absolute http(s): or ws(s): URL. Path-only values such as "/api" resolve against location.origin in browsers.\`)
|
|
4442
|
+
}
|
|
4443
|
+
`
|
|
4444
|
+
}
|
|
4445
|
+
|
|
4382
4446
|
function sdkClientBuildURL(): string {
|
|
4383
4447
|
return `
|
|
4384
4448
|
\t#buildURL(path: string, opts: _RequestOptions): string {
|
|
4385
4449
|
\t\tlet resolvedPath = path
|
|
4386
4450
|
\t\tif (opts.params) resolvedPath = this.#interpolatePath(path, opts.params)
|
|
4387
|
-
\t\tconst baseUrl =
|
|
4451
|
+
\t\tconst baseUrl = this.#resolveBaseURL(this.#config.baseURL)
|
|
4388
4452
|
\t\tconst basePath = baseUrl.pathname.endsWith("/") ? baseUrl.pathname : \`\${baseUrl.pathname}/\`
|
|
4389
4453
|
\t\tconst relative = resolvedPath.startsWith("/") ? resolvedPath.slice(1) : resolvedPath
|
|
4390
4454
|
\t\tconst url = new URL(\`\${basePath}\${relative}\`, baseUrl)
|