htmx-router 2.0.0 → 2.0.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/cookies.d.ts +1 -1
- package/cookies.js +3 -2
- package/internal/request/server.d.ts +1 -5
- package/internal/request/server.js +4 -7
- package/package.json +1 -1
- package/internal/request/http.d.ts +0 -13
- package/internal/request/http.js +0 -43
- package/internal/request/native.d.ts +0 -20
- package/internal/request/native.js +0 -61
package/cookies.d.ts
CHANGED
|
@@ -24,7 +24,7 @@ export declare class Cookies {
|
|
|
24
24
|
has(name: string): boolean;
|
|
25
25
|
set(name: string, value: string, options?: CookieOptions): void;
|
|
26
26
|
private string;
|
|
27
|
-
unset(name: string): void;
|
|
27
|
+
unset(name: string, options?: CookieOptions): void;
|
|
28
28
|
/** Creates the response headers required to make the changes done to these cookies */
|
|
29
29
|
export(): string[];
|
|
30
30
|
}
|
package/cookies.js
CHANGED
|
@@ -55,9 +55,10 @@ export class Cookies {
|
|
|
55
55
|
return encodeURIComponent(name) + "=" + encodeURIComponent(this.map[name]) + StringifyOptions(this.config[name]);
|
|
56
56
|
;
|
|
57
57
|
}
|
|
58
|
-
unset(name) {
|
|
58
|
+
unset(name, options = { maxAge: -1 }) {
|
|
59
|
+
options.maxAge ||= -1;
|
|
59
60
|
this.parse();
|
|
60
|
-
return this.set(name, "",
|
|
61
|
+
return this.set(name, "", options);
|
|
61
62
|
}
|
|
62
63
|
/** Creates the response headers required to make the changes done to these cookies */
|
|
63
64
|
export() {
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { ViteDevServer } from "vite";
|
|
2
|
-
import { connectToWeb } from "./compatibility/vite/connectToWeb.js";
|
|
3
2
|
import { GenericContext } from "../router.js";
|
|
4
3
|
import { RouterModule } from "./index.js";
|
|
5
4
|
export type Config = {
|
|
@@ -11,10 +10,7 @@ type ServerBindType = "pre" | "post";
|
|
|
11
10
|
type ServerBind = (ctx: GenericContext) => Promise<Response | null> | Response | null;
|
|
12
11
|
export declare class HtmxRouterServer {
|
|
13
12
|
#private;
|
|
14
|
-
readonly vite:
|
|
15
|
-
handler: ReturnType<typeof connectToWeb>;
|
|
16
|
-
server: Config["viteDevServer"];
|
|
17
|
-
} | null;
|
|
13
|
+
readonly vite: Config["viteDevServer"];
|
|
18
14
|
readonly render: Config["render"];
|
|
19
15
|
readonly build: Config["build"];
|
|
20
16
|
constructor(config: Config);
|
|
@@ -21,18 +21,15 @@ export class HtmxRouterServer {
|
|
|
21
21
|
build;
|
|
22
22
|
#binding;
|
|
23
23
|
constructor(config) {
|
|
24
|
-
this.vite = config.viteDevServer
|
|
25
|
-
handler: connectToWeb(config.viteDevServer.middlewares),
|
|
26
|
-
server: config.viteDevServer
|
|
27
|
-
} : null;
|
|
24
|
+
this.vite = config.viteDevServer;
|
|
28
25
|
this.render = config.render;
|
|
29
26
|
this.build = config.build;
|
|
30
27
|
this.#binding = {
|
|
31
28
|
pre: [UrlCleaner],
|
|
32
29
|
post: []
|
|
33
30
|
};
|
|
34
|
-
if (
|
|
35
|
-
const handler = connectToWeb(
|
|
31
|
+
if (this.vite) {
|
|
32
|
+
const handler = connectToWeb(this.vite.middlewares);
|
|
36
33
|
this.#binding.post.push(handler);
|
|
37
34
|
}
|
|
38
35
|
}
|
|
@@ -108,7 +105,7 @@ export class HtmxRouterServer {
|
|
|
108
105
|
}
|
|
109
106
|
catch (e) {
|
|
110
107
|
if (e instanceof Error)
|
|
111
|
-
this.vite?.
|
|
108
|
+
this.vite?.ssrFixStacktrace(e);
|
|
112
109
|
console.error(e);
|
|
113
110
|
response = await tree.unwrap(ctx, e);
|
|
114
111
|
}
|
package/package.json
CHANGED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type { IncomingMessage, ServerResponse } from "http";
|
|
2
|
-
import type { ViteDevServer } from "vite";
|
|
3
|
-
import { GenericContext } from "../router.js";
|
|
4
|
-
type Config = {
|
|
5
|
-
build: Promise<any> | (() => Promise<Record<string, any>>);
|
|
6
|
-
viteDevServer: ViteDevServer | null;
|
|
7
|
-
render: GenericContext["render"];
|
|
8
|
-
};
|
|
9
|
-
/**
|
|
10
|
-
* @deprecated
|
|
11
|
-
*/
|
|
12
|
-
export declare function createRequestHandler(config: Config): (req: IncomingMessage, res: ServerResponse) => Promise<void>;
|
|
13
|
-
export {};
|
package/internal/request/http.js
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { ServerOnlyWarning } from "../util.js";
|
|
2
|
-
ServerOnlyWarning("http-request");
|
|
3
|
-
import { CreateRequest } from "./compatibility/node.js";
|
|
4
|
-
import { Resolve } from "./native.js";
|
|
5
|
-
/**
|
|
6
|
-
* @deprecated
|
|
7
|
-
*/
|
|
8
|
-
export function createRequestHandler(config) {
|
|
9
|
-
return async (req, res) => {
|
|
10
|
-
try {
|
|
11
|
-
const mod = typeof config.build === "function" ? await config.build() : await config.build;
|
|
12
|
-
const request = CreateRequest(req);
|
|
13
|
-
let { response, headers } = await Resolve(request, mod.tree, config);
|
|
14
|
-
res.writeHead(response.status, headers);
|
|
15
|
-
if (response.body instanceof ReadableStream) {
|
|
16
|
-
const reader = response.body.getReader();
|
|
17
|
-
while (true) {
|
|
18
|
-
const { done, value } = await reader.read();
|
|
19
|
-
if (done)
|
|
20
|
-
break;
|
|
21
|
-
res.write(value); // `value` is a Uint8Array.
|
|
22
|
-
}
|
|
23
|
-
res.end();
|
|
24
|
-
}
|
|
25
|
-
else {
|
|
26
|
-
const rendered = await response.text();
|
|
27
|
-
res.end(rendered);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
catch (e) {
|
|
31
|
-
res.statusCode = 500;
|
|
32
|
-
if (e instanceof Error) {
|
|
33
|
-
console.error(e.stack);
|
|
34
|
-
config.viteDevServer?.ssrFixStacktrace(e);
|
|
35
|
-
res.end(e.stack);
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
console.error(e);
|
|
39
|
-
res.end(String(e));
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type { Config } from './index.js';
|
|
2
|
-
import type { RouteTree } from '../../router.js';
|
|
3
|
-
/**
|
|
4
|
-
* @deprecated
|
|
5
|
-
*/
|
|
6
|
-
export declare function createRequestHandler(config: Config): (req: Request) => Promise<{
|
|
7
|
-
response: Response;
|
|
8
|
-
headers: {
|
|
9
|
-
[key: string]: string | string[];
|
|
10
|
-
};
|
|
11
|
-
}>;
|
|
12
|
-
/**
|
|
13
|
-
* @deprecated
|
|
14
|
-
*/
|
|
15
|
-
export declare function Resolve(request: Request, tree: RouteTree, config: Config): Promise<{
|
|
16
|
-
response: Response;
|
|
17
|
-
headers: {
|
|
18
|
-
[key: string]: string | string[];
|
|
19
|
-
};
|
|
20
|
-
}>;
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { ServerOnlyWarning } from "../util.js";
|
|
2
|
-
ServerOnlyWarning("native-request");
|
|
3
|
-
import { GenericContext } from "../router.js";
|
|
4
|
-
import { MakeStatus } from "../../status.js";
|
|
5
|
-
/**
|
|
6
|
-
* @deprecated
|
|
7
|
-
*/
|
|
8
|
-
export function createRequestHandler(config) {
|
|
9
|
-
return async (req) => {
|
|
10
|
-
const mod = typeof config.build === "function" ? await config.build() : await config.build;
|
|
11
|
-
return await Resolve(req, mod.tree, config);
|
|
12
|
-
};
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* @deprecated
|
|
16
|
-
*/
|
|
17
|
-
export async function Resolve(request, tree, config) {
|
|
18
|
-
const ctx = new GenericContext(request, new URL(request.url), config.render);
|
|
19
|
-
let response;
|
|
20
|
-
try {
|
|
21
|
-
const x = ctx.url.pathname.slice(1);
|
|
22
|
-
if (x.endsWith("/")) {
|
|
23
|
-
ctx.headers.set("location", ctx.url.pathname.slice(0, -1) + ctx.url.search + ctx.url.hash);
|
|
24
|
-
response = new Response("", MakeStatus("Permanent Redirect", { headers: ctx.headers }));
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
const fragments = x === "" ? [] : x.split("/");
|
|
28
|
-
const res = await tree.resolve(fragments, ctx);
|
|
29
|
-
response = res === null
|
|
30
|
-
? new Response("No Route Found", MakeStatus("Not Found", ctx.headers))
|
|
31
|
-
: res;
|
|
32
|
-
}
|
|
33
|
-
// Override with context headers
|
|
34
|
-
if (response.headers !== ctx.headers) {
|
|
35
|
-
for (const [key, value] of ctx.headers) {
|
|
36
|
-
if (key === "content-type")
|
|
37
|
-
continue;
|
|
38
|
-
response.headers.set(key, value);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
catch (e) {
|
|
43
|
-
if (e instanceof Error) {
|
|
44
|
-
console.error(e.stack);
|
|
45
|
-
config.viteDevServer?.ssrFixStacktrace(e);
|
|
46
|
-
response = new Response(e.message + "\n" + e.stack, { status: 500, statusText: "Internal Server Error" });
|
|
47
|
-
}
|
|
48
|
-
else {
|
|
49
|
-
console.error(e);
|
|
50
|
-
response = new Response(String(e), { status: 500, statusText: "Internal Server Error" });
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
// Merge cookie changes
|
|
54
|
-
const headers = Object.fromEntries(response.headers);
|
|
55
|
-
const cookies = ctx.cookie.export();
|
|
56
|
-
if (cookies.length > 0) {
|
|
57
|
-
headers['set-cookie'] = cookies;
|
|
58
|
-
response.headers.set("Set-Cookie", cookies[0]); // Response object doesn't support multi-header..[]
|
|
59
|
-
}
|
|
60
|
-
return { response, headers };
|
|
61
|
-
}
|