Merge pull request #63 from codex-storage/releases/v0.0.7

Releases/v0.0.7
This commit is contained in:
Arnaud 2024-10-22 10:40:01 +01:00 committed by GitHub
commit 8763fbbc59
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 353 additions and 1824 deletions

View File

@ -8,8 +8,8 @@ on:
workflow_dispatch: workflow_dispatch:
env: env:
codex_version: v0.1.6 codex_version: v0.1.7
circuit_version: v0.1.6 circuit_version: v0.1.7
marketplace_address: "0xfE822Df439d987849a90B64a4C0e26a297DBD47F" marketplace_address: "0xfE822Df439d987849a90B64a4C0e26a297DBD47F"
eth_provider: "https://rpc.testnet.codex.storage" eth_provider: "https://rpc.testnet.codex.storage"
VITE_CODEX_API_URL: ${{ secrets.VITE_CODEX_API_URL }} VITE_CODEX_API_URL: ${{ secrets.VITE_CODEX_API_URL }}

32
e2e/download.spec.ts Normal file
View File

@ -0,0 +1,32 @@
import { test, expect } from '@playwright/test';
import { readFileSync } from 'fs';
import path, { dirname } from 'path';
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
test('download a file', async ({ page, browserName }) => {
// https://github.com/microsoft/playwright/issues/13037
test.skip(browserName.toLowerCase() !== 'chromium',
`Test only for chromium!`);
await page.goto('/dashboard');
await page.locator('div').getByTestId("upload").setInputFiles([
path.join(__dirname, "assets", 'chatgpt.jpg'),
]);
await page.context().grantPermissions(["clipboard-read", "clipboard-write"]);
await page.locator('.files-fileActions > button:nth-child(3)').first().click();
await page.getByRole('button', { name: 'Copy CID' }).click();
const handle = await page.evaluateHandle(() => navigator.clipboard.readText());
const cid = await handle.jsonValue()
await page.locator('.sheets-container > .backdrop').click();
await page.getByPlaceholder('CID').click();
await page.getByPlaceholder('CID').fill(cid);
const page1Promise = page.waitForEvent('popup');
const downloadPromise = page.waitForEvent('download');
await page.locator('div').filter({ hasText: /^Download a fileDownload$/ }).getByRole('button').click();
const page1 = await page1Promise;
const download = await downloadPromise;
expect(await download.failure()).toBeNull()
});

View File

@ -12,12 +12,14 @@ test('update the URL with wrong URL applies', async ({ page }) => {
await page.goto('/dashboard'); await page.goto('/dashboard');
await page.getByRole('link', { name: 'Settings' }).click(); await page.getByRole('link', { name: 'Settings' }).click();
await page.getByLabel('Codex client node URL').click(); await page.getByLabel('Codex client node URL').click();
await page.getByLabel('Codex client node URL').fill('hello');
await expect.soft(page.getByText("The URL is not valid")).toBeVisible()
await expect.soft(page.locator(".settings-url-button")).toBeDisabled()
await page.getByLabel('Codex client node URL').fill('http://127.0.0.1:8079'); await page.getByLabel('Codex client node URL').fill('http://127.0.0.1:8079');
await expect.soft(page.getByText("The URL is not valid")).not.toBeVisible()
await expect.soft(page.locator(".settings-url-button")).not.toBeDisabled()
await page.getByRole('button', { name: 'Save changes' }).nth(1).click(); await page.getByRole('button', { name: 'Save changes' }).nth(1).click();
await expect.soft(page.getByText("Cannot retrieve the data")).toBeVisible() await expect.soft(page.getByText("Cannot retrieve the data")).toBeVisible()
await page.getByLabel('Codex client node URL').fill('http://127.0.0.1:8080'); await page.getByLabel('Codex client node URL').fill('http://127.0.0.1:8080');
await page.getByRole('button', { name: 'Save changes' }).nth(1).click(); await page.getByRole('button', { name: 'Save changes' }).nth(1).click();
}) })

View File

@ -30,7 +30,7 @@ test('select a uploaded cid when creating a storage request', async ({ page }) =
await page.getByRole('link', { name: 'Purchases' }).click(); await page.getByRole('link', { name: 'Purchases' }).click();
await page.getByRole('button', { name: 'Storage Request' }).click(); await page.getByRole('button', { name: 'Storage Request' }).click();
await page.getByPlaceholder('Select or type your CID').click(); await page.getByPlaceholder('Select or type your CID').click();
await page.getByText('N/A0').click(); await page.locator('.dropdown-option').nth(1).click();
await expect(page.getByText('button[disabled]')).not.toBeVisible(); await expect(page.getByText('button[disabled]')).not.toBeVisible();
}) })

458
package-lock.json generated
View File

