boltstore 0.6.0 → 0.6.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/README.md +132 -16
- package/dist/admin/oauth/user.d.ts.map +1 -1
- package/dist/admin/oauth/user.js +12 -3
- package/dist/admin/oauth/user.js.map +1 -1
- package/dist/auth/tables.d.ts.map +1 -1
- package/dist/auth/tables.js +10 -1
- package/dist/auth/tables.js.map +1 -1
- package/dist/auth/tokens.d.ts +0 -2
- package/dist/auth/tokens.d.ts.map +1 -1
- package/dist/auth/tokens.js +3 -6
- package/dist/auth/tokens.js.map +1 -1
- package/dist/auth/types.d.ts +3 -3
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/auth/users.d.ts +5 -0
- package/dist/auth/users.d.ts.map +1 -1
- package/dist/auth/users.js +28 -6
- package/dist/auth/users.js.map +1 -1
- package/dist/bin.d.ts +16 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +73 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli-style.d.ts +17 -0
- package/dist/cli-style.d.ts.map +1 -0
- package/dist/cli-style.js +38 -0
- package/dist/cli-style.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +153 -61
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +65 -43
- package/dist/config.js.map +1 -1
- package/dist/db/manager.d.ts.map +1 -1
- package/dist/db/manager.js +7 -0
- package/dist/db/manager.js.map +1 -1
- package/dist/entry.js +68 -66
- package/dist/entry.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +58 -36
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +15 -1
- package/dist/logger.js.map +1 -1
- package/dist/middleware/auth.d.ts +1 -29
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +22 -28
- package/dist/middleware/auth.js.map +1 -1
- package/dist/prompt.d.ts +17 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +95 -0
- package/dist/prompt.js.map +1 -0
- package/dist/routes/auth.d.ts.map +1 -1
- package/dist/routes/auth.js +5 -0
- package/dist/routes/auth.js.map +1 -1
- package/dist/yaml.d.ts +14 -0
- package/dist/yaml.d.ts.map +1 -0
- package/dist/yaml.js +91 -0
- package/dist/yaml.js.map +1 -0
- package/package.json +4 -2
package/README.md
CHANGED
|
@@ -31,20 +31,53 @@ docker run -p 8080:8080 -v ./data:/data boltstore/boltstore
|
|
|
31
31
|
|
|
32
32
|
## Configuration
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
Boltstore merges settings from four sources. Each source overrides the one below it:
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
CLI flags (highest priority)
|
|
38
|
+
↓
|
|
39
|
+
Environment variables
|
|
40
|
+
↓
|
|
41
|
+
Config file (boltstore.yaml or boltstore.json, auto-detected)
|
|
42
|
+
↓
|
|
43
|
+
Defaults (lowest priority)
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
If both `boltstore.yaml` and `boltstore.json` exist, YAML is used first.
|
|
35
47
|
|
|
36
48
|
```bash
|
|
37
|
-
|
|
49
|
+
# Generate a config file (YAML by default)
|
|
50
|
+
boltstore init
|
|
51
|
+
|
|
52
|
+
# Or generate JSON instead
|
|
53
|
+
boltstore init --json
|
|
54
|
+
|
|
55
|
+
# boltstore.yaml / boltstore.json is auto-detected — no --config needed
|
|
56
|
+
boltstore serve
|
|
57
|
+
|
|
58
|
+
# Override any setting via CLI flags or environment variables
|
|
59
|
+
boltstore serve --port 3000 --db ./myapp
|
|
60
|
+
PORT=3000 boltstore serve
|
|
38
61
|
```
|
|
39
62
|
|
|
40
|
-
|
|
|
41
|
-
|
|
42
|
-
| `PORT` | `8080` | HTTP server port |
|
|
43
|
-
| `DATABASE_PATH` | `./data` | Directory for SQLite
|
|
44
|
-
| `JWT_SECRET` | — | Secret key for JWT tokens |
|
|
45
|
-
| `RATE_LIMIT_PUBLIC` | `
|
|
46
|
-
| `RATE_LIMIT_AUTH` | `
|
|
47
|
-
| `
|
|
63
|
+
| Config key | Env variable | Default | Description |
|
|
64
|
+
|---|---|---|---|
|
|
65
|
+
| `port` | `PORT` | `8080` | HTTP server port |
|
|
66
|
+
| `databasePath` | `DATABASE_PATH` | `./data` | Directory for SQLite databases |
|
|
67
|
+
| `jwtSecret` | `JWT_SECRET` | — | Secret key for JWT tokens |
|
|
68
|
+
| `rateLimitPublic` | `RATE_LIMIT_PUBLIC` | `100` | Rate limit for public endpoints (req/min) |
|
|
69
|
+
| `rateLimitAuth` | `RATE_LIMIT_AUTH` | `1000` | Rate limit for authenticated endpoints (req/min) |
|
|
70
|
+
| `rateLimitAdmin` | `RATE_LIMIT_ADMIN` | `500` | Rate limit for admin endpoints (req/min) |
|
|
71
|
+
| `rateLimitWindowSeconds` | `RATE_LIMIT_WINDOW_SECONDS` | `60` | Rate limit window in seconds |
|
|
72
|
+
| `serverTimezone` | `SERVER_TIMEZONE` | `UTC` | Server timezone |
|
|
73
|
+
| `logLevel` | `LOG_LEVEL` | `info` | Logging: debug, info, warn, error |
|
|
74
|
+
| `maxBodySize` | `MAX_BODY_SIZE` | `1048576` | Max request body in bytes |
|
|
75
|
+
| `requestTimeoutMs` | `REQUEST_TIMEOUT_MS` | `30000` | Request handler timeout in ms |
|
|
76
|
+
| `maxBatchSize` | `MAX_BATCH_SIZE` | `1000` | Max operations per batch/transaction |
|
|
77
|
+
| `corsOrigins` | `CORS_ORIGINS` | `[]` | Allowed CORS origins (comma-separated) |
|
|
78
|
+
| `corsMethods` | `CORS_METHODS` | `GET,POST,PATCH,DELETE,OPTIONS` | Allowed CORS methods |
|
|
79
|
+
| `corsHeaders` | `CORS_HEADERS` | `Content-Type,Authorization` | Allowed CORS headers |
|
|
80
|
+
| `trustedProxies` | `TRUSTED_PROXIES` | `[]` | Trusted proxy IPs/CIDRs |
|
|
48
81
|
|
|
49
82
|
## API Tiers
|
|
50
83
|
|
|
@@ -57,17 +90,100 @@ boltstore serve --port 8080 --db ./data --config boltstore.yaml
|
|
|
57
90
|
|
|
58
91
|
## Admin Panel
|
|
59
92
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
During development, Vite HMR automatically refreshes the admin UI as you edit Vue files.
|
|
93
|
+
> **Note:** The admin panel is not yet available. The `/admin` route currently returns a 404.
|
|
63
94
|
|
|
64
95
|
## Development
|
|
65
96
|
|
|
66
97
|
```bash
|
|
98
|
+
git clone https://github.com/boltstore/boltstore.git
|
|
99
|
+
cd boltstore
|
|
67
100
|
bun install
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Run the server from source
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
JWT_SECRET="dev-secret-thats-at-least-32-bytes!!" bun run boltstore
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
> **Note:** `bolt` and `boltstore` are aliases — both point to `src/bin.ts`. Use whichever you prefer.
|
|
110
|
+
|
|
111
|
+
Without a command argument, the server starts on port 8080. With a command argument, it dispatches to the corresponding CLI command.
|
|
112
|
+
|
|
113
|
+
### CLI commands
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
# Start the server
|
|
117
|
+
bun run boltstore serve
|
|
118
|
+
# or: bun run bolt serve
|
|
119
|
+
|
|
120
|
+
# Generate a config file (YAML by default)
|
|
121
|
+
bun run boltstore init
|
|
122
|
+
|
|
123
|
+
# Or generate JSON
|
|
124
|
+
bun run boltstore init --json
|
|
125
|
+
|
|
126
|
+
# Create an admin account (CLI-only, interactive prompt)
|
|
127
|
+
bun run boltstore admin init
|
|
128
|
+
|
|
129
|
+
# Run pending migrations
|
|
130
|
+
bun run boltstore migrate --db myapp --dir ./migrations
|
|
131
|
+
|
|
132
|
+
# Rollback last migration
|
|
133
|
+
bun run boltstore migrate:rollback --db myapp
|
|
134
|
+
|
|
135
|
+
# List migration status
|
|
136
|
+
bun run boltstore migrations --db myapp
|
|
137
|
+
|
|
138
|
+
# Import data
|
|
139
|
+
bun run boltstore import todos mydata.csv --db myapp --format csv
|
|
140
|
+
|
|
141
|
+
# Export data (prints to stdout)
|
|
142
|
+
bun run boltstore export todos --db myapp --format json
|
|
143
|
+
|
|
144
|
+
# Create a backup
|
|
145
|
+
bun run boltstore backup --db myapp --label "pre-deploy"
|
|
146
|
+
|
|
147
|
+
# Restore from a backup file
|
|
148
|
+
bun run boltstore restore ./data/backups/myapp-20260101.db --db myapp
|
|
149
|
+
|
|
150
|
+
# Check server status
|
|
151
|
+
bun run boltstore status
|
|
152
|
+
|
|
153
|
+
# Show help
|
|
154
|
+
bun run boltstore --help
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### Build and run from dist
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
bun run bolt:build
|
|
161
|
+
JWT_SECRET="dev-secret-thats-at-least-32-bytes!!" cd boltstore && bun run start
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Run tests
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
bun run bolt:test
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### Watch mode
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
cd boltstore && bun run dev
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### Compile a binary
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
# macOS Apple Silicon
|
|
180
|
+
bun run bolt:compile
|
|
181
|
+
|
|
182
|
+
# Linux x64
|
|
183
|
+
cd boltstore && bun run compile
|
|
184
|
+
|
|
185
|
+
# Windows x64
|
|
186
|
+
cd boltstore && bun run compile:windows
|
|
71
187
|
```
|
|
72
188
|
|
|
73
189
|
## Publishing
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../src/admin/oauth/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAiE,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AAEtG,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACpD,OAAO,CAAC,IAAI,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../src/admin/oauth/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAiE,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AAEtG,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACpD,OAAO,CAAC,IAAI,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAsC9D;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAGxE"}
|
package/dist/admin/oauth/user.js
CHANGED
|
@@ -3,7 +3,7 @@ export async function findOrCreateOAuthUser(pool, profile) {
|
|
|
3
3
|
bootstrapAuthTables(pool);
|
|
4
4
|
const db = pool.read();
|
|
5
5
|
const existing = db
|
|
6
|
-
.query("SELECT id, email,
|
|
6
|
+
.query("SELECT id, email, name, source, oauth_only, password_set, created_at, updated_at FROM _users WHERE email=?")
|
|
7
7
|
.get(profile.email);
|
|
8
8
|
if (existing) {
|
|
9
9
|
const passwordSet = existing.password_set ?? (existing.oauth_only === 1 ? 0 : 1);
|
|
@@ -17,8 +17,17 @@ export async function findOrCreateOAuthUser(pool, profile) {
|
|
|
17
17
|
const randomPassword = await generateRandomPassword();
|
|
18
18
|
return pool.writeTransaction(() => {
|
|
19
19
|
const writeDb = pool.write();
|
|
20
|
-
writeDb.run("INSERT INTO _users (id, email, password_hash,
|
|
21
|
-
return {
|
|
20
|
+
writeDb.run("INSERT INTO _users (id, email, name, password_hash, source, oauth_only, password_set, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", [id, profile.email, profile.name ?? null, randomPassword, "oauth", 1, 0, ts, ts]);
|
|
21
|
+
return {
|
|
22
|
+
id,
|
|
23
|
+
email: profile.email,
|
|
24
|
+
name: profile.name,
|
|
25
|
+
source: "oauth",
|
|
26
|
+
oauth_only: 1,
|
|
27
|
+
password_set: 0,
|
|
28
|
+
created_at: ts,
|
|
29
|
+
updated_at: ts,
|
|
30
|
+
};
|
|
22
31
|
});
|
|
23
32
|
}
|
|
24
33
|
export function markPasswordSet(pool, userId) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.js","sourceRoot":"","sources":["../../../src/admin/oauth/user.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,sBAAsB,EAAa,MAAM,YAAY,CAAC;AAEtG,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,IAAkB,EAClB,OAAqD;IAErD,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAEvB,MAAM,QAAQ,GAAG,EAAE;SAChB,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"user.js","sourceRoot":"","sources":["../../../src/admin/oauth/user.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,sBAAsB,EAAa,MAAM,YAAY,CAAC;AAEtG,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,IAAkB,EAClB,OAAqD;IAErD,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAEvB,MAAM,QAAQ,GAAG,EAAE;SAChB,KAAK,CAAC,4GAA4G,CAAC;SACnH,GAAG,CAAC,OAAO,CAAC,KAAK,CAAmG,CAAC;IAExH,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,WAAW,GAAG,QAAQ,CAAC,YAAY,IAAI,CAAC,QAAQ,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjF,IAAI,QAAQ,CAAC,UAAU,KAAK,CAAC,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;YACnD,OAAO,EAAE,GAAG,QAAQ,EAAE,UAAU,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;QACzD,CAAC;QACD,OAAO,EAAE,GAAG,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,IAAI,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;IAC1F,CAAC;IAED,MAAM,EAAE,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,cAAc,GAAG,MAAM,sBAAsB,EAAE,CAAC;IAEtD,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CACT,kJAAkJ,EAClJ,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CACjF,CAAC;QAEF,OAAO;YACL,EAAE;YACF,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,MAAM,EAAE,OAAO;YACf,UAAU,EAAE,CAAC;YACb,YAAY,EAAE,CAAC;YACf,UAAU,EAAE,EAAE;YACd,UAAU,EAAE,EAAE;SACf,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAkB,EAAE,MAAc;IAChE,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC1B,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,2DAA2D,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;AAC1F,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tables.d.ts","sourceRoot":"","sources":["../../src/auth/tables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"tables.d.ts","sourceRoot":"","sources":["../../src/auth/tables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAsC5D;AAID,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,EAAE,UAAU,SAAgB,GAAG,IAAI,CAWtF;AAED,wBAAgB,gBAAgB,CAAC,IAAI,CAAC,EAAE,YAAY,GAAG,IAAI,CAa1D"}
|
package/dist/auth/tables.js
CHANGED
|
@@ -5,7 +5,8 @@ export function bootstrapAuthTables(pool) {
|
|
|
5
5
|
id TEXT PRIMARY KEY,
|
|
6
6
|
email TEXT NOT NULL UNIQUE,
|
|
7
7
|
password_hash TEXT NOT NULL,
|
|
8
|
-
|
|
8
|
+
name TEXT,
|
|
9
|
+
source TEXT NOT NULL DEFAULT 'register',
|
|
9
10
|
oauth_only INTEGER NOT NULL DEFAULT 0,
|
|
10
11
|
created_at TEXT NOT NULL,
|
|
11
12
|
updated_at TEXT NOT NULL
|
|
@@ -15,6 +16,14 @@ export function bootstrapAuthTables(pool) {
|
|
|
15
16
|
db.run("ALTER TABLE _users ADD COLUMN oauth_only INTEGER NOT NULL DEFAULT 0");
|
|
16
17
|
}
|
|
17
18
|
catch { }
|
|
19
|
+
try {
|
|
20
|
+
db.run("ALTER TABLE _users ADD COLUMN name TEXT");
|
|
21
|
+
}
|
|
22
|
+
catch { }
|
|
23
|
+
try {
|
|
24
|
+
db.run("ALTER TABLE _users ADD COLUMN source TEXT NOT NULL DEFAULT 'register'");
|
|
25
|
+
}
|
|
26
|
+
catch { }
|
|
18
27
|
db.run(`
|
|
19
28
|
CREATE TABLE IF NOT EXISTS _tokens (
|
|
20
29
|
jti TEXT PRIMARY KEY,
|
package/dist/auth/tables.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tables.js","sourceRoot":"","sources":["../../src/auth/tables.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,mBAAmB,CAAC,IAAkB;IACpD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IAExB,EAAE,CAAC,GAAG,CAAC
|
|
1
|
+
{"version":3,"file":"tables.js","sourceRoot":"","sources":["../../src/auth/tables.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,mBAAmB,CAAC,IAAkB;IACpD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IAExB,EAAE,CAAC,GAAG,CAAC;;;;;;;;;;;GAWN,CAAC,CAAC;IAEH,IAAI,CAAC;QAAC,EAAE,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAC/F,IAAI,CAAC;QAAC,EAAE,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACnE,IAAI,CAAC;QAAC,EAAE,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEjG,EAAE,CAAC,GAAG,CAAC;;;;;;;;;GASN,CAAC,CAAC;IAEH,EAAE,CAAC,GAAG,CAAC;;GAEN,CAAC,CAAC;IAEH,EAAE,CAAC,GAAG,CAAC;;GAEN,CAAC,CAAC;AACL,CAAC;AAED,IAAI,qBAAqB,GAAsD,IAAI,GAAG,EAAE,CAAC;AAEzF,MAAM,UAAU,iBAAiB,CAAC,IAAkB,EAAE,UAAU,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI;IAC9E,IAAI,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO;IAC5C,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;QAChC,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YACxB,EAAE,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;QAClF,CAAC;QAAC,MAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;IACH,CAAC,EAAE,UAAU,CAAC,CAAC;IACf,qBAAqB,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAmB;IAClD,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,QAAQ,GAAG,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,QAAQ,EAAE,CAAC;YACb,aAAa,CAAC,QAAQ,CAAC,CAAC;YACxB,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,QAAQ,IAAI,qBAAqB,CAAC,MAAM,EAAE,EAAE,CAAC;YACtD,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC;QACD,qBAAqB,CAAC,KAAK,EAAE,CAAC;IAChC,CAAC;AACH,CAAC"}
|
package/dist/auth/tokens.d.ts
CHANGED
|
@@ -3,7 +3,6 @@ import type { AuthConfig, TokenPair } from "./types";
|
|
|
3
3
|
export declare function createTokenPairForUser(pool: DatabasePool, user: {
|
|
4
4
|
id: string;
|
|
5
5
|
email: string;
|
|
6
|
-
role: string;
|
|
7
6
|
}, config: AuthConfig): TokenPair;
|
|
8
7
|
export declare function loginUser(pool: DatabasePool, email: string, password: string, config: AuthConfig): Promise<TokenPair>;
|
|
9
8
|
export declare function refreshAccessToken(pool: DatabasePool, refreshToken: string, config: AuthConfig): Promise<TokenPair>;
|
|
@@ -11,6 +10,5 @@ export declare function logoutUser(pool: DatabasePool, userId: string): void;
|
|
|
11
10
|
export declare function verifyAccessToken(pool: DatabasePool, token: string, config: AuthConfig): {
|
|
12
11
|
userId: string;
|
|
13
12
|
email: string;
|
|
14
|
-
role: "user" | "admin";
|
|
15
13
|
};
|
|
16
14
|
//# sourceMappingURL=tokens.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/auth/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAoB,MAAM,SAAS,CAAC;AASvE,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/auth/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAoB,MAAM,SAAS,CAAC;AASvE,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EACnC,MAAM,EAAE,UAAU,GACjB,SAAS,CAsDX;AAED,wBAAsB,SAAS,CAC7B,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,SAAS,CAAC,CAyCpB;AAED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,YAAY,EAClB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,SAAS,CAAC,CA2CpB;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAGnE;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,UAAU,GACjB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAyCnC"}
|
package/dist/auth/tokens.js
CHANGED
|
@@ -16,7 +16,6 @@ export function createTokenPairForUser(pool, user, config) {
|
|
|
16
16
|
const accessPayload = {
|
|
17
17
|
sub: user.id,
|
|
18
18
|
email: user.email,
|
|
19
|
-
role: user.role,
|
|
20
19
|
type: "access",
|
|
21
20
|
jti: accessJti,
|
|
22
21
|
iat: nowSec,
|
|
@@ -43,7 +42,6 @@ export function createTokenPairForUser(pool, user, config) {
|
|
|
43
42
|
expiresIn: accessExpiry,
|
|
44
43
|
userId: user.id,
|
|
45
44
|
email: user.email,
|
|
46
|
-
role: user.role,
|
|
47
45
|
};
|
|
48
46
|
}
|
|
49
47
|
export async function loginUser(pool, email, password, config) {
|
|
@@ -55,7 +53,7 @@ export async function loginUser(pool, email, password, config) {
|
|
|
55
53
|
bootstrapAuthTables(pool);
|
|
56
54
|
const db = pool.read();
|
|
57
55
|
const row = db
|
|
58
|
-
.query("SELECT id, email, password_hash,
|
|
56
|
+
.query("SELECT id, email, password_hash, oauth_only FROM _users WHERE email=?")
|
|
59
57
|
.get(email.toLowerCase());
|
|
60
58
|
if (!row) {
|
|
61
59
|
throw Object.assign(new Error("Invalid email or password."), { status: 401 });
|
|
@@ -67,7 +65,7 @@ export async function loginUser(pool, email, password, config) {
|
|
|
67
65
|
if (!valid) {
|
|
68
66
|
throw Object.assign(new Error("Invalid email or password."), { status: 401 });
|
|
69
67
|
}
|
|
70
|
-
return createTokenPairForUser(pool, { id: row.id, email: row.email
|
|
68
|
+
return createTokenPairForUser(pool, { id: row.id, email: row.email }, config);
|
|
71
69
|
}
|
|
72
70
|
export async function refreshAccessToken(pool, refreshToken, config) {
|
|
73
71
|
if (!config.secret) {
|
|
@@ -86,7 +84,7 @@ export async function refreshAccessToken(pool, refreshToken, config) {
|
|
|
86
84
|
throw Object.assign(new Error("Token has been revoked or is invalid."), { status: 401 });
|
|
87
85
|
}
|
|
88
86
|
const userRow = db
|
|
89
|
-
.query("SELECT id, email
|
|
87
|
+
.query("SELECT id, email FROM _users WHERE id=?")
|
|
90
88
|
.get(payload.sub);
|
|
91
89
|
if (!userRow) {
|
|
92
90
|
throw Object.assign(new Error("User no longer exists."), { status: 401 });
|
|
@@ -120,7 +118,6 @@ export function verifyAccessToken(pool, token, config) {
|
|
|
120
118
|
return {
|
|
121
119
|
userId: payload.sub,
|
|
122
120
|
email: payload.email,
|
|
123
|
-
role: payload.role,
|
|
124
121
|
};
|
|
125
122
|
}
|
|
126
123
|
//# sourceMappingURL=tokens.js.map
|
package/dist/auth/tokens.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/auth/tokens.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAClC,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAEtC,MAAM,UAAU,sBAAsB,CACpC,IAAkB,EAClB,
|
|
1
|
+
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/auth/tokens.ts"],"names":[],"mappings":"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"}
|
package/dist/auth/types.d.ts
CHANGED
|
@@ -6,12 +6,14 @@ export interface AuthConfig {
|
|
|
6
6
|
export interface User {
|
|
7
7
|
id: string;
|
|
8
8
|
email: string;
|
|
9
|
-
|
|
9
|
+
name?: string;
|
|
10
|
+
source: string;
|
|
10
11
|
created_at: string;
|
|
11
12
|
updated_at: string;
|
|
12
13
|
}
|
|
13
14
|
export interface UserRow extends User {
|
|
14
15
|
oauth_only?: number;
|
|
16
|
+
password_set?: number;
|
|
15
17
|
password_hash?: string;
|
|
16
18
|
}
|
|
17
19
|
export interface TokenPair {
|
|
@@ -20,12 +22,10 @@ export interface TokenPair {
|
|
|
20
22
|
expiresIn: number;
|
|
21
23
|
userId?: string;
|
|
22
24
|
email?: string;
|
|
23
|
-
role?: "user" | "admin";
|
|
24
25
|
}
|
|
25
26
|
export interface JwtPayload {
|
|
26
27
|
sub: string;
|
|
27
28
|
email: string;
|
|
28
|
-
role: "user" | "admin";
|
|
29
29
|
iat: number;
|
|
30
30
|
exp: number;
|
|
31
31
|
jti: string;
|
package/dist/auth/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,OAAQ,SAAQ,IAAI;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd"}
|
package/dist/auth/users.d.ts
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import { DatabasePool } from "../db/pool";
|
|
2
2
|
import type { User } from "./types";
|
|
3
|
+
/**
|
|
4
|
+
* Create an admin user in the system database.
|
|
5
|
+
* Only callable from the CLI — creates with source="cli".
|
|
6
|
+
*/
|
|
7
|
+
export declare function createAdminUser(pool: DatabasePool, email: string, password: string, name?: string): Promise<User>;
|
|
3
8
|
export declare function registerUser(pool: DatabasePool, email: string, password: string): Promise<User>;
|
|
4
9
|
export declare function getUserById(pool: DatabasePool, userId: string): User;
|
|
5
10
|
export declare function updateProfile(pool: DatabasePool, userId: string, data: {
|
package/dist/auth/users.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../src/auth/users.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../src/auth/users.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAQpC;;;GAGG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CA6Bf;AAMD,wBAAsB,YAAY,CAChC,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CA6Bf;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,MAAM,GACb,IAAI,CAgBN;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1C,OAAO,CAAC,IAAI,CAAC,CA8Df"}
|
package/dist/auth/users.js
CHANGED
|
@@ -4,6 +4,28 @@ import { hashPassword } from "./password";
|
|
|
4
4
|
import { now } from "./jwt";
|
|
5
5
|
import { generateSecureId } from "@boltstore/utils";
|
|
6
6
|
import { markPasswordSet } from "../admin/oauth";
|
|
7
|
+
/**
|
|
8
|
+
* Create an admin user in the system database.
|
|
9
|
+
* Only callable from the CLI — creates with source="cli".
|
|
10
|
+
*/
|
|
11
|
+
export async function createAdminUser(pool, email, password, name) {
|
|
12
|
+
validateEmail(email);
|
|
13
|
+
validatePassword(password);
|
|
14
|
+
bootstrapAuthTables(pool);
|
|
15
|
+
const passwordHash = await hashPassword(password);
|
|
16
|
+
const id = generateUserId();
|
|
17
|
+
const ts = now();
|
|
18
|
+
return pool.writeTransaction(() => {
|
|
19
|
+
const db = pool.write();
|
|
20
|
+
const existing = db.query("SELECT 1 FROM _users WHERE email=?").get(email);
|
|
21
|
+
if (existing) {
|
|
22
|
+
throw Object.assign(new Error("A user with this email already exists."), { status: 409 });
|
|
23
|
+
}
|
|
24
|
+
db.run(`INSERT INTO _users (id, email, name, password_hash, source, oauth_only, created_at, updated_at)
|
|
25
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, [id, email.toLowerCase(), name ?? null, passwordHash, "cli", 0, ts, ts]);
|
|
26
|
+
return { id, email, name, source: "cli", created_at: ts, updated_at: ts };
|
|
27
|
+
});
|
|
28
|
+
}
|
|
7
29
|
function generateUserId() {
|
|
8
30
|
return generateSecureId("usr");
|
|
9
31
|
}
|
|
@@ -20,16 +42,16 @@ export async function registerUser(pool, email, password) {
|
|
|
20
42
|
if (existing) {
|
|
21
43
|
throw Object.assign(new Error("A user with this email already exists."), { status: 409 });
|
|
22
44
|
}
|
|
23
|
-
db.run(`INSERT INTO _users (id, email, password_hash,
|
|
24
|
-
VALUES (?, ?, ?, ?, ?, ?, ?)`, [id, email.toLowerCase(), passwordHash, "
|
|
25
|
-
return { id, email,
|
|
45
|
+
db.run(`INSERT INTO _users (id, email, name, password_hash, source, oauth_only, created_at, updated_at)
|
|
46
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, [id, email.toLowerCase(), null, passwordHash, "register", 0, ts, ts]);
|
|
47
|
+
return { id, email, source: "register", created_at: ts, updated_at: ts };
|
|
26
48
|
});
|
|
27
49
|
}
|
|
28
50
|
export function getUserById(pool, userId) {
|
|
29
51
|
bootstrapAuthTables(pool);
|
|
30
52
|
const db = pool.read();
|
|
31
53
|
const row = db
|
|
32
|
-
.query("SELECT id, email,
|
|
54
|
+
.query("SELECT id, email, name, source, created_at, updated_at FROM _users WHERE id=?")
|
|
33
55
|
.get(userId);
|
|
34
56
|
if (!row) {
|
|
35
57
|
throw Object.assign(new Error(`User "${userId}" not found.`), { status: 404 });
|
|
@@ -43,7 +65,7 @@ export async function updateProfile(pool, userId, data) {
|
|
|
43
65
|
bootstrapAuthTables(pool);
|
|
44
66
|
const db = pool.read();
|
|
45
67
|
const existing = db
|
|
46
|
-
.query("SELECT id, email,
|
|
68
|
+
.query("SELECT id, email, name, source, created_at, updated_at FROM _users WHERE id=?")
|
|
47
69
|
.get(userId);
|
|
48
70
|
if (!existing) {
|
|
49
71
|
throw Object.assign(new Error(`User "${userId}" not found.`), { status: 404 });
|
|
@@ -75,7 +97,7 @@ export async function updateProfile(pool, userId, data) {
|
|
|
75
97
|
writeDb.run("UPDATE _users SET updated_at=? WHERE id=?", [ts, userId]);
|
|
76
98
|
}
|
|
77
99
|
const updated = writeDb
|
|
78
|
-
.query("SELECT id, email,
|
|
100
|
+
.query("SELECT id, email, name, source, created_at, updated_at FROM _users WHERE id=?")
|
|
79
101
|
.get(userId);
|
|
80
102
|
return updated;
|
|
81
103
|
});
|
package/dist/auth/users.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/auth/users.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,SAAS,cAAc;IACrB,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAkB,EAClB,KAAa,EACb,QAAgB;IAEhB,aAAa,CAAC,KAAK,CAAC,CAAC;IACrB,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAE3B,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAE1B,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;IAC5B,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC;IAEjB,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAExB,MAAM,QAAQ,GAAG,EAAE,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3E,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,MAAM,CAAC,MAAM,CACjB,IAAI,KAAK,CAAC,wCAAwC,CAAC,EACnD,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CAAC;QACJ,CAAC;QAED,EAAE,CAAC,GAAG,CACJ;
|
|
1
|
+
{"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/auth/users.ts"],"names":[],"mappings":"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"}
|
package/dist/bin.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Self-executing CLI entry — starts the server or runs a CLI command.
|
|
3
|
+
*
|
|
4
|
+
* This file is used as the npm `bin` target. It inspects the first argument
|
|
5
|
+
* to decide whether to start the server or run a CLI command. When
|
|
6
|
+
* compiling a standalone binary, `entry.ts` is used instead.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* bun run src/bin.ts serve
|
|
10
|
+
* bun run src/bin.ts init
|
|
11
|
+
* bun run src/bin.ts --help
|
|
12
|
+
*
|
|
13
|
+
* @module boltstore/bin
|
|
14
|
+
*/
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=bin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
|
package/dist/bin.js
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Self-executing CLI entry — starts the server or runs a CLI command.
|
|
3
|
+
*
|
|
4
|
+
* This file is used as the npm `bin` target. It inspects the first argument
|
|
5
|
+
* to decide whether to start the server or run a CLI command. When
|
|
6
|
+
* compiling a standalone binary, `entry.ts` is used instead.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* bun run src/bin.ts serve
|
|
10
|
+
* bun run src/bin.ts init
|
|
11
|
+
* bun run src/bin.ts --help
|
|
12
|
+
*
|
|
13
|
+
* @module boltstore/bin
|
|
14
|
+
*/
|
|
15
|
+
import { runCli } from "./cli";
|
|
16
|
+
import { createServer, stopServerBackgroundTasks } from "./server";
|
|
17
|
+
import { DatabaseManager } from "./db/manager";
|
|
18
|
+
import { loadConfig } from "./config";
|
|
19
|
+
import { info, success, error } from "./cli-style";
|
|
20
|
+
const command = process.argv[2];
|
|
21
|
+
const CLI_COMMANDS = new Set([
|
|
22
|
+
"serve", "init", "admin", "status", "help", "--help", "-h",
|
|
23
|
+
"migrate", "migrate:rollback", "migrations",
|
|
24
|
+
"import", "export",
|
|
25
|
+
"backup", "restore",
|
|
26
|
+
]);
|
|
27
|
+
try {
|
|
28
|
+
if (command && CLI_COMMANDS.has(command)) {
|
|
29
|
+
await runCli(process.argv.slice(2));
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
// No command or unrecognized arg → start the server
|
|
33
|
+
const config = await loadConfig();
|
|
34
|
+
const manager = new DatabaseManager({ dataDir: config.databasePath });
|
|
35
|
+
const server = createServer({
|
|
36
|
+
port: config.port,
|
|
37
|
+
manager,
|
|
38
|
+
auth: { secret: config.jwtSecret },
|
|
39
|
+
cors: {
|
|
40
|
+
origins: config.corsOrigins,
|
|
41
|
+
methods: config.corsMethods,
|
|
42
|
+
headers: config.corsHeaders,
|
|
43
|
+
},
|
|
44
|
+
rateLimit: {
|
|
45
|
+
public: config.rateLimitPublic,
|
|
46
|
+
auth: config.rateLimitAuth,
|
|
47
|
+
admin: config.rateLimitAdmin,
|
|
48
|
+
windowSeconds: config.rateLimitWindowSeconds,
|
|
49
|
+
},
|
|
50
|
+
maxBodySize: config.maxBodySize,
|
|
51
|
+
requestTimeoutMs: config.requestTimeoutMs,
|
|
52
|
+
maxBatchSize: config.maxBatchSize,
|
|
53
|
+
trustedProxies: config.trustedProxies,
|
|
54
|
+
});
|
|
55
|
+
success(`Server running on http://localhost:${config.port}`);
|
|
56
|
+
info(`Health check: http://localhost:${config.port}/api/health`);
|
|
57
|
+
info(`Data directory: ${config.databasePath}`);
|
|
58
|
+
info(`Log level: ${config.logLevel}`);
|
|
59
|
+
info(`Timezone: ${config.serverTimezone}`);
|
|
60
|
+
info(`Rate limits: public=${config.rateLimitPublic}/min, auth=${config.rateLimitAuth}/min, admin=${config.rateLimitAdmin}/min`);
|
|
61
|
+
if (config.serverTimezone && config.serverTimezone !== "UTC") {
|
|
62
|
+
process.env.TZ = config.serverTimezone;
|
|
63
|
+
}
|
|
64
|
+
process.on("SIGINT", () => { info("Shutting down..."); stopServerBackgroundTasks(); manager.close(); server.stop(); process.exit(0); });
|
|
65
|
+
process.on("SIGTERM", () => { info("Shutting down..."); stopServerBackgroundTasks(); manager.close(); server.stop(); process.exit(0); });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
error(err.message);
|
|
70
|
+
error("Set JWT_SECRET environment variable or create a config file with boltstore init.");
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=bin.js.map
|
package/dist/bin.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI output styling with a color-coded [⚡ boltstore] prefix.
|
|
3
|
+
* The prefix color indicates the message type; the message text is always plain.
|
|
4
|
+
*
|
|
5
|
+
* @module boltstore/cli-style
|
|
6
|
+
*/
|
|
7
|
+
/** Informational message (bold ⚡, default color). */
|
|
8
|
+
export declare function info(msg: string): void;
|
|
9
|
+
/** Success message (green prefix). */
|
|
10
|
+
export declare function success(msg: string): void;
|
|
11
|
+
/** Warning message (yellow prefix). */
|
|
12
|
+
export declare function warn(msg: string): void;
|
|
13
|
+
/** Error message (red prefix, to stderr). */
|
|
14
|
+
export declare function error(msg: string): void;
|
|
15
|
+
/** Plain output without the prefix (data, JSON, etc.). */
|
|
16
|
+
export declare function out(msg: string): void;
|
|
17
|
+
//# sourceMappingURL=cli-style.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-style.d.ts","sourceRoot":"","sources":["../src/cli-style.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAeH,qDAAqD;AACrD,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEtC;AAED,sCAAsC;AACtC,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEzC;AAED,uCAAuC;AACvC,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEtC;AAED,6CAA6C;AAC7C,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEvC;AAED,0DAA0D;AAC1D,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAErC"}
|