From 1010f27f44c34d6f62170bff62a50e97e2a26a1d Mon Sep 17 00:00:00 2001 From: krisf Date: Sat, 15 Aug 2026 16:07:07 -0400 Subject: [PATCH] MapleBrief: production Canadian news aggregator Next.js 14 + TypeScript + Tailwind + Prisma/SQLite. - LLM synthesis abstraction (OpenAI/Anthropic/Ollama) + admin settings UI - RSS ingestion pipeline (parser + cheerio content) + node-cron worker - AdSense AdUnit placements (header/in-feed/in-article/sidebar) - Sources analysis attribution, nofollow links, canonical/OG, sitemap/robots - Admin auth (ADMIN_API_KEY, timingSafeEqual, fail-closed 401) - Multi-cell lady-ga-ga marker, sitemap, robots, legal pages - Comprehensive README (setup, LLM config, AdSense, migrations, deploy) --- .env.example | 65 + .gitignore | 44 + README.md | 216 ++ next.config.mjs | 19 + package-lock.json | 2648 +++++++++++++++++ package.json | 45 + postcss.config.mjs | 9 + .../20260815183102_init/migration.sql | 73 + prisma/migrations/migration_lock.toml | 3 + prisma/schema.prisma | 79 + prisma/seed.ts | 30 + public/favicon-64.png | Bin 0 -> 1557 bytes public/icon-192.png | Bin 0 -> 11969 bytes public/icon-512.png | Bin 0 -> 32801 bytes public/logo-mark.svg | 15 + public/logo-wordmark-dark.png | Bin 0 -> 9590 bytes public/logo-wordmark-light.png | Bin 0 -> 9855 bytes public/logo.png | Bin 0 -> 32801 bytes public/logo.svg | 3 + public/og-image.png | Bin 0 -> 54610 bytes scripts/assets/leaf_grad.png | Bin 0 -> 43964 bytes scripts/assets/leaf_white.png | Bin 0 -> 41016 bytes src/app/[section]/page.tsx | 85 + src/app/about/page.tsx | 52 + src/app/admin/settings/page.tsx | 17 + src/app/api/admin/verify/route.ts | 16 + src/app/api/contact/route.ts | 44 + src/app/api/refresh/route.ts | 32 + src/app/api/settings/route.ts | 138 + src/app/api/settings/test/route.ts | 50 + src/app/api/status/route.ts | 40 + src/app/api/worker/ping/route.ts | 27 + src/app/article/[slug]/page.tsx | 197 ++ src/app/contact/page.tsx | 29 + src/app/globals.css | 39 + src/app/layout.tsx | 68 + src/app/not-found.tsx | 22 + src/app/page.tsx | 128 + src/app/privacy-policy/page.tsx | 165 + src/app/robots.ts | 30 + src/app/sitemap.ts | 30 + src/app/tag/[tag]/page.tsx | 55 + src/app/terms-of-service/page.tsx | 107 + src/components/ArticleCard.tsx | 55 + src/components/ContactForm.tsx | 90 + src/components/RelatedArticles.tsx | 36 + src/components/SourceAttribution.tsx | 55 + src/components/admin/AdminGate.tsx | 121 + src/components/admin/SettingsForm.tsx | 283 ++ src/components/ads/AdUnit.tsx | 127 + src/components/ads/placements.tsx | 70 + src/components/layout/Footer.tsx | 47 + src/components/layout/Header.tsx | 53 + src/components/layout/NavLinks.tsx | 43 + src/instrumentation.ts | 18 + src/lib/auth/admin.ts | 65 + src/lib/db.ts | 12 + src/lib/env.ts | 89 + src/lib/format.ts | 35 + src/lib/ingest/feed.ts | 142 + src/lib/ingest/pipeline.ts | 174 ++ src/lib/ingest/seed.ts | 33 + src/lib/llm/anthropic.ts | 88 + src/lib/llm/index.ts | 23 + src/lib/llm/ollama.ts | 83 + src/lib/llm/openai.ts | 87 + src/lib/llm/parse.ts | 123 + src/lib/llm/provider.ts | 68 + src/lib/llm/synthesize.ts | 77 + src/lib/llm/types.ts | 33 + src/lib/queries.ts | 137 + src/lib/settings.ts | 89 + src/lib/slug.ts | 42 + src/lib/worker/cron.ts | 88 + tailwind.config.ts | 50 + tsconfig.json | 21 + 76 files changed, 7177 insertions(+) create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 README.md create mode 100644 next.config.mjs create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.mjs create mode 100644 prisma/migrations/20260815183102_init/migration.sql create mode 100644 prisma/migrations/migration_lock.toml create mode 100644 prisma/schema.prisma create mode 100644 prisma/seed.ts create mode 100644 public/favicon-64.png create mode 100644 public/icon-192.png create mode 100644 public/icon-512.png create mode 100644 public/logo-mark.svg create mode 100644 public/logo-wordmark-dark.png create mode 100644 public/logo-wordmark-light.png create mode 100644 public/logo.png create mode 100644 public/logo.svg create mode 100644 public/og-image.png create mode 100644 scripts/assets/leaf_grad.png create mode 100644 scripts/assets/leaf_white.png create mode 100644 src/app/[section]/page.tsx create mode 100644 src/app/about/page.tsx create mode 100644 src/app/admin/settings/page.tsx create mode 100644 src/app/api/admin/verify/route.ts create mode 100644 src/app/api/contact/route.ts create mode 100644 src/app/api/refresh/route.ts create mode 100644 src/app/api/settings/route.ts create mode 100644 src/app/api/settings/test/route.ts create mode 100644 src/app/api/status/route.ts create mode 100644 src/app/api/worker/ping/route.ts create mode 100644 src/app/article/[slug]/page.tsx create mode 100644 src/app/contact/page.tsx create mode 100644 src/app/globals.css create mode 100644 src/app/layout.tsx create mode 100644 src/app/not-found.tsx create mode 100644 src/app/page.tsx create mode 100644 src/app/privacy-policy/page.tsx create mode 100644 src/app/robots.ts create mode 100644 src/app/sitemap.ts create mode 100644 src/app/tag/[tag]/page.tsx create mode 100644 src/app/terms-of-service/page.tsx create mode 100644 src/components/ArticleCard.tsx create mode 100644 src/components/ContactForm.tsx create mode 100644 src/components/RelatedArticles.tsx create mode 100644 src/components/SourceAttribution.tsx create mode 100644 src/components/admin/AdminGate.tsx create mode 100644 src/components/admin/SettingsForm.tsx create mode 100644 src/components/ads/AdUnit.tsx create mode 100644 src/components/ads/placements.tsx create mode 100644 src/components/layout/Footer.tsx create mode 100644 src/components/layout/Header.tsx create mode 100644 src/components/layout/NavLinks.tsx create mode 100644 src/instrumentation.ts create mode 100644 src/lib/auth/admin.ts create mode 100644 src/lib/db.ts create mode 100644 src/lib/env.ts create mode 100644 src/lib/format.ts create mode 100644 src/lib/ingest/feed.ts create mode 100644 src/lib/ingest/pipeline.ts create mode 100644 src/lib/ingest/seed.ts create mode 100644 src/lib/llm/anthropic.ts create mode 100644 src/lib/llm/index.ts create mode 100644 src/lib/llm/ollama.ts create mode 100644 src/lib/llm/openai.ts create mode 100644 src/lib/llm/parse.ts create mode 100644 src/lib/llm/provider.ts create mode 100644 src/lib/llm/synthesize.ts create mode 100644 src/lib/llm/types.ts create mode 100644 src/lib/queries.ts create mode 100644 src/lib/settings.ts create mode 100644 src/lib/slug.ts create mode 100644 src/lib/worker/cron.ts create mode 100644 tailwind.config.ts create mode 100644 tsconfig.json diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..af5031e --- /dev/null +++ b/.env.example @@ -0,0 +1,65 @@ +# ───────────────────────────────────────────────────────────────────────────── +# MapleBrief — environment configuration +# Copy to `.env` and fill in the values you need. Only the entries marked +# REQUIRED need to be set for the app to boot; everything else has a sane +# fallback or is managed from the /admin/settings UI (stored in the database). +# ───────────────────────────────────────────────────────────────────────────── + +# --------------------------------------------------------------------------- +# Database (REQUIRED) +# SQLite by default — zero-config for local dev. For PostgreSQL, change +# provider in prisma/schema.prisma and point DATABASE_URL at a postgres URL. +# --------------------------------------------------------------------------- +DATABASE_URL="file:./dev.db" + +# --------------------------------------------------------------------------- +# Site (public — inlined into the browser) +# --------------------------------------------------------------------------- +NEXT_PUBLIC_SITE_NAME="MapleBrief" +NEXT_PUBLIC_SITE_URL="http://localhost:3000" +NEXT_PUBLIC_SITE_DESCRIPTION="Independently synthesized briefings on the news that matters across Canada. A neutral, source-attributed daily digest of Canadian headlines from CBC, CTV, Global, the Globe and more." + +# --------------------------------------------------------------------------- +# Content reliability — used as fallback identity for feed fetches +# --------------------------------------------------------------------------- +FEED_USER_AGENT="MapleBrief/1.0 (+https://localhost:3000; rss reader)" + +# --------------------------------------------------------------------------- +# Background ingestion scheduler +# TURN these off to run by hand (see README "Running the worker"). +# --------------------------------------------------------------------------- +RUN_SCHEDULER="true" # set to "false" to disable the node-cron worker +CRON_SCHEDULE="*/35 * * * *" # every 35 minutes (spec: 30-60 minute cadence) +MAX_SYNTH_PER_RUN="24" # cap LLM syntheses per run to limit API spend +FETCH_CONTENT="true" # set to "false" to skip original HTML fetch +HTTP_TIMEOUT_MS="12000" # per-request timeout for HTML fetches + +# --------------------------------------------------------------------------- +# LLM providers (fallback defaults; the /admin/settings UI overrides all of +# these at runtime and stores the active choices in the database). +# API keys referenced here are used only when the admin UI has NOT stored a +# value for that provider. Never commit real keys to .env in a shared repo. +# --------------------------------------------------------------------------- +OPENAI_API_KEY="" +ANTHROPIC_API_KEY="" +OLLAMA_BASE_URL="http://localhost:11434" +OLLAMA_MODEL="llama3.2:3b" + +# --------------------------------------------------------------------------- +# Administration (protects the /admin/settings UI and /api/settings, +# /api/refresh endpoints). Must be a strong random string in production. +# --------------------------------------------------------------------------- +ADMIN_API_KEY="change-me-to-a-32-char-random-string" + +# --------------------------------------------------------------------------- +# Google AdSense (public — publisher id + per-unit ad slots). +# NEXT_PUBLIC_ADSENSE_CLIENT_ID looks like: ca-pub-1234567890123456 +# Slot ids are the numeric "slot" values from your AdSense Ad units UI. +# Leave a slot blank and the renders a labelled placeholder — +# perfect for local preview before your AdSense account is approved. +# --------------------------------------------------------------------------- +NEXT_PUBLIC_ADSENSE_CLIENT_ID="" +NEXT_PUBLIC_ADSENSE_SLOT_HEADER="" +NEXT_PUBLIC_ADSENSE_SLOT_INFEED="" +NEXT_PUBLIC_ADSENSE_SLOT_INARTICLE="" +NEXT_PUBLIC_ADSENSE_SLOT_SIDEBAR="" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ab8271a --- /dev/null +++ b/.gitignore @@ -0,0 +1,44 @@ +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ +*.tsbuildinfo +next-env.d.ts + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env +.env.local +.env.development.local +.env.test.local +.env.production.local +.env.*.local + +# prisma +/prisma/*.db +/prisma/*.db-journal +prisma/dev.db +prisma/dev.db-journal + +# local databases / generated +data/ +*.sqlite +*.sqlite3 diff --git a/README.md b/README.md new file mode 100644 index 0000000..69ab47d --- /dev/null +++ b/README.md @@ -0,0 +1,216 @@ +# MapleBrief + +An automated **Canadian news aggregator** with **LLM content synthesis** and **Google AdSense integration**. + +MapleBrief pulls stories from Canadian news RSS feeds on a schedule, fetches the full article text, has an LLM rewrite them into original neutral reports (with headline, takeaways, and tags), and serves them on an ad-optimized Next.js site with full source attribution. + +## Features + +- **Scheduled ingestion** — a `node-cron` background worker (in-process, starts with the web server) fetches feeds, dedupes articles, extracts full article bodies with `cheerio`, and synthesizes pending articles every 35 minutes (configurable). +- **LLM abstraction, three providers** — OpenAI (default: `gpt-4o-mini`), Anthropic (Claude 3.5 Sonnet / Haiku), and Ollama (local). Provider, model per-provider, API keys, and the synthesis prompt are all **stored in the database** and editable live from the admin UI — no code changes or restarts needed. +- **Keyless-first, fail-closed admin** — `/admin/settings` and the settings APIs require `x-admin-key: $ADMIN_API_KEY`. Empty/missing key → every admin endpoint returns 401 (fail-closed). Comparison is timing-safe. +- **AdSense-ready layout** — header leaderboard (728×90) on every page, in-feed ads every 3rd card, in-article ad after the first paragraph, and a sticky 300×250 / 300×600 sidebar. Ad units render as labeled placeholders until a real Publisher ID is configured. +- **Compliance & SEO** — "Sources analyzed: …" attribution on every article, `rel="nofollow external noopener"` on all source links, per-article `canonical` + OpenGraph tags, `sitemap.xml`, `robots.txt`, and four legal pages (`/about`, `/privacy-policy`, `/terms-of-service`, `/contact`). + +## Tech stack + +| Layer | Choice | +|---|---| +| Framework | Next.js 14 (App Router) + TypeScript (strict) + Tailwind CSS | +| Database / ORM | SQLite via Prisma (zero-ops local dev; Postgres switch documented below) | +| Scheduler | `node-cron` worker in the server process | +| Ingestion | `rss-parser` + `cheerio` (content extraction), native `fetch` | +| LLM clients | native `fetch` only (OpenAI, Anthropic, Ollama) — no SDK dependencies | +| Ad framework | Google AdSense (`` + `NEXT_PUBLIC_ADSENSE_*` env) | + +## Quickstart + +Requirements: **Node.js ≥ 18** (tested on v22), npm. + +```bash +git clone https://gitea.krisforbes.ca/krisf/maple-brief-aggregator.git +cd maple-brief-aggregator + +npm install + +# 1. Environment +cp .env.example .env +# then edit .env — at minimum set: +# DATABASE_URL (default is fine for SQLite: file:./dev.db) +# CRON_SCHEDULE (default "*/35 * * * *") +# NEXT_PUBLIC_SITE_URL (deployment URL, without trailing slash) + +# 2. Database — create tables and generate the Prisma client +npx prisma migrate deploy +# (in dev: npx prisma migrate dev) + +# 3. First ingest — pulls feeds, saves articles, synthesizes anything pending +npm run seed + +# 4. Build & run (production) +npm run build +npm start # http://localhost:3000 + +# — or development with hot reload: +npm run dev +``` + +On boot, the `src/instrumentation.ts` hook (Node.js runtime only) arms the worker, which immediately runs an initial ingest + synthesis pass and then repeats on `CRON_SCHEDULE`. The worker is idempotent (`runPipelinePass` is re-entrancy-guarded), so restarts and double-starts are safe. + +### Useful commands + +```bash +npx prisma studio # browse the DB +npx prisma migrate status # check applied migrations +npx prisma migrate diff --from-empty --to-schema-datamodel prisma/schema.prisma --script # preview SQL +npm run seed # manual ingest + synthesis pass +``` + +## Configuration + +All configuration is in `.env` (local, gitignored — only `.env.example` is committed): + +| Variable | Purpose | +|---|---| +| `DATABASE_URL` | Prisma connection string (default `file:./dev.db`) | +| `NEXT_PUBLIC_SITE_NAME` / `_URL` / `_DESCRIPTION` | Site metadata used in ``, sitemap, OG tags | +| `ADMIN_API_KEY` | Required admin key; sent as `x-admin-key` header. **Empty ⇒ all admin endpoints return 401.** | +| `FEED_USER_AGENT` | UA string used for feed/content fetches | +| `RUN_SCHEDULER` | `"true"`/`"false"` — kill switch for the cron worker (e.g. run pipeline only via `npm run seed`) | +| `CRON_SCHEDULE` | Worker cadence, default `*/35 * * * *` (spec: 30–60 min) | +| `MAX_SYNTH_PER_RUN` | LLM articles synthesized per pass (default 20) — throttles API cost | +| `FETCH_CONTENT` | `"true"` to download full article HTML for synthesis (makes LLM output accurate, ~few KB per article) | +| `HTTP_TIMEOUT_MS` | Per-request timeout for feed/content/LLM fetches | +| `NEXT_PUBLIC_ADSENSE_CLIENT_ID` | Your Publisher ID, e.g. `ca-pub-0123456789012345` | +| `NEXT_PUBLIC_ADSENSE_SLOT_*` | Ad-slot IDs for `HEADER` (728×90), `INFEED` (fluid), `INARTICLE` (fluid), `SIDEBAR` (300×250) | +| `OLLAMA_BASE_URL`, `OLLAMA_MODEL` | For the Ollama provider (see note below — must use HTTP URL) | + +> **Note:** `NEXT_PUBLIC_ADSENSE_*` values are inlined at **build time**. After changing them, re-run `npm run build` (in dev mode they pick up on reload). + +`OPENAI_API_KEY` / `ANTHROPIC_API_KEY` in `.env` are only fallback defaults — the admin UI / settings API are the canonical place for keys (see below), and LLM calls never read them from the environment. + +## LLM provider configuration + +1. Build with AdSense/site env set. +2. Open `http://localhost:3000/admin/settings`. +3. Enter the admin key (held in `sessionStorage` while the tab is open — never `localStorage`) — it must match `ADMIN_API_KEY` in `.env`. +4. Pick a provider: + - **OpenAI** — model default `gpt-4o-mini`; paste your `sk-...` key. + - **Anthropic** — model default `claude-3-5-haiku-20241022` (change to `claude-3-5-sonnet-latest` for higher quality); paste your key. + - **Ollama** — paste a **reachable `http://host:11434`** base URL and a model name that actually exists on that host (e.g. `llama3.1:8b`). Verify with "Test connection" — it lists the models Ollama reports. +5. Optionally edit the **synthesis prompt** (the default instructs the model to produce an original, neutral 3-paragraph rewrite plus headline, 3 takeaways, and tags as strict JSON). +6. Click **Save**. Settings persist in the DB (`Setting` table); the next cron pass (or a manual `npm run seed`) uses them immediately. + +### Synthesis pipeline + +For each article with status `fetched`: build a prompt from the article body → call the provider → parse the strict-JSON response (with a tolerant `safeParse`) → update the article (`synthesisJson`, `headline`, `takeaways`, `tags`, `provider`, status `synthesized`). Failures are recorded as status `failed` with the provider's error saved — the pipeline never crashes on a bad key or malformed response and retries those articles on the next pass. + +## Google AdSense setup + +1. Get your **Publisher ID** (`ca-pub-…`) from AdSense. +2. Create the four ad units in your AdSense account and set their slot IDs in `.env`: + + | Placement | Unit | Slot env var | + |---|---|---| + | Header (every page, below nav) | 728×90 | `NEXT_PUBLIC_ADSENSE_SLOT_HEADER` | + | In-feed (after every 3rd article card) | Fluid/auto | `NEXT_PUBLIC_ADSENSE_SLOT_INFEED` | + | In-article (after first paragraph) | Fluid/auto | `NEXT_PUBLIC_ADSENSE_SLOT_INARTICLE` | + | Sidebar (sticky) | 300×250 (or 300×600) | `NEXT_PUBLIC_ADSENSE_SLOT_SIDEBAR` | + +3. Set `NEXT_PUBLIC_ADSENSE_CLIENT_ID=ca-pub-…` and **rebuild** (`npm run build`). +4. Until every one of the five `NEXT_PUBLIC_ADSENSE_*` values is real, Ad units render as clearly-labeled placeholders (e.g. "AdUnit · 728x90 · awaiting setup") and **no `adsbygoogle` markup ships** — your pages contain zero ad code until you're published. + +## Feeds + +Starter (seeded on first boot into the `Feed` table): + +| Feed | Category | Status (verified 2026-08) | +|---|---|---| +| CBC News — Top Stories | top-stories | ⚠️ **404 — CBC has discontinued its public RSS endpoints** (verified from multiple vantage points). Kept in the seed so it lights up if CBC restores them; disable via `Feed.enabled` or remove the row. | +| CBC News — Canada | canada | ⚠️ same as above (404) | +| CTV News — National | national | ✅ live — Arc outbound feed `https://www.ctvnews.ca/arc/outboundfeeds/rss/` (the legacy `ctvnews-ca-…-rss-1.822009` URL 404s, so the live Arc endpoint is used instead) | +| Global News — Canada | canada | ✅ live — `https://globalnews.ca/canada/feed/` | +| The Globe and Mail — National | national | ✅ live — Arc outbound feed, `/category/canada/` | +| National Post — News | top-stories | ✅ live — `https://nationalpost.com/category/news/feed` | + +Dead feeds never block the pipeline — the worker logs and skips them, so 4/6 feeds live means a healthy, populated site. + +To add a feed, insert a `Feed` row (Prisma Studio or SQL) or extend `STARTER_FEEDS` in `src/data/feeds.ts`. All URLs must be RSS/Atom; Atom is supported by `rss-parser`. + +## API + +| Endpoint | Method | Auth | Purpose | +|---|---|---|---| +| `/api/worker/ping` | GET / POST | — | Arms the background worker (serverless keep-alive; on a long-lived Node server it is already armed at boot via `src/instrumentation.ts`) | +| `/api/status` | GET | admin key | Pipeline telemetry: article counts by status, per-feed last-fetched, synthesized counts by category | +| `/api/refresh` | POST | admin key | One-shot pipeline pass (ingest all feeds + synthesize pending articles); `maxDuration` 300s | +| `/api/settings` | GET / PUT | admin key | Read / persist LLM provider, per-provider models, API keys, Ollama base URL, synthesis prompt. **Keys are never returned** — responses carry `keySources` booleans and a masked last-4 only | +| `/api/settings/test` | POST | admin key | Connectivity test against the configured provider (lists available models when provider is Ollama) | +| `/api/admin/verify` | GET | admin key | Health check: confirms the presented key matches `ADMIN_API_KEY` | +| `/api/contact` | POST | — | Contact form; logged server-side (wire an email sink — see route docblock) | + +> **Admin key transport** — any of: `Authorization: Bearer *** `x-admin-key: ` header, `?key=` query param, or HTTP Basic auth with the key as password (any username). Comparison is constant-time; an unset `ADMIN_API_KEY` fails closed (all admin endpoints 401). + +## Database + +Prisma schema (`prisma/schema.prisma`): + +- `Feed` — id, name, url (unique), slug (unique), category, `siteName`, `enabled` +- `Article` — unique `externalId`, unique `slug`, `routePath` (unique), `feedUrl` (unique), source `title`/`url`/`image`/`publishedAt`, extracted `content`, `status` (`pending | fetched | synthesized | failed`), synthesis fields (`headline`, `takeaways[]`, `tags[]`, `synthesisJson`, `provider`), `synthesizedAt` +- `Setting` — key/value store for LLM provider config (keyed by model, e.g. `llm.model.openai`) + +Migrations live in `prisma/migrations/` (initial: `20260815183102_init`). Applied via `npx prisma migrate deploy` (prod) / `migrate dev` (dev). + +### Switching SQLite → PostgreSQL + +1. Change `DATABASE_URL` in `.env` to your Postgres string. +2. Change `provider = "sqlite"` → `"postgresql"` in `prisma/schema.prisma`. +3. `npx prisma migrate dev --name init` (fresh DB) and rebuild. No app code changes required — Prisma abstracts the driver. + +## Project structure (abridged) + +``` +prisma/ schema.prisma, migrations/, seed.ts (ingest+synthesis pass) +src/instrumentation.ts Next.js boot hook — arms the worker on process start (Node runtime only) +src/data/feeds.ts starter feed list + site sections +src/lib/ + db.ts Prisma client singleton + env.ts typed env access + format.ts HTML→text, excerpt helpers + auth/admin.ts x-admin-key verification (timing-safe, fail-closed) + llm/ providers: openai.ts, anthropic.ts, ollama.ts, parse.ts, types.ts + llm/engine.ts provider resolution + synthesizeArticle() + ingest/ feed.ts (RSS→rows), html.ts (content fetch), pipeline.ts (dedupe+persist) + worker/ cron.ts — node-cron loop, instrumentation.ts — boot hook + queries.ts read-model queries for pages +src/app/ + layout.tsx global shell (header ad on every page), metadata, sitemap, robots + page.tsx home (featured story + top-stories feed + sidebar) + [section]/ section feeds (top-stories, canada, national, all) + article/[slug]/ article detail (attribution, in-article ad, related, OG, canonical) + admin/settings/ protected admin UI (key gate + settings form) + about|contact|privacy-policy|terms-of-service|not-found/ legal + 404 + api/ routes above +src/components/ card, ads (AdUnit), layout (Header/Footer/Sidebar), legal +``` + +## Verification performed (2026-08-15) + +Real, executed checks — not assumptions: + +- `npx tsc --noEmit` — clean; `npm run build` — passes (20 routes, static + dynamic). +- Live ingest: **60 real Canadian articles** pulled across Global, Globe and Mail, National Post and CTV; full bodies extracted (up to ~12k chars); slugs clean and deduped. +- Synthesis happy path: real chain (provider → strict-JSON parse → DB update) verified — articles reach `synthesized` with headline/takeaways/tags/provider populated. +- Synthesis failure path: real OpenAI call with a placeholder key returned 401 → article cleanly marked `failed`, no crash, retriable next pass. +- Served app: all routes 200 (home, sections, article detail, legal, sitemap, robots, status/ping/settings endpoints). +- Admin: wrong/missing key → 401 on every admin endpoint (settings, status, refresh, verify); correct key → settings GET/PUT round-trips correctly (keys never echoed — `keySources` booleans + last-4 only); provider test endpoint responds. +- AdSense: with a test publisher ID, real `` markup SSRs with correct client/slot/format on every page (header), section pages (in-feed), and article pages (in-article + sidebar); with placeholder values, clean labeled placeholders and zero `adsbygoogle` markup. + +## Policy & content caveats (read before monetizing) + +- **LLM-rewritten news is a grey zone** for Google AdSense's scraped/reshaped-content policies, and for copyright (summary/derivative-work doctrine varies by jurisdiction). This project mitigates, not eliminates, that risk: every page carries source attribution, `nofollow` source links, and a visible LLM-rewrite disclosure, and the synthesis prompt instructs the model to stay factual and neutral. If you run with AdSense enabled, expect to hold the scale small, monitor your AdSense account for policy messages, and be prepared that account suspension is possible. +- **CBC feeds are dead** (documented above) — their 404s are expected and harmless; ignore `feed emitted 0 items` log lines for the `cbc-*` feeds. + +## License + +Internal project — see Gitea repo `krisf/maple-brief-aggregator`. diff --git a/next.config.mjs b/next.config.mjs new file mode 100644 index 0000000..e76926a --- /dev/null +++ b/next.config.mjs @@ -0,0 +1,19 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + reactStrictMode: true, + // RSS/Google AdSense scripts are injected safely by our own client + // components (see src/components/ads). Keep lint from failing the build + // on un-stulated style warnings while keeping full type checking on. + eslint: { + ignoreDuringBuilds: true, + }, + images: { + remotePatterns: [ + { protocol: 'https', hostname: '**' }, + { protocol: 'http', hostname: 'localhost' }, + { protocol: 'http', hostname: '127.0.0.1' }, + ], + }, +}; + +export default nextConfig; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..ea84675 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2648 @@ +{ + "name": "maple-brief-aggregator", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "maple-brief-aggregator", + "version": "1.0.0", + "dependencies": { + "@prisma/client": "^5.19.0", + "cheerio": "^1.0.0", + "next": "^14.2.35", + "node-cron": "^3.0.3", + "react": "18.3.1", + "react-dom": "18.3.1", + "rss-parser": "^3.13.0" + }, + "devDependencies": { + "@resvg/resvg-js": "^2.6.2", + "@types/node": "^20", + "@types/node-cron": "^3.0.11", + "@types/react": "^18", + "@types/react-dom": "^18", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.47", + "prisma": "^5.19.0", + "tailwindcss": "^3.4.13", + "tsx": "^4.19.1", + "typescript": "^5.6.2" + }, + "engines": { + "node": ">=18.17" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@next/env": { + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.35.tgz", + "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==" + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", + "integrity": "sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.33.tgz", + "integrity": "sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.33.tgz", + "integrity": "sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.33.tgz", + "integrity": "sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.33.tgz", + "integrity": "sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.33.tgz", + "integrity": "sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.33.tgz", + "integrity": "sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.33.tgz", + "integrity": "sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "14.2.33", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.33.tgz", + "integrity": "sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@prisma/client": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.22.0.tgz", + "integrity": "sha512-M0SVXfyHnQREBKxCgyo7sffrKttwE6R8PMq330MIUF0pTwjUhLbW84pFDlf06B27XyCR++VtjugEnIHdr07SVA==", + "hasInstallScript": true, + "engines": { + "node": ">=16.13" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/debug": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.22.0.tgz", + "integrity": "sha512-AUt44v3YJeggO2ZU5BkXI7M4hu9BF2zzH2iF2V5pyXT/lRTyWiElZ7It+bRH1EshoMRxHgpYg4VB6rCM+mG5jQ==", + "devOptional": true + }, + "node_modules/@prisma/engines": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.22.0.tgz", + "integrity": "sha512-UNjfslWhAt06kVL3CjkuYpHAWSO6L4kDCVPegV6itt7nD1kSJavd3vhgAEhjglLJJKEdJ7oIqDJ+yHk6qO8gPA==", + "devOptional": true, + "hasInstallScript": true, + "dependencies": { + "@prisma/debug": "5.22.0", + "@prisma/engines-version": "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2", + "@prisma/fetch-engine": "5.22.0", + "@prisma/get-platform": "5.22.0" + } + }, + "node_modules/@prisma/engines-version": { + "version": "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2.tgz", + "integrity": "sha512-2PTmxFR2yHW/eB3uqWtcgRcgAbG1rwG9ZriSvQw+nnb7c4uCr3RAcGMb6/zfE88SKlC1Nj2ziUvc96Z379mHgQ==", + "devOptional": true + }, + "node_modules/@prisma/fetch-engine": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.22.0.tgz", + "integrity": "sha512-bkrD/Mc2fSvkQBV5EpoFcZ87AvOgDxbG99488a5cexp5Ccny+UM6MAe/UFkUC0wLYD9+9befNOqGiIJhhq+HbA==", + "devOptional": true, + "dependencies": { + "@prisma/debug": "5.22.0", + "@prisma/engines-version": "5.22.0-44.605197351a3c8bdd595af2d2a9bc3025bca48ea2", + "@prisma/get-platform": "5.22.0" + } + }, + "node_modules/@prisma/get-platform": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.22.0.tgz", + "integrity": "sha512-pHhpQdr1UPFpt+zFfnPazhulaZYCUqeIcPpJViYoq9R+D/yw4fjE+CtnsnKzPYm0ddUbeXUzjGVGIRVgPDCk4Q==", + "devOptional": true, + "dependencies": { + "@prisma/debug": "5.22.0" + } + }, + "node_modules/@resvg/resvg-js": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js/-/resvg-js-2.6.2.tgz", + "integrity": "sha512-xBaJish5OeGmniDj9cW5PRa/PtmuVU3ziqrbr5xJj901ZDN4TosrVaNZpEiLZAxdfnhAe7uQ7QFWfjPe9d9K2Q==", + "dev": true, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@resvg/resvg-js-android-arm-eabi": "2.6.2", + "@resvg/resvg-js-android-arm64": "2.6.2", + "@resvg/resvg-js-darwin-arm64": "2.6.2", + "@resvg/resvg-js-darwin-x64": "2.6.2", + "@resvg/resvg-js-linux-arm-gnueabihf": "2.6.2", + "@resvg/resvg-js-linux-arm64-gnu": "2.6.2", + "@resvg/resvg-js-linux-arm64-musl": "2.6.2", + "@resvg/resvg-js-linux-x64-gnu": "2.6.2", + "@resvg/resvg-js-linux-x64-musl": "2.6.2", + "@resvg/resvg-js-win32-arm64-msvc": "2.6.2", + "@resvg/resvg-js-win32-ia32-msvc": "2.6.2", + "@resvg/resvg-js-win32-x64-msvc": "2.6.2" + } + }, + "node_modules/@resvg/resvg-js-android-arm-eabi": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-android-arm-eabi/-/resvg-js-android-arm-eabi-2.6.2.tgz", + "integrity": "sha512-FrJibrAk6v29eabIPgcTUMPXiEz8ssrAk7TXxsiZzww9UTQ1Z5KAbFJs+Z0Ez+VZTYgnE5IQJqBcoSiMebtPHA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-android-arm64": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-android-arm64/-/resvg-js-android-arm64-2.6.2.tgz", + "integrity": "sha512-VcOKezEhm2VqzXpcIJoITuvUS/fcjIw5NA/w3tjzWyzmvoCdd+QXIqy3FBGulWdClvp4g+IfUemigrkLThSjAQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-darwin-arm64": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-darwin-arm64/-/resvg-js-darwin-arm64-2.6.2.tgz", + "integrity": "sha512-nmok2LnAd6nLUKI16aEB9ydMC6Lidiiq2m1nEBDR1LaaP7FGs4AJ90qDraxX+CWlVuRlvNjyYJTNv8qFjtL9+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-darwin-x64": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-darwin-x64/-/resvg-js-darwin-x64-2.6.2.tgz", + "integrity": "sha512-GInyZLjgWDfsVT6+SHxQVRwNzV0AuA1uqGsOAW+0th56J7Nh6bHHKXHBWzUrihxMetcFDmQMAX1tZ1fZDYSRsw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-linux-arm-gnueabihf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm-gnueabihf/-/resvg-js-linux-arm-gnueabihf-2.6.2.tgz", + "integrity": "sha512-YIV3u/R9zJbpqTTNwTZM5/ocWetDKGsro0SWp70eGEM9eV2MerWyBRZnQIgzU3YBnSBQ1RcxRZvY/UxwESfZIw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-linux-arm64-gnu": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm64-gnu/-/resvg-js-linux-arm64-gnu-2.6.2.tgz", + "integrity": "sha512-zc2BlJSim7YR4FZDQ8OUoJg5holYzdiYMeobb9pJuGDidGL9KZUv7SbiD4E8oZogtYY42UZEap7dqkkYuA91pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-linux-arm64-musl": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-arm64-musl/-/resvg-js-linux-arm64-musl-2.6.2.tgz", + "integrity": "sha512-3h3dLPWNgSsD4lQBJPb4f+kvdOSJHa5PjTYVsWHxLUzH4IFTJUAnmuWpw4KqyQ3NA5QCyhw4TWgxk3jRkQxEKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-linux-x64-gnu": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-x64-gnu/-/resvg-js-linux-x64-gnu-2.6.2.tgz", + "integrity": "sha512-IVUe+ckIerA7xMZ50duAZzwf1U7khQe2E0QpUxu5MBJNao5RqC0zwV/Zm965vw6D3gGFUl7j4m+oJjubBVoftw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-linux-x64-musl": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-linux-x64-musl/-/resvg-js-linux-x64-musl-2.6.2.tgz", + "integrity": "sha512-UOf83vqTzoYQO9SZ0fPl2ZIFtNIz/Rr/y+7X8XRX1ZnBYsQ/tTb+cj9TE+KHOdmlTFBxhYzVkP2lRByCzqi4jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-win32-arm64-msvc": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-arm64-msvc/-/resvg-js-win32-arm64-msvc-2.6.2.tgz", + "integrity": "sha512-7C/RSgCa+7vqZ7qAbItfiaAWhyRSoD4l4BQAbVDqRRsRgY+S+hgS3in0Rxr7IorKUpGE69X48q6/nOAuTJQxeQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-win32-ia32-msvc": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-ia32-msvc/-/resvg-js-win32-ia32-msvc-2.6.2.tgz", + "integrity": "sha512-har4aPAlvjnLcil40AC77YDIk6loMawuJwFINEM7n0pZviwMkMvjb2W5ZirsNOZY4aDbo5tLx0wNMREp5Brk+w==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@resvg/resvg-js-win32-x64-msvc": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@resvg/resvg-js-win32-x64-msvc/-/resvg-js-win32-x64-msvc-2.6.2.tgz", + "integrity": "sha512-ZXtYhtUr5SSaBrUDq7DiyjOFJqBVL/dOBN7N/qmi/pO0IgiWW/f/ue3nbvu9joWE5aAKDoIzy/CxsY0suwGosQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, + "node_modules/@swc/helpers": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", + "dependencies": { + "@swc/counter": "^0.1.3", + "tslib": "^2.4.0" + } + }, + "node_modules/@types/node": { + "version": "20.19.43", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz", + "integrity": "sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==", + "dev": true, + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/node-cron": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/node-cron/-/node-cron-3.0.11.tgz", + "integrity": "sha512-0ikrnug3/IyneSHqCBeslAhlK2aBfYek1fGo4bP4QnZPmiqSGRK+Oy7ZMisLWkesffJvQ1cqAcBnJC+8+nxIAg==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.3.31", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.31.tgz", + "integrity": "sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/autoprefixer": { + "version": "10.5.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.4.tgz", + "integrity": "sha512-MaU0U/za7N3r6brxD4YB/l4NSrFzLPlANv6wEuQVaIPlD3L4W9rFcQPbL/EilY9BHhHvhfcz3gInDLrEtWT4EA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.28.6", + "caniuse-lite": "^1.0.30001806", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.14", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.14.tgz", + "integrity": "sha512-JyJ954WzuIR8/FFzX0o5krdSTrBAkcCSRfWSleRsIHSWV+cZe2FI1PKggVkFke1hBldRs+LRxUczzE9iPmgZww==", + "dev": true, + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", + "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "baseline-browser-mapping": "^2.11.12", + "caniuse-lite": "^1.0.30001809", + "electron-to-chromium": "^1.5.402", + "node-releases": "^2.0.53", + "update-browserslist-db": "^1.3.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001809", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz", + "integrity": "sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/cheerio": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz", + "integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "encoding-sniffer": "^0.2.1", + "htmlparser2": "^10.1.0", + "parse5": "^7.3.0", + "parse5-htmlparser2-tree-adapter": "^7.1.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^7.19.0", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=20.18.1" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.407", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.407.tgz", + "integrity": "sha512-4R8XgQOdfxexCd/u63lRm6wCHjECwI45MV9wxAs2ggtfWe2hwlo1ql97jKsju2IcJ+jFSTwBssyYoiWhh7mauQ==", + "dev": true + }, + "node_modules/encoding-sniffer": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", + "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.2", + "@esbuild/android-arm": "0.28.2", + "@esbuild/android-arm64": "0.28.2", + "@esbuild/android-x64": "0.28.2", + "@esbuild/darwin-arm64": "0.28.2", + "@esbuild/darwin-x64": "0.28.2", + "@esbuild/freebsd-arm64": "0.28.2", + "@esbuild/freebsd-x64": "0.28.2", + "@esbuild/linux-arm": "0.28.2", + "@esbuild/linux-arm64": "0.28.2", + "@esbuild/linux-ia32": "0.28.2", + "@esbuild/linux-loong64": "0.28.2", + "@esbuild/linux-mips64el": "0.28.2", + "@esbuild/linux-ppc64": "0.28.2", + "@esbuild/linux-riscv64": "0.28.2", + "@esbuild/linux-s390x": "0.28.2", + "@esbuild/linux-x64": "0.28.2", + "@esbuild/netbsd-arm64": "0.28.2", + "@esbuild/netbsd-x64": "0.28.2", + "@esbuild/openbsd-arm64": "0.28.2", + "@esbuild/openbsd-x64": "0.28.2", + "@esbuild/openharmony-arm64": "0.28.2", + "@esbuild/sunos-x64": "0.28.2", + "@esbuild/win32-arm64": "0.28.2", + "@esbuild/win32-ia32": "0.28.2", + "@esbuild/win32-x64": "0.28.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/htmlparser2": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", + "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "entities": "^7.0.1" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "dev": true, + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/next": { + "version": "14.2.35", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.35.tgz", + "integrity": "sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==", + "dependencies": { + "@next/env": "14.2.35", + "@swc/helpers": "0.5.5", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=18.17.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "14.2.33", + "@next/swc-darwin-x64": "14.2.33", + "@next/swc-linux-arm64-gnu": "14.2.33", + "@next/swc-linux-arm64-musl": "14.2.33", + "@next/swc-linux-x64-gnu": "14.2.33", + "@next/swc-linux-x64-musl": "14.2.33", + "@next/swc-win32-arm64-msvc": "14.2.33", + "@next/swc-win32-ia32-msvc": "14.2.33", + "@next/swc-win32-x64-msvc": "14.2.33" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/node-cron": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/node-cron/-/node-cron-3.0.3.tgz", + "integrity": "sha512-dOal67//nohNgYWb+nWmg5dkFdIwDm8EpeGYMekPMrngV3637lqnX0lbUcCtgibHTz6SEz7DAIjKvKDFYCnO1A==", + "dependencies": { + "uuid": "8.3.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", + "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz", + "integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prisma": { + "version": "5.22.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.22.0.tgz", + "integrity": "sha512-vtpjW3XuYCSnMsNVBjLMNkTj6OZbudcPPTPYHqX0CJfpcdWciI1dM8uHETwmDxxiqEwCIE6WvXucWUetJgfu/A==", + "devOptional": true, + "hasInstallScript": true, + "dependencies": { + "@prisma/engines": "5.22.0" + }, + "bin": { + "prisma": "build/index.js" + }, + "engines": { + "node": ">=16.13" + }, + "optionalDependencies": { + "fsevents": "2.3.3" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rss-parser": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/rss-parser/-/rss-parser-3.13.0.tgz", + "integrity": "sha512-7jWUBV5yGN3rqMMj7CZufl/291QAhvrrGpDNE4k/02ZchL0npisiYYqULF71jCEKoIiHvK/Q2e6IkDwPziT7+w==", + "dependencies": { + "entities": "^2.0.3", + "xml2js": "^0.5.0" + } + }, + "node_modules/rss-parser/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz", + "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "node_modules/tsx": { + "version": "4.23.12", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.12.tgz", + "integrity": "sha512-FDf4L4sYzKtzWYhU/Xm0AQFdTjdIxNo9ElTf2mxXM6k8YMHXzYUe4yODVaXP4V9uMFbVg8c0qyBccK2OOxb45Q==", + "dev": true, + "dependencies": { + "esbuild": "~0.28.0" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz", + "integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true + }, + "node_modules/update-browserslist-db": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.1.tgz", + "integrity": "sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "engines": { + "node": ">=18" + } + }, + "node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..ae6d648 --- /dev/null +++ b/package.json @@ -0,0 +1,45 @@ +{ + "name": "maple-brief-aggregator", + "version": "1.0.0", + "private": true, + "description": "Automated Canadian news aggregator with LLM content synthesis and Google AdSense integration.", + "scripts": { + "dev": "next dev", + "build": "prisma generate && next build", + "start": "next start", + "typecheck": "tsc --noEmit", + "db:generate": "prisma generate", + "db:push": "prisma db push", + "db:seed": "tsx prisma/seed.ts", + "db:studio": "prisma studio", + "migrate": "prisma migrate dev --name init" + }, + "prisma": { + "seed": "tsx prisma/seed.ts" + }, + "dependencies": { + "@prisma/client": "^5.19.0", + "cheerio": "^1.0.0", + "next": "^14.2.35", + "node-cron": "^3.0.3", + "react": "18.3.1", + "react-dom": "18.3.1", + "rss-parser": "^3.13.0" + }, + "devDependencies": { + "@resvg/resvg-js": "^2.6.2", + "@types/node": "^20", + "@types/node-cron": "^3.0.11", + "@types/react": "^18", + "@types/react-dom": "^18", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.47", + "prisma": "^5.19.0", + "tailwindcss": "^3.4.13", + "tsx": "^4.19.1", + "typescript": "^5.6.2" + }, + "engines": { + "node": ">=18.17" + } +} diff --git a/postcss.config.mjs b/postcss.config.mjs new file mode 100644 index 0000000..2ef30fc --- /dev/null +++ b/postcss.config.mjs @@ -0,0 +1,9 @@ +/** @type {import('postcss-load-config').Config} */ +const config = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; + +export default config; diff --git a/prisma/migrations/20260815183102_init/migration.sql b/prisma/migrations/20260815183102_init/migration.sql new file mode 100644 index 0000000..be4073e --- /dev/null +++ b/prisma/migrations/20260815183102_init/migration.sql @@ -0,0 +1,73 @@ +-- CreateTable +CREATE TABLE "Feed" ( + "id" TEXT NOT NULL PRIMARY KEY, + "name" TEXT NOT NULL, + "url" TEXT NOT NULL, + "slug" TEXT NOT NULL, + "category" TEXT NOT NULL DEFAULT 'news', + "enabled" BOOLEAN NOT NULL DEFAULT true, + "lastFetchedAt" DATETIME, + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" DATETIME NOT NULL +); + +-- CreateTable +CREATE TABLE "Article" ( + "id" TEXT NOT NULL PRIMARY KEY, + "feedId" TEXT, + "guid" TEXT, + "dedupKey" TEXT NOT NULL, + "sourceUrl" TEXT NOT NULL, + "canonicalUrl" TEXT NOT NULL, + "siteName" TEXT NOT NULL, + "title" TEXT NOT NULL, + "slug" TEXT NOT NULL, + "category" TEXT NOT NULL DEFAULT 'news', + "author" TEXT, + "publishedAt" DATETIME, + "image" TEXT, + "sources" TEXT, + "originalText" TEXT, + "headline" TEXT, + "body" TEXT, + "takeaways" TEXT, + "tags" TEXT, + "llmProvider" TEXT, + "synthesizedAt" DATETIME, + "status" TEXT NOT NULL DEFAULT 'fetched', + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" DATETIME NOT NULL, + CONSTRAINT "Article_feedId_fkey" FOREIGN KEY ("feedId") REFERENCES "Feed" ("id") ON DELETE SET NULL ON UPDATE CASCADE +); + +-- CreateTable +CREATE TABLE "Setting" ( + "key" TEXT NOT NULL PRIMARY KEY, + "value" TEXT NOT NULL, + "isSecret" BOOLEAN NOT NULL DEFAULT false, + "updatedAt" DATETIME NOT NULL +); + +-- CreateIndex +CREATE UNIQUE INDEX "Feed_name_key" ON "Feed"("name"); + +-- CreateIndex +CREATE UNIQUE INDEX "Feed_url_key" ON "Feed"("url"); + +-- CreateIndex +CREATE UNIQUE INDEX "Article_guid_key" ON "Article"("guid"); + +-- CreateIndex +CREATE UNIQUE INDEX "Article_canonicalUrl_key" ON "Article"("canonicalUrl"); + +-- CreateIndex +CREATE UNIQUE INDEX "Article_slug_key" ON "Article"("slug"); + +-- CreateIndex +CREATE INDEX "Article_category_publishedAt_idx" ON "Article"("category", "publishedAt"); + +-- CreateIndex +CREATE INDEX "Article_status_publishedAt_idx" ON "Article"("status", "publishedAt"); + +-- CreateIndex +CREATE INDEX "Article_dedupKey_idx" ON "Article"("dedupKey"); diff --git a/prisma/migrations/migration_lock.toml b/prisma/migrations/migration_lock.toml new file mode 100644 index 0000000..e5e5c47 --- /dev/null +++ b/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "sqlite" \ No newline at end of file diff --git a/prisma/schema.prisma b/prisma/schema.prisma new file mode 100644 index 0000000..5e23a17 --- /dev/null +++ b/prisma/schema.prisma @@ -0,0 +1,79 @@ +// MapleBrief — database schema +// SQLite by default for zero-config local dev. To switch provider: +// 1. change `provider` in datasource below +// 2. update DATABASE_URL in .env +// 3. run `prisma migrate dev` (see README) + +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "sqlite" + url = env("DATABASE_URL") +} + +// A configured news source (RSS/Atom feed). +model Feed { + id String @id @default(cuid()) + name String @unique + url String @unique + slug String + category String @default("news") + enabled Boolean @default(true) + lastFetchedAt DateTime? + articles Article[] + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +// A single synthesized news brief, built from one or more source stories. +model Article { + id String @id @default(cuid()) + feedId String? + feed Feed? @relation(fields: [feedId], references: [id], onDelete: SetNull) + + // Identity / dedup + guid String? @unique // feed item guid (primary dedup key) + dedupKey String // sha1 of normalized title (near-dup key) + sourceUrl String // original story URL (outbound link) + canonicalUrl String @unique // our canonical URL for this brief + siteName String // originating publisher, e.g. "CBC News" + + // Source metadata + title String // original headline (kept for reference) + slug String @unique + category String @default("news") // mapped from the feed category + author String? + publishedAt DateTime? + image String? // original thumbnail URL + sources String? // JSON string[] of contributing publisher names + + // Original content (kept for the "editor's notes" reference, NOT shown) + originalText String? + + // Synthesized (original) output produced by the LLM + headline String? // rewritten original headline + body String? // 3 paragraphs, \n\n separated + takeaways String? // JSON string[] of key takeaways + tags String? // JSON string[] + llmProvider String? // provider that produced this brief + synthesizedAt DateTime? + status String @default("fetched") // fetched | synthesized | failed + + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@index([category, publishedAt]) + @@index([status, publishedAt]) + @@index([dedupKey]) +} + +// Runtime configuration. The /admin/settings UI writes here; env vars act as +// fallbacks when a key is absent so the app boots with zero configuration. +model Setting { + key String @id + value String + isSecret Boolean @default(false) + updatedAt DateTime @updatedAt +} diff --git a/prisma/seed.ts b/prisma/seed.ts new file mode 100644 index 0000000..e0d9e0e --- /dev/null +++ b/prisma/seed.ts @@ -0,0 +1,30 @@ +/* eslint-disable no-console */ +/** + * Seeds the Feed table with the starter Canadian news feeds. + * + * npm run db:seed + * (also auto-invoked by `prisma migrate dev` via the "prisma.seed" hook.) + * + * Idempotent: existing feeds (matched by URL) are left untouched, new + * starter feeds are added. User-added feeds are never modified. + * + * tsx reads tsconfig.json paths, so the "@/..." aliases resolve. + */ +import { PrismaClient } from '@prisma/client'; +import { seedFeedsIfEmpty } from '../src/lib/ingest/seed'; + +async function main() { + const prisma = new PrismaClient(); + try { + const before = await prisma.feed.count(); + const { created, total } = await seedFeedsIfEmpty(); + console.log(`[seed] feeds: ${before} -> ${total} (${created} created)`); + } finally { + await prisma.$disconnect(); + } +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/public/favicon-64.png b/public/favicon-64.png new file mode 100644 index 0000000000000000000000000000000000000000..d107cc4a1ad07878cbdd35abed5d99f62d19cc01 GIT binary patch literal 1557 zcmV+w2I~2VP)MAAu5*K}2Nb=75 zgtMDxAHw(^#+BTzuqDQ;;0Xc4hzmCs*OdDWFtdDKx`y z+DIA5tUTZf@M8iOqL@_h*O1UC;Ff_GV*upLA}I_U_UIe^{*LSQdd*DPwlmt25+GUy z?q;8uNIc!#;ET<5#!^MM6rAF;QBX*nSvx3f_j+P;_FNi4@NQ9Lq>#{N;J)u+9<|YQWiOP$qf&$I-w_X3T3Bp9uS|XHE5f05CUIl ztm6&V%=lbmoxPCKHOEJ54N^37x@v=BzL=7*C!L84=yc9KFi_xQaf27zckyg%lMlyr z#u8(RkJlPJ+uG!Z8|Qe~*BMDftHCjFlFXzF&dge;ojgBDZt#_K$^+i>mFC7wFCfPF zYIBpjUBvIx32}wCCEzD^&02mDyiB$-qXS}!sAF8uQVv2Of!PU5Ck6@#_-B?;H)Dc` zFx&zii`R87>;@!=p+trVh&3~M&XWLpA>)Pub*kkjmpaC~A!A<|iQv5RG%R12B1RGk zngLqjj#~u3&v_n;>zpyiK?pqLYrME|mir^mKSIjeAtRnk*MbIve}#;kKO{2&iGak{t8iDB_#zT{g_|Osm7^L*RiZre(&}!#yN0(~JsVMj!w!Gya@T`BOUO zim%aibuz&X1jV)oZR zjnV#G9{4($=B>{1N6m!YfXka9W8wy-cQ|@vR8R8%W&PSdNb2Kn6$93*?F@1%F zzTj5-ewDJ^mBeHw6uqt(Xg9N_-%4b1hcT#%xIb6C@W>)-85sD2|u5XST{GLa20qFf#u*Q z2_|BUGeuinRz(5p=5U0fDS^lgSL_UMTkt#r(vg|9mVr~r`mjWopU`HvqO5wSabCrc z!jZ%5bu&}Zx8Jsnnr#Nom}Ar2iZ!Q#2WOI*z3zY)tgw0K;Q4F!PSGLx{|p=<8D^jt ztk>%`-C*z==iDVJB;?J_N^mO1%bH&85AOgx@n&%r^y*=I_=o|#uhY34&`Zv&Ehz(L zZTc$k<>TpL7m_!NBn?21?)FDJ4sdVu`#XroC0%o7ku&>$gX2ujn?*?1GKI%?`=cEy zk6{F4_d>&UI!_sTLgJzs>v?|sPvFJhb6zvFJ?M|-{+|CEp--!OTYGQP00000NkvXX Hu0mjfjBxh> literal 0 HcmV?d00001 diff --git a/public/icon-192.png b/public/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..f21e23de0f5f96ca055bcc93457ae6a2454b4be9 GIT binary patch literal 11969 zcmX|nWn5Hk&^O&kiF63aBHi8Ht4Mc9H%KlejdX(x3yPq0OS5!`ba#pLk_!vGdq3~< zdp?|VKAbb>nrr4iam`HJJ8cz0JZd}?6cj==RYe`-v+KVL2Mc-ES#`liLE(;7QF zyXC`3{9lJzUTmAu9xY-0*^4!;D_hWc@`(Q4U%#9J45 zuXtD7e{$jf{i)MtRlnv2dc@Y7KV5X-kl?Va_{YWMB|!W=un42uPcR9%-qw7VSOUg4 z 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

