Skip to content

Commit 81656bf

Browse files
committed
feat(examples): add with-logger
1 parent c78d131 commit 81656bf

File tree

11 files changed

+234
-1
lines changed

11 files changed

+234
-1
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,5 @@
44
.env
55
.DS_Store
66
**/database
7+
**/logs
8+
**/temp

examples/with-logger/index.html

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8" />
5+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
6+
<title>with-logger</title>
7+
</head>
8+
<body>
9+
<div id="app"></div>
10+
<script type="module" src="/src/index.ts"></script>
11+
</body>
12+
</html>

examples/with-logger/package.json

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
{
2+
"name": "with-logger",
3+
"private": true,
4+
"version": "0.0.0",
5+
"type": "module",
6+
"scripts": {
7+
"dev": "vite",
8+
"build": "tsc && vite build",
9+
"preview": "vite preview"
10+
},
11+
"devDependencies": {
12+
"typescript": "4.9.5",
13+
"vite": "4.1.1"
14+
},
15+
"dependencies": {
16+
"@stenodb/browser": "workspace:*",
17+
"@stenodb/logger": "workspace:*",
18+
"@zero-dependency/dom": "0.12.0",
19+
"class-transformer": "0.5.1",
20+
"reflect-metadata": "0.1.13"
21+
}
22+
}

examples/with-logger/src/entities.ts

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { Type } from 'class-transformer'
2+
3+
export class Users {
4+
@Type(() => User)
5+
users: User[]
6+
7+
constructor(...users: User[]) {
8+
this.users = users
9+
}
10+
11+
addUser(user: User): void {
12+
this.users.push(user)
13+
}
14+
15+
getLastUserId(): number {
16+
return this.users!.at(-1)!.id
17+
}
18+
}
19+
20+
export class User {
21+
id: number
22+
username: string
23+
24+
constructor(id: number, username: string) {
25+
this.id = id
26+
this.username = username
27+
}
28+
29+
changeUsername(username: string): void {
30+
this.username = username
31+
}
32+
}

examples/with-logger/src/index.ts

+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import 'reflect-metadata'
2+
import { el } from '@zero-dependency/dom'
3+
import { User } from './entities.js'
4+
import { storage } from './storage.js'
5+
6+
const app = document.querySelector('#app')!
7+
8+
const userIdInput = el('input', {
9+
type: 'number',
10+
name: 'id',
11+
disabled: true
12+
})
13+
14+
const usernameInput = el('input', {
15+
type: 'text',
16+
name: 'username',
17+
placeholder: 'Username'
18+
})
19+
20+
const submitButton = el(
21+
'button',
22+
{
23+
type: 'submit'
24+
},
25+
'Submit'
26+
)
27+
28+
const resetButton = el(
29+
'button',
30+
{
31+
onclick: () => {
32+
storage.reset()
33+
render()
34+
}
35+
},
36+
'Reset'
37+
)
38+
39+
const form = el(
40+
'form',
41+
{
42+
onsubmit: (event: Event) => {
43+
event.preventDefault()
44+
const formData = new FormData(form)
45+
const username = formData.get('username')?.toString()
46+
if (!username) {
47+
usernameInput.focus()
48+
return
49+
}
50+
const user = new User(storage.data!.getLastUserId() + 1, username)
51+
storage.data!.addUser(user)
52+
storage.write()
53+
render()
54+
}
55+
},
56+
userIdInput,
57+
usernameInput,
58+
submitButton,
59+
resetButton
60+
)
61+
62+
const storagePreview = el('pre')
63+
64+
function render() {
65+
form.reset()
66+
usernameInput.focus()
67+
userIdInput.value = storage.data!.getLastUserId().toString()
68+
storagePreview.textContent = JSON.stringify(storage.data, null, 2)
69+
}
70+
71+
render()
72+
app.append(form, storagePreview)

examples/with-logger/src/storage.ts

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { BrowserProvider, LocalStorage } from '@stenodb/browser'
2+
import { createLogger } from '@stenodb/logger'
3+
import { User, Users } from './entities.js'
4+
5+
const initialData = new Users(new User(1, 'John'))
6+
const adapter = new LocalStorage('users', Users, initialData)
7+
const provider = new BrowserProvider({ logger: createLogger() })
8+
9+
export const storage = provider.create(adapter)
10+
storage.read()
+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/// <reference types="vite/client" />

examples/with-logger/tsconfig.json

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
{
2+
"compilerOptions": {
3+
"target": "ESNext",
4+
"useDefineForClassFields": true,
5+
"module": "ESNext",
6+
"lib": ["ESNext", "DOM"],
7+
"moduleResolution": "Node",
8+
"strict": true,
9+
"resolveJsonModule": true,
10+
"isolatedModules": true,
11+
"esModuleInterop": true,
12+
"noEmit": true,
13+
"noUnusedLocals": true,
14+
"noUnusedParameters": true,
15+
"noImplicitReturns": true,
16+
"skipLibCheck": true,
17+
"strictPropertyInitialization": false,
18+
"experimentalDecorators": true,
19+
"emitDecoratorMetadata": true
20+
},
21+
"include": ["src"]
22+
}

examples/with-node/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
"build": "del-cli dist && tsc"
99
},
1010
"dependencies": {
11+
"@stenodb/logger": "workspace:^0.0.0",
1112
"@stenodb/node": "workspace:*",
1213
"class-transformer": "0.5.1",
1314
"reflect-metadata": "0.1.13"

examples/with-node/src/index.ts

+12-1
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,24 @@
11
import 'reflect-metadata'
22
import { dirname, resolve } from 'node:path'
33
import { fileURLToPath } from 'node:url'
4+
import { createLogger } from '@stenodb/logger'
5+
import { createRotation } from '@stenodb/logger/rotation'
46
import { AsyncAdapter, NodeProvider } from '@stenodb/node'
57
import { Post, User, Users } from './entities.js'
68

79
const path = resolve(dirname(fileURLToPath(import.meta.url)), '..', 'database')
10+
const logger = createLogger({
11+
rotation: createRotation({
12+
path: 'logs',
13+
size: '10M', // rotate every 10 MegaBytes written
14+
interval: '1d', // rotate daily
15+
compress: 'gzip' // compress rotated files
16+
})
17+
})
18+
819
const initialData = new Users(new User('John Doe'))
920
const adapter = new AsyncAdapter('users', Users, initialData)
10-
const provider = new NodeProvider(path)
21+
const provider = new NodeProvider(path, { logger })
1122

1223
const database = provider.createAsync(adapter)
1324
await database.read()

pnpm-lock.yaml

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

0 commit comments

Comments
 (0)