Skip to content

Commit c8ec8cd

Browse files
committed
improve codebase a bit
1 parent 2e62b3a commit c8ec8cd

24 files changed

+266
-183
lines changed

.devcontainer/devcontainer.json

Lines changed: 8 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,20 @@
1-
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
2-
// README at: https://github.com/devcontainers/templates/tree/main/src/typescript-node
31
{
42
"name": "Node.js & TypeScript",
5-
// Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile
63
"image": "mcr.microsoft.com/devcontainers/typescript-node:1-22-bookworm",
74
"features": {
8-
"ghcr.io/devcontainers/features/node:1": {},
9-
"ghcr.io/devcontainers/features/common-utils:2": {}
5+
"ghcr.io/devcontainers/features/common-utils:2": {},
6+
"ghcr.io/devcontainers-community/features/deno:1": {}
107
},
11-
12-
// Features to add to the dev container. More info: https://containers.dev/features.
13-
// "features": {},
14-
15-
// Use 'forwardPorts' to make a list of ports inside the container available locally.
16-
// "forwardPorts": [],
17-
18-
// Use 'postCreateCommand' to run commands after the container is created.
198
"postCreateCommand": "npm install",
9+
"postStartCommand": "deno task start",
2010
"customizations": {
2111
"vscode": {
12+
"extensions": ["unifiedjs.vscode-mdx", "denoland.vscode-deno"],
2213
"settings": {
23-
"terminal.integrated.defaultProfile.linux": "zsh"
24-
},
25-
"extensions": [
26-
"esbenp.prettier-vscode",
27-
"astro-build.astro-vscode",
28-
"unifiedjs.vscode-mdx",
29-
"bradlc.vscode-tailwindcss"
30-
]
14+
"terminal.integrated.defaultProfile.linux": "zsh",
15+
"editor.defaultFormatter": "denoland.vscode-deno",
16+
"deno.enable": true
17+
}
3118
}
3219
}
33-
34-
// Configure tool-specific properties.
35-
// "customizations": {},
36-
37-
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root.
38-
// "remoteUser": "root"
3920
}

.gitattributes

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
static/public/infima.css linguist-vendored
2+
static/public/pocketbase.umd.js linguist-vendored

.github/dependabot.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
version: 2
88
updates:
9-
- package-ecosystem: "devcontainers"
10-
directory: "/"
11-
schedule:
12-
interval: weekly
9+
- package-ecosystem: 'devcontainers'
10+
directory: '/'
11+
schedule:
12+
interval: weekly

README.md

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,60 @@
11
# Protected docs
22

