solana-auth-oauth2-server 0.1.0-canary-20260125211037 → 0.1.0-canary-20260125213759

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.cjs CHANGED
@@ -66,6 +66,7 @@ var package_default = {
66
66
  "db:migrate": "drizzle-kit migrate",
67
67
  "db:push": "drizzle-kit push",
68
68
  "db:seed": "bun src/seed.ts",
69
+ "db:seed:oauth": "bun scripts/seed-oauth.ts",
69
70
  "db:studio": "drizzle-kit studio",
70
71
  lint: "biome check --error-on-warnings",
71
72
  "lint:fix": "biome check --error-on-warnings --write",
@@ -84,7 +85,7 @@ var import_hono2 = require("hono");
84
85
 
85
86
  // src/api-admin.ts
86
87
  var import_zod_validator = require("@hono/zod-validator");
87
- var import_drizzle_orm2 = require("drizzle-orm");
88
+ var import_drizzle_orm6 = require("drizzle-orm");
88
89
  var import_hono = require("hono");
89
90
 
90
91
  // src/db/index.ts
@@ -94,21 +95,90 @@ var import_libsql = require("drizzle-orm/libsql");
94
95
  // src/db/schema/index.ts
95
96
  var schema_exports = {};
96
97
  __export(schema_exports, {
98
+ authCodes: () => authCodes,
99
+ clients: () => clients,
97
100
  insertUserSchema: () => insertUserSchema,
101
+ scopes: () => scopes,
98
102
  selectUserSchema: () => selectUserSchema,
103
+ tokens: () => tokens,
99
104
  users: () => users
100
105
  });
101
106
 
102
- // src/db/schema/users.ts
107
+ // src/db/schema/auth-codes.ts
103
108
  var import_drizzle_orm = require("drizzle-orm");
104
109
  var import_sqlite_core = require("drizzle-orm/sqlite-core");
105
- var import_drizzle_zod = require("drizzle-zod");
106
- var users = (0, import_sqlite_core.sqliteTable)("users", {
110
+ var authCodes = (0, import_sqlite_core.sqliteTable)("auth_codes", {
111
+ clientId: (0, import_sqlite_core.text)("client_id").notNull(),
112
+ code: (0, import_sqlite_core.text)("code").primaryKey(),
113
+ codeChallenge: (0, import_sqlite_core.text)("code_challenge"),
114
+ codeChallengeMethod: (0, import_sqlite_core.text)("code_challenge_method").$type(),
107
115
  createdAt: (0, import_sqlite_core.integer)("created_at", { mode: "timestamp_ms" }).default(import_drizzle_orm.sql`(cast(unixepoch('subsecond') * 1000 as integer))`).notNull(),
108
- email: (0, import_sqlite_core.text)("email").notNull().unique(),
109
- id: (0, import_sqlite_core.text)("id").primaryKey(),
110
- name: (0, import_sqlite_core.text)("name").notNull(),
111
- updatedAt: (0, import_sqlite_core.integer)("updated_at", { mode: "timestamp_ms" }).default(import_drizzle_orm.sql`(cast(unixepoch('subsecond') * 1000 as integer))`).$onUpdate(() => /* @__PURE__ */ new Date()).notNull()
116
+ expiresAt: (0, import_sqlite_core.integer)("expires_at", { mode: "timestamp_ms" }).notNull(),
117
+ redirectUri: (0, import_sqlite_core.text)("redirect_uri"),
118
+ scopeIds: (0, import_sqlite_core.text)("scope_ids", { mode: "json" }).$type().notNull().default([]),
119
+ 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
+ userId: (0, import_sqlite_core.text)("user_id")
121
+ });
122
+
123
+ // src/db/schema/clients.ts
124
+ var import_drizzle_orm2 = require("drizzle-orm");
125
+ var import_sqlite_core2 = require("drizzle-orm/sqlite-core");
126
+ var clients = (0, import_sqlite_core2.sqliteTable)("clients", {
127
+ allowedGrants: (0, import_sqlite_core2.text)("allowed_grants", { mode: "json" }).$type().notNull().default([]),
128
+ createdAt: (0, import_sqlite_core2.integer)("created_at", { mode: "timestamp_ms" }).default(import_drizzle_orm2.sql`(cast(unixepoch('subsecond') * 1000 as integer))`).notNull(),
129
+ id: (0, import_sqlite_core2.text)("id").primaryKey(),
130
+ name: (0, import_sqlite_core2.text)("name").notNull(),
131
+ redirectUris: (0, import_sqlite_core2.text)("redirect_uris", { mode: "json" }).$type().notNull().default([]),
132
+ scopeIds: (0, import_sqlite_core2.text)("scope_ids", { mode: "json" }).$type().notNull().default([]),
133
+ secret: (0, import_sqlite_core2.text)("secret"),
134
+ 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
+ });
136
+
137
+ // src/db/schema/scopes.ts
138
+ var import_drizzle_orm3 = require("drizzle-orm");
139
+ var import_sqlite_core3 = require("drizzle-orm/sqlite-core");
140
+ var scopes = (0, import_sqlite_core3.sqliteTable)("scopes", {
141
+ createdAt: (0, import_sqlite_core3.integer)("created_at", { mode: "timestamp_ms" }).default(import_drizzle_orm3.sql`(cast(unixepoch('subsecond') * 1000 as integer))`).notNull(),
142
+ description: (0, import_sqlite_core3.text)("description"),
143
+ id: (0, import_sqlite_core3.text)("id").primaryKey(),
144
+ name: (0, import_sqlite_core3.text)("name").notNull().unique(),
145
+ 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
+ });
147
+
148
+ // src/db/schema/tokens.ts
149
+ var import_drizzle_orm4 = require("drizzle-orm");
150
+ var import_sqlite_core4 = require("drizzle-orm/sqlite-core");
151
+ var tokens = (0, import_sqlite_core4.sqliteTable)("tokens", {
152
+ accessToken: (0, import_sqlite_core4.text)("access_token").primaryKey(),
153
+ accessTokenExpiresAt: (0, import_sqlite_core4.integer)("access_token_expires_at", {
154
+ mode: "timestamp_ms"
155
+ }).notNull(),
156
+ clientId: (0, import_sqlite_core4.text)("client_id").notNull(),
157
+ createdAt: (0, import_sqlite_core4.integer)("created_at", { mode: "timestamp_ms" }).default(import_drizzle_orm4.sql`(cast(unixepoch('subsecond') * 1000 as integer))`).notNull(),
158
+ originatingAuthCodeId: (0, import_sqlite_core4.text)("originating_auth_code_id"),
159
+ refreshToken: (0, import_sqlite_core4.text)("refresh_token").unique(),
160
+ refreshTokenExpiresAt: (0, import_sqlite_core4.integer)("refresh_token_expires_at", {
161
+ mode: "timestamp_ms"
162
+ }),
163
+ scopeIds: (0, import_sqlite_core4.text)("scope_ids", { mode: "json" }).$type().notNull().default([]),
164
+ 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
+ userId: (0, import_sqlite_core4.text)("user_id")
166
+ });
167
+
168
+ // src/db/schema/users.ts
169
+ var import_drizzle_orm5 = require("drizzle-orm");
170
+ var import_sqlite_core5 = require("drizzle-orm/sqlite-core");
171
+ var import_drizzle_zod = require("drizzle-zod");
172
+ var users = (0, import_sqlite_core5.sqliteTable)("users", {
173
+ createdAt: (0, import_sqlite_core5.integer)("created_at", { mode: "timestamp_ms" }).default(import_drizzle_orm5.sql`(cast(unixepoch('subsecond') * 1000 as integer))`).notNull(),
174
+ email: (0, import_sqlite_core5.text)("email").notNull().unique(),
175
+ id: (0, import_sqlite_core5.text)("id").primaryKey(),
176
+ lastLoginAt: (0, import_sqlite_core5.integer)("last_login_at", { mode: "timestamp_ms" }),
177
+ name: (0, import_sqlite_core5.text)("name").notNull(),
178
+ passwordHash: (0, import_sqlite_core5.text)("password_hash"),
179
+ role: (0, import_sqlite_core5.text)("role").default("user").notNull(),
180
+ tokenVersion: (0, import_sqlite_core5.integer)("token_version").default(0).notNull(),
181
+ 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()
112
182
  });
113
183
  var insertUserSchema = (0, import_drizzle_zod.createInsertSchema)(users);
114
184
  var selectUserSchema = (0, import_drizzle_zod.createSelectSchema)(users);
@@ -128,7 +198,7 @@ apiAdmin.get("/users", async (c) => {
128
198
  });
129
199
  apiAdmin.get("/users/:id", async (c) => {
130
200
  const id = c.req.param("id");
131
- const result = await db.select().from(users).where((0, import_drizzle_orm2.eq)(users.id, id)).get();
201
+ const result = await db.select().from(users).where((0, import_drizzle_orm6.eq)(users.id, id)).get();
132
202
  if (!result) {
133
203
  return c.json({ error: "User not found" }, 404);
134
204
  }
@@ -150,7 +220,7 @@ apiAdmin.post("/users", (0, import_zod_validator.zValidator)("json", insertUserS
150
220
  });
151
221
  apiAdmin.delete("/users/:id", async (c) => {
152
222
  const id = c.req.param("id");
153
- const result = await db.delete(users).where((0, import_drizzle_orm2.eq)(users.id, id)).returning().get();
223
+ const result = await db.delete(users).where((0, import_drizzle_orm6.eq)(users.id, id)).returning().get();
154
224
  if (!result) {
155
225
  return c.json({ error: "User not found" }, 404);
156
226
  }
package/dist/cli.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../package.json","../src/api.ts","../src/api-admin.ts","../src/db/index.ts","../src/db/schema/index.ts","../src/db/schema/users.ts"],"sourcesContent":["#!/usr/bin/env bun\nimport { Command } from 'commander'\nimport packageJson from '../package.json' with { type: 'json' }\nimport { startServer } from './api.ts'\n\nconst program = new Command()\n\nprogram.name(packageJson.name).description(packageJson.description).version(packageJson.version)\n\nprogram\n .command('start')\n .description('Start the API server')\n .option('--admin', 'Enable admin API endpoints', false)\n .option('-p, --port <number>', 'Port to run the server on', '3000')\n .action((options) => {\n const { app, port } = startServer(parseInt(options.port, 10), {\n enableAdmin: options.admin,\n })\n\n Bun.serve({ fetch: app.fetch, port })\n })\n\nprogram.parse(process.argv)\n","{\n \"bin\": {\n \"solana-auth-oauth2-server\": \"dist/cli.js\"\n },\n \"dependencies\": {\n \"@hono/zod-validator\": \"^0.7.6\",\n \"@libsql/client\": \"^0.17.0\",\n \"commander\": \"^14.0.2\",\n \"drizzle-orm\": \"^0.45.1\",\n \"drizzle-zod\": \"^0.8.3\",\n \"hono\": \"^4.11.5\",\n \"libsql\": \"^0.5.22\",\n \"zod\": \"^4.3.6\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"^2.3.11\",\n \"@changesets/cli\": \"^2.29.8\",\n \"@types/bun\": \"latest\",\n \"drizzle-kit\": \"^0.31.8\",\n \"pkg-pr-new\": \"^0.0.62\",\n \"publint\": \"^0.3.16\",\n \"tsup\": \"^8.5.1\"\n },\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n }\n },\n \"files\": [\"dist\"],\n \"license\": \"MIT\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"name\": \"solana-auth-oauth2-server\",\n \"description\": \"Solana Auth OAuth2 Server\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/solana-auth/solana-auth-oauth2-server.git\"\n },\n \"peerDependencies\": {\n \"typescript\": \"^5\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"changeset\": \"changeset\",\n \"check-types\": \"tsc -b --noEmit\",\n \"db:generate\": \"drizzle-kit generate\",\n \"db:migrate\": \"drizzle-kit migrate\",\n \"db:push\": \"drizzle-kit push\",\n \"db:seed\": \"bun src/seed.ts\",\n \"db:studio\": \"drizzle-kit studio\",\n \"lint\": \"biome check --error-on-warnings\",\n \"lint:fix\": \"biome check --error-on-warnings --write\",\n \"release\": \"changeset publish\",\n \"test\": \"bun test ./test/\",\n \"test:watch\": \"bun test --watch ./test/\",\n \"version\": \"changeset version && bun lint:fix\"\n },\n \"type\": \"module\",\n \"types\": \"./dist/index.d.ts\",\n \"version\": \"0.0.0\"\n}\n","import { Hono } from 'hono'\nimport { apiAdmin } from './api-admin.ts'\n\nexport function startServer(port: number = 3000, options: { enableAdmin?: boolean } = {}) {\n const app = new Hono()\n\n app.get('/', (c) => {\n return c.text('Hello Hono!')\n })\n\n if (options.enableAdmin) {\n app.route('/admin', apiAdmin)\n console.log('Admin API enabled at /admin')\n }\n\n console.log(`Server is running on port ${port}`)\n\n return {\n app,\n port,\n }\n}\n","import { zValidator } from '@hono/zod-validator'\nimport { eq } from 'drizzle-orm'\nimport { Hono } from 'hono'\nimport { db } from './db/index.ts'\nimport { insertUserSchema, users } from './db/schema/index.ts'\n\nexport const apiAdmin = new Hono()\n\n// List users\napiAdmin.get('/users', async (c) => {\n const result = await db.select().from(users).all()\n return c.json(result)\n})\n\n// Get user by ID\napiAdmin.get('/users/:id', async (c) => {\n const id = c.req.param('id')\n const result = await db.select().from(users).where(eq(users.id, id)).get()\n\n if (!result) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n return c.json(result)\n})\n\n// Create user\napiAdmin.post('/users', zValidator('json', insertUserSchema), async (c) => {\n const body = c.req.valid('json')\n\n try {\n const result = await db.insert(users).values(body).returning().get()\n\n return c.json(result, 201)\n } catch (err) {\n if (err instanceof Error) {\n if (err.message?.includes('UNIQUE constraint failed')) {\n return c.json({ error: 'User already exists' }, 409)\n }\n }\n return c.json({ error: 'Failed to create user' }, 500)\n }\n})\n\n// Delete user\napiAdmin.delete('/users/:id', async (c) => {\n const id = c.req.param('id')\n\n const result = await db.delete(users).where(eq(users.id, id)).returning().get()\n\n if (!result) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n return c.json({ message: 'User deleted' })\n})\n","import { createClient } from '@libsql/client'\nimport { drizzle } from 'drizzle-orm/libsql'\nimport * as schema from './schema/index.ts'\n\nconst client = createClient({\n authToken: process.env.DATABASE_AUTH_TOKEN,\n url: process.env.DATABASE_URL || 'file:local.db',\n})\n\nexport const db = drizzle(client, { schema })\n","export * from './users.ts'\n","import { sql } from 'drizzle-orm'\nimport { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'\nimport { createInsertSchema, createSelectSchema } from 'drizzle-zod'\n\nexport const users = sqliteTable('users', {\n createdAt: integer('created_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .notNull(),\n email: text('email').notNull().unique(),\n id: text('id').primaryKey(),\n name: text('name').notNull(),\n updatedAt: integer('updated_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .$onUpdate(() => new Date())\n .notNull(),\n})\n\nexport const insertUserSchema = createInsertSchema(users)\nexport const selectUserSchema = createSelectSchema(users)\n"],"mappings":"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","names":["import_hono","import_drizzle_orm"]}
1
+ {"version":3,"sources":["../src/cli.ts","../package.json","../src/api.ts","../src/api-admin.ts","../src/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"]}
package/dist/cli.js CHANGED
@@ -65,6 +65,7 @@ var package_default = {
65
65
  "db:migrate": "drizzle-kit migrate",
66
66
  "db:push": "drizzle-kit push",
67
67
  "db:seed": "bun src/seed.ts",
68
+ "db:seed:oauth": "bun scripts/seed-oauth.ts",
68
69
  "db:studio": "drizzle-kit studio",
69
70
  lint: "biome check --error-on-warnings",
70
71
  "lint:fix": "biome check --error-on-warnings --write",
@@ -93,21 +94,90 @@ import { drizzle } from "drizzle-orm/libsql";
93
94
  // src/db/schema/index.ts
94
95
  var schema_exports = {};
95
96
  __export(schema_exports, {
97
+ authCodes: () => authCodes,
98
+ clients: () => clients,
96
99
  insertUserSchema: () => insertUserSchema,
100
+ scopes: () => scopes,
97
101
  selectUserSchema: () => selectUserSchema,
102
+ tokens: () => tokens,
98
103
  users: () => users
99
104
  });
100
105
 
101
- // src/db/schema/users.ts
106
+ // src/db/schema/auth-codes.ts
102
107
  import { sql } from "drizzle-orm";
103
108
  import { integer, sqliteTable, text } from "drizzle-orm/sqlite-core";
104
- import { createInsertSchema, createSelectSchema } from "drizzle-zod";
105
- var users = sqliteTable("users", {
109
+ var authCodes = sqliteTable("auth_codes", {
110
+ clientId: text("client_id").notNull(),
111
+ code: text("code").primaryKey(),
112
+ codeChallenge: text("code_challenge"),
113
+ codeChallengeMethod: text("code_challenge_method").$type(),
106
114
  createdAt: integer("created_at", { mode: "timestamp_ms" }).default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`).notNull(),
107
- email: text("email").notNull().unique(),
108
- id: text("id").primaryKey(),
109
- name: text("name").notNull(),
110
- updatedAt: integer("updated_at", { mode: "timestamp_ms" }).default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`).$onUpdate(() => /* @__PURE__ */ new Date()).notNull()
115
+ expiresAt: integer("expires_at", { mode: "timestamp_ms" }).notNull(),
116
+ redirectUri: text("redirect_uri"),
117
+ scopeIds: text("scope_ids", { mode: "json" }).$type().notNull().default([]),
118
+ updatedAt: integer("updated_at", { mode: "timestamp_ms" }).default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`).$onUpdate(() => /* @__PURE__ */ new Date()).notNull(),
119
+ userId: text("user_id")
120
+ });
121
+
122
+ // src/db/schema/clients.ts
123
+ import { sql as sql2 } from "drizzle-orm";
124
+ import { integer as integer2, sqliteTable as sqliteTable2, text as text2 } from "drizzle-orm/sqlite-core";
125
+ var clients = sqliteTable2("clients", {
126
+ allowedGrants: text2("allowed_grants", { mode: "json" }).$type().notNull().default([]),
127
+ createdAt: integer2("created_at", { mode: "timestamp_ms" }).default(sql2`(cast(unixepoch('subsecond') * 1000 as integer))`).notNull(),
128
+ id: text2("id").primaryKey(),
129
+ name: text2("name").notNull(),
130
+ redirectUris: text2("redirect_uris", { mode: "json" }).$type().notNull().default([]),
131
+ scopeIds: text2("scope_ids", { mode: "json" }).$type().notNull().default([]),
132
+ secret: text2("secret"),
133
+ updatedAt: integer2("updated_at", { mode: "timestamp_ms" }).default(sql2`(cast(unixepoch('subsecond') * 1000 as integer))`).$onUpdate(() => /* @__PURE__ */ new Date()).notNull()
134
+ });
135
+
136
+ // src/db/schema/scopes.ts
137
+ import { sql as sql3 } from "drizzle-orm";
138
+ import { integer as integer3, sqliteTable as sqliteTable3, text as text3 } from "drizzle-orm/sqlite-core";
139
+ var scopes = sqliteTable3("scopes", {
140
+ createdAt: integer3("created_at", { mode: "timestamp_ms" }).default(sql3`(cast(unixepoch('subsecond') * 1000 as integer))`).notNull(),
141
+ description: text3("description"),
142
+ id: text3("id").primaryKey(),
143
+ name: text3("name").notNull().unique(),
144
+ updatedAt: integer3("updated_at", { mode: "timestamp_ms" }).default(sql3`(cast(unixepoch('subsecond') * 1000 as integer))`).$onUpdate(() => /* @__PURE__ */ new Date()).notNull()
145
+ });
146
+
147
+ // src/db/schema/tokens.ts
148
+ import { sql as sql4 } from "drizzle-orm";
149
+ import { integer as integer4, sqliteTable as sqliteTable4, text as text4 } from "drizzle-orm/sqlite-core";
150
+ var tokens = sqliteTable4("tokens", {
151
+ accessToken: text4("access_token").primaryKey(),
152
+ accessTokenExpiresAt: integer4("access_token_expires_at", {
153
+ mode: "timestamp_ms"
154
+ }).notNull(),
155
+ clientId: text4("client_id").notNull(),
156
+ createdAt: integer4("created_at", { mode: "timestamp_ms" }).default(sql4`(cast(unixepoch('subsecond') * 1000 as integer))`).notNull(),
157
+ originatingAuthCodeId: text4("originating_auth_code_id"),
158
+ refreshToken: text4("refresh_token").unique(),
159
+ refreshTokenExpiresAt: integer4("refresh_token_expires_at", {
160
+ mode: "timestamp_ms"
161
+ }),
162
+ scopeIds: text4("scope_ids", { mode: "json" }).$type().notNull().default([]),
163
+ updatedAt: integer4("updated_at", { mode: "timestamp_ms" }).default(sql4`(cast(unixepoch('subsecond') * 1000 as integer))`).$onUpdate(() => /* @__PURE__ */ new Date()).notNull(),
164
+ userId: text4("user_id")
165
+ });
166
+
167
+ // src/db/schema/users.ts
168
+ import { sql as sql5 } from "drizzle-orm";
169
+ import { integer as integer5, sqliteTable as sqliteTable5, text as text5 } from "drizzle-orm/sqlite-core";
170
+ import { createInsertSchema, createSelectSchema } from "drizzle-zod";
171
+ var users = sqliteTable5("users", {
172
+ createdAt: integer5("created_at", { mode: "timestamp_ms" }).default(sql5`(cast(unixepoch('subsecond') * 1000 as integer))`).notNull(),
173
+ email: text5("email").notNull().unique(),
174
+ id: text5("id").primaryKey(),
175
+ lastLoginAt: integer5("last_login_at", { mode: "timestamp_ms" }),
176
+ name: text5("name").notNull(),
177
+ passwordHash: text5("password_hash"),
178
+ role: text5("role").default("user").notNull(),
179
+ tokenVersion: integer5("token_version").default(0).notNull(),
180
+ updatedAt: integer5("updated_at", { mode: "timestamp_ms" }).default(sql5`(cast(unixepoch('subsecond') * 1000 as integer))`).$onUpdate(() => /* @__PURE__ */ new Date()).notNull()
111
181
  });
112
182
  var insertUserSchema = createInsertSchema(users);
113
183
  var selectUserSchema = createSelectSchema(users);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../package.json","../src/api.ts","../src/api-admin.ts","../src/db/index.ts","../src/db/schema/index.ts","../src/db/schema/users.ts"],"sourcesContent":["#!/usr/bin/env bun\nimport { Command } from 'commander'\nimport packageJson from '../package.json' with { type: 'json' }\nimport { startServer } from './api.ts'\n\nconst program = new Command()\n\nprogram.name(packageJson.name).description(packageJson.description).version(packageJson.version)\n\nprogram\n .command('start')\n .description('Start the API server')\n .option('--admin', 'Enable admin API endpoints', false)\n .option('-p, --port <number>', 'Port to run the server on', '3000')\n .action((options) => {\n const { app, port } = startServer(parseInt(options.port, 10), {\n enableAdmin: options.admin,\n })\n\n Bun.serve({ fetch: app.fetch, port })\n })\n\nprogram.parse(process.argv)\n","{\n \"bin\": {\n \"solana-auth-oauth2-server\": \"dist/cli.js\"\n },\n \"dependencies\": {\n \"@hono/zod-validator\": \"^0.7.6\",\n \"@libsql/client\": \"^0.17.0\",\n \"commander\": \"^14.0.2\",\n \"drizzle-orm\": \"^0.45.1\",\n \"drizzle-zod\": \"^0.8.3\",\n \"hono\": \"^4.11.5\",\n \"libsql\": \"^0.5.22\",\n \"zod\": \"^4.3.6\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"^2.3.11\",\n \"@changesets/cli\": \"^2.29.8\",\n \"@types/bun\": \"latest\",\n \"drizzle-kit\": \"^0.31.8\",\n \"pkg-pr-new\": \"^0.0.62\",\n \"publint\": \"^0.3.16\",\n \"tsup\": \"^8.5.1\"\n },\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n }\n },\n \"files\": [\"dist\"],\n \"license\": \"MIT\",\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"name\": \"solana-auth-oauth2-server\",\n \"description\": \"Solana Auth OAuth2 Server\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/solana-auth/solana-auth-oauth2-server.git\"\n },\n \"peerDependencies\": {\n \"typescript\": \"^5\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"changeset\": \"changeset\",\n \"check-types\": \"tsc -b --noEmit\",\n \"db:generate\": \"drizzle-kit generate\",\n \"db:migrate\": \"drizzle-kit migrate\",\n \"db:push\": \"drizzle-kit push\",\n \"db:seed\": \"bun src/seed.ts\",\n \"db:studio\": \"drizzle-kit studio\",\n \"lint\": \"biome check --error-on-warnings\",\n \"lint:fix\": \"biome check --error-on-warnings --write\",\n \"release\": \"changeset publish\",\n \"test\": \"bun test ./test/\",\n \"test:watch\": \"bun test --watch ./test/\",\n \"version\": \"changeset version && bun lint:fix\"\n },\n \"type\": \"module\",\n \"types\": \"./dist/index.d.ts\",\n \"version\": \"0.0.0\"\n}\n","import { Hono } from 'hono'\nimport { apiAdmin } from './api-admin.ts'\n\nexport function startServer(port: number = 3000, options: { enableAdmin?: boolean } = {}) {\n const app = new Hono()\n\n app.get('/', (c) => {\n return c.text('Hello Hono!')\n })\n\n if (options.enableAdmin) {\n app.route('/admin', apiAdmin)\n console.log('Admin API enabled at /admin')\n }\n\n console.log(`Server is running on port ${port}`)\n\n return {\n app,\n port,\n }\n}\n","import { zValidator } from '@hono/zod-validator'\nimport { eq } from 'drizzle-orm'\nimport { Hono } from 'hono'\nimport { db } from './db/index.ts'\nimport { insertUserSchema, users } from './db/schema/index.ts'\n\nexport const apiAdmin = new Hono()\n\n// List users\napiAdmin.get('/users', async (c) => {\n const result = await db.select().from(users).all()\n return c.json(result)\n})\n\n// Get user by ID\napiAdmin.get('/users/:id', async (c) => {\n const id = c.req.param('id')\n const result = await db.select().from(users).where(eq(users.id, id)).get()\n\n if (!result) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n return c.json(result)\n})\n\n// Create user\napiAdmin.post('/users', zValidator('json', insertUserSchema), async (c) => {\n const body = c.req.valid('json')\n\n try {\n const result = await db.insert(users).values(body).returning().get()\n\n return c.json(result, 201)\n } catch (err) {\n if (err instanceof Error) {\n if (err.message?.includes('UNIQUE constraint failed')) {\n return c.json({ error: 'User already exists' }, 409)\n }\n }\n return c.json({ error: 'Failed to create user' }, 500)\n }\n})\n\n// Delete user\napiAdmin.delete('/users/:id', async (c) => {\n const id = c.req.param('id')\n\n const result = await db.delete(users).where(eq(users.id, id)).returning().get()\n\n if (!result) {\n return c.json({ error: 'User not found' }, 404)\n }\n\n return c.json({ message: 'User deleted' })\n})\n","import { createClient } from '@libsql/client'\nimport { drizzle } from 'drizzle-orm/libsql'\nimport * as schema from './schema/index.ts'\n\nconst client = createClient({\n authToken: process.env.DATABASE_AUTH_TOKEN,\n url: process.env.DATABASE_URL || 'file:local.db',\n})\n\nexport const db = drizzle(client, { schema })\n","export * from './users.ts'\n","import { sql } from 'drizzle-orm'\nimport { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'\nimport { createInsertSchema, createSelectSchema } from 'drizzle-zod'\n\nexport const users = sqliteTable('users', {\n createdAt: integer('created_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .notNull(),\n email: text('email').notNull().unique(),\n id: text('id').primaryKey(),\n name: text('name').notNull(),\n updatedAt: integer('updated_at', { mode: 'timestamp_ms' })\n .default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)\n .$onUpdate(() => new Date())\n .notNull(),\n})\n\nexport const insertUserSchema = createInsertSchema(users)\nexport const selectUserSchema = createSelectSchema(users)\n"],"mappings":"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","names":["Hono","Hono"]}
1
+ {"version":3,"sources":["../src/cli.ts","../package.json","../src/api.ts","../src/api-admin.ts","../src/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":["Hono","sql","integer","sqliteTable","text","sql","integer","sqliteTable","text","sql","integer","sqliteTable","text","sql","integer","sqliteTable","text","Hono"]}
package/package.json CHANGED
@@ -56,6 +56,7 @@
56
56
  "db:migrate": "drizzle-kit migrate",
57
57
  "db:push": "drizzle-kit push",
58
58
  "db:seed": "bun src/seed.ts",
59
+ "db:seed:oauth": "bun scripts/seed-oauth.ts",
59
60
  "db:studio": "drizzle-kit studio",
60
61
  "lint": "biome check --error-on-warnings",
61
62
  "lint:fix": "biome check --error-on-warnings --write",
@@ -66,5 +67,5 @@
66
67
  },
67
68
  "type": "module",
68
69
  "types": "./dist/index.d.ts",
69
- "version": "0.1.0-canary-20260125211037"
70
+ "version": "0.1.0-canary-20260125213759"
70
71
  }