From ba32b24b83d2539e0205d18a9b7d66d19d5880d3 Mon Sep 17 00:00:00 2001 From: Kamyab Nazari Date: Sat, 27 May 2023 17:41:16 +0200 Subject: [PATCH 01/13] Fixing icon colors --- .../src/lib/components/ActionCards.svelte | 4 ++-- frontend/src/lib/components/FileTable.svelte | 2 +- frontend/src/lib/components/Navbar.svelte | 6 ++--- frontend/src/lib/components/Stats.svelte | 22 +++++++++++++------ 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/frontend/src/lib/components/ActionCards.svelte b/frontend/src/lib/components/ActionCards.svelte index b916805..3669cba 100644 --- a/frontend/src/lib/components/ActionCards.svelte +++ b/frontend/src/lib/components/ActionCards.svelte @@ -10,7 +10,7 @@
@@ -24,7 +24,7 @@
diff --git a/frontend/src/lib/components/FileTable.svelte b/frontend/src/lib/components/FileTable.svelte index 1e34955..314d724 100644 --- a/frontend/src/lib/components/FileTable.svelte +++ b/frontend/src/lib/components/FileTable.svelte @@ -28,7 +28,7 @@
- +
file-23.pdf
diff --git a/frontend/src/lib/components/Navbar.svelte b/frontend/src/lib/components/Navbar.svelte index 185371f..8b21c71 100644 --- a/frontend/src/lib/components/Navbar.svelte +++ b/frontend/src/lib/components/Navbar.svelte @@ -40,7 +40,7 @@ diff --git a/frontend/src/lib/components/Stats.svelte b/frontend/src/lib/components/Stats.svelte index e9eef3c..5f5d7ec 100644 --- a/frontend/src/lib/components/Stats.svelte +++ b/frontend/src/lib/components/Stats.svelte @@ -9,35 +9,43 @@
-
+
+ +
Uploaded files
118
Jan 1st - Dec 1st
-
+
+ +
Created files
24
- + 12 (22%)
-
+
+ +
Total pages
459
- + 52 (5%)
-
+
+ +
Total words
24K
- + 2K (10%)
From a38f299d233243b2ccd111df07ca2df5c92da32d Mon Sep 17 00:00:00 2001 From: Kamyab Nazari Date: Sat, 27 May 2023 20:09:57 +0200 Subject: [PATCH 02/13] Adding profile functions and avatar changes --- frontend/src/lib/components/Navbar.svelte | 9 ++- frontend/src/lib/utils.ts | 30 ++++---- .../src/routes/(auth)/profile/+page.server.ts | 25 +++--- .../src/routes/(auth)/profile/+page.svelte | 71 +++++++++++++++--- frontend/static/example-avatar-image.jpeg | Bin 91291 -> 0 bytes 5 files changed, 97 insertions(+), 38 deletions(-) delete mode 100755 frontend/static/example-avatar-image.jpeg diff --git a/frontend/src/lib/components/Navbar.svelte b/frontend/src/lib/components/Navbar.svelte index 8b21c71..7c998eb 100644 --- a/frontend/src/lib/components/Navbar.svelte +++ b/frontend/src/lib/components/Navbar.svelte @@ -6,6 +6,7 @@ import IconSun from '~icons/solar/sun-2-outline'; import { onMount, onDestroy } from 'svelte'; import { get, writable } from 'svelte/store'; + import { getImageURL } from '$lib/utils'; const theme = writable('lofi'); @@ -54,7 +55,13 @@ diff --git a/frontend/src/lib/utils.ts b/frontend/src/lib/utils.ts index fa73d2c..a8b8950 100644 --- a/frontend/src/lib/utils.ts +++ b/frontend/src/lib/utils.ts @@ -1,20 +1,16 @@ -/* -export const validateData = async (formData, schema) => { - const body = Object.fromEntries(formData); +export function showPreview(event: Event) { + const inputElement = event.target as HTMLInputElement; + const files = inputElement.files; + if (files?.length) { + const src = URL.createObjectURL(files[0]); + const previewProfile = document.getElementById('avatar-preview-profile') as HTMLImageElement; + const previewNavbar = document.getElementById('avatar-preview-navbar') as HTMLImageElement; - try { - const data = schema.parse(body); - return { - formData: data, - errors: null - }; - } catch (err) { - console.log(err); - const errors = err.flatten(); - return { - formData: body, - errors - }; + previewProfile.src = src; + previewNavbar.src = src; } +} + +export const getImageURL = (collectionId, recordId, fileName, size = '0x0') => { + return `http://localhost:8090/api/files/${collectionId}/${recordId}/${fileName}?thumb=${size}`; }; -*/ diff --git a/frontend/src/routes/(auth)/profile/+page.server.ts b/frontend/src/routes/(auth)/profile/+page.server.ts index b7dfe90..1cd9618 100644 --- a/frontend/src/routes/(auth)/profile/+page.server.ts +++ b/frontend/src/routes/(auth)/profile/+page.server.ts @@ -1,22 +1,29 @@ -import { redirect } from '@sveltejs/kit'; +import { error, redirect } from '@sveltejs/kit'; import type { PageServerLoad } from './$types'; import type { Actions } from './$types'; export const actions: Actions = { - default: async ({ locals, request }) => { - const data = Object.fromEntries(await request.formData()) as { - name: string; - email: string; - }; + updateProfile: async ({ locals, request }) => { + let data = await request.formData(); + const userAvatar = data.get('avatar'); + + if (userAvatar instanceof Blob && userAvatar.size === 0) { + data.delete('avatar'); + } try { - await locals.pb.collection('users').update(locals.user.id, data); + const { name, avatar } = await locals.pb.collection('users').update(locals?.user?.id, data); + + locals.user.name = name; + locals.user.avatar = avatar; } catch (err) { console.error(err); - throw err; + throw error(400, 'Something went wrong updating your profile'); } - throw redirect(303, '/dashboard'); + return { + success: true + }; } }; diff --git a/frontend/src/routes/(auth)/profile/+page.svelte b/frontend/src/routes/(auth)/profile/+page.svelte index 36fa264..8834e04 100644 --- a/frontend/src/routes/(auth)/profile/+page.svelte +++ b/frontend/src/routes/(auth)/profile/+page.svelte @@ -1,19 +1,38 @@
{ - return async ({ result }) => { - pb.authStore.loadFromCookie(document.cookie); - await applyAction(result); - }; - }} + enctype="multipart/form-data" + use:enhance={submitUpdateProfle} >
@@ -21,9 +40,39 @@

