diff --git a/.github/ISSUE_TEMPLATE/bug_koding.md b/.github/ISSUE_TEMPLATE/bug_koding.md new file mode 100644 index 0000000..343fc0a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_koding.md @@ -0,0 +1,33 @@ +--- +name: 🐞 Bug (Divisi Koding / Bounty) +about: Temuan bug dari event atau kontribusi divisi Koding +title: '[BUG] ' +labels: bug, koding +assignees: '' +--- + +## Ringkasan +Satu kalimat: apa yang salah. + +## Langkah Reproduksi +1. +2. +3. + +## Hasil Aktual vs Diharapkan +- Aktual: +- Diharapkan: + +## Bukti +Screenshot / rekaman / console log. + +## Lokasi (opsional) +File / halaman / komponen yang dicurigai. + +## Severity usulan pelapor +- [ ] Critical (keamanan, data bocor, site down) +- [ ] High (fitur utama rusak) +- [ ] Medium (fitur rusak sebagian) +- [ ] Low (visual / typo) + +> Bug keamanan **jangan** dilaporkan di sini. Lihat SECURITY.md. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index f28d307..db58a8d 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -4,7 +4,7 @@ Jelaskan perubahan yang kamu buat secara singkat. ## πŸ”— Issue Terkait -Fixes #(nomor issue) +Closes #(nomor issue) ## πŸ”„ Tipe Perubahan @@ -28,7 +28,13 @@ Fixes #(nomor issue) - [ ] Saya sudah menambahkan komentar di bagian yang kompleks - [ ] Saya sudah update dokumentasi yang terkait - [ ] Perubahan saya tidak menghasilkan warning baru -- [ ] Saya sudah test perubahan saya secara lokal +- [ ] Saya sudah test perubahan saya secara lokal (desktop dan mobile bila menyentuh UI) +- [ ] `npx tsc --noEmit` dan `npm run build` lolos +- [ ] Tidak ada secret atau data pribadi di diff + +## πŸ§ͺ Cara Verifikasi + +Langkah agar reviewer bisa memastikan perubahan bekerja. ## πŸ“ Catatan untuk Reviewer diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..b30d096 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,24 @@ +name: CI + +on: + pull_request: + push: + branches: [main] + +jobs: + check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: npm + - run: npm ci + - name: Typecheck + run: npx tsc --noEmit + - name: Build + run: npm run build + env: + VITE_SUPABASE_URL: https://example.supabase.co + VITE_SUPABASE_ANON_KEY: ci-placeholder diff --git a/.github/workflows/event-report.yml b/.github/workflows/event-report.yml new file mode 100644 index 0000000..3f70063 --- /dev/null +++ b/.github/workflows/event-report.yml @@ -0,0 +1,51 @@ +name: Event report + +on: + workflow_dispatch: + inputs: + since: + description: 'Tanggal mulai (YYYY-MM-DD)' + required: true + until: + description: 'Tanggal akhir (YYYY-MM-DD, kosong = hari ini)' + required: false + schedule: + - cron: '0 1 * * 1' # tiap Senin 08:00 WIB + +permissions: + contents: read + issues: read + pull-requests: read + +jobs: + report: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 20 + - name: Hitung periode + id: range + run: | + SINCE="${{ github.event.inputs.since }}" + if [ -z "$SINCE" ]; then SINCE="$(date -u -d '7 days ago' +%F)"; fi + echo "since=$SINCE" >> "$GITHUB_OUTPUT" + echo "until=${{ github.event.inputs.until }}" >> "$GITHUB_OUTPUT" + - name: Buat laporan + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_REPO: ${{ github.repository }} + SINCE: ${{ steps.range.outputs.since }} + UNTIL: ${{ steps.range.outputs.until }} + run: | + if [ -n "$UNTIL" ]; then + node scripts/event-report.mjs --since "$SINCE" --until "$UNTIL" --out report + else + node scripts/event-report.mjs --since "$SINCE" --out report + fi + cat report.md >> "$GITHUB_STEP_SUMMARY" + - uses: actions/upload-artifact@v4 + with: + name: event-report + path: report.* diff --git a/.gitignore b/.gitignore index 0d811df..5cf1c76 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ dist-ssr .env .env.production .env.staging +.env.local # Editor directories and files .vscode/* @@ -28,3 +29,5 @@ dist-ssr *.njsproj *.sln *.sw? +event/report.* +private/ diff --git a/build_log.txt b/build_log.txt deleted file mode 100644 index f248100..0000000 Binary files a/build_log.txt and /dev/null differ diff --git a/build_log_utf8.txt b/build_log_utf8.txt deleted file mode 100644 index 075d1aa..0000000 --- a/build_log_utf8.txt +++ /dev/null @@ -1,145 +0,0 @@ -ο»Ώ -> ourcreativity@5.0.0 build -> vite build - -vite v6.4.1 building for production... -transforming... -node.exe : -[plugin -vite:esbuild] -pages/Karya.tsx: -This case -clause will never be -evaluated because it -duplicates an -earlier case -clause -At C:\Program Files\n -odejs\npm.ps1:29 -char:3 -+ & $NODE_EXE -$NPM_CLI_JS $args -+ ~~~~~~~~~~~~~~~~~ -~~~~~~~~~~~~ - + CategoryInfo - : NotSpe - cified: ([p - lugin vi...ase c -lause:Strin -g) [], RemoteExc -eption - + FullyQualified - ErrorId : Native - CommandError - -454| ); -455| case -'video': -456| case -'video': - | ^ -457| return -( -458|
- -Γ£ô 378 modules transformed. -Γ£ù Build -failed in 7.38s -error during -build: -[vite]: Rollup -failed to resolve -import -"react-hot-toast" -from "C:/Users/X1 CAR -BON/coding/02-Proyek- -Web/ourcreativities/h -ooks/useMediaUpload.t -s". -This is most likely -unintended because -it can break your -application at -runtime. -If you do want to -externalize this -module explicitly -add it to -`build.rollupOptions. -external` - at viteLog (file: -///C:/Users/X1%20CARB -ON/coding/02-Proyek-W -eb/ourcreativities/no -de_modules/vite/dist/ -node/chunks/dep-D4NMH -UTW.js:46374:15) - at file:///C:/Use -rs/X1%20CARBON/coding -/02-Proyek-Web/ourcre -ativities/node_module -s/vite/dist/node/chun -ks/dep-D4NMHUTW.js:46 -432:18 - at onwarn (file:/ -//C:/Users/X1%20CARBO -N/coding/02-Proyek-We -b/ourcreativities/nod -e_modules/@vitejs/plu -gin-react/dist/index. -js:76:7) - at file:///C:/Use -rs/X1%20CARBON/coding -/02-Proyek-Web/ourcre -ativities/node_module -s/vite/dist/node/chun -ks/dep-D4NMHUTW.js:46 -430:7 - at onRollupLog (f -ile:///C:/Users/X1%20 -CARBON/coding/02-Proy -ek-Web/ourcreativitie -s/node_modules/vite/d -ist/node/chunks/dep-D -4NMHUTW.js:46422:5) - at onLog (file:// -/C:/Users/X1%20CARBON -/coding/02-Proyek-Web -/ourcreativities/node -_modules/vite/dist/no -de/chunks/dep-D4NMHUT -W.js:46072:7) - at file:///C:/Use -rs/X1%20CARBON/coding -/02-Proyek-Web/ourcre -ativities/node_module -s/rollup/dist/es/shar -ed/node-entry.js:2096 -1:32 - at Object.logger -[as onLog] (file:///C -:/Users/X1%20CARBON/c -oding/02-Proyek-Web/o -urcreativities/node_m -odules/rollup/dist/es -/shared/node-entry.js -:22848:9) - at ModuleLoader.h -andleInvalidResolvedI -d (file:///C:/Users/X -1%20CARBON/coding/02- -Proyek-Web/ourcreativ -ities/node_modules/ro -llup/dist/es/shared/n -ode-entry.js:21592:26 -) - at file:///C:/Use -rs/X1%20CARBON/coding -/02-Proyek-Web/ourcre -ativities/node_module -s/rollup/dist/es/shar -ed/node-entry.js:2155 -0:26 diff --git a/components/AuthProvider.tsx b/components/AuthProvider.tsx index f0510cb..b4822d6 100644 --- a/components/AuthProvider.tsx +++ b/components/AuthProvider.tsx @@ -1,4 +1,4 @@ -import React, { createContext, useContext, useEffect, useState } from 'react'; +import React, { createContext, useContext, useEffect, useRef, useState } from 'react'; import { User, Session } from '@supabase/supabase-js'; import { supabase } from '../lib/supabase'; @@ -28,6 +28,7 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children const [user, setUser] = useState(null); const [profile, setProfile] = useState(null); const [loading, setLoading] = useState(true); + const currentUserId = useRef(null); useEffect(() => { if (import.meta.env.DEV) console.log('AuthProvider: Starting initialization...'); @@ -42,6 +43,7 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children const getInitialSession = async () => { try { const { data: { session } } = await supabase.auth.getSession(); + currentUserId.current = session?.user?.id ?? null; setSession(session); setUser(session?.user ?? null); @@ -61,14 +63,17 @@ export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children getInitialSession(); // 2. Pantau perubahan auth (login/logout) - const { data: { subscription } } = supabase.auth.onAuthStateChange(async (_event, session) => { - const previousUser = user; + const { data: { subscription } } = supabase.auth.onAuthStateChange((_event, session) => { + const previousId = currentUserId.current; + currentUserId.current = session?.user?.id ?? null; setSession(session); setUser(session?.user ?? null); - // Cek apakah user berubah beneran biar gak fetch ulang kalo cuma token refresh - if (session?.user && session.user.id !== previousUser?.id) { - await fetchProfile(session.user.id); + // Cek apakah user berubah beneran biar gak fetch ulang kalo cuma token refresh. + // Jangan await panggilan Supabase di dalam callback ini (bisa deadlock), jadi ditunda. + if (session?.user && session.user.id !== previousId) { + const userId = session.user.id; + setTimeout(() => { void fetchProfile(userId); }, 0); } else if (!session?.user) { setProfile(null); } diff --git a/components/CreationStudio/ControlCenter/InteractiveSandbox.tsx b/components/CreationStudio/ControlCenter/InteractiveSandbox.tsx index 525df9e..6ff7d61 100644 --- a/components/CreationStudio/ControlCenter/InteractiveSandbox.tsx +++ b/components/CreationStudio/ControlCenter/InteractiveSandbox.tsx @@ -188,7 +188,7 @@ export const InteractiveSandbox: React.FC = ({ files, t ref={iframeRef} srcDoc={getIframeContent()} className="w-full h-full border-none bg-black" - sandbox="allow-scripts allow-modals allow-same-origin" + sandbox="allow-scripts allow-modals" title="Preview" /> ); diff --git a/components/CreationStudio/index.tsx b/components/CreationStudio/index.tsx index 460d0b9..51a62cb 100644 --- a/components/CreationStudio/index.tsx +++ b/components/CreationStudio/index.tsx @@ -115,8 +115,11 @@ export const CreationStudio: React.FC = ({ isOpen, onClose, onPublish }) }; const uploadFile = async (file: File): Promise => { - const fileExt = file.name.split('.').pop(); - const fileName = `${Math.random()}.${fileExt}`; + const allowedTypes = ['image/jpeg', 'image/png', 'image/webp', 'image/gif', 'video/mp4', 'video/webm']; + if (!allowedTypes.includes(file.type)) throw new Error('Tipe file tidak diizinkan.'); + if (file.size > 50 * 1024 * 1024) throw new Error('Ukuran file maksimal 50MB.'); + const fileExt = file.name.split('.').pop()?.toLowerCase().replace(/[^a-z0-9]/g, '') || 'bin'; + const fileName = `${crypto.randomUUID()}.${fileExt}`; const filePath = `${fileName}`; const { error: uploadError } = await supabase.storage diff --git a/components/MediaUploader.tsx b/components/MediaUploader.tsx index 6898296..206e88c 100644 --- a/components/MediaUploader.tsx +++ b/components/MediaUploader.tsx @@ -59,10 +59,13 @@ const MediaUploader = ({ disabled: uploading, }); + // framer-motion punya tipe onDrag sendiri yang bentrok dengan react-dropzone + const { onDrag: _onDrag, onDragStart: _onDragStart, onDragEnd: _onDragEnd, onAnimationStart: _onAnimationStart, ...rootProps } = getRootProps(); + return (
`. Alert tidak boleh muncul | +| S3 | Perketat sandbox iframe | Hapus `allow-same-origin` dari iframe di `Karya.tsx` (3 tempat), `Profile.tsx`, dan `InteractiveSandbox.tsx`. Tes bahwa preview p5/JS tetap jalan | Di preview, `localStorage.getItem('x')` harus melempar SecurityError | +| S4 | Branch protection dan CI wajib | Pengaturan di `HOST_KODING.md` bagian 2.2 | PR tanpa approval atau dengan CI merah tidak bisa di-merge | +| S5 | `npm audit fix` | Jalankan `npm audit fix` (tanpa `--force`), pastikan build dan tsc lolos | `npm audit --omit=dev` tinggal sedikit atau nol high | + +**Status eksekusi (branch `claude/koding-event-host-setup-ikq7nz`)** +- S2 selesai di kode: `lib/sanitize.ts` (DOMPurify) dipakai di semua `dangerouslySetInnerHTML`. +- S3 selesai di kode: `allow-same-origin` dihapus dari semua iframe preview. +- S5 selesai sebagian: `npm audit fix` dijalankan. Sisa temuan berasal dari DOMPurify bawaan Monaco dan `react-router`; perlu upgrade terpisah. +- S1: file `supabase/migrations/20261026_harden_profiles_and_works.sql` sudah ditulis tapi **belum dijalankan**. Jalankan di staging, lakukan verifikasi, baru di produksi. +- S4: harus diatur manual di GitHub Settings (tidak bisa dilakukan lewat kode). + +## 3. Daftar Issue Awal untuk Papan Event + +Judul dan label siap dipakai saat membuat issue. Tambahkan detail lokasi file di deskripsi. + +**Bug dan kualitas (bounty)** +1. Hapus 96 `console.*` dari kode produksi (ganti dengan logger yang bisa dimatikan). `sev:low`, `bounty:M` +2. Ganti `any` secara bertahap, mulai dari `lib/` dan `hooks/`. `bounty:M` per direktori +3. Pecah `pages/Karya.tsx` (1327 baris) jadi komponen: card, viewer, filter. `bounty:L` +4. Pecah `pages/Profile.tsx` dan `pages/Studio.tsx` dengan pola yang sama. `bounty:L` masing-masing +5. Lazy-load Monaco dan pyodide agar chunk `Studio` (627 kB) turun. `bounty:L` +6. Kode preview duplikat (`generateCodePreview` di Karya dan Profile): satukan ke `lib/`. `bounty:M` +7. Tambah alt text dan label ARIA di Navbar, Hero, BentoGrid, dan form. Lihat `.github/issues/issue_06_accessibility.md`. `bounty:M` +8. Stat halaman Coding yang di-hardcode (125 member, 99.9% uptime): ambil dari Supabase atau hapus. `sev:low`, `bounty:S` +9. Perbarui dokumentasi yang menunjuk path lama (`supabase_schema.sql` di CONTRIBUTING, `CODEOWNERS`). `bounty:S` +10. Uji tampilan di mobile: Studio, Karya, Gate. Laporkan dan perbaiki bug layout. `sev:medium`, `bounty:M` per bug + +**Infrastruktur (bounty besar)** +11. Setup Vitest dan React Testing Library, plus test untuk `lib/utils.ts`, `AdminGuard`, dan `AuthProvider`. `bounty:XL` (lihat `issue_02_testing.md`) +12. Tambah lint (ESLint) dan format (Prettier) ke CI. `bounty:L` +13. Pemisahan error boundary per rute dan pesan error yang konsisten (`issue_03_error_handling.md`). `bounty:M` +14. Review RLS tabel lain (`comments`, `likes`, `follows`, `works`) dan tulis test SQL sederhana. `bounty:L` + +**Pemula (`good-first-issue`)** +15. Perbaiki typo dan teks Indonesia yang tidak konsisten di README dan docs. `bounty:S` +16. Hapus badge versi lama di README dan sesuaikan dengan `package.json`. `bounty:S` +17. Tambah `.nvmrc` dan field `engines` di `package.json`. `bounty:S` + +Mulai dengan 12 sampai 17 issue agar pilot tidak kewalahan, lalu tambah bertahap. + +## 4. Teks Siap Tempel + +### 4.1 Aturan event (pin sebagai issue) + +``` +# Aturan Event Bug Hunt Koding + +Periode: sampai +Budget total: Rp . Batas per orang: Rp . + +CARA IKUT +1. Fork repo, setup sesuai docs/HOST_KODING.md bagian 3 (Fase B). +2. Pilih issue berlabel `good-first-issue` atau `bounty:*`, komentar "Saya ambil #N". +3. Tunggu di-assign. Maksimal 2 issue aktif per orang. Klaim hangus bila 5 hari tanpa PR. +4. Buat PR dengan "Closes #N" di deskripsi. CI harus hijau. Isi template PR. + +MENEMUKAN BUG BARU +- Buka issue dengan template "Bug (Divisi Koding / Bounty)". Sertakan langkah reproduksi dan bukti. +- Bug keamanan: JANGAN buka issue publik. Pakai Security Advisory (tab Security). +- Severity ditentukan host dan bersifat final. + +PEMBAYARAN +- Dibayar hanya bila PR di-merge. Duplikat: hanya laporan pertama. +- Rekap tiap akhir bulan, transfer maksimal tanggal 5 bulan berikutnya. +- Minimum payout Rp 25.000, sisanya digulung. +- Ini bounty lepas, bukan hubungan kerja. Aturan dan hadiah dapat berubah dengan pemberitahuan. + +DILARANG +- Membuat bug lalu melaporkannya, PR spam atau hasil otomatis tanpa dipahami, + menyalin PR orang lain, menguji ke produksi, merusak atau mengambil data, + memakai lebih dari satu akun. +- Pelanggaran: diskualifikasi dan hadiah ditahan. + +Kontribusi dilisensikan MIT sesuai LICENSE repo. +``` + +### 4.2 Pengumuman ke member + +``` +Halo anak Koding! Kita buka Bug Hunt OurCreativity. +Cari bug, rapikan kode, dan dapat bayaran untuk PR yang di-merge. +Mulai . Aturan dan daftar tugas: . +Daftar: balas pesan ini dengan username GitHub kamu. +Pemula boleh ikut, ada label good-first-issue. +``` + +### 4.3 Tambahan untuk template PR +Tambahkan bagian ini ke `.github/PULL_REQUEST_TEMPLATE.md`: +``` +## Issue terkait +Closes # + +## Cara verifikasi +Langkah agar reviewer dapat memastikan perubahan bekerja. + +## Checklist +- [ ] `npx tsc --noEmit` lolos +- [ ] `npm run build` lolos +- [ ] Diuji di desktop dan mobile (bila menyentuh UI) +- [ ] Tidak ada secret atau data pribadi di diff +``` + +## 5. Ritme Mingguan Host + +| Hari | Kegiatan | Durasi | +|------|----------|--------| +| Setiap hari | Triage issue baru, review PR yang menunggu | 20 sampai 30 menit | +| Senin | Bersihkan klaim kadaluarsa, tambah 3 sampai 5 issue baru | 20 menit | +| Jumat | Rekap mingguan di issue pin: PR merge, leaderboard poin, issue tersisa | 20 menit | +| Akhir bulan | Ekspor PR merge, isi ledger, umumkan rekap, payout | 1 sampai 2 jam | + +Kalau review mulai menumpuk, tunjuk 1 sampai 2 reviewer tepercaya dari member senior (beri izin Triage, bukan Write) dan kurangi issue baru. + +## 6. Ukuran Keberhasilan + +Cek di akhir pilot dan akhir event: +- Jumlah PR merge dan rasio PR merge terhadap PR yang dibuka (sehat: di atas 50%). +- Waktu rata-rata dari klaim sampai merge. +- Jumlah kontributor aktif unik. +- Tidak ada regresi di produksi dan CI tetap hijau. +- Total pengeluaran terhadap budget. + +## 7. Risiko dan Mitigasi + +| Risiko | Mitigasi | +|--------|----------| +| Budget habis lebih cepat dari rencana | Batas total dan per orang, antrean issue dibatasi, jeda bila 80% terpakai | +| Review jadi bottleneck | Batas 2 klaim per orang, reviewer tambahan, issue kecil dan fokus | +| PR berkualitas rendah atau spam | Aturan diskualifikasi, hanya merge dibayar, CI wajib | +| Eksploitasi bug keamanan sebelum patch | Blocker S1 sampai S3 selesai lebih dulu, pelaporan privat | +| Kebocoran kredensial | Supabase staging terpisah, anon key saja, rotasi setelah event | +| Sengketa pembayaran | Severity final oleh host, rekap publik 3 hari sebelum payout, bukti transfer disimpan | diff --git a/docs/HOST_KODING.md b/docs/HOST_KODING.md new file mode 100644 index 0000000..bc71cc8 --- /dev/null +++ b/docs/HOST_KODING.md @@ -0,0 +1,211 @@ +# Panduan Host Event Divisi Koding + +Panduan untuk host yang mengajak member mencari bug dan memperbaiki website OurCreativity lewat GitHub, termasuk sistem bayaran dan cara melacaknya. + +Hasil review repo (tanggal 2026-10-26) ada di bagian 1. Setup dan alur kerja ada di bagian 2 sampai 6. + +--- + +## 1. Hasil Review: Apakah Repo Siap? + +**Kesimpulan: cukup siap untuk event kecil dan terkontrol, belum siap untuk event terbuka berhadiah uang.** Ada 4 hal yang sebaiknya selesai dulu (bagian 1.3). + +### 1.1 Yang sudah bagus +- Build produksi lolos (`npm run build`, sekitar 8 detik). +- `tsc --noEmit` bersih (sebelumnya 1 error di `MediaUploader.tsx`, sudah diperbaiki di branch ini). +- Dokumentasi lengkap: README, CONTRIBUTING, SECURITY, CODEOWNERS, template PR dan issue, 15 file di `docs/`. +- Tidak ada secret yang ter-commit. `.env` sudah di `.gitignore`. Hanya `VITE_SUPABASE_*` (anon key, memang publik) yang dipakai di client. +- Kode sudah di-split per halaman (lazy chunks). + +### 1.2 Masalah yang ditemukan + +| # | Severity | Temuan | Lokasi | +|---|----------|--------|--------| +| 1 | **High** | Tidak ada CI dan tidak ada test. PR tidak diverifikasi otomatis. (CI dasar sudah ditambahkan di `.github/workflows/ci.yml`.) | repo | +| 2 | **High** | Stored XSS. Konten karya user dirender lewat `dangerouslySetInnerHTML` tanpa sanitasi (tidak ada DOMPurify). | `pages/Karya.tsx:491,960,1143`, `pages/Profile.tsx:328,662` | +| 3 | **High** | Iframe kode user memakai `sandbox="allow-scripts allow-same-origin"` lewat `srcDoc`. Kombinasi ini membuat sandbox tidak efektif: script user bisa membaca `localStorage` induk, termasuk token sesi Supabase. | `pages/Karya.tsx:510,896,1164`, `components/CreationStudio/ControlCenter/InteractiveSandbox.tsx:191` | +| 4 | **High** | Skema tabel `profiles` dan policy RLS untuk UPDATE-nya tidak ada di `supabase/migrations`. Tidak bisa diverifikasi dari repo apakah user bisa mengubah `role` jadi `admin` sendiri. Cek langsung di Supabase. | `supabase/migrations/` | +| 5 | Medium | `npm audit --omit=dev`: 12 kerentanan (11 high, 1 moderate) pada dependency transitif (`ws`, `underscore`). | `package.json` | +| 6 | Medium | Policy `works_update_owner` tidak punya `WITH CHECK`. Owner bisa mengubah kolom sensitif (misalnya `author_id`, atau flag approve jika ada). | `supabase/migrations/20251226_performance_cleanup.sql:59` | +| 7 | Medium | Sekitar 97 `any` dan 96 `console.*`. File besar: `Karya.tsx` 1327 baris, `Studio.tsx` 950 baris, `Profile.tsx` 884 baris. | `pages/` | +| 8 | Medium | Chunk `Studio` 627 kB (200 kB gzip), terkait Monaco dan pyodide. | build output | +| 9 | Low | Dokumentasi tidak konsisten: CONTRIBUTING menyebut `supabase_schema.sql` padahal file ada di `supabase/migrations/`; `.github/CODEOWNERS` menunjuk path lama; README memuat badge versi lama. | docs | +| 10 | Low | Data statistik di halaman Coding di-hardcode ("125 member", "99.9% uptime"). | `pages/divisions/Coding.tsx` | +| 11 | Low | File sampah di root (`build_log*.txt`, `tsc_*.txt`). Sudah dihapus di branch ini. | root | + +### 1.3 Wajib sebelum event berhadiah uang +1. **Cek RLS `profiles` di dashboard Supabase** (temuan 4), lalu simpan skemanya ke `supabase/migrations`. Pastikan user biasa tidak bisa meng-update kolom `role`. +2. **Tambah sanitasi HTML** dengan DOMPurify di semua `dangerouslySetInnerHTML` (temuan 2). +3. **Hapus `allow-same-origin`** dari iframe kode user (temuan 3). Hasil render tetap jalan dengan `allow-scripts` saja. +4. **Aktifkan branch protection** di `main` (bagian 2.2). + +Temuan 2, 3, 4 ini sebaiknya jadi **bug pertama di papan event**. Karena severity-nya tinggi, kerjakan sendiri atau pilih kontributor yang dipercaya. Jangan umumkan detailnya di issue publik sebelum diperbaiki (lihat `SECURITY.md`). + +--- + +## 2. Setup Awal Host (sekali saja) + +### 2.1 Repo +1. Pastikan akun host punya akses **Maintain** atau **Admin** ke `OurCreativity/ourcreativity`. +2. Merge branch ini agar CI, template issue, dan panduan ini aktif. +3. Buat **Supabase project terpisah untuk staging/event**. Jangan beri kontributor akses ke database produksi. Jalankan semua file di `supabase/migrations/` ke project itu. + +### 2.2 Branch protection (Settings β†’ Branches β†’ Add rule untuk `main`) +- Require a pull request before merging, dengan minimal 1 approval. +- Require review from Code Owners. +- Require status checks to pass: pilih `check` (dari `ci.yml`). +- Dismiss stale approvals saat ada commit baru. +- Larang force-push dan penghapusan branch. + +### 2.3 Label (Issues β†’ Labels) +``` +bug, koding, good-first-issue, needs-triage, confirmed, duplicate, invalid, wontfix +sev:critical, sev:high, sev:medium, sev:low +bounty:S, bounty:M, bounty:L, bounty:XL +paid +``` + +### 2.4 GitHub Project (board) +Buat Project (Table + Board) bernama "Event Koding". Kolom status: `Triage β†’ Open β†’ Claimed β†’ In Review β†’ Merged β†’ Paid`. Tambah field: `Assignee`, `Severity`, `Points`, `Rupiah`, `Bulan`. + +### 2.5 Keamanan repo +- Aktifkan **Dependabot alerts**, **Secret scanning**, dan **Private vulnerability reporting** (Settings β†’ Code security). +- Kontributor bekerja lewat **fork + PR**, bukan push langsung. Jangan beri akses write ke member biasa. + +--- + +## 3. Alur Event (dari sisi host) + +### Fase A: Persiapan (H-7) +- Siapkan 15 sampai 30 issue awal: bug yang sudah kamu ketahui, tugas `good-first-issue`, dan improvement (aksesibilitas, performa, refactor `Karya.tsx`, test). Beri label `sev:*` dan `bounty:*`. +- Tulis aturan dan tabel hadiah (bagian 4) di satu issue yang di-pin. +- Umumkan ke member: cara daftar, cara klaim, tenggat. + +### Fase B: Onboarding member (kirim ke member) +```bash +# 1. Fork repo di GitHub, lalu: +git clone https://github.com//ourcreativity.git +cd ourcreativity +git remote add upstream https://github.com/OurCreativity/ourcreativity.git +npm ci +cp .env.example .env # isi dengan kredensial Supabase STAGING dari host +npm run dev # buka http://localhost:3000 + +# 2. Kerjakan +git checkout -b fix/- +# ...ubah kode... +npx tsc --noEmit && npm run build # wajib lolos sebelum PR +git commit -m "fix: (#)" +git push origin fix/- +# 3. Buka Pull Request ke OurCreativity/ourcreativity:main +``` +Bagikan kredensial staging lewat pesan privat, bukan di issue atau channel publik. + +### Fase C: Selama event (rutin harian, sekitar 20 menit) +1. **Triage** issue baru dengan label `needs-triage`: reproduksi bug, tentukan `sev:*` dan `bounty:*`, tandai `duplicate` atau `invalid` bila perlu. +2. **Klaim**: member komentar `/claim` atau "Saya ambil". Host meng-assign. Satu orang maksimal 2 issue aktif; klaim kadaluarsa dalam 5 hari tanpa PR. +3. **Review PR**: cek CI hijau, diff kecil dan fokus, tidak mengubah file di luar scope, tidak menyisipkan dependency baru tanpa alasan. Jalankan lokal bila perubahan menyentuh auth, RLS, atau iframe. +4. **Merge**, lalu pindahkan card ke `Merged` dan isi field `Points` dan `Rupiah`. + +### Fase D: Penutupan dan payout (akhir bulan) +Lihat bagian 5. + +--- + +## 4. Skema Bayaran + +Angka di bawah hanya usulan awal. Sesuaikan dengan budget. **Tetapkan dulu total budget bulanan dan batas per orang** (misalnya maksimum 25% budget per member) sebelum diumumkan. + +### 4.1 Hadiah per bug (dibayar setelah PR merge, bukan saat laporan) + +| Severity | Contoh | Reward | +|----------|--------|--------| +| Critical | XSS tersimpan, eskalasi role, kebocoran data | Rp 150.000 sampai 300.000 | +| High | Fitur utama rusak, crash halaman | Rp 75.000 | +| Medium | Fitur rusak sebagian, bug di mobile | Rp 40.000 | +| Low | Typo, visual minor, dokumentasi | Rp 15.000 | + +### 4.2 Hadiah improvement + +| Ukuran | Contoh | Reward | +|--------|--------|--------| +| S | refactor kecil, alt text, perbaikan docs | Rp 20.000 | +| M | test untuk satu modul, optimasi satu halaman | Rp 50.000 | +| L | pecah `Karya.tsx` jadi komponen, fitur kecil | Rp 100.000 | +| XL | fitur besar, infrastruktur test | Rp 200.000 atau lebih | + +Tambah bonus Rp 10.000 sampai 25.000 bila disertai test atau dokumentasi. + +### 4.3 Aturan wajib +- Hanya **PR yang di-merge** yang dibayar. +- Laporan duplikat: hanya yang pertama (waktu issue) dibayar. +- Severity ditentukan host dan bersifat final. +- Bug keamanan dilaporkan privat lewat Security Advisory, dibayar setelah patch merge. +- Dilarang: bug yang sengaja dibuat lalu "ditemukan", PR spam/otomatis tanpa pemahaman, menyalin PR orang lain, menguji ke produksi atau merusak data. Pelanggaran berarti diskualifikasi. +- Gunakan akun GitHub asli, satu orang satu akun. + +--- + +## 5. Tracking dan Pembayaran + +**Prinsip: GitHub adalah sumber kebenaran, spreadsheet hanya buku kas.** Tidak perlu membangun sistem sendiri dulu. + +### 5.1 Pelacakan di GitHub +- Tiap issue punya label `sev:*` atau `bounty:*`. Saat PR merge, tambahkan label `paid` hanya setelah uang benar-benar dikirim. +- Di PR, tulis `Closes #` agar issue otomatis tertutup dan tertaut ke pembuatnya. +- Di GitHub Project, field `Rupiah` diisi saat merge. Dari view Table, filter per `Bulan`, lalu grup per `Assignee` untuk total per orang. + +### 5.2 Spreadsheet ledger (Google Sheets) +Buat satu sheet dengan kolom: + +| Tanggal merge | Username GitHub | Nama asli | Issue | PR | Kategori | Severity/Size | Rupiah | Metode bayar | Status (Belum/Lunas) | Tgl bayar | Bukti transfer | +|---|---|---|---|---|---|---|---|---|---|---|---| + +Tab ke-2 berisi rekap per orang memakai `SUMIFS` per bulan. Data pribadi (nama asli, rekening) disimpan di sheet privat milik host, **jangan** di repo. + +### 5.3 Tarik data otomatis (opsional) +Daftar PR merge sebulan dapat diambil dengan GitHub CLI: +```bash +gh pr list --repo OurCreativity/ourcreativity --state merged \ + --search "merged:2026-11-01..2026-11-30" \ + --json number,title,author,mergedAt,labels,closingIssuesReferences \ + --limit 200 > merged.json +``` +Ubah ke CSV lalu tempel ke ledger. Kalau volume sudah besar, baru pertimbangkan membuat workflow GitHub Actions atau tabel `payouts` di Supabase. + +### 5.4 Siklus payout +1. **Tanggal 1 tiap bulan**: ekspor PR merge bulan lalu, cocokkan dengan ledger. +2. **Tanggal 1 sampai 3**: umumkan rekap di issue pin ("Rekap November"), beri waktu 3 hari untuk keberatan. +3. **Tanggal 5**: transfer (bank, e-wallet). Catat bukti, isi `Lunas`, tambah label `paid`. +4. Minimum payout, misalnya Rp 25.000. Di bawah itu, saldo digulung ke bulan berikutnya. + +### 5.5 Hal non-teknis yang perlu diputuskan +- **Sumber dana dan transparansi**: dari kas pribadi, kas komunitas, atau donasi? Umumkan total budget agar tidak ada ekspektasi berlebihan. +- **Status pembayaran**: ini bounty lepas, bukan gaji. Tulis jelas di aturan bahwa member bukan karyawan, dan hadiah bisa berubah atau dihentikan dengan pemberitahuan. +- **Pajak dan legal**: konsultasikan bila nilai total besar atau rutin. Bagian ini bukan nasihat hukum. +- **Lisensi kontribusi**: repo memakai MIT. Cantumkan di aturan bahwa kontribusi berlisensi sama. +- **Peserta di bawah umur**: pastikan ada persetujuan orang tua bila relevan. + +--- + +## 6. Checklist Host + +**Sebelum event** +- [ ] Merge branch ini (CI, template, panduan) +- [ ] Cek RLS `profiles` dan simpan skemanya ke migrations +- [ ] Sanitasi `dangerouslySetInnerHTML` dan hapus `allow-same-origin` +- [ ] Branch protection `main` aktif +- [ ] Supabase staging siap, kredensial dibagikan privat +- [ ] Label, Project board, dan ledger siap +- [ ] 15 sampai 30 issue terlabel +- [ ] Budget dan aturan diumumkan + +**Selama event** +- [ ] Triage harian +- [ ] Review PR maksimal 48 jam +- [ ] Bersihkan klaim kadaluarsa + +**Setelah event** +- [ ] Rekap, payout, dan label `paid` +- [ ] Update `CHANGELOG.md` dan `AUTHORS.md` (kredit kontributor) +- [ ] Retrospektif: apa yang berhasil, apa yang perlu diubah di event berikutnya diff --git a/docs/KONTROL_DAN_TRACKING_EVENT.md b/docs/KONTROL_DAN_TRACKING_EVENT.md new file mode 100644 index 0000000..e24a11f --- /dev/null +++ b/docs/KONTROL_DAN_TRACKING_EVENT.md @@ -0,0 +1,60 @@ +# Kontrol Keamanan dan Tracking Peserta Event + +Panduan untuk host agar event tetap terkontrol dan aktivitas peserta bisa dilihat. + +## 1. Prinsip kontrol + +1. **Peserta tidak pernah menyentuh produksi.** Mereka pakai fork + Supabase staging. Kredensial staging dibagikan privat dan diganti setelah event. +2. **Semua perubahan lewat PR** dengan branch protection di `main` (approval + CODEOWNERS + CI hijau). +3. **Hak akses minimal.** Peserta tidak diberi akses write ke repo. Reviewer tepercaya cukup diberi *Triage*. +4. **Bug keamanan dilaporkan privat** lewat tab Security β†’ Report a vulnerability, bukan issue publik. +5. **Satu sumber kebenaran untuk reward**: label issue + PR yang di-merge (bagian 3). + +## 2. Verifikasi sebelum event (checklist host) + +- [ ] Jalankan `supabase/audit/rls_audit.sql` di staging dan produksi. Simpan hasilnya. Pastikan: tidak ada tabel publik tanpa RLS, policy tulis sesuai harapan untuk `profiles`, `works`, `letters`, dan `storage.objects`, daftar admin sesuai. +- [ ] Jalankan migration `20261026_harden_profiles_and_works.sql` lalu `20261027_admin_audit_log.sql` (staging dulu). +- [ ] Uji sebagai user biasa di staging: `update({role:'admin'})` pada profil sendiri harus gagal. +- [ ] Bucket `works` dan `avatars`: batasi `file_size_limit` dan `allowed_mime_types` di dashboard Storage; policy upload hanya untuk path `auth.uid()/...`; tanpa overwrite oleh user lain. +- [ ] Auth Supabase: aktifkan konfirmasi email, CAPTCHA (Turnstile/hCaptcha), dan rate limit di Authentication β†’ Settings. +- [ ] Aktifkan Dependabot, Secret scanning, dan Private vulnerability reporting. + +## 3. Tracking peserta + +### 3.1 Daftar peserta (registry) +Buat Google Sheet privat dengan kolom: `github`, `nama`, `kontak`, `tanggal daftar`, `setuju aturan (ya/tidak)`, `rekening/e-wallet`. Data pribadi tidak masuk repo. Hanya username GitHub yang dipakai di tooling. + +### 3.2 Aktivitas di GitHub (otomatis) +- Workflow `Event report` (`.github/workflows/event-report.yml`) berjalan tiap Senin dan bisa dipicu manual (Actions β†’ Event report β†’ Run workflow, isi `since`). Hasilnya muncul di ringkasan job dan sebagai artifact `report.csv` / `report.md`. +- Per peserta: jumlah PR merge, jumlah laporan bug, dan perkiraan reward dari label (`event/rewards.json`). +- Jalankan manual: `GITHUB_TOKEN= node scripts/event-report.mjs --since 2026-11-01 --until 2026-11-30`. +- Pantau juga: Insights β†’ Contributors, Pulse, dan Project board (kolom `Assignee` dan `Rupiah`). +- Aturan hitung: PR harus menulis `Closes #N`; reward diambil dari label tertinggi pada issue tersebut. Maintainer di `excludeUsers` tidak dihitung. Batas per orang di `maxPerUser`. + +### 3.3 Aktivitas di aplikasi (database) +Setelah migration `20261027_admin_audit_log.sql`, tabel `audit_log` mencatat siapa mengubah role/approval, menghapus karya, atau menghapus profil. Query contoh: +```sql +-- 100 aksi terbaru +select at, actor_id, table_name, action, row_id from audit_log order by at desc limit 100; +-- siapa dijadikan admin +select at, actor_id, row_id from audit_log where table_name='profiles' and new_data->>'role'='admin'; +-- aktivitas satu pengguna +select * from audit_log where actor_id = '' order by at desc; +``` +Untuk login dan error auth: Supabase Dashboard β†’ Logs β†’ Auth dan API (lihat IP, status 4xx/5xx mencurigakan). Untuk pendaftaran baru selama event: +```sql +select id, username, created_at from public.profiles order by created_at desc limit 50; +``` + +### 3.4 Sinyal yang perlu dicurigai +- Banyak PR kecil dalam waktu singkat dari satu akun, atau PR tanpa penjelasan. +- Akun baru yang langsung mengirim banyak laporan bug. +- Perubahan di `supabase/`, `.github/`, `package.json`, atau file auth tanpa issue terkait: review ekstra, jalankan lokal. +- Lonjakan 401/403/429 di log Supabase atau lonjakan upload storage. +- Entri `audit_log` dengan `actor_id` bukan admin yang kamu kenal. + +## 4. Menanggapi insiden +1. Cabut akses: ganti kunci staging, nonaktifkan akun (`update profiles set is_approved=false`), blokir user GitHub dari org. +2. Simpan bukti (log, `audit_log`, tautan PR). +3. Perbaiki lewat PR privat/advisory, lalu umumkan ringkas. +4. Peserta yang melanggar aturan: diskualifikasi dan hadiah ditahan sesuai aturan event. diff --git a/docs/README.md b/docs/README.md index 6f3435a..5af8cf0 100644 --- a/docs/README.md +++ b/docs/README.md @@ -37,3 +37,6 @@ Selamat datang di dokumentasi resmi OurCreativity. Semua dokumentasi kini tersed * **[Riwayat Versi Lengkap](versions/RIWAYAT_VERSI_LENGKAP.md)** Arsip sejarah perubahan versi dari awal hingga sekarang. +- [Panduan Host Event Koding](HOST_KODING.md) +- [Rencana Eksekusi Event Koding](EVENT_KODING_PLAN.md) +- [Kontrol dan Tracking Event](KONTROL_DAN_TRACKING_EVENT.md) diff --git a/event/rewards.json b/event/rewards.json new file mode 100644 index 0000000..98acd5d --- /dev/null +++ b/event/rewards.json @@ -0,0 +1,15 @@ +{ + "_catatan": "Nominal usulan (Rupiah). Sesuaikan dengan budget. Reward diambil dari label issue yang ditutup PR; jika ada beberapa label, diambil yang tertinggi.", + "labels": { + "sev:critical": 200000, + "sev:high": 75000, + "sev:medium": 40000, + "sev:low": 15000, + "bounty:XL": 200000, + "bounty:L": 100000, + "bounty:M": 50000, + "bounty:S": 20000 + }, + "excludeUsers": ["Ardelyo", "DoctorThink"], + "maxPerUser": 500000 +} diff --git a/lib/safe-url.ts b/lib/safe-url.ts new file mode 100644 index 0000000..1575a9d --- /dev/null +++ b/lib/safe-url.ts @@ -0,0 +1,10 @@ +// Hanya izinkan http(s) untuk link buatan user (cegah javascript: / data: URL). +export const safeHttpUrl = (value: string | null | undefined): string | undefined => { + if (!value) return undefined; + try { + const url = new URL(value.trim()); + return url.protocol === 'http:' || url.protocol === 'https:' ? url.toString() : undefined; + } catch { + return undefined; + } +}; diff --git a/lib/sanitize.ts b/lib/sanitize.ts new file mode 100644 index 0000000..fc8ed9e --- /dev/null +++ b/lib/sanitize.ts @@ -0,0 +1,5 @@ +// Sanitasi HTML buatan user sebelum dirender lewat dangerouslySetInnerHTML. +import DOMPurify from 'dompurify'; + +export const sanitizeHtml = (html: string | null | undefined): string => + DOMPurify.sanitize(html ?? '', { USE_PROFILES: { html: true } }); diff --git a/package-lock.json b/package-lock.json index 36e6065..e8d2131 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,6 +30,7 @@ "browser-image-compression": "^2.0.2", "clsx": "^2.1.1", "date-fns": "^4.1.0", + "dompurify": "^3.4.17", "embla-carousel-react": "^8.6.0", "framer-motion": "^12.23.24", "gsap": "^3.14.2", @@ -72,13 +73,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", + "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -87,9 +88,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", - "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "dev": true, "license": "MIT", "engines": { @@ -97,21 +98,21 @@ } }, "node_modules/@babel/core": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", - "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.4", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -128,14 +129,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", - "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.5", - "@babel/types": "^7.28.5", + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -145,14 +146,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -162,9 +163,9 @@ } }, "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, "license": "MIT", "engines": { @@ -172,29 +173,29 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -214,9 +215,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "version": "7.29.11", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.11.tgz", + "integrity": "sha512-snZbO7MEDOof+hvNa97EjEY7qD7h2kwvQr5AJC3ZhQudKW5dnej6k3kP9NQV88hJwaS8vDqRLFo9rivLEhle2g==", "dev": true, "license": "MIT", "engines": { @@ -224,9 +225,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, "license": "MIT", "engines": { @@ -234,9 +235,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "dev": true, "license": "MIT", "engines": { @@ -244,27 +245,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "version": "7.29.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.10.tgz", + "integrity": "sha512-EMCx3AGZ3WfAl6ht7AyQoPm2Lh+BGYEMdc4Q6Hf7uSCDOZFuLq44qNwL+iaim8VlyYhRAo4X43+weadK8ZB4Yg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4" + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "version": "7.29.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.11.tgz", + "integrity": "sha512-OZ6+oaK7GMyg3IfCpj8JOmn8n+w2rJbDT0LLfVDTLb1ZFeKDh3AiNELgCMUw175IJHSkLl74hG0M0VLsvx+gag==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.5" + "@babel/types": "^7.29.11" }, "bin": { "parser": "bin/babel-parser.js" @@ -306,33 +307,33 @@ } }, "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", - "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "version": "7.29.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.10.tgz", + "integrity": "sha512-B3lYAs2nkKskbgQ1nfy8Ma9ao9Q1rntTAQHrzzyDuj+TSO+X3le6PfWwqDvodsb+OumE10eMFfuMCTQSQ5iuIQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.5", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.9", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", "debug": "^4.3.1" }, "engines": { @@ -340,14 +341,14 @@ } }, "node_modules/@babel/types": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "version": "7.29.11", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.11.tgz", + "integrity": "sha512-WCsemW40Cpc6gouC1SrY6PBaZ+oLRlEVY9XBvZBI7il/HyUrb2nJ505wE1MHEFyDZNnrWDEuy4jL50WVHfTTSQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@babel/helper-string-parser": "^7.29.11", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -933,6 +934,23 @@ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -971,16 +989,10 @@ "node": ">= 8" } }, - "node_modules/@remirror/core-constants": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-3.0.0.tgz", - "integrity": "sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==", - "license": "MIT" - }, "node_modules/@remix-run/router": { - "version": "1.23.1", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.1.tgz", - "integrity": "sha512-vDbaOzF7yT2Qs4vO6XV1MHcJv+3dgR1sT+l3B8xxOVhUC336prMvqrvsLL/9Dnw2xr6Qhz4J0dmS0llNAbnUmQ==", + "version": "1.23.4", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.4.tgz", + "integrity": "sha512-q7j5geK7xs3UJSdm9/iytUNclBnLmYx1EnSeCFXHPeutdqgIMeFeHtUZgS3EhlKxdBEAu8OwtJCwmLrEzpSs7Q==", "license": "MIT", "engines": { "node": ">=14.0.0" @@ -994,9 +1006,9 @@ "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz", - "integrity": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==", + "version": "4.65.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.65.1.tgz", + "integrity": "sha512-5coxNSjqOI2J3NkVhlp3u+zGcyjnowQFsU9sg7MMz4UPXY4Dv63kFGLt7ConXz9CNq2i0yuOJZAF/2RMrgI2OA==", "cpu": [ "arm" ], @@ -1008,9 +1020,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz", - "integrity": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==", + "version": "4.65.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.65.1.tgz", + "integrity": "sha512-K0HFf6XMB3IYs+jDZ1/RRhZaVOwxNXrl0n4MDEyGDjuK7+B6K/nDJp8DCBitO3S1sK/fzNxAf9QZAny4AIUPtg==", "cpu": [ "arm64" ], @@ -1022,9 +1034,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz", - "integrity": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==", + "version": "4.65.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.65.1.tgz", + "integrity": "sha512-zkZrXYwNlIcSUmcwY2DpsaDHr0XjVUeQHCuSunG3eQD7/5Wn/DvI7OMUE8NRRweK87yG8ebJ1xGOzmwpMsbZQA==", "cpu": [ "arm64" ], @@ -1036,9 +1048,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz", - "integrity": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==", + "version": "4.65.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.65.1.tgz", + "integrity": "sha512-Zaed+R3cpkkA3aiNd7NO0GV5KFh/LVf8j6bGcoRdpoXkSm/mWH8M0oX2/3u/nyGcx/bHEovD9CzX+w9/gcpI4A==", "cpu": [ "x64" ], @@ -1050,9 +1062,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz", - "integrity": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==", + "version": "4.65.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.65.1.tgz", + "integrity": "sha512-h12p3WJWhyJ9kir0zqAPr0rKNmBzOWIjoaOMT9OULs9KZQZCeOMKd+mGSvERjd9VxJYShd3zIxtrVxkYz6BEVA==", "cpu": [ "arm64" ], @@ -1064,9 +1076,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz", - "integrity": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==", + "version": "4.65.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.65.1.tgz", + "integrity": "sha512-yRBwh/5imKY4DydDulVtrjy8Jf7h7NQJUqZbgmZ3zFsCD9QqlnWvZ7RtEF+ecO1b+IukKjXlu5Bb9fehV3tIbg==", "cpu": [ "x64" ], @@ -1078,9 +1090,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz", - "integrity": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==", + "version": "4.65.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.65.1.tgz", + "integrity": "sha512-1XuPiWYYaLE1UDOqhbKVOfsqxvfmFS/lYPSk92U1hEX1qRfSYH0hNeAlbxFIgjp4d6+YQmL95EPRgdvjbZEddA==", "cpu": [ "arm" ], @@ -1092,9 +1104,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz", - "integrity": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==", + "version": "4.65.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.65.1.tgz", + "integrity": "sha512-Y3C5e55Yrf6p2r5rBcc4P9hFWVNi6oqWy/53I/AyCJJGlp3KRSpTP8eoUmVntchTbEnhgBgAgLO9flj9AvOdUw==", "cpu": [ "arm" ], @@ -1106,9 +1118,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz", - "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==", + "version": "4.65.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.65.1.tgz", + "integrity": "sha512-Itj6coSswkYPIcVLczObXmwdplHNQQxyfnK1ppBg4czDaX8RiEzLKqU7EMc64BiBuiDZEUS+M93ktM18rv5llw==", "cpu": [ "arm64" ], @@ -1120,9 +1132,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz", - "integrity": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==", + "version": "4.65.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.65.1.tgz", + "integrity": "sha512-KeO8jTEqdrnhvcahufbimyMoI44vedRUp1bVz2QUnRX2vDm/hxzCPt5F8fERVD5fsHyTW/vXmCElT054VOSVOA==", "cpu": [ "arm64" ], @@ -1134,9 +1146,23 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz", - "integrity": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==", + "version": "4.65.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.65.1.tgz", + "integrity": "sha512-dDOz5VZZ+ZGnglpmET6VJefamWXFsgaVtuhSClf2/URZBp048jprD6z1hddsIMN6n1w+oUzGZEBp9u6Mlszsfg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.65.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.65.1.tgz", + "integrity": "sha512-JbfRKz8nJCuo8gn1Dqx8lQWEHw4qhZ3uRaHphw5vrSjnSptJTKTRC/bLKHh8QQMsEnhL4uq+bdg3tkiXbJ2q/A==", "cpu": [ "loong64" ], @@ -1148,9 +1174,23 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz", - "integrity": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==", + "version": "4.65.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.65.1.tgz", + "integrity": "sha512-3oQpe1q0emSeCAssVHMQdOz5fz3PBH5my/Fr0ZekV2UMNL4ZiRa1ciikYlGQXyDkeqseYYv1InwOY8YPqY7RIQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.65.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.65.1.tgz", + "integrity": "sha512-nNV3HHi23o1LtpGGwH+Bav4hqnc4+klQtC96tSvCfvql8bLlNFTnTFiGl/jai2nve3eEr/vT2ocuyf+h+eMnYQ==", "cpu": [ "ppc64" ], @@ -1162,9 +1202,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz", - "integrity": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==", + "version": "4.65.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.65.1.tgz", + "integrity": "sha512-b5zab0FryBxuocuDeqOsYGAg2EzjKw4mKA6LjQXCyewXjGv/BXqACBsY2cO45xM4hV2weYtdjGThP2VB2ByAYg==", "cpu": [ "riscv64" ], @@ -1176,9 +1216,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz", - "integrity": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==", + "version": "4.65.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.65.1.tgz", + "integrity": "sha512-Rh08xZakiUxKNgI3hbgH9mivlx478lSqckS9s+Oc3/TX1VrAH3W8z/5wpJXR/v5VjqcJ/jJNVBg64PU1+iQsTQ==", "cpu": [ "riscv64" ], @@ -1190,9 +1230,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz", - "integrity": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==", + "version": "4.65.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.65.1.tgz", + "integrity": "sha512-qDgtS6juN3/k97y4kcD6XLFpXEo4f6CnG8lTOGYwlhrUYTrMyhN0WHdZCPAW5rqS0MqQG7qI7dxnjugt6QB39Q==", "cpu": [ "s390x" ], @@ -1204,9 +1244,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.3.tgz", - "integrity": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==", + "version": "4.65.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.65.1.tgz", + "integrity": "sha512-44IKzBPqXXVm0kt1O+F5eW4juR5FyIxGNlFkpP8qwIDzucBsjM1HCbdYUQrQw8rU/g6HRl/tfBm0+Qq4H4Ro3w==", "cpu": [ "x64" ], @@ -1218,9 +1258,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.3.tgz", - "integrity": "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==", + "version": "4.65.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.65.1.tgz", + "integrity": "sha512-tvYWZ/h2PCHs558Xu7B6LptuRCV8lXV2xI75ONMcldII1m2zlFwuI4BJZi9M6rSMkYqcPLLtPUPrjyqfbzLOdg==", "cpu": [ "x64" ], @@ -1231,10 +1271,24 @@ "linux" ] }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.65.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.65.1.tgz", + "integrity": "sha512-gdyeucgZCnei3pXwadKVTEAOgRx0B+c847DUPR/PdOMmp3olhfkYo6r0J4PzRFZB5ZICZQTxntyvgmWH5xT7rg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz", - "integrity": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==", + "version": "4.65.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.65.1.tgz", + "integrity": "sha512-Wf/NEKdn2SAL4Nvt8HyDtdkseWTwiLbZEOoNYnEaHkbso0B9eHO42vKnZh+OYsn+IMhAMcWcuIwPlBOgOXsUzg==", "cpu": [ "arm64" ], @@ -1246,9 +1300,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz", - "integrity": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==", + "version": "4.65.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.65.1.tgz", + "integrity": "sha512-x9VSsDmsMsEWy4cr/mFeaEsXnVJ6Kc4NCAU/lCnwml3s7LQbZoa9+/qwc9etWHbuuDT5mYxdyyKUwo76njtjZw==", "cpu": [ "arm64" ], @@ -1260,9 +1314,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz", - "integrity": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==", + "version": "4.65.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.65.1.tgz", + "integrity": "sha512-RIDbiVvvLkN45mOFpbo6eYMgnuiBEB62BGR/0s4QJgGg2AvVxucDDNn67kpAcUoYyfmY8iX8/RifMcmxmmnejA==", "cpu": [ "ia32" ], @@ -1274,9 +1328,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz", - "integrity": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==", + "version": "4.65.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.65.1.tgz", + "integrity": "sha512-+KN8HIr88vN59JNxlrM2fMimzY43Y0lQB7+0xdVsFbvFCAA74CLKCdfzIHzzvndJryBc94Pm+MvwtukKjaS2ug==", "cpu": [ "x64" ], @@ -1288,9 +1342,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz", - "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==", + "version": "4.65.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.65.1.tgz", + "integrity": "sha512-+Y1Sd49cSDq60UOl8/U2HI0ebUvnSl/hDhMHQn+ouw17yb8fYwMWIazzJ4JFpSkjPE7sj5NTNSX9IoyEqcFfyQ==", "cpu": [ "x64" ], @@ -1408,16 +1462,16 @@ } }, "node_modules/@tiptap/core": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-3.14.0.tgz", - "integrity": "sha512-nm0VWVA1Vq/jaKY3wyRXViL/kf78yMdH7qETpv4qZXDQLU+pdWV3IGoRTQTKESc7d8L1wL/2uCeByLNUJfrSIw==", + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-3.32.0.tgz", + "integrity": "sha512-Ghh2h02GKSqzytQGcLV4espYOG4EHxjj0MsrUB2Vnr47xmlZYRf6r7k2J09H+JpBdaGrWwrTkyBEi5i3c3yy2Q==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/pm": "^3.14.0" + "@tiptap/pm": "3.32.0" } }, "node_modules/@tiptap/extension-blockquote": { @@ -1826,29 +1880,24 @@ } }, "node_modules/@tiptap/pm": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-3.14.0.tgz", - "integrity": "sha512-xrZmqI5jl4yMeAsu8p8gVP9S3An5h2MBi8BQHNnZmpyzkUrlpd40vlT6u13SWIqVi5ZWhBZ6U3rL7mkVLZuRKg==", + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-3.32.0.tgz", + "integrity": "sha512-H9eN+xHFboJybE7KPGVsu24S8aBlCIgYz38vCHRSnNv17nwmqm06owq/IQ5scza0n3Y7IfUfpgPOtm9SgeHmNQ==", "license": "MIT", "dependencies": { - "prosemirror-changeset": "^2.3.0", - "prosemirror-collab": "^1.3.1", - "prosemirror-commands": "^1.6.2", - "prosemirror-dropcursor": "^1.8.1", - "prosemirror-gapcursor": "^1.3.2", - "prosemirror-history": "^1.4.1", - "prosemirror-inputrules": "^1.4.0", - "prosemirror-keymap": "^1.2.2", - "prosemirror-markdown": "^1.13.1", - "prosemirror-menu": "^1.2.4", - "prosemirror-model": "^1.24.1", - "prosemirror-schema-basic": "^1.2.3", - "prosemirror-schema-list": "^1.5.0", - "prosemirror-state": "^1.4.3", - "prosemirror-tables": "^1.6.4", - "prosemirror-trailing-node": "^3.0.0", - "prosemirror-transform": "^1.10.2", - "prosemirror-view": "^1.38.1" + "prosemirror-changeset": "^2.4.4", + "prosemirror-commands": "^1.7.2", + "prosemirror-dropcursor": "^1.8.4", + "prosemirror-gapcursor": "^1.4.1", + "prosemirror-history": "^1.5.1", + "prosemirror-inputrules": "^1.5.1", + "prosemirror-keymap": "^1.2.3", + "prosemirror-model": "^1.25.12", + "prosemirror-schema-list": "^1.5.1", + "prosemirror-state": "^1.4.4", + "prosemirror-tables": "^1.8.5", + "prosemirror-transform": "^1.12.2", + "prosemirror-view": "^1.42.6" }, "funding": { "type": "github", @@ -1970,9 +2019,9 @@ "license": "MIT" }, "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "dev": true, "license": "MIT" }, @@ -1983,28 +2032,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", - "license": "MIT" - }, - "node_modules/@types/markdown-it": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", - "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", - "license": "MIT", - "dependencies": { - "@types/linkify-it": "^5", - "@types/mdurl": "^2" - } - }, - "node_modules/@types/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", - "license": "MIT" - }, "node_modules/@types/node": { "version": "22.19.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.1.tgz", @@ -2044,8 +2071,7 @@ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/@types/use-sync-external-store": { "version": "0.0.6", @@ -2157,9 +2183,9 @@ } }, "node_modules/@xmldom/xmldom": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", - "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", + "version": "0.8.15", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.15.tgz", + "integrity": "sha512-/5NV/vDALVFDXgLmfsy9TRCBlKwO2LNBFzpzvb9iIj+jR+eSc6DLYYvVOdivT/jm7MtU6TebYuRmzEOI7w40UA==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -2187,9 +2213,9 @@ } }, "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "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, "license": "MIT", "engines": { @@ -2292,13 +2318,16 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.8.31", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.31.tgz", - "integrity": "sha512-a28v2eWrrRWPpJSzxc+mKwm0ZtVx/G8SepdQZDArnXYU/XS+IF6mp8aB/4E+hH1tyGCoDo3KlUCdlSxGDsRkAw==", + "version": "2.11.33", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.33.tgz", + "integrity": "sha512-yiVKDX+qCMRKBE084lXvq9EcwFUhKZ2nU8TK1EQQuOgPNR/lmbGxXOeDdlGUqC2Zz11Cs9rk1d/8NfgBmlkt0w==", "dev": true, "license": "Apache-2.0", "bin": { - "baseline-browser-mapping": "dist/cli.js" + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/binary-extensions": { @@ -2343,9 +2372,9 @@ } }, "node_modules/browserslist": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.0.tgz", - "integrity": "sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==", + "version": "4.29.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.29.4.tgz", + "integrity": "sha512-2TcbbiwXEq+N0kD36tykpCfyyQigUXmuwNQbnPp4Xk4PX9JOqVIKjJlIDjpH7uY6tmRGoAd+apeT1p60T8wsdA==", "dev": true, "funding": [ { @@ -2363,11 +2392,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.8.25", - "caniuse-lite": "^1.0.30001754", - "electron-to-chromium": "^1.5.249", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.1.4" + "baseline-browser-mapping": "^2.11.29", + "caniuse-lite": "^1.0.30001816", + "electron-to-chromium": "^1.5.459", + "node-releases": "^2.0.59", + "update-browserslist-db": "^1.3.4" }, "bin": { "browserslist": "cli.js" @@ -2387,9 +2416,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001757", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001757.tgz", - "integrity": "sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ==", + "version": "1.0.30001819", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001819.tgz", + "integrity": "sha512-LFUqIIAwpzsIuevnKnsR9qnStBcgzPShTX61lBwN9uFkkf8o8zLiebEjbW8AYtZiF+1YKDWfdt/pWDtMuG8Xwg==", "dev": true, "funding": [ { @@ -2477,12 +2506,6 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "license": "MIT" }, - "node_modules/crelt": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", - "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", - "license": "MIT" - }, "node_modules/css-line-break": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", @@ -2560,11 +2583,10 @@ "license": "MIT" }, "node_modules/dompurify": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.7.tgz", - "integrity": "sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==", + "version": "3.4.17", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.17.tgz", + "integrity": "sha512-B/pSlYVHQ58kqISD/yDjuJ1yfzI34m1gF4lAod2bwSRhiN4K5Cl3H8Af7hqB2PmTL911tdEudnnXn5FnhRoz0w==", "license": "(MPL-2.0 OR Apache-2.0)", - "peer": true, "optionalDependencies": { "@types/trusted-types": "^2.0.7" } @@ -2579,9 +2601,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.260", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.260.tgz", - "integrity": "sha512-ov8rBoOBhVawpzdre+Cmz4FB+y66Eqrk6Gwqd8NGxuhv99GQ8XqMAr351KEkOt7gukXWDg6gJWEMKgL2RLMPtA==", + "version": "1.5.464", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.464.tgz", + "integrity": "sha512-nRa65aFge40viPAKxMKULIY8tcXKwKboJWNn4RoKwyWXJ6SP7BnrDGKUTzc64818jIciH0PK7LSF8QzZes19GA==", "dev": true, "license": "ISC" }, @@ -2613,18 +2635,6 @@ "embla-carousel": "8.6.0" } }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/esbuild": { "version": "0.25.12", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", @@ -2677,18 +2687,6 @@ "node": ">=6" } }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/fast-equals": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.3.3.tgz", @@ -3083,15 +3081,6 @@ "dev": true, "license": "MIT" }, - "node_modules/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", - "license": "MIT", - "dependencies": { - "uc.micro": "^2.0.0" - } - }, "node_modules/linkifyjs": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.3.2.tgz", @@ -3164,29 +3153,6 @@ "node": ">=12.0.0" } }, - "node_modules/markdown-it": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", - "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.0", - "mdurl": "^2.0.0", - "punycode.js": "^2.3.1", - "uc.micro": "^2.1.0" - }, - "bin": { - "markdown-it": "bin/markdown-it.mjs" - } - }, - "node_modules/markdown-it/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, "node_modules/marked": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/marked/-/marked-14.0.0.tgz", @@ -3200,12 +3166,6 @@ "node": ">= 18" } }, - "node_modules/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", - "license": "MIT" - }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -3231,9 +3191,9 @@ } }, "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "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, "license": "MIT", "engines": { @@ -3244,16 +3204,26 @@ } }, "node_modules/monaco-editor": { - "version": "0.55.1", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.55.1.tgz", - "integrity": "sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A==", + "version": "0.57.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.57.0.tgz", + "integrity": "sha512-5BkI9KGoqrNvBGUe15/QlZq3OooZ8WLg1AxTpaqHRCP3HNpzPPZKE2EDz8M7c+VRmCeUw1Brp4cx/PWm3kI/5A==", "license": "MIT", "peer": true, "dependencies": { - "dompurify": "3.2.7", + "dompurify": "3.4.15", "marked": "14.0.0" } }, + "node_modules/monaco-editor/node_modules/dompurify": { + "version": "3.4.15", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.15.tgz", + "integrity": "sha512-EUBjM+B+lkDE41iE82DDSCfkoPGfXx8IxFxPMjNzm/Uk4xDet77rTN9wqlxlVg71kK7XGuUMv6wUxJUwwv+Xyw==", + "license": "(MPL-2.0 OR Apache-2.0)", + "peer": true, + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, "node_modules/motion-dom": { "version": "12.23.23", "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.23.23.tgz", @@ -3289,9 +3259,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "version": "3.3.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.20.tgz", + "integrity": "sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==", "dev": true, "funding": [ { @@ -3308,11 +3278,14 @@ } }, "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "version": "2.0.60", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.60.tgz", + "integrity": "sha512-OmO8+GM1JUZqXET720VrJCwkjUCXmCMQm0Z3UDDRbfNLHS4NEAvY60j5jiFv0tkKw2PNNlqOLhahVmwJIOLDIQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/normalize-path": { "version": "3.0.0", @@ -3395,9 +3368,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "dev": true, "license": "MIT", "engines": { @@ -3428,9 +3401,9 @@ } }, "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "version": "8.5.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.31.tgz", + "integrity": "sha512-YUbWYCgErwnMAVkjUnYa+KlMBzGpHwiIt/DE7f0G33AuX2LH9UcTk6KgWxd3zRU+pN3u/C+Xl3EnMLM4Hea7Sg==", "dev": true, "funding": [ { @@ -3448,9 +3421,9 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.11", + "nanoid": "^3.3.20", "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "source-map-js": "^1.2.2" }, "engines": { "node": "^10 || ^12 || >=14" @@ -3563,9 +3536,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.5.tgz", + "integrity": "sha512-TEHFzb5KRDKaOgJ4TYE+0jyJtFbjLvkdVOu0fZ2b6MTWzoqZd4Le+61aEppWkvTlYePgOX4ATL1wsAIPMLTw6Q==", "dev": true, "license": "MIT", "dependencies": { @@ -3601,27 +3574,18 @@ } }, "node_modules/prosemirror-changeset": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.3.1.tgz", - "integrity": "sha512-j0kORIBm8ayJNl3zQvD1TTPHJX3g042et6y/KQhZhnPrruO8exkTgG8X+NRpj7kIyMMEx74Xb3DyMIBtO0IKkQ==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.4.4.tgz", + "integrity": "sha512-Gyuz9jYdrAeA9I7AholyOes9KUmv/lEwsC5O9s5xF5VB3EgTPsXMGUxz4+H1B+wKVPdZbvRcg1Cp3x8qX+8ofA==", "license": "MIT", "dependencies": { "prosemirror-transform": "^1.0.0" } }, - "node_modules/prosemirror-collab": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/prosemirror-collab/-/prosemirror-collab-1.3.1.tgz", - "integrity": "sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==", - "license": "MIT", - "dependencies": { - "prosemirror-state": "^1.0.0" - } - }, "node_modules/prosemirror-commands": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.7.1.tgz", - "integrity": "sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.7.2.tgz", + "integrity": "sha512-q6Q6szxqdu9Xd6EcdKsqXghu5nQdZTpB4Q9yd04WRc7/jt763e/rT60Owh0L1GYY+T46o5rD+9lEN36dZS43tw==", "license": "MIT", "dependencies": { "prosemirror-model": "^1.0.0", @@ -3630,9 +3594,9 @@ } }, "node_modules/prosemirror-dropcursor": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.2.tgz", - "integrity": "sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==", + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.4.tgz", + "integrity": "sha512-VmKxhcA6a+h5oPSYmfF1ZNeQqPbyYaIxqZsKqeYCyTlPtrjUgNaHL3P8vVaO19oqAV0zuaM/axkowZHrB1P3Tg==", "license": "MIT", "dependencies": { "prosemirror-state": "^1.0.0", @@ -3641,9 +3605,9 @@ } }, "node_modules/prosemirror-gapcursor": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.4.0.tgz", - "integrity": "sha512-z00qvurSdCEWUIulij/isHaqu4uLS8r/Fi61IbjdIPJEonQgggbJsLnstW7Lgdk4zQ68/yr6B6bf7sJXowIgdQ==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.4.1.tgz", + "integrity": "sha512-pMdYaEnjNMSwl11yjEGtgTmLkR08m/Vl+Jj443167p9eB3HVQKhYCc4gmHVDsLPODfZfjr/MmirsdyZziXbQKw==", "license": "MIT", "dependencies": { "prosemirror-keymap": "^1.0.0", @@ -3653,9 +3617,9 @@ } }, "node_modules/prosemirror-history": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.5.0.tgz", - "integrity": "sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.5.1.tgz", + "integrity": "sha512-onlwnqKvgtFg6srZOmDOAhlAy1FIHQpOExORybX0S+DvJepE5tPALrB9iGet/2sqqqrelSnB10OoiOJqAvu2DA==", "license": "MIT", "dependencies": { "prosemirror-state": "^1.2.2", @@ -3684,47 +3648,15 @@ "w3c-keyname": "^2.2.0" } }, - "node_modules/prosemirror-markdown": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.13.2.tgz", - "integrity": "sha512-FPD9rHPdA9fqzNmIIDhhnYQ6WgNoSWX9StUZ8LEKapaXU9i6XgykaHKhp6XMyXlOWetmaFgGDS/nu/w9/vUc5g==", - "license": "MIT", - "dependencies": { - "@types/markdown-it": "^14.0.0", - "markdown-it": "^14.0.0", - "prosemirror-model": "^1.25.0" - } - }, - "node_modules/prosemirror-menu": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.2.5.tgz", - "integrity": "sha512-qwXzynnpBIeg1D7BAtjOusR+81xCp53j7iWu/IargiRZqRjGIlQuu1f3jFi+ehrHhWMLoyOQTSRx/IWZJqOYtQ==", - "license": "MIT", - "dependencies": { - "crelt": "^1.0.0", - "prosemirror-commands": "^1.0.0", - "prosemirror-history": "^1.0.0", - "prosemirror-state": "^1.0.0" - } - }, "node_modules/prosemirror-model": { - "version": "1.25.4", - "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.4.tgz", - "integrity": "sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA==", + "version": "1.25.12", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.12.tgz", + "integrity": "sha512-Ue2gTmXMa7EhpLNhC7J+h4+ykD8ha12K6rrZFFKKJHBForfIStw5gJ6Zrf1mqqAa9NmpmEB4wp9bKmA4eUVjWg==", "license": "MIT", "dependencies": { "orderedmap": "^2.0.0" } }, - "node_modules/prosemirror-schema-basic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.4.tgz", - "integrity": "sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ==", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.25.0" - } - }, "node_modules/prosemirror-schema-list": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.5.1.tgz", @@ -3748,9 +3680,9 @@ } }, "node_modules/prosemirror-tables": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.8.3.tgz", - "integrity": "sha512-wbqCR/RlRPRe41a4LFtmhKElzBEfBTdtAYWNIGHM6X2e24NN/MTNUKyXjjphfAfdQce37Kh/5yf765mLPYDe7Q==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.8.5.tgz", + "integrity": "sha512-V/0cDCsHKHe/tfWkeCmthNUcEp1IVO3p6vwN8XtwE9PZQLAZJigbw3QoraAdfJPir4NKJtNvOB8oYGKRl+t0Dw==", "license": "MIT", "dependencies": { "prosemirror-keymap": "^1.2.3", @@ -3760,50 +3692,26 @@ "prosemirror-view": "^1.41.4" } }, - "node_modules/prosemirror-trailing-node": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-3.0.0.tgz", - "integrity": "sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==", - "license": "MIT", - "dependencies": { - "@remirror/core-constants": "3.0.0", - "escape-string-regexp": "^4.0.0" - }, - "peerDependencies": { - "prosemirror-model": "^1.22.1", - "prosemirror-state": "^1.4.2", - "prosemirror-view": "^1.33.8" - } - }, "node_modules/prosemirror-transform": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.10.5.tgz", - "integrity": "sha512-RPDQCxIDhIBb1o36xxwsaeAvivO8VLJcgBtzmOwQ64bMtsVFh5SSuJ6dWSxO1UsHTiTXPCgQm3PDJt7p6IOLbw==", + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.12.4.tgz", + "integrity": "sha512-2/WuPum3pn+O/Vi2vzpi8210ICUe2kIPXdLYjQ09Pv5DtT5bcKWMJhAKPBwvpPjpp5iOYUVwVEr0gOM1BY1Mgw==", "license": "MIT", "dependencies": { "prosemirror-model": "^1.21.0" } }, "node_modules/prosemirror-view": { - "version": "1.41.4", - "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.41.4.tgz", - "integrity": "sha512-WkKgnyjNncri03Gjaz3IFWvCAE94XoiEgvtr0/r2Xw7R8/IjK3sKLSiDoCHWcsXSAinVaKlGRZDvMCsF1kbzjA==", + "version": "1.42.8", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.42.8.tgz", + "integrity": "sha512-ftDZjCs9AjAekXmCfJRn2U3IdlRCl0Yc4tZT1/jJWCsz4DiSifEBXtWmpJpw/4f1Rg328uAUQ+u2lCJ0+AVZkw==", "license": "MIT", "dependencies": { - "prosemirror-model": "^1.20.0", + "prosemirror-model": "^1.25.12", "prosemirror-state": "^1.0.0", "prosemirror-transform": "^1.1.0" } }, - "node_modules/punycode.js": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/pyodide": { "version": "0.29.0", "resolved": "https://registry.npmjs.org/pyodide/-/pyodide-0.29.0.tgz", @@ -3919,12 +3827,12 @@ } }, "node_modules/react-router": { - "version": "6.30.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.2.tgz", - "integrity": "sha512-H2Bm38Zu1bm8KUE5NVWRMzuIyAV8p/JrOaBJAwVmp37AXG72+CZJlEBw6pdn9i5TBgLMhNDgijS4ZlblpHyWTA==", + "version": "6.30.6", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.6.tgz", + "integrity": "sha512-5HfK7k5im7LTOB0EqCQmfvy4C13G92Ssj1VTmouTK3AJvyjKTnFuCV0vcMAD/JS+JC4DvDIBRrlAeJIFjh5VWg==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.23.1" + "@remix-run/router": "1.23.4" }, "engines": { "node": ">=14.0.0" @@ -3934,13 +3842,13 @@ } }, "node_modules/react-router-dom": { - "version": "6.30.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.2.tgz", - "integrity": "sha512-l2OwHn3UUnEVUqc6/1VMmR1cvZryZ3j3NzapC2eUXO1dB0sYp5mvwdjiXhpUbRb21eFow3qSxpP8Yv6oAU824Q==", + "version": "6.30.6", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.6.tgz", + "integrity": "sha512-0RHKZz7wwffvkU+2MFVT2NnjK44ssLEV+m0CAJaS2Ksmorrwj7WxH00jO0SOCW26/tINUnJHToXblDs33I38YQ==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.23.1", - "react-router": "6.30.2" + "@remix-run/router": "1.23.4", + "react-router": "6.30.6" }, "engines": { "node": ">=14.0.0" @@ -3989,9 +3897,9 @@ } }, "node_modules/readdirp/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "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, "license": "MIT", "engines": { @@ -4034,13 +3942,13 @@ } }, "node_modules/rollup": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz", - "integrity": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==", + "version": "4.65.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.65.1.tgz", + "integrity": "sha512-HzD4IdphaPMvuAacnL/vtoq5B8FwqewKvxTtqYibWvP6VDyZ+UsTtlw5F8HIOIIpLQAkN2NOP/0sM3puo9xN/A==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.8" + "@types/estree": "1.0.9" }, "bin": { "rollup": "dist/bin/rollup" @@ -4050,28 +3958,32 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.53.3", - "@rollup/rollup-android-arm64": "4.53.3", - "@rollup/rollup-darwin-arm64": "4.53.3", - "@rollup/rollup-darwin-x64": "4.53.3", - "@rollup/rollup-freebsd-arm64": "4.53.3", - "@rollup/rollup-freebsd-x64": "4.53.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.53.3", - "@rollup/rollup-linux-arm-musleabihf": "4.53.3", - "@rollup/rollup-linux-arm64-gnu": "4.53.3", - "@rollup/rollup-linux-arm64-musl": "4.53.3", - "@rollup/rollup-linux-loong64-gnu": "4.53.3", - "@rollup/rollup-linux-ppc64-gnu": "4.53.3", - "@rollup/rollup-linux-riscv64-gnu": "4.53.3", - "@rollup/rollup-linux-riscv64-musl": "4.53.3", - "@rollup/rollup-linux-s390x-gnu": "4.53.3", - "@rollup/rollup-linux-x64-gnu": "4.53.3", - "@rollup/rollup-linux-x64-musl": "4.53.3", - "@rollup/rollup-openharmony-arm64": "4.53.3", - "@rollup/rollup-win32-arm64-msvc": "4.53.3", - "@rollup/rollup-win32-ia32-msvc": "4.53.3", - "@rollup/rollup-win32-x64-gnu": "4.53.3", - "@rollup/rollup-win32-x64-msvc": "4.53.3", + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.65.1", + "@rollup/rollup-android-arm64": "4.65.1", + "@rollup/rollup-darwin-arm64": "4.65.1", + "@rollup/rollup-darwin-x64": "4.65.1", + "@rollup/rollup-freebsd-arm64": "4.65.1", + "@rollup/rollup-freebsd-x64": "4.65.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.65.1", + "@rollup/rollup-linux-arm-musleabihf": "4.65.1", + "@rollup/rollup-linux-arm64-gnu": "4.65.1", + "@rollup/rollup-linux-arm64-musl": "4.65.1", + "@rollup/rollup-linux-loong64-gnu": "4.65.1", + "@rollup/rollup-linux-loong64-musl": "4.65.1", + "@rollup/rollup-linux-ppc64-gnu": "4.65.1", + "@rollup/rollup-linux-ppc64-musl": "4.65.1", + "@rollup/rollup-linux-riscv64-gnu": "4.65.1", + "@rollup/rollup-linux-riscv64-musl": "4.65.1", + "@rollup/rollup-linux-s390x-gnu": "4.65.1", + "@rollup/rollup-linux-x64-gnu": "4.65.1", + "@rollup/rollup-linux-x64-musl": "4.65.1", + "@rollup/rollup-openbsd-x64": "4.65.1", + "@rollup/rollup-openharmony-arm64": "4.65.1", + "@rollup/rollup-win32-arm64-msvc": "4.65.1", + "@rollup/rollup-win32-ia32-msvc": "4.65.1", + "@rollup/rollup-win32-x64-gnu": "4.65.1", + "@rollup/rollup-win32-x64-msvc": "4.65.1", "fsevents": "~2.3.2" } }, @@ -4134,9 +4046,9 @@ "license": "MIT" }, "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==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz", + "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -4337,16 +4249,10 @@ "node": ">=14.17" } }, - "node_modules/uc.micro": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "license": "MIT" - }, "node_modules/underscore": { - "version": "1.13.7", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz", - "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==", + "version": "1.13.8", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.8.tgz", + "integrity": "sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==", "license": "MIT" }, "node_modules/undici-types": { @@ -4356,9 +4262,9 @@ "license": "MIT" }, "node_modules/update-browserslist-db": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", - "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.4.tgz", + "integrity": "sha512-t8wonIOdQyOjtPd2VktlBu6QjTVTks6v8bSi7kd0r2Vll8TK1JYDZtRRdbmCHOAMphkZgrzK+L+vXK4pyZ8t4A==", "dev": true, "funding": [ { @@ -4417,9 +4323,9 @@ "license": "MIT" }, "node_modules/vite": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", - "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", + "version": "6.4.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.5.tgz", + "integrity": "sha512-4enwjFfi4IwtEh0w+jPzpLVOFQiPHmmzPxcHXQOyEur47o6u0jE573DmGpjA+7irXoMLYRZD5ZaFUEneS3abPg==", "dev": true, "license": "MIT", "dependencies": { @@ -4524,9 +4430,9 @@ } }, "node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.22.0.tgz", + "integrity": "sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -4561,9 +4467,9 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.1.tgz", + "integrity": "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==", "dev": true, "license": "ISC", "bin": { @@ -4571,6 +4477,9 @@ }, "engines": { "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" } } } diff --git a/package.json b/package.json index 24560f0..84156e3 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "browser-image-compression": "^2.0.2", "clsx": "^2.1.1", "date-fns": "^4.1.0", + "dompurify": "^3.4.17", "embla-carousel-react": "^8.6.0", "framer-motion": "^12.23.24", "gsap": "^3.14.2", diff --git a/pages/Auth/Register.tsx b/pages/Auth/Register.tsx index 56514fb..b98d81e 100644 --- a/pages/Auth/Register.tsx +++ b/pages/Auth/Register.tsx @@ -36,7 +36,7 @@ export const Register = () => { options: { data: { username: username, - avatar_url: `https://ui-avatars.com/api/?name=${username}&background=random` + avatar_url: `https://ui-avatars.com/api/?name=${encodeURIComponent(username)}&background=random` } } }); diff --git a/pages/Karya.tsx b/pages/Karya.tsx index 4837ff9..6b1ce81 100644 --- a/pages/Karya.tsx +++ b/pages/Karya.tsx @@ -29,6 +29,7 @@ import { useLoadingStatus } from '../components/LoadingTimeoutProvider'; import { supabase } from '../lib/supabase'; import { motionConfig } from '../lib/motion'; +import { sanitizeHtml } from '../lib/sanitize'; // Helper buat generate pratinjau kode live (HTML) // Komponen Helper buat lihat Kode @@ -488,7 +489,7 @@ export const Karya = () => {
@@ -507,7 +508,7 @@ export const Karya = () => { {/* Iframe Pratinjau buat Kartu - Pake Data URI biar lebih kompatibel */}