solana-auth-oauth2-server 0.1.0-canary-20260124204405 → 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 +92 -20
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +89 -17
- package/dist/cli.js.map +1 -1
- package/package.json +6 -2
package/dist/cli.cjs
CHANGED
|
@@ -15,11 +15,14 @@ var package_default = {
|
|
|
15
15
|
"solana-auth-oauth2-server": "dist/cli.js"
|
|
16
16
|
},
|
|
17
17
|
dependencies: {
|
|
18
|
+
"@hono/zod-validator": "^0.7.6",
|
|
18
19
|
"@libsql/client": "^0.17.0",
|
|
19
20
|
commander: "^14.0.2",
|
|
20
21
|
"drizzle-orm": "^0.45.1",
|
|
22
|
+
"drizzle-zod": "^0.8.3",
|
|
21
23
|
hono: "^4.11.5",
|
|
22
|
-
libsql: "^0.5.22"
|
|
24
|
+
libsql: "^0.5.22",
|
|
25
|
+
zod: "^4.3.6"
|
|
23
26
|
},
|
|
24
27
|
devDependencies: {
|
|
25
28
|
"@biomejs/biome": "^2.3.11",
|
|
@@ -63,6 +66,7 @@ var package_default = {
|
|
|
63
66
|
"db:migrate": "drizzle-kit migrate",
|
|
64
67
|
"db:push": "drizzle-kit push",
|
|
65
68
|
"db:seed": "bun src/seed.ts",
|
|
69
|
+
"db:seed:oauth": "bun scripts/seed-oauth.ts",
|
|
66
70
|
"db:studio": "drizzle-kit studio",
|
|
67
71
|
lint: "biome check --error-on-warnings",
|
|
68
72
|
"lint:fix": "biome check --error-on-warnings --write",
|
|
@@ -80,7 +84,8 @@ var package_default = {
|
|
|
80
84
|
var import_hono2 = require("hono");
|
|
81
85
|
|
|
82
86
|
// src/api-admin.ts
|
|
83
|
-
var
|
|
87
|
+
var import_zod_validator = require("@hono/zod-validator");
|
|
88
|
+
var import_drizzle_orm6 = require("drizzle-orm");
|
|
84
89
|
var import_hono = require("hono");
|
|
85
90
|
|
|
86
91
|
// src/db/index.ts
|
|
@@ -90,20 +95,94 @@ var import_libsql = require("drizzle-orm/libsql");
|
|
|
90
95
|
// src/db/schema/index.ts
|
|
91
96
|
var schema_exports = {};
|
|
92
97
|
__export(schema_exports, {
|
|
98
|
+
authCodes: () => authCodes,
|
|
99
|
+
clients: () => clients,
|
|
100
|
+
insertUserSchema: () => insertUserSchema,
|
|
101
|
+
scopes: () => scopes,
|
|
102
|
+
selectUserSchema: () => selectUserSchema,
|
|
103
|
+
tokens: () => tokens,
|
|
93
104
|
users: () => users
|
|
94
105
|
});
|
|
95
106
|
|
|
96
|
-
// src/db/schema/
|
|
107
|
+
// src/db/schema/auth-codes.ts
|
|
97
108
|
var import_drizzle_orm = require("drizzle-orm");
|
|
98
109
|
var import_sqlite_core = require("drizzle-orm/sqlite-core");
|
|
99
|
-
var
|
|
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(),
|
|
100
115
|
createdAt: (0, import_sqlite_core.integer)("created_at", { mode: "timestamp_ms" }).default(import_drizzle_orm.sql`(cast(unixepoch('subsecond') * 1000 as integer))`).notNull(),
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
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()
|
|
105
146
|
});
|
|
106
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()
|
|
182
|
+
});
|
|
183
|
+
var insertUserSchema = (0, import_drizzle_zod.createInsertSchema)(users);
|
|
184
|
+
var selectUserSchema = (0, import_drizzle_zod.createSelectSchema)(users);
|
|
185
|
+
|
|
107
186
|
// src/db/index.ts
|
|
108
187
|
var client = (0, import_client.createClient)({
|
|
109
188
|
authToken: process.env.DATABASE_AUTH_TOKEN,
|
|
@@ -119,23 +198,16 @@ apiAdmin.get("/users", async (c) => {
|
|
|
119
198
|
});
|
|
120
199
|
apiAdmin.get("/users/:id", async (c) => {
|
|
121
200
|
const id = c.req.param("id");
|
|
122
|
-
const result = await db.select().from(users).where((0,
|
|
201
|
+
const result = await db.select().from(users).where((0, import_drizzle_orm6.eq)(users.id, id)).get();
|
|
123
202
|
if (!result) {
|
|
124
203
|
return c.json({ error: "User not found" }, 404);
|
|
125
204
|
}
|
|
126
205
|
return c.json(result);
|
|
127
206
|
});
|
|
128
|
-
apiAdmin.post("/users", async (c) => {
|
|
129
|
-
const body =
|
|
130
|
-
if (!body.id || !body.email || !body.name) {
|
|
131
|
-
return c.json({ error: "Missing required fields: id, name, email" }, 400);
|
|
132
|
-
}
|
|
207
|
+
apiAdmin.post("/users", (0, import_zod_validator.zValidator)("json", insertUserSchema), async (c) => {
|
|
208
|
+
const body = c.req.valid("json");
|
|
133
209
|
try {
|
|
134
|
-
const result = await db.insert(users).values(
|
|
135
|
-
email: body.email,
|
|
136
|
-
id: body.id,
|
|
137
|
-
name: body.name
|
|
138
|
-
}).returning().get();
|
|
210
|
+
const result = await db.insert(users).values(body).returning().get();
|
|
139
211
|
return c.json(result, 201);
|
|
140
212
|
} catch (err) {
|
|
141
213
|
if (err instanceof Error) {
|
|
@@ -148,7 +220,7 @@ apiAdmin.post("/users", async (c) => {
|
|
|
148
220
|
});
|
|
149
221
|
apiAdmin.delete("/users/:id", async (c) => {
|
|
150
222
|
const id = c.req.param("id");
|
|
151
|
-
const result = await db.delete(users).where((0,
|
|
223
|
+
const result = await db.delete(users).where((0, import_drizzle_orm6.eq)(users.id, id)).returning().get();
|
|
152
224
|
if (!result) {
|
|
153
225
|
return c.json({ error: "User not found" }, 404);
|
|
154
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 \"@libsql/client\": \"^0.17.0\",\n \"commander\": \"^14.0.2\",\n \"drizzle-orm\": \"^0.45.1\",\n \"hono\": \"^4.11.5\",\n \"libsql\": \"^0.5.22\"\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 { eq } from 'drizzle-orm'\nimport { Hono } from 'hono'\nimport { db } from './db/index.ts'\nimport { 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', async (c) => {\n const body = await c.req.json()\n\n if (!body.id || !body.email || !body.name) {\n return c.json({ error: 'Missing required fields: id, name, email' }, 400)\n }\n\n try {\n const result = await db\n .insert(users)\n .values({\n email: body.email,\n id: body.id,\n name: body.name,\n })\n .returning()\n .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'\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"],"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
|
@@ -14,11 +14,14 @@ var package_default = {
|
|
|
14
14
|
"solana-auth-oauth2-server": "dist/cli.js"
|
|
15
15
|
},
|
|
16
16
|
dependencies: {
|
|
17
|
+
"@hono/zod-validator": "^0.7.6",
|
|
17
18
|
"@libsql/client": "^0.17.0",
|
|
18
19
|
commander: "^14.0.2",
|
|
19
20
|
"drizzle-orm": "^0.45.1",
|
|
21
|
+
"drizzle-zod": "^0.8.3",
|
|
20
22
|
hono: "^4.11.5",
|
|
21
|
-
libsql: "^0.5.22"
|
|
23
|
+
libsql: "^0.5.22",
|
|
24
|
+
zod: "^4.3.6"
|
|
22
25
|
},
|
|
23
26
|
devDependencies: {
|
|
24
27
|
"@biomejs/biome": "^2.3.11",
|
|
@@ -62,6 +65,7 @@ var package_default = {
|
|
|
62
65
|
"db:migrate": "drizzle-kit migrate",
|
|
63
66
|
"db:push": "drizzle-kit push",
|
|
64
67
|
"db:seed": "bun src/seed.ts",
|
|
68
|
+
"db:seed:oauth": "bun scripts/seed-oauth.ts",
|
|
65
69
|
"db:studio": "drizzle-kit studio",
|
|
66
70
|
lint: "biome check --error-on-warnings",
|
|
67
71
|
"lint:fix": "biome check --error-on-warnings --write",
|
|
@@ -79,6 +83,7 @@ var package_default = {
|
|
|
79
83
|
import { Hono as Hono2 } from "hono";
|
|
80
84
|
|
|
81
85
|
// src/api-admin.ts
|
|
86
|
+
import { zValidator } from "@hono/zod-validator";
|
|
82
87
|
import { eq } from "drizzle-orm";
|
|
83
88
|
import { Hono } from "hono";
|
|
84
89
|
|
|
@@ -89,20 +94,94 @@ import { drizzle } from "drizzle-orm/libsql";
|
|
|
89
94
|
// src/db/schema/index.ts
|
|
90
95
|
var schema_exports = {};
|
|
91
96
|
__export(schema_exports, {
|
|
97
|
+
authCodes: () => authCodes,
|
|
98
|
+
clients: () => clients,
|
|
99
|
+
insertUserSchema: () => insertUserSchema,
|
|
100
|
+
scopes: () => scopes,
|
|
101
|
+
selectUserSchema: () => selectUserSchema,
|
|
102
|
+
tokens: () => tokens,
|
|
92
103
|
users: () => users
|
|
93
104
|
});
|
|
94
105
|
|
|
95
|
-
// src/db/schema/
|
|
106
|
+
// src/db/schema/auth-codes.ts
|
|
96
107
|
import { sql } from "drizzle-orm";
|
|
97
108
|
import { integer, sqliteTable, text } from "drizzle-orm/sqlite-core";
|
|
98
|
-
var
|
|
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(),
|
|
99
114
|
createdAt: integer("created_at", { mode: "timestamp_ms" }).default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`).notNull(),
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
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()
|
|
104
134
|
});
|
|
105
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()
|
|
181
|
+
});
|
|
182
|
+
var insertUserSchema = createInsertSchema(users);
|
|
183
|
+
var selectUserSchema = createSelectSchema(users);
|
|
184
|
+
|
|
106
185
|
// src/db/index.ts
|
|
107
186
|
var client = createClient({
|
|
108
187
|
authToken: process.env.DATABASE_AUTH_TOKEN,
|
|
@@ -124,17 +203,10 @@ apiAdmin.get("/users/:id", async (c) => {
|
|
|
124
203
|
}
|
|
125
204
|
return c.json(result);
|
|
126
205
|
});
|
|
127
|
-
apiAdmin.post("/users", async (c) => {
|
|
128
|
-
const body =
|
|
129
|
-
if (!body.id || !body.email || !body.name) {
|
|
130
|
-
return c.json({ error: "Missing required fields: id, name, email" }, 400);
|
|
131
|
-
}
|
|
206
|
+
apiAdmin.post("/users", zValidator("json", insertUserSchema), async (c) => {
|
|
207
|
+
const body = c.req.valid("json");
|
|
132
208
|
try {
|
|
133
|
-
const result = await db.insert(users).values(
|
|
134
|
-
email: body.email,
|
|
135
|
-
id: body.id,
|
|
136
|
-
name: body.name
|
|
137
|
-
}).returning().get();
|
|
209
|
+
const result = await db.insert(users).values(body).returning().get();
|
|
138
210
|
return c.json(result, 201);
|
|
139
211
|
} catch (err) {
|
|
140
212
|
if (err instanceof Error) {
|
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 \"@libsql/client\": \"^0.17.0\",\n \"commander\": \"^14.0.2\",\n \"drizzle-orm\": \"^0.45.1\",\n \"hono\": \"^4.11.5\",\n \"libsql\": \"^0.5.22\"\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 { eq } from 'drizzle-orm'\nimport { Hono } from 'hono'\nimport { db } from './db/index.ts'\nimport { 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', async (c) => {\n const body = await c.req.json()\n\n if (!body.id || !body.email || !body.name) {\n return c.json({ error: 'Missing required fields: id, name, email' }, 400)\n }\n\n try {\n const result = await db\n .insert(users)\n .values({\n email: body.email,\n id: body.id,\n name: body.name,\n })\n .returning()\n .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'\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"],"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
|
@@ -3,11 +3,14 @@
|
|
|
3
3
|
"solana-auth-oauth2-server": "dist/cli.js"
|
|
4
4
|
},
|
|
5
5
|
"dependencies": {
|
|
6
|
+
"@hono/zod-validator": "^0.7.6",
|
|
6
7
|
"@libsql/client": "^0.17.0",
|
|
7
8
|
"commander": "^14.0.2",
|
|
8
9
|
"drizzle-orm": "^0.45.1",
|
|
10
|
+
"drizzle-zod": "^0.8.3",
|
|
9
11
|
"hono": "^4.11.5",
|
|
10
|
-
"libsql": "^0.5.22"
|
|
12
|
+
"libsql": "^0.5.22",
|
|
13
|
+
"zod": "^4.3.6"
|
|
11
14
|
},
|
|
12
15
|
"devDependencies": {
|
|
13
16
|
"@biomejs/biome": "^2.3.11",
|
|
@@ -53,6 +56,7 @@
|
|
|
53
56
|
"db:migrate": "drizzle-kit migrate",
|
|
54
57
|
"db:push": "drizzle-kit push",
|
|
55
58
|
"db:seed": "bun src/seed.ts",
|
|
59
|
+
"db:seed:oauth": "bun scripts/seed-oauth.ts",
|
|
56
60
|
"db:studio": "drizzle-kit studio",
|
|
57
61
|
"lint": "biome check --error-on-warnings",
|
|
58
62
|
"lint:fix": "biome check --error-on-warnings --write",
|
|
@@ -63,5 +67,5 @@
|
|
|
63
67
|
},
|
|
64
68
|
"type": "module",
|
|
65
69
|
"types": "./dist/index.d.ts",
|
|
66
|
-
"version": "0.1.0-canary-
|
|
70
|
+
"version": "0.1.0-canary-20260125213759"
|
|
67
71
|
}
|