mirror of
https://github.com/cupcakearmy/cryptgeon.git
synced 2026-09-27 04:51:45 +00:00
Compare commits
19
Commits
v3.0.0-rc.3
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f6ea6376e1 | ||
|
|
19e7899309 | ||
|
|
9e69730bfd | ||
|
|
b5e1c4b42a | ||
|
|
7660dd7c30 | ||
|
|
685784c360 | ||
|
|
cc2c45221b | ||
|
|
b113d253a9 | ||
|
|
c99c62cf00 | ||
|
|
7ef162bd83 | ||
|
|
282fdb97d1 | ||
|
|
4dfed492bc | ||
|
|
5084ed59f0 | ||
|
|
055a48a38d | ||
|
|
d1126ace82 | ||
|
|
b58bf8af6d | ||
|
|
a57ead61b9 | ||
|
|
0d597edfee | ||
|
|
8034b1a501 |
@@ -34,6 +34,9 @@ jobs:
|
|||||||
- name: Shared tests
|
- name: Shared tests
|
||||||
run: pnpm --filter @cryptgeon/shared test
|
run: pnpm --filter @cryptgeon/shared test
|
||||||
|
|
||||||
|
- name: Frontend type check
|
||||||
|
run: pnpm --filter @cryptgeon/web check
|
||||||
|
|
||||||
- name: Run your tests
|
- name: Run your tests
|
||||||
run: pnpm test
|
run: pnpm test
|
||||||
|
|
||||||
|
|||||||
+6
-2
@@ -11,15 +11,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
- New shared TypeScript package `@cryptgeon/shared` as single source of truth for crypto, content codec and API client (crypto + compression + payload + types).
|
- New shared TypeScript package `@cryptgeon/shared` as single source of truth for crypto, content codec and API client (crypto + compression + payload + types).
|
||||||
- Shared payload codec: `packContent` / `unpackContent` (encode → LZ4 → XChaCha20-Poly1305 and reverse).
|
- Shared payload codec: `packContent` / `unpackContent` (encode → LZ4 → XChaCha20-Poly1305 and reverse).
|
||||||
- New `pg`-backend storage of note hashes in the cache.
|
- Cache-backed note storage using hashes (valkey/redis) with atomic view counting.
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
- Encryption from AES to **XChaCha20-Poly1305** (client-side); dropped `occulto`.
|
- Encryption from AES to **XChaCha20-Poly1305** (client-side); dropped `occulto`.
|
||||||
- All API bodies switched to **MessagePack**.
|
- All API bodies switched to **MessagePack**.
|
||||||
- Frontend migrated to SvelteKit + `@cryptgeon/shared`.
|
- Frontend uses `@cryptgeon/shared` for crypto + payload codec (replacing the previous local `cryptgeon/shared`); heavy pack/unpack runs in a web worker.
|
||||||
- CLI rebuilt with `vite-plus` (bundles all deps) and imports from `@cryptgeon/shared`.
|
- CLI rebuilt with `vite-plus` (bundles all deps) and imports from `@cryptgeon/shared`.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- SPA fallback now serves the app (200) for client-side routes such as `/about` and `/note/<id>`, while unmatched `/api/*` paths still return 404.
|
||||||
|
|
||||||
### Breaking changes
|
### Breaking changes
|
||||||
|
|
||||||
- Endpoints moved to `/api/v3/notes/` and `/api/v3/status`; health check to `/healthz`.
|
- Endpoints moved to `/api/v3/notes/` and `/api/v3/status`; health check to `/healthz`.
|
||||||
|
|||||||
@@ -169,6 +169,10 @@ See [CONTRIBUTING.md](./CONTRIBUTING.md).
|
|||||||
|
|
||||||
Please refer to the security section [here](./SECURITY.md).
|
Please refer to the security section [here](./SECURITY.md).
|
||||||
|
|
||||||
|
## Usage of LLMs
|
||||||
|
|
||||||
|
Starting from V3, I used LLMs heavily to implement _my own ideas_. This means that the direction and architecture choices are human. A lot of the implementation that derives from that, is automated with an LLM.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
_Attributions_
|
_Attributions_
|
||||||
|
|||||||
@@ -151,6 +151,10 @@ Ver [CONTRIBUTING.md](./CONTRIBUTING.md).
|
|||||||
|
|
||||||
Por favor dirígete a la sección de seguridad [aquí](./SECURITY.md).
|
Por favor dirígete a la sección de seguridad [aquí](./SECURITY.md).
|
||||||
|
|
||||||
|
## Uso de LLMs
|
||||||
|
|
||||||
|
A partir de la V3, utilicé LLMs de forma intensiva para implementar _mis propias ideas_. Esto significa que la dirección y las decisiones de arquitectura son humanas. Gran parte de la implementación que deriva de eso está automatizada con un LLM.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
_Atribuciones_
|
_Atribuciones_
|
||||||
|
|||||||
@@ -149,6 +149,10 @@ services:
|
|||||||
|
|
||||||
参见 [CONTRIBUTING.md](./CONTRIBUTING.md)。
|
参见 [CONTRIBUTING.md](./CONTRIBUTING.md)。
|
||||||
|
|
||||||
|
## LLM 的使用
|
||||||
|
|
||||||
|
从 V3 开始,我大量使用 LLM 来实现_我自己的想法_。这意味着项目的方向和架构选择均由人类决定。由此衍生的大部分实现由 LLM 自动完成。
|
||||||
|
|
||||||
###### Attributions
|
###### Attributions
|
||||||
|
|
||||||
- 测试数据:
|
- 测试数据:
|
||||||
|
|||||||
+10
-12
@@ -1,17 +1,17 @@
|
|||||||
services:
|
services:
|
||||||
cache:
|
cache:
|
||||||
image: valkey/valkey:7-alpine
|
image: valkey/valkey:9-alpine
|
||||||
# This is required to stay in RAM only.
|
# This is required to stay in RAM only.
|
||||||
command: valkey-server --save "" --appendonly no
|
command: valkey-server --save "" --appendonly no
|
||||||
# Set a size limit. See link below on how to customise.
|
# Set a size limit. See link below on how to customise.
|
||||||
# https://valkey.io/docs/latest/operate/rs/databases/memory-performance/eviction-policy/
|
# https://valkey.io/topics/lru-cache/
|
||||||
# --maxmemory 1gb --maxmemory-policy allkeys-lrulpine
|
# --maxmemory 1gb --maxmemory-policy allkeys-lru
|
||||||
# This prevents the creation of an anonymous volume.
|
# This prevents the creation of an anonymous volume.
|
||||||
tmpfs:
|
tmpfs:
|
||||||
- /data
|
- /data
|
||||||
|
|
||||||
app:
|
app:
|
||||||
image: cupcakearmy/cryptgeon:v3
|
image: cupcakearmy/cryptgeon:3
|
||||||
depends_on:
|
depends_on:
|
||||||
- cache
|
- cache
|
||||||
environment:
|
environment:
|
||||||
@@ -19,11 +19,9 @@ services:
|
|||||||
SIZE_LIMIT: 4 MiB
|
SIZE_LIMIT: 4 MiB
|
||||||
ports:
|
ports:
|
||||||
- 80:8000
|
- 80:8000
|
||||||
|
healthcheck:
|
||||||
# Optional health checks
|
test: ["CMD", "curl", "--fail", "http://127.0.0.1:8000/healthz"]
|
||||||
# healthcheck:
|
interval: 1m
|
||||||
# test: ["CMD", "curl", "--fail", "http://127.0.0.1:8000/healthz"]
|
timeout: 3s
|
||||||
# interval: 1m
|
retries: 2
|
||||||
# timeout: 3s
|
start_period: 5s
|
||||||
# retries: 2
|
|
||||||
# start_period: 5s
|
|
||||||
|
|||||||
Generated
+1
-1
@@ -252,7 +252,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cryptgeon"
|
name = "cryptgeon"
|
||||||
version = "3.0.0-rc.3"
|
version = "3.0.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"axum",
|
"axum",
|
||||||
"bs62",
|
"bs62",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "cryptgeon"
|
name = "cryptgeon"
|
||||||
version = "3.0.0-rc.3"
|
version = "3.0.0"
|
||||||
authors = ["cupcakearmy <hi@nicco.io>"]
|
authors = ["cupcakearmy <hi@nicco.io>"]
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
rust-version = "1.95"
|
rust-version = "1.95"
|
||||||
|
|||||||
@@ -20,6 +20,10 @@ mod note;
|
|||||||
mod status;
|
mod status;
|
||||||
mod store;
|
mod store;
|
||||||
|
|
||||||
|
async fn api_not_found() -> axum::http::StatusCode {
|
||||||
|
axum::http::StatusCode::NOT_FOUND
|
||||||
|
}
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() {
|
async fn main() {
|
||||||
dotenv().ok();
|
dotenv().ok();
|
||||||
@@ -39,11 +43,13 @@ async fn main() {
|
|||||||
.nest("/notes", notes_routes)
|
.nest("/notes", notes_routes)
|
||||||
.merge(status_routes);
|
.merge(status_routes);
|
||||||
|
|
||||||
let api_routes = Router::new().nest("/v3", v3_routes);
|
let api_routes = Router::new()
|
||||||
|
.nest("/v3", v3_routes)
|
||||||
|
.fallback(api_not_found);
|
||||||
|
|
||||||
let index = format!("{}{}", config::FRONTEND_PATH.to_string(), "/index.html");
|
let index = format!("{}{}", config::FRONTEND_PATH.to_string(), "/index.html");
|
||||||
let serve_dir =
|
let serve_dir =
|
||||||
ServeDir::new(config::FRONTEND_PATH.to_string()).not_found_service(ServeFile::new(index));
|
ServeDir::new(config::FRONTEND_PATH.to_string()).fallback(ServeFile::new(index));
|
||||||
let app = Router::new()
|
let app = Router::new()
|
||||||
.nest("/api", api_routes)
|
.nest("/api", api_routes)
|
||||||
.merge(health_routes)
|
.merge(health_routes)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "cryptgeon",
|
"name": "cryptgeon",
|
||||||
"version": "3.0.0-rc.3",
|
"version": "3.0.0",
|
||||||
"homepage": "https://github.com/cupcakearmy/cryptgeon",
|
"homepage": "https://github.com/cupcakearmy/cryptgeon",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
|||||||
@@ -13,21 +13,22 @@
|
|||||||
"type": "module",
|
"type": "module",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@sveltejs/adapter-static": "^3.0.10",
|
"@sveltejs/adapter-static": "^3.0.10",
|
||||||
"@sveltejs/kit": "^2.61.1",
|
"@sveltejs/kit": "^2.70.3",
|
||||||
"@sveltejs/vite-plugin-svelte": "^7.1.2",
|
"@sveltejs/vite-plugin-svelte": "^7.3.0",
|
||||||
"@zerodevx/svelte-toast": "^0.9.6",
|
"@zerodevx/svelte-toast": "^0.9.6",
|
||||||
"license-checker-rseidelsohn": "^5.0.1",
|
"license-checker-rseidelsohn": "^5.0.1",
|
||||||
"svelte": "^5.55.9",
|
"svelte": "^5.57.0",
|
||||||
"svelte-check": "^4.4.8",
|
"svelte-check": "^4.7.6",
|
||||||
"svelte-intl-precompile": "^0.12.3",
|
"svelte-intl-precompile": "^0.12.3",
|
||||||
"tslib": "^2.8.1",
|
"tslib": "^2.8.1",
|
||||||
"typescript": "^6.0.3",
|
"typescript": "^6.0.3",
|
||||||
"vite": "^8.0.14"
|
"vite": "^8.2.2"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@cryptgeon/shared": "workspace:*",
|
"@cryptgeon/shared": "workspace:*",
|
||||||
"@fontsource/fira-mono": "^5.2.7",
|
"@fontsource/fira-mono": "^5.3.0",
|
||||||
"pretty-bytes": "^7.1.0",
|
"comlink": "^4.4.2",
|
||||||
|
"pretty-bytes": "^7.1.3",
|
||||||
"uqr": "^0.1.3"
|
"uqr": "^0.1.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,11 +46,11 @@ async function downloadFile(file: FileDTO) {
|
|||||||
files = note.contents
|
files = note.contents
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
let download = $derived(() => {
|
function downloadAll() {
|
||||||
for (const file of files) {
|
for (const file of files) {
|
||||||
downloadFile(file)
|
downloadFile(file)
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
let links = $derived(typeof note.contents === 'string' ? note.contents.match(RE_URL) : [])
|
let links = $derived(typeof note.contents === 'string' ? note.contents.match(RE_URL) : [])
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -92,7 +92,7 @@ async function downloadFile(file: FileDTO) {
|
|||||||
{/key}
|
{/key}
|
||||||
{/if}
|
{/if}
|
||||||
{/each}
|
{/each}
|
||||||
<Button onclick={download}>{$t('show.download_all')}</Button>
|
<Button onclick={downloadAll}>{$t('show.download_all')}</Button>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,15 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import {
|
import {
|
||||||
bytesToHex,
|
|
||||||
create as apiCreate,
|
create as apiCreate,
|
||||||
|
bytesToHex,
|
||||||
packContent,
|
packContent,
|
||||||
type ServerNote
|
type FileDTO,
|
||||||
|
type NoteInput,
|
||||||
|
type ServerNote,
|
||||||
} from '@cryptgeon/shared'
|
} from '@cryptgeon/shared'
|
||||||
import { t } from 'svelte-intl-precompile'
|
import { t } from 'svelte-intl-precompile'
|
||||||
import { blur } from 'svelte/transition'
|
import { blur } from 'svelte/transition'
|
||||||
|
import { transfer } from 'comlink'
|
||||||
|
|
||||||
import { status } from '$lib/stores/status'
|
import { status } from '$lib/stores/status'
|
||||||
import { notify } from '$lib/toast'
|
import { notify } from '$lib/toast'
|
||||||
@@ -15,10 +18,12 @@
|
|||||||
import FileUpload from '$lib/ui/FileUpload.svelte'
|
import FileUpload from '$lib/ui/FileUpload.svelte'
|
||||||
import Loader from '$lib/ui/Loader.svelte'
|
import Loader from '$lib/ui/Loader.svelte'
|
||||||
import MaxSize from '$lib/ui/MaxSize.svelte'
|
import MaxSize from '$lib/ui/MaxSize.svelte'
|
||||||
import PastedFilesPreview from '$lib/ui/PastedFilesPreview.svelte'
|
|
||||||
import Result, { type NoteResult } from '$lib/ui/NoteResult.svelte'
|
import Result, { type NoteResult } from '$lib/ui/NoteResult.svelte'
|
||||||
|
import PastedFilesPreview from '$lib/ui/PastedFilesPreview.svelte'
|
||||||
import Switch from '$lib/ui/Switch.svelte'
|
import Switch from '$lib/ui/Switch.svelte'
|
||||||
import TextArea from '$lib/ui/TextArea.svelte'
|
import TextArea from '$lib/ui/TextArea.svelte'
|
||||||
|
import { createWorker } from '$lib/worker'
|
||||||
|
import { onMount } from 'svelte'
|
||||||
|
|
||||||
let note: { views: number; expiration: number } = $state({ views: 1, expiration: 60 })
|
let note: { views: number; expiration: number } = $state({ views: 1, expiration: 60 })
|
||||||
let files: FileDTO[] = $state([])
|
let files: FileDTO[] = $state([])
|
||||||
@@ -53,6 +58,8 @@
|
|||||||
if (!isFile) textContent = ''
|
if (!isFile) textContent = ''
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const worker = createWorker()
|
||||||
|
|
||||||
async function handlePaste(e: ClipboardEvent) {
|
async function handlePaste(e: ClipboardEvent) {
|
||||||
const data = e.clipboardData
|
const data = e.clipboardData
|
||||||
if (!data) return
|
if (!data) return
|
||||||
@@ -123,13 +130,21 @@
|
|||||||
throw new EmptyContentError()
|
throw new EmptyContentError()
|
||||||
}
|
}
|
||||||
|
|
||||||
const payload = packContent(
|
const noteInput: NoteInput = isFile
|
||||||
isFile ? { type: 'files', files } : { type: 'text', text: textContent },
|
? transfer(
|
||||||
customPassword || undefined
|
{
|
||||||
|
type: 'files',
|
||||||
|
files: $state.snapshot(files),
|
||||||
|
},
|
||||||
|
files.map((f) => f.data.buffer)
|
||||||
)
|
)
|
||||||
|
: { type: 'text', text: textContent }
|
||||||
|
const payload = await worker.pack(noteInput, customPassword || undefined)
|
||||||
const serverNote: ServerNote = {
|
const serverNote: ServerNote = {
|
||||||
meta: {
|
meta: {
|
||||||
...(timeExpiration ? { expiration: parseInt(note.expiration as any) } : { views: parseInt(note.views as any) }),
|
...(timeExpiration
|
||||||
|
? { expiration: parseInt(note.expiration as any) }
|
||||||
|
: { views: parseInt(note.views as any) }),
|
||||||
extra: payload.extra,
|
extra: payload.extra,
|
||||||
},
|
},
|
||||||
data: payload.data,
|
data: payload.data,
|
||||||
|
|||||||
@@ -0,0 +1,14 @@
|
|||||||
|
import { wrap } from 'comlink'
|
||||||
|
|
||||||
|
import CryptWorker from './worker?worker'
|
||||||
|
import type { packContent, unpackContent } from '@cryptgeon/shared'
|
||||||
|
|
||||||
|
export function createWorker() {
|
||||||
|
const worker = new CryptWorker()
|
||||||
|
return wrap<WorkerConract>(worker)
|
||||||
|
}
|
||||||
|
|
||||||
|
export type WorkerConract = {
|
||||||
|
pack: typeof packContent
|
||||||
|
unpack: typeof unpackContent
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
import type { WorkerConract } from '$lib/worker'
|
||||||
|
import { packContent, unpackContent } from '@cryptgeon/shared'
|
||||||
|
import { expose, transfer } from 'comlink'
|
||||||
|
|
||||||
|
const contract: WorkerConract = {
|
||||||
|
pack(input, password) {
|
||||||
|
const content = packContent(input, password)
|
||||||
|
return transfer(content, [content.data.buffer, content.extra.buffer, content.key.buffer])
|
||||||
|
},
|
||||||
|
unpack(data, key) {
|
||||||
|
return unpackContent(data, key)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
expose(contract)
|
||||||
@@ -1,5 +1,13 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { deriveKey, hexToBytes, decode, info, get as apiGet, unpackContent, type FileDTO } from '@cryptgeon/shared'
|
import {
|
||||||
|
deriveKey,
|
||||||
|
hexToBytes,
|
||||||
|
decode,
|
||||||
|
info,
|
||||||
|
get as apiGet,
|
||||||
|
unpackContent,
|
||||||
|
type FileDTO,
|
||||||
|
} from '@cryptgeon/shared'
|
||||||
import { onMount } from 'svelte'
|
import { onMount } from 'svelte'
|
||||||
import { t } from 'svelte-intl-precompile'
|
import { t } from 'svelte-intl-precompile'
|
||||||
|
|
||||||
@@ -8,6 +16,7 @@
|
|||||||
import ShowNote, { type DecryptedNote } from '$lib/ui/ShowNote.svelte'
|
import ShowNote, { type DecryptedNote } from '$lib/ui/ShowNote.svelte'
|
||||||
import TextInput from '$lib/ui/TextInput.svelte'
|
import TextInput from '$lib/ui/TextInput.svelte'
|
||||||
import type { PageData } from './$types'
|
import type { PageData } from './$types'
|
||||||
|
import { createWorker } from '$lib/worker'
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
data: PageData
|
data: PageData
|
||||||
@@ -44,6 +53,8 @@
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const worker = createWorker()
|
||||||
|
|
||||||
async function show(e: SubmitEvent) {
|
async function show(e: SubmitEvent) {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
try {
|
try {
|
||||||
@@ -69,7 +80,7 @@
|
|||||||
key = hexToBytes(password!)
|
key = hexToBytes(password!)
|
||||||
}
|
}
|
||||||
|
|
||||||
const content = unpackContent(serverNote.data, key)
|
const content = await worker.unpack(serverNote.data, key)
|
||||||
|
|
||||||
switch (content.type) {
|
switch (content.type) {
|
||||||
case 'text':
|
case 'text':
|
||||||
@@ -78,7 +89,7 @@
|
|||||||
contents: content.data,
|
contents: content.data,
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
case 'files':
|
case 'files':
|
||||||
const files = (content.data as any[]).map((f: any) => ({
|
const files = (content.data as any[]).map((f: any) => ({
|
||||||
...f,
|
...f,
|
||||||
data: f.data instanceof Uint8Array ? f.data : new Uint8Array(f.data as any),
|
data: f.data instanceof Uint8Array ? f.data : new Uint8Array(f.data as any),
|
||||||
@@ -87,7 +98,7 @@ case 'files':
|
|||||||
meta: { type: 'file' },
|
meta: { type: 'file' },
|
||||||
contents: files,
|
contents: files,
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
default:
|
default:
|
||||||
error = $t('show.errors.unsupported_type')
|
error = $t('show.errors.unsupported_type')
|
||||||
return
|
return
|
||||||
|
|||||||
Generated
+107
-115
@@ -74,11 +74,14 @@ importers:
|
|||||||
specifier: workspace:*
|
specifier: workspace:*
|
||||||
version: link:../shared
|
version: link:../shared
|
||||||
'@fontsource/fira-mono':
|
'@fontsource/fira-mono':
|
||||||
specifier: ^5.2.7
|
specifier: ^5.3.0
|
||||||
version: 5.3.0
|
version: 5.3.0
|
||||||
|
comlink:
|
||||||
|
specifier: ^4.4.2
|
||||||
|
version: 4.4.2
|
||||||
pretty-bytes:
|
pretty-bytes:
|
||||||
specifier: ^7.1.0
|
specifier: ^7.1.3
|
||||||
version: 7.1.2
|
version: 7.1.3
|
||||||
uqr:
|
uqr:
|
||||||
specifier: ^0.1.3
|
specifier: ^0.1.3
|
||||||
version: 0.1.3
|
version: 0.1.3
|
||||||
@@ -87,10 +90,10 @@ importers:
|
|||||||
specifier: ^3.0.10
|
specifier: ^3.0.10
|
||||||
version: 3.0.10(@sveltejs/kit@2.70.3(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.57.0)(vite@8.2.2(@types/node@24.13.3)))(svelte@5.57.0)(typescript@6.0.3)(vite@8.2.2(@types/node@24.13.3)))
|
version: 3.0.10(@sveltejs/kit@2.70.3(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.57.0)(vite@8.2.2(@types/node@24.13.3)))(svelte@5.57.0)(typescript@6.0.3)(vite@8.2.2(@types/node@24.13.3)))
|
||||||
'@sveltejs/kit':
|
'@sveltejs/kit':
|
||||||
specifier: ^2.61.1
|
specifier: ^2.70.3
|
||||||
version: 2.70.3(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.57.0)(vite@8.2.2(@types/node@24.13.3)))(svelte@5.57.0)(typescript@6.0.3)(vite@8.2.2(@types/node@24.13.3))
|
version: 2.70.3(@sveltejs/vite-plugin-svelte@7.3.0(svelte@5.57.0)(vite@8.2.2(@types/node@24.13.3)))(svelte@5.57.0)(typescript@6.0.3)(vite@8.2.2(@types/node@24.13.3))
|
||||||
'@sveltejs/vite-plugin-svelte':
|
'@sveltejs/vite-plugin-svelte':
|
||||||
specifier: ^7.1.2
|
specifier: ^7.3.0
|
||||||
version: 7.3.0(svelte@5.57.0)(vite@8.2.2(@types/node@24.13.3))
|
version: 7.3.0(svelte@5.57.0)(vite@8.2.2(@types/node@24.13.3))
|
||||||
'@zerodevx/svelte-toast':
|
'@zerodevx/svelte-toast':
|
||||||
specifier: ^0.9.6
|
specifier: ^0.9.6
|
||||||
@@ -99,10 +102,10 @@ importers:
|
|||||||
specifier: ^5.0.1
|
specifier: ^5.0.1
|
||||||
version: 5.0.1
|
version: 5.0.1
|
||||||
svelte:
|
svelte:
|
||||||
specifier: ^5.55.9
|
specifier: ^5.57.0
|
||||||
version: 5.57.0
|
version: 5.57.0
|
||||||
svelte-check:
|
svelte-check:
|
||||||
specifier: ^4.4.8
|
specifier: ^4.7.6
|
||||||
version: 4.7.6(picomatch@4.0.7)(svelte@5.57.0)(typescript@6.0.3)
|
version: 4.7.6(picomatch@4.0.7)(svelte@5.57.0)(typescript@6.0.3)
|
||||||
svelte-intl-precompile:
|
svelte-intl-precompile:
|
||||||
specifier: ^0.12.3
|
specifier: ^0.12.3
|
||||||
@@ -114,7 +117,7 @@ importers:
|
|||||||
specifier: ^6.0.3
|
specifier: ^6.0.3
|
||||||
version: 6.0.3
|
version: 6.0.3
|
||||||
vite:
|
vite:
|
||||||
specifier: ^8.0.14
|
specifier: ^8.2.2
|
||||||
version: 8.2.2(@types/node@24.13.3)
|
version: 8.2.2(@types/node@24.13.3)
|
||||||
|
|
||||||
packages/shared:
|
packages/shared:
|
||||||
@@ -490,8 +493,8 @@ packages:
|
|||||||
'@oxc-project/types@0.146.0':
|
'@oxc-project/types@0.146.0':
|
||||||
resolution: {integrity: sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==}
|
resolution: {integrity: sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==}
|
||||||
|
|
||||||
'@oxc-project/types@0.147.0':
|
'@oxc-project/types@0.148.0':
|
||||||
resolution: {integrity: sha512-IJ3s6ltHLp45S0bh7phkX+gJO7A1Wuz2EaqpAhb8WjqDwbzMiWKHhyyT42tskaWjEYXtHtVCPpnBJVT9+dcRLg==}
|
resolution: {integrity: sha512-Nm4s/jB+4FpFsPhWGEC4h7rzksesmtnMXomo6rCMcg/b8zLQuOziRgkCS1fxDCXOlJB/6Q8oABOZ/OP6RIPj9A==}
|
||||||
|
|
||||||
'@oxfmt/binding-android-arm-eabi@0.64.0':
|
'@oxfmt/binding-android-arm-eabi@0.64.0':
|
||||||
resolution: {integrity: sha512-o6uzh/jTOQeAY5TdkAeXdqv7MBRcPxiRA08zrcBtkKj5cSu/FMu0Hl7Q6Fi1KCKyCWZ6lJVjBzdsJvsKltUsGQ==}
|
resolution: {integrity: sha512-o6uzh/jTOQeAY5TdkAeXdqv7MBRcPxiRA08zrcBtkKj5cSu/FMu0Hl7Q6Fi1KCKyCWZ6lJVjBzdsJvsKltUsGQ==}
|
||||||
@@ -779,98 +782,98 @@ packages:
|
|||||||
'@polka/url@1.0.0-next.29':
|
'@polka/url@1.0.0-next.29':
|
||||||
resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==}
|
resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==}
|
||||||
|
|
||||||
'@rolldown/binding-android-arm-eabi@1.2.6':
|
'@rolldown/binding-android-arm-eabi@1.2.7':
|
||||||
resolution: {integrity: sha512-b+jTcARdTiFLI6jB4a5XjTm0RWd6KcRfQj/I2356fxUZemiho9zQLxo0RtCuMDAyKcLo6cEltkgbQp6d1+sjjQ==}
|
resolution: {integrity: sha512-EypzgnYCwyVY4NDHKzGmNJT5b+XaQEBniHxsMdeIQLB/tcCzZnhqrzHpZFbX9iaxx+5RiB8caATBtfvZP7zVxQ==}
|
||||||
engines: {node: ^20.19.0 || >=22.12.0}
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
cpu: [arm]
|
cpu: [arm]
|
||||||
os: [android]
|
os: [android]
|
||||||
|
|
||||||
'@rolldown/binding-android-arm64@1.2.6':
|
'@rolldown/binding-android-arm64@1.2.7':
|
||||||
resolution: {integrity: sha512-lkWU8ZJaRk9q3CIEY1Tc7vIFALp3Xw5NfGJo2hQg5oIqNgxWi1zI+IiDEK3r70BF5Dzol1tcXsnzsRc8NLhG+Q==}
|
resolution: {integrity: sha512-l17HE9EweWaqJZhuUuNBN/FzM62xw+DECVnJyvMsxn8vJFAGLy5QfLDoYAcronkAN8VxKZHezDpulHDPx95vFw==}
|
||||||
engines: {node: ^20.19.0 || >=22.12.0}
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [android]
|
os: [android]
|
||||||
|
|
||||||
'@rolldown/binding-darwin-arm64@1.2.6':
|
'@rolldown/binding-darwin-arm64@1.2.7':
|
||||||
resolution: {integrity: sha512-dgR56NYnvAszm7Ob1B2/Vn0e8bUQYZH2UjVaMMtMVOCKFSfjhfLmuA/9+O+F+ajUdG6B/bSssrKW6JJYASa8jA==}
|
resolution: {integrity: sha512-8ED8ELFvHXc6OCETIn4gXObPiaR6bckM/ipXtbzlPVDRMBfEGjCKgO90F9YtfdpDatVx/ZQw7aZ1vUMf/+T3Mw==}
|
||||||
engines: {node: ^20.19.0 || >=22.12.0}
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [darwin]
|
os: [darwin]
|
||||||
|
|
||||||
'@rolldown/binding-darwin-x64@1.2.6':
|
'@rolldown/binding-darwin-x64@1.2.7':
|
||||||
resolution: {integrity: sha512-vpVxFvUCFioJqug7OTvqptkc4yb8UX0AwfDmJpaR/0sWz+BUmqSVAf7c8JkUgnN8YLspb4a/N6NhTyMAmdyQ7Q==}
|
resolution: {integrity: sha512-/WPripjtiAIZ2tWY7ddijORT0Ujg87wxWW/qcoFVCKAWVDPhtY0xr7Dj0M3GyNGz60jGwTElhro/mkF9dT7dDQ==}
|
||||||
engines: {node: ^20.19.0 || >=22.12.0}
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [darwin]
|
os: [darwin]
|
||||||
|
|
||||||
'@rolldown/binding-freebsd-x64@1.2.6':
|
'@rolldown/binding-freebsd-x64@1.2.7':
|
||||||
resolution: {integrity: sha512-h1wG6Y6K3JlRswxsI64qQJqBAy4vrLuHgRbc8CZMGSWTOFRY6ghMApM1NKzB2I0n5xV1fjkE18SuVl2QpLeNpA==}
|
resolution: {integrity: sha512-14DI4NcqpvbICxSnGLx3PmtDaWqRP/KGSGb6C+JLLVPeZRl6dKdHba3pGsqT3vpdTqhEYIPG0MMQ8c0xYqoJxA==}
|
||||||
engines: {node: ^20.19.0 || >=22.12.0}
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [freebsd]
|
os: [freebsd]
|
||||||
|
|
||||||
'@rolldown/binding-linux-arm-gnueabihf@1.2.6':
|
'@rolldown/binding-linux-arm-gnueabihf@1.2.7':
|
||||||
resolution: {integrity: sha512-tbCiqub0q2MVWJKgF5PoAlNWCtQydiOYSLIkd8sByqK/6MMYLJRcSXSYodqYtd0O+Fw7QaVmKKlS4oL94YRZ0w==}
|
resolution: {integrity: sha512-bxrWIRvHWQvbJwi+VIie/kDJmQxcNE6xxWwZdqF/ExVAigtHkv54WTLQPb+QsZdnFy18fg7JPfWGL0RH6vwIlQ==}
|
||||||
engines: {node: ^20.19.0 || >=22.12.0}
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
cpu: [arm]
|
cpu: [arm]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@rolldown/binding-linux-arm64-gnu@1.2.6':
|
'@rolldown/binding-linux-arm64-gnu@1.2.7':
|
||||||
resolution: {integrity: sha512-oxK9+baEBPhZG5HB4URY+uU04zJWeZlH6Tb9rB5DK4DF9XR1uXNLXt5Q5ZsugTKayNCNLhkcwz/ye74hRI98dg==}
|
resolution: {integrity: sha512-toOY2BChBZyuxU7OYX6Tn389di4IzAqPTycVcci0O7FSfBqzRB3RZn+K5Is6ANf4tmgRd/K1yZTsNTXbkXsnLg==}
|
||||||
engines: {node: ^20.19.0 || >=22.12.0}
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [glibc]
|
libc: [glibc]
|
||||||
|
|
||||||
'@rolldown/binding-linux-arm64-musl@1.2.6':
|
'@rolldown/binding-linux-arm64-musl@1.2.7':
|
||||||
resolution: {integrity: sha512-muWCk27FVBEZtv0MsK8gnfSmgczA8KQ0uRVJbTABKhkRfQc38aUrcb7fhi3BNiyseFmgcRsoMfQsSNJ+DbZdSw==}
|
resolution: {integrity: sha512-lAIXTH/aiLRLxsTgQvfhjo4K1ydWIp00+V0voOr9beb/9ZmkUFrSIb03dXNFRgMNvkE6oGsF10ioQ6UsI+vS5Q==}
|
||||||
engines: {node: ^20.19.0 || >=22.12.0}
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [musl]
|
libc: [musl]
|
||||||
|
|
||||||
'@rolldown/binding-linux-ppc64-gnu@1.2.6':
|
'@rolldown/binding-linux-ppc64-gnu@1.2.7':
|
||||||
resolution: {integrity: sha512-eWDoSfU7Co2qj3vgB3Dt4lj1mG6CoWbcJQkRMP3XJplyCMtuaq3LHvPFjS9QIPvMGWVadJC04Xiy0IdcVPtnwQ==}
|
resolution: {integrity: sha512-kdnwS28Pkenp/mZMRwjXXXwxQ7pIsm+bF919LUK93BOyhcLsrVKdP2p9fxpiPNPAbNuch8ypQt0pm2P2LYCAGg==}
|
||||||
engines: {node: ^20.19.0 || >=22.12.0}
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
cpu: [ppc64]
|
cpu: [ppc64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [glibc]
|
libc: [glibc]
|
||||||
|
|
||||||
'@rolldown/binding-linux-s390x-gnu@1.2.6':
|
'@rolldown/binding-linux-s390x-gnu@1.2.7':
|
||||||
resolution: {integrity: sha512-2bWNjRSIayvupRKxXUY2tWG9fYdoUlTqWywHRvE8Eq3GvuQ+f2HeIkve697fIt+IQs/PV8yFsdWuhp1aJ1PdnA==}
|
resolution: {integrity: sha512-516OdsyLdr5E65paF3yBF55t8mfm9+gmtCsK3xI7XKXIT7EfRlHhxL8K/NR6Hu8BWSgF5+1w74lTL0+nxcc8Qw==}
|
||||||
engines: {node: ^20.19.0 || >=22.12.0}
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
cpu: [s390x]
|
cpu: [s390x]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [glibc]
|
libc: [glibc]
|
||||||
|
|
||||||
'@rolldown/binding-linux-x64-gnu@1.2.6':
|
'@rolldown/binding-linux-x64-gnu@1.2.7':
|
||||||
resolution: {integrity: sha512-KekI0gS0wLxe1UBSQSjenBVwou/JkcQPDzBPICGZjxUv9k3RteHDPBQaiOicZUFKRIH2wKEimGwVpnJsbPzu7w==}
|
resolution: {integrity: sha512-r8/z8n7GFaYRln3xmP1Cxy0HH/HLM0uBUPkEuSVEfKGDA89M0FsZRZJRSwe/tJjRx+fpH/gjorfhB8tmEbSFLA==}
|
||||||
engines: {node: ^20.19.0 || >=22.12.0}
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [glibc]
|
libc: [glibc]
|
||||||
|
|
||||||
'@rolldown/binding-linux-x64-musl@1.2.6':
|
'@rolldown/binding-linux-x64-musl@1.2.7':
|
||||||
resolution: {integrity: sha512-TvtPnfVr+HtyGiDmPK4VWmlNm7QhNNAcK5Q9A7aOXsI8545yCyaoMaicXrFZ72JzeYjaUVk7yT243zT0jzjFKQ==}
|
resolution: {integrity: sha512-pAsE8iiDxUg1xBqdhrTfg45AVDVpirjz00sblEYClGNNcMnDb+e8beQgqIAw6LvauX/APvgxUnwrgun/YYGBhw==}
|
||||||
engines: {node: ^20.19.0 || >=22.12.0}
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
libc: [musl]
|
libc: [musl]
|
||||||
|
|
||||||
'@rolldown/binding-openharmony-arm64@1.2.6':
|
'@rolldown/binding-openharmony-arm64@1.2.7':
|
||||||
resolution: {integrity: sha512-iOo0VEay2XFhaCcH0sps5XIimkSuOnNaZrf6+ZkoSOQBJPKNU48RkmJv0/lSpipexu5P+ouFgafe5IGr/DiQfg==}
|
resolution: {integrity: sha512-lTcIYmmnQQA8Or/2DatS6oSqcdLHvendjS+zLu+FwgToynWMRSmQdpM65fTANJgIS4mjbMOo5KT2lnT9SAb96w==}
|
||||||
engines: {node: ^20.19.0 || >=22.12.0}
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [openharmony]
|
os: [openharmony]
|
||||||
|
|
||||||
'@rolldown/binding-win32-arm64-msvc@1.2.6':
|
'@rolldown/binding-win32-arm64-msvc@1.2.7':
|
||||||
resolution: {integrity: sha512-y5NTmmasMS455JlOCO4ZM9krIchv3Mvm1crL1iUPGOPgEzSkves9n0SdC5Sjz6+qWDFhd8/JpfWMH8NSWNHe+A==}
|
resolution: {integrity: sha512-e3Gu3WxbNk/UqQhxqU7YIYO+9ZBvWNz3U+h/qRFosscMFzdRPbXYSaSWgSnklv2fz1TgzBTcti2z35c/7irsHw==}
|
||||||
engines: {node: ^20.19.0 || >=22.12.0}
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
|
|
||||||
'@rolldown/binding-win32-x64-msvc@1.2.6':
|
'@rolldown/binding-win32-x64-msvc@1.2.7':
|
||||||
resolution: {integrity: sha512-np8iZSLfXlAD4kWhiyq/u0Yt8oZDtRQ8lGhQaCXo2rl37KNjeU0GjJuwr4P3oeZ++ROfofsKNBqR5LTO8aXyWQ==}
|
resolution: {integrity: sha512-W/jg5qoRSqjsEv0+dZi4e687mcHqmVuU0P4fK6qS/xjetW2Gmc1W8j//z5nAeNcC8Ttm0hV46IjcYeuVwYhuiw==}
|
||||||
engines: {node: ^20.19.0 || >=22.12.0}
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
@@ -1514,6 +1517,9 @@ packages:
|
|||||||
color-name@1.1.4:
|
color-name@1.1.4:
|
||||||
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
|
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
|
||||||
|
|
||||||
|
comlink@4.4.2:
|
||||||
|
resolution: {integrity: sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==}
|
||||||
|
|
||||||
commander@15.0.0:
|
commander@15.0.0:
|
||||||
resolution: {integrity: sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==}
|
resolution: {integrity: sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==}
|
||||||
engines: {node: '>=22.12.0'}
|
engines: {node: '>=22.12.0'}
|
||||||
@@ -1585,8 +1591,8 @@ packages:
|
|||||||
esm-env@1.2.2:
|
esm-env@1.2.2:
|
||||||
resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==}
|
resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==}
|
||||||
|
|
||||||
esrap@2.3.6:
|
esrap@2.3.7:
|
||||||
resolution: {integrity: sha512-yc0OC12UjPqLoc+fe+v5GNs4TOjAigUw3sTikfC+xeBPGUw7gDRz3DtYaqEhxyMVJojcSWJw7jT0QWR+CbuE/A==}
|
resolution: {integrity: sha512-n2nf7fZR3c9yXf0BPEuHuXqT+KW0SJVj4cN5FMEkpCZ3scLjOQWpiccyCxVzCC2q1wubTghuEGzngJY/7Ah0Ow==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@typescript-eslint/types': ^8.2.0
|
'@typescript-eslint/types': ^8.2.0
|
||||||
peerDependenciesMeta:
|
peerDependenciesMeta:
|
||||||
@@ -2047,14 +2053,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==}
|
resolution: {integrity: sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==}
|
||||||
engines: {node: '>=14.19.0'}
|
engines: {node: '>=14.19.0'}
|
||||||
|
|
||||||
postcss-selector-parser@7.1.5:
|
postcss-selector-parser@7.1.6:
|
||||||
resolution: {integrity: sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==}
|
resolution: {integrity: sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==}
|
||||||
engines: {node: '>=4'}
|
engines: {node: '>=4'}
|
||||||
|
|
||||||
postcss@8.5.26:
|
|
||||||
resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==}
|
|
||||||
engines: {node: ^10 || ^12 || >=14}
|
|
||||||
|
|
||||||
postcss@8.5.28:
|
postcss@8.5.28:
|
||||||
resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==}
|
resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==}
|
||||||
engines: {node: ^10 || ^12 || >=14}
|
engines: {node: ^10 || ^12 || >=14}
|
||||||
@@ -2064,10 +2066,6 @@ packages:
|
|||||||
peerDependencies:
|
peerDependencies:
|
||||||
svelte: ^3.37.0 || ^4.0.0
|
svelte: ^3.37.0 || ^4.0.0
|
||||||
|
|
||||||
pretty-bytes@7.1.2:
|
|
||||||
resolution: {integrity: sha512-spZIOSORH9joSPGN0L/tYfvINH+xbOpnI3kdcEkq0mzGMjFvDZzyRVbqEOV0wACF0gggdKE9RWO2mosGsBh/Rg==}
|
|
||||||
engines: {node: '>=20'}
|
|
||||||
|
|
||||||
pretty-bytes@7.1.3:
|
pretty-bytes@7.1.3:
|
||||||
resolution: {integrity: sha512-U2KZ675nqba6XSBppSjU2pRgc9Ffx9+uUtd/RTWYmOawVkZuUbBYuwdtFZQmLv+yMgQ2TQxWWuOpyNje67J9tg==}
|
resolution: {integrity: sha512-U2KZ675nqba6XSBppSjU2pRgc9Ffx9+uUtd/RTWYmOawVkZuUbBYuwdtFZQmLv+yMgQ2TQxWWuOpyNje67J9tg==}
|
||||||
engines: {node: '>=20'}
|
engines: {node: '>=20'}
|
||||||
@@ -2101,8 +2099,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
|
resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
|
||||||
engines: {node: '>= 14.18.0'}
|
engines: {node: '>= 14.18.0'}
|
||||||
|
|
||||||
rolldown@1.2.6:
|
rolldown@1.2.7:
|
||||||
resolution: {integrity: sha512-vMM4q3aixf46GiF1Kok8jDPFsEpXgFWGjUHXNkNHNm+Y2adXAG2dbX91jkti3i0ZRsOlcmbuzAz1poObSHCmUA==}
|
resolution: {integrity: sha512-g0EtLvBjTUB7jhyV0S/TCup3v/XSVl45vUIGbOGU4QPiyjTenCe4mKuFvW9fEgYmS2Fo42AUssRmNuMziXdrig==}
|
||||||
engines: {node: ^20.19.0 || >=22.12.0}
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
@@ -2155,8 +2153,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==}
|
resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==}
|
||||||
engines: {node: '>= 14'}
|
engines: {node: '>= 14'}
|
||||||
|
|
||||||
socks@2.8.9:
|
socks@2.8.10:
|
||||||
resolution: {integrity: sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==}
|
resolution: {integrity: sha512-e0VyvkVTwVYViNovRkZ9aodhxVlyoMn7eJhVUPxZ+eK9P/7CBkxvvsBOHqFPEH416726W8tLXXXjKwqgTErrCQ==}
|
||||||
engines: {node: '>= 10.0.0', npm: '>= 3.0.0'}
|
engines: {node: '>= 10.0.0', npm: '>= 3.0.0'}
|
||||||
|
|
||||||
source-map-js@1.2.1:
|
source-map-js@1.2.1:
|
||||||
@@ -2286,8 +2284,8 @@ packages:
|
|||||||
undici-types@7.18.2:
|
undici-types@7.18.2:
|
||||||
resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==}
|
resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==}
|
||||||
|
|
||||||
undici@6.28.0:
|
undici@6.28.1:
|
||||||
resolution: {integrity: sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA==}
|
resolution: {integrity: sha512-zWpdTVD54H48CIybL0rWQ3ukpb9d23wM7eH5RtfdmeP70cWHNjtfo7P4vZX+5CoDcO53J4Pu5uXp7lNfjc6DRA==}
|
||||||
engines: {node: '>=18.17'}
|
engines: {node: '>=18.17'}
|
||||||
|
|
||||||
update-browserslist-db@1.3.2:
|
update-browserslist-db@1.3.2:
|
||||||
@@ -2457,8 +2455,8 @@ packages:
|
|||||||
yuku-parser@0.5.48:
|
yuku-parser@0.5.48:
|
||||||
resolution: {integrity: sha512-OWBfhrpgK9+/4+IXG9oT8Bao4AhViQA7vdyNNH7EUg8dQYgwa70XtIBWTpCEme1P1ECyoDNYkn0wT63f8XRcVA==}
|
resolution: {integrity: sha512-OWBfhrpgK9+/4+IXG9oT8Bao4AhViQA7vdyNNH7EUg8dQYgwa70XtIBWTpCEme1P1ECyoDNYkn0wT63f8XRcVA==}
|
||||||
|
|
||||||
zimmerframe@1.1.4:
|
zimmerframe@1.1.5:
|
||||||
resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==}
|
resolution: {integrity: sha512-msJxIvYDYcoNL+PJsu+7qmpDWsYmAxTY+2TNYXXF0hzBzBk0BMecOqDOG/EckUoKCuKwObfbugIl8QpqHDXeFA==}
|
||||||
|
|
||||||
snapshots:
|
snapshots:
|
||||||
|
|
||||||
@@ -2863,7 +2861,7 @@ snapshots:
|
|||||||
|
|
||||||
'@npmcli/query@5.0.0':
|
'@npmcli/query@5.0.0':
|
||||||
dependencies:
|
dependencies:
|
||||||
postcss-selector-parser: 7.1.5
|
postcss-selector-parser: 7.1.6
|
||||||
|
|
||||||
'@npmcli/redact@4.0.0': {}
|
'@npmcli/redact@4.0.0': {}
|
||||||
|
|
||||||
@@ -2879,7 +2877,7 @@ snapshots:
|
|||||||
|
|
||||||
'@oxc-project/types@0.146.0': {}
|
'@oxc-project/types@0.146.0': {}
|
||||||
|
|
||||||
'@oxc-project/types@0.147.0': {}
|
'@oxc-project/types@0.148.0': {}
|
||||||
|
|
||||||
'@oxfmt/binding-android-arm-eabi@0.64.0':
|
'@oxfmt/binding-android-arm-eabi@0.64.0':
|
||||||
optional: true
|
optional: true
|
||||||
@@ -3021,49 +3019,49 @@ snapshots:
|
|||||||
|
|
||||||
'@polka/url@1.0.0-next.29': {}
|
'@polka/url@1.0.0-next.29': {}
|
||||||
|
|
||||||
'@rolldown/binding-android-arm-eabi@1.2.6':
|
'@rolldown/binding-android-arm-eabi@1.2.7':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@rolldown/binding-android-arm64@1.2.6':
|
'@rolldown/binding-android-arm64@1.2.7':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@rolldown/binding-darwin-arm64@1.2.6':
|
'@rolldown/binding-darwin-arm64@1.2.7':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@rolldown/binding-darwin-x64@1.2.6':
|
'@rolldown/binding-darwin-x64@1.2.7':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@rolldown/binding-freebsd-x64@1.2.6':
|
'@rolldown/binding-freebsd-x64@1.2.7':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@rolldown/binding-linux-arm-gnueabihf@1.2.6':
|
'@rolldown/binding-linux-arm-gnueabihf@1.2.7':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@rolldown/binding-linux-arm64-gnu@1.2.6':
|
'@rolldown/binding-linux-arm64-gnu@1.2.7':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@rolldown/binding-linux-arm64-musl@1.2.6':
|
'@rolldown/binding-linux-arm64-musl@1.2.7':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@rolldown/binding-linux-ppc64-gnu@1.2.6':
|
'@rolldown/binding-linux-ppc64-gnu@1.2.7':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@rolldown/binding-linux-s390x-gnu@1.2.6':
|
'@rolldown/binding-linux-s390x-gnu@1.2.7':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@rolldown/binding-linux-x64-gnu@1.2.6':
|
'@rolldown/binding-linux-x64-gnu@1.2.7':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@rolldown/binding-linux-x64-musl@1.2.6':
|
'@rolldown/binding-linux-x64-musl@1.2.7':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@rolldown/binding-openharmony-arm64@1.2.6':
|
'@rolldown/binding-openharmony-arm64@1.2.7':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@rolldown/binding-win32-arm64-msvc@1.2.6':
|
'@rolldown/binding-win32-arm64-msvc@1.2.7':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@rolldown/binding-win32-x64-msvc@1.2.6':
|
'@rolldown/binding-win32-x64-msvc@1.2.7':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@rolldown/pluginutils@1.0.1': {}
|
'@rolldown/pluginutils@1.0.1': {}
|
||||||
@@ -3585,6 +3583,8 @@ snapshots:
|
|||||||
|
|
||||||
color-name@1.1.4: {}
|
color-name@1.1.4: {}
|
||||||
|
|
||||||
|
comlink@4.4.2: {}
|
||||||
|
|
||||||
commander@15.0.0: {}
|
commander@15.0.0: {}
|
||||||
|
|
||||||
common-ancestor-path@2.0.0: {}
|
common-ancestor-path@2.0.0: {}
|
||||||
@@ -3623,7 +3623,7 @@ snapshots:
|
|||||||
|
|
||||||
esm-env@1.2.2: {}
|
esm-env@1.2.2: {}
|
||||||
|
|
||||||
esrap@2.3.6:
|
esrap@2.3.7:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@jridgewell/sourcemap-codec': 1.6.0
|
'@jridgewell/sourcemap-codec': 1.6.0
|
||||||
|
|
||||||
@@ -3917,7 +3917,7 @@ snapshots:
|
|||||||
semver: 7.8.5
|
semver: 7.8.5
|
||||||
tar: 7.5.22
|
tar: 7.5.22
|
||||||
tinyglobby: 0.2.17
|
tinyglobby: 0.2.17
|
||||||
undici: 6.28.0
|
undici: 6.28.1
|
||||||
which: 6.0.1
|
which: 6.0.1
|
||||||
|
|
||||||
node-releases@2.0.54: {}
|
node-releases@2.0.54: {}
|
||||||
@@ -4090,17 +4090,11 @@ snapshots:
|
|||||||
|
|
||||||
pngjs@7.0.0: {}
|
pngjs@7.0.0: {}
|
||||||
|
|
||||||
postcss-selector-parser@7.1.5:
|
postcss-selector-parser@7.1.6:
|
||||||
dependencies:
|
dependencies:
|
||||||
cssesc: 3.0.0
|
cssesc: 3.0.0
|
||||||
util-deprecate: 1.0.2
|
util-deprecate: 1.0.2
|
||||||
|
|
||||||
postcss@8.5.26:
|
|
||||||
dependencies:
|
|
||||||
nanoid: 3.3.18
|
|
||||||
picocolors: 1.1.1
|
|
||||||
source-map-js: 1.2.1
|
|
||||||
|
|
||||||
postcss@8.5.28:
|
postcss@8.5.28:
|
||||||
dependencies:
|
dependencies:
|
||||||
nanoid: 3.3.18
|
nanoid: 3.3.18
|
||||||
@@ -4111,8 +4105,6 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
svelte: 5.57.0
|
svelte: 5.57.0
|
||||||
|
|
||||||
pretty-bytes@7.1.2: {}
|
|
||||||
|
|
||||||
pretty-bytes@7.1.3: {}
|
pretty-bytes@7.1.3: {}
|
||||||
|
|
||||||
pretty-format@27.5.1:
|
pretty-format@27.5.1:
|
||||||
@@ -4135,26 +4127,26 @@ snapshots:
|
|||||||
|
|
||||||
readdirp@4.1.2: {}
|
readdirp@4.1.2: {}
|
||||||
|
|
||||||
rolldown@1.2.6:
|
rolldown@1.2.7:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@oxc-project/types': 0.147.0
|
'@oxc-project/types': 0.148.0
|
||||||
'@rolldown/pluginutils': 1.0.1
|
'@rolldown/pluginutils': 1.0.1
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@rolldown/binding-android-arm-eabi': 1.2.6
|
'@rolldown/binding-android-arm-eabi': 1.2.7
|
||||||
'@rolldown/binding-android-arm64': 1.2.6
|
'@rolldown/binding-android-arm64': 1.2.7
|
||||||
'@rolldown/binding-darwin-arm64': 1.2.6
|
'@rolldown/binding-darwin-arm64': 1.2.7
|
||||||
'@rolldown/binding-darwin-x64': 1.2.6
|
'@rolldown/binding-darwin-x64': 1.2.7
|
||||||
'@rolldown/binding-freebsd-x64': 1.2.6
|
'@rolldown/binding-freebsd-x64': 1.2.7
|
||||||
'@rolldown/binding-linux-arm-gnueabihf': 1.2.6
|
'@rolldown/binding-linux-arm-gnueabihf': 1.2.7
|
||||||
'@rolldown/binding-linux-arm64-gnu': 1.2.6
|
'@rolldown/binding-linux-arm64-gnu': 1.2.7
|
||||||
'@rolldown/binding-linux-arm64-musl': 1.2.6
|
'@rolldown/binding-linux-arm64-musl': 1.2.7
|
||||||
'@rolldown/binding-linux-ppc64-gnu': 1.2.6
|
'@rolldown/binding-linux-ppc64-gnu': 1.2.7
|
||||||
'@rolldown/binding-linux-s390x-gnu': 1.2.6
|
'@rolldown/binding-linux-s390x-gnu': 1.2.7
|
||||||
'@rolldown/binding-linux-x64-gnu': 1.2.6
|
'@rolldown/binding-linux-x64-gnu': 1.2.7
|
||||||
'@rolldown/binding-linux-x64-musl': 1.2.6
|
'@rolldown/binding-linux-x64-musl': 1.2.7
|
||||||
'@rolldown/binding-openharmony-arm64': 1.2.6
|
'@rolldown/binding-openharmony-arm64': 1.2.7
|
||||||
'@rolldown/binding-win32-arm64-msvc': 1.2.6
|
'@rolldown/binding-win32-arm64-msvc': 1.2.7
|
||||||
'@rolldown/binding-win32-x64-msvc': 1.2.6
|
'@rolldown/binding-win32-x64-msvc': 1.2.7
|
||||||
|
|
||||||
run-async@4.0.6: {}
|
run-async@4.0.6: {}
|
||||||
|
|
||||||
@@ -4201,11 +4193,11 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
agent-base: 7.1.4
|
agent-base: 7.1.4
|
||||||
debug: 4.4.3
|
debug: 4.4.3
|
||||||
socks: 2.8.9
|
socks: 2.8.10
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
socks@2.8.9:
|
socks@2.8.10:
|
||||||
dependencies:
|
dependencies:
|
||||||
ip-address: 10.7.0
|
ip-address: 10.7.0
|
||||||
smart-buffer: 4.2.0
|
smart-buffer: 4.2.0
|
||||||
@@ -4296,11 +4288,11 @@ snapshots:
|
|||||||
clsx: 2.1.1
|
clsx: 2.1.1
|
||||||
devalue: 5.9.2
|
devalue: 5.9.2
|
||||||
esm-env: 1.2.2
|
esm-env: 1.2.2
|
||||||
esrap: 2.3.6
|
esrap: 2.3.7
|
||||||
is-reference: 3.0.3
|
is-reference: 3.0.3
|
||||||
locate-character: 3.0.0
|
locate-character: 3.0.0
|
||||||
magic-string: 0.30.21
|
magic-string: 0.30.21
|
||||||
zimmerframe: 1.1.4
|
zimmerframe: 1.1.5
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- '@typescript-eslint/types'
|
- '@typescript-eslint/types'
|
||||||
|
|
||||||
@@ -4377,7 +4369,7 @@ snapshots:
|
|||||||
|
|
||||||
undici-types@7.18.2: {}
|
undici-types@7.18.2: {}
|
||||||
|
|
||||||
undici@6.28.0: {}
|
undici@6.28.1: {}
|
||||||
|
|
||||||
update-browserslist-db@1.3.2(browserslist@4.28.9):
|
update-browserslist-db@1.3.2(browserslist@4.28.9):
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -4453,8 +4445,8 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
lightningcss: 1.33.0
|
lightningcss: 1.33.0
|
||||||
picomatch: 4.0.7
|
picomatch: 4.0.7
|
||||||
postcss: 8.5.26
|
postcss: 8.5.28
|
||||||
rolldown: 1.2.6
|
rolldown: 1.2.7
|
||||||
tinyglobby: 0.2.17
|
tinyglobby: 0.2.17
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@types/node': 22.20.1
|
'@types/node': 22.20.1
|
||||||
@@ -4464,8 +4456,8 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
lightningcss: 1.33.0
|
lightningcss: 1.33.0
|
||||||
picomatch: 4.0.7
|
picomatch: 4.0.7
|
||||||
postcss: 8.5.26
|
postcss: 8.5.28
|
||||||
rolldown: 1.2.6
|
rolldown: 1.2.7
|
||||||
tinyglobby: 0.2.17
|
tinyglobby: 0.2.17
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@types/node': 24.13.3
|
'@types/node': 24.13.3
|
||||||
@@ -4586,4 +4578,4 @@ snapshots:
|
|||||||
'@yuku-parser/binding-win32-arm64': 0.5.48
|
'@yuku-parser/binding-win32-arm64': 0.5.48
|
||||||
'@yuku-parser/binding-win32-x64': 0.5.48
|
'@yuku-parser/binding-win32-x64': 0.5.48
|
||||||
|
|
||||||
zimmerframe@1.1.4: {}
|
zimmerframe@1.1.5: {}
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
import { expect, test } from "@playwright/test";
|
||||||
|
|
||||||
|
test.describe("@web", () => {
|
||||||
|
for (const path of ["/", "/about", "/note/does-not-exist"]) {
|
||||||
|
test(`serves ${path} with status 200`, async ({ request }) => {
|
||||||
|
const response = await request.get(path);
|
||||||
|
expect(response.status()).toBe(200);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
test("api still reports a missing note as 404", async ({ request }) => {
|
||||||
|
const response = await request.get("/api/notes/does-not-exist");
|
||||||
|
expect(response.status()).toBe(404);
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user