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 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 import_hono2 = require("hono");
84
+ var import_hono6 = require("hono");
84
85
 
85
86
  // src/api-admin.ts
86
- var import_zod_validator = require("@hono/zod-validator");
87
- var import_drizzle_orm2 = require("drizzle-orm");
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/users.ts
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 users = (0, import_sqlite_core.sqliteTable)("users", {
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
- email: (0, import_sqlite_core.text)("email").notNull().unique(),
109
- id: (0, import_sqlite_core.text)("id").primaryKey(),
110
- name: (0, import_sqlite_core.text)("name").notNull(),
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 insertUserSchema = (0, import_drizzle_zod.createInsertSchema)(users);
114
- var selectUserSchema = (0, import_drizzle_zod.createSelectSchema)(users);
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 import_hono.Hono();
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, import_drizzle_orm2.eq)(users.id, id)).get();
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, import_zod_validator.zValidator)("json", insertUserSchema), async (c) => {
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
- if (err.message?.includes("UNIQUE constraint failed")) {
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, import_drizzle_orm2.eq)(users.id, id)).returning().get();
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 import_hono2.Hono();
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 Hono2 } from "hono";
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/users.ts
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 users = sqliteTable("users", {
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
- email: text("email").notNull().unique(),
108
- id: text("id").primaryKey(),
109
- name: text("name").notNull(),
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 = createInsertSchema(users);
113
- var selectUserSchema = createSelectSchema(users);
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 Hono();
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(eq(users.id, id)).get();
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", zValidator("json", insertUserSchema), async (c) => {
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
- if (err.message?.includes("UNIQUE constraint failed")) {
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(eq(users.id, id)).returning().get();
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 Hono2();
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":";;;;;;;;AACA,SAAS,eAAe;;;ACDxB;AAAA,EACE,KAAO;AAAA,IACL,6BAA6B;AAAA,EAC/B;AAAA,EACA,cAAgB;AAAA,IACd,uBAAuB;AAAA,IACvB,kBAAkB;AAAA,IAClB,WAAa;AAAA,IACb,eAAe;AAAA,IACf,eAAe;AAAA,IACf,MAAQ;AAAA,IACR,QAAU;AAAA,IACV,KAAO;AAAA,EACT;AAAA,EACA,iBAAmB;AAAA,IACjB,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB,cAAc;AAAA,IACd,eAAe;AAAA,IACf,cAAc;AAAA,IACd,SAAW;AAAA,IACX,MAAQ;AAAA,EACV;AAAA,EACA,SAAW;AAAA,IACT,KAAK;AAAA,MACH,QAAU;AAAA,QACR,OAAS;AAAA,QACT,SAAW;AAAA,MACb;AAAA,MACA,SAAW;AAAA,QACT,OAAS;AAAA,QACT,SAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAAA,EACA,OAAS,CAAC,MAAM;AAAA,EAChB,SAAW;AAAA,EACX,MAAQ;AAAA,EACR,QAAU;AAAA,EACV,MAAQ;AAAA,EACR,aAAe;AAAA,EACf,YAAc;AAAA,IACZ,MAAQ;AAAA,IACR,KAAO;AAAA,EACT;AAAA,EACA,kBAAoB;AAAA,IAClB,YAAc;AAAA,EAChB;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,eAAe;AAAA,IACf,eAAe;AAAA,IACf,cAAc;AAAA,IACd,WAAW;AAAA,IACX,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,MAAQ;AAAA,IACR,YAAY;AAAA,IACZ,SAAW;AAAA,IACX,MAAQ;AAAA,IACR,cAAc;AAAA,IACd,SAAW;AAAA,EACb;AAAA,EACA,MAAQ;AAAA,EACR,OAAS;AAAA,EACT,SAAW;AACb;;;ACpEA,SAAS,QAAAA,aAAY;;;ACArB,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,MAAAC,WAAU;AACnB,SAAS,QAAAC,aAAY;;;ACFrB,SAAS,UAAU;AACnB,SAAS,YAAY;;;ACDrB,SAAS,oBAAoB;AAC7B,SAAS,eAAe;;;ACDxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAS,WAAW;AACpB,SAAS,SAAS,aAAa,YAAY;AAC3C,SAAS,oBAAoB,0BAA0B;AAEhD,IAAM,YAAY,YAAY,cAAc;AAAA,EACjD,UAAU,KAAK,WAAW,EAAE,QAAQ;AAAA,EACpC,MAAM,KAAK,MAAM,EAAE,WAAW;AAAA,EAC9B,eAAe,KAAK,gBAAgB;AAAA,EACpC,qBAAqB,KAAK,uBAAuB,EAAE,MAAwB;AAAA,EAC3E,WAAW,QAAQ,cAAc,EAAE,MAAM,eAAe,CAAC,EACtD,QAAQ,qDAAqD,EAC7D,QAAQ;AAAA,EACX,WAAW,QAAQ,cAAc,EAAE,MAAM,eAAe,CAAC,EAAE,QAAQ;AAAA,EACnE,aAAa,KAAK,cAAc;AAAA,EAChC,UAAU,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC,EAAE,MAAgB,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAAA,EACpF,WAAW,QAAQ,cAAc,EAAE,MAAM,eAAe,CAAC,EACtD,QAAQ,qDAAqD,EAC7D,UAAU,MAAM,oBAAI,KAAK,CAAC,EAC1B,QAAQ;AAAA,EACX,QAAQ,KAAK,SAAS;AACxB,CAAC;AAEM,IAAM,uBAAuB,mBAAmB,SAAS;AACzD,IAAM,uBAAuB,mBAAmB,SAAS;;;ACvBhE,SAAS,OAAAC,YAAW;AACpB,SAAS,WAAAC,UAAS,eAAAC,cAAa,QAAAC,aAAY;AAC3C,SAAS,sBAAAC,qBAAoB,sBAAAC,2BAA0B;AAEhD,IAAM,UAAUH,aAAY,WAAW;AAAA,EAC5C,eAAeC,MAAK,kBAAkB,EAAE,MAAM,OAAO,CAAC,EAAE,MAAgB,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC9F,WAAWF,SAAQ,cAAc,EAAE,MAAM,eAAe,CAAC,EACtD,QAAQD,sDAAqD,EAC7D,QAAQ;AAAA,EACX,IAAIG,MAAK,IAAI,EAAE,WAAW;AAAA,EAC1B,MAAMA,MAAK,MAAM,EAAE,QAAQ;AAAA,EAC3B,cAAcA,MAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC,EAAE,MAAgB,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC5F,UAAUA,MAAK,aAAa,EAAE,MAAM,OAAO,CAAC,EAAE,MAAgB,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAAA,EACpF,QAAQA,MAAK,QAAQ;AAAA,EACrB,WAAWF,SAAQ,cAAc,EAAE,MAAM,eAAe,CAAC,EACtD,QAAQD,sDAAqD,EAC7D,UAAU,MAAM,oBAAI,KAAK,CAAC,EAC1B,QAAQ;AACb,CAAC;AAEM,IAAM,qBAAqBI,oBAAmB,OAAO;AACrD,IAAM,qBAAqBC,oBAAmB,OAAO;;;ACrB5D,SAAS,OAAAC,YAAW;AACpB,SAAS,WAAAC,UAAS,eAAAC,cAAa,QAAAC,aAAY;AAC3C,SAAS,sBAAAC,qBAAoB,sBAAAC,2BAA0B;AAEhD,IAAM,SAASH,aAAY,UAAU;AAAA,EAC1C,WAAWD,SAAQ,cAAc,EAAE,MAAM,eAAe,CAAC,EACtD,QAAQD,sDAAqD,EAC7D,QAAQ;AAAA,EACX,aAAaG,MAAK,aAAa;AAAA,EAC/B,IAAIA,MAAK,IAAI,EAAE,WAAW;AAAA,EAC1B,MAAMA,MAAK,MAAM,EAAE,QAAQ,EAAE,OAAO;AAAA,EACpC,WAAWF,SAAQ,cAAc,EAAE,MAAM,eAAe,CAAC,EACtD,QAAQD,sDAAqD,EAC7D,UAAU,MAAM,oBAAI,KAAK,CAAC,EAC1B,QAAQ;AACb,CAAC;AAEM,IAAM,oBAAoBI,oBAAmB,MAAM;AACnD,IAAM,oBAAoBC,oBAAmB,MAAM;;;AClB1D,SAAS,OAAAC,YAAW;AACpB,SAAS,WAAAC,UAAS,eAAAC,cAAa,QAAAC,aAAY;AAC3C,SAAS,sBAAAC,qBAAoB,sBAAAC,2BAA0B;AAEhD,IAAM,SAASH,aAAY,UAAU;AAAA,EAC1C,aAAaC,MAAK,cAAc,EAAE,WAAW;AAAA,EAC7C,sBAAsBF,SAAQ,2BAA2B;AAAA,IACvD,MAAM;AAAA,EACR,CAAC,EAAE,QAAQ;AAAA,EACX,UAAUE,MAAK,WAAW,EAAE,QAAQ;AAAA,EACpC,WAAWF,SAAQ,cAAc,EAAE,MAAM,eAAe,CAAC,EACtD,QAAQD,sDAAqD,EAC7D,QAAQ;AAAA,EACX,uBAAuBG,MAAK,0BAA0B;AAAA,EACtD,cAAcA,MAAK,eAAe,EAAE,OAAO;AAAA,EAC3C,uBAAuBF,SAAQ,4BAA4B;AAAA,IACzD,MAAM;AAAA,EACR,CAAC;AAAA,EACD,UAAUE,MAAK,aAAa,EAAE,MAAM,OAAO,CAAC,EAAE,MAAgB,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAAA,EACpF,WAAWF,SAAQ,cAAc,EAAE,MAAM,eAAe,CAAC,EACtD,QAAQD,sDAAqD,EAC7D,UAAU,MAAM,oBAAI,KAAK,CAAC,EAC1B,QAAQ;AAAA,EACX,QAAQG,MAAK,SAAS;AACxB,CAAC;AAEM,IAAM,oBAAoBC,oBAAmB,MAAM;AACnD,IAAM,oBAAoBC,oBAAmB,MAAM;;;AC3B1D,SAAS,OAAAC,YAAW;AACpB,SAAS,WAAAC,UAAS,eAAAC,cAAa,QAAAC,aAAY;AAC3C,SAAS,sBAAAC,qBAAoB,sBAAAC,2BAA0B;AAEhD,IAAM,QAAQH,aAAY,SAAS;AAAA,EACxC,WAAWD,SAAQ,cAAc,EAAE,MAAM,eAAe,CAAC,EACtD,QAAQD,sDAAqD,EAC7D,QAAQ;AAAA,EACX,OAAOG,MAAK,OAAO,EAAE,QAAQ,EAAE,OAAO;AAAA,EACtC,IAAIA,MAAK,IAAI,EAAE,WAAW;AAAA,EAC1B,aAAaF,SAAQ,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAAA,EAC9D,MAAME,MAAK,MAAM,EAAE,QAAQ;AAAA,EAC3B,cAAcA,MAAK,eAAe;AAAA,EAClC,MAAMA,MAAK,MAAM,EAAE,QAAQ,MAAM,EAAE,QAAQ;AAAA,EAC3C,cAAcF,SAAQ,eAAe,EAAE,QAAQ,CAAC,EAAE,QAAQ;AAAA,EAC1D,WAAWA,SAAQ,cAAc,EAAE,MAAM,eAAe,CAAC,EACtD,QAAQD,sDAAqD,EAC7D,UAAU,MAAM,oBAAI,KAAK,CAAC,EAC1B,QAAQ;AACb,CAAC;AAEM,IAAM,mBAAmBI,oBAAmB,KAAK;AACjD,IAAM,mBAAmBC,oBAAmB,KAAK;;;ANlBxD,IAAM,SAAS,aAAa;AAAA,EAC1B,WAAW,QAAQ,IAAI;AAAA,EACvB,KAAK,QAAQ,IAAI,gBAAgB;AACnC,CAAC;AAEM,IAAM,KAAK,QAAQ,QAAQ,EAAE,uBAAO,CAAC;;;ADJrC,IAAM,oBAAoB,IAAI,KAAK;AAE1C,kBAAkB,IAAI,KAAK,OAAO,MAAM;AACtC,QAAM,SAAS,MAAM,GAAG,OAAO,EAAE,KAAK,SAAS,EAAE,IAAI;AACrD,SAAO,EAAE,KAAK,MAAM;AACtB,CAAC;AAED,kBAAkB,IAAI,UAAU,OAAO,MAAM;AAC3C,QAAM,OAAO,EAAE,IAAI,MAAM,MAAM;AAC/B,QAAM,SAAS,MAAM,GAAG,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,GAAG,UAAU,MAAM,IAAI,CAAC,EAAE,IAAI;AACrF,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,KAAK,EAAE,OAAO,sBAAsB,GAAG,GAAG;AAAA,EACrD;AACA,SAAO,EAAE,KAAK,MAAM;AACtB,CAAC;AAED,kBAAkB,OAAO,UAAU,OAAO,MAAM;AAC9C,QAAM,OAAO,EAAE,IAAI,MAAM,MAAM;AAC/B,QAAM,SAAS,MAAM,GAAG,OAAO,SAAS,EAAE,MAAM,GAAG,UAAU,MAAM,IAAI,CAAC,EAAE,UAAU,EAAE,IAAI;AAC1F,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,KAAK,EAAE,OAAO,sBAAsB,GAAG,GAAG;AAAA,EACrD;AACA,SAAO,EAAE,KAAK,EAAE,SAAS,oBAAoB,CAAC;AAChD,CAAC;AAED,kBAAkB,KAAK,iBAAiB,OAAO,MAAM;AACnD,QAAM,OAAO,EAAE,IAAI,MAAM,MAAM;AAC/B,QAAM,SAAS,MAAM,GAClB,OAAO,SAAS,EAChB,IAAI,EAAE,WAAW,oBAAI,KAAK,CAAC,EAAE,CAAC,EAC9B,MAAM,GAAG,UAAU,MAAM,IAAI,CAAC,EAC9B,UAAU,EACV,IAAI;AACP,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,KAAK,EAAE,OAAO,sBAAsB,GAAG,GAAG;AAAA,EACrD;AACA,SAAO,EAAE,KAAK,EAAE,SAAS,oBAAoB,CAAC;AAChD,CAAC;;;AQ1CD,SAAS,kBAAkB;AAC3B,SAAS,MAAAC,WAAU;AACnB,SAAS,QAAAC,aAAY;;;ACFrB,SAAS,mBAAmB;AAErB,SAAS,oBAAoB,SAAS,IAAY;AACvD,SAAO,YAAY,MAAM,EAAE,SAAS,KAAK;AAC3C;;;ADGO,IAAM,kBAAkB,IAAIC,MAAK;AAExC,gBAAgB,IAAI,KAAK,OAAO,MAAM;AACpC,QAAM,SAAS,MAAM,GAAG,OAAO,EAAE,KAAK,OAAO,EAAE,IAAI;AACnD,SAAO,EAAE,KAAK,MAAM;AACtB,CAAC;AAED,gBAAgB,IAAI,QAAQ,OAAO,MAAM;AACvC,QAAM,KAAK,EAAE,IAAI,MAAM,IAAI;AAC3B,QAAM,SAAS,MAAM,GAAG,OAAO,EAAE,KAAK,OAAO,EAAE,MAAMC,IAAG,QAAQ,IAAI,EAAE,CAAC,EAAE,IAAI;AAC7E,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,KAAK,EAAE,OAAO,mBAAmB,GAAG,GAAG;AAAA,EAClD;AACA,SAAO,EAAE,KAAK,MAAM;AACtB,CAAC;AAED,gBAAgB,KAAK,KAAK,WAAW,QAAQ,kBAAkB,GAAG,OAAO,MAAM;AAC7E,QAAM,OAAO,EAAE,IAAI,MAAM,MAAM;AAE/B,MAAI;AACF,UAAM,SAAS,MAAM,GAClB,OAAO,OAAO,EACd,OAAO;AAAA,MACN,eAAe,KAAK,iBAAiB,CAAC,sBAAsB,eAAe;AAAA,MAC3E,IAAI,KAAK;AAAA,MACT,MAAM,KAAK;AAAA,MACX,cAAc,KAAK,gBAAgB,CAAC;AAAA,MACpC,UAAU,KAAK,YAAY,CAAC;AAAA,MAC5B,QAAQ,KAAK,UAAU,oBAAoB;AAAA,IAC7C,CAAC,EACA,UAAU,EACV,IAAI;AACP,WAAO,EAAE,KAAK,QAAQ,GAAG;AAAA,EAC3B,SAAS,KAAK;AACZ,QAAI,eAAe,SAAS,IAAI,SAAS,SAAS,0BAA0B,GAAG;AAC7E,aAAO,EAAE,KAAK,EAAE,OAAO,wBAAwB,GAAG,GAAG;AAAA,IACvD;AACA,WAAO,EAAE,KAAK,EAAE,OAAO,0BAA0B,GAAG,GAAG;AAAA,EACzD;AACF,CAAC;AAED,gBAAgB;AAAA,EACd;AAAA,EACA;AAAA,IACE;AAAA,IACA,mBACG,KAAK;AAAA,MACJ,eAAe;AAAA,MACf,MAAM;AAAA,MACN,cAAc;AAAA,MACd,UAAU;AAAA,MACV,QAAQ;AAAA,IACV,CAAC,EACA,QAAQ;AAAA,EACb;AAAA,EACA,OAAO,MAAM;AACX,UAAM,KAAK,EAAE,IAAI,MAAM,IAAI;AAC3B,UAAM,OAAO,EAAE,IAAI,MAAM,MAAM;AAC/B,UAAM,SAAS,MAAM,GAAG,OAAO,OAAO,EAAE,IAAI,IAAI,EAAE,MAAMA,IAAG,QAAQ,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI;AAC5F,QAAI,CAAC,QAAQ;AACX,aAAO,EAAE,KAAK,EAAE,OAAO,mBAAmB,GAAG,GAAG;AAAA,IAClD;AACA,WAAO,EAAE,KAAK,MAAM;AAAA,EACtB;AACF;AAEA,gBAAgB,OAAO,QAAQ,OAAO,MAAM;AAC1C,QAAM,KAAK,EAAE,IAAI,MAAM,IAAI;AAC3B,QAAM,SAAS,MAAM,GAAG,OAAO,OAAO,EAAE,MAAMA,IAAG,QAAQ,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI;AAClF,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,KAAK,EAAE,OAAO,mBAAmB,GAAG,GAAG;AAAA,EAClD;AACA,SAAO,EAAE,KAAK,EAAE,SAAS,iBAAiB,CAAC;AAC7C,CAAC;;;AEhFD,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,MAAAC,WAAU;AACnB,SAAS,QAAAC,aAAY;AAId,IAAM,iBAAiB,IAAIC,MAAK;AAEvC,eAAe,IAAI,KAAK,OAAO,MAAM;AACnC,QAAM,SAAS,MAAM,GAAG,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI;AAClD,SAAO,EAAE,KAAK,MAAM;AACtB,CAAC;AAED,eAAe,IAAI,QAAQ,OAAO,MAAM;AACtC,QAAM,KAAK,EAAE,IAAI,MAAM,IAAI;AAC3B,QAAM,SAAS,MAAM,GAAG,OAAO,EAAE,KAAK,MAAM,EAAE,MAAMC,IAAG,OAAO,IAAI,EAAE,CAAC,EAAE,IAAI;AAC3E,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,KAAK,EAAE,OAAO,kBAAkB,GAAG,GAAG;AAAA,EACjD;AACA,SAAO,EAAE,KAAK,MAAM;AACtB,CAAC;AAED,eAAe,KAAK,KAAKC,YAAW,QAAQ,iBAAiB,GAAG,OAAO,MAAM;AAC3E,QAAM,OAAO,EAAE,IAAI,MAAM,MAAM;AAE/B,MAAI;AACF,UAAM,SAAS,MAAM,GAClB,OAAO,MAAM,EACb,OAAO;AAAA,MACN,aAAa,KAAK,eAAe;AAAA,MACjC,IAAI,KAAK;AAAA,MACT,MAAM,KAAK;AAAA,IACb,CAAC,EACA,UAAU,EACV,IAAI;AACP,WAAO,EAAE,KAAK,QAAQ,GAAG;AAAA,EAC3B,SAAS,KAAK;AACZ,QAAI,eAAe,SAAS,IAAI,SAAS,SAAS,0BAA0B,GAAG;AAC7E,aAAO,EAAE,KAAK,EAAE,OAAO,uBAAuB,GAAG,GAAG;AAAA,IACtD;AACA,WAAO,EAAE,KAAK,EAAE,OAAO,yBAAyB,GAAG,GAAG;AAAA,EACxD;AACF,CAAC;AAED,eAAe;AAAA,EACb;AAAA,EACAA,YAAW,QAAQ,kBAAkB,KAAK,EAAE,aAAa,MAAM,MAAM,KAAK,CAAC,EAAE,QAAQ,CAAC;AAAA,EACtF,OAAO,MAAM;AACX,UAAM,KAAK,EAAE,IAAI,MAAM,IAAI;AAC3B,UAAM,OAAO,EAAE,IAAI,MAAM,MAAM;AAC/B,UAAM,SAAS,MAAM,GAClB,OAAO,MAAM,EACb,IAAI,EAAE,aAAa,KAAK,aAAa,MAAM,KAAK,KAAK,CAAC,EACtD,MAAMD,IAAG,OAAO,IAAI,EAAE,CAAC,EACvB,UAAU,EACV,IAAI;AACP,QAAI,CAAC,QAAQ;AACX,aAAO,EAAE,KAAK,EAAE,OAAO,kBAAkB,GAAG,GAAG;AAAA,IACjD;AACA,WAAO,EAAE,KAAK,MAAM;AAAA,EACtB;AACF;AAEA,eAAe,OAAO,QAAQ,OAAO,MAAM;AACzC,QAAM,KAAK,EAAE,IAAI,MAAM,IAAI;AAC3B,QAAM,SAAS,MAAM,GAAG,OAAO,MAAM,EAAE,MAAMA,IAAG,OAAO,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI;AAChF,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,KAAK,EAAE,OAAO,kBAAkB,GAAG,GAAG;AAAA,EACjD;AACA,SAAO,EAAE,KAAK,EAAE,SAAS,gBAAgB,CAAC;AAC5C,CAAC;;;ACtED,SAAS,MAAAE,WAAU;AACnB,SAAS,QAAAC,aAAY;AAId,IAAM,iBAAiB,IAAIC,MAAK;AAEvC,eAAe,IAAI,KAAK,OAAO,MAAM;AACnC,QAAM,SAAS,MAAM,GAAG,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI;AAClD,SAAO,EAAE,KAAK,MAAM;AACtB,CAAC;AAED,eAAe,IAAI,iBAAiB,OAAO,MAAM;AAC/C,QAAM,cAAc,EAAE,IAAI,MAAM,aAAa;AAC7C,QAAM,SAAS,MAAM,GAAG,OAAO,EAAE,KAAK,MAAM,EAAE,MAAMC,IAAG,OAAO,aAAa,WAAW,CAAC,EAAE,IAAI;AAC7F,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,KAAK,EAAE,OAAO,kBAAkB,GAAG,GAAG;AAAA,EACjD;AACA,SAAO,EAAE,KAAK,MAAM;AACtB,CAAC;AAED,eAAe,OAAO,iBAAiB,OAAO,MAAM;AAClD,QAAM,cAAc,EAAE,IAAI,MAAM,aAAa;AAC7C,QAAM,SAAS,MAAM,GAAG,OAAO,MAAM,EAAE,MAAMA,IAAG,OAAO,aAAa,WAAW,CAAC,EAAE,UAAU,EAAE,IAAI;AAClG,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,KAAK,EAAE,OAAO,kBAAkB,GAAG,GAAG;AAAA,EACjD;AACA,SAAO,EAAE,KAAK,EAAE,SAAS,gBAAgB,CAAC;AAC5C,CAAC;AAED,eAAe,KAAK,wBAAwB,OAAO,MAAM;AACvD,QAAM,cAAc,EAAE,IAAI,MAAM,aAAa;AAC7C,QAAM,SAAS,MAAM,GAClB,OAAO,MAAM,EACb,IAAI;AAAA,IACH,sBAAsB,oBAAI,KAAK,CAAC;AAAA,IAChC,uBAAuB,oBAAI,KAAK,CAAC;AAAA,EACnC,CAAC,EACA,MAAMA,IAAG,OAAO,aAAa,WAAW,CAAC,EACzC,UAAU,EACV,IAAI;AACP,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,KAAK,EAAE,OAAO,kBAAkB,GAAG,GAAG;AAAA,EACjD;AACA,SAAO,EAAE,KAAK,EAAE,SAAS,gBAAgB,CAAC;AAC5C,CAAC;;;AZnCM,IAAM,WAAW,IAAIC,MAAK;AAGjC,SAAS,MAAM,WAAW,cAAc;AACxC,SAAS,MAAM,YAAY,eAAe;AAC1C,SAAS,MAAM,WAAW,cAAc;AACxC,SAAS,MAAM,eAAe,iBAAiB;AAG/C,SAAS,IAAI,UAAU,OAAO,MAAM;AAClC,QAAM,SAAS,MAAM,GAAG,OAAO,EAAE,KAAK,KAAK,EAAE,IAAI;AACjD,SAAO,EAAE,KAAK,MAAM;AACtB,CAAC;AAGD,SAAS,IAAI,cAAc,OAAO,MAAM;AACtC,QAAM,KAAK,EAAE,IAAI,MAAM,IAAI;AAC3B,QAAM,SAAS,MAAM,GAAG,OAAO,EAAE,KAAK,KAAK,EAAE,MAAMC,IAAG,MAAM,IAAI,EAAE,CAAC,EAAE,IAAI;AACzE,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,KAAK,EAAE,OAAO,iBAAiB,GAAG,GAAG;AAAA,EAChD;AACA,SAAO,EAAE,KAAK,MAAM;AACtB,CAAC;AAGD,SAAS,KAAK,UAAUC,YAAW,QAAQ,gBAAgB,GAAG,OAAO,MAAM;AACzE,QAAM,OAAO,EAAE,IAAI,MAAM,MAAM;AAE/B,MAAI;AACF,UAAM,SAAS,MAAM,GAAG,OAAO,KAAK,EAAE,OAAO,IAAI,EAAE,UAAU,EAAE,IAAI;AAEnE,WAAO,EAAE,KAAK,QAAQ,GAAG;AAAA,EAC3B,SAAS,KAAK;AACZ,QAAI,eAAe,SAAS,IAAI,SAAS,SAAS,0BAA0B,GAAG;AAC7E,aAAO,EAAE,KAAK,EAAE,OAAO,sBAAsB,GAAG,GAAG;AAAA,IACrD;AACA,WAAO,EAAE,KAAK,EAAE,OAAO,wBAAwB,GAAG,GAAG;AAAA,EACvD;AACF,CAAC;AAGD,SAAS,OAAO,cAAc,OAAO,MAAM;AACzC,QAAM,KAAK,EAAE,IAAI,MAAM,IAAI;AAC3B,QAAM,SAAS,MAAM,GAAG,OAAO,KAAK,EAAE,MAAMD,IAAG,MAAM,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI;AAC9E,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,KAAK,EAAE,OAAO,iBAAiB,GAAG,GAAG;AAAA,EAChD;AACA,SAAO,EAAE,KAAK,EAAE,SAAS,eAAe,CAAC;AAC3C,CAAC;;;ADvDM,SAAS,YAAY,OAAe,KAAM,UAAqC,CAAC,GAAG;AACxF,QAAM,MAAM,IAAIE,MAAK;AAErB,MAAI,IAAI,KAAK,CAAC,MAAM;AAClB,WAAO,EAAE,KAAK,aAAa;AAAA,EAC7B,CAAC;AAED,MAAI,QAAQ,aAAa;AACvB,QAAI,MAAM,UAAU,QAAQ;AAC5B,YAAQ,IAAI,6BAA6B;AAAA,EAC3C;AAEA,UAAQ,IAAI,6BAA6B,IAAI,EAAE;AAE/C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;;;AFhBA,IAAM,UAAU,IAAI,QAAQ;AAE5B,QAAQ,KAAK,gBAAY,IAAI,EAAE,YAAY,gBAAY,WAAW,EAAE,QAAQ,gBAAY,OAAO;AAE/F,QACG,QAAQ,OAAO,EACf,YAAY,sBAAsB,EAClC,OAAO,WAAW,8BAA8B,KAAK,EACrD,OAAO,uBAAuB,6BAA6B,MAAM,EACjE,OAAO,CAAC,YAAY;AACnB,QAAM,EAAE,KAAK,KAAK,IAAI,YAAY,SAAS,QAAQ,MAAM,EAAE,GAAG;AAAA,IAC5D,aAAa,QAAQ;AAAA,EACvB,CAAC;AAED,MAAI,MAAM,EAAE,OAAO,IAAI,OAAO,KAAK,CAAC;AACtC,CAAC;AAEH,QAAQ,MAAM,QAAQ,IAAI;","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-20260125211037"
70
+ "version": "0.1.0-canary-20260125224000"
70
71
  }