Replaces the server/pages/community.vue stub ({{ $t("todo") }}) with real
Nuxt pages: a unified Drop+RomM title browser, an admin catalog-sync panel,
and a profile page with playtime rails. Corrects the original architecture
mistake of building this as a separate service at community.quasarke.net --
now that we own the fork's source, community is ordinary Nuxt pages instead
of a sidecar with its own auth/DB/vhost.
Data model: one new table, CommunityTitle, for the RomM catalog (ported
from drop-community M1's Title spine). Drop's own Game/User/Playtime models
already ARE the title/identity/playtime spine for Drop content, so nothing
new was needed there -- profile playtime rails read real, already-existing
Playtime rows, no wrapper/ingest milestone required to populate them.
RommAdapter (server/server/internal/community/rommAdapter.ts) reads RomM's
MariaDB directly via the community_ro read-only role, same deviation and
same reasoning as M1's adapter (RomM's /api/roms needs a browser session,
no service-account key). TitleSyncService runs every 6h
(scheduledTasks.communityTitleSync) and via an admin "Sync now" button
(system:community:sync ACL) -- never deletes, hides instead.
Also folds the three post-build JS patches
(homelab-compose/drop-stack/patch-{launcher-button,telemetry-snippet,
footer-links}.js) into source now that the fork builds from source instead
of patching upstream's prebuilt image:
- library/game/[id]/index.vue: the "Open in Launcher" button gets a real
@click handler (drop://open with a timeout fallback to /download).
- plugins/telemetry.client.ts: OpenPanel RUM injected via a Nuxt client
plugin instead of appending to the compiled entry chunk.
- UserFooter.vue + admin/library source-help links + error.vue + the
Weblate link: repointed at our own infra. The Discord/social link
used to point at community.quasarke.net; that service is retired, so
it now points at /community directly.
108 lines
3 KiB
JSON
108 lines
3 KiB
JSON
{
|
|
"name": "drop",
|
|
"version": "0.4.0",
|
|
"private": true,
|
|
"type": "module",
|
|
"license": "AGPL-3.0-or-later",
|
|
"engines": {
|
|
"node": ">=22.16.0"
|
|
},
|
|
"scripts": {
|
|
"build": "nuxt build",
|
|
"dev": "nuxt dev",
|
|
"generate": "nuxt generate",
|
|
"preview": "nuxt preview",
|
|
"postinstall": "nuxt prepare && prisma generate && buf generate",
|
|
"typecheck": "nuxt typecheck",
|
|
"lint": "pnpm run lint:eslint && pnpm run lint:prettier",
|
|
"lint:eslint": "eslint .",
|
|
"lint:prettier": "prettier . --check",
|
|
"lint:fix": "eslint . --fix && prettier --write --list-different ."
|
|
},
|
|
"dependencies": {
|
|
"@bufbuild/protobuf": "^2.11.0",
|
|
"@discordapp/twemoji": "^16.0.1",
|
|
"@headlessui/vue": "^1.7.23",
|
|
"@heroicons/vue": "^2.1.5",
|
|
"@lobomfz/prismark": "0.0.3",
|
|
"@nuxt/fonts": "^0.11.0",
|
|
"@nuxt/image": "^1.10.0",
|
|
"@nuxt/kit": "^3.20.1",
|
|
"@nuxtjs/i18n": "^9.5.5",
|
|
"@prisma/adapter-pg": "7.7.0",
|
|
"@prisma/client": "7.7.0",
|
|
"@simplewebauthn/browser": "^13.2.2",
|
|
"@simplewebauthn/server": "^13.2.2",
|
|
"@tailwindcss/vite": "^4.0.6",
|
|
"@vueuse/nuxt": "13.6.0",
|
|
"argon2": "^0.43.0",
|
|
"arktype": "^2.1.10",
|
|
"bcryptjs": "^3.0.2",
|
|
"cbor2": "^2.0.1",
|
|
"cheerio": "^1.0.0",
|
|
"cookie-es": "^2.0.0",
|
|
"deepmerge": "^4.3.1",
|
|
"dotenv": "^17.2.3",
|
|
"fast-fuzzy": "^1.12.0",
|
|
"file-type-mime": "^0.4.3",
|
|
"jdenticon": "^3.3.0",
|
|
"jose": "^6.1.3",
|
|
"jsonwebtoken": "^9.0.3",
|
|
"kjua": "^0.10.0",
|
|
"luxon": "^3.6.1",
|
|
"micromark": "^4.0.1",
|
|
"mysql2": "^3.15.0",
|
|
"normalize-url": "^8.0.2",
|
|
"nuxt": "^3.21.7",
|
|
"nuxt-security": "2.2.0",
|
|
"otp-io": "^1.2.7",
|
|
"parse-cosekey": "^1.0.2",
|
|
"pino": "^9.14.0",
|
|
"pino-pretty": "^13.1.1",
|
|
"prisma": "7.7.0",
|
|
"sanitize-filename": "^1.6.3",
|
|
"semver": "^7.7.1",
|
|
"shescape": "^2.1.14",
|
|
"stream-mime-type": "^2.0.0",
|
|
"turndown": "^7.2.0",
|
|
"unstorage": "^1.15.0",
|
|
"vue": "latest",
|
|
"vue-router": "latest",
|
|
"vue3-carousel": "^0.16.0",
|
|
"vue3-carousel-nuxt": "^1.1.5",
|
|
"vuedraggable": "^4.1.0"
|
|
},
|
|
"devDependencies": {
|
|
"@bufbuild/buf": "^1.65.0",
|
|
"@bufbuild/protoc-gen-es": "^2.11.0",
|
|
"@golar/vue": "^0.0.13",
|
|
"@intlify/eslint-plugin-vue-i18n": "^4.0.1",
|
|
"@nuxt/eslint": "^1.3.0",
|
|
"@tailwindcss/forms": "^0.5.9",
|
|
"@tailwindcss/typography": "^0.5.15",
|
|
"@types/jsonwebtoken": "^9.0.10",
|
|
"@types/luxon": "^3.6.2",
|
|
"@types/node": "^22.13.16",
|
|
"@types/semver": "^7.7.0",
|
|
"@types/turndown": "^5.0.5",
|
|
"@typescript-eslint/utils": "^8.50.0",
|
|
"autoprefixer": "^10.4.20",
|
|
"eslint": "^9.24.0",
|
|
"eslint-config-prettier": "^10.1.1",
|
|
"golar": "^0.0.13",
|
|
"h3": "^1.15.5",
|
|
"nitropack": "^2.13.4",
|
|
"ofetch": "^1.4.1",
|
|
"prettier": "^3.5.3",
|
|
"prettier-plugin-sort-json": "^4.1.1",
|
|
"sass": "^1.79.4",
|
|
"tailwindcss": "^4.0.0",
|
|
"typescript": "^5.8.3",
|
|
"vue-tsc": "^3.0.1"
|
|
},
|
|
"overrides": {
|
|
"vue3-carousel-nuxt": {
|
|
"vue3-carousel": "^0.16.0"
|
|
}
|
|
}
|
|
}
|