@hilbras/keystone 1.1.0 → 1.3.0
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/CHANGELOG.md +36 -0
- package/README.md +8 -0
- package/package.json +13 -13
- package/src/routes/admin/sso.ts +2 -2
- package/src/routes/auth.ts +1 -1
- package/src/routes/config.ts +1 -1
- package/src/routes/profile.ts +1 -1
- package/src/routes/setup.ts +1 -1
- package/src/routes/webauthn.ts +2 -2
- package/src/routes/workflows.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -49,5 +49,41 @@ Security hardening, architecture improvements, and enterprise SSO enhancements.
|
|
|
49
49
|
- **Information leak removal** — Queue class name no longer exposed in API response.
|
|
50
50
|
- **Input validation** — All route inputs validated with Zod schemas.
|
|
51
51
|
|
|
52
|
+
## [1.2.0] - 2026-09-20
|
|
53
|
+
|
|
54
|
+
Dependency updates — safe patches and minor versions.
|
|
55
|
+
|
|
56
|
+
### Changed
|
|
57
|
+
|
|
58
|
+
- **fastify** 5.10.0 → latest 5.x
|
|
59
|
+
- **@fastify/swagger** 9.8.0 → latest 9.x
|
|
60
|
+
- **argon2** 0.44.0 → latest 0.x
|
|
61
|
+
- **otpauth** 9.5.1 → latest 9.x
|
|
62
|
+
- **@opentelemetry/sdk-node** 0.220.0 → latest 0.x
|
|
63
|
+
- **@opentelemetry/auto-instrumentations-node** 0.78.0 → latest 0.x
|
|
64
|
+
- **autoprefixer** 10.5.2 → latest 10.x (frontend)
|
|
65
|
+
- **postcss** 8.5.19 → latest 8.x (frontend)
|
|
66
|
+
- **lucide-react** 1.24.0 → latest 1.x (frontend)
|
|
67
|
+
- **@playwright/test** 1.61.1 → latest 1.x (frontend)
|
|
68
|
+
|
|
69
|
+
## [1.3.0] - 2026-09-20
|
|
70
|
+
|
|
71
|
+
Core tooling upgrades — TypeScript 7, Zod 4, Drizzle latest, Commander 15, Dotenv 18.
|
|
72
|
+
|
|
73
|
+
### Changed
|
|
74
|
+
|
|
75
|
+
- **TypeScript** 5.9.3 → 7.0.2 — new major version with stricter type checking.
|
|
76
|
+
- **Zod** 3.25.76 → 4.6.5 — API redesign: `z.record()` now requires explicit key type. Updated 7 call sites across 6 route files.
|
|
77
|
+
- **Drizzle ORM** 0.31.4 → 0.45.2
|
|
78
|
+
- **Drizzle Kit** 0.22.8 → 0.31.10
|
|
79
|
+
- **Commander** 12.1.0 → 15.0.0
|
|
80
|
+
- **Dotenv** 16.6.1 → 18.0.1
|
|
81
|
+
|
|
82
|
+
### Fixed
|
|
83
|
+
|
|
84
|
+
- **Zod 4 migration** — Updated all `z.record()` calls to include explicit `z.string()` key type parameter (sso.ts, auth.ts, config.ts, profile.ts, setup.ts, webauthn.ts, workflows.ts).
|
|
85
|
+
|
|
86
|
+
[1.3.0]: https://github.com/Hilbras/Keystone/releases/tag/v1.3.0
|
|
87
|
+
[1.2.0]: https://github.com/Hilbras/Keystone/releases/tag/v1.2.0
|
|
52
88
|
[1.1.0]: https://github.com/Hilbras/Keystone/releases/tag/v1.1.0
|
|
53
89
|
[1.0.0]: https://github.com/Hilbras/Keystone/releases/tag/v1.0.0
|
package/README.md
CHANGED
|
@@ -20,6 +20,14 @@ Keystone is a **standalone identity platform**, not a wrapper around another ide
|
|
|
20
20
|
|
|
21
21
|
---
|
|
22
22
|
|
|
23
|
+
## What's new in v1.3.0
|
|
24
|
+
|
|
25
|
+
- **Core tooling upgrades** — TypeScript 7, Zod 4, Drizzle ORM 0.45, Commander 15, Dotenv 18. Updated all `z.record()` calls for Zod 4 compatibility.
|
|
26
|
+
|
|
27
|
+
## What's new in v1.2.0
|
|
28
|
+
|
|
29
|
+
- **Dependency updates** — All root and frontend packages updated to latest safe patch/minor versions (fastify, argon2, otpauth, OpenTelemetry, autoprefixer, postcss, lucide-react, Playwright).
|
|
30
|
+
|
|
23
31
|
## What's new in v1.0.0
|
|
24
32
|
|
|
25
33
|
- **Simplified browser setup wizard** — choose a profile (Development, Docker Compose, Production), test PostgreSQL/Redis, create the owner account, and connect your first project without editing files.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hilbras/keystone",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist",
|
|
@@ -36,34 +36,34 @@
|
|
|
36
36
|
"@fastify/cookie": "^10.0.0",
|
|
37
37
|
"@fastify/cors": "^10.0.0",
|
|
38
38
|
"@fastify/static": "^8.3.0",
|
|
39
|
-
"@fastify/swagger": "^9.
|
|
39
|
+
"@fastify/swagger": "^9.8.1",
|
|
40
40
|
"@fastify/swagger-ui": "^5.0.0",
|
|
41
41
|
"@opentelemetry/api": "^1.9.1",
|
|
42
|
-
"@opentelemetry/auto-instrumentations-node": "^0.
|
|
43
|
-
"@opentelemetry/sdk-node": "^0.
|
|
42
|
+
"@opentelemetry/auto-instrumentations-node": "^0.80.0",
|
|
43
|
+
"@opentelemetry/sdk-node": "^0.222.0",
|
|
44
44
|
"@simplewebauthn/server": "^13.3.2",
|
|
45
|
-
"argon2": "^0.
|
|
45
|
+
"argon2": "^0.45.1",
|
|
46
46
|
"bullmq": "^5.80.2",
|
|
47
|
-
"commander": "^
|
|
48
|
-
"dotenv": "^
|
|
49
|
-
"drizzle-orm": "^0.
|
|
50
|
-
"fastify": "^5.
|
|
47
|
+
"commander": "^15.0.0",
|
|
48
|
+
"dotenv": "^18.0.1",
|
|
49
|
+
"drizzle-orm": "^0.45.2",
|
|
50
|
+
"fastify": "^5.12.5",
|
|
51
51
|
"fastify-plugin": "^5.0.0",
|
|
52
52
|
"ioredis": "^5.4.0",
|
|
53
53
|
"jose": "^5.6.0",
|
|
54
54
|
"nodemailer": "^9.0.3",
|
|
55
|
-
"otpauth": "^9.5.
|
|
55
|
+
"otpauth": "^9.5.2",
|
|
56
56
|
"postgres": "^3.4.4",
|
|
57
57
|
"prom-client": "^15.1.3",
|
|
58
58
|
"samlify": "^2.13.1",
|
|
59
|
-
"zod": "^
|
|
59
|
+
"zod": "^4.6.5"
|
|
60
60
|
},
|
|
61
61
|
"devDependencies": {
|
|
62
62
|
"@types/node": "^20.14.0",
|
|
63
63
|
"@types/nodemailer": "^8.0.1",
|
|
64
|
-
"drizzle-kit": "^0.
|
|
64
|
+
"drizzle-kit": "^0.31.10",
|
|
65
65
|
"light-my-request": "^6.0.0",
|
|
66
66
|
"tsx": "^4.15.0",
|
|
67
|
-
"typescript": "^
|
|
67
|
+
"typescript": "^7.0.2"
|
|
68
68
|
}
|
|
69
69
|
}
|
package/src/routes/admin/sso.ts
CHANGED
|
@@ -11,7 +11,7 @@ const SamlConnectionSchema = z.object({
|
|
|
11
11
|
idpCertificate: z.string().optional(),
|
|
12
12
|
spEntityId: z.string().min(1),
|
|
13
13
|
spAcsUrl: z.string().url(),
|
|
14
|
-
attributeMapping: z.record(z.array(z.string())).optional(),
|
|
14
|
+
attributeMapping: z.record(z.string(), z.array(z.string())).optional(),
|
|
15
15
|
isActive: z.boolean().optional(),
|
|
16
16
|
});
|
|
17
17
|
|
|
@@ -25,7 +25,7 @@ const OidcConnectionSchema = z.object({
|
|
|
25
25
|
clientId: z.string().min(1),
|
|
26
26
|
clientSecret: z.string().min(1),
|
|
27
27
|
scopes: z.array(z.string()).optional(),
|
|
28
|
-
attributeMapping: z.record(z.array(z.string())).optional(),
|
|
28
|
+
attributeMapping: z.record(z.string(), z.array(z.string())).optional(),
|
|
29
29
|
isActive: z.boolean().optional(),
|
|
30
30
|
});
|
|
31
31
|
|
package/src/routes/auth.ts
CHANGED
|
@@ -41,7 +41,7 @@ const RegisterSchema = z.object({
|
|
|
41
41
|
password: z.string().min(8).max(128),
|
|
42
42
|
name: z.string().max(255).optional(),
|
|
43
43
|
client_id: z.string().optional(),
|
|
44
|
-
metadata: z.record(z.unknown()).optional(),
|
|
44
|
+
metadata: z.record(z.string(), z.unknown()).optional(),
|
|
45
45
|
});
|
|
46
46
|
|
|
47
47
|
const LoginSchema = z.object({
|
package/src/routes/config.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { createConfigWriter } from "../services/setup/configWriter.js";
|
|
|
4
4
|
import { queue } from "../services/queue/index.js";
|
|
5
5
|
|
|
6
6
|
const UpdateConfigSchema = z.object({
|
|
7
|
-
values: z.record(z.string()),
|
|
7
|
+
values: z.record(z.string(), z.string()),
|
|
8
8
|
});
|
|
9
9
|
|
|
10
10
|
async function requireOwner(request: FastifyRequest, reply: FastifyReply) {
|
package/src/routes/profile.ts
CHANGED
|
@@ -6,7 +6,7 @@ const UpdateProfileSchema = z.object({
|
|
|
6
6
|
name: z.string().max(255).optional(),
|
|
7
7
|
avatarUrl: z.string().url().max(2048).nullable().optional(),
|
|
8
8
|
phoneNumber: z.string().max(32).nullable().optional(),
|
|
9
|
-
metadata: z.record(z.unknown()).optional(),
|
|
9
|
+
metadata: z.record(z.string(), z.unknown()).optional(),
|
|
10
10
|
});
|
|
11
11
|
|
|
12
12
|
export default async function profileRoutes(app: FastifyInstance) {
|
package/src/routes/setup.ts
CHANGED
|
@@ -57,7 +57,7 @@ const ValidateSmsSchema = z.object({
|
|
|
57
57
|
});
|
|
58
58
|
|
|
59
59
|
const SetupConfigSchema = z.object({
|
|
60
|
-
env: z.record(z.string()),
|
|
60
|
+
env: z.record(z.string(), z.string()),
|
|
61
61
|
});
|
|
62
62
|
|
|
63
63
|
function parseBody<T>(schema: z.ZodSchema<T>, body: unknown, reply: FastifyReply): T | null {
|
package/src/routes/webauthn.ts
CHANGED
|
@@ -37,7 +37,7 @@ function clearChallengeCookie(reply: FastifyReply): void {
|
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
const RegisterVerifySchema = z.object({
|
|
40
|
-
response: z.record(z.unknown()),
|
|
40
|
+
response: z.record(z.string(), z.unknown()),
|
|
41
41
|
deviceName: z.string().max(100).optional(),
|
|
42
42
|
});
|
|
43
43
|
|
|
@@ -46,7 +46,7 @@ const AuthenticateOptionsSchema = z.object({
|
|
|
46
46
|
});
|
|
47
47
|
|
|
48
48
|
const AuthenticateVerifySchema = z.object({
|
|
49
|
-
response: z.record(z.unknown()),
|
|
49
|
+
response: z.record(z.string(), z.unknown()),
|
|
50
50
|
});
|
|
51
51
|
|
|
52
52
|
export default async function webauthnRoutes(app: FastifyInstance) {
|
package/src/routes/workflows.ts
CHANGED
|
@@ -15,7 +15,7 @@ const CreateWorkflowSchema = z.object({
|
|
|
15
15
|
name: z.string().min(1).max(255),
|
|
16
16
|
trigger: z.enum(["user_registered", "user_login", "organization_created"]),
|
|
17
17
|
definition: z.object({
|
|
18
|
-
steps: z.array(WorkflowStepSchema.and(z.record(z.unknown()))),
|
|
18
|
+
steps: z.array(WorkflowStepSchema.and(z.record(z.string(), z.unknown()))),
|
|
19
19
|
}),
|
|
20
20
|
isActive: z.boolean().optional(),
|
|
21
21
|
});
|