Profile

-
-
- Example Avatar +
+ + +
+
+ user avatar +
@@ -34,7 +83,6 @@

Username

{/if}
-
@@ -81,7 +130,7 @@
- +
diff --git a/frontend/static/example-avatar-image.jpeg b/frontend/static/example-avatar-image.jpeg deleted file mode 100755 index e4cd01501e28b0f6bfb392e6268649a17f20efe2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91291 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 Date: Sun, 28 May 2023 12:50:46 +0200 Subject: [PATCH 03/13] Adding upload functonality --- .../src/routes/(auth)/profile/+page.server.ts | 4 +- .../dashboard/file-create/+page.server.ts | 8 ++ .../dashboard/file-read/+page.server.ts | 27 ++++++ .../routes/dashboard/file-read/+page.svelte | 88 +++++++++++++------ .../file-read/preview/+page.server.ts | 23 +++++ .../dashboard/file-read/preview/+page.svelte | 42 +++++++++ 6 files changed, 164 insertions(+), 28 deletions(-) create mode 100644 frontend/src/routes/dashboard/file-create/+page.server.ts create mode 100644 frontend/src/routes/dashboard/file-read/+page.server.ts create mode 100644 frontend/src/routes/dashboard/file-read/preview/+page.server.ts create mode 100644 frontend/src/routes/dashboard/file-read/preview/+page.svelte diff --git a/frontend/src/routes/(auth)/profile/+page.server.ts b/frontend/src/routes/(auth)/profile/+page.server.ts index 1cd9618..276ba62 100644 --- a/frontend/src/routes/(auth)/profile/+page.server.ts +++ b/frontend/src/routes/(auth)/profile/+page.server.ts @@ -21,9 +21,7 @@ export const actions: Actions = { throw error(400, 'Something went wrong updating your profile'); } - return { - success: true - }; + throw redirect(303, '/dashboard'); } }; diff --git a/frontend/src/routes/dashboard/file-create/+page.server.ts b/frontend/src/routes/dashboard/file-create/+page.server.ts new file mode 100644 index 0000000..66def6d --- /dev/null +++ b/frontend/src/routes/dashboard/file-create/+page.server.ts @@ -0,0 +1,8 @@ +import { redirect } from '@sveltejs/kit'; +import type { PageServerLoad } from './$types'; + +export const load: PageServerLoad = async ({ locals }) => { + if (!locals.user) { + throw redirect(303, '/login'); + } +}; diff --git a/frontend/src/routes/dashboard/file-read/+page.server.ts b/frontend/src/routes/dashboard/file-read/+page.server.ts new file mode 100644 index 0000000..edc54d7 --- /dev/null +++ b/frontend/src/routes/dashboard/file-read/+page.server.ts @@ -0,0 +1,27 @@ +import { goto } from '$app/navigation'; +import type { Actions } from './$types'; +import { error, redirect } from '@sveltejs/kit'; + +export const actions: Actions = { + uploadDocument: async ({ locals, request }) => { + const data = await request.formData(); + data.set('owner', locals.user.id); + const userDocument = data.get('document'); + + if (userDocument instanceof Blob && userDocument.size === 0) { + throw error(400, 'Please upload a file'); + } + + try { + const { document } = await locals.pb.collection('stored_documents').create(data); + + const previewDocument = document; + console.log(previewDocument); + } catch (err) { + console.error(err); + throw error(400, 'Something went wrong uploading your document'); + } + + throw redirect(303, '/dashboard/file-read/preview'); + } +}; diff --git a/frontend/src/routes/dashboard/file-read/+page.svelte b/frontend/src/routes/dashboard/file-read/+page.svelte index 11230a6..d03ec69 100644 --- a/frontend/src/routes/dashboard/file-read/+page.svelte +++ b/frontend/src/routes/dashboard/file-read/+page.svelte @@ -1,36 +1,74 @@ + +

