diff --git a/build.ts b/build.ts index a112835f..105a7fde 100644 --- a/build.ts +++ b/build.ts @@ -3,16 +3,13 @@ import { $ } from "bun"; import { exists, mkdir, rm } from "node:fs/promises"; import { rawRoutes } from "~routes"; -if (!(await exists("./pages/dist"))) { - console.log("Please build the Vite server first, or use `bun prod-build`"); - process.exit(1); -} +console.log("Building frontend..."); + +await $`bun fe:build`; console.log(`Building at ${process.cwd()}`); -await rm("./dist", { recursive: true }); - -await mkdir(`${process.cwd()}/dist`); +await $`rm -rf dist && mkdir dist`; await Bun.build({ entrypoints: [ @@ -26,7 +23,7 @@ await Bun.build({ target: "bun", splitting: true, minify: false, - external: ["bullmq", "@prisma/client"], + external: ["bullmq", "@prisma/client", "frontend"], }).then((output) => { if (!output.success) { console.log(output.logs); @@ -48,13 +45,10 @@ await $`cp -r ${process.cwd()}/node_modules/prisma dist/node_modules/`; // Copy Sharp to dist await $`cp -r ${process.cwd()}/node_modules/sharp/build/ .`; -// Create pages directory -await $`mkdir -p dist/pages/dist`; - // Copy Vite build output to dist -await $`cp -r ${process.cwd()}/pages/dist dist/pages/`; +await $`cp -r packages/frontend/.output dist/frontend`; // Copy the Bee Movie script from pages -await $`cp ${process.cwd()}/pages/beemovie.txt dist/pages/beemovie.txt`; +await $`cp ${process.cwd()}/pages/beemovie.txt dist/beemovie.txt`; console.log("Built!"); diff --git a/bun.lockb b/bun.lockb index ee06f16a..474387cd 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/package.json b/package.json index d4df4e96..e6ff919d 100644 --- a/package.json +++ b/package.json @@ -32,11 +32,14 @@ "dev": "bun run --watch index.ts", "vite:dev": "bunx --bun vite pages", "vite:build": "bunx --bun vite build pages", - "start": "NODE_ENV=production bun run dist/index.js --prod", + "fe:dev": "bun --bun nuxt dev packages/frontend", + "fe:build": "bun --bun nuxt build packages/frontend", + "fe:analyze": "bun --bun nuxt analyze packages/frontend", + "start": "NITRO_PORT=5173 bun run dist/frontend/server/index.mjs & NODE_ENV=production bun run dist/index.js --prod", "migrate-dev": "bun prisma migrate dev", "migrate": "bun prisma migrate deploy", "lint": "bunx --bun eslint --config .eslintrc.cjs --ext .ts .", - "prod-build": "bunx --bun vite build pages && bun run build.ts", + "prod-build": "bun run build.ts", "prisma": "DATABASE_URL=$(bun run prisma.ts) bunx prisma", "generate": "bun prisma generate", "benchmark:timeline": "bun run benchmarks/timelines.ts", @@ -48,13 +51,17 @@ "@prisma/client", "@prisma/engines", "esbuild", + "msgpackr-extract", + "nuxt-app", "prisma", "sharp", - "msgpackr-extract" + "vue-demi" ], "devDependencies": { "@biomejs/biome": "1.6.4", "@julr/unocss-preset-forms": "^0.1.0", + "@nuxtjs/seo": "^2.0.0-rc.10", + "@nuxtjs/tailwindcss": "^6.11.4", "@types/cli-table": "^0.3.4", "@types/html-to-text": "^9.0.4", "@types/ioredis": "^5.0.0", diff --git a/packages/config-manager/config.type.ts b/packages/config-manager/config.type.ts index 0d542d93..14deaac9 100644 --- a/packages/config-manager/config.type.ts +++ b/packages/config-manager/config.type.ts @@ -1,4 +1,7 @@ -import { MediaBackendType } from "~packages/media-manager"; +export enum MediaBackendType { + LOCAL = "local", + S3 = "s3", +} export interface Config { database: { diff --git a/packages/frontend/.gitignore b/packages/frontend/.gitignore new file mode 100644 index 00000000..4a7f73a2 --- /dev/null +++ b/packages/frontend/.gitignore @@ -0,0 +1,24 @@ +# Nuxt dev/build outputs +.output +.data +.nuxt +.nitro +.cache +dist + +# Node dependencies +node_modules + +# Logs +logs +*.log + +# Misc +.DS_Store +.fleet +.idea + +# Local env files +.env +.env.* +!.env.example diff --git a/packages/frontend/README.md b/packages/frontend/README.md new file mode 100644 index 00000000..d0b02976 --- /dev/null +++ b/packages/frontend/README.md @@ -0,0 +1 @@ +# FE \ No newline at end of file diff --git a/packages/frontend/app.vue b/packages/frontend/app.vue new file mode 100644 index 00000000..207756e3 --- /dev/null +++ b/packages/frontend/app.vue @@ -0,0 +1,13 @@ + + + \ No newline at end of file diff --git a/packages/frontend/components/LoginInput.vue b/packages/frontend/components/LoginInput.vue new file mode 100644 index 00000000..a5a3ae45 --- /dev/null +++ b/packages/frontend/components/LoginInput.vue @@ -0,0 +1,30 @@ + + + \ No newline at end of file diff --git a/packages/frontend/constants.ts b/packages/frontend/constants.ts new file mode 100644 index 00000000..5ef419d9 --- /dev/null +++ b/packages/frontend/constants.ts @@ -0,0 +1,12 @@ +export const recommendedClients = [ + { + name: "Soapbox", + icon: "https://soapbox.pub/assets/logo.svg", + link: "https://fe.soapbox.pub/", + }, + { + name: "Megalodon", + icon: "https://sk22.github.io/megalodon/mastodon/src/main/res/mipmap-xhdpi/ic_launcher_round.png", + link: "https://sk22.github.io/megalodon/", + }, +]; diff --git a/packages/frontend/nuxt.config.ts b/packages/frontend/nuxt.config.ts new file mode 100644 index 00000000..85aba386 --- /dev/null +++ b/packages/frontend/nuxt.config.ts @@ -0,0 +1,62 @@ +// import { loadConfig } from "c12"; +import pkg from "../../package.json"; +// import { defaultConfig } from "config-manager/config.type"; + +// https://nuxt.com/docs/api/configuration/nuxt-config +export default defineNuxtConfig({ + modules: ["@nuxtjs/seo", "@nuxtjs/tailwindcss", "@vueuse/nuxt"], + app: { + head: { + link: [ + { + rel: "icon", + href: "/favicon.png", + type: "image/png", + }, + ], + htmlAttrs: { lang: "en-us" }, + }, + }, + nitro: { + compressPublicAssets: { + gzip: false, + brotli: false, + }, + preset: "bun", + minify: true, + prerender: { + failOnError: true, + }, + }, + devServer: { + port: 5173, + }, + schemaOrg: { + enabled: false, + }, + vite: { + define: { + __VERSION__: JSON.stringify(pkg.version), + }, + server: { + hmr: { + clientPort: 5173, + }, + }, + }, + runtimeConfig: { + public: { + language: "en-US", + titleSeparator: "·", + siteName: "Lysand", + trailingSlash: true, + // @ts-ignore + + url2: async () => await Promise.resolve("cheese"), + //url: `${config?.http.bind}:${config?.http.bind_port}`, + }, + }, + site: { + url: "https://social.lysand.org", + }, +}); diff --git a/packages/frontend/package.json b/packages/frontend/package.json new file mode 100644 index 00000000..a075e686 --- /dev/null +++ b/packages/frontend/package.json @@ -0,0 +1,21 @@ +{ + "name": "nuxt-app", + "private": true, + "type": "module", + "scripts": { + "build": "nuxt build", + "dev": "nuxt dev", + "generate": "nuxt generate", + "preview": "nuxt preview", + "postinstall": "nuxt prepare" + }, + "dependencies": { + "c12": "^1.10.0", + "nuxt": "^3.11.2", + "vue": "^3.4.21", + "vue-router": "^4.3.0" + }, + "devDependencies": { + "@tailwindcss/forms": "^0.5.7" + } +} diff --git a/packages/frontend/pages/[username]/[uuid].vue b/packages/frontend/pages/[username]/[uuid].vue new file mode 100644 index 00000000..1b14b10f --- /dev/null +++ b/packages/frontend/pages/[username]/[uuid].vue @@ -0,0 +1,71 @@ + + + + + \ No newline at end of file diff --git a/packages/frontend/pages/[username]/index.vue b/packages/frontend/pages/[username]/index.vue new file mode 100644 index 00000000..5da29472 --- /dev/null +++ b/packages/frontend/pages/[username]/index.vue @@ -0,0 +1,82 @@ + + + + + \ No newline at end of file diff --git a/packages/frontend/pages/index.vue b/packages/frontend/pages/index.vue new file mode 100644 index 00000000..5265500a --- /dev/null +++ b/packages/frontend/pages/index.vue @@ -0,0 +1,69 @@ + + + \ No newline at end of file diff --git a/packages/frontend/pages/oauth/authorize.vue b/packages/frontend/pages/oauth/authorize.vue new file mode 100644 index 00000000..c4fc7e6e --- /dev/null +++ b/packages/frontend/pages/oauth/authorize.vue @@ -0,0 +1,114 @@ + + + \ No newline at end of file diff --git a/packages/frontend/pages/oauth/redirect.vue b/packages/frontend/pages/oauth/redirect.vue new file mode 100644 index 00000000..16478346 --- /dev/null +++ b/packages/frontend/pages/oauth/redirect.vue @@ -0,0 +1,175 @@ + + + \ No newline at end of file diff --git a/packages/frontend/pages/register/index.vue b/packages/frontend/pages/register/index.vue new file mode 100644 index 00000000..3ab1d198 --- /dev/null +++ b/packages/frontend/pages/register/index.vue @@ -0,0 +1,172 @@ +