@hilbras/keystone 1.4.0 → 1.6.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 CHANGED
@@ -95,6 +95,57 @@ Fastify ecosystem upgrades — all plugins updated to latest major versions.
95
95
  - **@fastify/static** 8.3.0 → 10.1.4
96
96
  - **@fastify/swagger-ui** 5.2.6 → 6.1.1
97
97
 
98
+ ## [1.5.0] - 2026-09-20
99
+
100
+ Auth & infrastructure upgrades — jose 6, ioredis 6, bullmq 6, simplewebauthn 14, nodemailer 10.
101
+
102
+ ### Changed
103
+
104
+ - **jose** 5.10.0 → 6.2.12 — `KeyLike` type removed, replaced with `CryptoKey`.
105
+ - **ioredis** 5.11.1 → 6.0.0
106
+ - **bullmq** 5.80.2 → 6.3.8
107
+ - **@simplewebauthn/server** 13.3.2 → 14.0.2 — `AuthenticatorTransportFuture` renamed to `AuthenticatorTransport`.
108
+ - **nodemailer** 9.0.3 → 10.0.10
109
+
110
+ ### Fixed
111
+
112
+ - **jose 6 migration** — Replaced `KeyLike` with `CryptoKey` in secrets provider, tokens service, and database/environment secrets providers.
113
+ - **simplewebauthn 14 migration** — Renamed `AuthenticatorTransportFuture` to `AuthenticatorTransport` in webauthn service.
114
+
115
+ ## [1.6.0] - 2026-09-20
116
+
117
+ Frontend upgrades — React 19, Vite 8, Tailwind 4, TypeScript 7.
118
+
119
+ ### Changed
120
+
121
+ - **React** 18.3.1 → 19.3.0
122
+ - **React DOM** 18.3.1 → 19.3.0
123
+ - **Vite** 5.4.21 → 8.3.0
124
+ - **@vitejs/plugin-react** 4.7.0 → 6.1.1
125
+ - **Tailwind CSS** 3.4.19 → 4.3.3 — complete rewrite: config moved from JS to CSS `@theme` directive, PostCSS plugin replaced with `@tailwindcss/vite`.
126
+ - **@simplewebauthn/browser** 13.3.0 → 14.0.0
127
+ - **TypeScript** 5.9.3 → 7.0.2 (frontend)
128
+ - **@types/react** 18.3.31 → 19.0.0
129
+ - **@types/react-dom** 18.3.7 → 19.0.0
130
+
131
+ ### Removed
132
+
133
+ - **autoprefixer** — not needed with Tailwind 4.
134
+ - **postcss** — not needed with Tailwind 4.
135
+ - **tailwindcss-animate** — animations built into Tailwind 4.
136
+
137
+ ### Added
138
+
139
+ - **@tailwindcss/vite** — replaces PostCSS plugin approach.
140
+
141
+ ### Migration notes
142
+
143
+ - `tailwind.config.js` deleted — config now lives in `src/tailwind.css` using `@theme` directive.
144
+ - `postcss.config.js` deleted — Tailwind 4 uses Vite plugin directly.
145
+ - `src/index.css` updated to use `@import "./tailwind.css"` instead of `@tailwind base/components/utilities`.
146
+
147
+ [1.6.0]: https://github.com/Hilbras/Keystone/releases/tag/v1.6.0
148
+ [1.5.0]: https://github.com/Hilbras/Keystone/releases/tag/v1.5.0
98
149
  [1.4.0]: https://github.com/Hilbras/Keystone/releases/tag/v1.4.0
99
150
  [1.3.0]: https://github.com/Hilbras/Keystone/releases/tag/v1.3.0
100
151
  [1.2.0]: https://github.com/Hilbras/Keystone/releases/tag/v1.2.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.6.0
24
+
25
+ - **Frontend overhaul** — React 19, Vite 8, Tailwind 4 (config migrated from JS to CSS `@theme` directive), TypeScript 7. Removed autoprefixer, postcss, tailwindcss-animate in favor of Tailwind 4 built-in features.
26
+
27
+ ## What's new in v1.5.0
28
+
29
+ - **Auth & infrastructure upgrades** — jose 6, ioredis 6, bullmq 6, @simplewebauthn/server 14, nodemailer 10. Updated KeyLike→CryptoKey for jose 6 and AuthenticatorTransportFuture→AuthenticatorTransport for simplewebauthn 14.
30
+
23
31
  ## What's new in v1.4.0
24
32
 
25
33
  - **Fastify ecosystem upgrades** — fastify-plugin 6, @fastify/cookie 11, @fastify/cors 11, @fastify/static 10, @fastify/swagger-ui 6. All plugins updated to latest major versions with no code changes required.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hilbras/keystone",
3
- "version": "1.4.0",
3
+ "version": "1.6.0",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist",
@@ -41,17 +41,17 @@
41
41
  "@opentelemetry/api": "^1.9.1",
42
42
  "@opentelemetry/auto-instrumentations-node": "^0.80.0",
43
43
  "@opentelemetry/sdk-node": "^0.222.0",
