From 5c96b8eea0acc76c7f7752621dece487fdf40ebc Mon Sep 17 00:00:00 2001 From: Arthur DANJOU Date: Tue, 23 Jul 2024 20:27:33 +0200 Subject: [PATCH] Init nuxt-starter --- .env.example | 1 + app/app.config.ts | 9 +++ app/app.vue | 72 +++++++++++++++++++ app/pages/index.vue | 13 ++++ drizzle.config.ts | 7 ++ eslint.config.mjs | 6 ++ server/api/test.ts | 3 + .../migrations/0000_hot_thunderball.sql | 5 ++ .../migrations/meta/0000_snapshot.json | 49 +++++++++++++ server/database/migrations/meta/_journal.json | 13 ++++ server/database/schema.ts | 8 +++ server/plugins/migrations.ts | 16 +++++ server/routes/auth/github.get.ts | 19 +++++ server/routes/auth/google.get.ts | 23 ++++++ server/utils/db.ts | 10 +++ tailwind.config.ts | 25 +++++++ types/index.ts | 0 17 files changed, 279 insertions(+) create mode 100644 .env.example create mode 100644 app/app.config.ts create mode 100644 app/app.vue create mode 100644 app/pages/index.vue create mode 100644 drizzle.config.ts create mode 100644 eslint.config.mjs create mode 100644 server/api/test.ts create mode 100644 server/database/migrations/0000_hot_thunderball.sql create mode 100644 server/database/migrations/meta/0000_snapshot.json create mode 100644 server/database/migrations/meta/_journal.json create mode 100644 server/database/schema.ts create mode 100644 server/plugins/migrations.ts create mode 100644 server/routes/auth/github.get.ts create mode 100644 server/routes/auth/google.get.ts create mode 100644 server/utils/db.ts create mode 100644 tailwind.config.ts create mode 100644 types/index.ts diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..be021f5 --- /dev/null +++ b/.env.example @@ -0,0 +1 @@ +NUXT_SESSION_PASSWORD= \ No newline at end of file diff --git a/app/app.config.ts b/app/app.config.ts new file mode 100644 index 0000000..3691168 --- /dev/null +++ b/app/app.config.ts @@ -0,0 +1,9 @@ +export default defineAppConfig({ + ui: { + gray: 'neutral', + primary: 'gray', + icons: { + dynamic: true + } + } +}) diff --git a/app/app.vue b/app/app.vue new file mode 100644 index 0000000..fb7aa2d --- /dev/null +++ b/app/app.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/app/pages/index.vue b/app/pages/index.vue new file mode 100644 index 0000000..6fb03b3 --- /dev/null +++ b/app/pages/index.vue @@ -0,0 +1,13 @@ + + + + + diff --git a/drizzle.config.ts b/drizzle.config.ts new file mode 100644 index 0000000..3b11d29 --- /dev/null +++ b/drizzle.config.ts @@ -0,0 +1,7 @@ +import type { Config } from 'drizzle-kit' + +export default { + dialect: 'sqlite', + schema: './server/database/schema.ts', + out: './server/database/migrations' +} satisfies Config diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..934c3a1 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,6 @@ +// @ts-check +import withNuxt from './.nuxt/eslint.config.mjs' + +export default withNuxt( + // Your custom configs here +) diff --git a/server/api/test.ts b/server/api/test.ts new file mode 100644 index 0000000..994ee59 --- /dev/null +++ b/server/api/test.ts @@ -0,0 +1,3 @@ +export default defineEventHandler(() => { + return { hello: 'API' } +}) \ No newline at end of file diff --git a/server/database/migrations/0000_hot_thunderball.sql b/server/database/migrations/0000_hot_thunderball.sql new file mode 100644 index 0000000..f47763e --- /dev/null +++ b/server/database/migrations/0000_hot_thunderball.sql @@ -0,0 +1,5 @@ +CREATE TABLE `users` ( + `id` integer PRIMARY KEY NOT NULL, + `name` text DEFAULT '', + `created_at` text DEFAULT (CURRENT_DATE) +); diff --git a/server/database/migrations/meta/0000_snapshot.json b/server/database/migrations/meta/0000_snapshot.json new file mode 100644 index 0000000..b265244 --- /dev/null +++ b/server/database/migrations/meta/0000_snapshot.json @@ -0,0 +1,49 @@ +{ + "version": "6", + "dialect": "sqlite", + "id": "ef8e28cd-73a1-4801-9a0b-7e80169a57c0", + "prevId": "00000000-0000-0000-0000-000000000000", + "tables": { + "users": { + "name": "users", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "''" + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(CURRENT_DATE)" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "indexes": {} + } +} \ No newline at end of file diff --git a/server/database/migrations/meta/_journal.json b/server/database/migrations/meta/_journal.json new file mode 100644 index 0000000..f9afed4 --- /dev/null +++ b/server/database/migrations/meta/_journal.json @@ -0,0 +1,13 @@ +{ + "version": "7", + "dialect": "sqlite", + "entries": [ + { + "idx": 0, + "version": "6", + "when": 1721758030188, + "tag": "0000_hot_thunderball", + "breakpoints": true + } + ] +} \ No newline at end of file diff --git a/server/database/schema.ts b/server/database/schema.ts new file mode 100644 index 0000000..37258d8 --- /dev/null +++ b/server/database/schema.ts @@ -0,0 +1,8 @@ +import { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core' +import { sql } from 'drizzle-orm' + +export const users = sqliteTable('users', { + id: integer('id').primaryKey(), + name: text('name').default(''), + createdAt: text('created_at').default(sql`(CURRENT_DATE)`) +}) diff --git a/server/plugins/migrations.ts b/server/plugins/migrations.ts new file mode 100644 index 0000000..025529d --- /dev/null +++ b/server/plugins/migrations.ts @@ -0,0 +1,16 @@ +import { consola } from 'consola' +import { migrate } from 'drizzle-orm/d1/migrator' + +export default defineNitroPlugin(async () => { + if (!import.meta.dev) return + + onHubReady(async () => { + await migrate(useDB(), { migrationsFolder: 'server/database/migrations' }) + .then(() => { + consola.success('Database migrations done') + }) + .catch((err) => { + consola.error('Database migrations failed', err) + }) + }) +}) diff --git a/server/routes/auth/github.get.ts b/server/routes/auth/github.get.ts new file mode 100644 index 0000000..489d367 --- /dev/null +++ b/server/routes/auth/github.get.ts @@ -0,0 +1,19 @@ +export default oauth.githubEventHandler({ + config: { + emailRequired: true + }, + async onSuccess(event, { user }) { + await setUserSession(event, { + user: { + name: user.name, + imageUrl: user.avatar_url, + email: user.email + } + }) + return sendRedirect(event, '/') + }, + onError(event, error) { + console.error('GitHub OAuth error:', error) + return sendRedirect(event, '/') + } +}) diff --git a/server/routes/auth/google.get.ts b/server/routes/auth/google.get.ts new file mode 100644 index 0000000..0eb2d23 --- /dev/null +++ b/server/routes/auth/google.get.ts @@ -0,0 +1,23 @@ +export default oauth.googleEventHandler({ + config: { + authorizationParams: { + access_type: 'offline' + } + }, + async onSuccess(event, { user }) { + await setUserSession(event, { + user: { + name: user.name, + imageUrl: user.picture, + email: user.email + } + }) + + return sendRedirect(event, '/') + }, + // Optional, will return a json error and 401 status code by default + onError(event, error) { + console.error('Google OAuth error:', error) + return sendRedirect(event, '/') + } +}) diff --git a/server/utils/db.ts b/server/utils/db.ts new file mode 100644 index 0000000..b405639 --- /dev/null +++ b/server/utils/db.ts @@ -0,0 +1,10 @@ +import { drizzle } from 'drizzle-orm/d1' +import * as schema from '../database/schema' + +export { sql, eq, and, or, asc, desc, sum } from 'drizzle-orm' + +export const tables = schema + +export function useDB() { + return drizzle(hubDatabase(), { schema }) +} diff --git a/tailwind.config.ts b/tailwind.config.ts new file mode 100644 index 0000000..33f34a9 --- /dev/null +++ b/tailwind.config.ts @@ -0,0 +1,25 @@ +import type { Config } from 'tailwindcss' +import typography from '@tailwindcss/typography' + +export default >{ + content: [ + './components/**/*.{vue,js,ts}', + './layouts/**/*.vue', + './pages/**/*.vue', + './composables/**/*.{js,ts}', + './plugins/**/*.{js,ts}', + './utils/**/*.{js,ts}', + './App.{js,ts,vue}', + './app.{js,ts,vue}', + './Error.{js,ts,vue}', + './error.{js,ts,vue}', + './app.config.{js,ts}', + 'content/**/*.md' + ], + theme: { + extend: { + + } + }, + plugins: [typography] +} diff --git a/types/index.ts b/types/index.ts new file mode 100644 index 0000000..e69de29