3-
This is an example on how to restrict access to a documentation website written with [`docusaurus`](https://docusaurus.io/).
3+
This is an example on how to restrict access to a documentation website written
4+
with [`docusaurus`](https://docusaurus.io/).
45

56
## Details
67

7-
The implementation uses vercels ["middleware"](./middleware.ts) to check each request for the correct authentication data. For user management and authentication, a [`PocketBase`](https://pocketbase.io/) instance is used.
8+
The implementation uses vercels ["middleware"](./middleware.ts) to check each
9+
request for the correct authentication data. For user management and
10+
authentication, a [`PocketBase`](https://pocketbase.io/) instance is used.
811

912
## Considerations
1013

11-
It is important to note that at least with `docusaurus`, one cannot protect individual routes. This is because once one route has been opened, `docusaurus` behaves like a SPA and greedily loads all the content into the client. No way to disentangle that js-blob.
14+
It is important to note that at least with `docusaurus`, one cannot protect
15+
individual routes. This is because once one route has been opened, `docusaurus`
16+
behaves like a SPA and greedily loads all the content into the client. No way to
17+
disentangle that js-blob.
1218

13-
In this implementation, anybody can sign up and then immediately see the content. That is kinda pointless of course. It is possible to check for roles or attributes on the users. For example one could adjust the middleware like so:
19+
In this implementation, anybody can sign up and then immediately see the
20+
content. That is kinda pointless of course. It is possible to check for roles or
21+
attributes on the users. For example one could adjust the middleware like so:
1422

1523
```typescript
1624
// middleware.ts
17-
import PocketBase from "pocketbase";
18-
import { next, rewrite } from "@vercel/edge";
25+
import PocketBase from 'pocketbase'
26+
import { next, rewrite } from '@vercel/edge'
1927

2028
export const config = {
21-
matcher: ["/", "/((?!public/|api/).*)"],
22-
};
29+
matcher: ['/', '/((?!public/|api/).*)'],
30+
}
2331

2432
export default async function authentication(request: Request) {
25-
const pb = new PocketBase("https://levinkeller.de");
26-
const cookie = request.headers.get("cookie");
27-
if (!cookie) return rewrite("/public/login.html");
28-
pb.authStore.loadFromCookie(cookie);
33+
const pb = new PocketBase('https://levinkeller.de')
34+
const cookie = request.headers.get('cookie')
35+
if (!cookie) return rewrite('/public/login.html')
36+
pb.authStore.loadFromCookie(cookie)
2937
try {
30-
await pb.collection("users").authRefresh();
38+
await pb.collection('users').authRefresh()
3139
if (pb.authStore.model?.member) {
32-
return next();
40+
return next()
3341
} else {
3442
// not_a_member.html shows instructions on how to reach the admin to make the person a member.
35-
return rewrite("/public/not_a_member.html");
43+
return rewrite('/public/not_a_member.html')
3644
}
3745
} catch {
38-
return rewrite("/public/login.html");
46+
return rewrite('/public/login.html')
3947
}
4048
}
4149
```
4250

43-
Then only users whose accounts are made a "member" after creation could access the website. **Please be aware that this only is secure, iff you make sure that users cannot make themselves "members" [by using `@request.data.member:isset = false` in the appropriate API rules](https://github.com/pocketbase/pocketbase/discussions/5486#discussioncomment-10556948)!**
51+
Then only users whose accounts are made a "member" after creation could access
52+
the website. **Please be aware that this only is secure, iff you make sure that
53+
users cannot make themselves "members"
54+
[by using `@request.data.member:isset = false` in the appropriate API rules](https://github.com/pocketbase/pocketbase/discussions/5486#discussioncomment-10556948)!**
4455

4556
## Run it yourself
4657

47-
In order to run this yourself, you need to host a `PocketBase` instance and then fork this repo and adjust the values. Deployment needs to happen via vercel. I assume it also works on netlify or coolify with some minor adjustments.
58+
In order to run this yourself, you need to host a `PocketBase` instance and then
59+
fork this repo and adjust the values. Deployment needs to happen via vercel. I
60+
assume it also works on netlify or coolify with some minor adjustments.

api/cookie.mjs

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,33 @@
1-
import PocketBase from "pocketbase";
1+
import PocketBase from 'pocketbase'
2+
import process from 'node:process'
23

34
// This endpoint is more or less just to set a httpOnly cookie.
45
export async function POST(request) {
56
try {
6-
const body = await request.json();
7-
const token = body.token;
7+
const body = await request.json()
8+
const token = body.token
89

910
if (!token) {
10-
return new Response("Auth token is missing", { status: 400 });
11+
return new Response('Auth token is missing', { status: 400 })
1112
}
1213

13-
const pb = new PocketBase(process.env.POCKETBASE_URL);
14+
const pb = new PocketBase(process.env.POCKETBASE_URL)
1415

15-
pb.authStore.save(token);
16+
pb.authStore.save(token)
1617

1718
// I am using sameSite: "None" so deep links from third party apps like whatsapp etc. work.
1819
// It is very important to not allow server state changes via POST requests when using sameSite: "None".
1920
// If you later want to use the cookies to authenticate server state changing requests, you need to add CSRF protection (e.g. a CSRF token).
20-
const authCookie = pb.authStore.exportToCookie({ sameSite: "None" });
21+
const authCookie = pb.authStore.exportToCookie({ sameSite: 'None' })
2122

2223
return new Response(null, {
2324
status: 200,
2425
headers: {
25-
"Set-Cookie": authCookie,
26-
"Content-Type": "application/json",
26+
'Set-Cookie': authCookie,
27+
'Content-Type': 'application/json',
2728
},
28-
});
29-
} catch (error) {
30-
return new Response("Internal server error", { status: 500 });
29+
})
30+
} catch (_) {
31+
return new Response('Internal server error', { status: 500 })
3132
}
3233
}

babel.config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
module.exports = {
22
presets: [require.resolve('@docusaurus/core/lib/babel/preset')],
3-
};
3+
}

blog/2019-05-28-first-blog-post.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ Lorem ipsum dolor sit amet...
99

1010
<!-- truncate -->
1111

12-
...consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
12+
...consectetur adipiscing elit. Pellentesque elementum dignissim ultricies.
13+
Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet

blog/2019-05-29-long-blog-post.md

Lines changed: 48 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,34 +11,66 @@ Use a `<!--` `truncate` `-->` comment to limit blog post size in the list view.
1111

1212
<!-- truncate -->
1313

14-
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
14+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum
15+
dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem
16+
ipsum dolor sit amet
1517

16-
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
18+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum
19+
dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem
20+
ipsum dolor sit amet
1721

18-
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
22+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum
23+
dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem
24+
ipsum dolor sit amet
1925

20-
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
26+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum
27+
dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem
28+
ipsum dolor sit amet
2129

22-
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
30+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum
31+
dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem
32+
ipsum dolor sit amet
2333

24-
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
34+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum
35+
dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem
36+
ipsum dolor sit amet
2537

26-
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
38+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum
39+
dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem
40+
ipsum dolor sit amet
2741

28-
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
42+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum
43+
dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem
44+
ipsum dolor sit amet
2945

30-
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
46+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum
47+
dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem
48+
ipsum dolor sit amet
3149

32-
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
50+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum
51+
dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem
52+
ipsum dolor sit amet
3353

34-
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
54+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum
55+
dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem
56+
ipsum dolor sit amet
3557

36-
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
58+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum
59+
dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem
60+
ipsum dolor sit amet
3761

38-
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
62+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum
63+
dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem
64+
ipsum dolor sit amet
3965

40-
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
66+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum
67+
dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem
68+
ipsum dolor sit amet
4169

42-
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
70+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum
71+
dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem
72+
ipsum dolor sit amet
4373

44-
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
74+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum
75+
dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem
76+
ipsum dolor sit amet

blog/2021-08-26-welcome/index.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ authors: [slorber, yangshun]
55
tags: [facebook, hello, docusaurus]
66
---
77

8-
[Docusaurus blogging features](https://docusaurus.io/docs/blog) are powered by the [blog plugin](https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-blog).
8+
[Docusaurus blogging features](https://docusaurus.io/docs/blog) are powered by
9+
the
10+
[blog plugin](https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-blog).
911

1012
Here are a few tips you might find useful.
1113

@@ -26,4 +28,5 @@ A blog post folder can be convenient to co-locate blog post images:
2628

2729
The blog supports tags as well!
2830

29-
**And if you don't want a blog**: just delete this directory, and use `blog: false` in your Docusaurus config.
31+
**And if you don't want a blog**: just delete this directory, and use
32+
`blog: false` in your Docusaurus config.

deno.json

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"fmt": {
3+
"semiColons": false,
4+
"singleQuote": true,
5+
"exclude": [
6+
"build",
7+
".docusaurus",
8+
"static/public/pocketbase.umd.js",
9+
"static/public/infima.css"
10+
]
11+
},
12+
"lint": {
13+
"exclude": [
14+
"build",
15+
".docusaurus",
16+
"static/public/pocketbase.umd.js",
17+
"static/public/infima.css"
18+
]
19+
}
20+
}

0 commit comments

Comments
 (0)