-
-
-

Read a new file

-
-
-
-
    -
  • Upload
  • -
  • Preview
  • -
  • Done
  • -
+ +
+
+

Read a new file

-
-
-
- - +
+
+
    +
  • Upload
  • +
  • Preview
  • +
  • Done
  • +
+
-
-
-
- +
+
+ + +
-
- +
+
+ +
+
+ +
-
+
diff --git a/frontend/src/routes/dashboard/file-read/preview/+page.server.ts b/frontend/src/routes/dashboard/file-read/preview/+page.server.ts new file mode 100644 index 0000000..2a3420c --- /dev/null +++ b/frontend/src/routes/dashboard/file-read/preview/+page.server.ts @@ -0,0 +1,23 @@ +import type { Actions } from './$types'; +import { error, redirect } from '@sveltejs/kit'; + +export const actions: Actions = { + uploadDocument: async ({ locals, request }) => { + const data = await request.formData(); + data.set('owner', locals.user.id); + const userDocument = data.get('documents'); + + if (userDocument instanceof Blob && userDocument.size === 0) { + data.delete('documents'); + } + + try { + await locals.pb.collection('stored_documents').create(data); + } catch (err) { + console.error(err); + throw error(400, 'Something went wrong uploading your document'); + } + + throw redirect(303, '/dashboard/file-read'); + } +}; diff --git a/frontend/src/routes/dashboard/file-read/preview/+page.svelte b/frontend/src/routes/dashboard/file-read/preview/+page.svelte new file mode 100644 index 0000000..a50ed06 --- /dev/null +++ b/frontend/src/routes/dashboard/file-read/preview/+page.svelte @@ -0,0 +1,42 @@ + + +
+
+
+
+
+
+

Read a new file

+
+
+
+
    +
  • Upload
  • +
  • Preview
  • +
  • Done
  • +
+
+
+
+

Preview your file!