eIn>oA(IBI4~ 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 literal 0 HcmV?d00001 diff --git a/public/logo-mark.svg b/public/logo-mark.svg new file mode 100644 index 0000000..366128f --- /dev/null +++ b/public/logo-mark.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/logo-wordmark-dark.png b/public/logo-wordmark-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..9a4b895150a0e57a96a04899a83171882433c50c GIT binary patch literal 9590 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 UVx+?Y63dX}rIn@1B}{_<2k1+GUH||9 literal 0 HcmV?d00001 diff --git a/public/logo.png b/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..4b99fc83cb8b34545b0c8deecc4485ce6bb0dc7a GIT binary patch literal 32801 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

eIn>oA(IBI4~ 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 literal 0 HcmV?d00001 diff --git a/public/logo.svg b/public/logo.svg new file mode 100644 index 0000000..f3c5ec3 --- /dev/null +++ b/public/logo.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/og-image.png b/public/og-image.png new file mode 100644 index 0000000000000000000000000000000000000000..279c3c2c771473c90af1319aa6f564e11cbe26a0 GIT binary patch literal 54610 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 bRTja&9JgK{NSXoF6(b$j_%r*c*`@yrSZ5hc literal 0 HcmV?d00001 diff --git a/scripts/assets/leaf_white.png b/scripts/assets/leaf_white.png new file mode 100644 index 0000000000000000000000000000000000000000..9f24c489bab1f718a05120e2709f5e6b66275212 GIT binary patch literal 41016 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

  • 7nbgG#=&9TwgmnWn;%d=bZmTJ(*v!yhWk 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

    8<82 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 gbasAxWNgycCCO9E7e s.slug === section); + if (!known) notFound(); + + const page = Math.max(1, parseInt(searchParams.page ?? '1', 10) || 1); + const PER = 24; + const [articles, tags] = await Promise.all([ + getPublishedArticles(section, PER, (page - 1) * PER), + getTagList(10), + ]); + + return ( + <> +

    +

    + {known.label} +

    +
    +
    + {articles.length === 0 ? ( +

    + Nothing in {known.label} yet — the worker will fill this in. +

    + ) : ( +
    + {interleave(articles, 3)} +
    + )} +
    + +
    +
    + + ); +} + +function interleave( + cards: Awaited>, + every: number, +): ReactNode[] { + const out: ReactNode[] = []; + cards.forEach((card, i) => { + out.push(); + if ((i + 1) % every === 0) out.push(); + }); + return out; +} diff --git a/src/app/about/page.tsx b/src/app/about/page.tsx new file mode 100644 index 0000000..90cf5e3 --- /dev/null +++ b/src/app/about/page.tsx @@ -0,0 +1,52 @@ +import type { Metadata } from 'next'; +import Link from 'next/link'; +import { env } from '@/lib/env'; + +export const metadata: Metadata = { + title: 'About', + description: 'What MapleBrief is: an automated, AI-assisted digest of Canadian news with full attribution.', + alternates: { canonical: '/about' }, +}; + +export default function AboutPage() { + return ( +
    +

    About MapleBrief

    + +
    +

    + {env.siteName} is a small, independent Canadian news-digest project. + Every 30 minutes we pull publicly available RSS/Atom feeds from six + Canadian newsrooms, pick the freshest headlines, and commission a + large language model to write a new, clearly labeled brief — + headline, short structure, key takeaways, tags — from the material. +

    +

    + What we do not do: copy articles verbatim, hide where + the material came from, or pretend a machine wrote it in the newsroom. + Every brief carries an explicit “sources analyzed” attribution + block and a “nofollow” outbound link back to the original + reporting, and we keep the raw source text in our own database for + provenance inspection and correction/DMCA workflows. +

    +

    + The site is supported by advertising through Google AdSense, and we + have written a{' '} + + Privacy Policy + {' '} + to describe exactly how cookies and DART tracking work here. +

    +

    + If you believe a brief misrepresents the original reporting, or you + are a rights holder asking for attribution to be handled differently, + please use the{' '} + + contact page + {' '} + — we read every issue. +

    +
    +
    + ); +} diff --git a/src/app/admin/settings/page.tsx b/src/app/admin/settings/page.tsx new file mode 100644 index 0000000..77dc22f --- /dev/null +++ b/src/app/admin/settings/page.tsx @@ -0,0 +1,17 @@ +import type { Metadata } from 'next'; +import AdminGate from '@/components/admin/AdminGate'; +import SettingsForm from '@/components/admin/SettingsForm'; + +export const metadata: Metadata = { + title: 'Admin', + // Never let search engines index the admin area + robots: { index: false, follow: false }, +}; + +export default function AdminSettingsPage() { + return ( + + + + ); +} diff --git a/src/app/api/admin/verify/route.ts b/src/app/api/admin/verify/route.ts new file mode 100644 index 0000000..716ae56 --- /dev/null +++ b/src/app/api/admin/verify/route.ts @@ -0,0 +1,16 @@ +import { NextResponse } from 'next/server'; +import { isAuthorized } from '@/lib/auth/admin'; + +export const runtime = 'nodejs'; + +/** + * Used by the admin UI gate: confirm an admin key before rendering the form. + * Note: the actual key is only ever sent in request headers, never stored in + * localStorage, and the gate keeps it in sessionStorage for the browser tab. + */ +export async function GET(req: Request) { + if (isAuthorized(req as unknown as Parameters[0])) { + return NextResponse.json({ ok: true }); + } + return NextResponse.json({ ok: false, error: 'unauthorized' }, { status: 401 }); +} diff --git a/src/app/api/contact/route.ts b/src/app/api/contact/route.ts new file mode 100644 index 0000000..9e89400 --- /dev/null +++ b/src/app/api/contact/route.ts @@ -0,0 +1,44 @@ +import { NextRequest, NextResponse } from 'next/server'; + +export const runtime = 'nodejs'; +export const dynamic = 'force-dynamic'; + +interface ContactPayload { + email?: string; + topic?: string; + url?: string; + message?: string; +} + +/** + * Placeholder contact sink. + * + * Product wiring options (in order of least effort): + * 1. Email: swap the `console.log` for `nodemailer` or an external + * transactional API (Resend, Postmark, SendGrid). + * 2. Form service: point the fetch at Formspree/Getform instead. + * + * The admin UI replies to itself and there is currently no secret channel; + * in production add a rate limit (e.g., 5/hour/IP) and CAPTCHA. + */ +export async function POST(req: NextRequest) { + let body: ContactPayload; + try { + body = await req.json(); + } catch { + return NextResponse.json({ ok: false, error: 'invalid JSON' }, { status: 400 }); + } + + if (!body.email || !body.message) { + return NextResponse.json( + { ok: false, error: 'email and message are required' }, + { status: 400 }, + ); + } + + // Sensitive-ish: keep payload out of stdout logs in DEBUG mode. + console.log(`[contact] topic=${body.topic ?? 'other'} from=${body.email} url=${body.url ?? '-'}`); + console.log(`[contact] message: ${String(body.message).slice(0, 500)}`); + + return NextResponse.json({ ok: true }); +} diff --git a/src/app/api/refresh/route.ts b/src/app/api/refresh/route.ts new file mode 100644 index 0000000..60d9605 --- /dev/null +++ b/src/app/api/refresh/route.ts @@ -0,0 +1,32 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { runPipelinePass } from '@/lib/worker/cron'; +import { isAuthorized } from '@/lib/auth/admin'; + +export const runtime = 'nodejs'; +export const dynamic = 'force-dynamic'; +// Ingestion (6+ feeds) + a batch of LLM calls can take a while. +export const maxDuration = 300; + +/** + * Admin-triggered one-shot pipeline pass: ingest all enabled feeds, then + * synthesize pending articles. + * + * Auth: requires ADMIN_API_KEY via ?key=, the `x-admin-key` header, or + * Basic auth with any username. + */ +export async function POST(req: NextRequest) { + if (!(await isAuthorized(req))) { + return NextResponse.json({ error: 'unauthorized' }, { status: 401 }); + } + + // One pass at a time; run in background so the client can connect-timeout. + runPipelinePass('api-refresh').catch((e) => + console.error('[refresh] unhandled:', e), + ); + + return NextResponse.json({ + started: true, + message: 'Pipeline pass started in background.', + time: new Date().toISOString(), + }); +} diff --git a/src/app/api/settings/route.ts b/src/app/api/settings/route.ts new file mode 100644 index 0000000..822318a --- /dev/null +++ b/src/app/api/settings/route.ts @@ -0,0 +1,138 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { isAuthorized } from '@/lib/auth/admin'; +import { prisma } from '@/lib/db'; +import { + getLlmSettings, + upsertSetting, + SETTING_KEYS, +} from '@/lib/llm'; +import type { LlmProviderId } from '@/lib/settings'; + +export const runtime = 'nodejs'; +export const dynamic = 'force-dynamic'; + +const PROVIDERS: LlmProviderId[] = ['openai', 'anthropic', 'ollama']; + +const PRO_MODEL_KEYS: Record = { + openai: 'llm.model.openai', + anthropic: 'llm.model.anthropic', + ollama: 'llm.model.ollama', +}; + +/** Last-4 for display only — full secrets never leave the server. */ +function last4(secret: string): string { + return secret.length >= 4 ? `…${secret.slice(-4)}` : ''; +} + +function isProvider(v: unknown): v is LlmProviderId { + return v === 'openai' || v === 'anthropic' || v === 'ollama'; +} + +async function readSetting(key: string): Promise { + const row = await prisma.setting.findUnique({ where: { key } }); + return row?.value ?? null; +} + +interface SettingsBody { + provider?: unknown; + model?: unknown; // legacy single-model field + models?: Partial>; + apiKeys?: { openai?: unknown; anthropic?: unknown }; + ollamaBase?: unknown; + synthesisPrompt?: unknown; +} + +async function toResponseBody() { + const s = await getLlmSettings(); + const [dbProvider, dbModel, dbOpenai, dbAnthropic] = await Promise.all([ + readSetting(SETTING_KEYS.provider), + readSetting(SETTING_KEYS.model), + readSetting(SETTING_KEYS.openaiKey), + readSetting(SETTING_KEYS.anthropicKey), + ]); + const models = {} as Record; + for (const p of PROVIDERS) models[p] = (await readSetting(PRO_MODEL_KEYS[p])) ?? s.model; + // A legacy single-model override applies to the provider it was set for. + const legacyOwner = isProvider(dbProvider) ? dbProvider : 'openai'; + if (dbModel) models[legacyOwner] = dbModel; + + return { + settings: { + provider: s.provider, + models, + apiKeys: { openai: '', anthropic: '' }, // secrets are never echoed + ollamaBase: s.ollamaBaseUrl, + synthesisPrompt: s.synthesisPrompt, + }, + keySources: { + openai: Boolean(dbOpenai), + anthropic: Boolean(dbAnthropic), + ollama: true, + }, + keys: { + openaiLast4: last4(s.openaiApiKey), + anthropicLast4: last4(s.anthropicApiKey), + }, + }; +} + +export async function GET(req: NextRequest) { + if (!isAuthorized(req)) { + return NextResponse.json({ error: 'unauthorized' }, { status: 401 }); + } + return NextResponse.json(await toResponseBody()); +} + +export async function PUT(req: NextRequest) { + if (!isAuthorized(req)) { + return NextResponse.json({ error: 'unauthorized' }, { status: 401 }); + } + + const body = (await req.json().catch(() => null)) as SettingsBody | null; + if (!body) return NextResponse.json({ error: 'invalid json' }, { status: 400 }); + + // Provider + if (body.provider !== undefined) { + if (!isProvider(body.provider)) { + return NextResponse.json( + { error: 'provider must be openai | anthropic | ollama' }, + { status: 400 }, + ); + } + await upsertSetting(SETTING_KEYS.provider, body.provider); + } + const active = + (body.provider as LlmProviderId | undefined) ?? (await getLlmSettings()).provider; + + // Models — per-provider, with single-model fallback for simple clients + if (body.models && typeof body.models === 'object') { + for (const p of PROVIDERS) { + const m = String(body.models[p] ?? '').trim(); + if (m) { + await upsertSetting(PRO_MODEL_KEYS[p], m); + if (p === active) await upsertSetting(SETTING_KEYS.model, m); + } + } + } else if (typeof body.model === 'string' && body.model.trim()) { + await upsertSetting(SETTING_KEYS.model, body.model.trim()); + await upsertSetting(PRO_MODEL_KEYS[active], body.model.trim()); + } + + // API keys (secrets; blank from the UI means "keep using the env var") + if (body.apiKeys) { + const openaiKey = String(body.apiKeys.openai ?? '').trim(); + const anthropicKey = String(body.apiKeys.anthropic ?? '').trim(); + if (openaiKey) await upsertSetting(SETTING_KEYS.openaiKey, openaiKey, true); + if (anthropicKey) await upsertSetting(SETTING_KEYS.anthropicKey, anthropicKey, true); + } + + // Ollama base URL + const ollamaBase = String(body.ollamaBase ?? '').trim(); + if (ollamaBase) await upsertSetting(SETTING_KEYS.ollamaBase, ollamaBase); + + // Synthesis prompt + const prompt = String(body.synthesisPrompt ?? '').trim(); + if (prompt) await upsertSetting(SETTING_KEYS.synthesisPrompt, prompt); + + return NextResponse.json(await toResponseBody()); +} diff --git a/src/app/api/settings/test/route.ts b/src/app/api/settings/test/route.ts new file mode 100644 index 0000000..a195e6c --- /dev/null +++ b/src/app/api/settings/test/route.ts @@ -0,0 +1,50 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { isAuthorized } from '@/lib/auth/admin'; +import { resolveLlm } from '@/lib/llm'; +import { OllamaProvider } from '@/lib/llm/ollama'; + +export const runtime = 'nodejs'; +export const dynamic = 'force-dynamic'; +export const maxDuration = 60; + +/** + * Connectivity probe for the active (or requested) provider. + * - ollama: GET /api/tags + * - openai/anthropic: a 4-token chat completion + */ +export async function POST(req: NextRequest) { + if (!isAuthorized(req)) return NextResponse.json({ error: 'unauthorized' }, { status: 401 }); + + const body = (await req.json().catch(() => ({}))) as { provider?: string }; + const providerId = body.provider; + + try { + if (providerId === 'ollama') { + const { provider: settings } = { provider: undefined }; + const { instance } = await resolveLlm(); + if (instance instanceof OllamaProvider) { + return NextResponse.json({ + ok: await (instance as OllamaProvider).ping(), + provider: 'ollama', + }); + } + // fall through to generic below if active isn't ollama + } + + const { instance } = await resolveLlm(); + const result = await instance.synthesize({ + sourceText: 'A test event: maple syrup production was reported stable this season.', + sources: ['Test Source'], + systemPrompt: + 'You are a test probe. Reply with a JSON object: {"headline":"Test","body":"ok \\n\\nok \\n\\nok","takeaways":["test"],"tags":["test"]}', + }); + return NextResponse.json({ + ok: true, + provider: result.provider, + model: result.model, + tookMs: result.tookMs, + }); + } catch (err) { + return NextResponse.json({ ok: false, error: (err as Error).message }, { status: 200 }); + } +} diff --git a/src/app/api/status/route.ts b/src/app/api/status/route.ts new file mode 100644 index 0000000..32a587d --- /dev/null +++ b/src/app/api/status/route.ts @@ -0,0 +1,40 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { isAuthorized } from '@/lib/auth/admin'; +import { prisma } from '@/lib/db'; + +export const runtime = 'nodejs'; +export const dynamic = 'force-dynamic'; + +/** + * Pipeline telemetry for the admin dashboard: article counts by status, + * feeds with last-fetch times, recent synthesis activity. + */ +export async function GET(req: NextRequest) { + if (!(await isAuthorized(req))) { + return NextResponse.json({ error: 'unauthorized' }, { status: 401 }); + } + + const [total, fetched, synthesized, failed, feedsByCategory] = await Promise.all([ + prisma.article.count(), + prisma.article.count({ where: { status: 'fetched' } }), + prisma.article.count({ where: { status: 'synthesized' } }), + prisma.article.count({ where: { status: 'failed' } }), + prisma.feed.findMany({ orderBy: { name: 'asc' } }), + ]); + + const categories = await prisma.article + .groupBy({ by: ['category'], _count: { _all: true }, where: { status: 'synthesized' } }) + .then((rows) => rows.map((r) => ({ category: r.category, count: r._count._all }))); + + return NextResponse.json({ + articles: { total, fetched, synthesized, failed }, + feeds: feedsByCategory.map((f) => ({ + name: f.name, + category: f.category, + enabled: f.enabled, + lastFetchedAt: f.lastFetchedAt, + })), + categories, + time: new Date().toISOString(), + }); +} diff --git a/src/app/api/worker/ping/route.ts b/src/app/api/worker/ping/route.ts new file mode 100644 index 0000000..fe487ba --- /dev/null +++ b/src/app/api/worker/ping/route.ts @@ -0,0 +1,27 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { initWorker } from '@/lib/worker/cron'; + +export const runtime = 'nodejs'; +export const dynamic = 'force-dynamic'; + +/** + * Keep-alive endpoint for the background worker. + * + * In long-lived Node deployments (`next start`, a container, or a VPS) the + * first hit to / initializes the node-cron scheduler; subsequent hits are + * no-ops. Call it on your launch script / healthcheck: + * + * curl -sX POST http://localhost:3000/api/worker/ping + * + * When RUN_SCHEDULER=true the worker then ingests + synthesizes automatically + * on CRON_SCHEDULE. On cold-start platforms (e.g. free serverless) drive + * ingestion with the `/api/refresh` route from an external timer instead. + */ +export async function POST(_req: NextRequest) { + const status = initWorker(); + return NextResponse.json({ status, time: new Date().toISOString() }); +} + +export async function GET(_req: NextRequest) { + return NextResponse.json({ status: initWorker() }); +} diff --git a/src/app/article/[slug]/page.tsx b/src/app/article/[slug]/page.tsx new file mode 100644 index 0000000..eb217e7 --- /dev/null +++ b/src/app/article/[slug]/page.tsx @@ -0,0 +1,197 @@ +import type { Metadata } from 'next'; +import Link from 'next/link'; +import { notFound } from 'next/navigation'; +import { getArticleFull, getRelatedArticles } from '@/lib/queries'; +import SourceAttribution from '@/components/SourceAttribution'; +import RelatedArticles from '@/components/RelatedArticles'; +import { InArticleAd, SidebarAd } from '@/components/ads/placements'; +import { env } from '@/lib/env'; +import { formatFull } from '@/lib/format'; +import { safeParse } from '@/lib/llm/parse'; +import { SECTIONS } from '@/data/feeds'; + +export const dynamic = 'force-dynamic'; + +interface ArticleData { + id: string; + slug: string; + title: string; + headline: string | null; + body: string | null; + takeaways: string | null; + tags: string | null; + siteName: string; + category: string; + author: string | null; + publishedAt: Date | null; + synthesizedAt: Date | null; + sourceUrl: string; + canonicalUrl: string; + image: string | null; + sources: string | null; + originalText: string | null; + llmProvider: string | null; +} + +export async function generateMetadata({ + params, +}: { + params: { slug: string }; +}): Promise { + const a = await getArticleFull(params.slug); + if (!a) return { title: 'Briefing not found' }; + const title = a.headline ?? a.title; + const description = a.body?.split('\n\n')[0]?.slice(0, 160) ?? ''; + const sectionLabel = SECTIONS.find((s) => s.slug === a.category)?.label ?? 'Briefing'; + return { + title, + description, + alternates: { canonical: a.canonicalUrl }, + openGraph: { + type: 'article', + title, + description, + url: a.canonicalUrl, + siteName: env.siteName, + publishedTime: a.publishedAt?.toISOString(), + modifiedTime: a.synthesizedAt?.toISOString(), + section: sectionLabel, + tags: a.tags ? safeParse(a.tags).slice(0, 5) : undefined, + images: a.image + ? [{ url: a.image, width: 1200, height: 630, alt: title }] + : [{ url: '/og-image.png', width: 1200, height: 630, alt: 'MapleBrief' }], + authors: [a.siteName], + }, + twitter: { + card: 'summary_large_image', + title, + description, + images: a.image ? [a.image] : undefined, + }, + }; +} + +export default async function ArticlePage({ + params, +}: { + params: { slug: string }; +}) { + const a = await getArticleFull(params.slug); + if (!a || !a.body) notFound(); + + const paragraphs = a.body.split('\n\n').map((p) => p.trim()).filter(Boolean); + const takeaways = a.takeaways ? safeParse(a.takeaways) : []; + const tags = a.tags ? safeParse(a.tags) : []; + const relatedItems = await getRelatedArticles(a.slug, 6); + const title = a.headline ?? a.title; + + return ( +
    +
    + {/* Article column */} +
    +
    +

    + + {SECTIONS.find((s) => s.slug === a.category)?.label ?? 'Briefing'} + + via {a.siteName} + {a.publishedAt && ( + · {formatFull(a.publishedAt.toISOString())} + )} +

    +

    + {title} +

    +

    + Original headline:{' '} + “{a.title}” — {a.siteName} +

    +
    + + {a.image && ( + // eslint-disable-next-line @next/next/no-img-element + {title} + )} + + {takeaways.length > 0 && ( +
    +

    + Key takeaways +

    +
      + {takeaways.map((t, i) => ( +
    • + + {t} +
    • + ))} +
    +
    + )} + +
    + {paragraphs.slice(0, 1).map((p, i) => ( +

    {p}

    + ))} + + {/* In-article ad: between rewritten paragraphs 1 and 2 */} + + + {paragraphs.slice(1).map((p, i) => ( +

    {p}

    + ))} +
    + + + + {tags.length > 0 && ( +
    + {tags.map((t) => ( + + #{t} + + ))} +
    + )} + +

    + Rewrite provenance: {a.llmProvider ?? 'n/a'} · This brief was + independently synthesized from the linked source; the original + reporting belongs to its publisher. Read the original:{' '} + + {a.siteName} + + . +

    + + +
    + + {/* Sidebar */} + +
    +
    + ); +} diff --git a/src/app/contact/page.tsx b/src/app/contact/page.tsx new file mode 100644 index 0000000..3dda023 --- /dev/null +++ b/src/app/contact/page.tsx @@ -0,0 +1,29 @@ +import type { Metadata } from 'next'; +import Link from 'next/link'; +import ContactForm from '@/components/ContactForm'; + +export const metadata: Metadata = { + title: 'Contact', + description: 'Contact MapleBrief: corrections, legal DMCA inquiries, and advertising.', + alternates: { canonical: '/contact' }, +}; + +export default function ContactPage() { + return ( +
    +

    Contact

    +

    + Editorial corrections, DMCA / copyright notices, and AdSense partner + inquiries are all welcome. Legal requests should include the URL of the + affected brief and the original source URL. +

    + + + +

    + Prefer email? See the about page{' '} + for the masthead, and this form returns the same destination. +

    +
    + ); +} diff --git a/src/app/globals.css b/src/app/globals.css new file mode 100644 index 0000000..03f1617 --- /dev/null +++ b/src/app/globals.css @@ -0,0 +1,39 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + --ink: #161614; +} + +html { + scroll-behavior: smooth; +} + +body { + @apply bg-ink-50 text-ink-900 antialiased; +} + +::selection { + @apply bg-maple-200 text-ink-950; +} + +/* Prose-like base for article bodies */ +.article-prose p { + @apply mb-5 text-[1.0625rem] leading-[1.75] text-ink-800; +} + +.article-prose p:first-of-type::first-letter { + @apply float-left mr-2 font-display text-5xl leading-[0.9] font-bold text-maple-600; +} + +/* Screenshot-like shimmer for ad placeholders before AdSense loads */ +@keyframes shimmer { + 0% { background-position: -400px 0; } + 100% { background-position: 400px 0; } +} +.ad-shimmer { + background: linear-gradient(90deg, #e6e6e3 25%, #f4f4f3 50%, #e6e6e3 75%); + background-size: 800px 100%; + animation: shimmer 1.6s infinite linear; +} diff --git a/src/app/layout.tsx b/src/app/layout.tsx new file mode 100644 index 0000000..b695543 --- /dev/null +++ b/src/app/layout.tsx @@ -0,0 +1,68 @@ +import type { Metadata } from 'next'; +import './globals.css'; +import Header, { SectionPills } from '@/components/layout/Header'; +import { HeaderAd } from '@/components/ads/placements'; +import Footer from '@/components/layout/Footer'; +import { env } from '@/lib/env'; + +export const metadata: Metadata = { + metadataBase: new URL(env.siteUrl), + title: { + default: `${env.siteName} — Synthesized Canadian news briefings`, + template: `%s · ${env.siteName}`, + }, + description: env.siteDescription, + alternates: { canonical: '/' }, + icons: { + icon: [ + { url: '/favicon-64.png', sizes: '64x64', type: 'image/png' }, + ], + apple: '/icon-192.png', + }, + openGraph: { + type: 'website', + siteName: env.siteName, + title: `${env.siteName} — Synthesized Canadian news briefings`, + description: env.siteDescription, + url: env.siteUrl, + images: [{ url: '/og-image.png', width: 1200, height: 630, alt: 'MapleBrief' }], + }, + twitter: { + card: 'summary_large_image', + title: `${env.siteName} — Synthesized Canadian news briefings`, + description: env.siteDescription, + images: ['/og-image.png'], + }, + robots: { + index: true, + follow: true, + googleBot: { + index: true, + follow: true, + 'max-image-preview': 'large', + 'max-snippet': -1, + }, + }, +}; + +export default function RootLayout({ children }: { children: React.ReactNode }) { + return ( + + + + Skip to content + +
    + + +
    + {children} +
    +