44
- "@simplewebauthn/server": "^13.3.2",
44
+ "@simplewebauthn/server": "^14.0.2",
45
45
  "argon2": "^0.45.1",
46
- "bullmq": "^5.80.2",
46
+ "bullmq": "^6.3.8",
47
47
  "commander": "^15.0.0",
48
48
  "dotenv": "^18.0.1",
49
49
  "drizzle-orm": "^0.45.2",
50
50
  "fastify": "^5.12.5",
51
51
  "fastify-plugin": "^6.0.0",
52
- "ioredis": "^5.4.0",
53
- "jose": "^5.6.0",
54
- "nodemailer": "^9.0.3",
52
+ "ioredis": "^6.0.0",
53
+ "jose": "^6.2.12",
54
+ "nodemailer": "^10.0.10",
55
55
  "otpauth": "^9.5.2",
56
56
  "postgres": "^3.4.4",
57
57
  "prom-client": "^15.1.3",
@@ -1,6 +1,6 @@
1
1
  import crypto from "node:crypto";
2
2
  import { eq, and, or, gt, isNull } from "drizzle-orm";
3
- import { importPKCS8, importSPKI, exportPKCS8, exportSPKI, generateKeyPair, type KeyLike } from "jose";
3
+ import { importPKCS8, importSPKI, exportPKCS8, exportSPKI, generateKeyPair } from "jose";
4
4
  import { db } from "../../db/index.js";
5
5
  import { secrets, type Secret } from "../../db/schema.js";
6
6
  import { config } from "../../config.js";
@@ -1,5 +1,5 @@
1
1
  import crypto from "node:crypto";
2
- import { importPKCS8, importSPKI, exportPKCS8, exportSPKI, generateKeyPair, type KeyLike } from "jose";
2
+ import { importPKCS8, importSPKI, exportPKCS8, exportSPKI, generateKeyPair } from "jose";
3
3
  import { config } from "../../config.js";
4
4
  import type { SecretsProvider, SigningKeyPair } from "./provider.js";
5
5
  import { hashPassword, verifyPassword } from "./password.js";
@@ -1,9 +1,7 @@
1
- import type { KeyLike } from "jose";
2
-
3
1
  export interface SigningKeyPair {
4
2
  keyId: string;
5
- privateKey: KeyLike | Uint8Array;
6
- publicKey: KeyLike;
3
+ privateKey: CryptoKey | Uint8Array;
4
+ publicKey: CryptoKey;
7
5
  }
8
6
 
9
7
  export interface SecretsProvider {
@@ -7,7 +7,6 @@ import {
7
7
  decodeProtectedHeader,
8
8
  exportJWK,
9
9
  type JWTPayload,
10
- type KeyLike,
11
10
  } from "jose";
12
11
  import { eq, and, gt, isNull } from "drizzle-orm";
13
12
  import { db } from "../db/index.js";
@@ -7,7 +7,7 @@ import {
7
7
  verifyAuthenticationResponse,
8
8
  type RegistrationResponseJSON,
9
9
  type AuthenticationResponseJSON,
10
- type AuthenticatorTransportFuture,
10
+ type AuthenticatorTransport,
11
11
  } from "@simplewebauthn/server";
12
12
  import { db } from "../db/index.js";
13
13
  import {
@@ -114,7 +114,7 @@ export async function verifyAndStoreRegistration(
114
114
  credentialId: credential.id,
115
115
  publicKey: Buffer.from(credential.publicKey).toString("base64url"),
116
116
  counter: credential.counter,
117
- transports: (credential.transports || []) as AuthenticatorTransportFuture[],
117
+ transports: (credential.transports || []) as AuthenticatorTransport[],
118
118
  aaguid: info.aaguid || null,
119
119
  deviceName: deviceName || null,
120
120
  });
@@ -124,7 +124,7 @@ export async function verifyAndStoreRegistration(
124
124
 
125
125
  export async function buildAuthenticationOptions(email?: string) {
126
126
  let allowCredentials:
127
- | { id: string; type: "public-key"; transports?: AuthenticatorTransportFuture[] }[]
127
+ | { id: string; type: "public-key"; transports?: AuthenticatorTransport[] }[]
128
128
  | undefined;
129
129
  let userId: string | undefined;
130
130
 
@@ -136,7 +136,7 @@ export async function buildAuthenticationOptions(email?: string) {
136
136
  allowCredentials = credentials.map((c) => ({
137
137
  id: c.credentialId,
138
138
  type: "public-key" as const,
139
- transports: (c.transports || []) as AuthenticatorTransportFuture[],
139
+ transports: (c.transports || []) as AuthenticatorTransport[],
140
140
  }));
141
141
  }
142
142
  }
@@ -167,7 +167,7 @@ export async function verifyAuthentication(response: AuthenticationResponseJSON,
167
167
  id: credential.credentialId,
168
168
  publicKey: Buffer.from(credential.publicKey, "base64url"),
169
169
  counter: credential.counter,
170
- transports: (credential.transports || []) as AuthenticatorTransportFuture[],
170
+ transports: (credential.transports || []) as AuthenticatorTransport[],
171
171
  },
172
172
  requireUserVerification: false,
173
173
  });