+
+
+
+ +
+
+ +
+
+
+
+
+
+
From 172d89d7108b01bc9130e8133e7467f6283c5dc2 Mon Sep 17 00:00:00 2001 From: Kamyab Nazari Date: Sun, 28 May 2023 13:40:18 +0200 Subject: [PATCH 04/13] Editing texts and adding protected routes --- frontend/src/lib/utils.ts | 4 +++ .../dashboard/file-read/+page.server.ts | 8 +++++- .../routes/dashboard/file-read/+page.svelte | 4 +-- .../file-read/preview/+page.server.ts | 25 ++++--------------- 4 files changed, 18 insertions(+), 23 deletions(-) diff --git a/frontend/src/lib/utils.ts b/frontend/src/lib/utils.ts index a8b8950..c544a6d 100644 --- a/frontend/src/lib/utils.ts +++ b/frontend/src/lib/utils.ts @@ -14,3 +14,7 @@ export function showPreview(event: Event) { export const getImageURL = (collectionId, recordId, fileName, size = '0x0') => { return `http://localhost:8090/api/files/${collectionId}/${recordId}/${fileName}?thumb=${size}`; }; + +export const getDocumentURL = (collectionId, recordId, fileName, size = '0x0') => { + return `http://localhost:8090/api/files/${collectionId}/${recordId}/${fileName}?thumb=${size}`; +}; diff --git a/frontend/src/routes/dashboard/file-read/+page.server.ts b/frontend/src/routes/dashboard/file-read/+page.server.ts index edc54d7..e715fd8 100644 --- a/frontend/src/routes/dashboard/file-read/+page.server.ts +++ b/frontend/src/routes/dashboard/file-read/+page.server.ts @@ -1,6 +1,6 @@ -import { goto } from '$app/navigation'; import type { Actions } from './$types'; import { error, redirect } from '@sveltejs/kit'; +import type { PageServerLoad } from './$types'; export const actions: Actions = { uploadDocument: async ({ locals, request }) => { @@ -25,3 +25,9 @@ export const actions: Actions = { throw redirect(303, '/dashboard/file-read/preview'); } }; + +export const load: PageServerLoad = async ({ locals }) => { + if (!locals.user) { + throw redirect(303, '/login'); + } +}; diff --git a/frontend/src/routes/dashboard/file-read/+page.svelte b/frontend/src/routes/dashboard/file-read/+page.svelte index d03ec69..3bfd4c8 100644 --- a/frontend/src/routes/dashboard/file-read/+page.svelte +++ b/frontend/src/routes/dashboard/file-read/+page.svelte @@ -37,9 +37,9 @@
    -
  • Upload
  • +
  • Select
  • Preview
  • -
  • Done
  • +
  • Upload
diff --git a/frontend/src/routes/dashboard/file-read/preview/+page.server.ts b/frontend/src/routes/dashboard/file-read/preview/+page.server.ts index 2a3420c..66def6d 100644 --- a/frontend/src/routes/dashboard/file-read/preview/+page.server.ts +++ b/frontend/src/routes/dashboard/file-read/preview/+page.server.ts @@ -1,23 +1,8 @@ -import type { Actions } from './$types'; -import { error, redirect } from '@sveltejs/kit'; +import { redirect } from '@sveltejs/kit'; +import type { PageServerLoad } from './$types'; -export const actions: Actions = { - uploadDocument: async ({ locals, request }) => { - const data = await request.formData(); - data.set('owner', locals.user.id); - const userDocument = data.get('documents'); - - if (userDocument instanceof Blob && userDocument.size === 0) { - data.delete('documents'); - } - - try { - await locals.pb.collection('stored_documents').create(data); - } catch (err) { - console.error(err); - throw error(400, 'Something went wrong uploading your document'); - } - - throw redirect(303, '/dashboard/file-read'); +export const load: PageServerLoad = async ({ locals }) => { + if (!locals.user) { + throw redirect(303, '/login'); } }; From 751e7819c110349ff4f629cae3ff151ea5d3a0bc Mon Sep 17 00:00:00 2001 From: Kamyab Nazari Date: Sun, 28 May 2023 15:49:53 +0200 Subject: [PATCH 05/13] Adding PDFViewer component --- frontend/package-lock.json | 530 +++++++++++++++++- frontend/package.json | 1 + frontend/src/lib/components/PDFViewer.svelte | 37 ++ .../routes/dashboard/file-create/+page.svelte | 2 +- .../dashboard/file-read/preview/+page.svelte | 11 +- 5 files changed, 566 insertions(+), 15 deletions(-) create mode 100644 frontend/src/lib/components/PDFViewer.svelte diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 8fe3a3d..65ccef6 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -9,6 +9,7 @@ "version": "0.0.1", "dependencies": { "daisyui": "^2.51.6", + "pdfjs-dist": "^3.6.172", "pocketbase": "^0.15.0", "zod": "^3.21.4" }, @@ -590,6 +591,26 @@ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", + "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1221,6 +1242,12 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "optional": true + }, "node_modules/acorn": { "version": "8.8.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", @@ -1251,6 +1278,18 @@ "node": ">=0.4.0" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "optional": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -1271,7 +1310,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, + "devOptional": true, "engines": { "node": ">=8" } @@ -1308,6 +1347,25 @@ "node": ">= 8" } }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "optional": true + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "optional": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -1513,6 +1571,21 @@ } ] }, + "node_modules/canvas": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz", + "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.0", + "nan": "^2.17.0", + "simple-get": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/chai": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", @@ -1593,6 +1666,15 @@ "node": ">= 6" } }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "optional": true, + "engines": { + "node": ">=10" + } + }, "node_modules/color": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", @@ -1630,6 +1712,15 @@ "simple-swizzle": "^0.2.2" } }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "optional": true, + "bin": { + "color-support": "bin.js" + } + }, "node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -1668,6 +1759,12 @@ "node": ">=10.18.0 <11 || >=12.14.0 <13 || >=14" } }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "optional": true + }, "node_modules/cookie": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", @@ -1746,7 +1843,7 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, + "devOptional": true, "dependencies": { "ms": "2.1.2" }, @@ -1759,6 +1856,18 @@ } } }, + "node_modules/decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "optional": true, + "dependencies": { + "mimic-response": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/deep-eql": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", @@ -1786,6 +1895,12 @@ "node": ">=0.10.0" } }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "optional": true + }, "node_modules/detect-indent": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", @@ -1795,6 +1910,15 @@ "node": ">=8" } }, + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/devalue": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.0.tgz", @@ -1840,6 +1964,12 @@ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.394.tgz", "integrity": "sha512-0IbC2cfr8w5LxTz+nmn2cJTGafsK9iauV2r5A5scfzyovqLrxuLoxOHE5OBobP3oVIggJT+0JfKnw9sm87c8Hw==" }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "optional": true + }, "node_modules/es6-promise": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", @@ -2299,6 +2429,30 @@ "url": "https://www.patreon.com/infusion" } }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2322,6 +2476,26 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "optional": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/get-func-name": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", @@ -2347,7 +2521,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, + "devOptional": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -2453,6 +2627,25 @@ "node": ">=8" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "optional": true + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "optional": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -2560,6 +2753,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -2789,7 +2991,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, + "devOptional": true, "dependencies": { "yallist": "^4.0.0" }, @@ -2809,6 +3011,30 @@ "node": ">=12" } }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "optional": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "optional": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/md5-hex": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-3.0.1.tgz", @@ -2868,6 +3094,18 @@ "node": ">=6" } }, + "node_modules/mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "optional": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -2906,6 +3144,40 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "optional": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -2952,7 +3224,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "devOptional": true }, "node_modules/mz": { "version": "2.7.0", @@ -2964,6 +3236,12 @@ "thenify-all": "^1.0.0" } }, + "node_modules/nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", + "optional": true + }, "node_modules/nanoid": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", @@ -2993,11 +3271,46 @@ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", "dev": true }, + "node_modules/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "optional": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/node-releases": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "optional": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -3026,6 +3339,18 @@ "node": ">=8" } }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "optional": true, + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -3164,6 +3489,14 @@ "node": ">=8" } }, + "node_modules/path2d-polyfill": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path2d-polyfill/-/path2d-polyfill-2.0.1.tgz", + "integrity": "sha512-ad/3bsalbbWhmBo0D6FZ4RNMwsLsPpL6gnvhuSaU5Vm7b06Kr5ubSltQQ0T7YKsiJQO+g22zJ4dJKNTXIyOXtA==", + "engines": { + "node": ">=8" + } + }, "node_modules/pathe": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.0.tgz", @@ -3179,6 +3512,21 @@ "node": "*" } }, + "node_modules/pdfjs-dist": { + "version": "3.6.172", + "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-3.6.172.tgz", + "integrity": "sha512-bfOhCg+S9DXh/ImWhWYTOiq3aVMFSCvzGiBzsIJtdMC71kVWDBw7UXr32xh0y56qc5wMVylIeqV3hBaRsu+e+w==", + "dependencies": { + "path2d-polyfill": "^2.0.1", + "web-streams-polyfill": "^3.2.1" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "canvas": "^2.11.2" + } + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -3540,6 +3888,20 @@ "pify": "^2.3.0" } }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -3589,7 +3951,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, + "devOptional": true, "dependencies": { "glob": "^7.1.3" }, @@ -3650,6 +4012,26 @@ "node": ">=6" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true + }, "node_modules/sander": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", @@ -3678,7 +4060,7 @@ "version": "7.5.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", - "dev": true, + "devOptional": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -3689,6 +4071,12 @@ "node": ">=10" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "optional": true + }, "node_modules/set-cookie-parser": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", @@ -3726,7 +4114,38 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "devOptional": true + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true + }, + "node_modules/simple-get": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", + "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", + "optional": true, + "dependencies": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } }, "node_modules/simple-swizzle": { "version": "0.2.2", @@ -3803,11 +4222,34 @@ "node": ">=10.0.0" } }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "optional": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "optional": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, + "devOptional": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -4163,6 +4605,35 @@ "node": ">= 14" } }, + "node_modules/tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "optional": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "optional": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -4251,6 +4722,12 @@ "node": ">=6" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "optional": true + }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", @@ -4603,6 +5080,20 @@ } } }, + "node_modules/web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "optional": true + }, "node_modules/webpack-sources": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", @@ -4627,6 +5118,16 @@ "node": ">=6" } }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "optional": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -4658,6 +5159,15 @@ "node": ">=8" } }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "optional": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -4676,7 +5186,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "devOptional": true }, "node_modules/yaml": { "version": "1.10.2", diff --git a/frontend/package.json b/frontend/package.json index c637e3a..cda2eae 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -39,6 +39,7 @@ "type": "module", "dependencies": { "daisyui": "^2.51.6", + "pdfjs-dist": "^3.6.172", "pocketbase": "^0.15.0", "zod": "^3.21.4" } diff --git a/frontend/src/lib/components/PDFViewer.svelte b/frontend/src/lib/components/PDFViewer.svelte new file mode 100644 index 0000000..26edc13 --- /dev/null +++ b/frontend/src/lib/components/PDFViewer.svelte @@ -0,0 +1,37 @@ + + + diff --git a/frontend/src/routes/dashboard/file-create/+page.svelte b/frontend/src/routes/dashboard/file-create/+page.svelte index ecdb3ff..258cfb5 100644 --- a/frontend/src/routes/dashboard/file-create/+page.svelte +++ b/frontend/src/routes/dashboard/file-create/+page.svelte @@ -30,7 +30,7 @@
diff --git a/frontend/src/routes/dashboard/file-read/preview/+page.svelte b/frontend/src/routes/dashboard/file-read/preview/+page.svelte index a50ed06..6cf3571 100644 --- a/frontend/src/routes/dashboard/file-read/preview/+page.svelte +++ b/frontend/src/routes/dashboard/file-read/preview/+page.svelte @@ -1,6 +1,6 @@ - From e874b03cc18f828238b06e1d764b0366edd03908 Mon Sep 17 00:00:00 2001 From: Kamyab Nazari Date: Sun, 28 May 2023 17:35:47 +0200 Subject: [PATCH 08/13] Fixing pdf buttons --- frontend/src/lib/components/PDFViewer.svelte | 29 ++++++++++++++----- .../routes/dashboard/file-read/+page.svelte | 2 +- .../dashboard/file-read/preview/+page.svelte | 5 +--- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/frontend/src/lib/components/PDFViewer.svelte b/frontend/src/lib/components/PDFViewer.svelte index 75cc0e4..9d86e0a 100644 --- a/frontend/src/lib/components/PDFViewer.svelte +++ b/frontend/src/lib/components/PDFViewer.svelte @@ -2,6 +2,11 @@ import { onMount } from 'svelte'; import { GlobalWorkerOptions, getDocument, type PDFDocumentProxy } from 'pdfjs-dist'; + import IconDownload from '~icons/solar/download-square-outline'; + import IconPrint from '~icons/solar/printer-outline'; + import IconLeftArrow from '~icons/solar/square-arrow-left-outline'; + import IconRightArrow from '~icons/solar/square-arrow-right-outline'; + let pdf: PDFDocumentProxy | null = null; let currentPageNumber = 1; let canvas: HTMLCanvasElement; @@ -58,17 +63,25 @@ pdf = await loadingTask.promise; await loadPage(currentPageNumber); - }); + }); -
-
- - - - +
+
+ + + +
- +
diff --git a/frontend/src/routes/dashboard/file-read/+page.svelte b/frontend/src/routes/dashboard/file-read/+page.svelte index b7dab3f..8987560 100644 --- a/frontend/src/routes/dashboard/file-read/+page.svelte +++ b/frontend/src/routes/dashboard/file-read/+page.svelte @@ -39,7 +39,7 @@
  • Select
  • Preview
  • -
  • Upload
  • +
  • Read
