Skip to content

Commit c053752

Browse files
committed
feat: Added h3 package, changed useQuery typing
1 parent 81d6a6f commit c053752

File tree

10 files changed

+188
-1
lines changed

10 files changed

+188
-1
lines changed

.changeset/witty-emus-thank.md

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@backhooks/hooks": minor
3+
"@backhooks/h3": patch
4+
---
5+
6+
Added h3 package, changed useQuery typing

package-lock.json

+27
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
"packages/hooks",
1515
"packages/express",
1616
"packages/fastify",
17+
"packages/h3",
1718
"packages/examples"
1819
],
1920
"devDependencies": {

packages/h3/.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
dist
2+
node_modules

packages/h3/jest.config.js

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
/** @type {import('ts-jest').JestConfigWithTsJest} */
2+
module.exports = {
3+
preset: "ts-jest",
4+
testEnvironment: "node",
5+
};

packages/h3/package.json

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"name": "@backhooks/h3",
3+
"version": "0.0.1",
4+
"scripts": {
5+
"build": "tsc",
6+
"test": "jest"
7+
},
8+
"main": "dist/index.js",
9+
"peerDependencies": {
10+
"h3": "^1.0.0"
11+
},
12+
"dependencies": {
13+
"@backhooks/core": "^0.3.0",
14+
"@backhooks/hooks": "^0.2.0"
15+
},
16+
"devDependencies": {
17+
"supertest": "^6.3.3"
18+
}
19+
}

packages/h3/src/index.ts

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import {
2+
getHeaders,
3+
readBody,
4+
H3Event,
5+
App,
6+
getRouterParams,
7+
getQuery,
8+
} from "h3";
9+
import { setBody, setHeaders, setParams, setQuery } from "@backhooks/hooks";
10+
import { runHookContext } from "@backhooks/core";
11+
12+
export const makeHookableApp = (h3App: App) => {
13+
const originalHandler = h3App.handler;
14+
h3App.handler = async (event: H3Event) => {
15+
return runHookContext(() => {
16+
const headers = getHeaders(event);
17+
setHeaders(() => {
18+
return {
19+
headers,
20+
};
21+
});
22+
setBody(() => {
23+
return {
24+
fetch() {
25+
return readBody(event);
26+
},
27+
};
28+
});
29+
setParams(() => {
30+
return {
31+
fetch() {
32+
const params = getRouterParams(event);
33+
console.log(params);
34+
return params;
35+
},
36+
};
37+
});
38+
setQuery(() => {
39+
return {
40+
query: getQuery(event),
41+
};
42+
});
43+
return originalHandler(event);
44+
});
45+
};
46+
};

packages/h3/tests/index.spec.ts

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import { useBody, useHeaders, useParams, useQuery } from "@backhooks/hooks";
2+
import * as supertest from "supertest";
3+
import { SuperTest, Test } from "supertest";
4+
import { App, toNodeListener, createApp, eventHandler, createRouter } from "h3";
5+
import { makeHookableApp } from "../src";
6+
7+
let app: App;
8+
let request: SuperTest<Test>;
9+
10+
beforeEach(() => {
11+
app = createApp({ debug: true });
12+
makeHookableApp(app);
13+
request = supertest(toNodeListener(app));
14+
});
15+
16+
test("useBody", async () => {
17+
app.use(
18+
"/body",
19+
eventHandler(() => {
20+
const body = useBody();
21+
return body;
22+
})
23+
);
24+
25+
const res = await request.post("/body").send({
26+
foo: "bar",
27+
});
28+
29+
expect(res.body.foo).toBe("bar");
30+
});
31+
32+
test("useHeaders", async () => {
33+
app.use(
34+
"/headers",
35+
eventHandler(() => {
36+
const headers = useHeaders();
37+
return headers;
38+
})
39+
);
40+
const res = await request.get("/headers").send().set({
41+
foo: "bar",
42+
});
43+
expect(res.body.foo).toBe("bar");
44+
});
45+
46+
test("useParams", async () => {
47+
const router = createRouter();
48+
router.get(
49+
"/:foo",
50+
eventHandler(() => {
51+
const params = useParams();
52+
return params;
53+
})
54+
);
55+
app.use(router);
56+
const res = await request.get("/bar").send();
57+
expect(res.body.foo).toBe("bar");
58+
});
59+
60+
test("useQuery", async () => {
61+
app.use(
62+
"/",
63+
eventHandler(() => {
64+
const query = useQuery();
65+
return query;
66+
})
67+
);
68+
const res = await request.get("/?foo=bar").send();
69+
expect(res.body.foo).toBe("bar");
70+
});

packages/h3/tsconfig.json

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"compilerOptions": {
3+
"strict": true,
4+
"outDir": "dist",
5+
"declaration": true,
6+
"lib": ["WebWorker"]
7+
},
8+
"include": ["src/**/*"],
9+
"exclude": ["node_modules", "**/*.spec.ts"]
10+
}

packages/hooks/src/useQuery.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import { createHook } from "@backhooks/core";
22

3+
type QueryValue = string | undefined | null;
34
interface ParsedQs {
4-
[key: string]: undefined | string | string[] | ParsedQs | ParsedQs[];
5+
[key: string]: ParsedQs | ParsedQs[] | QueryValue | QueryValue[];
56
}
67

78
export interface QueryHookState {

0 commit comments

Comments
 (0)