solana-auth-oauth2-server 0.1.0-canary-20260125211037 → 0.1.0-canary-20260125224000
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/dist/cli.cjs +313 -20
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +312 -19
- package/dist/cli.js.map +1 -1
- package/package.json +2 -1
package/dist/cli.cjs
CHANGED
|
@@ -66,6 +66,7 @@ var package_default = {
|
|
|
66
66
|
"db:migrate": "drizzle-kit migrate",
|
|
67
67
|
"db:push": "drizzle-kit push",
|
|
68
68
|
"db:seed": "bun src/seed.ts",
|
|
69
|
+
"db:seed:oauth": "bun scripts/seed-oauth.ts",
|
|
69
70
|
"db:studio": "drizzle-kit studio",
|
|
70
71
|
lint: "biome check --error-on-warnings",
|
|
71
72
|
"lint:fix": "biome check --error-on-warnings --write",
|
|
@@ -80,11 +81,15 @@ var package_default = {
|
|
|
80
81
|
};
|
|
81
82
|
|
|
82
83
|
// src/api.ts
|
|
83
|
-
var
|
|
84
|
+
var import_hono6 = require("hono");
|
|
84
85
|
|
|
85
86
|
// src/api-admin.ts
|
|
86
|
-
var
|
|
87
|
-
var
|
|
87
|
+
var import_zod_validator3 = require("@hono/zod-validator");
|
|
88
|
+
var import_drizzle_orm10 = require("drizzle-orm");
|
|
89
|
+
var import_hono5 = require("hono");
|
|
90
|
+
|
|
91
|
+
// src/api-admin-auth-codes.ts
|
|
92
|
+
var import_drizzle_orm6 = require("drizzle-orm");
|
|
88
93
|
var import_hono = require("hono");
|
|
89
94
|
|
|
90
95
|
// src/db/index.ts
|
|
@@ -94,24 +99,113 @@ var import_libsql = require("drizzle-orm/libsql");
|
|
|
94
99
|
// src/db/schema/index.ts
|
|
95
100
|
var schema_exports = {};
|
|
96
101
|
__export(schema_exports, {
|
|
102
|
+
authCodes: () => authCodes,
|
|
103
|
+
clients: () => clients,
|
|
104
|
+
insertAuthCodeSchema: () => insertAuthCodeSchema,
|
|
105
|
+
insertClientSchema: () => insertClientSchema,
|
|
106
|
+
insertScopeSchema: () => insertScopeSchema,
|
|
107
|
+
insertTokenSchema: () => insertTokenSchema,
|
|
97
108
|
insertUserSchema: () => insertUserSchema,
|
|
109
|
+
scopes: () => scopes,
|
|
110
|
+
selectAuthCodeSchema: () => selectAuthCodeSchema,
|
|
111
|
+
selectClientSchema: () => selectClientSchema,
|
|
112
|
+
selectScopeSchema: () => selectScopeSchema,
|
|
113
|
+
selectTokenSchema: () => selectTokenSchema,
|
|
98
114
|
selectUserSchema: () => selectUserSchema,
|
|
115
|
+
tokens: () => tokens,
|
|
99
116
|
users: () => users
|
|
100
117
|
});
|
|
101
118
|
|
|
102
|
-
// src/db/schema/
|
|
119
|
+
// src/db/schema/auth-codes.ts
|
|
103
120
|
var import_drizzle_orm = require("drizzle-orm");
|
|
104
121
|
var import_sqlite_core = require("drizzle-orm/sqlite-core");
|
|
105
122
|
var import_drizzle_zod = require("drizzle-zod");
|
|
106
|
-
var
|
|
123
|
+
var authCodes = (0, import_sqlite_core.sqliteTable)("auth_codes", {
|
|
124
|
+
clientId: (0, import_sqlite_core.text)("client_id").notNull(),
|
|
125
|
+
code: (0, import_sqlite_core.text)("code").primaryKey(),
|
|
126
|
+
codeChallenge: (0, import_sqlite_core.text)("code_challenge"),
|
|
127
|
+
codeChallengeMethod: (0, import_sqlite_core.text)("code_challenge_method").$type(),
|
|
107
128
|
createdAt: (0, import_sqlite_core.integer)("created_at", { mode: "timestamp_ms" }).default(import_drizzle_orm.sql`(cast(unixepoch('subsecond') * 1000 as integer))`).notNull(),
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
updatedAt: (0, import_sqlite_core.integer)("updated_at", { mode: "timestamp_ms" }).default(import_drizzle_orm.sql`(cast(unixepoch('subsecond') * 1000 as integer))`).$onUpdate(() => /* @__PURE__ */ new Date()).notNull()
|
|
129
|
+
expiresAt: (0, import_sqlite_core.integer)("expires_at", { mode: "timestamp_ms" }).notNull(),
|
|
130
|
+
redirectUri: (0, import_sqlite_core.text)("redirect_uri"),
|
|
131
|
+
scopeIds: (0, import_sqlite_core.text)("scope_ids", { mode: "json" }).$type().notNull().default([]),
|
|
132
|
+
updatedAt: (0, import_sqlite_core.integer)("updated_at", { mode: "timestamp_ms" }).default(import_drizzle_orm.sql`(cast(unixepoch('subsecond') * 1000 as integer))`).$onUpdate(() => /* @__PURE__ */ new Date()).notNull(),
|
|
133
|
+
userId: (0, import_sqlite_core.text)("user_id")
|
|
134
|
+
});
|
|
135
|
+
var insertAuthCodeSchema = (0, import_drizzle_zod.createInsertSchema)(authCodes);
|
|
136
|
+
var selectAuthCodeSchema = (0, import_drizzle_zod.createSelectSchema)(authCodes);
|
|
137
|
+
|
|
138
|
+
// src/db/schema/clients.ts
|
|
139
|
+
var import_drizzle_orm2 = require("drizzle-orm");
|
|
140
|
+
var import_sqlite_core2 = require("drizzle-orm/sqlite-core");
|
|
141
|
+
var import_drizzle_zod2 = require("drizzle-zod");
|
|
142
|
+
var clients = (0, import_sqlite_core2.sqliteTable)("clients", {
|
|
143
|
+
allowedGrants: (0, import_sqlite_core2.text)("allowed_grants", { mode: "json" }).$type().notNull().default([]),
|
|
144
|
+
createdAt: (0, import_sqlite_core2.integer)("created_at", { mode: "timestamp_ms" }).default(import_drizzle_orm2.sql`(cast(unixepoch('subsecond') * 1000 as integer))`).notNull(),
|
|
145
|
+
id: (0, import_sqlite_core2.text)("id").primaryKey(),
|
|
146
|
+
name: (0, import_sqlite_core2.text)("name").notNull(),
|
|
147
|
+
redirectUris: (0, import_sqlite_core2.text)("redirect_uris", { mode: "json" }).$type().notNull().default([]),
|
|
148
|
+
scopeIds: (0, import_sqlite_core2.text)("scope_ids", { mode: "json" }).$type().notNull().default([]),
|
|
149
|
+
secret: (0, import_sqlite_core2.text)("secret"),
|
|
150
|
+
updatedAt: (0, import_sqlite_core2.integer)("updated_at", { mode: "timestamp_ms" }).default(import_drizzle_orm2.sql`(cast(unixepoch('subsecond') * 1000 as integer))`).$onUpdate(() => /* @__PURE__ */ new Date()).notNull()
|
|
151
|
+
});
|
|
152
|
+
var insertClientSchema = (0, import_drizzle_zod2.createInsertSchema)(clients);
|
|
153
|
+
var selectClientSchema = (0, import_drizzle_zod2.createSelectSchema)(clients);
|
|
154
|
+
|
|
155
|
+
// src/db/schema/scopes.ts
|
|
156
|
+
var import_drizzle_orm3 = require("drizzle-orm");
|
|
157
|
+
var import_sqlite_core3 = require("drizzle-orm/sqlite-core");
|
|
158
|
+
var import_drizzle_zod3 = require("drizzle-zod");
|
|
159
|
+
var scopes = (0, import_sqlite_core3.sqliteTable)("scopes", {
|
|
160
|
+
createdAt: (0, import_sqlite_core3.integer)("created_at", { mode: "timestamp_ms" }).default(import_drizzle_orm3.sql`(cast(unixepoch('subsecond') * 1000 as integer))`).notNull(),
|
|
161
|
+
description: (0, import_sqlite_core3.text)("description"),
|
|
162
|
+
id: (0, import_sqlite_core3.text)("id").primaryKey(),
|
|
163
|
+
name: (0, import_sqlite_core3.text)("name").notNull().unique(),
|
|
164
|
+
updatedAt: (0, import_sqlite_core3.integer)("updated_at", { mode: "timestamp_ms" }).default(import_drizzle_orm3.sql`(cast(unixepoch('subsecond') * 1000 as integer))`).$onUpdate(() => /* @__PURE__ */ new Date()).notNull()
|
|
165
|
+
});
|
|
166
|
+
var insertScopeSchema = (0, import_drizzle_zod3.createInsertSchema)(scopes);
|
|
167
|
+
var selectScopeSchema = (0, import_drizzle_zod3.createSelectSchema)(scopes);
|
|
168
|
+
|
|
169
|
+
// src/db/schema/tokens.ts
|
|
170
|
+
var import_drizzle_orm4 = require("drizzle-orm");
|
|
171
|
+
var import_sqlite_core4 = require("drizzle-orm/sqlite-core");
|
|
172
|
+
var import_drizzle_zod4 = require("drizzle-zod");
|
|
173
|
+
var tokens = (0, import_sqlite_core4.sqliteTable)("tokens", {
|
|
174
|
+
accessToken: (0, import_sqlite_core4.text)("access_token").primaryKey(),
|
|
175
|
+
accessTokenExpiresAt: (0, import_sqlite_core4.integer)("access_token_expires_at", {
|
|
176
|
+
mode: "timestamp_ms"
|
|
177
|
+
}).notNull(),
|
|
178
|
+
clientId: (0, import_sqlite_core4.text)("client_id").notNull(),
|
|
179
|
+
createdAt: (0, import_sqlite_core4.integer)("created_at", { mode: "timestamp_ms" }).default(import_drizzle_orm4.sql`(cast(unixepoch('subsecond') * 1000 as integer))`).notNull(),
|
|
180
|
+
originatingAuthCodeId: (0, import_sqlite_core4.text)("originating_auth_code_id"),
|
|
181
|
+
refreshToken: (0, import_sqlite_core4.text)("refresh_token").unique(),
|
|
182
|
+
refreshTokenExpiresAt: (0, import_sqlite_core4.integer)("refresh_token_expires_at", {
|
|
183
|
+
mode: "timestamp_ms"
|
|
184
|
+
}),
|
|
185
|
+
scopeIds: (0, import_sqlite_core4.text)("scope_ids", { mode: "json" }).$type().notNull().default([]),
|
|
186
|
+
updatedAt: (0, import_sqlite_core4.integer)("updated_at", { mode: "timestamp_ms" }).default(import_drizzle_orm4.sql`(cast(unixepoch('subsecond') * 1000 as integer))`).$onUpdate(() => /* @__PURE__ */ new Date()).notNull(),
|
|
187
|
+
userId: (0, import_sqlite_core4.text)("user_id")
|
|
112
188
|
});
|
|
113
|
-
var
|
|
114
|
-
var
|
|
189
|
+
var insertTokenSchema = (0, import_drizzle_zod4.createInsertSchema)(tokens);
|
|
190
|
+
var selectTokenSchema = (0, import_drizzle_zod4.createSelectSchema)(tokens);
|
|
191
|
+
|
|
192
|
+
// src/db/schema/users.ts
|
|
193
|
+
var import_drizzle_orm5 = require("drizzle-orm");
|
|
194
|
+
var import_sqlite_core5 = require("drizzle-orm/sqlite-core");
|
|
195
|
+
var import_drizzle_zod5 = require("drizzle-zod");
|
|
196
|
+
var users = (0, import_sqlite_core5.sqliteTable)("users", {
|
|
197
|
+
createdAt: (0, import_sqlite_core5.integer)("created_at", { mode: "timestamp_ms" }).default(import_drizzle_orm5.sql`(cast(unixepoch('subsecond') * 1000 as integer))`).notNull(),
|
|
198
|
+
email: (0, import_sqlite_core5.text)("email").notNull().unique(),
|
|
199
|
+
id: (0, import_sqlite_core5.text)("id").primaryKey(),
|
|
200
|
+
lastLoginAt: (0, import_sqlite_core5.integer)("last_login_at", { mode: "timestamp_ms" }),
|
|
201
|
+
name: (0, import_sqlite_core5.text)("name").notNull(),
|
|
202
|
+
passwordHash: (0, import_sqlite_core5.text)("password_hash"),
|
|
203
|
+
role: (0, import_sqlite_core5.text)("role").default("user").notNull(),
|
|
204
|
+
tokenVersion: (0, import_sqlite_core5.integer)("token_version").default(0).notNull(),
|
|
205
|
+
updatedAt: (0, import_sqlite_core5.integer)("updated_at", { mode: "timestamp_ms" }).default(import_drizzle_orm5.sql`(cast(unixepoch('subsecond') * 1000 as integer))`).$onUpdate(() => /* @__PURE__ */ new Date()).notNull()
|
|
206
|
+
});
|
|
207
|
+
var insertUserSchema = (0, import_drizzle_zod5.createInsertSchema)(users);
|
|
208
|
+
var selectUserSchema = (0, import_drizzle_zod5.createSelectSchema)(users);
|
|
115
209
|
|
|
116
210
|
// src/db/index.ts
|
|
117
211
|
var client = (0, import_client.createClient)({
|
|
@@ -120,37 +214,236 @@ var client = (0, import_client.createClient)({
|
|
|
120
214
|
});
|
|
121
215
|
var db = (0, import_libsql.drizzle)(client, { schema: schema_exports });
|
|
122
216
|
|
|
217
|
+
// src/api-admin-auth-codes.ts
|
|
218
|
+
var apiAdminAuthCodes = new import_hono.Hono();
|
|
219
|
+
apiAdminAuthCodes.get("/", async (c) => {
|
|
220
|
+
const result = await db.select().from(authCodes).all();
|
|
221
|
+
return c.json(result);
|
|
222
|
+
});
|
|
223
|
+
apiAdminAuthCodes.get("/:code", async (c) => {
|
|
224
|
+
const code = c.req.param("code");
|
|
225
|
+
const result = await db.select().from(authCodes).where((0, import_drizzle_orm6.eq)(authCodes.code, code)).get();
|
|
226
|
+
if (!result) {
|
|
227
|
+
return c.json({ error: "Auth code not found" }, 404);
|
|
228
|
+
}
|
|
229
|
+
return c.json(result);
|
|
230
|
+
});
|
|
231
|
+
apiAdminAuthCodes.delete("/:code", async (c) => {
|
|
232
|
+
const code = c.req.param("code");
|
|
233
|
+
const result = await db.delete(authCodes).where((0, import_drizzle_orm6.eq)(authCodes.code, code)).returning().get();
|
|
234
|
+
if (!result) {
|
|
235
|
+
return c.json({ error: "Auth code not found" }, 404);
|
|
236
|
+
}
|
|
237
|
+
return c.json({ message: "Auth code deleted" });
|
|
238
|
+
});
|
|
239
|
+
apiAdminAuthCodes.post("/:code/revoke", async (c) => {
|
|
240
|
+
const code = c.req.param("code");
|
|
241
|
+
const result = await db.update(authCodes).set({ expiresAt: /* @__PURE__ */ new Date(0) }).where((0, import_drizzle_orm6.eq)(authCodes.code, code)).returning().get();
|
|
242
|
+
if (!result) {
|
|
243
|
+
return c.json({ error: "Auth code not found" }, 404);
|
|
244
|
+
}
|
|
245
|
+
return c.json({ message: "Auth code revoked" });
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
// src/api-admin-clients.ts
|
|
249
|
+
var import_zod_validator = require("@hono/zod-validator");
|
|
250
|
+
var import_drizzle_orm7 = require("drizzle-orm");
|
|
251
|
+
var import_hono2 = require("hono");
|
|
252
|
+
|
|
253
|
+
// src/utils.ts
|
|
254
|
+
var import_node_crypto = require("crypto");
|
|
255
|
+
function generateRandomToken(length = 32) {
|
|
256
|
+
return (0, import_node_crypto.randomBytes)(length).toString("hex");
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// src/api-admin-clients.ts
|
|
260
|
+
var apiAdminClients = new import_hono2.Hono();
|
|
261
|
+
apiAdminClients.get("/", async (c) => {
|
|
262
|
+
const result = await db.select().from(clients).all();
|
|
263
|
+
return c.json(result);
|
|
264
|
+
});
|
|
265
|
+
apiAdminClients.get("/:id", async (c) => {
|
|
266
|
+
const id = c.req.param("id");
|
|
267
|
+
const result = await db.select().from(clients).where((0, import_drizzle_orm7.eq)(clients.id, id)).get();
|
|
268
|
+
if (!result) {
|
|
269
|
+
return c.json({ error: "Client not found" }, 404);
|
|
270
|
+
}
|
|
271
|
+
return c.json(result);
|
|
272
|
+
});
|
|
273
|
+
apiAdminClients.post("/", (0, import_zod_validator.zValidator)("json", insertClientSchema), async (c) => {
|
|
274
|
+
const body = c.req.valid("json");
|
|
275
|
+
try {
|
|
276
|
+
const result = await db.insert(clients).values({
|
|
277
|
+
allowedGrants: body.allowedGrants ?? ["authorization_code", "refresh_token"],
|
|
278
|
+
id: body.id,
|
|
279
|
+
name: body.name,
|
|
280
|
+
redirectUris: body.redirectUris ?? [],
|
|
281
|
+
scopeIds: body.scopeIds ?? [],
|
|
282
|
+
secret: body.secret ?? generateRandomToken()
|
|
283
|
+
}).returning().get();
|
|
284
|
+
return c.json(result, 201);
|
|
285
|
+
} catch (err) {
|
|
286
|
+
if (err instanceof Error && err.message?.includes("UNIQUE constraint failed")) {
|
|
287
|
+
return c.json({ error: "Client already exists" }, 409);
|
|
288
|
+
}
|
|
289
|
+
return c.json({ error: "Failed to create client" }, 500);
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
apiAdminClients.put(
|
|
293
|
+
"/:id",
|
|
294
|
+
(0, import_zod_validator.zValidator)(
|
|
295
|
+
"json",
|
|
296
|
+
insertClientSchema.pick({
|
|
297
|
+
allowedGrants: true,
|
|
298
|
+
name: true,
|
|
299
|
+
redirectUris: true,
|
|
300
|
+
scopeIds: true,
|
|
301
|
+
secret: true
|
|
302
|
+
}).partial()
|
|
303
|
+
),
|
|
304
|
+
async (c) => {
|
|
305
|
+
const id = c.req.param("id");
|
|
306
|
+
const body = c.req.valid("json");
|
|
307
|
+
const result = await db.update(clients).set(body).where((0, import_drizzle_orm7.eq)(clients.id, id)).returning().get();
|
|
308
|
+
if (!result) {
|
|
309
|
+
return c.json({ error: "Client not found" }, 404);
|
|
310
|
+
}
|
|
311
|
+
return c.json(result);
|
|
312
|
+
}
|
|
313
|
+
);
|
|
314
|
+
apiAdminClients.delete("/:id", async (c) => {
|
|
315
|
+
const id = c.req.param("id");
|
|
316
|
+
const result = await db.delete(clients).where((0, import_drizzle_orm7.eq)(clients.id, id)).returning().get();
|
|
317
|
+
if (!result) {
|
|
318
|
+
return c.json({ error: "Client not found" }, 404);
|
|
319
|
+
}
|
|
320
|
+
return c.json({ message: "Client deleted" });
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
// src/api-admin-scopes.ts
|
|
324
|
+
var import_zod_validator2 = require("@hono/zod-validator");
|
|
325
|
+
var import_drizzle_orm8 = require("drizzle-orm");
|
|
326
|
+
var import_hono3 = require("hono");
|
|
327
|
+
var apiAdminScopes = new import_hono3.Hono();
|
|
328
|
+
apiAdminScopes.get("/", async (c) => {
|
|
329
|
+
const result = await db.select().from(scopes).all();
|
|
330
|
+
return c.json(result);
|
|
331
|
+
});
|
|
332
|
+
apiAdminScopes.get("/:id", async (c) => {
|
|
333
|
+
const id = c.req.param("id");
|
|
334
|
+
const result = await db.select().from(scopes).where((0, import_drizzle_orm8.eq)(scopes.id, id)).get();
|
|
335
|
+
if (!result) {
|
|
336
|
+
return c.json({ error: "Scope not found" }, 404);
|
|
337
|
+
}
|
|
338
|
+
return c.json(result);
|
|
339
|
+
});
|
|
340
|
+
apiAdminScopes.post("/", (0, import_zod_validator2.zValidator)("json", insertScopeSchema), async (c) => {
|
|
341
|
+
const body = c.req.valid("json");
|
|
342
|
+
try {
|
|
343
|
+
const result = await db.insert(scopes).values({
|
|
344
|
+
description: body.description ?? null,
|
|
345
|
+
id: body.id,
|
|
346
|
+
name: body.name
|
|
347
|
+
}).returning().get();
|
|
348
|
+
return c.json(result, 201);
|
|
349
|
+
} catch (err) {
|
|
350
|
+
if (err instanceof Error && err.message?.includes("UNIQUE constraint failed")) {
|
|
351
|
+
return c.json({ error: "Scope already exists" }, 409);
|
|
352
|
+
}
|
|
353
|
+
return c.json({ error: "Failed to create scope" }, 500);
|
|
354
|
+
}
|
|
355
|
+
});
|
|
356
|
+
apiAdminScopes.put(
|
|
357
|
+
"/:id",
|
|
358
|
+
(0, import_zod_validator2.zValidator)("json", insertScopeSchema.pick({ description: true, name: true }).partial()),
|
|
359
|
+
async (c) => {
|
|
360
|
+
const id = c.req.param("id");
|
|
361
|
+
const body = c.req.valid("json");
|
|
362
|
+
const result = await db.update(scopes).set({ description: body.description, name: body.name }).where((0, import_drizzle_orm8.eq)(scopes.id, id)).returning().get();
|
|
363
|
+
if (!result) {
|
|
364
|
+
return c.json({ error: "Scope not found" }, 404);
|
|
365
|
+
}
|
|
366
|
+
return c.json(result);
|
|
367
|
+
}
|
|
368
|
+
);
|
|
369
|
+
apiAdminScopes.delete("/:id", async (c) => {
|
|
370
|
+
const id = c.req.param("id");
|
|
371
|
+
const result = await db.delete(scopes).where((0, import_drizzle_orm8.eq)(scopes.id, id)).returning().get();
|
|
372
|
+
if (!result) {
|
|
373
|
+
return c.json({ error: "Scope not found" }, 404);
|
|
374
|
+
}
|
|
375
|
+
return c.json({ message: "Scope deleted" });
|
|
376
|
+
});
|
|
377
|
+
|
|
378
|
+
// src/api-admin-tokens.ts
|
|
379
|
+
var import_drizzle_orm9 = require("drizzle-orm");
|
|
380
|
+
var import_hono4 = require("hono");
|
|
381
|
+
var apiAdminTokens = new import_hono4.Hono();
|
|
382
|
+
apiAdminTokens.get("/", async (c) => {
|
|
383
|
+
const result = await db.select().from(tokens).all();
|
|
384
|
+
return c.json(result);
|
|
385
|
+
});
|
|
386
|
+
apiAdminTokens.get("/:accessToken", async (c) => {
|
|
387
|
+
const accessToken = c.req.param("accessToken");
|
|
388
|
+
const result = await db.select().from(tokens).where((0, import_drizzle_orm9.eq)(tokens.accessToken, accessToken)).get();
|
|
389
|
+
if (!result) {
|
|
390
|
+
return c.json({ error: "Token not found" }, 404);
|
|
391
|
+
}
|
|
392
|
+
return c.json(result);
|
|
393
|
+
});
|
|
394
|
+
apiAdminTokens.delete("/:accessToken", async (c) => {
|
|
395
|
+
const accessToken = c.req.param("accessToken");
|
|
396
|
+
const result = await db.delete(tokens).where((0, import_drizzle_orm9.eq)(tokens.accessToken, accessToken)).returning().get();
|
|
397
|
+
if (!result) {
|
|
398
|
+
return c.json({ error: "Token not found" }, 404);
|
|
399
|
+
}
|
|
400
|
+
return c.json({ message: "Token deleted" });
|
|
401
|
+
});
|
|
402
|
+
apiAdminTokens.post("/:accessToken/revoke", async (c) => {
|
|
403
|
+
const accessToken = c.req.param("accessToken");
|
|
404
|
+
const result = await db.update(tokens).set({
|
|
405
|
+
accessTokenExpiresAt: /* @__PURE__ */ new Date(0),
|
|
406
|
+
refreshTokenExpiresAt: /* @__PURE__ */ new Date(0)
|
|
407
|
+
}).where((0, import_drizzle_orm9.eq)(tokens.accessToken, accessToken)).returning().get();
|
|
408
|
+
if (!result) {
|
|
409
|
+
return c.json({ error: "Token not found" }, 404);
|
|
410
|
+
}
|
|
411
|
+
return c.json({ message: "Token revoked" });
|
|
412
|
+
});
|
|
413
|
+
|
|
123
414
|
// src/api-admin.ts
|
|
124
|
-
var apiAdmin = new
|
|
415
|
+
var apiAdmin = new import_hono5.Hono();
|
|
416
|
+
apiAdmin.route("/scopes", apiAdminScopes);
|
|
417
|
+
apiAdmin.route("/clients", apiAdminClients);
|
|
418
|
+
apiAdmin.route("/tokens", apiAdminTokens);
|
|
419
|
+
apiAdmin.route("/auth-codes", apiAdminAuthCodes);
|
|
125
420
|
apiAdmin.get("/users", async (c) => {
|
|
126
421
|
const result = await db.select().from(users).all();
|
|
127
422
|
return c.json(result);
|
|
128
423
|
});
|
|
129
424
|
apiAdmin.get("/users/:id", async (c) => {
|
|
130
425
|
const id = c.req.param("id");
|
|
131
|
-
const result = await db.select().from(users).where((0,
|
|
426
|
+
const result = await db.select().from(users).where((0, import_drizzle_orm10.eq)(users.id, id)).get();
|
|
132
427
|
if (!result) {
|
|
133
428
|
return c.json({ error: "User not found" }, 404);
|
|
134
429
|
}
|
|
135
430
|
return c.json(result);
|
|
136
431
|
});
|
|
137
|
-
apiAdmin.post("/users", (0,
|
|
432
|
+
apiAdmin.post("/users", (0, import_zod_validator3.zValidator)("json", insertUserSchema), async (c) => {
|
|
138
433
|
const body = c.req.valid("json");
|
|
139
434
|
try {
|
|
140
435
|
const result = await db.insert(users).values(body).returning().get();
|
|
141
436
|
return c.json(result, 201);
|
|
142
437
|
} catch (err) {
|
|
143
|
-
if (err instanceof Error) {
|
|
144
|
-
|
|
145
|
-
return c.json({ error: "User already exists" }, 409);
|
|
146
|
-
}
|
|
438
|
+
if (err instanceof Error && err.message?.includes("UNIQUE constraint failed")) {
|
|
439
|
+
return c.json({ error: "User already exists" }, 409);
|
|
147
440
|
}
|
|
148
441
|
return c.json({ error: "Failed to create user" }, 500);
|
|
149
442
|
}
|
|
150
443
|
});
|
|
151
444
|
apiAdmin.delete("/users/:id", async (c) => {
|
|
152
445
|
const id = c.req.param("id");
|
|
153
|
-
const result = await db.delete(users).where((0,
|
|
446
|
+
const result = await db.delete(users).where((0, import_drizzle_orm10.eq)(users.id, id)).returning().get();
|
|
154
447
|
if (!result) {
|
|
155
448
|
return c.json({ error: "User not found" }, 404);
|
|
156
449
|
}
|
|
@@ -159,7 +452,7 @@ apiAdmin.delete("/users/:id", async (c) => {
|
|
|
159
452
|
|
|
160
453
|
// src/api.ts
|
|
161
454
|
function startServer(port = 3e3, options = {}) {
|
|
162
|
-
const app = new
|
|
455
|
+
const app = new import_hono6.Hono();
|
|
163
456
|
app.get("/", (c) => {
|
|
164
457
|
return c.text("Hello Hono!");
|
|
165
458
|
});
|
package/dist/cli.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../package.json","../src/api.ts","../src/api-admin.ts","../src/db/index.ts","../src/db/schema/index.ts","../src/db/schema/users.ts"],"sourcesContent":["#!/usr/bin/env bun\nimport { Command } from 'commander'\nimport packageJson from '../package.json' with { type: 'json' }\nimport { startServer } from './api.ts'\n\nconst program = new Command()\n\nprogram.name(packageJson.name).description(packageJson.description).version(packageJson.version)\n\nprogram\n .command('start')\n .description('Start the API server')\n .option('--admin', 'Enable admin API endpoints', false)\n .option('-p, --port <number>', 'Port to run the server on', '3000')\n .action((options) => {\n const { app, port } = startServer(parseInt(options.port, 10), {\n enableAdmin: options.admin,\n })\n\n Bun.serve({ fetch: app.fetch, port })\n })\n\nprogram.parse(process.argv)\n","{\n \"bin\": {\n \"solana-auth-oauth2-server\": \"dist/cli.js\"\n },\n \"dependencies\": {\n \"@hono/zod-validator\": \"^0.7.6\",\n \"@libsql/client\": \"^0.17.0\",\n \"commander\": \"^14.0.2\",\n \"drizzle-orm\": \"^0.45.1\",\n \"drizzle-zod\": \"^0.8.3\",\n \"hono\": \"^4.11.5\",\n \"libsql\": \"^0.5.22\",\n \"zod\": \"^4.3.6\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"^2.3.11\",\n \"@changesets/cli\": \"^2.29.8\",\n \"@types/bun\": \"latest\",\n \"drizzle-kit\": \"^0.31.8\",\n \"pkg-pr-new\": \"^0.0.62\",\n \"publint\": \"^0.3.16\",\n \"tsup\": \"^8.5.1\"\n },\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n }\n },\n \"files\": [\"dist\"],\n \"license\": \"MIT\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"name\": \"solana-auth-oauth2-server\",\n \"description\": \"Solana Auth OAuth2 Server\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/solana-auth/solana-auth-oauth2-server.git\"\n },\n \"peerDependencies\": {\n \"typescript\": \"^5\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"changeset\": \"changeset\",\n \"check-types\": \"tsc -b --noEmit\",\n \"db:generate\": \"drizzle-kit generate\",\n \"db:migrate\": \"drizzle-kit migrate\",\n \"db:push\": \"drizzle-kit push\",\n \"db:seed\": \"bun src/seed.ts\",\n \"db:studio\": \"drizzle-kit studio\",\n \"lint\": \"biome check --error-on-warnings\",\n \"lint:fix\": \"biome check --error-on-warnings --write\",\n \"release\": \"changeset publish\",\n \"test\": \"bun test ./test/\",\n \"test:watch\": \"bun test --watch ./test/\",\n \"version\": \"changeset version && bun lint:fix\"\n },\n \"type\": \"module\",\n \"types\": \"./dist/index.d.ts\",\n \"version\": \"0.0.0\"\n}\n","import { Hono } from 'hono'\nimport { apiAdmin } from './api-admin.ts'\n\nexport function startServer(port: number = 3000, options: { enableAdmin?: boolean } = {}) {\n const app = new Hono()\n\n app.get('/', (c) => {\n return c.text('Hello Hono!')\n })\n\n if (options.enableAdmin) {\n app.route('/admin', apiAdmin)\n console.log('Admin API enabled at /admin')\n }\n\n console.log(`Server is running on port ${port}`)\n\n return {\n app,\n port,\n }\n}\n","import { zValidator } from '@hono/zod-validator'\nimport { eq } from 'drizzle-orm'\nimport { Hono } from 'hono'\nimport { db } from './db/index.ts'\nimport { insertUserSchema, users } from './db/schema/index.ts'\n\nexport const apiAdmin = new Hono()\n\n// List users\napiAdmin.get('/users', async (c) => {\n const result = await db.select().from(users).all()\n return c.json(result)\n})\n\n// Get user by ID\napiAdmin.get('/users/:id', async (c) => {\n const id = c.req.param('id')\n const result = await db.select().from(users).where(eq(users.id, id)).get()\n\n if (!result) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n return c.json(result)\n})\n\n// Create user\napiAdmin.post('/users', zValidator('json', insertUserSchema), async (c) => {\n const body = c.req.valid('json')\n\n try {\n const result = await db.insert(users).values(body).returning().get()\n\n return c.json(result, 201)\n } catch (err) {\n if (err instanceof Error) {\n if (err.message?.includes('UNIQUE constraint failed')) {\n return c.json({ error: 'User already exists' }, 409)\n }\n }\n return c.json({ error: 'Failed to create user' }, 500)\n }\n})\n\n// Delete user\napiAdmin.delete('/users/:id', async (c) => {\n const id = c.req.param('id')\n\n const result = await db.delete(users).where(eq(users.id, id)).returning().get()\n\n if (!result) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n return c.json({ message: 'User deleted' })\n})\n","import { createClient } from '@libsql/client'\nimport { drizzle } from 'drizzle-orm/libsql'\nimport * as schema from './schema/index.ts'\n\nconst client = createClient({\n authToken: process.env.DATABASE_AUTH_TOKEN,\n url: process.env.DATABASE_URL || 'file:local.db',\n})\n\nexport const db = drizzle(client, { schema })\n","export * from './users.ts'\n","import { sql } from 'drizzle-orm'\nimport { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'\nimport { createInsertSchema, createSelectSchema } from 'drizzle-zod'\n\nexport const users = sqliteTable('users', {\n createdAt: integer('created_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .notNull(),\n email: text('email').notNull().unique(),\n id: text('id').primaryKey(),\n name: text('name').notNull(),\n updatedAt: integer('updated_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .$onUpdate(() => new Date())\n .notNull(),\n})\n\nexport const insertUserSchema = createInsertSchema(users)\nexport const selectUserSchema = createSelectSchema(users)\n"],"mappings":"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","names":["import_hono","import_drizzle_orm"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../package.json","../src/api.ts","../src/api-admin.ts","../src/api-admin-auth-codes.ts","../src/db/index.ts","../src/db/schema/index.ts","../src/db/schema/auth-codes.ts","../src/db/schema/clients.ts","../src/db/schema/scopes.ts","../src/db/schema/tokens.ts","../src/db/schema/users.ts","../src/api-admin-clients.ts","../src/utils.ts","../src/api-admin-scopes.ts","../src/api-admin-tokens.ts"],"sourcesContent":["#!/usr/bin/env bun\nimport { Command } from 'commander'\nimport packageJson from '../package.json' with { type: 'json' }\nimport { startServer } from './api.ts'\n\nconst program = new Command()\n\nprogram.name(packageJson.name).description(packageJson.description).version(packageJson.version)\n\nprogram\n .command('start')\n .description('Start the API server')\n .option('--admin', 'Enable admin API endpoints', false)\n .option('-p, --port <number>', 'Port to run the server on', '3000')\n .action((options) => {\n const { app, port } = startServer(parseInt(options.port, 10), {\n enableAdmin: options.admin,\n })\n\n Bun.serve({ fetch: app.fetch, port })\n })\n\nprogram.parse(process.argv)\n","{\n \"bin\": {\n \"solana-auth-oauth2-server\": \"dist/cli.js\"\n },\n \"dependencies\": {\n \"@hono/zod-validator\": \"^0.7.6\",\n \"@libsql/client\": \"^0.17.0\",\n \"commander\": \"^14.0.2\",\n \"drizzle-orm\": \"^0.45.1\",\n \"drizzle-zod\": \"^0.8.3\",\n \"hono\": \"^4.11.5\",\n \"libsql\": \"^0.5.22\",\n \"zod\": \"^4.3.6\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"^2.3.11\",\n \"@changesets/cli\": \"^2.29.8\",\n \"@types/bun\": \"latest\",\n \"drizzle-kit\": \"^0.31.8\",\n \"pkg-pr-new\": \"^0.0.62\",\n \"publint\": \"^0.3.16\",\n \"tsup\": \"^8.5.1\"\n },\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n }\n },\n \"files\": [\"dist\"],\n \"license\": \"MIT\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"name\": \"solana-auth-oauth2-server\",\n \"description\": \"Solana Auth OAuth2 Server\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/solana-auth/solana-auth-oauth2-server.git\"\n },\n \"peerDependencies\": {\n \"typescript\": \"^5\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"changeset\": \"changeset\",\n \"check-types\": \"tsc -b --noEmit\",\n \"db:generate\": \"drizzle-kit generate\",\n \"db:migrate\": \"drizzle-kit migrate\",\n \"db:push\": \"drizzle-kit push\",\n \"db:seed\": \"bun src/seed.ts\",\n \"db:seed:oauth\": \"bun scripts/seed-oauth.ts\",\n \"db:studio\": \"drizzle-kit studio\",\n \"lint\": \"biome check --error-on-warnings\",\n \"lint:fix\": \"biome check --error-on-warnings --write\",\n \"release\": \"changeset publish\",\n \"test\": \"bun test ./test/\",\n \"test:watch\": \"bun test --watch ./test/\",\n \"version\": \"changeset version && bun lint:fix\"\n },\n \"type\": \"module\",\n \"types\": \"./dist/index.d.ts\",\n \"version\": \"0.0.0\"\n}\n","import { Hono } from 'hono'\nimport { apiAdmin } from './api-admin.ts'\n\nexport function startServer(port: number = 3000, options: { enableAdmin?: boolean } = {}) {\n const app = new Hono()\n\n app.get('/', (c) => {\n return c.text('Hello Hono!')\n })\n\n if (options.enableAdmin) {\n app.route('/admin', apiAdmin)\n console.log('Admin API enabled at /admin')\n }\n\n console.log(`Server is running on port ${port}`)\n\n return {\n app,\n port,\n }\n}\n","import { zValidator } from '@hono/zod-validator'\nimport { eq } from 'drizzle-orm'\nimport { Hono } from 'hono'\nimport { apiAdminAuthCodes } from './api-admin-auth-codes.ts'\nimport { apiAdminClients } from './api-admin-clients.ts'\nimport { apiAdminScopes } from './api-admin-scopes.ts'\nimport { apiAdminTokens } from './api-admin-tokens.ts'\nimport { db } from './db/index.ts'\nimport { insertUserSchema, users } from './db/schema/index.ts'\n\nexport const apiAdmin = new Hono()\n\n// Mount sub-routers\napiAdmin.route('/scopes', apiAdminScopes)\napiAdmin.route('/clients', apiAdminClients)\napiAdmin.route('/tokens', apiAdminTokens)\napiAdmin.route('/auth-codes', apiAdminAuthCodes)\n\n// List users\napiAdmin.get('/users', async (c) => {\n const result = await db.select().from(users).all()\n return c.json(result)\n})\n\n// Get user by ID\napiAdmin.get('/users/:id', async (c) => {\n const id = c.req.param('id')\n const result = await db.select().from(users).where(eq(users.id, id)).get()\n if (!result) {\n return c.json({ error: 'User not found' }, 404)\n }\n return c.json(result)\n})\n\n// Create user\napiAdmin.post('/users', zValidator('json', insertUserSchema), async (c) => {\n const body = c.req.valid('json')\n\n try {\n const result = await db.insert(users).values(body).returning().get()\n\n return c.json(result, 201)\n } catch (err) {\n if (err instanceof Error && err.message?.includes('UNIQUE constraint failed')) {\n return c.json({ error: 'User already exists' }, 409)\n }\n return c.json({ error: 'Failed to create user' }, 500)\n }\n})\n\n// Delete user\napiAdmin.delete('/users/:id', async (c) => {\n const id = c.req.param('id')\n const result = await db.delete(users).where(eq(users.id, id)).returning().get()\n if (!result) {\n return c.json({ error: 'User not found' }, 404)\n }\n return c.json({ message: 'User deleted' })\n})\n","import { eq } from 'drizzle-orm'\nimport { Hono } from 'hono'\nimport { db } from './db/index.ts'\nimport { authCodes } from './db/schema/index.ts'\n\nexport const apiAdminAuthCodes = new Hono()\n\napiAdminAuthCodes.get('/', async (c) => {\n const result = await db.select().from(authCodes).all()\n return c.json(result)\n})\n\napiAdminAuthCodes.get('/:code', async (c) => {\n const code = c.req.param('code')\n const result = await db.select().from(authCodes).where(eq(authCodes.code, code)).get()\n if (!result) {\n return c.json({ error: 'Auth code not found' }, 404)\n }\n return c.json(result)\n})\n\napiAdminAuthCodes.delete('/:code', async (c) => {\n const code = c.req.param('code')\n const result = await db.delete(authCodes).where(eq(authCodes.code, code)).returning().get()\n if (!result) {\n return c.json({ error: 'Auth code not found' }, 404)\n }\n return c.json({ message: 'Auth code deleted' })\n})\n\napiAdminAuthCodes.post('/:code/revoke', async (c) => {\n const code = c.req.param('code')\n const result = await db\n .update(authCodes)\n .set({ expiresAt: new Date(0) })\n .where(eq(authCodes.code, code))\n .returning()\n .get()\n if (!result) {\n return c.json({ error: 'Auth code not found' }, 404)\n }\n return c.json({ message: 'Auth code revoked' })\n})\n","import { createClient } from '@libsql/client'\nimport { drizzle } from 'drizzle-orm/libsql'\nimport * as schema from './schema/index.ts'\n\nconst client = createClient({\n authToken: process.env.DATABASE_AUTH_TOKEN,\n url: process.env.DATABASE_URL || 'file:local.db',\n})\n\nexport const db = drizzle(client, { schema })\n","export * from './auth-codes.ts'\nexport * from './clients.ts'\nexport * from './scopes.ts'\nexport * from './tokens.ts'\nexport * from './users.ts'\n","import { sql } from 'drizzle-orm'\nimport { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'\nimport { createInsertSchema, createSelectSchema } from 'drizzle-zod'\n\nexport const authCodes = sqliteTable('auth_codes', {\n clientId: text('client_id').notNull(),\n code: text('code').primaryKey(),\n codeChallenge: text('code_challenge'),\n codeChallengeMethod: text('code_challenge_method').$type<'S256' | 'plain'>(),\n createdAt: integer('created_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .notNull(),\n expiresAt: integer('expires_at', { mode: 'timestamp_ms' }).notNull(),\n redirectUri: text('redirect_uri'),\n scopeIds: text('scope_ids', { mode: 'json' }).$type<string[]>().notNull().default([]),\n updatedAt: integer('updated_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .$onUpdate(() => new Date())\n .notNull(),\n userId: text('user_id'),\n})\n\nexport const insertAuthCodeSchema = createInsertSchema(authCodes)\nexport const selectAuthCodeSchema = createSelectSchema(authCodes)\n","import { sql } from 'drizzle-orm'\nimport { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'\nimport { createInsertSchema, createSelectSchema } from 'drizzle-zod'\n\nexport const clients = sqliteTable('clients', {\n allowedGrants: text('allowed_grants', { mode: 'json' }).$type<string[]>().notNull().default([]),\n createdAt: integer('created_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .notNull(),\n id: text('id').primaryKey(),\n name: text('name').notNull(),\n redirectUris: text('redirect_uris', { mode: 'json' }).$type<string[]>().notNull().default([]),\n scopeIds: text('scope_ids', { mode: 'json' }).$type<string[]>().notNull().default([]),\n secret: text('secret'),\n updatedAt: integer('updated_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .$onUpdate(() => new Date())\n .notNull(),\n})\n\nexport const insertClientSchema = createInsertSchema(clients)\nexport const selectClientSchema = createSelectSchema(clients)\n","import { sql } from 'drizzle-orm'\nimport { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'\nimport { createInsertSchema, createSelectSchema } from 'drizzle-zod'\n\nexport const scopes = sqliteTable('scopes', {\n createdAt: integer('created_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .notNull(),\n description: text('description'),\n id: text('id').primaryKey(),\n name: text('name').notNull().unique(),\n updatedAt: integer('updated_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .$onUpdate(() => new Date())\n .notNull(),\n})\n\nexport const insertScopeSchema = createInsertSchema(scopes)\nexport const selectScopeSchema = createSelectSchema(scopes)\n","import { sql } from 'drizzle-orm'\nimport { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'\nimport { createInsertSchema, createSelectSchema } from 'drizzle-zod'\n\nexport const tokens = sqliteTable('tokens', {\n accessToken: text('access_token').primaryKey(),\n accessTokenExpiresAt: integer('access_token_expires_at', {\n mode: 'timestamp_ms',\n }).notNull(),\n clientId: text('client_id').notNull(),\n createdAt: integer('created_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .notNull(),\n originatingAuthCodeId: text('originating_auth_code_id'),\n refreshToken: text('refresh_token').unique(),\n refreshTokenExpiresAt: integer('refresh_token_expires_at', {\n mode: 'timestamp_ms',\n }),\n scopeIds: text('scope_ids', { mode: 'json' }).$type<string[]>().notNull().default([]),\n updatedAt: integer('updated_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .$onUpdate(() => new Date())\n .notNull(),\n userId: text('user_id'),\n})\n\nexport const insertTokenSchema = createInsertSchema(tokens)\nexport const selectTokenSchema = createSelectSchema(tokens)\n","import { sql } from 'drizzle-orm'\nimport { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'\nimport { createInsertSchema, createSelectSchema } from 'drizzle-zod'\n\nexport const users = sqliteTable('users', {\n createdAt: integer('created_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .notNull(),\n email: text('email').notNull().unique(),\n id: text('id').primaryKey(),\n lastLoginAt: integer('last_login_at', { mode: 'timestamp_ms' }),\n name: text('name').notNull(),\n passwordHash: text('password_hash'),\n role: text('role').default('user').notNull(),\n tokenVersion: integer('token_version').default(0).notNull(),\n updatedAt: integer('updated_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .$onUpdate(() => new Date())\n .notNull(),\n})\n\nexport const insertUserSchema = createInsertSchema(users)\nexport const selectUserSchema = createSelectSchema(users)\n","import { zValidator } from '@hono/zod-validator'\nimport { eq } from 'drizzle-orm'\nimport { Hono } from 'hono'\nimport { db } from './db/index.ts'\nimport { clients, insertClientSchema } from './db/schema/index.ts'\nimport { generateRandomToken } from './utils.ts'\n\nexport const apiAdminClients = new Hono()\n\napiAdminClients.get('/', async (c) => {\n const result = await db.select().from(clients).all()\n return c.json(result)\n})\n\napiAdminClients.get('/:id', async (c) => {\n const id = c.req.param('id')\n const result = await db.select().from(clients).where(eq(clients.id, id)).get()\n if (!result) {\n return c.json({ error: 'Client not found' }, 404)\n }\n return c.json(result)\n})\n\napiAdminClients.post('/', zValidator('json', insertClientSchema), async (c) => {\n const body = c.req.valid('json')\n\n try {\n const result = await db\n .insert(clients)\n .values({\n allowedGrants: body.allowedGrants ?? ['authorization_code', 'refresh_token'],\n id: body.id,\n name: body.name,\n redirectUris: body.redirectUris ?? [],\n scopeIds: body.scopeIds ?? [],\n secret: body.secret ?? generateRandomToken(),\n })\n .returning()\n .get()\n return c.json(result, 201)\n } catch (err) {\n if (err instanceof Error && err.message?.includes('UNIQUE constraint failed')) {\n return c.json({ error: 'Client already exists' }, 409)\n }\n return c.json({ error: 'Failed to create client' }, 500)\n }\n})\n\napiAdminClients.put(\n '/:id',\n zValidator(\n 'json',\n insertClientSchema\n .pick({\n allowedGrants: true,\n name: true,\n redirectUris: true,\n scopeIds: true,\n secret: true,\n })\n .partial(),\n ),\n async (c) => {\n const id = c.req.param('id')\n const body = c.req.valid('json')\n const result = await db.update(clients).set(body).where(eq(clients.id, id)).returning().get()\n if (!result) {\n return c.json({ error: 'Client not found' }, 404)\n }\n return c.json(result)\n },\n)\n\napiAdminClients.delete('/:id', async (c) => {\n const id = c.req.param('id')\n const result = await db.delete(clients).where(eq(clients.id, id)).returning().get()\n if (!result) {\n return c.json({ error: 'Client not found' }, 404)\n }\n return c.json({ message: 'Client deleted' })\n})\n","import { randomBytes } from 'node:crypto'\n\nexport function generateRandomToken(length = 32): string {\n return randomBytes(length).toString('hex')\n}\n","import { zValidator } from '@hono/zod-validator'\nimport { eq } from 'drizzle-orm'\nimport { Hono } from 'hono'\nimport { db } from './db/index.ts'\nimport { insertScopeSchema, scopes } from './db/schema/index.ts'\n\nexport const apiAdminScopes = new Hono()\n\napiAdminScopes.get('/', async (c) => {\n const result = await db.select().from(scopes).all()\n return c.json(result)\n})\n\napiAdminScopes.get('/:id', async (c) => {\n const id = c.req.param('id')\n const result = await db.select().from(scopes).where(eq(scopes.id, id)).get()\n if (!result) {\n return c.json({ error: 'Scope not found' }, 404)\n }\n return c.json(result)\n})\n\napiAdminScopes.post('/', zValidator('json', insertScopeSchema), async (c) => {\n const body = c.req.valid('json')\n\n try {\n const result = await db\n .insert(scopes)\n .values({\n description: body.description ?? null,\n id: body.id,\n name: body.name,\n })\n .returning()\n .get()\n return c.json(result, 201)\n } catch (err) {\n if (err instanceof Error && err.message?.includes('UNIQUE constraint failed')) {\n return c.json({ error: 'Scope already exists' }, 409)\n }\n return c.json({ error: 'Failed to create scope' }, 500)\n }\n})\n\napiAdminScopes.put(\n '/:id',\n zValidator('json', insertScopeSchema.pick({ description: true, name: true }).partial()),\n async (c) => {\n const id = c.req.param('id')\n const body = c.req.valid('json')\n const result = await db\n .update(scopes)\n .set({ description: body.description, name: body.name })\n .where(eq(scopes.id, id))\n .returning()\n .get()\n if (!result) {\n return c.json({ error: 'Scope not found' }, 404)\n }\n return c.json(result)\n },\n)\n\napiAdminScopes.delete('/:id', async (c) => {\n const id = c.req.param('id')\n const result = await db.delete(scopes).where(eq(scopes.id, id)).returning().get()\n if (!result) {\n return c.json({ error: 'Scope not found' }, 404)\n }\n return c.json({ message: 'Scope deleted' })\n})\n","import { eq } from 'drizzle-orm'\nimport { Hono } from 'hono'\nimport { db } from './db/index.ts'\nimport { tokens } from './db/schema/index.ts'\n\nexport const apiAdminTokens = new Hono()\n\napiAdminTokens.get('/', async (c) => {\n const result = await db.select().from(tokens).all()\n return c.json(result)\n})\n\napiAdminTokens.get('/:accessToken', async (c) => {\n const accessToken = c.req.param('accessToken')\n const result = await db.select().from(tokens).where(eq(tokens.accessToken, accessToken)).get()\n if (!result) {\n return c.json({ error: 'Token not found' }, 404)\n }\n return c.json(result)\n})\n\napiAdminTokens.delete('/:accessToken', async (c) => {\n const accessToken = c.req.param('accessToken')\n const result = await db.delete(tokens).where(eq(tokens.accessToken, accessToken)).returning().get()\n if (!result) {\n return c.json({ error: 'Token not found' }, 404)\n }\n return c.json({ message: 'Token deleted' })\n})\n\napiAdminTokens.post('/:accessToken/revoke', async (c) => {\n const accessToken = c.req.param('accessToken')\n const result = await db\n .update(tokens)\n .set({\n accessTokenExpiresAt: new Date(0),\n refreshTokenExpiresAt: new Date(0),\n })\n .where(eq(tokens.accessToken, accessToken))\n .returning()\n .get()\n if (!result) {\n return c.json({ error: 'Token not found' }, 404)\n }\n return c.json({ message: 'Token revoked' })\n})\n"],"mappings":"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","names":["import_hono","import_zod_validator","import_drizzle_orm","import_hono","import_drizzle_orm","import_drizzle_orm","import_sqlite_core","import_drizzle_zod","import_drizzle_orm","import_sqlite_core","import_drizzle_zod","import_drizzle_orm","import_sqlite_core","import_drizzle_zod","import_drizzle_orm","import_sqlite_core","import_drizzle_zod","import_drizzle_orm","import_hono","import_zod_validator","import_drizzle_orm","import_hono","import_drizzle_orm","import_hono"]}
|
package/dist/cli.js
CHANGED
|
@@ -65,6 +65,7 @@ var package_default = {
|
|
|
65
65
|
"db:migrate": "drizzle-kit migrate",
|
|
66
66
|
"db:push": "drizzle-kit push",
|
|
67
67
|
"db:seed": "bun src/seed.ts",
|
|
68
|
+
"db:seed:oauth": "bun scripts/seed-oauth.ts",
|
|
68
69
|
"db:studio": "drizzle-kit studio",
|
|
69
70
|
lint: "biome check --error-on-warnings",
|
|
70
71
|
"lint:fix": "biome check --error-on-warnings --write",
|
|
@@ -79,10 +80,14 @@ var package_default = {
|
|
|
79
80
|
};
|
|
80
81
|
|
|
81
82
|
// src/api.ts
|
|
82
|
-
import { Hono as
|
|
83
|
+
import { Hono as Hono6 } from "hono";
|
|
83
84
|
|
|
84
85
|
// src/api-admin.ts
|
|
85
|
-
import { zValidator } from "@hono/zod-validator";
|
|
86
|
+
import { zValidator as zValidator3 } from "@hono/zod-validator";
|
|
87
|
+
import { eq as eq5 } from "drizzle-orm";
|
|
88
|
+
import { Hono as Hono5 } from "hono";
|
|
89
|
+
|
|
90
|
+
// src/api-admin-auth-codes.ts
|
|
86
91
|
import { eq } from "drizzle-orm";
|
|
87
92
|
import { Hono } from "hono";
|
|
88
93
|
|
|
@@ -93,24 +98,113 @@ import { drizzle } from "drizzle-orm/libsql";
|
|
|
93
98
|
// src/db/schema/index.ts
|
|
94
99
|
var schema_exports = {};
|
|
95
100
|
__export(schema_exports, {
|
|
101
|
+
authCodes: () => authCodes,
|
|
102
|
+
clients: () => clients,
|
|
103
|
+
insertAuthCodeSchema: () => insertAuthCodeSchema,
|
|
104
|
+
insertClientSchema: () => insertClientSchema,
|
|
105
|
+
insertScopeSchema: () => insertScopeSchema,
|
|
106
|
+
insertTokenSchema: () => insertTokenSchema,
|
|
96
107
|
insertUserSchema: () => insertUserSchema,
|
|
108
|
+
scopes: () => scopes,
|
|
109
|
+
selectAuthCodeSchema: () => selectAuthCodeSchema,
|
|
110
|
+
selectClientSchema: () => selectClientSchema,
|
|
111
|
+
selectScopeSchema: () => selectScopeSchema,
|
|
112
|
+
selectTokenSchema: () => selectTokenSchema,
|
|
97
113
|
selectUserSchema: () => selectUserSchema,
|
|
114
|
+
tokens: () => tokens,
|
|
98
115
|
users: () => users
|
|
99
116
|
});
|
|
100
117
|
|
|
101
|
-
// src/db/schema/
|
|
118
|
+
// src/db/schema/auth-codes.ts
|
|
102
119
|
import { sql } from "drizzle-orm";
|
|
103
120
|
import { integer, sqliteTable, text } from "drizzle-orm/sqlite-core";
|
|
104
121
|
import { createInsertSchema, createSelectSchema } from "drizzle-zod";
|
|
105
|
-
var
|
|
122
|
+
var authCodes = sqliteTable("auth_codes", {
|
|
123
|
+
clientId: text("client_id").notNull(),
|
|
124
|
+
code: text("code").primaryKey(),
|
|
125
|
+
codeChallenge: text("code_challenge"),
|
|
126
|
+
codeChallengeMethod: text("code_challenge_method").$type(),
|
|
106
127
|
createdAt: integer("created_at", { mode: "timestamp_ms" }).default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`).notNull(),
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
updatedAt: integer("updated_at", { mode: "timestamp_ms" }).default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`).$onUpdate(() => /* @__PURE__ */ new Date()).notNull()
|
|
128
|
+
expiresAt: integer("expires_at", { mode: "timestamp_ms" }).notNull(),
|
|
129
|
+
redirectUri: text("redirect_uri"),
|
|
130
|
+
scopeIds: text("scope_ids", { mode: "json" }).$type().notNull().default([]),
|
|
131
|
+
updatedAt: integer("updated_at", { mode: "timestamp_ms" }).default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`).$onUpdate(() => /* @__PURE__ */ new Date()).notNull(),
|
|
132
|
+
userId: text("user_id")
|
|
133
|
+
});
|
|
134
|
+
var insertAuthCodeSchema = createInsertSchema(authCodes);
|
|
135
|
+
var selectAuthCodeSchema = createSelectSchema(authCodes);
|
|
136
|
+
|
|
137
|
+
// src/db/schema/clients.ts
|
|
138
|
+
import { sql as sql2 } from "drizzle-orm";
|
|
139
|
+
import { integer as integer2, sqliteTable as sqliteTable2, text as text2 } from "drizzle-orm/sqlite-core";
|
|
140
|
+
import { createInsertSchema as createInsertSchema2, createSelectSchema as createSelectSchema2 } from "drizzle-zod";
|
|
141
|
+
var clients = sqliteTable2("clients", {
|
|
142
|
+
allowedGrants: text2("allowed_grants", { mode: "json" }).$type().notNull().default([]),
|
|
143
|
+
createdAt: integer2("created_at", { mode: "timestamp_ms" }).default(sql2`(cast(unixepoch('subsecond') * 1000 as integer))`).notNull(),
|
|
144
|
+
id: text2("id").primaryKey(),
|
|
145
|
+
name: text2("name").notNull(),
|
|
146
|
+
redirectUris: text2("redirect_uris", { mode: "json" }).$type().notNull().default([]),
|
|
147
|
+
scopeIds: text2("scope_ids", { mode: "json" }).$type().notNull().default([]),
|
|
148
|
+
secret: text2("secret"),
|
|
149
|
+
updatedAt: integer2("updated_at", { mode: "timestamp_ms" }).default(sql2`(cast(unixepoch('subsecond') * 1000 as integer))`).$onUpdate(() => /* @__PURE__ */ new Date()).notNull()
|
|
150
|
+
});
|
|
151
|
+
var insertClientSchema = createInsertSchema2(clients);
|
|
152
|
+
var selectClientSchema = createSelectSchema2(clients);
|
|
153
|
+
|
|
154
|
+
// src/db/schema/scopes.ts
|
|
155
|
+
import { sql as sql3 } from "drizzle-orm";
|
|
156
|
+
import { integer as integer3, sqliteTable as sqliteTable3, text as text3 } from "drizzle-orm/sqlite-core";
|
|
157
|
+
import { createInsertSchema as createInsertSchema3, createSelectSchema as createSelectSchema3 } from "drizzle-zod";
|
|
158
|
+
var scopes = sqliteTable3("scopes", {
|
|
159
|
+
createdAt: integer3("created_at", { mode: "timestamp_ms" }).default(sql3`(cast(unixepoch('subsecond') * 1000 as integer))`).notNull(),
|
|
160
|
+
description: text3("description"),
|
|
161
|
+
id: text3("id").primaryKey(),
|
|
162
|
+
name: text3("name").notNull().unique(),
|
|
163
|
+
updatedAt: integer3("updated_at", { mode: "timestamp_ms" }).default(sql3`(cast(unixepoch('subsecond') * 1000 as integer))`).$onUpdate(() => /* @__PURE__ */ new Date()).notNull()
|
|
164
|
+
});
|
|
165
|
+
var insertScopeSchema = createInsertSchema3(scopes);
|
|
166
|
+
var selectScopeSchema = createSelectSchema3(scopes);
|
|
167
|
+
|
|
168
|
+
// src/db/schema/tokens.ts
|
|
169
|
+
import { sql as sql4 } from "drizzle-orm";
|
|
170
|
+
import { integer as integer4, sqliteTable as sqliteTable4, text as text4 } from "drizzle-orm/sqlite-core";
|
|
171
|
+
import { createInsertSchema as createInsertSchema4, createSelectSchema as createSelectSchema4 } from "drizzle-zod";
|
|
172
|
+
var tokens = sqliteTable4("tokens", {
|
|
173
|
+
accessToken: text4("access_token").primaryKey(),
|
|
174
|
+
accessTokenExpiresAt: integer4("access_token_expires_at", {
|
|
175
|
+
mode: "timestamp_ms"
|
|
176
|
+
}).notNull(),
|
|
177
|
+
clientId: text4("client_id").notNull(),
|
|
178
|
+
createdAt: integer4("created_at", { mode: "timestamp_ms" }).default(sql4`(cast(unixepoch('subsecond') * 1000 as integer))`).notNull(),
|
|
179
|
+
originatingAuthCodeId: text4("originating_auth_code_id"),
|
|
180
|
+
refreshToken: text4("refresh_token").unique(),
|
|
181
|
+
refreshTokenExpiresAt: integer4("refresh_token_expires_at", {
|
|
182
|
+
mode: "timestamp_ms"
|
|
183
|
+
}),
|
|
184
|
+
scopeIds: text4("scope_ids", { mode: "json" }).$type().notNull().default([]),
|
|
185
|
+
updatedAt: integer4("updated_at", { mode: "timestamp_ms" }).default(sql4`(cast(unixepoch('subsecond') * 1000 as integer))`).$onUpdate(() => /* @__PURE__ */ new Date()).notNull(),
|
|
186
|
+
userId: text4("user_id")
|
|
187
|
+
});
|
|
188
|
+
var insertTokenSchema = createInsertSchema4(tokens);
|
|
189
|
+
var selectTokenSchema = createSelectSchema4(tokens);
|
|
190
|
+
|
|
191
|
+
// src/db/schema/users.ts
|
|
192
|
+
import { sql as sql5 } from "drizzle-orm";
|
|
193
|
+
import { integer as integer5, sqliteTable as sqliteTable5, text as text5 } from "drizzle-orm/sqlite-core";
|
|
194
|
+
import { createInsertSchema as createInsertSchema5, createSelectSchema as createSelectSchema5 } from "drizzle-zod";
|
|
195
|
+
var users = sqliteTable5("users", {
|
|
196
|
+
createdAt: integer5("created_at", { mode: "timestamp_ms" }).default(sql5`(cast(unixepoch('subsecond') * 1000 as integer))`).notNull(),
|
|
197
|
+
email: text5("email").notNull().unique(),
|
|
198
|
+
id: text5("id").primaryKey(),
|
|
199
|
+
lastLoginAt: integer5("last_login_at", { mode: "timestamp_ms" }),
|
|
200
|
+
name: text5("name").notNull(),
|
|
201
|
+
passwordHash: text5("password_hash"),
|
|
202
|
+
role: text5("role").default("user").notNull(),
|
|
203
|
+
tokenVersion: integer5("token_version").default(0).notNull(),
|
|
204
|
+
updatedAt: integer5("updated_at", { mode: "timestamp_ms" }).default(sql5`(cast(unixepoch('subsecond') * 1000 as integer))`).$onUpdate(() => /* @__PURE__ */ new Date()).notNull()
|
|
111
205
|
});
|
|
112
|
-
var insertUserSchema =
|
|
113
|
-
var selectUserSchema =
|
|
206
|
+
var insertUserSchema = createInsertSchema5(users);
|
|
207
|
+
var selectUserSchema = createSelectSchema5(users);
|
|
114
208
|
|
|
115
209
|
// src/db/index.ts
|
|
116
210
|
var client = createClient({
|
|
@@ -119,37 +213,236 @@ var client = createClient({
|
|
|
119
213
|
});
|
|
120
214
|
var db = drizzle(client, { schema: schema_exports });
|
|
121
215
|
|
|
216
|
+
// src/api-admin-auth-codes.ts
|
|
217
|
+
var apiAdminAuthCodes = new Hono();
|
|
218
|
+
apiAdminAuthCodes.get("/", async (c) => {
|
|
219
|
+
const result = await db.select().from(authCodes).all();
|
|
220
|
+
return c.json(result);
|
|
221
|
+
});
|
|
222
|
+
apiAdminAuthCodes.get("/:code", async (c) => {
|
|
223
|
+
const code = c.req.param("code");
|
|
224
|
+
const result = await db.select().from(authCodes).where(eq(authCodes.code, code)).get();
|
|
225
|
+
if (!result) {
|
|
226
|
+
return c.json({ error: "Auth code not found" }, 404);
|
|
227
|
+
}
|
|
228
|
+
return c.json(result);
|
|
229
|
+
});
|
|
230
|
+
apiAdminAuthCodes.delete("/:code", async (c) => {
|
|
231
|
+
const code = c.req.param("code");
|
|
232
|
+
const result = await db.delete(authCodes).where(eq(authCodes.code, code)).returning().get();
|
|
233
|
+
if (!result) {
|
|
234
|
+
return c.json({ error: "Auth code not found" }, 404);
|
|
235
|
+
}
|
|
236
|
+
return c.json({ message: "Auth code deleted" });
|
|
237
|
+
});
|
|
238
|
+
apiAdminAuthCodes.post("/:code/revoke", async (c) => {
|
|
239
|
+
const code = c.req.param("code");
|
|
240
|
+
const result = await db.update(authCodes).set({ expiresAt: /* @__PURE__ */ new Date(0) }).where(eq(authCodes.code, code)).returning().get();
|
|
241
|
+
if (!result) {
|
|
242
|
+
return c.json({ error: "Auth code not found" }, 404);
|
|
243
|
+
}
|
|
244
|
+
return c.json({ message: "Auth code revoked" });
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
// src/api-admin-clients.ts
|
|
248
|
+
import { zValidator } from "@hono/zod-validator";
|
|
249
|
+
import { eq as eq2 } from "drizzle-orm";
|
|
250
|
+
import { Hono as Hono2 } from "hono";
|
|
251
|
+
|
|
252
|
+
// src/utils.ts
|
|
253
|
+
import { randomBytes } from "crypto";
|
|
254
|
+
function generateRandomToken(length = 32) {
|
|
255
|
+
return randomBytes(length).toString("hex");
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// src/api-admin-clients.ts
|
|
259
|
+
var apiAdminClients = new Hono2();
|
|
260
|
+
apiAdminClients.get("/", async (c) => {
|
|
261
|
+
const result = await db.select().from(clients).all();
|
|
262
|
+
return c.json(result);
|
|
263
|
+
});
|
|
264
|
+
apiAdminClients.get("/:id", async (c) => {
|
|
265
|
+
const id = c.req.param("id");
|
|
266
|
+
const result = await db.select().from(clients).where(eq2(clients.id, id)).get();
|
|
267
|
+
if (!result) {
|
|
268
|
+
return c.json({ error: "Client not found" }, 404);
|
|
269
|
+
}
|
|
270
|
+
return c.json(result);
|
|
271
|
+
});
|
|
272
|
+
apiAdminClients.post("/", zValidator("json", insertClientSchema), async (c) => {
|
|
273
|
+
const body = c.req.valid("json");
|
|
274
|
+
try {
|
|
275
|
+
const result = await db.insert(clients).values({
|
|
276
|
+
allowedGrants: body.allowedGrants ?? ["authorization_code", "refresh_token"],
|
|
277
|
+
id: body.id,
|
|
278
|
+
name: body.name,
|
|
279
|
+
redirectUris: body.redirectUris ?? [],
|
|
280
|
+
scopeIds: body.scopeIds ?? [],
|
|
281
|
+
secret: body.secret ?? generateRandomToken()
|
|
282
|
+
}).returning().get();
|
|
283
|
+
return c.json(result, 201);
|
|
284
|
+
} catch (err) {
|
|
285
|
+
if (err instanceof Error && err.message?.includes("UNIQUE constraint failed")) {
|
|
286
|
+
return c.json({ error: "Client already exists" }, 409);
|
|
287
|
+
}
|
|
288
|
+
return c.json({ error: "Failed to create client" }, 500);
|
|
289
|
+
}
|
|
290
|
+
});
|
|
291
|
+
apiAdminClients.put(
|
|
292
|
+
"/:id",
|
|
293
|
+
zValidator(
|
|
294
|
+
"json",
|
|
295
|
+
insertClientSchema.pick({
|
|
296
|
+
allowedGrants: true,
|
|
297
|
+
name: true,
|
|
298
|
+
redirectUris: true,
|
|
299
|
+
scopeIds: true,
|
|
300
|
+
secret: true
|
|
301
|
+
}).partial()
|
|
302
|
+
),
|
|
303
|
+
async (c) => {
|
|
304
|
+
const id = c.req.param("id");
|
|
305
|
+
const body = c.req.valid("json");
|
|
306
|
+
const result = await db.update(clients).set(body).where(eq2(clients.id, id)).returning().get();
|
|
307
|
+
if (!result) {
|
|
308
|
+
return c.json({ error: "Client not found" }, 404);
|
|
309
|
+
}
|
|
310
|
+
return c.json(result);
|
|
311
|
+
}
|
|
312
|
+
);
|
|
313
|
+
apiAdminClients.delete("/:id", async (c) => {
|
|
314
|
+
const id = c.req.param("id");
|
|
315
|
+
const result = await db.delete(clients).where(eq2(clients.id, id)).returning().get();
|
|
316
|
+
if (!result) {
|
|
317
|
+
return c.json({ error: "Client not found" }, 404);
|
|
318
|
+
}
|
|
319
|
+
return c.json({ message: "Client deleted" });
|
|
320
|
+
});
|
|
321
|
+
|
|
322
|
+
// src/api-admin-scopes.ts
|
|
323
|
+
import { zValidator as zValidator2 } from "@hono/zod-validator";
|
|
324
|
+
import { eq as eq3 } from "drizzle-orm";
|
|
325
|
+
import { Hono as Hono3 } from "hono";
|
|
326
|
+
var apiAdminScopes = new Hono3();
|
|
327
|
+
apiAdminScopes.get("/", async (c) => {
|
|
328
|
+
const result = await db.select().from(scopes).all();
|
|
329
|
+
return c.json(result);
|
|
330
|
+
});
|
|
331
|
+
apiAdminScopes.get("/:id", async (c) => {
|
|
332
|
+
const id = c.req.param("id");
|
|
333
|
+
const result = await db.select().from(scopes).where(eq3(scopes.id, id)).get();
|
|
334
|
+
if (!result) {
|
|
335
|
+
return c.json({ error: "Scope not found" }, 404);
|
|
336
|
+
}
|
|
337
|
+
return c.json(result);
|
|
338
|
+
});
|
|
339
|
+
apiAdminScopes.post("/", zValidator2("json", insertScopeSchema), async (c) => {
|
|
340
|
+
const body = c.req.valid("json");
|
|
341
|
+
try {
|
|
342
|
+
const result = await db.insert(scopes).values({
|
|
343
|
+
description: body.description ?? null,
|
|
344
|
+
id: body.id,
|
|
345
|
+
name: body.name
|
|
346
|
+
}).returning().get();
|
|
347
|
+
return c.json(result, 201);
|
|
348
|
+
} catch (err) {
|
|
349
|
+
if (err instanceof Error && err.message?.includes("UNIQUE constraint failed")) {
|
|
350
|
+
return c.json({ error: "Scope already exists" }, 409);
|
|
351
|
+
}
|
|
352
|
+
return c.json({ error: "Failed to create scope" }, 500);
|
|
353
|
+
}
|
|
354
|
+
});
|
|
355
|
+
apiAdminScopes.put(
|
|
356
|
+
"/:id",
|
|
357
|
+
zValidator2("json", insertScopeSchema.pick({ description: true, name: true }).partial()),
|
|
358
|
+
async (c) => {
|
|
359
|
+
const id = c.req.param("id");
|
|
360
|
+
const body = c.req.valid("json");
|
|
361
|
+
const result = await db.update(scopes).set({ description: body.description, name: body.name }).where(eq3(scopes.id, id)).returning().get();
|
|
362
|
+
if (!result) {
|
|
363
|
+
return c.json({ error: "Scope not found" }, 404);
|
|
364
|
+
}
|
|
365
|
+
return c.json(result);
|
|
366
|
+
}
|
|
367
|
+
);
|
|
368
|
+
apiAdminScopes.delete("/:id", async (c) => {
|
|
369
|
+
const id = c.req.param("id");
|
|
370
|
+
const result = await db.delete(scopes).where(eq3(scopes.id, id)).returning().get();
|
|
371
|
+
if (!result) {
|
|
372
|
+
return c.json({ error: "Scope not found" }, 404);
|
|
373
|
+
}
|
|
374
|
+
return c.json({ message: "Scope deleted" });
|
|
375
|
+
});
|
|
376
|
+
|
|
377
|
+
// src/api-admin-tokens.ts
|
|
378
|
+
import { eq as eq4 } from "drizzle-orm";
|
|
379
|
+
import { Hono as Hono4 } from "hono";
|
|
380
|
+
var apiAdminTokens = new Hono4();
|
|
381
|
+
apiAdminTokens.get("/", async (c) => {
|
|
382
|
+
const result = await db.select().from(tokens).all();
|
|
383
|
+
return c.json(result);
|
|
384
|
+
});
|
|
385
|
+
apiAdminTokens.get("/:accessToken", async (c) => {
|
|
386
|
+
const accessToken = c.req.param("accessToken");
|
|
387
|
+
const result = await db.select().from(tokens).where(eq4(tokens.accessToken, accessToken)).get();
|
|
388
|
+
if (!result) {
|
|
389
|
+
return c.json({ error: "Token not found" }, 404);
|
|
390
|
+
}
|
|
391
|
+
return c.json(result);
|
|
392
|
+
});
|
|
393
|
+
apiAdminTokens.delete("/:accessToken", async (c) => {
|
|
394
|
+
const accessToken = c.req.param("accessToken");
|
|
395
|
+
const result = await db.delete(tokens).where(eq4(tokens.accessToken, accessToken)).returning().get();
|
|
396
|
+
if (!result) {
|
|
397
|
+
return c.json({ error: "Token not found" }, 404);
|
|
398
|
+
}
|
|
399
|
+
return c.json({ message: "Token deleted" });
|
|
400
|
+
});
|
|
401
|
+
apiAdminTokens.post("/:accessToken/revoke", async (c) => {
|
|
402
|
+
const accessToken = c.req.param("accessToken");
|
|
403
|
+
const result = await db.update(tokens).set({
|
|
404
|
+
accessTokenExpiresAt: /* @__PURE__ */ new Date(0),
|
|
405
|
+
refreshTokenExpiresAt: /* @__PURE__ */ new Date(0)
|
|
406
|
+
}).where(eq4(tokens.accessToken, accessToken)).returning().get();
|
|
407
|
+
if (!result) {
|
|
408
|
+
return c.json({ error: "Token not found" }, 404);
|
|
409
|
+
}
|
|
410
|
+
return c.json({ message: "Token revoked" });
|
|
411
|
+
});
|
|
412
|
+
|
|
122
413
|
// src/api-admin.ts
|
|
123
|
-
var apiAdmin = new
|
|
414
|
+
var apiAdmin = new Hono5();
|
|
415
|
+
apiAdmin.route("/scopes", apiAdminScopes);
|
|
416
|
+
apiAdmin.route("/clients", apiAdminClients);
|
|
417
|
+
apiAdmin.route("/tokens", apiAdminTokens);
|
|
418
|
+
apiAdmin.route("/auth-codes", apiAdminAuthCodes);
|
|
124
419
|
apiAdmin.get("/users", async (c) => {
|
|
125
420
|
const result = await db.select().from(users).all();
|
|
126
421
|
return c.json(result);
|
|
127
422
|
});
|
|
128
423
|
apiAdmin.get("/users/:id", async (c) => {
|
|
129
424
|
const id = c.req.param("id");
|
|
130
|
-
const result = await db.select().from(users).where(
|
|
425
|
+
const result = await db.select().from(users).where(eq5(users.id, id)).get();
|
|
131
426
|
if (!result) {
|
|
132
427
|
return c.json({ error: "User not found" }, 404);
|
|
133
428
|
}
|
|
134
429
|
return c.json(result);
|
|
135
430
|
});
|
|
136
|
-
apiAdmin.post("/users",
|
|
431
|
+
apiAdmin.post("/users", zValidator3("json", insertUserSchema), async (c) => {
|
|
137
432
|
const body = c.req.valid("json");
|
|
138
433
|
try {
|
|
139
434
|
const result = await db.insert(users).values(body).returning().get();
|
|
140
435
|
return c.json(result, 201);
|
|
141
436
|
} catch (err) {
|
|
142
|
-
if (err instanceof Error) {
|
|
143
|
-
|
|
144
|
-
return c.json({ error: "User already exists" }, 409);
|
|
145
|
-
}
|
|
437
|
+
if (err instanceof Error && err.message?.includes("UNIQUE constraint failed")) {
|
|
438
|
+
return c.json({ error: "User already exists" }, 409);
|
|
146
439
|
}
|
|
147
440
|
return c.json({ error: "Failed to create user" }, 500);
|
|
148
441
|
}
|
|
149
442
|
});
|
|
150
443
|
apiAdmin.delete("/users/:id", async (c) => {
|
|
151
444
|
const id = c.req.param("id");
|
|
152
|
-
const result = await db.delete(users).where(
|
|
445
|
+
const result = await db.delete(users).where(eq5(users.id, id)).returning().get();
|
|
153
446
|
if (!result) {
|
|
154
447
|
return c.json({ error: "User not found" }, 404);
|
|
155
448
|
}
|
|
@@ -158,7 +451,7 @@ apiAdmin.delete("/users/:id", async (c) => {
|
|
|
158
451
|
|
|
159
452
|
// src/api.ts
|
|
160
453
|
function startServer(port = 3e3, options = {}) {
|
|
161
|
-
const app = new
|
|
454
|
+
const app = new Hono6();
|
|
162
455
|
app.get("/", (c) => {
|
|
163
456
|
return c.text("Hello Hono!");
|
|
164
457
|
});
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../package.json","../src/api.ts","../src/api-admin.ts","../src/db/index.ts","../src/db/schema/index.ts","../src/db/schema/users.ts"],"sourcesContent":["#!/usr/bin/env bun\nimport { Command } from 'commander'\nimport packageJson from '../package.json' with { type: 'json' }\nimport { startServer } from './api.ts'\n\nconst program = new Command()\n\nprogram.name(packageJson.name).description(packageJson.description).version(packageJson.version)\n\nprogram\n .command('start')\n .description('Start the API server')\n .option('--admin', 'Enable admin API endpoints', false)\n .option('-p, --port <number>', 'Port to run the server on', '3000')\n .action((options) => {\n const { app, port } = startServer(parseInt(options.port, 10), {\n enableAdmin: options.admin,\n })\n\n Bun.serve({ fetch: app.fetch, port })\n })\n\nprogram.parse(process.argv)\n","{\n \"bin\": {\n \"solana-auth-oauth2-server\": \"dist/cli.js\"\n },\n \"dependencies\": {\n \"@hono/zod-validator\": \"^0.7.6\",\n \"@libsql/client\": \"^0.17.0\",\n \"commander\": \"^14.0.2\",\n \"drizzle-orm\": \"^0.45.1\",\n \"drizzle-zod\": \"^0.8.3\",\n \"hono\": \"^4.11.5\",\n \"libsql\": \"^0.5.22\",\n \"zod\": \"^4.3.6\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"^2.3.11\",\n \"@changesets/cli\": \"^2.29.8\",\n \"@types/bun\": \"latest\",\n \"drizzle-kit\": \"^0.31.8\",\n \"pkg-pr-new\": \"^0.0.62\",\n \"publint\": \"^0.3.16\",\n \"tsup\": \"^8.5.1\"\n },\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n }\n },\n \"files\": [\"dist\"],\n \"license\": \"MIT\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"name\": \"solana-auth-oauth2-server\",\n \"description\": \"Solana Auth OAuth2 Server\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/solana-auth/solana-auth-oauth2-server.git\"\n },\n \"peerDependencies\": {\n \"typescript\": \"^5\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"changeset\": \"changeset\",\n \"check-types\": \"tsc -b --noEmit\",\n \"db:generate\": \"drizzle-kit generate\",\n \"db:migrate\": \"drizzle-kit migrate\",\n \"db:push\": \"drizzle-kit push\",\n \"db:seed\": \"bun src/seed.ts\",\n \"db:studio\": \"drizzle-kit studio\",\n \"lint\": \"biome check --error-on-warnings\",\n \"lint:fix\": \"biome check --error-on-warnings --write\",\n \"release\": \"changeset publish\",\n \"test\": \"bun test ./test/\",\n \"test:watch\": \"bun test --watch ./test/\",\n \"version\": \"changeset version && bun lint:fix\"\n },\n \"type\": \"module\",\n \"types\": \"./dist/index.d.ts\",\n \"version\": \"0.0.0\"\n}\n","import { Hono } from 'hono'\nimport { apiAdmin } from './api-admin.ts'\n\nexport function startServer(port: number = 3000, options: { enableAdmin?: boolean } = {}) {\n const app = new Hono()\n\n app.get('/', (c) => {\n return c.text('Hello Hono!')\n })\n\n if (options.enableAdmin) {\n app.route('/admin', apiAdmin)\n console.log('Admin API enabled at /admin')\n }\n\n console.log(`Server is running on port ${port}`)\n\n return {\n app,\n port,\n }\n}\n","import { zValidator } from '@hono/zod-validator'\nimport { eq } from 'drizzle-orm'\nimport { Hono } from 'hono'\nimport { db } from './db/index.ts'\nimport { insertUserSchema, users } from './db/schema/index.ts'\n\nexport const apiAdmin = new Hono()\n\n// List users\napiAdmin.get('/users', async (c) => {\n const result = await db.select().from(users).all()\n return c.json(result)\n})\n\n// Get user by ID\napiAdmin.get('/users/:id', async (c) => {\n const id = c.req.param('id')\n const result = await db.select().from(users).where(eq(users.id, id)).get()\n\n if (!result) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n return c.json(result)\n})\n\n// Create user\napiAdmin.post('/users', zValidator('json', insertUserSchema), async (c) => {\n const body = c.req.valid('json')\n\n try {\n const result = await db.insert(users).values(body).returning().get()\n\n return c.json(result, 201)\n } catch (err) {\n if (err instanceof Error) {\n if (err.message?.includes('UNIQUE constraint failed')) {\n return c.json({ error: 'User already exists' }, 409)\n }\n }\n return c.json({ error: 'Failed to create user' }, 500)\n }\n})\n\n// Delete user\napiAdmin.delete('/users/:id', async (c) => {\n const id = c.req.param('id')\n\n const result = await db.delete(users).where(eq(users.id, id)).returning().get()\n\n if (!result) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n return c.json({ message: 'User deleted' })\n})\n","import { createClient } from '@libsql/client'\nimport { drizzle } from 'drizzle-orm/libsql'\nimport * as schema from './schema/index.ts'\n\nconst client = createClient({\n authToken: process.env.DATABASE_AUTH_TOKEN,\n url: process.env.DATABASE_URL || 'file:local.db',\n})\n\nexport const db = drizzle(client, { schema })\n","export * from './users.ts'\n","import { sql } from 'drizzle-orm'\nimport { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'\nimport { createInsertSchema, createSelectSchema } from 'drizzle-zod'\n\nexport const users = sqliteTable('users', {\n createdAt: integer('created_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .notNull(),\n email: text('email').notNull().unique(),\n id: text('id').primaryKey(),\n name: text('name').notNull(),\n updatedAt: integer('updated_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .$onUpdate(() => new Date())\n .notNull(),\n})\n\nexport const insertUserSchema = createInsertSchema(users)\nexport const selectUserSchema = createSelectSchema(users)\n"],"mappings":"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","names":["Hono","Hono"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../package.json","../src/api.ts","../src/api-admin.ts","../src/api-admin-auth-codes.ts","../src/db/index.ts","../src/db/schema/index.ts","../src/db/schema/auth-codes.ts","../src/db/schema/clients.ts","../src/db/schema/scopes.ts","../src/db/schema/tokens.ts","../src/db/schema/users.ts","../src/api-admin-clients.ts","../src/utils.ts","../src/api-admin-scopes.ts","../src/api-admin-tokens.ts"],"sourcesContent":["#!/usr/bin/env bun\nimport { Command } from 'commander'\nimport packageJson from '../package.json' with { type: 'json' }\nimport { startServer } from './api.ts'\n\nconst program = new Command()\n\nprogram.name(packageJson.name).description(packageJson.description).version(packageJson.version)\n\nprogram\n .command('start')\n .description('Start the API server')\n .option('--admin', 'Enable admin API endpoints', false)\n .option('-p, --port <number>', 'Port to run the server on', '3000')\n .action((options) => {\n const { app, port } = startServer(parseInt(options.port, 10), {\n enableAdmin: options.admin,\n })\n\n Bun.serve({ fetch: app.fetch, port })\n })\n\nprogram.parse(process.argv)\n","{\n \"bin\": {\n \"solana-auth-oauth2-server\": \"dist/cli.js\"\n },\n \"dependencies\": {\n \"@hono/zod-validator\": \"^0.7.6\",\n \"@libsql/client\": \"^0.17.0\",\n \"commander\": \"^14.0.2\",\n \"drizzle-orm\": \"^0.45.1\",\n \"drizzle-zod\": \"^0.8.3\",\n \"hono\": \"^4.11.5\",\n \"libsql\": \"^0.5.22\",\n \"zod\": \"^4.3.6\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"^2.3.11\",\n \"@changesets/cli\": \"^2.29.8\",\n \"@types/bun\": \"latest\",\n \"drizzle-kit\": \"^0.31.8\",\n \"pkg-pr-new\": \"^0.0.62\",\n \"publint\": \"^0.3.16\",\n \"tsup\": \"^8.5.1\"\n },\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n }\n },\n \"files\": [\"dist\"],\n \"license\": \"MIT\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"name\": \"solana-auth-oauth2-server\",\n \"description\": \"Solana Auth OAuth2 Server\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/solana-auth/solana-auth-oauth2-server.git\"\n },\n \"peerDependencies\": {\n \"typescript\": \"^5\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"changeset\": \"changeset\",\n \"check-types\": \"tsc -b --noEmit\",\n \"db:generate\": \"drizzle-kit generate\",\n \"db:migrate\": \"drizzle-kit migrate\",\n \"db:push\": \"drizzle-kit push\",\n \"db:seed\": \"bun src/seed.ts\",\n \"db:seed:oauth\": \"bun scripts/seed-oauth.ts\",\n \"db:studio\": \"drizzle-kit studio\",\n \"lint\": \"biome check --error-on-warnings\",\n \"lint:fix\": \"biome check --error-on-warnings --write\",\n \"release\": \"changeset publish\",\n \"test\": \"bun test ./test/\",\n \"test:watch\": \"bun test --watch ./test/\",\n \"version\": \"changeset version && bun lint:fix\"\n },\n \"type\": \"module\",\n \"types\": \"./dist/index.d.ts\",\n \"version\": \"0.0.0\"\n}\n","import { Hono } from 'hono'\nimport { apiAdmin } from './api-admin.ts'\n\nexport function startServer(port: number = 3000, options: { enableAdmin?: boolean } = {}) {\n const app = new Hono()\n\n app.get('/', (c) => {\n return c.text('Hello Hono!')\n })\n\n if (options.enableAdmin) {\n app.route('/admin', apiAdmin)\n console.log('Admin API enabled at /admin')\n }\n\n console.log(`Server is running on port ${port}`)\n\n return {\n app,\n port,\n }\n}\n","import { zValidator } from '@hono/zod-validator'\nimport { eq } from 'drizzle-orm'\nimport { Hono } from 'hono'\nimport { apiAdminAuthCodes } from './api-admin-auth-codes.ts'\nimport { apiAdminClients } from './api-admin-clients.ts'\nimport { apiAdminScopes } from './api-admin-scopes.ts'\nimport { apiAdminTokens } from './api-admin-tokens.ts'\nimport { db } from './db/index.ts'\nimport { insertUserSchema, users } from './db/schema/index.ts'\n\nexport const apiAdmin = new Hono()\n\n// Mount sub-routers\napiAdmin.route('/scopes', apiAdminScopes)\napiAdmin.route('/clients', apiAdminClients)\napiAdmin.route('/tokens', apiAdminTokens)\napiAdmin.route('/auth-codes', apiAdminAuthCodes)\n\n// List users\napiAdmin.get('/users', async (c) => {\n const result = await db.select().from(users).all()\n return c.json(result)\n})\n\n// Get user by ID\napiAdmin.get('/users/:id', async (c) => {\n const id = c.req.param('id')\n const result = await db.select().from(users).where(eq(users.id, id)).get()\n if (!result) {\n return c.json({ error: 'User not found' }, 404)\n }\n return c.json(result)\n})\n\n// Create user\napiAdmin.post('/users', zValidator('json', insertUserSchema), async (c) => {\n const body = c.req.valid('json')\n\n try {\n const result = await db.insert(users).values(body).returning().get()\n\n return c.json(result, 201)\n } catch (err) {\n if (err instanceof Error && err.message?.includes('UNIQUE constraint failed')) {\n return c.json({ error: 'User already exists' }, 409)\n }\n return c.json({ error: 'Failed to create user' }, 500)\n }\n})\n\n// Delete user\napiAdmin.delete('/users/:id', async (c) => {\n const id = c.req.param('id')\n const result = await db.delete(users).where(eq(users.id, id)).returning().get()\n if (!result) {\n return c.json({ error: 'User not found' }, 404)\n }\n return c.json({ message: 'User deleted' })\n})\n","import { eq } from 'drizzle-orm'\nimport { Hono } from 'hono'\nimport { db } from './db/index.ts'\nimport { authCodes } from './db/schema/index.ts'\n\nexport const apiAdminAuthCodes = new Hono()\n\napiAdminAuthCodes.get('/', async (c) => {\n const result = await db.select().from(authCodes).all()\n return c.json(result)\n})\n\napiAdminAuthCodes.get('/:code', async (c) => {\n const code = c.req.param('code')\n const result = await db.select().from(authCodes).where(eq(authCodes.code, code)).get()\n if (!result) {\n return c.json({ error: 'Auth code not found' }, 404)\n }\n return c.json(result)\n})\n\napiAdminAuthCodes.delete('/:code', async (c) => {\n const code = c.req.param('code')\n const result = await db.delete(authCodes).where(eq(authCodes.code, code)).returning().get()\n if (!result) {\n return c.json({ error: 'Auth code not found' }, 404)\n }\n return c.json({ message: 'Auth code deleted' })\n})\n\napiAdminAuthCodes.post('/:code/revoke', async (c) => {\n const code = c.req.param('code')\n const result = await db\n .update(authCodes)\n .set({ expiresAt: new Date(0) })\n .where(eq(authCodes.code, code))\n .returning()\n .get()\n if (!result) {\n return c.json({ error: 'Auth code not found' }, 404)\n }\n return c.json({ message: 'Auth code revoked' })\n})\n","import { createClient } from '@libsql/client'\nimport { drizzle } from 'drizzle-orm/libsql'\nimport * as schema from './schema/index.ts'\n\nconst client = createClient({\n authToken: process.env.DATABASE_AUTH_TOKEN,\n url: process.env.DATABASE_URL || 'file:local.db',\n})\n\nexport const db = drizzle(client, { schema })\n","export * from './auth-codes.ts'\nexport * from './clients.ts'\nexport * from './scopes.ts'\nexport * from './tokens.ts'\nexport * from './users.ts'\n","import { sql } from 'drizzle-orm'\nimport { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'\nimport { createInsertSchema, createSelectSchema } from 'drizzle-zod'\n\nexport const authCodes = sqliteTable('auth_codes', {\n clientId: text('client_id').notNull(),\n code: text('code').primaryKey(),\n codeChallenge: text('code_challenge'),\n codeChallengeMethod: text('code_challenge_method').$type<'S256' | 'plain'>(),\n createdAt: integer('created_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .notNull(),\n expiresAt: integer('expires_at', { mode: 'timestamp_ms' }).notNull(),\n redirectUri: text('redirect_uri'),\n scopeIds: text('scope_ids', { mode: 'json' }).$type<string[]>().notNull().default([]),\n updatedAt: integer('updated_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .$onUpdate(() => new Date())\n .notNull(),\n userId: text('user_id'),\n})\n\nexport const insertAuthCodeSchema = createInsertSchema(authCodes)\nexport const selectAuthCodeSchema = createSelectSchema(authCodes)\n","import { sql } from 'drizzle-orm'\nimport { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'\nimport { createInsertSchema, createSelectSchema } from 'drizzle-zod'\n\nexport const clients = sqliteTable('clients', {\n allowedGrants: text('allowed_grants', { mode: 'json' }).$type<string[]>().notNull().default([]),\n createdAt: integer('created_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .notNull(),\n id: text('id').primaryKey(),\n name: text('name').notNull(),\n redirectUris: text('redirect_uris', { mode: 'json' }).$type<string[]>().notNull().default([]),\n scopeIds: text('scope_ids', { mode: 'json' }).$type<string[]>().notNull().default([]),\n secret: text('secret'),\n updatedAt: integer('updated_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .$onUpdate(() => new Date())\n .notNull(),\n})\n\nexport const insertClientSchema = createInsertSchema(clients)\nexport const selectClientSchema = createSelectSchema(clients)\n","import { sql } from 'drizzle-orm'\nimport { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'\nimport { createInsertSchema, createSelectSchema } from 'drizzle-zod'\n\nexport const scopes = sqliteTable('scopes', {\n createdAt: integer('created_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .notNull(),\n description: text('description'),\n id: text('id').primaryKey(),\n name: text('name').notNull().unique(),\n updatedAt: integer('updated_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .$onUpdate(() => new Date())\n .notNull(),\n})\n\nexport const insertScopeSchema = createInsertSchema(scopes)\nexport const selectScopeSchema = createSelectSchema(scopes)\n","import { sql } from 'drizzle-orm'\nimport { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'\nimport { createInsertSchema, createSelectSchema } from 'drizzle-zod'\n\nexport const tokens = sqliteTable('tokens', {\n accessToken: text('access_token').primaryKey(),\n accessTokenExpiresAt: integer('access_token_expires_at', {\n mode: 'timestamp_ms',\n }).notNull(),\n clientId: text('client_id').notNull(),\n createdAt: integer('created_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .notNull(),\n originatingAuthCodeId: text('originating_auth_code_id'),\n refreshToken: text('refresh_token').unique(),\n refreshTokenExpiresAt: integer('refresh_token_expires_at', {\n mode: 'timestamp_ms',\n }),\n scopeIds: text('scope_ids', { mode: 'json' }).$type<string[]>().notNull().default([]),\n updatedAt: integer('updated_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .$onUpdate(() => new Date())\n .notNull(),\n userId: text('user_id'),\n})\n\nexport const insertTokenSchema = createInsertSchema(tokens)\nexport const selectTokenSchema = createSelectSchema(tokens)\n","import { sql } from 'drizzle-orm'\nimport { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'\nimport { createInsertSchema, createSelectSchema } from 'drizzle-zod'\n\nexport const users = sqliteTable('users', {\n createdAt: integer('created_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .notNull(),\n email: text('email').notNull().unique(),\n id: text('id').primaryKey(),\n lastLoginAt: integer('last_login_at', { mode: 'timestamp_ms' }),\n name: text('name').notNull(),\n passwordHash: text('password_hash'),\n role: text('role').default('user').notNull(),\n tokenVersion: integer('token_version').default(0).notNull(),\n updatedAt: integer('updated_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .$onUpdate(() => new Date())\n .notNull(),\n})\n\nexport const insertUserSchema = createInsertSchema(users)\nexport const selectUserSchema = createSelectSchema(users)\n","import { zValidator } from '@hono/zod-validator'\nimport { eq } from 'drizzle-orm'\nimport { Hono } from 'hono'\nimport { db } from './db/index.ts'\nimport { clients, insertClientSchema } from './db/schema/index.ts'\nimport { generateRandomToken } from './utils.ts'\n\nexport const apiAdminClients = new Hono()\n\napiAdminClients.get('/', async (c) => {\n const result = await db.select().from(clients).all()\n return c.json(result)\n})\n\napiAdminClients.get('/:id', async (c) => {\n const id = c.req.param('id')\n const result = await db.select().from(clients).where(eq(clients.id, id)).get()\n if (!result) {\n return c.json({ error: 'Client not found' }, 404)\n }\n return c.json(result)\n})\n\napiAdminClients.post('/', zValidator('json', insertClientSchema), async (c) => {\n const body = c.req.valid('json')\n\n try {\n const result = await db\n .insert(clients)\n .values({\n allowedGrants: body.allowedGrants ?? ['authorization_code', 'refresh_token'],\n id: body.id,\n name: body.name,\n redirectUris: body.redirectUris ?? [],\n scopeIds: body.scopeIds ?? [],\n secret: body.secret ?? generateRandomToken(),\n })\n .returning()\n .get()\n return c.json(result, 201)\n } catch (err) {\n if (err instanceof Error && err.message?.includes('UNIQUE constraint failed')) {\n return c.json({ error: 'Client already exists' }, 409)\n }\n return c.json({ error: 'Failed to create client' }, 500)\n }\n})\n\napiAdminClients.put(\n '/:id',\n zValidator(\n 'json',\n insertClientSchema\n .pick({\n allowedGrants: true,\n name: true,\n redirectUris: true,\n scopeIds: true,\n secret: true,\n })\n .partial(),\n ),\n async (c) => {\n const id = c.req.param('id')\n const body = c.req.valid('json')\n const result = await db.update(clients).set(body).where(eq(clients.id, id)).returning().get()\n if (!result) {\n return c.json({ error: 'Client not found' }, 404)\n }\n return c.json(result)\n },\n)\n\napiAdminClients.delete('/:id', async (c) => {\n const id = c.req.param('id')\n const result = await db.delete(clients).where(eq(clients.id, id)).returning().get()\n if (!result) {\n return c.json({ error: 'Client not found' }, 404)\n }\n return c.json({ message: 'Client deleted' })\n})\n","import { randomBytes } from 'node:crypto'\n\nexport function generateRandomToken(length = 32): string {\n return randomBytes(length).toString('hex')\n}\n","import { zValidator } from '@hono/zod-validator'\nimport { eq } from 'drizzle-orm'\nimport { Hono } from 'hono'\nimport { db } from './db/index.ts'\nimport { insertScopeSchema, scopes } from './db/schema/index.ts'\n\nexport const apiAdminScopes = new Hono()\n\napiAdminScopes.get('/', async (c) => {\n const result = await db.select().from(scopes).all()\n return c.json(result)\n})\n\napiAdminScopes.get('/:id', async (c) => {\n const id = c.req.param('id')\n const result = await db.select().from(scopes).where(eq(scopes.id, id)).get()\n if (!result) {\n return c.json({ error: 'Scope not found' }, 404)\n }\n return c.json(result)\n})\n\napiAdminScopes.post('/', zValidator('json', insertScopeSchema), async (c) => {\n const body = c.req.valid('json')\n\n try {\n const result = await db\n .insert(scopes)\n .values({\n description: body.description ?? null,\n id: body.id,\n name: body.name,\n })\n .returning()\n .get()\n return c.json(result, 201)\n } catch (err) {\n if (err instanceof Error && err.message?.includes('UNIQUE constraint failed')) {\n return c.json({ error: 'Scope already exists' }, 409)\n }\n return c.json({ error: 'Failed to create scope' }, 500)\n }\n})\n\napiAdminScopes.put(\n '/:id',\n zValidator('json', insertScopeSchema.pick({ description: true, name: true }).partial()),\n async (c) => {\n const id = c.req.param('id')\n const body = c.req.valid('json')\n const result = await db\n .update(scopes)\n .set({ description: body.description, name: body.name })\n .where(eq(scopes.id, id))\n .returning()\n .get()\n if (!result) {\n return c.json({ error: 'Scope not found' }, 404)\n }\n return c.json(result)\n },\n)\n\napiAdminScopes.delete('/:id', async (c) => {\n const id = c.req.param('id')\n const result = await db.delete(scopes).where(eq(scopes.id, id)).returning().get()\n if (!result) {\n return c.json({ error: 'Scope not found' }, 404)\n }\n return c.json({ message: 'Scope deleted' })\n})\n","import { eq } from 'drizzle-orm'\nimport { Hono } from 'hono'\nimport { db } from './db/index.ts'\nimport { tokens } from './db/schema/index.ts'\n\nexport const apiAdminTokens = new Hono()\n\napiAdminTokens.get('/', async (c) => {\n const result = await db.select().from(tokens).all()\n return c.json(result)\n})\n\napiAdminTokens.get('/:accessToken', async (c) => {\n const accessToken = c.req.param('accessToken')\n const result = await db.select().from(tokens).where(eq(tokens.accessToken, accessToken)).get()\n if (!result) {\n return c.json({ error: 'Token not found' }, 404)\n }\n return c.json(result)\n})\n\napiAdminTokens.delete('/:accessToken', async (c) => {\n const accessToken = c.req.param('accessToken')\n const result = await db.delete(tokens).where(eq(tokens.accessToken, accessToken)).returning().get()\n if (!result) {\n return c.json({ error: 'Token not found' }, 404)\n }\n return c.json({ message: 'Token deleted' })\n})\n\napiAdminTokens.post('/:accessToken/revoke', async (c) => {\n const accessToken = c.req.param('accessToken')\n const result = await db\n .update(tokens)\n .set({\n accessTokenExpiresAt: new Date(0),\n refreshTokenExpiresAt: new Date(0),\n })\n .where(eq(tokens.accessToken, accessToken))\n .returning()\n .get()\n if (!result) {\n return c.json({ error: 'Token not found' }, 404)\n }\n return c.json({ message: 'Token revoked' })\n})\n"],"mappings":"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","names":["Hono","zValidator","eq","Hono","sql","integer","sqliteTable","text","createInsertSchema","createSelectSchema","sql","integer","sqliteTable","text","createInsertSchema","createSelectSchema","sql","integer","sqliteTable","text","createInsertSchema","createSelectSchema","sql","integer","sqliteTable","text","createInsertSchema","createSelectSchema","eq","Hono","Hono","eq","zValidator","eq","Hono","Hono","eq","zValidator","eq","Hono","Hono","eq","Hono","eq","zValidator","Hono"]}
|
package/package.json
CHANGED
|
@@ -56,6 +56,7 @@
|
|
|
56
56
|
"db:migrate": "drizzle-kit migrate",
|
|
57
57
|
"db:push": "drizzle-kit push",
|
|
58
58
|
"db:seed": "bun src/seed.ts",
|
|
59
|
+
"db:seed:oauth": "bun scripts/seed-oauth.ts",
|
|
59
60
|
"db:studio": "drizzle-kit studio",
|
|
60
61
|
"lint": "biome check --error-on-warnings",
|
|
61
62
|
"lint:fix": "biome check --error-on-warnings --write",
|
|
@@ -66,5 +67,5 @@
|
|
|
66
67
|
},
|
|
67
68
|
"type": "module",
|
|
68
69
|
"types": "./dist/index.d.ts",
|
|
69
|
-
"version": "0.1.0-canary-
|
|
70
|
+
"version": "0.1.0-canary-20260125224000"
|
|
70
71
|
}
|