diff --git a/frontend/src/routes/dashboard/file-read/preview/+page.svelte b/frontend/src/routes/dashboard/file-read/preview/+page.svelte index 6cf3571..f48f4db 100644 --- a/frontend/src/routes/dashboard/file-read/preview/+page.svelte +++ b/frontend/src/routes/dashboard/file-read/preview/+page.svelte @@ -25,9 +25,6 @@
-

Preview your file!

-
-
@@ -35,7 +32,7 @@
- +
From 9e5ad1982caaf43d1f29ec36c4696bac9481633f Mon Sep 17 00:00:00 2001 From: Kamyab Nazari Date: Sun, 28 May 2023 18:00:39 +0200 Subject: [PATCH 09/13] Adding new pages for read and upload done --- .../src/lib/components/ActionCards.svelte | 4 +- .../dashboard/file-read/+page.server.ts | 27 +----- .../routes/dashboard/file-read/+page.svelte | 87 +++++-------------- .../dashboard/file-upload/+page.server.ts | 33 +++++++ .../routes/dashboard/file-upload/+page.svelte | 74 ++++++++++++++++ .../done}/+page.server.ts | 0 .../dashboard/file-upload/done/+page.svelte | 40 +++++++++ .../file-upload/preview/+page.server.ts | 8 ++ .../preview/+page.svelte | 16 ++-- 9 files changed, 190 insertions(+), 99 deletions(-) create mode 100644 frontend/src/routes/dashboard/file-upload/+page.server.ts create mode 100644 frontend/src/routes/dashboard/file-upload/+page.svelte rename frontend/src/routes/dashboard/{file-read/preview => file-upload/done}/+page.server.ts (100%) create mode 100644 frontend/src/routes/dashboard/file-upload/done/+page.svelte create mode 100644 frontend/src/routes/dashboard/file-upload/preview/+page.server.ts rename frontend/src/routes/dashboard/{file-read => file-upload}/preview/+page.svelte (69%) diff --git a/frontend/src/lib/components/ActionCards.svelte b/frontend/src/lib/components/ActionCards.svelte index 3669cba..120e516 100644 --- a/frontend/src/lib/components/ActionCards.svelte +++ b/frontend/src/lib/components/ActionCards.svelte @@ -8,10 +8,10 @@