@ -1,15 +1,15 @@
{ {
"name": "@codex-storage/marketplace-ui", "name": "@codex-storage/marketplace-ui",
"version": "0.0.6", "version": "0.0.7",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "@codex-storage/marketplace-ui", "name": "@codex-storage/marketplace-ui",
"version": "0.0.6", "version": "0.0.7",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@codex-storage/marketplace-ui-components": "^0.0.20", "@codex-storage/marketplace-ui-components": "^0.0.24",
"@codex-storage/sdk-js": "^0.0.8", "@codex-storage/sdk-js": "^0.0.8",
"@sentry/browser": "^8.32.0", "@sentry/browser": "^8.32.0",
"@sentry/react": "^8.31.0", "@sentry/react": "^8.31.0",
@ -374,9 +374,9 @@
"dev": true "dev": true
}, },
"node_modules/@codex-storage/marketplace-ui-components": { "node_modules/@codex-storage/marketplace-ui-components": {
"version": "0.0.20", "version": "0.0.24",
"resolved": "https://registry.npmjs.org/@codex-storage/marketplace-ui-components/-/marketplace-ui-components-0.0.20.tgz", "resolved": "https://registry.npmjs.org/@codex-storage/marketplace-ui-components/-/marketplace-ui-components-0.0.24.tgz",
"integrity": "sha512-nclmhFgseWV6p6hZJg5fPZR0voBOpZcPP79S6jaGWAgrDWogrBFVO4Axhwb9kdenJusIHUsuwG4pAu0r9ylb5w==", "integrity": "sha512-7YVpy70zC1rHxpUjFOt+gkhj1Rt9wG1Ls4hNtUzR4lFrICvCC8m4EuUg37FlgjTt2H9eLpVt1b090Wyz+CKeng==",
"dependencies": { "dependencies": {
"lucide-react": "^0.441.0" "lucide-react": "^0.441.0"
}, },
@ -620,12 +620,12 @@
} }
}, },
"node_modules/@playwright/test": { "node_modules/@playwright/test": {
"version": "1.48.0", "version": "1.48.1",
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.48.0.tgz", "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.48.1.tgz",
"integrity": "sha512-W5lhqPUVPqhtc/ySvZI5Q8X2ztBOUgZ8LbAFy0JQgrXZs2xaILrUcNO3rQjwbLPfGK13+rZsDa1FpG+tqYkT5w==", "integrity": "sha512-s9RtWoxkOLmRJdw3oFvhFbs9OJS0BzrLUc8Hf6l2UdCNd1rqeEyD4BhCJkvzeEoD1FsK4mirsWwGerhVmYKtZg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"playwright": "1.48.0" "playwright": "1.48.1"
}, },
"bin": { "bin": {
"playwright": "cli.js" "playwright": "cli.js"
@ -843,97 +843,97 @@
] ]
}, },
"node_modules/@sentry-internal/browser-utils": { "node_modules/@sentry-internal/browser-utils": {
"version": "8.34.0", "version": "8.35.0",
"resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.34.0.tgz", "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.35.0.tgz",
"integrity": "sha512-4AcYOzPzD1tL5eSRQ/GpKv5enquZf4dMVUez99/Bh3va8qiJrNP55AcM7UzZ7WZLTqKygIYruJTU5Zu2SpEAPQ==", "integrity": "sha512-uj9nwERm7HIS13f/Q52hF/NUS5Al8Ma6jkgpfYGeppYvU0uSjPkwMogtqoJQNbOoZg973tV8qUScbcWY616wNA==",
"dependencies": { "dependencies": {
"@sentry/core": "8.34.0", "@sentry/core": "8.35.0",
"@sentry/types": "8.34.0", "@sentry/types": "8.35.0",
"@sentry/utils": "8.34.0" "@sentry/utils": "8.35.0"
}, },
"engines": { "engines": {
"node": ">=14.18" "node": ">=14.18"
} }
}, },
"node_modules/@sentry-internal/feedback": { "node_modules/@sentry-internal/feedback": {
"version": "8.34.0", "version": "8.35.0",
"resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.34.0.tgz", "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.35.0.tgz",
"integrity": "sha512-aYSM2KPUs0FLPxxbJCFSwCYG70VMzlT04xepD1Y/tTlPPOja/02tSv2tyOdZbv8Uw7xslZs3/8Lhj74oYcTBxw==", "integrity": "sha512-7bjSaUhL0bDArozre6EiIhhdWdT/1AWNWBC1Wc5w1IxEi5xF7nvF/FfvjQYrONQzZAI3HRxc45J2qhLUzHBmoQ==",
"dependencies": { "dependencies": {
"@sentry/core": "8.34.0", "@sentry/core": "8.35.0",
"@sentry/types": "8.34.0", "@sentry/types": "8.35.0",
"@sentry/utils": "8.34.0" "@sentry/utils": "8.35.0"
}, },
"engines": { "engines": {
"node": ">=14.18" "node": ">=14.18"
} }
}, },
"node_modules/@sentry-internal/replay": { "node_modules/@sentry-internal/replay": {
"version": "8.34.0", "version": "8.35.0",
"resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.34.0.tgz", "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.35.0.tgz",
"integrity": "sha512-EoMh9NYljNewZK1quY23YILgtNdGgrkzJ9TPsj6jXUG0LZ0Q7N7eFWd0xOEDBvFxrmI3cSXF1i4d1sBb+eyKRw==", "integrity": "sha512-3wkW03vXYMyWtTLxl9yrtkV+qxbnKFgfASdoGWhXzfLjycgT6o4/04eb3Gn71q9aXqRwH17ISVQbVswnRqMcmA==",
"dependencies": { "dependencies": {
"@sentry-internal/browser-utils": "8.34.0", "@sentry-internal/browser-utils": "8.35.0",
"@sentry/core": "8.34.0", "@sentry/core": "8.35.0",
"@sentry/types": "8.34.0", "@sentry/types": "8.35.0",
"@sentry/utils": "8.34.0" "@sentry/utils": "8.35.0"
}, },
"engines": { "engines": {
"node": ">=14.18" "node": ">=14.18"
} }
}, },
"node_modules/@sentry-internal/replay-canvas": { "node_modules/@sentry-internal/replay-canvas": {
"version": "8.34.0", "version": "8.35.0",
"resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.34.0.tgz", "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.35.0.tgz",
"integrity": "sha512-x8KhZcCDpbKHqFOykYXiamX6x0LRxv6N1OJHoH+XCrMtiDBZr4Yo30d/MaS6rjmKGMtSRij30v+Uq+YWIgxUrg==", "integrity": "sha512-TUrH6Piv19kvHIiRyIuapLdnuwxk/Un/l1WDCQfq7mK9p1Pac0FkQ7Uufjp6zY3lyhDDZQ8qvCS4ioCMibCwQg==",
"dependencies": { "dependencies": {
"@sentry-internal/replay": "8.34.0", "@sentry-internal/replay": "8.35.0",
"@sentry/core": "8.34.0", "@sentry/core": "8.35.0",
"@sentry/types": "8.34.0", "@sentry/types": "8.35.0",
"@sentry/utils": "8.34.0" "@sentry/utils": "8.35.0"
}, },
"engines": { "engines": {
"node": ">=14.18" "node": ">=14.18"
} }
}, },
"node_modules/@sentry/browser": { "node_modules/@sentry/browser": {
"version": "8.34.0", "version": "8.35.0",
"resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.34.0.tgz", "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.35.0.tgz",
"integrity": "sha512-3HHG2NXxzHq1lVmDy2uRjYjGNf9NsJsTPlOC70vbQdOb+S49EdH/XMPy+J3ruIoyv6Cu0LwvA6bMOM6rHZOgNQ==", "integrity": "sha512-WHfI+NoZzpCsmIvtr6ChOe7yWPLQyMchPnVhY3Z4UeC70bkYNdKcoj/4XZbX3m0D8+71JAsm0mJ9s9OC3Ue6MQ==",
"dependencies": { "dependencies": {
"@sentry-internal/browser-utils": "8.34.0", "@sentry-internal/browser-utils": "8.35.0",
"@sentry-internal/feedback": "8.34.0", "@sentry-internal/feedback": "8.35.0",
"@sentry-internal/replay": "8.34.0", "@sentry-internal/replay": "8.35.0",
"@sentry-internal/replay-canvas": "8.34.0", "@sentry-internal/replay-canvas": "8.35.0",
"@sentry/core": "8.34.0", "@sentry/core": "8.35.0",
"@sentry/types": "8.34.0", "@sentry/types": "8.35.0",
"@sentry/utils": "8.34.0" "@sentry/utils": "8.35.0"
}, },
"engines": { "engines": {
"node": ">=14.18" "node": ">=14.18"
} }
}, },
"node_modules/@sentry/core": { "node_modules/@sentry/core": {
"version": "8.34.0", "version": "8.35.0",
"resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.34.0.tgz", "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.35.0.tgz",
"integrity": "sha512-adrXCTK/zsg5pJ67lgtZqdqHvyx6etMjQW3P82NgWdj83c8fb+zH+K79Z47pD4zQjX0ou2Ws5nwwi4wJbz4bfA==", "integrity": "sha512-Ci0Nmtw5ETWLqQJGY4dyF+iWh7PWKy6k303fCEoEmqj2czDrKJCp7yHBNV0XYbo00prj2ZTbCr6I7albYiyONA==",
"dependencies": { "dependencies": {
"@sentry/types": "8.34.0", "@sentry/types": "8.35.0",
"@sentry/utils": "8.34.0" "@sentry/utils": "8.35.0"
}, },
"engines": { "engines": {
"node": ">=14.18" "node": ">=14.18"
} }
}, },
"node_modules/@sentry/react": { "node_modules/@sentry/react": {
"version": "8.34.0", "version": "8.35.0",
"resolved": "https://registry.npmjs.org/@sentry/react/-/react-8.34.0.tgz", "resolved": "https://registry.npmjs.org/@sentry/react/-/react-8.35.0.tgz",
"integrity": "sha512-gIgzhj7h67C+Sdq2ul4fOSK142Gf0uV99bqHRdtIiUlXw9yjzZQY5TKTtzbOaevn7qBJ0xrRKtIRUbOBMl0clw==", "integrity": "sha512-8Y+s4pE9hvT2TwSo5JS/Enw2cNFlwiLcJDNGCj/Hho+FePFYA59hbN06ouTHWARnO+swANHKZQj24Wp57p1/tg==",
"dependencies": { "dependencies": {
"@sentry/browser": "8.34.0", "@sentry/browser": "8.35.0",
"@sentry/core": "8.34.0", "@sentry/core": "8.35.0",
"@sentry/types": "8.34.0", "@sentry/types": "8.35.0",
"@sentry/utils": "8.34.0", "@sentry/utils": "8.35.0",
"hoist-non-react-statics": "^3.3.2" "hoist-non-react-statics": "^3.3.2"
}, },
"engines": { "engines": {
@ -944,19 +944,19 @@
} }
}, },
"node_modules/@sentry/types": { "node_modules/@sentry/types": {
"version": "8.34.0", "version": "8.35.0",
"resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.34.0.tgz", "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.35.0.tgz",
"integrity": "sha512-zLRc60CzohGCo6zNsNeQ9JF3SiEeRE4aDCP9fDDdIVCOKovS+mn1rtSip0qd0Vp2fidOu0+2yY0ALCz1A3PJSQ==", "integrity": "sha512-AVEZjb16MlYPifiDDvJ19dPQyDn0jlrtC1PHs6ZKO+Rzyz+2EX2BRdszvanqArldexPoU1p5Bn2w81XZNXThBA==",
"engines": { "engines": {
"node": ">=14.18" "node": ">=14.18"
} }
}, },
"node_modules/@sentry/utils": { "node_modules/@sentry/utils": {
"version": "8.34.0", "version": "8.35.0",
"resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.34.0.tgz", "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.35.0.tgz",
"integrity": "sha512-W1KoRlFUjprlh3t86DZPFxLfM6mzjRzshVfMY7vRlJFymBelJsnJ3A1lPeBZM9nCraOSiw6GtOWu6k5BAkiGIg==", "integrity": "sha512-MdMb6+uXjqND7qIPWhulubpSeHzia6HtxeJa8jYI09OCvIcmNGPydv/Gx/LZBwosfMHrLdTWcFH7Y7aCxrq7cg==",
"dependencies": { "dependencies": {
"@sentry/types": "8.34.0" "@sentry/types": "8.35.0"
}, },
"engines": { "engines": {
"node": ">=14.18" "node": ">=14.18"
@ -984,9 +984,9 @@
} }
}, },
"node_modules/@tanstack/react-query": { "node_modules/@tanstack/react-query": {
"version": "5.59.14", "version": "5.59.15",
"resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.59.14.tgz", "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.59.15.tgz",
"integrity": "sha512-2cM4x3Ka4Thl7/wnjf++EMGA2Is/RgPynn83D4kfGiJOGSjb5T2D3EEOlC8Nt6U2htLS3imOXjOSMEjC3K7JNg==", "integrity": "sha512-QbVlAkTI78wB4Mqgf2RDmgC0AOiJqer2c5k9STOOSXGv1S6ZkY37r/6UpE8DbQ2Du0ohsdoXgFNEyv+4eDoPEw==",
"dependencies": { "dependencies": {
"@tanstack/query-core": "5.59.13" "@tanstack/query-core": "5.59.13"
}, },
@ -999,12 +999,12 @@
} }
}, },
"node_modules/@tanstack/react-router": { "node_modules/@tanstack/react-router": {
"version": "1.67.0", "version": "1.75.0",
"resolved": "https://registry.npmjs.org/@tanstack/react-router/-/react-router-1.67.0.tgz", "resolved": "https://registry.npmjs.org/@tanstack/react-router/-/react-router-1.75.0.tgz",
"integrity": "sha512-8AmtDpJZpoC+TnHf9qS0FbRz7qnLkQ336Oi6fyhfbHH+BPvf27tlj+YxbVrt7sVrdvI8n3AZveUGx38/JUkLDQ==", "integrity": "sha512-iELqrMjlE/Y2JeOkvTfrPPKovrvtj1M+PTESfNfNv26Ja1efotcx0hEXiClmT7KYIlVBf0TowI5GUBNWGArm6A==",
"dependencies": { "dependencies": {
"@tanstack/history": "1.61.1", "@tanstack/history": "1.61.1",
"@tanstack/react-store": "^0.5.5", "@tanstack/react-store": "^0.5.6",
"tiny-invariant": "^1.3.3", "tiny-invariant": "^1.3.3",
"tiny-warning": "^1.0.3" "tiny-warning": "^1.0.3"
}, },
@ -1016,7 +1016,7 @@
"url": "https://github.com/sponsors/tannerlinsley" "url": "https://github.com/sponsors/tannerlinsley"
}, },
"peerDependencies": { "peerDependencies": {
"@tanstack/router-generator": "1.65.0", "@tanstack/router-generator": "1.74.2",
"react": ">=18", "react": ">=18",
"react-dom": ">=18" "react-dom": ">=18"
}, },
@ -1027,8 +1027,9 @@
} }
}, },
"node_modules/@tanstack/react-store": { "node_modules/@tanstack/react-store": {
"version": "0.5.5", "version": "0.5.6",
"license": "MIT", "resolved": "https://registry.npmjs.org/@tanstack/react-store/-/react-store-0.5.6.tgz",
"integrity": "sha512-SitIpS5jTj28DajjLpWbIX+YetmJL+6PRY0DKKiCGBKfYIqj3ryODQYF3jB3SNoR9ifUA/jFkqbJdBKFtWd+AQ==",
"dependencies": { "dependencies": {
"@tanstack/store": "0.5.5", "@tanstack/store": "0.5.5",
"use-sync-external-store": "^1.2.2" "use-sync-external-store": "^1.2.2"
@ -1065,9 +1066,9 @@
} }
}, },
"node_modules/@tanstack/router-generator": { "node_modules/@tanstack/router-generator": {
"version": "1.65.0", "version": "1.74.2",
"resolved": "https://registry.npmjs.org/@tanstack/router-generator/-/router-generator-1.65.0.tgz", "resolved": "https://registry.npmjs.org/@tanstack/router-generator/-/router-generator-1.74.2.tgz",
"integrity": "sha512-N2H2cHBbUNLqx/ySd5g0R1GR8gGc4UagoBWmQKaTD5gHjFwWojJhigllZlQN4U1nxZLb4yJ3eJYuxRQZCoqaJw==", "integrity": "sha512-S69fXvYcL+tQsO5Fe9ju/XVa/hZvk4pCaWbtoR2MNjIgR2RmjiFKOgXYeLRMNom/IpP/HAQmQ3m1DwU9jjSUKA==",
"devOptional": true, "devOptional": true,
"dependencies": { "dependencies": {
"@tanstack/virtual-file-routes": "^1.64.0", "@tanstack/virtual-file-routes": "^1.64.0",
@ -1552,9 +1553,9 @@
} }
}, },
"node_modules/@tanstack/router-plugin": { "node_modules/@tanstack/router-plugin": {
"version": "1.66.1", "version": "1.76.0",
"resolved": "https://registry.npmjs.org/@tanstack/router-plugin/-/router-plugin-1.66.1.tgz", "resolved": "https://registry.npmjs.org/@tanstack/router-plugin/-/router-plugin-1.76.0.tgz",
"integrity": "sha512-0oeO4x1AKwL9lP9WMJ4ysVcNCUdXHffjFKBWYaEt1Cj2RkWgaWXtSzgg3dhFFemYgn/Zm1NOGQlA4f6/q/PPZw==", "integrity": "sha512-5JY1NeNbxi7jamTKTAWLyyC9t4Y9Ol+vFZB84h6F1K1BkxqeWQTCJuXMYCY3KawSd7xy2mVT/BgDyZ0AS5hKAA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/core": "^7.25.8", "@babel/core": "^7.25.8",
@ -1565,7 +1566,7 @@
"@babel/template": "^7.25.7", "@babel/template": "^7.25.7",
"@babel/traverse": "^7.25.7", "@babel/traverse": "^7.25.7",
"@babel/types": "^7.25.8", "@babel/types": "^7.25.8",
"@tanstack/router-generator": "^1.65.0", "@tanstack/router-generator": "^1.74.2",
"@tanstack/virtual-file-routes": "^1.64.0", "@tanstack/virtual-file-routes": "^1.64.0",
"@types/babel__core": "^7.20.5", "@types/babel__core": "^7.20.5",
"@types/babel__generator": "^7.6.8", "@types/babel__generator": "^7.6.8",
@ -1602,7 +1603,8 @@
}, },
"node_modules/@tanstack/store": { "node_modules/@tanstack/store": {
"version": "0.5.5", "version": "0.5.5",
"license": "MIT", "resolved": "https://registry.npmjs.org/@tanstack/store/-/store-0.5.5.tgz",
"integrity": "sha512-EOSrgdDAJExbvRZEQ/Xhh9iZchXpMN+ga1Bnk8Nmygzs8TfiE6hbzThF+Pr2G19uHL6+DTDTHhJ8VQiOd7l4tA==",
"funding": { "funding": {
"type": "github", "type": "github",
"url": "https://github.com/sponsors/tannerlinsley" "url": "https://github.com/sponsors/tannerlinsley"
@ -1695,9 +1697,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "22.7.5", "version": "22.7.8",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.8.tgz",
"integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", "integrity": "sha512-a922jJy31vqR5sk+kAdIENJjHblqcZ4RmERviFsER4WJcEONqxKcjNOlk0q7OUfrF5sddT+vng070cdfMlrPLg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"undici-types": "~6.19.2" "undici-types": "~6.19.2"
@ -1728,16 +1730,16 @@
} }
}, },
"node_modules/@typescript-eslint/eslint-plugin": { "node_modules/@typescript-eslint/eslint-plugin": {
"version": "8.9.0", "version": "8.11.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.9.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.11.0.tgz",
"integrity": "sha512-Y1n621OCy4m7/vTXNlCbMVp87zSd7NH0L9cXD8aIpOaNlzeWxIK4+Q19A68gSmTNRZn92UjocVUWDthGxtqHFg==", "integrity": "sha512-KhGn2LjW1PJT2A/GfDpiyOfS4a8xHQv2myUagTM5+zsormOmBlYsnQ6pobJ8XxJmh6hnHwa2Mbe3fPrDJoDhbA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@eslint-community/regexpp": "^4.10.0", "@eslint-community/regexpp": "^4.10.0",
"@typescript-eslint/scope-manager": "8.9.0", "@typescript-eslint/scope-manager": "8.11.0",
"@typescript-eslint/type-utils": "8.9.0", "@typescript-eslint/type-utils": "8.11.0",
"@typescript-eslint/utils": "8.9.0", "@typescript-eslint/utils": "8.11.0",
"@typescript-eslint/visitor-keys": "8.9.0", "@typescript-eslint/visitor-keys": "8.11.0",
"graphemer": "^1.4.0", "graphemer": "^1.4.0",
"ignore": "^5.3.1", "ignore": "^5.3.1",
"natural-compare": "^1.4.0", "natural-compare": "^1.4.0",
@ -1761,15 +1763,15 @@
} }
}, },
"node_modules/@typescript-eslint/parser": { "node_modules/@typescript-eslint/parser": {
"version": "8.9.0", "version": "8.11.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.9.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.11.0.tgz",
"integrity": "sha512-U+BLn2rqTTHnc4FL3FJjxaXptTxmf9sNftJK62XLz4+GxG3hLHm/SUNaaXP5Y4uTiuYoL5YLy4JBCJe3+t8awQ==", "integrity": "sha512-lmt73NeHdy1Q/2ul295Qy3uninSqi6wQI18XwSpm8w0ZbQXUpjCAWP1Vlv/obudoBiIjJVjlztjQ+d/Md98Yxg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/scope-manager": "8.9.0", "@typescript-eslint/scope-manager": "8.11.0",
"@typescript-eslint/types": "8.9.0", "@typescript-eslint/types": "8.11.0",
"@typescript-eslint/typescript-estree": "8.9.0", "@typescript-eslint/typescript-estree": "8.11.0",
"@typescript-eslint/visitor-keys": "8.9.0", "@typescript-eslint/visitor-keys": "8.11.0",
"debug": "^4.3.4" "debug": "^4.3.4"
}, },
"engines": { "engines": {
@ -1789,13 +1791,13 @@
} }
}, },
"node_modules/@typescript-eslint/scope-manager": { "node_modules/@typescript-eslint/scope-manager": {
"version": "8.9.0", "version": "8.11.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.9.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.11.0.tgz",
"integrity": "sha512-bZu9bUud9ym1cabmOYH9S6TnbWRzpklVmwqICeOulTCZ9ue2/pczWzQvt/cGj2r2o1RdKoZbuEMalJJSYw3pHQ==", "integrity": "sha512-Uholz7tWhXmA4r6epo+vaeV7yjdKy5QFCERMjs1kMVsLRKIrSdM6o21W2He9ftp5PP6aWOVpD5zvrvuHZC0bMQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/types": "8.9.0", "@typescript-eslint/types": "8.11.0",
"@typescript-eslint/visitor-keys": "8.9.0" "@typescript-eslint/visitor-keys": "8.11.0"
}, },
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@ -1806,13 +1808,13 @@
} }
}, },
"node_modules/@typescript-eslint/type-utils": { "node_modules/@typescript-eslint/type-utils": {
"version": "8.9.0", "version": "8.11.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.9.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.11.0.tgz",
"integrity": "sha512-JD+/pCqlKqAk5961vxCluK+clkppHY07IbV3vett97KOV+8C6l+CPEPwpUuiMwgbOz/qrN3Ke4zzjqbT+ls+1Q==", "integrity": "sha512-ItiMfJS6pQU0NIKAaybBKkuVzo6IdnAhPFZA/2Mba/uBjuPQPet/8+zh5GtLHwmuFRShZx+8lhIs7/QeDHflOg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/typescript-estree": "8.9.0", "@typescript-eslint/typescript-estree": "8.11.0",
"@typescript-eslint/utils": "8.9.0", "@typescript-eslint/utils": "8.11.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"ts-api-utils": "^1.3.0" "ts-api-utils": "^1.3.0"
}, },
@ -1830,9 +1832,9 @@
} }
}, },
"node_modules/@typescript-eslint/types": { "node_modules/@typescript-eslint/types": {
"version": "8.9.0", "version": "8.11.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.9.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.11.0.tgz",
"integrity": "sha512-SjgkvdYyt1FAPhU9c6FiYCXrldwYYlIQLkuc+LfAhCna6ggp96ACncdtlbn8FmnG72tUkXclrDExOpEYf1nfJQ==", "integrity": "sha512-tn6sNMHf6EBAYMvmPUaKaVeYvhUsrE6x+bXQTxjQRp360h1giATU0WvgeEys1spbvb5R+VpNOZ+XJmjD8wOUHw==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@ -1843,13 +1845,13 @@
} }
}, },
"node_modules/@typescript-eslint/typescript-estree": { "node_modules/@typescript-eslint/typescript-estree": {
"version": "8.9.0", "version": "8.11.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.9.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.11.0.tgz",
"integrity": "sha512-9iJYTgKLDG6+iqegehc5+EqE6sqaee7kb8vWpmHZ86EqwDjmlqNNHeqDVqb9duh+BY6WCNHfIGvuVU3Tf9Db0g==", "integrity": "sha512-yHC3s1z1RCHoCz5t06gf7jH24rr3vns08XXhfEqzYpd6Hll3z/3g23JRi0jM8A47UFKNc3u/y5KIMx8Ynbjohg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/types": "8.9.0", "@typescript-eslint/types": "8.11.0",
"@typescript-eslint/visitor-keys": "8.9.0", "@typescript-eslint/visitor-keys": "8.11.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"fast-glob": "^3.3.2", "fast-glob": "^3.3.2",
"is-glob": "^4.0.3", "is-glob": "^4.0.3",
@ -1883,15 +1885,15 @@
} }
}, },
"node_modules/@typescript-eslint/utils": { "node_modules/@typescript-eslint/utils": {
"version": "8.9.0", "version": "8.11.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.9.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.11.0.tgz",
"integrity": "sha512-PKgMmaSo/Yg/F7kIZvrgrWa1+Vwn036CdNUvYFEkYbPwOH4i8xvkaRlu148W3vtheWK9ckKRIz7PBP5oUlkrvQ==", "integrity": "sha512-CYiX6WZcbXNJV7UNB4PLDIBtSdRmRI/nb0FMyqHPTQD1rMjA0foPLaPUV39C/MxkTd/QKSeX+Gb34PPsDVC35g==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@eslint-community/eslint-utils": "^4.4.0", "@eslint-community/eslint-utils": "^4.4.0",
"@typescript-eslint/scope-manager": "8.9.0", "@typescript-eslint/scope-manager": "8.11.0",
"@typescript-eslint/types": "8.9.0", "@typescript-eslint/types": "8.11.0",
"@typescript-eslint/typescript-estree": "8.9.0" "@typescript-eslint/typescript-estree": "8.11.0"
}, },
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@ -1905,12 +1907,12 @@
} }
}, },
"node_modules/@typescript-eslint/visitor-keys": { "node_modules/@typescript-eslint/visitor-keys": {
"version": "8.9.0", "version": "8.11.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.9.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.11.0.tgz",
"integrity": "sha512-Ht4y38ubk4L5/U8xKUBfKNYGmvKvA1CANoxiTRMM+tOLk3lbF3DvzZCxJCRSE+2GdCMSh6zq9VZJc3asc1XuAA==", "integrity": "sha512-EaewX6lxSjRJnc+99+dqzTeoDZUfyrA52d2/HRrkI830kgovWsmIiTfmr0NZorzqic7ga+1bS60lRBUgR3n/Bw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/types": "8.9.0", "@typescript-eslint/types": "8.11.0",
"eslint-visitor-keys": "^3.4.3" "eslint-visitor-keys": "^3.4.3"
}, },
"engines": { "engines": {
@ -1927,13 +1929,14 @@
"license": "ISC" "license": "ISC"
}, },
"node_modules/@vitejs/plugin-react": { "node_modules/@vitejs/plugin-react": {
"version": "4.3.1", "version": "4.3.3",
"resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.3.tgz",
"integrity": "sha512-NooDe9GpHGqNns1i8XDERg0Vsg5SSYRhRxxyTGogUdkdNt47jal+fbuYi+Yfq6pzRCKXyoPcWisfxE6RIM3GKA==",
"dev": true, "dev": true,
"license": "MIT",
"dependencies": { "dependencies": {
"@babel/core": "^7.24.5", "@babel/core": "^7.25.2",
"@babel/plugin-transform-react-jsx-self": "^7.24.5", "@babel/plugin-transform-react-jsx-self": "^7.24.7",
"@babel/plugin-transform-react-jsx-source": "^7.24.1", "@babel/plugin-transform-react-jsx-source": "^7.24.7",
"@types/babel__core": "^7.20.5", "@types/babel__core": "^7.20.5",
"react-refresh": "^0.14.2" "react-refresh": "^0.14.2"
}, },
@ -2393,9 +2396,9 @@
} }
}, },
"node_modules/eslint-plugin-react-refresh": { "node_modules/eslint-plugin-react-refresh": {
"version": "0.4.12", "version": "0.4.13",
"resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.12.tgz", "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.13.tgz",
"integrity": "sha512-9neVjoGv20FwYtCP6CB1dzR1vr57ZDNOXst21wd2xJ/cTlM2xLq0GWVlSNTdMn/4BtP6cHYBMCSp1wFBJ9jBsg==", "integrity": "sha512-f1EppwrpJRWmqDTyvAyomFVDYRtrS7iTEqv3nokETnMiMzs2SSTmKRTACce4O2p4jYyowiSMvpdwC/RLcMFhuQ==",
"dev": true, "dev": true,
"peerDependencies": { "peerDependencies": {
"eslint": ">=7" "eslint": ">=7"
@ -3221,12 +3224,12 @@
} }
}, },
"node_modules/playwright": { "node_modules/playwright": {
"version": "1.48.0", "version": "1.48.1",
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.48.0.tgz", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.48.1.tgz",
"integrity": "sha512-qPqFaMEHuY/ug8o0uteYJSRfMGFikhUysk8ZvAtfKmUK3kc/6oNl/y3EczF8OFGYIi/Ex2HspMfzYArk6+XQSA==", "integrity": "sha512-j8CiHW/V6HxmbntOfyB4+T/uk08tBy6ph0MpBXwuoofkSnLmlfdYNNkFTYD6ofzzlSqLA1fwH4vwvVFvJgLN0w==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"playwright-core": "1.48.0" "playwright-core": "1.48.1"
}, },
"bin": { "bin": {
"playwright": "cli.js" "playwright": "cli.js"
@ -3239,9 +3242,9 @@
} }
}, },
"node_modules/playwright-core": { "node_modules/playwright-core": {
"version": "1.48.0", "version": "1.48.1",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.48.0.tgz", "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.48.1.tgz",
"integrity": "sha512-RBvzjM9rdpP7UUFrQzRwR8L/xR4HyC1QXMzGYTbf1vjw25/ya9NRAVnXi/0fvFopjebvyPzsmoK58xxeEOaVvA==", "integrity": "sha512-Yw/t4VAFX/bBr1OzwCuOMZkY1Cnb4z/doAFSwf4huqAGWmf9eMNjmK7NiOljCdLmxeRYcGPPmcDgU0zOlzP0YA==",
"dev": true, "dev": true,
"bin": { "bin": {
"playwright-core": "cli.js" "playwright-core": "cli.js"
@ -3499,9 +3502,9 @@
} }
}, },
"node_modules/sass-embedded": { "node_modules/sass-embedded": {
"version": "1.79.5", "version": "1.80.3",
"resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.79.5.tgz", "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.80.3.tgz",
"integrity": "sha512-QFdalnjGFkbNvb6/uQGmP4OIN+GQ5/R77eu0PsXduDB1YP5JW5DSWFVDAyK6l6C54P+3J3eXkjuPYC0mcwX+AA==", "integrity": "sha512-aTxTl4ToSAWg7ILFgAe+kMenj+zNlwHmHK/ZNPrOM8+HTef1Q6zuxolptYLijmHdZHKSMOkWYHgo5MMN6+GIyg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@bufbuild/protobuf": "^2.0.0", "@bufbuild/protobuf": "^2.0.0",
@ -3519,32 +3522,32 @@
"node": ">=16.0.0" "node": ">=16.0.0"
}, },
"optionalDependencies": { "optionalDependencies": {
"sass-embedded-android-arm": "1.79.5", "sass-embedded-android-arm": "1.80.3",
"sass-embedded-android-arm64": "1.79.5", "sass-embedded-android-arm64": "1.80.3",
"sass-embedded-android-ia32": "1.79.5", "sass-embedded-android-ia32": "1.80.3",
"sass-embedded-android-riscv64": "1.79.5", "sass-embedded-android-riscv64": "1.80.3",
"sass-embedded-android-x64": "1.79.5", "sass-embedded-android-x64": "1.80.3",
"sass-embedded-darwin-arm64": "1.79.5", "sass-embedded-darwin-arm64": "1.80.3",
"sass-embedded-darwin-x64": "1.79.5", "sass-embedded-darwin-x64": "1.80.3",
"sass-embedded-linux-arm": "1.79.5", "sass-embedded-linux-arm": "1.80.3",
"sass-embedded-linux-arm64": "1.79.5", "sass-embedded-linux-arm64": "1.80.3",
"sass-embedded-linux-ia32": "1.79.5", "sass-embedded-linux-ia32": "1.80.3",
"sass-embedded-linux-musl-arm": "1.79.5", "sass-embedded-linux-musl-arm": "1.80.3",
"sass-embedded-linux-musl-arm64": "1.79.5", "sass-embedded-linux-musl-arm64": "1.80.3",
"sass-embedded-linux-musl-ia32": "1.79.5", "sass-embedded-linux-musl-ia32": "1.80.3",
"sass-embedded-linux-musl-riscv64": "1.79.5", "sass-embedded-linux-musl-riscv64": "1.80.3",
"sass-embedded-linux-musl-x64": "1.79.5", "sass-embedded-linux-musl-x64": "1.80.3",
"sass-embedded-linux-riscv64": "1.79.5", "sass-embedded-linux-riscv64": "1.80.3",
"sass-embedded-linux-x64": "1.79.5", "sass-embedded-linux-x64": "1.80.3",
"sass-embedded-win32-arm64": "1.79.5", "sass-embedded-win32-arm64": "1.80.3",
"sass-embedded-win32-ia32": "1.79.5", "sass-embedded-win32-ia32": "1.80.3",
"sass-embedded-win32-x64": "1.79.5" "sass-embedded-win32-x64": "1.80.3"
} }
}, },
"node_modules/sass-embedded-android-arm": { "node_modules/sass-embedded-android-arm": {
"version": "1.79.5", "version": "1.80.3",
"resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.79.5.tgz", "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.80.3.tgz",
"integrity": "sha512-gYtpQAE2uNFa5IBKBIzUq5ETDS6gnVRmhP5j+N5JGrOThYaGPcG4KrjlU9R3BfCmc7zP5WvlHFZsxSz+2JRT2w==", "integrity": "sha512-i87crav7sfShzY7AyUneXvs4SWdJ93QlYIpo/2OQPTJV5MjJF8wUp0o9NT8Oo6sUJ26kfgsb64FwqQh1wO5uBg==",
"cpu": [ "cpu": [
"arm" "arm"
], ],
@ -3558,9 +3561,9 @@
} }
}, },
"node_modules/sass-embedded-android-arm64": { "node_modules/sass-embedded-android-arm64": {
"version": "1.79.5", "version": "1.80.3",
"resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.79.5.tgz", "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.80.3.tgz",
"integrity": "sha512-pq1RJTENkRmEUMLiVuSGYwuLk8zXovWzrjQxlWZTF/Jn5F7Ypi/3v5huMmgJF5n+etsxjio1PN1idaQ5tPLBmg==", "integrity": "sha512-uaEKdi+PaFc1V87vj2eCUB8B2ThNvEYYu9Qs5sCtx1atEQDtvp/smHYlXOVrg2M4+g2YASkDBQewyk+auZtG0g==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -3574,9 +3577,9 @@
} }
}, },
"node_modules/sass-embedded-android-ia32": { "node_modules/sass-embedded-android-ia32": {
"version": "1.79.5", "version": "1.80.3",
"resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.79.5.tgz", "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.80.3.tgz",
"integrity": "sha512-CgJZjLxYRkgjTP/76WumLlF7+1aW0LA+DSEJhkVaCxe5avndRCmPrNcX0PrtYSDvUgeQDvY7xF+fT9QXN1+NgQ==", "integrity": "sha512-XCa4Se7vqWuV5tFLZuYWidPLUCeK7n1AgugircJl/9QPThCGZ2mSRF0Ipj3lv+Qw4GG9kkhCqJIrksTGbSFypw==",
"cpu": [ "cpu": [
"ia32" "ia32"
], ],
@ -3590,9 +3593,9 @@
} }
}, },
"node_modules/sass-embedded-android-riscv64": { "node_modules/sass-embedded-android-riscv64": {
"version": "1.79.5", "version": "1.80.3",
"resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.79.5.tgz", "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.80.3.tgz",
"integrity": "sha512-OLbdmDSM/eOjO01PUYbS54BQOCM/HHHHWk/4M8HHdxwF3ojy5eqQaA63R1YQ3IJvLEE7dnudofOXmL01B5+yvQ==", "integrity": "sha512-Dn3hYh5rchfivnPrHoff2pWutuFYJRddzEXcjfb0JhgF7JmTA/6Dxaym0pqVpS1RmYDiAYnmoX5OeFtEkdVytA==",
"cpu": [ "cpu": [
"riscv64" "riscv64"
], ],
@ -3606,9 +3609,9 @@
} }
}, },
"node_modules/sass-embedded-android-x64": { "node_modules/sass-embedded-android-x64": {
"version": "1.79.5", "version": "1.80.3",
"resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.79.5.tgz", "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.80.3.tgz",
"integrity": "sha512-UbXxk/rdR3aVBkB7Fh/eAUL7oUADWgQrYpLe9Xu5A0gmthw0/zo/pu7kweBSrbgHnPfWIt/uxwmW4eEAmqqZWQ==", "integrity": "sha512-QWOTHKPznYJnrP3HrlFYnAQOZ/c2am4ctK1cFIMtjQNGaFra8z94LZSQzAd6eeu6mITKwQbJuff36RpICZpgHA==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -3622,9 +3625,9 @@
} }
}, },
"node_modules/sass-embedded-darwin-arm64": { "node_modules/sass-embedded-darwin-arm64": {
"version": "1.79.5", "version": "1.80.3",
"resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.79.5.tgz", "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.80.3.tgz",
"integrity": "sha512-qeEl9XhYetZSY1j4nqvh3hB8tfYOAGsOQyVOCaxyX1bubMRSGPvPNIyftm14QzK7EDrE/K/0+FwCvflarOV4NQ==", "integrity": "sha512-NqJXHzZGqVOarr36X5MIv0UCQHYVhOFXGe7kDhNqMQCiNApkVydseB5TM1C2lVaiWy2JaseRD/dUNS/o2ICKXw==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -3638,9 +3641,9 @@
} }
}, },
"node_modules/sass-embedded-darwin-x64": { "node_modules/sass-embedded-darwin-x64": {
"version": "1.79.5", "version": "1.80.3",
"resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.79.5.tgz", "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.80.3.tgz",
"integrity": "sha512-y4pvkYCQhgruxlncub/2j+cZSmlpsZX9Rp1aTRIKvlNagqFStYzFZ6kX3CErlfCEAMYwRVEhP8z/OOoDqnjaZA==", "integrity": "sha512-6dmNn+oNxXE5uGThfAsHgz7Jg1oDhXHHQyPAnIIaMOM5dXv0D/nLmrlFbFajK0HtbzGaTVBTE6wkJwjASuP0Uw==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -3654,9 +3657,9 @@
} }
}, },
"node_modules/sass-embedded-linux-arm": { "node_modules/sass-embedded-linux-arm": {
"version": "1.79.5", "version": "1.80.3",
"resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.79.5.tgz", "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.80.3.tgz",
"integrity": "sha512-rX6qAR8pE1pevYhGzbCpGFexdH4z6QMnw3IeiCNmkpJ4zMXNEN336xl6SZN0xaPiGuNDhUFcq0wgSq3RDKS5vQ==", "integrity": "sha512-nZ7Y8gZgr+/fYrbsX3L8BfIafWXGVBcc0gKLoujad+axlFGv1MetO17S3vzrOQ1wuhjvDLVxceA/jtcta1qxoA==",
"cpu": [ "cpu": [
"arm" "arm"
], ],
@ -3670,9 +3673,9 @@
} }
}, },
"node_modules/sass-embedded-linux-arm64": { "node_modules/sass-embedded-linux-arm64": {
"version": "1.79.5", "version": "1.80.3",
"resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.79.5.tgz", "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.80.3.tgz",
"integrity": "sha512-kiUbrLiNAA7vOe6kpdukRhCad1u7ebwhB0ZE63+IgF5HFZ/Qo6GkhHIrVM9AfeLxUT3N6Z4BNtgdcRa9na4Pwg==", "integrity": "sha512-a9IILen4I6oFFb5qMHOiFqIAoztPuvJ6VHNaFbktP8SUvH4FX63ZutR/qKisN9DoudzSXMZijv/aG/bTh0Kccw==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -3686,9 +3689,9 @@
} }
}, },
"node_modules/sass-embedded-linux-ia32": { "node_modules/sass-embedded-linux-ia32": {
"version": "1.79.5", "version": "1.80.3",
"resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.79.5.tgz", "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.80.3.tgz",
"integrity": "sha512-12pj3fBV0+VAX/RI6uYFxi/MoUoihRKP7iVpo9MaT/m+EtvN6mYsDpi/T4pTq2dKQYljoaFq8Rb6tR+FinS1zg==", "integrity": "sha512-yKy4N0L9WfGokpBMHOhxzaS3jyzrHUg1+5Idi6J88onwxfpEhqOgdMcoqgOqvryMPrmKN7kW5d3iNpUYOniPnw==",
"cpu": [ "cpu": [
"ia32" "ia32"
], ],
@ -3702,9 +3705,9 @@
} }
}, },
"node_modules/sass-embedded-linux-musl-arm": { "node_modules/sass-embedded-linux-musl-arm": {
"version": "1.79.5", "version": "1.80.3",
"resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.79.5.tgz", "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.80.3.tgz",
"integrity": "sha512-EHFrbTgRymEFTf3JnjHzC24PO0WHFjLUEWUJqSuWKZw0+BCL7120MvYIrfkYymPp5UYk+STIjj+Fd9dYSWBrAg==", "integrity": "sha512-yB7iSoS/phNHKFsZRW0rTRwoCTtOBELG/UYpIa2qATWZsDASSjdBitGsKS3nEliweveuGIVlUqG2kUKaq9M39g==",
"cpu": [ "cpu": [
"arm" "arm"
], ],
@ -3718,9 +3721,9 @@
} }
}, },
"node_modules/sass-embedded-linux-musl-arm64": { "node_modules/sass-embedded-linux-musl-arm64": {
"version": "1.79.5", "version": "1.80.3",
"resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.79.5.tgz", "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.80.3.tgz",
"integrity": "sha512-Qg1HuQ+ebz3wfPT7xty2G8BpDLXdyfMk7WqKd+X1DlFEcY/kcNapwMVFXS2fCYTTR3gcbIZ4p7eUiQySlkj93A==", "integrity": "sha512-mw4BPe42wlAwg6vgmGkg+MDDyXZBexvAWC+QigtfMjTVHuSAB527UVWhIyv4jAkKLp71mPowsXXsfa4UHzyBaA==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -3734,9 +3737,9 @@
} }
}, },
"node_modules/sass-embedded-linux-musl-ia32": { "node_modules/sass-embedded-linux-musl-ia32": {
"version": "1.79.5", "version": "1.80.3",
"resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.79.5.tgz", "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.80.3.tgz",
"integrity": "sha512-2qdsGIcdCnpsw8Ijuq8uk4RifxV/lTd1mqjrfge7AfFBtQIExbxZoYBtbSrcY63ONa+UWEf9Z1p6rZ3QySKWlg==", "integrity": "sha512-eyg5L9IFisCYYMXEZ/56X8k8wdhpfK06/j9MFAINE9U4C5NxQXrVWmMTEqgyfpmca8hziBlvbRrjdquteyXWfw==",
"cpu": [ "cpu": [
"ia32" "ia32"
], ],
@ -3750,9 +3753,9 @@
} }
}, },
"node_modules/sass-embedded-linux-musl-riscv64": { "node_modules/sass-embedded-linux-musl-riscv64": {
"version": "1.79.5", "version": "1.80.3",
"resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.79.5.tgz", "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.80.3.tgz",
"integrity": "sha512-wrc6s8YQt95koSkaLoP5HtvAAKxTPWqYZVxnoqp2bHgkKWlr4ymJll9vMcdU3//VxTgJbuH83U5ajzNCtHd0NQ==", "integrity": "sha512-0VThiW7Gwo5UNgKyETYID6F2prHvOCH8fQQKM0sS/JSbTu1poTwD35yEptVxBpiTvyWwxI7K5Cbn0gtxobaqzA==",
"cpu": [ "cpu": [
"riscv64" "riscv64"
], ],
@ -3766,9 +3769,9 @@
} }
}, },
"node_modules/sass-embedded-linux-musl-x64": { "node_modules/sass-embedded-linux-musl-x64": {
"version": "1.79.5", "version": "1.80.3",
"resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.79.5.tgz", "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.80.3.tgz",
"integrity": "sha512-1J6JrGpVp07GsBEzEGj/9u6UkVUuga2U7kpfkQxIdYOLmXmXmni6zNx89VehaP7X5OSscwJc/Zufh++6VcRQHw==", "integrity": "sha512-ALSKlhTQdNS0cayyaXD8huNd+DRjWgCjDqyjvwSgemfLL+wtmVCO8h9rGu1MCwR8GHP6ceZCT2fBmjfcGHk0DQ==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -3782,9 +3785,9 @@
} }
}, },
"node_modules/sass-embedded-linux-riscv64": { "node_modules/sass-embedded-linux-riscv64": {
"version": "1.79.5", "version": "1.80.3",
"resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.79.5.tgz", "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.80.3.tgz",
"integrity": "sha512-G45UKRAUgvxXhLROowTgVmyIVyGtRZoCMVH1vPi0EG5SePy43AkhjQVaUb6Ol6lfRRNpQqBFKw3UabxaMCM0Ow==", "integrity": "sha512-/1JvuQi137BNO7iTvNNraGYEt9mh3ch44cabJBTxLn3IZV5vNblENI+Hrj9J8/VWIsJumwPQGZSUrMbZcgB0tg==",
"cpu": [ "cpu": [
"riscv64" "riscv64"
], ],
@ -3798,9 +3801,9 @@
} }
}, },
"node_modules/sass-embedded-linux-x64": { "node_modules/sass-embedded-linux-x64": {
"version": "1.79.5", "version": "1.80.3",
"resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.79.5.tgz", "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.80.3.tgz",
"integrity": "sha512-EOk6pULzxM9b5B8uuuZbQXqfg2BQheAovQeYAw4ueHikaFoESOfaA8OG4kl0v1m5v5tKqAHOjy7xFhtpbEpqEw==", "integrity": "sha512-ISQUnl9oFA0PFPtgOpgotfKQ8guUBIYcTpkHEF9lQ4PyFIxkXppk5CwQ8l0VQcQaKhOD2HQAucoqM51U7FABqA==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -3814,9 +3817,9 @@
} }
}, },
"node_modules/sass-embedded-win32-arm64": { "node_modules/sass-embedded-win32-arm64": {
"version": "1.79.5", "version": "1.80.3",
"resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.79.5.tgz", "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.80.3.tgz",
"integrity": "sha512-KdkJOmJSe5lhR4Kxn522GbZo4jRUnQ+V4JQSaIbyxKndBpD81NGPYhDs0ikpJciqrwbmiBxVD5Qqeim6B1gdxA==", "integrity": "sha512-RFT/OsWHVagPYa/9v+KfVM99QgzwzwnT2maapRfulEH39v0uPGOIFNXmnhaN3E5gNLIjIn3CTnR9KjTC145E8Q==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -3830,9 +3833,9 @@
} }
}, },
"node_modules/sass-embedded-win32-ia32": { "node_modules/sass-embedded-win32-ia32": {
"version": "1.79.5", "version": "1.80.3",
"resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.79.5.tgz", "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.80.3.tgz",
"integrity": "sha512-1YX4TVw6j3eqxRyPK3t45V5WSyAzql6EgKIEtjPQ0+ByRyqLRuHXlotHPX6KOcc0rA3LMUHmdskN1o08sRIDhA==", "integrity": "sha512-Is0eeX+UlWW7yPfDqc2Z2n9ql2rkA1uDaAkbHWWx5APc8CKYtds1w4B3Tyoy6lHnopEifgzgsnp6QSyOHHzPBg==",
"cpu": [ "cpu": [
"ia32" "ia32"
], ],
@ -3846,9 +3849,9 @@
} }
}, },
"node_modules/sass-embedded-win32-x64": { "node_modules/sass-embedded-win32-x64": {
"version": "1.79.5", "version": "1.80.3",
"resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.79.5.tgz", "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.80.3.tgz",
"integrity": "sha512-8Tj9hBpOd6e+j23uTDecFb1ezQhvjQ+jvgKdVg9VlvwKUWmEStnHKA0x1uIQTThIM3dLCsYe63b/wX43gP8tBA==", "integrity": "sha512-wehVA0atPloc6NKof/ctpW0agM+k7kiBLIpQs3/mi9FAlmTjxNnvntBPZIbl8n7AAExiLEir+x/LHC0yGhTfkg==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -4113,7 +4116,8 @@
}, },
"node_modules/use-sync-external-store": { "node_modules/use-sync-external-store": {
"version": "1.2.2", "version": "1.2.2",
"license": "MIT", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz",
"integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==",
"peerDependencies": { "peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0" "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
} }

View File

@ -5,7 +5,7 @@
"type": "git", "type": "git",
"url": "https://github.com/codex-storage/codex-marketplace-ui" "url": "https://github.com/codex-storage/codex-marketplace-ui"
}, },
"version": "0.0.6", "version": "0.0.7",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite --host 127.0.0.1 --port 5173", "dev": "vite --host 127.0.0.1 --port 5173",
@ -24,7 +24,7 @@
"React" "React"
], ],
"dependencies": { "dependencies": {
"@codex-storage/marketplace-ui-components": "^0.0.20", "@codex-storage/marketplace-ui-components": "^0.0.24",
"@codex-storage/sdk-js": "^0.0.8", "@codex-storage/sdk-js": "^0.0.8",
"@sentry/browser": "^8.32.0", "@sentry/browser": "^8.32.0",
"@sentry/react": "^8.31.0", "@sentry/react": "^8.31.0",

View File

@ -6,6 +6,7 @@ import { CodexSdk } from "../../sdk/codex";
export function CodexUrlSettings() { export function CodexUrlSettings() {
const queryClient = useQueryClient(); const queryClient = useQueryClient();
const [url, setUrl] = useState(CodexSdk.url); const [url, setUrl] = useState(CodexSdk.url);
const [isInvalid, setIsInvalid] = useState(false);
const [toast, setToast] = useState({ time: 0, message: "" }); const [toast, setToast] = useState({ time: 0, message: "" });
const { mutateAsync } = useMutation({ const { mutateAsync } = useMutation({
mutationFn: (url: string) => CodexSdk.updateURL(url), mutationFn: (url: string) => CodexSdk.updateURL(url),
@ -17,23 +18,37 @@ export function CodexUrlSettings() {
}); });
const onChange = (e: React.FormEvent<HTMLInputElement>) => { const onChange = (e: React.FormEvent<HTMLInputElement>) => {
const value = e.currentTarget.value; const element = e.currentTarget;
if (value) { const value = element.value;
setUrl(value); setUrl(value);
setIsInvalid(!element.checkValidity());
};
const onClick = () => {
if (isInvalid === false) {
mutateAsync(url);
} }
}; };
const onClick = () => mutateAsync(url);
return ( return (
<> <>
<div className="settings-input">
<Input <Input
id="url" id="url"
label="Codex client node URL" label="Codex client node URL"
onChange={onChange} onChange={onChange}
value={url} value={url}
inputClassName="settings-input"></Input> isInvalid={isInvalid}
<Button variant="primary" label="Save changes" onClick={onClick}></Button> helper={isInvalid ? "The URL is not valid" : "Enter a valid URL"}
type="url"></Input>
</div>
<Button
className="settings-url-button"
disabled={isInvalid}
variant="primary"
label="Save changes"
onClick={onClick}></Button>
<Toast message={toast.message} time={toast.time} variant="success" /> <Toast message={toast.message} time={toast.time} variant="success" />
</> </>
); );

View File

@ -7,7 +7,7 @@ export function Download() {
const [cid, setCid] = useState(""); const [cid, setCid] = useState("");
const onDownload = () => { const onDownload = () => {
const url = CodexSdk.url() + "/api/codex/v1/data/"; const url = CodexSdk.url() + "/api/codex/v1/data/";
window.open(url + cid + "/network", "_target"); window.open(url + cid + "/network/stream", "_target");
}; };
const onCidChange = (e: ChangeEvent<HTMLInputElement>) => const onCidChange = (e: ChangeEvent<HTMLInputElement>) =>

View File

@ -1,6 +1,5 @@
import { Cell } from "@codex-storage/marketplace-ui-components"; import { Cell } from "@codex-storage/marketplace-ui-components";
import { PeerPin } from "./types"; import { PeerPin } from "./types";
import { countriesCoordinates } from "./countries";
import { useQuery } from "@tanstack/react-query"; import { useQuery } from "@tanstack/react-query";
import "./PeerCountryCell.css"; import "./PeerCountryCell.css";
import { useEffect } from "react"; import { useEffect } from "react";
@ -23,10 +22,8 @@ export function PeerCountryCell({ address, onPinAdd }: Props) {
queryFn: () => { queryFn: () => {
const [ip] = address.split(":"); const [ip] = address.split(":");
return fetch(import.meta.env.VITE_GEO_IP_URL + "/" + ip) return fetch(import.meta.env.VITE_GEO_IP_URL + "/json?ip=" + ip).then(
.then((res) => res.json()) (res) => res.json()
.then((json) =>
countriesCoordinates.find((c) => c.iso === json.country)
); );
}, },
refetchOnMount: true, refetchOnMount: true,
@ -51,8 +48,8 @@ export function PeerCountryCell({ address, onPinAdd }: Props) {
useEffect(() => { useEffect(() => {
if (data) { if (data) {
onPinAdd({ onPinAdd({
lat: parseFloat(data.lat), lat: data.latitude,
lng: parseFloat(data.lng), lng: data.longitude,
}); });
} }
}, [data]); }, [data]);
@ -62,8 +59,8 @@ export function PeerCountryCell({ address, onPinAdd }: Props) {
<div className="peerCountry"> <div className="peerCountry">
{data ? ( {data ? (
<> <>
<span> {!!data && getFlagEmoji(data.iso)}</span> <span> {!!data && getFlagEmoji(data.country_iso)}</span>
<span>{data?.name}</span> <span>{data?.country}</span>
</> </>
) : ( ) : (
<span>{address}</span> <span>{address}</span>

File diff suppressed because it is too large Load Diff

View File

@ -7,7 +7,6 @@ import {
UploadResponse, UploadResponse,
} from "@codex-storage/sdk-js"; } from "@codex-storage/sdk-js";
import { CodexSdk as Sdk } from "./sdk/codex"; import { CodexSdk as Sdk } from "./sdk/codex";
import { WebStorage } from "./utils/web-storage";
import { FilesStorage } from "./utils/file-storage"; import { FilesStorage } from "./utils/file-storage";
import { PurchaseStorage } from "./utils/purchases-storage"; import { PurchaseStorage } from "./utils/purchases-storage";
@ -16,15 +15,58 @@ class CodexDataMock extends CodexData {
file: File, file: File,
onProgress?: (loaded: number, total: number) => void onProgress?: (loaded: number, total: number) => void
): UploadResponse { ): UploadResponse {
// const url = CodexSdk.url() + "/api/codex/v1/data";
// const xhr = new XMLHttpRequest();
// const promise = new Promise<SafeValue<string>>((resolve) => {
// xhr.upload.onprogress = (evt) => {
// if (evt.lengthComputable) {
// onProgress?.(evt.loaded, evt.total);
// }
// };
// xhr.open("POST", url, true);
// xhr.setRequestHeader("Content-Disposition", "attachment; filename=\"" + file.name + "\"")
// xhr.send(file);
// xhr.onload = function () {
// if (xhr.status != 200) {
// resolve({
// error: true,
// data: new CodexError(xhr.responseText, {
// code: xhr.status,
// }),
// });
// } else {
// resolve({ error: false, data: xhr.response });
// }
// };
// xhr.onerror = function () {
// resolve({
// error: true,
// data: new CodexError("Something went wrong during the file upload."),
// });
// };
// });
// return {
// result: promise,
// abort: () => {
// xhr.abort();
// },
// };
const { result, abort } = super.upload(file, onProgress); const { result, abort } = super.upload(file, onProgress);
return { return {
abort, abort,
result: result.then((safe) => { result: result.then((safe) => {
if (!safe.error) { if (!safe.error) {
return WebStorage.set(safe.data, { return FilesStorage.set(safe.data, {
type: file.type, mimetype: file.type,
name: file.name, name: file.name,
uploadedAt: new Date().toJSON(),
}).then(() => safe); }).then(() => safe);
} }