solana-auth-oauth2-server 0.1.0-canary-20260125213759 → 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 +237 -14
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +237 -14
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.cjs
CHANGED
|
@@ -81,10 +81,14 @@ var package_default = {
|
|
|
81
81
|
};
|
|
82
82
|
|
|
83
83
|
// src/api.ts
|
|
84
|
-
var
|
|
84
|
+
var import_hono6 = require("hono");
|
|
85
85
|
|
|
86
86
|
// src/api-admin.ts
|
|
87
|
-
var
|
|
87
|
+
var import_zod_validator3 = require("@hono/zod-validator");
|
|
88
|
+
var import_drizzle_orm10 = require("drizzle-orm");
|
|
89
|
+
var import_hono5 = require("hono");
|
|
90
|
+
|
|
91
|
+
// src/api-admin-auth-codes.ts
|
|
88
92
|
var import_drizzle_orm6 = require("drizzle-orm");
|
|
89
93
|
var import_hono = require("hono");
|
|
90
94
|
|
|
@@ -97,8 +101,16 @@ var schema_exports = {};
|
|
|
97
101
|
__export(schema_exports, {
|
|
98
102
|
authCodes: () => authCodes,
|
|
99
103
|
clients: () => clients,
|
|
104
|
+
insertAuthCodeSchema: () => insertAuthCodeSchema,
|
|
105
|
+
insertClientSchema: () => insertClientSchema,
|
|
106
|
+
insertScopeSchema: () => insertScopeSchema,
|
|
107
|
+
insertTokenSchema: () => insertTokenSchema,
|
|
100
108
|
insertUserSchema: () => insertUserSchema,
|
|
101
109
|
scopes: () => scopes,
|
|
110
|
+
selectAuthCodeSchema: () => selectAuthCodeSchema,
|
|
111
|
+
selectClientSchema: () => selectClientSchema,
|
|
112
|
+
selectScopeSchema: () => selectScopeSchema,
|
|
113
|
+
selectTokenSchema: () => selectTokenSchema,
|
|
102
114
|
selectUserSchema: () => selectUserSchema,
|
|
103
115
|
tokens: () => tokens,
|
|
104
116
|
users: () => users
|
|
@@ -107,6 +119,7 @@ __export(schema_exports, {
|
|
|
107
119
|
// src/db/schema/auth-codes.ts
|
|
108
120
|
var import_drizzle_orm = require("drizzle-orm");
|
|
109
121
|
var import_sqlite_core = require("drizzle-orm/sqlite-core");
|
|
122
|
+
var import_drizzle_zod = require("drizzle-zod");
|
|
110
123
|
var authCodes = (0, import_sqlite_core.sqliteTable)("auth_codes", {
|
|
111
124
|
clientId: (0, import_sqlite_core.text)("client_id").notNull(),
|
|
112
125
|
code: (0, import_sqlite_core.text)("code").primaryKey(),
|
|
@@ -119,10 +132,13 @@ var authCodes = (0, import_sqlite_core.sqliteTable)("auth_codes", {
|
|
|
119
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(),
|
|
120
133
|
userId: (0, import_sqlite_core.text)("user_id")
|
|
121
134
|
});
|
|
135
|
+
var insertAuthCodeSchema = (0, import_drizzle_zod.createInsertSchema)(authCodes);
|
|
136
|
+
var selectAuthCodeSchema = (0, import_drizzle_zod.createSelectSchema)(authCodes);
|
|
122
137
|
|
|
123
138
|
// src/db/schema/clients.ts
|
|
124
139
|
var import_drizzle_orm2 = require("drizzle-orm");
|
|
125
140
|
var import_sqlite_core2 = require("drizzle-orm/sqlite-core");
|
|
141
|
+
var import_drizzle_zod2 = require("drizzle-zod");
|
|
126
142
|
var clients = (0, import_sqlite_core2.sqliteTable)("clients", {
|
|
127
143
|
allowedGrants: (0, import_sqlite_core2.text)("allowed_grants", { mode: "json" }).$type().notNull().default([]),
|
|
128
144
|
createdAt: (0, import_sqlite_core2.integer)("created_at", { mode: "timestamp_ms" }).default(import_drizzle_orm2.sql`(cast(unixepoch('subsecond') * 1000 as integer))`).notNull(),
|
|
@@ -133,10 +149,13 @@ var clients = (0, import_sqlite_core2.sqliteTable)("clients", {
|
|
|
133
149
|
secret: (0, import_sqlite_core2.text)("secret"),
|
|
134
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()
|
|
135
151
|
});
|
|
152
|
+
var insertClientSchema = (0, import_drizzle_zod2.createInsertSchema)(clients);
|
|
153
|
+
var selectClientSchema = (0, import_drizzle_zod2.createSelectSchema)(clients);
|
|
136
154
|
|
|
137
155
|
// src/db/schema/scopes.ts
|
|
138
156
|
var import_drizzle_orm3 = require("drizzle-orm");
|
|
139
157
|
var import_sqlite_core3 = require("drizzle-orm/sqlite-core");
|
|
158
|
+
var import_drizzle_zod3 = require("drizzle-zod");
|
|
140
159
|
var scopes = (0, import_sqlite_core3.sqliteTable)("scopes", {
|
|
141
160
|
createdAt: (0, import_sqlite_core3.integer)("created_at", { mode: "timestamp_ms" }).default(import_drizzle_orm3.sql`(cast(unixepoch('subsecond') * 1000 as integer))`).notNull(),
|
|
142
161
|
description: (0, import_sqlite_core3.text)("description"),
|
|
@@ -144,10 +163,13 @@ var scopes = (0, import_sqlite_core3.sqliteTable)("scopes", {
|
|
|
144
163
|
name: (0, import_sqlite_core3.text)("name").notNull().unique(),
|
|
145
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()
|
|
146
165
|
});
|
|
166
|
+
var insertScopeSchema = (0, import_drizzle_zod3.createInsertSchema)(scopes);
|
|
167
|
+
var selectScopeSchema = (0, import_drizzle_zod3.createSelectSchema)(scopes);
|
|
147
168
|
|
|
148
169
|
// src/db/schema/tokens.ts
|
|
149
170
|
var import_drizzle_orm4 = require("drizzle-orm");
|
|
150
171
|
var import_sqlite_core4 = require("drizzle-orm/sqlite-core");
|
|
172
|
+
var import_drizzle_zod4 = require("drizzle-zod");
|
|
151
173
|
var tokens = (0, import_sqlite_core4.sqliteTable)("tokens", {
|
|
152
174
|
accessToken: (0, import_sqlite_core4.text)("access_token").primaryKey(),
|
|
153
175
|
accessTokenExpiresAt: (0, import_sqlite_core4.integer)("access_token_expires_at", {
|
|
@@ -164,11 +186,13 @@ var tokens = (0, import_sqlite_core4.sqliteTable)("tokens", {
|
|
|
164
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(),
|
|
165
187
|
userId: (0, import_sqlite_core4.text)("user_id")
|
|
166
188
|
});
|
|
189
|
+
var insertTokenSchema = (0, import_drizzle_zod4.createInsertSchema)(tokens);
|
|
190
|
+
var selectTokenSchema = (0, import_drizzle_zod4.createSelectSchema)(tokens);
|
|
167
191
|
|
|
168
192
|
// src/db/schema/users.ts
|
|
169
193
|
var import_drizzle_orm5 = require("drizzle-orm");
|
|
170
194
|
var import_sqlite_core5 = require("drizzle-orm/sqlite-core");
|
|
171
|
-
var
|
|
195
|
+
var import_drizzle_zod5 = require("drizzle-zod");
|
|
172
196
|
var users = (0, import_sqlite_core5.sqliteTable)("users", {
|
|
173
197
|
createdAt: (0, import_sqlite_core5.integer)("created_at", { mode: "timestamp_ms" }).default(import_drizzle_orm5.sql`(cast(unixepoch('subsecond') * 1000 as integer))`).notNull(),
|
|
174
198
|
email: (0, import_sqlite_core5.text)("email").notNull().unique(),
|
|
@@ -180,8 +204,8 @@ var users = (0, import_sqlite_core5.sqliteTable)("users", {
|
|
|
180
204
|
tokenVersion: (0, import_sqlite_core5.integer)("token_version").default(0).notNull(),
|
|
181
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()
|
|
182
206
|
});
|
|
183
|
-
var insertUserSchema = (0,
|
|
184
|
-
var selectUserSchema = (0,
|
|
207
|
+
var insertUserSchema = (0, import_drizzle_zod5.createInsertSchema)(users);
|
|
208
|
+
var selectUserSchema = (0, import_drizzle_zod5.createSelectSchema)(users);
|
|
185
209
|
|
|
186
210
|
// src/db/index.ts
|
|
187
211
|
var client = (0, import_client.createClient)({
|
|
@@ -190,37 +214,236 @@ var client = (0, import_client.createClient)({
|
|
|
190
214
|
});
|
|
191
215
|
var db = (0, import_libsql.drizzle)(client, { schema: schema_exports });
|
|
192
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
|
+
|
|
193
414
|
// src/api-admin.ts
|
|
194
|
-
var apiAdmin = new
|
|
415
|
+
var apiAdmin = new import_hono5.Hono();
|
|
416
|
+
apiAdmin.route("/scopes", apiAdminScopes);
|
|
417
|
+
apiAdmin.route("/clients", apiAdminClients);
|
|
418
|
+
apiAdmin.route("/tokens", apiAdminTokens);
|
|
419
|
+
apiAdmin.route("/auth-codes", apiAdminAuthCodes);
|
|
195
420
|
apiAdmin.get("/users", async (c) => {
|
|
196
421
|
const result = await db.select().from(users).all();
|
|
197
422
|
return c.json(result);
|
|
198
423
|
});
|
|
199
424
|
apiAdmin.get("/users/:id", async (c) => {
|
|
200
425
|
const id = c.req.param("id");
|
|
201
|
-
const result = await db.select().from(users).where((0,
|
|
426
|
+
const result = await db.select().from(users).where((0, import_drizzle_orm10.eq)(users.id, id)).get();
|
|
202
427
|
if (!result) {
|
|
203
428
|
return c.json({ error: "User not found" }, 404);
|
|
204
429
|
}
|
|
205
430
|
return c.json(result);
|
|
206
431
|
});
|
|
207
|
-
apiAdmin.post("/users", (0,
|
|
432
|
+
apiAdmin.post("/users", (0, import_zod_validator3.zValidator)("json", insertUserSchema), async (c) => {
|
|
208
433
|
const body = c.req.valid("json");
|
|
209
434
|
try {
|
|
210
435
|
const result = await db.insert(users).values(body).returning().get();
|
|
211
436
|
return c.json(result, 201);
|
|
212
437
|
} catch (err) {
|
|
213
|
-
if (err instanceof Error) {
|
|
214
|
-
|
|
215
|
-
return c.json({ error: "User already exists" }, 409);
|
|
216
|
-
}
|
|
438
|
+
if (err instanceof Error && err.message?.includes("UNIQUE constraint failed")) {
|
|
439
|
+
return c.json({ error: "User already exists" }, 409);
|
|
217
440
|
}
|
|
218
441
|
return c.json({ error: "Failed to create user" }, 500);
|
|
219
442
|
}
|
|
220
443
|
});
|
|
221
444
|
apiAdmin.delete("/users/:id", async (c) => {
|
|
222
445
|
const id = c.req.param("id");
|
|
223
|
-
const result = await db.delete(users).where((0,
|
|
446
|
+
const result = await db.delete(users).where((0, import_drizzle_orm10.eq)(users.id, id)).returning().get();
|
|
224
447
|
if (!result) {
|
|
225
448
|
return c.json({ error: "User not found" }, 404);
|
|
226
449
|
}
|
|
@@ -229,7 +452,7 @@ apiAdmin.delete("/users/:id", async (c) => {
|
|
|
229
452
|
|
|
230
453
|
// src/api.ts
|
|
231
454
|
function startServer(port = 3e3, options = {}) {
|
|
232
|
-
const app = new
|
|
455
|
+
const app = new import_hono6.Hono();
|
|
233
456
|
app.get("/", (c) => {
|
|
234
457
|
return c.text("Hello Hono!");
|
|
235
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/auth-codes.ts","../src/db/schema/clients.ts","../src/db/schema/scopes.ts","../src/db/schema/tokens.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: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 { 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 './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'\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","import { sql } from 'drizzle-orm'\nimport { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'\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","import { sql } from 'drizzle-orm'\nimport { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'\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","import { sql } from 'drizzle-orm'\nimport { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'\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","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"],"mappings":"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","names":["import_hono","import_drizzle_orm","import_drizzle_orm","import_sqlite_core","import_drizzle_orm","import_sqlite_core","import_drizzle_orm","import_sqlite_core","import_drizzle_orm","import_sqlite_core"]}
|
|
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
|
@@ -80,10 +80,14 @@ var package_default = {
|
|
|
80
80
|
};
|
|
81
81
|
|
|
82
82
|
// src/api.ts
|
|
83
|
-
import { Hono as
|
|
83
|
+
import { Hono as Hono6 } from "hono";
|
|
84
84
|
|
|
85
85
|
// src/api-admin.ts
|
|
86
|
-
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
|
|
87
91
|
import { eq } from "drizzle-orm";
|
|
88
92
|
import { Hono } from "hono";
|
|
89
93
|
|
|
@@ -96,8 +100,16 @@ var schema_exports = {};
|
|
|
96
100
|
__export(schema_exports, {
|
|
97
101
|
authCodes: () => authCodes,
|
|
98
102
|
clients: () => clients,
|
|
103
|
+
insertAuthCodeSchema: () => insertAuthCodeSchema,
|
|
104
|
+
insertClientSchema: () => insertClientSchema,
|
|
105
|
+
insertScopeSchema: () => insertScopeSchema,
|
|
106
|
+
insertTokenSchema: () => insertTokenSchema,
|
|
99
107
|
insertUserSchema: () => insertUserSchema,
|
|
100
108
|
scopes: () => scopes,
|
|
109
|
+
selectAuthCodeSchema: () => selectAuthCodeSchema,
|
|
110
|
+
selectClientSchema: () => selectClientSchema,
|
|
111
|
+
selectScopeSchema: () => selectScopeSchema,
|
|
112
|
+
selectTokenSchema: () => selectTokenSchema,
|
|
101
113
|
selectUserSchema: () => selectUserSchema,
|
|
102
114
|
tokens: () => tokens,
|
|
103
115
|
users: () => users
|
|
@@ -106,6 +118,7 @@ __export(schema_exports, {
|
|
|
106
118
|
// src/db/schema/auth-codes.ts
|
|
107
119
|
import { sql } from "drizzle-orm";
|
|
108
120
|
import { integer, sqliteTable, text } from "drizzle-orm/sqlite-core";
|
|
121
|
+
import { createInsertSchema, createSelectSchema } from "drizzle-zod";
|
|
109
122
|
var authCodes = sqliteTable("auth_codes", {
|
|
110
123
|
clientId: text("client_id").notNull(),
|
|
111
124
|
code: text("code").primaryKey(),
|
|
@@ -118,10 +131,13 @@ var authCodes = sqliteTable("auth_codes", {
|
|
|
118
131
|
updatedAt: integer("updated_at", { mode: "timestamp_ms" }).default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`).$onUpdate(() => /* @__PURE__ */ new Date()).notNull(),
|
|
119
132
|
userId: text("user_id")
|
|
120
133
|
});
|
|
134
|
+
var insertAuthCodeSchema = createInsertSchema(authCodes);
|
|
135
|
+
var selectAuthCodeSchema = createSelectSchema(authCodes);
|
|
121
136
|
|
|
122
137
|
// src/db/schema/clients.ts
|
|
123
138
|
import { sql as sql2 } from "drizzle-orm";
|
|
124
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";
|
|
125
141
|
var clients = sqliteTable2("clients", {
|
|
126
142
|
allowedGrants: text2("allowed_grants", { mode: "json" }).$type().notNull().default([]),
|
|
127
143
|
createdAt: integer2("created_at", { mode: "timestamp_ms" }).default(sql2`(cast(unixepoch('subsecond') * 1000 as integer))`).notNull(),
|
|
@@ -132,10 +148,13 @@ var clients = sqliteTable2("clients", {
|
|
|
132
148
|
secret: text2("secret"),
|
|
133
149
|
updatedAt: integer2("updated_at", { mode: "timestamp_ms" }).default(sql2`(cast(unixepoch('subsecond') * 1000 as integer))`).$onUpdate(() => /* @__PURE__ */ new Date()).notNull()
|
|
134
150
|
});
|
|
151
|
+
var insertClientSchema = createInsertSchema2(clients);
|
|
152
|
+
var selectClientSchema = createSelectSchema2(clients);
|
|
135
153
|
|
|
136
154
|
// src/db/schema/scopes.ts
|
|
137
155
|
import { sql as sql3 } from "drizzle-orm";
|
|
138
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";
|
|
139
158
|
var scopes = sqliteTable3("scopes", {
|
|
140
159
|
createdAt: integer3("created_at", { mode: "timestamp_ms" }).default(sql3`(cast(unixepoch('subsecond') * 1000 as integer))`).notNull(),
|
|
141
160
|
description: text3("description"),
|
|
@@ -143,10 +162,13 @@ var scopes = sqliteTable3("scopes", {
|
|
|
143
162
|
name: text3("name").notNull().unique(),
|
|
144
163
|
updatedAt: integer3("updated_at", { mode: "timestamp_ms" }).default(sql3`(cast(unixepoch('subsecond') * 1000 as integer))`).$onUpdate(() => /* @__PURE__ */ new Date()).notNull()
|
|
145
164
|
});
|
|
165
|
+
var insertScopeSchema = createInsertSchema3(scopes);
|
|
166
|
+
var selectScopeSchema = createSelectSchema3(scopes);
|
|
146
167
|
|
|
147
168
|
// src/db/schema/tokens.ts
|
|
148
169
|
import { sql as sql4 } from "drizzle-orm";
|
|
149
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";
|
|
150
172
|
var tokens = sqliteTable4("tokens", {
|
|
151
173
|
accessToken: text4("access_token").primaryKey(),
|
|
152
174
|
accessTokenExpiresAt: integer4("access_token_expires_at", {
|
|
@@ -163,11 +185,13 @@ var tokens = sqliteTable4("tokens", {
|
|
|
163
185
|
updatedAt: integer4("updated_at", { mode: "timestamp_ms" }).default(sql4`(cast(unixepoch('subsecond') * 1000 as integer))`).$onUpdate(() => /* @__PURE__ */ new Date()).notNull(),
|
|
164
186
|
userId: text4("user_id")
|
|
165
187
|
});
|
|
188
|
+
var insertTokenSchema = createInsertSchema4(tokens);
|
|
189
|
+
var selectTokenSchema = createSelectSchema4(tokens);
|
|
166
190
|
|
|
167
191
|
// src/db/schema/users.ts
|
|
168
192
|
import { sql as sql5 } from "drizzle-orm";
|
|
169
193
|
import { integer as integer5, sqliteTable as sqliteTable5, text as text5 } from "drizzle-orm/sqlite-core";
|
|
170
|
-
import { createInsertSchema, createSelectSchema } from "drizzle-zod";
|
|
194
|
+
import { createInsertSchema as createInsertSchema5, createSelectSchema as createSelectSchema5 } from "drizzle-zod";
|
|
171
195
|
var users = sqliteTable5("users", {
|
|
172
196
|
createdAt: integer5("created_at", { mode: "timestamp_ms" }).default(sql5`(cast(unixepoch('subsecond') * 1000 as integer))`).notNull(),
|
|
173
197
|
email: text5("email").notNull().unique(),
|
|
@@ -179,8 +203,8 @@ var users = sqliteTable5("users", {
|
|
|
179
203
|
tokenVersion: integer5("token_version").default(0).notNull(),
|
|
180
204
|
updatedAt: integer5("updated_at", { mode: "timestamp_ms" }).default(sql5`(cast(unixepoch('subsecond') * 1000 as integer))`).$onUpdate(() => /* @__PURE__ */ new Date()).notNull()
|
|
181
205
|
});
|
|
182
|
-
var insertUserSchema =
|
|
183
|
-
var selectUserSchema =
|
|
206
|
+
var insertUserSchema = createInsertSchema5(users);
|
|
207
|
+
var selectUserSchema = createSelectSchema5(users);
|
|
184
208
|
|
|
185
209
|
// src/db/index.ts
|
|
186
210
|
var client = createClient({
|
|
@@ -189,37 +213,236 @@ var client = createClient({
|
|
|
189
213
|
});
|
|
190
214
|
var db = drizzle(client, { schema: schema_exports });
|
|
191
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
|
+
|
|
192
413
|
// src/api-admin.ts
|
|
193
|
-
var apiAdmin = new
|
|
414
|
+
var apiAdmin = new Hono5();
|
|
415
|
+
apiAdmin.route("/scopes", apiAdminScopes);
|
|
416
|
+
apiAdmin.route("/clients", apiAdminClients);
|
|
417
|
+
apiAdmin.route("/tokens", apiAdminTokens);
|
|
418
|
+
apiAdmin.route("/auth-codes", apiAdminAuthCodes);
|
|
194
419
|
apiAdmin.get("/users", async (c) => {
|
|
195
420
|
const result = await db.select().from(users).all();
|
|
196
421
|
return c.json(result);
|
|
197
422
|
});
|
|
198
423
|
apiAdmin.get("/users/:id", async (c) => {
|
|
199
424
|
const id = c.req.param("id");
|
|
200
|
-
const result = await db.select().from(users).where(
|
|
425
|
+
const result = await db.select().from(users).where(eq5(users.id, id)).get();
|
|
201
426
|
if (!result) {
|
|
202
427
|
return c.json({ error: "User not found" }, 404);
|
|
203
428
|
}
|
|
204
429
|
return c.json(result);
|
|
205
430
|
});
|
|
206
|
-
apiAdmin.post("/users",
|
|
431
|
+
apiAdmin.post("/users", zValidator3("json", insertUserSchema), async (c) => {
|
|
207
432
|
const body = c.req.valid("json");
|
|
208
433
|
try {
|
|
209
434
|
const result = await db.insert(users).values(body).returning().get();
|
|
210
435
|
return c.json(result, 201);
|
|
211
436
|
} catch (err) {
|
|
212
|
-
if (err instanceof Error) {
|
|
213
|
-
|
|
214
|
-
return c.json({ error: "User already exists" }, 409);
|
|
215
|
-
}
|
|
437
|
+
if (err instanceof Error && err.message?.includes("UNIQUE constraint failed")) {
|
|
438
|
+
return c.json({ error: "User already exists" }, 409);
|
|
216
439
|
}
|
|
217
440
|
return c.json({ error: "Failed to create user" }, 500);
|
|
218
441
|
}
|
|
219
442
|
});
|
|
220
443
|
apiAdmin.delete("/users/:id", async (c) => {
|
|
221
444
|
const id = c.req.param("id");
|
|
222
|
-
const result = await db.delete(users).where(
|
|
445
|
+
const result = await db.delete(users).where(eq5(users.id, id)).returning().get();
|
|
223
446
|
if (!result) {
|
|
224
447
|
return c.json({ error: "User not found" }, 404);
|
|
225
448
|
}
|
|
@@ -228,7 +451,7 @@ apiAdmin.delete("/users/:id", async (c) => {
|
|
|
228
451
|
|
|
229
452
|
// src/api.ts
|
|
230
453
|
function startServer(port = 3e3, options = {}) {
|
|
231
|
-
const app = new
|
|
454
|
+
const app = new Hono6();
|
|
232
455
|
app.get("/", (c) => {
|
|
233
456
|
return c.text("Hello Hono!");
|
|
234
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/auth-codes.ts","../src/db/schema/clients.ts","../src/db/schema/scopes.ts","../src/db/schema/tokens.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: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 { 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 './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'\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","import { sql } from 'drizzle-orm'\nimport { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'\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","import { sql } from 'drizzle-orm'\nimport { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'\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","import { sql } from 'drizzle-orm'\nimport { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'\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","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"],"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,kBAAkB;AAC3B,SAAS,UAAU;AACnB,SAAS,YAAY;;;ACFrB,SAAS,oBAAoB;AAC7B,SAAS,eAAe;;;ACDxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAS,WAAW;AACpB,SAAS,SAAS,aAAa,YAAY;AAEpC,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;;;ACnBD,SAAS,OAAAC,YAAW;AACpB,SAAS,WAAAC,UAAS,eAAAC,cAAa,QAAAC,aAAY;AAEpC,IAAM,UAAUD,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;;;ACjBD,SAAS,OAAAI,YAAW;AACpB,SAAS,WAAAC,UAAS,eAAAC,cAAa,QAAAC,aAAY;AAEpC,IAAM,SAASD,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;;;ACdD,SAAS,OAAAI,YAAW;AACpB,SAAS,WAAAC,UAAS,eAAAC,cAAa,QAAAC,aAAY;AAEpC,IAAM,SAASD,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;;;ACvBD,SAAS,OAAAC,YAAW;AACpB,SAAS,WAAAC,UAAS,eAAAC,cAAa,QAAAC,aAAY;AAC3C,SAAS,oBAAoB,0BAA0B;AAEhD,IAAM,QAAQD,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,mBAAmB,mBAAmB,KAAK;AACjD,IAAM,mBAAmB,mBAAmB,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;;;ADHrC,IAAM,WAAW,IAAI,KAAK;AAGjC,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,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC,EAAE,IAAI;AAEzE,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,KAAK,EAAE,OAAO,iBAAiB,GAAG,GAAG;AAAA,EAChD;AAEA,SAAO,EAAE,KAAK,MAAM;AACtB,CAAC;AAGD,SAAS,KAAK,UAAU,WAAW,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,OAAO;AACxB,UAAI,IAAI,SAAS,SAAS,0BAA0B,GAAG;AACrD,eAAO,EAAE,KAAK,EAAE,OAAO,sBAAsB,GAAG,GAAG;AAAA,MACrD;AAAA,IACF;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;AAE3B,QAAM,SAAS,MAAM,GAAG,OAAO,KAAK,EAAE,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI;AAE9E,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,KAAK,EAAE,OAAO,iBAAiB,GAAG,GAAG;AAAA,EAChD;AAEA,SAAO,EAAE,KAAK,EAAE,SAAS,eAAe,CAAC;AAC3C,CAAC;;;ADpDM,SAAS,YAAY,OAAe,KAAM,UAAqC,CAAC,GAAG;AACxF,QAAM,MAAM,IAAII,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","sql","integer","sqliteTable","text","sql","integer","sqliteTable","text","sql","integer","sqliteTable","text","sql","integer","sqliteTable","text","Hono"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../package.json","../src/api.ts","../src/api-admin.ts","../src/api-admin-auth-codes.ts","../src/db/index.ts","../src/db/schema/index.ts","../src/db/schema/auth-codes.ts","../src/db/schema/clients.ts","../src/db/schema/scopes.ts","../src/db/schema/tokens.ts","../src/db/schema/users.ts","../src/api-admin-clients.ts","../src/utils.ts","../src/api-admin-scopes.ts","../src/api-admin-tokens.ts"],"sourcesContent":["#!/usr/bin/env bun\nimport { Command } from 'commander'\nimport packageJson from '../package.json' with { type: 'json' }\nimport { startServer } from './api.ts'\n\nconst program = new Command()\n\nprogram.name(packageJson.name).description(packageJson.description).version(packageJson.version)\n\nprogram\n .command('start')\n .description('Start the API server')\n .option('--admin', 'Enable admin API endpoints', false)\n .option('-p, --port <number>', 'Port to run the server on', '3000')\n .action((options) => {\n const { app, port } = startServer(parseInt(options.port, 10), {\n enableAdmin: options.admin,\n })\n\n Bun.serve({ fetch: app.fetch, port })\n })\n\nprogram.parse(process.argv)\n","{\n \"bin\": {\n \"solana-auth-oauth2-server\": \"dist/cli.js\"\n },\n \"dependencies\": {\n \"@hono/zod-validator\": \"^0.7.6\",\n \"@libsql/client\": \"^0.17.0\",\n \"commander\": \"^14.0.2\",\n \"drizzle-orm\": \"^0.45.1\",\n \"drizzle-zod\": \"^0.8.3\",\n \"hono\": \"^4.11.5\",\n \"libsql\": \"^0.5.22\",\n \"zod\": \"^4.3.6\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"^2.3.11\",\n \"@changesets/cli\": \"^2.29.8\",\n \"@types/bun\": \"latest\",\n \"drizzle-kit\": \"^0.31.8\",\n \"pkg-pr-new\": \"^0.0.62\",\n \"publint\": \"^0.3.16\",\n \"tsup\": \"^8.5.1\"\n },\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n }\n },\n \"files\": [\"dist\"],\n \"license\": \"MIT\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"name\": \"solana-auth-oauth2-server\",\n \"description\": \"Solana Auth OAuth2 Server\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/solana-auth/solana-auth-oauth2-server.git\"\n },\n \"peerDependencies\": {\n \"typescript\": \"^5\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"changeset\": \"changeset\",\n \"check-types\": \"tsc -b --noEmit\",\n \"db:generate\": \"drizzle-kit generate\",\n \"db:migrate\": \"drizzle-kit migrate\",\n \"db:push\": \"drizzle-kit push\",\n \"db:seed\": \"bun src/seed.ts\",\n \"db:seed:oauth\": \"bun scripts/seed-oauth.ts\",\n \"db:studio\": \"drizzle-kit studio\",\n \"lint\": \"biome check --error-on-warnings\",\n \"lint:fix\": \"biome check --error-on-warnings --write\",\n \"release\": \"changeset publish\",\n \"test\": \"bun test ./test/\",\n \"test:watch\": \"bun test --watch ./test/\",\n \"version\": \"changeset version && bun lint:fix\"\n },\n \"type\": \"module\",\n \"types\": \"./dist/index.d.ts\",\n \"version\": \"0.0.0\"\n}\n","import { Hono } from 'hono'\nimport { apiAdmin } from './api-admin.ts'\n\nexport function startServer(port: number = 3000, options: { enableAdmin?: boolean } = {}) {\n const app = new Hono()\n\n app.get('/', (c) => {\n return c.text('Hello Hono!')\n })\n\n if (options.enableAdmin) {\n app.route('/admin', apiAdmin)\n console.log('Admin API enabled at /admin')\n }\n\n console.log(`Server is running on port ${port}`)\n\n return {\n app,\n port,\n }\n}\n","import { zValidator } from '@hono/zod-validator'\nimport { eq } from 'drizzle-orm'\nimport { Hono } from 'hono'\nimport { apiAdminAuthCodes } from './api-admin-auth-codes.ts'\nimport { apiAdminClients } from './api-admin-clients.ts'\nimport { apiAdminScopes } from './api-admin-scopes.ts'\nimport { apiAdminTokens } from './api-admin-tokens.ts'\nimport { db } from './db/index.ts'\nimport { insertUserSchema, users } from './db/schema/index.ts'\n\nexport const apiAdmin = new Hono()\n\n// Mount sub-routers\napiAdmin.route('/scopes', apiAdminScopes)\napiAdmin.route('/clients', apiAdminClients)\napiAdmin.route('/tokens', apiAdminTokens)\napiAdmin.route('/auth-codes', apiAdminAuthCodes)\n\n// List users\napiAdmin.get('/users', async (c) => {\n const result = await db.select().from(users).all()\n return c.json(result)\n})\n\n// Get user by ID\napiAdmin.get('/users/:id', async (c) => {\n const id = c.req.param('id')\n const result = await db.select().from(users).where(eq(users.id, id)).get()\n if (!result) {\n return c.json({ error: 'User not found' }, 404)\n }\n return c.json(result)\n})\n\n// Create user\napiAdmin.post('/users', zValidator('json', insertUserSchema), async (c) => {\n const body = c.req.valid('json')\n\n try {\n const result = await db.insert(users).values(body).returning().get()\n\n return c.json(result, 201)\n } catch (err) {\n if (err instanceof Error && err.message?.includes('UNIQUE constraint failed')) {\n return c.json({ error: 'User already exists' }, 409)\n }\n return c.json({ error: 'Failed to create user' }, 500)\n }\n})\n\n// Delete user\napiAdmin.delete('/users/:id', async (c) => {\n const id = c.req.param('id')\n const result = await db.delete(users).where(eq(users.id, id)).returning().get()\n if (!result) {\n return c.json({ error: 'User not found' }, 404)\n }\n return c.json({ message: 'User deleted' })\n})\n","import { eq } from 'drizzle-orm'\nimport { Hono } from 'hono'\nimport { db } from './db/index.ts'\nimport { authCodes } from './db/schema/index.ts'\n\nexport const apiAdminAuthCodes = new Hono()\n\napiAdminAuthCodes.get('/', async (c) => {\n const result = await db.select().from(authCodes).all()\n return c.json(result)\n})\n\napiAdminAuthCodes.get('/:code', async (c) => {\n const code = c.req.param('code')\n const result = await db.select().from(authCodes).where(eq(authCodes.code, code)).get()\n if (!result) {\n return c.json({ error: 'Auth code not found' }, 404)\n }\n return c.json(result)\n})\n\napiAdminAuthCodes.delete('/:code', async (c) => {\n const code = c.req.param('code')\n const result = await db.delete(authCodes).where(eq(authCodes.code, code)).returning().get()\n if (!result) {\n return c.json({ error: 'Auth code not found' }, 404)\n }\n return c.json({ message: 'Auth code deleted' })\n})\n\napiAdminAuthCodes.post('/:code/revoke', async (c) => {\n const code = c.req.param('code')\n const result = await db\n .update(authCodes)\n .set({ expiresAt: new Date(0) })\n .where(eq(authCodes.code, code))\n .returning()\n .get()\n if (!result) {\n return c.json({ error: 'Auth code not found' }, 404)\n }\n return c.json({ message: 'Auth code revoked' })\n})\n","import { createClient } from '@libsql/client'\nimport { drizzle } from 'drizzle-orm/libsql'\nimport * as schema from './schema/index.ts'\n\nconst client = createClient({\n authToken: process.env.DATABASE_AUTH_TOKEN,\n url: process.env.DATABASE_URL || 'file:local.db',\n})\n\nexport const db = drizzle(client, { schema })\n","export * from './auth-codes.ts'\nexport * from './clients.ts'\nexport * from './scopes.ts'\nexport * from './tokens.ts'\nexport * from './users.ts'\n","import { sql } from 'drizzle-orm'\nimport { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'\nimport { createInsertSchema, createSelectSchema } from 'drizzle-zod'\n\nexport const authCodes = sqliteTable('auth_codes', {\n clientId: text('client_id').notNull(),\n code: text('code').primaryKey(),\n codeChallenge: text('code_challenge'),\n codeChallengeMethod: text('code_challenge_method').$type<'S256' | 'plain'>(),\n createdAt: integer('created_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .notNull(),\n expiresAt: integer('expires_at', { mode: 'timestamp_ms' }).notNull(),\n redirectUri: text('redirect_uri'),\n scopeIds: text('scope_ids', { mode: 'json' }).$type<string[]>().notNull().default([]),\n updatedAt: integer('updated_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .$onUpdate(() => new Date())\n .notNull(),\n userId: text('user_id'),\n})\n\nexport const insertAuthCodeSchema = createInsertSchema(authCodes)\nexport const selectAuthCodeSchema = createSelectSchema(authCodes)\n","import { sql } from 'drizzle-orm'\nimport { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'\nimport { createInsertSchema, createSelectSchema } from 'drizzle-zod'\n\nexport const clients = sqliteTable('clients', {\n allowedGrants: text('allowed_grants', { mode: 'json' }).$type<string[]>().notNull().default([]),\n createdAt: integer('created_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .notNull(),\n id: text('id').primaryKey(),\n name: text('name').notNull(),\n redirectUris: text('redirect_uris', { mode: 'json' }).$type<string[]>().notNull().default([]),\n scopeIds: text('scope_ids', { mode: 'json' }).$type<string[]>().notNull().default([]),\n secret: text('secret'),\n updatedAt: integer('updated_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .$onUpdate(() => new Date())\n .notNull(),\n})\n\nexport const insertClientSchema = createInsertSchema(clients)\nexport const selectClientSchema = createSelectSchema(clients)\n","import { sql } from 'drizzle-orm'\nimport { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'\nimport { createInsertSchema, createSelectSchema } from 'drizzle-zod'\n\nexport const scopes = sqliteTable('scopes', {\n createdAt: integer('created_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .notNull(),\n description: text('description'),\n id: text('id').primaryKey(),\n name: text('name').notNull().unique(),\n updatedAt: integer('updated_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .$onUpdate(() => new Date())\n .notNull(),\n})\n\nexport const insertScopeSchema = createInsertSchema(scopes)\nexport const selectScopeSchema = createSelectSchema(scopes)\n","import { sql } from 'drizzle-orm'\nimport { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'\nimport { createInsertSchema, createSelectSchema } from 'drizzle-zod'\n\nexport const tokens = sqliteTable('tokens', {\n accessToken: text('access_token').primaryKey(),\n accessTokenExpiresAt: integer('access_token_expires_at', {\n mode: 'timestamp_ms',\n }).notNull(),\n clientId: text('client_id').notNull(),\n createdAt: integer('created_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .notNull(),\n originatingAuthCodeId: text('originating_auth_code_id'),\n refreshToken: text('refresh_token').unique(),\n refreshTokenExpiresAt: integer('refresh_token_expires_at', {\n mode: 'timestamp_ms',\n }),\n scopeIds: text('scope_ids', { mode: 'json' }).$type<string[]>().notNull().default([]),\n updatedAt: integer('updated_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .$onUpdate(() => new Date())\n .notNull(),\n userId: text('user_id'),\n})\n\nexport const insertTokenSchema = createInsertSchema(tokens)\nexport const selectTokenSchema = createSelectSchema(tokens)\n","import { sql } from 'drizzle-orm'\nimport { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'\nimport { createInsertSchema, createSelectSchema } from 'drizzle-zod'\n\nexport const users = sqliteTable('users', {\n createdAt: integer('created_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .notNull(),\n email: text('email').notNull().unique(),\n id: text('id').primaryKey(),\n lastLoginAt: integer('last_login_at', { mode: 'timestamp_ms' }),\n name: text('name').notNull(),\n passwordHash: text('password_hash'),\n role: text('role').default('user').notNull(),\n tokenVersion: integer('token_version').default(0).notNull(),\n updatedAt: integer('updated_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .$onUpdate(() => new Date())\n .notNull(),\n})\n\nexport const insertUserSchema = createInsertSchema(users)\nexport const selectUserSchema = createSelectSchema(users)\n","import { zValidator } from '@hono/zod-validator'\nimport { eq } from 'drizzle-orm'\nimport { Hono } from 'hono'\nimport { db } from './db/index.ts'\nimport { clients, insertClientSchema } from './db/schema/index.ts'\nimport { generateRandomToken } from './utils.ts'\n\nexport const apiAdminClients = new Hono()\n\napiAdminClients.get('/', async (c) => {\n const result = await db.select().from(clients).all()\n return c.json(result)\n})\n\napiAdminClients.get('/:id', async (c) => {\n const id = c.req.param('id')\n const result = await db.select().from(clients).where(eq(clients.id, id)).get()\n if (!result) {\n return c.json({ error: 'Client not found' }, 404)\n }\n return c.json(result)\n})\n\napiAdminClients.post('/', zValidator('json', insertClientSchema), async (c) => {\n const body = c.req.valid('json')\n\n try {\n const result = await db\n .insert(clients)\n .values({\n allowedGrants: body.allowedGrants ?? ['authorization_code', 'refresh_token'],\n id: body.id,\n name: body.name,\n redirectUris: body.redirectUris ?? [],\n scopeIds: body.scopeIds ?? [],\n secret: body.secret ?? generateRandomToken(),\n })\n .returning()\n .get()\n return c.json(result, 201)\n } catch (err) {\n if (err instanceof Error && err.message?.includes('UNIQUE constraint failed')) {\n return c.json({ error: 'Client already exists' }, 409)\n }\n return c.json({ error: 'Failed to create client' }, 500)\n }\n})\n\napiAdminClients.put(\n '/:id',\n zValidator(\n 'json',\n insertClientSchema\n .pick({\n allowedGrants: true,\n name: true,\n redirectUris: true,\n scopeIds: true,\n secret: true,\n })\n .partial(),\n ),\n async (c) => {\n const id = c.req.param('id')\n const body = c.req.valid('json')\n const result = await db.update(clients).set(body).where(eq(clients.id, id)).returning().get()\n if (!result) {\n return c.json({ error: 'Client not found' }, 404)\n }\n return c.json(result)\n },\n)\n\napiAdminClients.delete('/:id', async (c) => {\n const id = c.req.param('id')\n const result = await db.delete(clients).where(eq(clients.id, id)).returning().get()\n if (!result) {\n return c.json({ error: 'Client not found' }, 404)\n }\n return c.json({ message: 'Client deleted' })\n})\n","import { randomBytes } from 'node:crypto'\n\nexport function generateRandomToken(length = 32): string {\n return randomBytes(length).toString('hex')\n}\n","import { zValidator } from '@hono/zod-validator'\nimport { eq } from 'drizzle-orm'\nimport { Hono } from 'hono'\nimport { db } from './db/index.ts'\nimport { insertScopeSchema, scopes } from './db/schema/index.ts'\n\nexport const apiAdminScopes = new Hono()\n\napiAdminScopes.get('/', async (c) => {\n const result = await db.select().from(scopes).all()\n return c.json(result)\n})\n\napiAdminScopes.get('/:id', async (c) => {\n const id = c.req.param('id')\n const result = await db.select().from(scopes).where(eq(scopes.id, id)).get()\n if (!result) {\n return c.json({ error: 'Scope not found' }, 404)\n }\n return c.json(result)\n})\n\napiAdminScopes.post('/', zValidator('json', insertScopeSchema), async (c) => {\n const body = c.req.valid('json')\n\n try {\n const result = await db\n .insert(scopes)\n .values({\n description: body.description ?? null,\n id: body.id,\n name: body.name,\n })\n .returning()\n .get()\n return c.json(result, 201)\n } catch (err) {\n if (err instanceof Error && err.message?.includes('UNIQUE constraint failed')) {\n return c.json({ error: 'Scope already exists' }, 409)\n }\n return c.json({ error: 'Failed to create scope' }, 500)\n }\n})\n\napiAdminScopes.put(\n '/:id',\n zValidator('json', insertScopeSchema.pick({ description: true, name: true }).partial()),\n async (c) => {\n const id = c.req.param('id')\n const body = c.req.valid('json')\n const result = await db\n .update(scopes)\n .set({ description: body.description, name: body.name })\n .where(eq(scopes.id, id))\n .returning()\n .get()\n if (!result) {\n return c.json({ error: 'Scope not found' }, 404)\n }\n return c.json(result)\n },\n)\n\napiAdminScopes.delete('/:id', async (c) => {\n const id = c.req.param('id')\n const result = await db.delete(scopes).where(eq(scopes.id, id)).returning().get()\n if (!result) {\n return c.json({ error: 'Scope not found' }, 404)\n }\n return c.json({ message: 'Scope deleted' })\n})\n","import { eq } from 'drizzle-orm'\nimport { Hono } from 'hono'\nimport { db } from './db/index.ts'\nimport { tokens } from './db/schema/index.ts'\n\nexport const apiAdminTokens = new Hono()\n\napiAdminTokens.get('/', async (c) => {\n const result = await db.select().from(tokens).all()\n return c.json(result)\n})\n\napiAdminTokens.get('/:accessToken', async (c) => {\n const accessToken = c.req.param('accessToken')\n const result = await db.select().from(tokens).where(eq(tokens.accessToken, accessToken)).get()\n if (!result) {\n return c.json({ error: 'Token not found' }, 404)\n }\n return c.json(result)\n})\n\napiAdminTokens.delete('/:accessToken', async (c) => {\n const accessToken = c.req.param('accessToken')\n const result = await db.delete(tokens).where(eq(tokens.accessToken, accessToken)).returning().get()\n if (!result) {\n return c.json({ error: 'Token not found' }, 404)\n }\n return c.json({ message: 'Token deleted' })\n})\n\napiAdminTokens.post('/:accessToken/revoke', async (c) => {\n const accessToken = c.req.param('accessToken')\n const result = await db\n .update(tokens)\n .set({\n accessTokenExpiresAt: new Date(0),\n refreshTokenExpiresAt: new Date(0),\n })\n .where(eq(tokens.accessToken, accessToken))\n .returning()\n .get()\n if (!result) {\n return c.json({ error: 'Token not found' }, 404)\n }\n return c.json({ message: 'Token revoked' })\n})\n"],"mappings":"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","names":["Hono","zValidator","eq","Hono","sql","integer","sqliteTable","text","createInsertSchema","createSelectSchema","sql","integer","sqliteTable","text","createInsertSchema","createSelectSchema","sql","integer","sqliteTable","text","createInsertSchema","createSelectSchema","sql","integer","sqliteTable","text","createInsertSchema","createSelectSchema","eq","Hono","Hono","eq","zValidator","eq","Hono","Hono","eq","zValidator","eq","Hono","Hono","eq","Hono","eq","zValidator","Hono"]}
|
package/package.json
CHANGED