Read a new file

Upload a new file and ask it your questions!

diff --git a/frontend/src/routes/dashboard/file-read/+page.server.ts b/frontend/src/routes/dashboard/file-read/+page.server.ts index e715fd8..66def6d 100644 --- a/frontend/src/routes/dashboard/file-read/+page.server.ts +++ b/frontend/src/routes/dashboard/file-read/+page.server.ts @@ -1,31 +1,6 @@ -import type { Actions } from './$types'; -import { error, redirect } from '@sveltejs/kit'; +import { redirect } from '@sveltejs/kit'; import type { PageServerLoad } from './$types'; -export const actions: Actions = { - uploadDocument: async ({ locals, request }) => { - const data = await request.formData(); - data.set('owner', locals.user.id); - const userDocument = data.get('document'); - - if (userDocument instanceof Blob && userDocument.size === 0) { - throw error(400, 'Please upload a file'); - } - - try { - const { document } = await locals.pb.collection('stored_documents').create(data); - - const previewDocument = document; - console.log(previewDocument); - } catch (err) { - console.error(err); - throw error(400, 'Something went wrong uploading your document'); - } - - throw redirect(303, '/dashboard/file-read/preview'); - } -}; - export const load: PageServerLoad = async ({ locals }) => { if (!locals.user) { throw redirect(303, '/login'); diff --git a/frontend/src/routes/dashboard/file-read/+page.svelte b/frontend/src/routes/dashboard/file-read/+page.svelte index 8987560..9cb55a8 100644 --- a/frontend/src/routes/dashboard/file-read/+page.svelte +++ b/frontend/src/routes/dashboard/file-read/+page.svelte @@ -1,74 +1,29 @@ -
-
-
-
-
-
-

Read a new file

-
-
-
-
    -
  • Select
  • -
  • Preview
  • -
  • Read
  • -
-
-
-
-
- - -
-
-
-
- -
-
- -
-
-
-
+
+
+

Ask your document anything

+
+
+ +
+

chat

+
+
+
+
+
diff --git a/frontend/src/routes/dashboard/file-upload/+page.server.ts b/frontend/src/routes/dashboard/file-upload/+page.server.ts new file mode 100644 index 0000000..4423cfa --- /dev/null +++ b/frontend/src/routes/dashboard/file-upload/+page.server.ts @@ -0,0 +1,33 @@ +import type { Actions } from './$types'; +import { error, redirect } from '@sveltejs/kit'; +import type { PageServerLoad } from './$types'; + +export const actions: Actions = { + uploadDocument: async ({ locals, request }) => { + const data = await request.formData(); + data.set('owner', locals.user.id); + const userDocument = data.get('document'); + + if (userDocument instanceof Blob && userDocument.size === 0) { + throw error(400, 'Please upload a file'); + } + + try { + const { document } = await locals.pb.collection('stored_documents').create(data); + + const previewDocument = document; + console.log(previewDocument); + } catch (err) { + console.error(err); + throw error(400, 'Something went wrong uploading your document'); + } + + throw redirect(303, '/dashboard/file-upload/preview'); + } +}; + +export const load: PageServerLoad = async ({ locals }) => { + if (!locals.user) { + throw redirect(303, '/login'); + } +}; diff --git a/frontend/src/routes/dashboard/file-upload/+page.svelte b/frontend/src/routes/dashboard/file-upload/+page.svelte new file mode 100644 index 0000000..9a53888 --- /dev/null +++ b/frontend/src/routes/dashboard/file-upload/+page.svelte @@ -0,0 +1,74 @@ + + +
+
+
+
+
+
+

Upload a new file

+
+
+
+
    +
  • Select
  • +
  • Preview
  • +
  • Done
  • +
+
+
+
+
+ + +
+
+
+
+ +
+
+ +
+
+
+
+
+
+
diff --git a/frontend/src/routes/dashboard/file-read/preview/+page.server.ts b/frontend/src/routes/dashboard/file-upload/done/+page.server.ts similarity index 100% rename from frontend/src/routes/dashboard/file-read/preview/+page.server.ts rename to frontend/src/routes/dashboard/file-upload/done/+page.server.ts diff --git a/frontend/src/routes/dashboard/file-upload/done/+page.svelte b/frontend/src/routes/dashboard/file-upload/done/+page.svelte new file mode 100644 index 0000000..3260400 --- /dev/null +++ b/frontend/src/routes/dashboard/file-upload/done/+page.svelte @@ -0,0 +1,40 @@ + + +
+
+
+
+
+
+

Upload a new file

+
+
+
+
    +
  • Select
  • +
  • Preview
  • +
  • Done
  • +
+
+
+
+

You have uploaded a file for reading!

+
+
+
+ +
+
+
+
+
+
+
diff --git a/frontend/src/routes/dashboard/file-upload/preview/+page.server.ts b/frontend/src/routes/dashboard/file-upload/preview/+page.server.ts new file mode 100644 index 0000000..66def6d --- /dev/null +++ b/frontend/src/routes/dashboard/file-upload/preview/+page.server.ts @@ -0,0 +1,8 @@ +import { redirect } from '@sveltejs/kit'; +import type { PageServerLoad } from './$types'; + +export const load: PageServerLoad = async ({ locals }) => { + if (!locals.user) { + throw redirect(303, '/login'); + } +}; diff --git a/frontend/src/routes/dashboard/file-read/preview/+page.svelte b/frontend/src/routes/dashboard/file-upload/preview/+page.svelte similarity index 69% rename from frontend/src/routes/dashboard/file-read/preview/+page.svelte rename to frontend/src/routes/dashboard/file-upload/preview/+page.svelte index f48f4db..822ac1a 100644 --- a/frontend/src/routes/dashboard/file-read/preview/+page.svelte +++ b/frontend/src/routes/dashboard/file-upload/preview/+page.svelte @@ -3,7 +3,11 @@ import PdfViewer from '$lib/components/PDFViewer.svelte'; function goBack() { - goto('/dashboard/file-read'); + goto('/dashboard/file-upload'); + } + + function goForward() { + goto('/dashboard/file-upload/done'); } @@ -13,14 +17,14 @@
-

Read a new file

+

Upload a new file

  • Select
  • Preview
  • -
  • Upload
  • +
  • Done
@@ -29,10 +33,12 @@
- +
- +
From ff3b8fd7c840531c03160ce7278bea8146ece70b Mon Sep 17 00:00:00 2001 From: Kamyab Nazari Date: Sun, 28 May 2023 18:57:24 +0200 Subject: [PATCH 10/13] Fixing read page layout --- frontend/src/lib/components/PDFViewer.svelte | 4 +- .../routes/dashboard/file-read/+page.svelte | 42 ++++++++++++++----- .../dashboard/file-upload/+page.server.ts | 2 +- 3 files changed, 34 insertions(+), 14 deletions(-) diff --git a/frontend/src/lib/components/PDFViewer.svelte b/frontend/src/lib/components/PDFViewer.svelte index 9d86e0a..40709ab 100644 --- a/frontend/src/lib/components/PDFViewer.svelte +++ b/frontend/src/lib/components/PDFViewer.svelte @@ -63,10 +63,10 @@ pdf = await loadingTask.promise; await loadPage(currentPageNumber); - }); + }); -
+
-
-
-

Ask your document anything

+
+
+

Read

-
- -
-

chat

+
+
+
-
-
-
- +
+
+
+