- {Icon &&
}
+
+ {Icon && }
-
{title}
+ {title}
diff --git a/apps/web/src/helpers/get-feature-flag.ts b/apps/web/src/helpers/get-feature-flag.ts
index 3b6c66528..d5cd26c33 100644
--- a/apps/web/src/helpers/get-feature-flag.ts
+++ b/apps/web/src/helpers/get-feature-flag.ts
@@ -21,7 +21,7 @@ export const getFlag = async (
return LOCAL_FEATURE_FLAGS[flag] ?? true;
}
- const url = new URL(`${process.env.NEXT_PUBLIC_SITE_URL}/api/feature-flag/get`);
+ const url = new URL(`${process.env.NEXT_PUBLIC_WEBAPP_URL}/api/feature-flag/get`);
url.searchParams.set('flag', flag);
const response = await fetch(url, {
@@ -54,7 +54,7 @@ export const getAllFlags = async (
return LOCAL_FEATURE_FLAGS;
}
- const url = new URL(`${process.env.NEXT_PUBLIC_SITE_URL}/api/feature-flag/all`);
+ const url = new URL(`${process.env.NEXT_PUBLIC_WEBAPP_URL}/api/feature-flag/all`);
return fetch(url, {
headers: {
diff --git a/apps/web/src/pages/api/claim-plan/index.ts b/apps/web/src/pages/api/claim-plan/index.ts
index abad354a8..3d2d8679b 100644
--- a/apps/web/src/pages/api/claim-plan/index.ts
+++ b/apps/web/src/pages/api/claim-plan/index.ts
@@ -43,7 +43,7 @@ export default async function handler(
if (user && user.Subscription.length > 0) {
return res.status(200).json({
- redirectUrl: `${process.env.NEXT_PUBLIC_APP_URL}/login`,
+ redirectUrl: `${process.env.NEXT_PUBLIC_WEBAPP_URL}/login`,
});
}
@@ -103,8 +103,8 @@ export default async function handler(
mode: 'subscription',
metadata,
allow_promotion_codes: true,
- success_url: `${process.env.NEXT_PUBLIC_SITE_URL}/claimed?sessionId={CHECKOUT_SESSION_ID}`,
- cancel_url: `${process.env.NEXT_PUBLIC_SITE_URL}/pricing?email=${encodeURIComponent(
+ success_url: `${process.env.NEXT_PUBLIC_MARKETING_URL}/claimed?sessionId={CHECKOUT_SESSION_ID}`,
+ cancel_url: `${process.env.NEXT_PUBLIC_MARKETING_URL}/pricing?email=${encodeURIComponent(
email,
)}&name=${encodeURIComponent(name)}&planId=${planId}&cancelled=true`,
});
diff --git a/apps/web/src/pages/api/document/create.ts b/apps/web/src/pages/api/document/create.ts
deleted file mode 100644
index b2042315f..000000000
--- a/apps/web/src/pages/api/document/create.ts
+++ /dev/null
@@ -1,88 +0,0 @@
-import { NextApiRequest, NextApiResponse } from 'next';
-
-import formidable, { type File } from 'formidable';
-import { readFileSync } from 'fs';
-
-import { getServerSession } from '@documenso/lib/next-auth/get-server-session';
-import { prisma } from '@documenso/prisma';
-import { DocumentStatus } from '@documenso/prisma/client';
-
-import {
- TCreateDocumentRequestSchema,
- TCreateDocumentResponseSchema,
-} from '~/api/document/create/types';
-
-export const config = {
- api: {
- bodyParser: false,
- },
-};
-
-export type TFormidableCreateDocumentRequestSchema = {
- file: File;
-};
-
-export default async function handler(
- req: NextApiRequest,
- res: NextApiResponse,
-) {
- const user = await getServerSession({ req, res });
-
- if (!user) {
- return res.status(401).json({
- error: 'Unauthorized',
- });
- }
-
- try {
- const form = formidable();
-
- const { file } = await new Promise(
- (resolve, reject) => {
- form.parse(req, (err, fields, files) => {
- if (err) {
- reject(err);
- }
-
- // We had intended to do this with Zod but we can only validate it
- // as a persistent file which does not include the properties that we
- // need.
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions, @typescript-eslint/no-explicit-any
- resolve({ ...fields, ...files } as any);
- });
- },
- );
-
- const fileBuffer = readFileSync(file.filepath);
-
- const document = await prisma.document.create({
- data: {
- title: file.originalFilename ?? file.newFilename,
- status: DocumentStatus.DRAFT,
- userId: user.id,
- document: fileBuffer.toString('base64'),
- created: new Date(),
- },
- });
-
- return res.status(200).json({
- id: document.id,
- });
- } catch (err) {
- console.error(err);
-
- return res.status(500).json({
- error: 'Internal server error',
- });
- }
-}
-
-/**
- * This is a hack to ensure that the types are correct.
- */
-type FormidableSatisfiesCreateDocument =
- keyof TCreateDocumentRequestSchema extends keyof TFormidableCreateDocumentRequestSchema
- ? true
- : never;
-
-true satisfies FormidableSatisfiesCreateDocument;
diff --git a/apps/web/src/pages/api/feature-flag/get.ts b/apps/web/src/pages/api/feature-flag/get.ts
index 6d5204596..6e45b5a18 100644
--- a/apps/web/src/pages/api/feature-flag/get.ts
+++ b/apps/web/src/pages/api/feature-flag/get.ts
@@ -1,9 +1,9 @@
import { NextRequest, NextResponse } from 'next/server';
-import { nanoid } from 'nanoid';
import { JWT, getToken } from 'next-auth/jwt';
import { LOCAL_FEATURE_FLAGS, extractPostHogConfig } from '@documenso/lib/constants/feature-flags';
+import { nanoid } from '@documenso/lib/universal/id';
import PostHogServerClient from '~/helpers/get-post-hog-server-client';
diff --git a/apps/web/src/pages/api/stripe/webhook/index.ts b/apps/web/src/pages/api/stripe/webhook/index.ts
index 6c678a33c..9efab2a78 100644
--- a/apps/web/src/pages/api/stripe/webhook/index.ts
+++ b/apps/web/src/pages/api/stripe/webhook/index.ts
@@ -10,6 +10,7 @@ import { redis } from '@documenso/lib/server-only/redis';
import { Stripe, stripe } from '@documenso/lib/server-only/stripe';
import { prisma } from '@documenso/prisma';
import {
+ DocumentDataType,
DocumentStatus,
FieldType,
ReadStatus,
@@ -85,16 +86,34 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
const now = new Date();
+ const bytes64 = readFileSync('./public/documenso-supporter-pledge.pdf').toString('base64');
+
+ const { id: documentDataId } = await prisma.documentData.create({
+ data: {
+ type: DocumentDataType.BYTES_64,
+ data: bytes64,
+ initialData: bytes64,
+ },
+ });
+
const document = await prisma.document.create({
data: {
title: 'Documenso Supporter Pledge.pdf',
status: DocumentStatus.COMPLETED,
userId: user.id,
- document: readFileSync('./public/documenso-supporter-pledge.pdf').toString('base64'),
- created: now,
+ documentDataId,
+ },
+ include: {
+ documentData: true,
},
});
+ const { documentData } = document;
+
+ if (!documentData) {
+ throw new Error(`Document ${document.id} has no document data`);
+ }
+
const recipient = await prisma.recipient.create({
data: {
name: user.name ?? '',
@@ -122,16 +141,16 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
});
if (signatureDataUrl) {
- document.document = await insertImageInPDF(
- document.document,
+ documentData.data = await insertImageInPDF(
+ documentData.data,
signatureDataUrl,
field.positionX.toNumber(),
field.positionY.toNumber(),
field.page,
);
} else {
- document.document = await insertTextInPDF(
- document.document,
+ documentData.data = await insertTextInPDF(
+ documentData.data,
signatureText ?? '',
field.positionX.toNumber(),
field.positionY.toNumber(),
@@ -153,7 +172,11 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
id: document.id,
},
data: {
- document: document.document,
+ documentData: {
+ update: {
+ data: documentData.data,
+ },
+ },
},
}),
]);
diff --git a/assets/example.pdf b/assets/example.pdf
new file mode 100644
index 000000000..f908d84e1
Binary files /dev/null and b/assets/example.pdf differ
diff --git a/package-lock.json b/package-lock.json
index c3f212b1f..d0f7fa771 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -82,7 +82,6 @@
"lucide-react": "^0.214.0",
"luxon": "^3.4.0",
"micro": "^10.0.1",
- "nanoid": "^4.0.2",
"next": "13.4.12",
"next-auth": "4.22.3",
"next-plausible": "^3.10.1",
@@ -133,6 +132,776 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/@aws-crypto/crc32": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz",
+ "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==",
+ "dependencies": {
+ "@aws-crypto/util": "^3.0.0",
+ "@aws-sdk/types": "^3.222.0",
+ "tslib": "^1.11.1"
+ }
+ },
+ "node_modules/@aws-crypto/crc32/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ },
+ "node_modules/@aws-crypto/crc32c": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-3.0.0.tgz",
+ "integrity": "sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w==",
+ "dependencies": {
+ "@aws-crypto/util": "^3.0.0",
+ "@aws-sdk/types": "^3.222.0",
+ "tslib": "^1.11.1"
+ }
+ },
+ "node_modules/@aws-crypto/crc32c/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ },
+ "node_modules/@aws-crypto/ie11-detection": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz",
+ "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==",
+ "dependencies": {
+ "tslib": "^1.11.1"
+ }
+ },
+ "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ },
+ "node_modules/@aws-crypto/sha1-browser": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-3.0.0.tgz",
+ "integrity": "sha512-NJth5c997GLHs6nOYTzFKTbYdMNA6/1XlKVgnZoaZcQ7z7UJlOgj2JdbHE8tiYLS3fzXNCguct77SPGat2raSw==",
+ "dependencies": {
+ "@aws-crypto/ie11-detection": "^3.0.0",
+ "@aws-crypto/supports-web-crypto": "^3.0.0",
+ "@aws-crypto/util": "^3.0.0",
+ "@aws-sdk/types": "^3.222.0",
+ "@aws-sdk/util-locate-window": "^3.0.0",
+ "@aws-sdk/util-utf8-browser": "^3.0.0",
+ "tslib": "^1.11.1"
+ }
+ },
+ "node_modules/@aws-crypto/sha1-browser/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ },
+ "node_modules/@aws-crypto/sha256-browser": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz",
+ "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==",
+ "dependencies": {
+ "@aws-crypto/ie11-detection": "^3.0.0",
+ "@aws-crypto/sha256-js": "^3.0.0",
+ "@aws-crypto/supports-web-crypto": "^3.0.0",
+ "@aws-crypto/util": "^3.0.0",
+ "@aws-sdk/types": "^3.222.0",
+ "@aws-sdk/util-locate-window": "^3.0.0",
+ "@aws-sdk/util-utf8-browser": "^3.0.0",
+ "tslib": "^1.11.1"
+ }
+ },
+ "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ },
+ "node_modules/@aws-crypto/sha256-js": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz",
+ "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==",
+ "dependencies": {
+ "@aws-crypto/util": "^3.0.0",
+ "@aws-sdk/types": "^3.222.0",
+ "tslib": "^1.11.1"
+ }
+ },
+ "node_modules/@aws-crypto/sha256-js/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ },
+ "node_modules/@aws-crypto/supports-web-crypto": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz",
+ "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==",
+ "dependencies": {
+ "tslib": "^1.11.1"
+ }
+ },
+ "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ },
+ "node_modules/@aws-crypto/util": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz",
+ "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==",
+ "dependencies": {
+ "@aws-sdk/types": "^3.222.0",
+ "@aws-sdk/util-utf8-browser": "^3.0.0",
+ "tslib": "^1.11.1"
+ }
+ },
+ "node_modules/@aws-crypto/util/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ },
+ "node_modules/@aws-sdk/client-s3": {
+ "version": "3.410.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.410.0.tgz",
+ "integrity": "sha512-9pInvFl3xgk+CnbHFZVk0wAicZUiokIGQ05e/ZDBHjiWK5ph/XeQ4CCTuh7JxT0yABNhua8/6txsyq/uNXOzoA==",
+ "dependencies": {
+ "@aws-crypto/sha1-browser": "3.0.0",
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/client-sts": "3.410.0",
+ "@aws-sdk/credential-provider-node": "3.410.0",
+ "@aws-sdk/middleware-bucket-endpoint": "3.410.0",
+ "@aws-sdk/middleware-expect-continue": "3.410.0",
+ "@aws-sdk/middleware-flexible-checksums": "3.410.0",
+ "@aws-sdk/middleware-host-header": "3.410.0",
+ "@aws-sdk/middleware-location-constraint": "3.410.0",
+ "@aws-sdk/middleware-logger": "3.410.0",
+ "@aws-sdk/middleware-recursion-detection": "3.410.0",
+ "@aws-sdk/middleware-sdk-s3": "3.410.0",
+ "@aws-sdk/middleware-signing": "3.410.0",
+ "@aws-sdk/middleware-ssec": "3.410.0",
+ "@aws-sdk/middleware-user-agent": "3.410.0",
+ "@aws-sdk/signature-v4-multi-region": "3.410.0",
+ "@aws-sdk/types": "3.410.0",
+ "@aws-sdk/util-endpoints": "3.410.0",
+ "@aws-sdk/util-user-agent-browser": "3.410.0",
+ "@aws-sdk/util-user-agent-node": "3.410.0",
+ "@aws-sdk/xml-builder": "3.310.0",
+ "@smithy/config-resolver": "^2.0.7",
+ "@smithy/eventstream-serde-browser": "^2.0.6",
+ "@smithy/eventstream-serde-config-resolver": "^2.0.6",
+ "@smithy/eventstream-serde-node": "^2.0.6",
+ "@smithy/fetch-http-handler": "^2.1.2",
+ "@smithy/hash-blob-browser": "^2.0.6",
+ "@smithy/hash-node": "^2.0.6",
+ "@smithy/hash-stream-node": "^2.0.6",
+ "@smithy/invalid-dependency": "^2.0.6",
+ "@smithy/md5-js": "^2.0.6",
+ "@smithy/middleware-content-length": "^2.0.8",
+ "@smithy/middleware-endpoint": "^2.0.6",
+ "@smithy/middleware-retry": "^2.0.9",
+ "@smithy/middleware-serde": "^2.0.6",
+ "@smithy/middleware-stack": "^2.0.0",
+ "@smithy/node-config-provider": "^2.0.9",
+ "@smithy/node-http-handler": "^2.1.2",
+ "@smithy/protocol-http": "^3.0.2",
+ "@smithy/smithy-client": "^2.1.3",
+ "@smithy/types": "^2.3.0",
+ "@smithy/url-parser": "^2.0.6",
+ "@smithy/util-base64": "^2.0.0",
+ "@smithy/util-body-length-browser": "^2.0.0",
+ "@smithy/util-body-length-node": "^2.1.0",
+ "@smithy/util-defaults-mode-browser": "^2.0.7",
+ "@smithy/util-defaults-mode-node": "^2.0.9",
+ "@smithy/util-retry": "^2.0.0",
+ "@smithy/util-stream": "^2.0.9",
+ "@smithy/util-utf8": "^2.0.0",
+ "@smithy/util-waiter": "^2.0.6",
+ "fast-xml-parser": "4.2.5",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-sso": {
+ "version": "3.410.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.410.0.tgz",
+ "integrity": "sha512-MC9GrgwtlOuSL2WS3DRM3dQ/5y+49KSMMJRH6JiEcU5vE0dX/OtEcX+VfEwpi73x5pSfIjm7xnzjzOFx+sQBIg==",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/middleware-host-header": "3.410.0",
+ "@aws-sdk/middleware-logger": "3.410.0",
+ "@aws-sdk/middleware-recursion-detection": "3.410.0",
+ "@aws-sdk/middleware-user-agent": "3.410.0",
+ "@aws-sdk/types": "3.410.0",
+ "@aws-sdk/util-endpoints": "3.410.0",
+ "@aws-sdk/util-user-agent-browser": "3.410.0",
+ "@aws-sdk/util-user-agent-node": "3.410.0",
+ "@smithy/config-resolver": "^2.0.7",
+ "@smithy/fetch-http-handler": "^2.1.2",
+ "@smithy/hash-node": "^2.0.6",
+ "@smithy/invalid-dependency": "^2.0.6",
+ "@smithy/middleware-content-length": "^2.0.8",
+ "@smithy/middleware-endpoint": "^2.0.6",
+ "@smithy/middleware-retry": "^2.0.9",
+ "@smithy/middleware-serde": "^2.0.6",
+ "@smithy/middleware-stack": "^2.0.0",
+ "@smithy/node-config-provider": "^2.0.9",
+ "@smithy/node-http-handler": "^2.1.2",
+ "@smithy/protocol-http": "^3.0.2",
+ "@smithy/smithy-client": "^2.1.3",
+ "@smithy/types": "^2.3.0",
+ "@smithy/url-parser": "^2.0.6",
+ "@smithy/util-base64": "^2.0.0",
+ "@smithy/util-body-length-browser": "^2.0.0",
+ "@smithy/util-body-length-node": "^2.1.0",
+ "@smithy/util-defaults-mode-browser": "^2.0.7",
+ "@smithy/util-defaults-mode-node": "^2.0.9",
+ "@smithy/util-retry": "^2.0.0",
+ "@smithy/util-utf8": "^2.0.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-sts": {
+ "version": "3.410.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.410.0.tgz",
+ "integrity": "sha512-e6VMrBJtnTxxUXwDmkADGIvyppmDMFf4+cGGA68tVCUm1cFNlCI6M/67bVSIPN/WVKAAfhEL5O2vVXCM7aatYg==",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/credential-provider-node": "3.410.0",
+ "@aws-sdk/middleware-host-header": "3.410.0",
+ "@aws-sdk/middleware-logger": "3.410.0",
+ "@aws-sdk/middleware-recursion-detection": "3.410.0",
+ "@aws-sdk/middleware-sdk-sts": "3.410.0",
+ "@aws-sdk/middleware-signing": "3.410.0",
+ "@aws-sdk/middleware-user-agent": "3.410.0",
+ "@aws-sdk/types": "3.410.0",
+ "@aws-sdk/util-endpoints": "3.410.0",
+ "@aws-sdk/util-user-agent-browser": "3.410.0",
+ "@aws-sdk/util-user-agent-node": "3.410.0",
+ "@smithy/config-resolver": "^2.0.7",
+ "@smithy/fetch-http-handler": "^2.1.2",
+ "@smithy/hash-node": "^2.0.6",
+ "@smithy/invalid-dependency": "^2.0.6",
+ "@smithy/middleware-content-length": "^2.0.8",
+ "@smithy/middleware-endpoint": "^2.0.6",
+ "@smithy/middleware-retry": "^2.0.9",
+ "@smithy/middleware-serde": "^2.0.6",
+ "@smithy/middleware-stack": "^2.0.0",
+ "@smithy/node-config-provider": "^2.0.9",
+ "@smithy/node-http-handler": "^2.1.2",
+ "@smithy/protocol-http": "^3.0.2",
+ "@smithy/smithy-client": "^2.1.3",
+ "@smithy/types": "^2.3.0",
+ "@smithy/url-parser": "^2.0.6",
+ "@smithy/util-base64": "^2.0.0",
+ "@smithy/util-body-length-browser": "^2.0.0",
+ "@smithy/util-body-length-node": "^2.1.0",
+ "@smithy/util-defaults-mode-browser": "^2.0.7",
+ "@smithy/util-defaults-mode-node": "^2.0.9",
+ "@smithy/util-retry": "^2.0.0",
+ "@smithy/util-utf8": "^2.0.0",
+ "fast-xml-parser": "4.2.5",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-env": {
+ "version": "3.410.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.410.0.tgz",
+ "integrity": "sha512-c7TB9LbN0PkFOsXI0lcRJnqPNOmc4VBvrHf8jP/BkTDg4YUoKQKOFd4d0SqzODmlZiAyoMQVZTR4ISZo95Zj4Q==",
+ "dependencies": {
+ "@aws-sdk/types": "3.410.0",
+ "@smithy/property-provider": "^2.0.0",
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-ini": {
+ "version": "3.410.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.410.0.tgz",
+ "integrity": "sha512-D8rcr5bRCFD0f42MPQ7K6TWZq5d3pfqrKINL1/bpfkK5BJbvq1BGYmR88UC6CLpTRtZ1LHY2HgYG0fp/2zjjww==",
+ "dependencies": {
+ "@aws-sdk/credential-provider-env": "3.410.0",
+ "@aws-sdk/credential-provider-process": "3.410.0",
+ "@aws-sdk/credential-provider-sso": "3.410.0",
+ "@aws-sdk/credential-provider-web-identity": "3.410.0",
+ "@aws-sdk/types": "3.410.0",
+ "@smithy/credential-provider-imds": "^2.0.0",
+ "@smithy/property-provider": "^2.0.0",
+ "@smithy/shared-ini-file-loader": "^2.0.6",
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-node": {
+ "version": "3.410.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.410.0.tgz",
+ "integrity": "sha512-0wmVm33T/j1FS7MZ/j+WsPlgSc0YnCXnpbWSov1Mn6R86SHI2b2JhdIPRRE4XbGfyW2QGNUl2CwoZVaqhXeF5g==",
+ "dependencies": {
+ "@aws-sdk/credential-provider-env": "3.410.0",
+ "@aws-sdk/credential-provider-ini": "3.410.0",
+ "@aws-sdk/credential-provider-process": "3.410.0",
+ "@aws-sdk/credential-provider-sso": "3.410.0",
+ "@aws-sdk/credential-provider-web-identity": "3.410.0",
+ "@aws-sdk/types": "3.410.0",
+ "@smithy/credential-provider-imds": "^2.0.0",
+ "@smithy/property-provider": "^2.0.0",
+ "@smithy/shared-ini-file-loader": "^2.0.6",
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-process": {
+ "version": "3.410.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.410.0.tgz",
+ "integrity": "sha512-BMju1hlDCDNkkSZpKF5SQ8G0WCLRj6/Jvw9QmudLHJuVwYJXEW1r2AsVMg98OZ3hB9G+MAvHruHZIbMiNmUMXQ==",
+ "dependencies": {
+ "@aws-sdk/types": "3.410.0",
+ "@smithy/property-provider": "^2.0.0",
+ "@smithy/shared-ini-file-loader": "^2.0.6",
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-sso": {
+ "version": "3.410.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.410.0.tgz",
+ "integrity": "sha512-zEaoY/sY+KYTlQUkp9dvveAHf175b8RIt0DsQkDrRPtrg/RBHR00r5rFvz9+nrwsR8546RaBU7h/zzTaQGhmcA==",
+ "dependencies": {
+ "@aws-sdk/client-sso": "3.410.0",
+ "@aws-sdk/token-providers": "3.410.0",
+ "@aws-sdk/types": "3.410.0",
+ "@smithy/property-provider": "^2.0.0",
+ "@smithy/shared-ini-file-loader": "^2.0.6",
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-web-identity": {
+ "version": "3.410.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.410.0.tgz",
+ "integrity": "sha512-cE0l8LmEHdWbDkdPNgrfdYSgp4/cIVXrjUKI1QCATA729CrHZ/OQjB/maOBOrMHO9YTiggko887NkslVvwVB7w==",
+ "dependencies": {
+ "@aws-sdk/types": "3.410.0",
+ "@smithy/property-provider": "^2.0.0",
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-bucket-endpoint": {
+ "version": "3.410.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.410.0.tgz",
+ "integrity": "sha512-pUGrpFgCKf9fDHu01JJhhw+MUImheS0HFlZwNG37OMubkxUAbCdmYGewGxfTCUvWyZJtx9bVjrSu6gG7w+RARg==",
+ "dependencies": {
+ "@aws-sdk/types": "3.410.0",
+ "@aws-sdk/util-arn-parser": "3.310.0",
+ "@smithy/node-config-provider": "^2.0.9",
+ "@smithy/protocol-http": "^3.0.2",
+ "@smithy/types": "^2.3.0",
+ "@smithy/util-config-provider": "^2.0.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-expect-continue": {
+ "version": "3.410.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.410.0.tgz",
+ "integrity": "sha512-e5YqGCNmW99GZjEPPujJ02RlEZql19U40oORysBhVF7mKz8BBvF3s8l37tvu37oxebDEkh1u/2cm2+ggOXxLjQ==",
+ "dependencies": {
+ "@aws-sdk/types": "3.410.0",
+ "@smithy/protocol-http": "^3.0.2",
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-flexible-checksums": {
+ "version": "3.410.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.410.0.tgz",
+ "integrity": "sha512-IK7KlvEKtrQVBfmAp/MmGd0wbWLuN2GZwwfAmsU0qFb0f5vOVUbKDsu6tudtDKCBG9uXyTEsx3/QGvoK2zDy+g==",
+ "dependencies": {
+ "@aws-crypto/crc32": "3.0.0",
+ "@aws-crypto/crc32c": "3.0.0",
+ "@aws-sdk/types": "3.410.0",
+ "@smithy/is-array-buffer": "^2.0.0",
+ "@smithy/protocol-http": "^3.0.2",
+ "@smithy/types": "^2.3.0",
+ "@smithy/util-utf8": "^2.0.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-host-header": {
+ "version": "3.410.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.410.0.tgz",
+ "integrity": "sha512-ED/OVcyITln5rrxnajZP+V0PN1nug+gSDHJDqdDo/oLy7eiDr/ZWn3nlWW7WcMplQ1/Jnb+hK0UetBp/25XooA==",
+ "dependencies": {
+ "@aws-sdk/types": "3.410.0",
+ "@smithy/protocol-http": "^3.0.2",
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-location-constraint": {
+ "version": "3.410.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.410.0.tgz",
+ "integrity": "sha512-jAftSpOpw/5AdpOJ/cGiXCb+Vv22KXR5QZmxmllUDsnlm18672tpRaI2plmu/1d98CVvqhY61eSklFMrIf2c4w==",
+ "dependencies": {
+ "@aws-sdk/types": "3.410.0",
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-logger": {
+ "version": "3.410.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.410.0.tgz",
+ "integrity": "sha512-YtmKYCVtBfScq3/UFJk+aSZOktKJBNZL9DaSc2aPcy/goCVsYDOkGwtHk0jIkC1JRSNCkVTqL7ya60sSr8zaQQ==",
+ "dependencies": {
+ "@aws-sdk/types": "3.410.0",
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-recursion-detection": {
+ "version": "3.410.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.410.0.tgz",
+ "integrity": "sha512-KWaes5FLzRqj28vaIEE4Bimpga2E596WdPF2HaH6zsVMJddoRDsc3ZX9ZhLOGrXzIO1RqBd0QxbLrM0S/B2aOQ==",
+ "dependencies": {
+ "@aws-sdk/types": "3.410.0",
+ "@smithy/protocol-http": "^3.0.2",
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-sdk-s3": {
+ "version": "3.410.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.410.0.tgz",
+ "integrity": "sha512-K2sG2V1ZkezYMCIy3uMt0MwtflcfIwLptwm0iFLaYitiINZQ1tcslk9ggAjyTHg0rslDSI4/zjkhy8VHFOV7HA==",
+ "dependencies": {
+ "@aws-sdk/types": "3.410.0",
+ "@aws-sdk/util-arn-parser": "3.310.0",
+ "@smithy/protocol-http": "^3.0.2",
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-sdk-sts": {
+ "version": "3.410.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.410.0.tgz",
+ "integrity": "sha512-YfBpctDocRR4CcROoDueJA7D+aMLBV8nTFfmVNdLLLgyuLZ/AUR11VQSu1lf9gQZKl8IpKE/BLf2fRE/qV1ZuA==",
+ "dependencies": {
+ "@aws-sdk/middleware-signing": "3.410.0",
+ "@aws-sdk/types": "3.410.0",
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-signing": {
+ "version": "3.410.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.410.0.tgz",
+ "integrity": "sha512-KBAZ/eoAJUSJv5us2HsKwK2OszG2s9FEyKpEhgnHLcbbKzW873zHBH5GcOGEQu4AWArTy2ndzJu3FF+9/J9hJQ==",
+ "dependencies": {
+ "@aws-sdk/types": "3.410.0",
+ "@smithy/property-provider": "^2.0.0",
+ "@smithy/protocol-http": "^3.0.2",
+ "@smithy/signature-v4": "^2.0.0",
+ "@smithy/types": "^2.3.0",
+ "@smithy/util-middleware": "^2.0.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-ssec": {
+ "version": "3.410.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.410.0.tgz",
+ "integrity": "sha512-DNsjVTXoxIh+PuW9o45CFaMiconbuZRm19MC3NA1yNCaCj3ZxD5OdXAutq6UjQdrx8UG4EjUlCJEEvBKmboITw==",
+ "dependencies": {
+ "@aws-sdk/types": "3.410.0",
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-user-agent": {
+ "version": "3.410.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.410.0.tgz",
+ "integrity": "sha512-ZayDtLfvCZUohSxQc/49BfoU/y6bDHLfLdyyUJbJ54Sv8zQcrmdyKvCBFUZwE6tHQgAmv9/ZT18xECMl+xiONA==",
+ "dependencies": {
+ "@aws-sdk/types": "3.410.0",
+ "@aws-sdk/util-endpoints": "3.410.0",
+ "@smithy/protocol-http": "^3.0.2",
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/s3-request-presigner": {
+ "version": "3.410.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.410.0.tgz",
+ "integrity": "sha512-In2/XPdPA874XH0MdhLJ7tG74Yay/ATCMpMQcy+summlPhmO1G3BiKMoaDPRks+zJNhgiy6++PlcP93fwDSxcA==",
+ "dependencies": {
+ "@aws-sdk/signature-v4-multi-region": "3.410.0",
+ "@aws-sdk/types": "3.410.0",
+ "@aws-sdk/util-format-url": "3.410.0",
+ "@smithy/middleware-endpoint": "^2.0.6",
+ "@smithy/protocol-http": "^3.0.2",
+ "@smithy/smithy-client": "^2.1.3",
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/signature-v4-crt": {
+ "version": "3.410.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-crt/-/signature-v4-crt-3.410.0.tgz",
+ "integrity": "sha512-8lt0YG/LzdCNCXM+GNhsYjHdCkH83oM/Di1HOOgZy/u50u0KOb5REiEYBq2TXMzED4BPVgblDhiJviCGqwcWiQ==",
+ "dependencies": {
+ "@smithy/querystring-parser": "^2.0.0",
+ "@smithy/signature-v4": "^2.0.0",
+ "@smithy/util-middleware": "^2.0.0",
+ "aws-crt": "^1.15.9",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/signature-v4-multi-region": {
+ "version": "3.410.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.410.0.tgz",
+ "integrity": "sha512-abgcl9/i9frxGUVAfHHWj49UMCFEmzkYwKmV/4kw9MYn6BZ3HKb5M00tBLn9/PcAKfANS7O+qJRiEQT66rmfhg==",
+ "dependencies": {
+ "@aws-sdk/types": "3.410.0",
+ "@smithy/protocol-http": "^3.0.2",
+ "@smithy/signature-v4": "^2.0.0",
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "@aws-sdk/signature-v4-crt": "^3.118.0"
+ },
+ "peerDependenciesMeta": {
+ "@aws-sdk/signature-v4-crt": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@aws-sdk/token-providers": {
+ "version": "3.410.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.410.0.tgz",
+ "integrity": "sha512-d5Nc0xydkH/X0LA1HDyhGY5sEv4LuADFk+QpDtT8ogLilcre+b1jpdY8Sih/gd1KoGS1H+d1tz2hSGwUHAbUbw==",
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/middleware-host-header": "3.410.0",
+ "@aws-sdk/middleware-logger": "3.410.0",
+ "@aws-sdk/middleware-recursion-detection": "3.410.0",
+ "@aws-sdk/middleware-user-agent": "3.410.0",
+ "@aws-sdk/types": "3.410.0",
+ "@aws-sdk/util-endpoints": "3.410.0",
+ "@aws-sdk/util-user-agent-browser": "3.410.0",
+ "@aws-sdk/util-user-agent-node": "3.410.0",
+ "@smithy/config-resolver": "^2.0.7",
+ "@smithy/fetch-http-handler": "^2.1.2",
+ "@smithy/hash-node": "^2.0.6",
+ "@smithy/invalid-dependency": "^2.0.6",
+ "@smithy/middleware-content-length": "^2.0.8",
+ "@smithy/middleware-endpoint": "^2.0.6",
+ "@smithy/middleware-retry": "^2.0.9",
+ "@smithy/middleware-serde": "^2.0.6",
+ "@smithy/middleware-stack": "^2.0.0",
+ "@smithy/node-config-provider": "^2.0.9",
+ "@smithy/node-http-handler": "^2.1.2",
+ "@smithy/property-provider": "^2.0.0",
+ "@smithy/protocol-http": "^3.0.2",
+ "@smithy/shared-ini-file-loader": "^2.0.6",
+ "@smithy/smithy-client": "^2.1.3",
+ "@smithy/types": "^2.3.0",
+ "@smithy/url-parser": "^2.0.6",
+ "@smithy/util-base64": "^2.0.0",
+ "@smithy/util-body-length-browser": "^2.0.0",
+ "@smithy/util-body-length-node": "^2.1.0",
+ "@smithy/util-defaults-mode-browser": "^2.0.7",
+ "@smithy/util-defaults-mode-node": "^2.0.9",
+ "@smithy/util-retry": "^2.0.0",
+ "@smithy/util-utf8": "^2.0.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/types": {
+ "version": "3.410.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.410.0.tgz",
+ "integrity": "sha512-D7iaUCszv/v04NDaZUmCmekamy6VD/lKozm/3gS9+dkfU6cC2CsNoUfPV8BlV6dPdw0oWgF91am3I1stdvfVrQ==",
+ "dependencies": {
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-arn-parser": {
+ "version": "3.310.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.310.0.tgz",
+ "integrity": "sha512-jL8509owp/xB9+Or0pvn3Fe+b94qfklc2yPowZZIFAkFcCSIdkIglz18cPDWnYAcy9JGewpMS1COXKIUhZkJsA==",
+ "dependencies": {
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-endpoints": {
+ "version": "3.410.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.410.0.tgz",
+ "integrity": "sha512-iNiqJyC7N3+8zFwnXUqcWSxrZecVZLToo1iTQQdeYL2af1IcOtRgb7n8jpAI/hmXhBSx2+3RI+Y7pxyFo1vu+w==",
+ "dependencies": {
+ "@aws-sdk/types": "3.410.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-format-url": {
+ "version": "3.410.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.410.0.tgz",
+ "integrity": "sha512-ftxPYq7RBxJMQrOCJARx8+sQccmG+6y7mm9JzfXOHOfS1aWnYQizTitJ7PMA8p90xrUAFQ2CmjT0jaEGWg5VGQ==",
+ "dependencies": {
+ "@aws-sdk/types": "3.410.0",
+ "@smithy/querystring-builder": "^2.0.6",
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-locate-window": {
+ "version": "3.310.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz",
+ "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==",
+ "dependencies": {
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-user-agent-browser": {
+ "version": "3.410.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.410.0.tgz",
+ "integrity": "sha512-i1G/XGpXGMRT2zEiAhi1xucJsfCWk8nNYjk/LbC0sA+7B9Huri96YAzVib12wkHPsJQvZxZC6CpQDIHWm4lXMA==",
+ "dependencies": {
+ "@aws-sdk/types": "3.410.0",
+ "@smithy/types": "^2.3.0",
+ "bowser": "^2.11.0",
+ "tslib": "^2.5.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-user-agent-node": {
+ "version": "3.410.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.410.0.tgz",
+ "integrity": "sha512-bK70t1jHRl8HrJXd4hEIwc5PBZ7U0w+81AKFnanIVKZwZedd6nLibUXDTK14z/Jp2GFcBqd4zkt2YLGkRt/U4A==",
+ "dependencies": {
+ "@aws-sdk/types": "3.410.0",
+ "@smithy/node-config-provider": "^2.0.9",
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "aws-crt": ">=1.0.0"
+ },
+ "peerDependenciesMeta": {
+ "aws-crt": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@aws-sdk/util-utf8-browser": {
+ "version": "3.259.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz",
+ "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==",
+ "dependencies": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/@aws-sdk/xml-builder": {
+ "version": "3.310.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.310.0.tgz",
+ "integrity": "sha512-TqELu4mOuSIKQCqj63fGVs86Yh+vBx5nHRpWKNUNhB2nPTpfbziTs5c1X358be3peVWA4wPxW7Nt53KIg1tnNw==",
+ "dependencies": {
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
"node_modules/@babel/code-frame": {
"version": "7.12.11",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
@@ -1684,6 +2453,53 @@
"react-hook-form": "^7.0.0"
}
},
+ "node_modules/@httptoolkit/websocket-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/@httptoolkit/websocket-stream/-/websocket-stream-6.0.1.tgz",
+ "integrity": "sha512-A0NOZI+Glp3Xgcz6Na7i7o09+/+xm2m0UCU8gdtM2nIv6/cjLmhMZMqehSpTlgbx9omtLmV8LVqOskPEyWnmZQ==",
+ "dependencies": {
+ "@types/ws": "*",
+ "duplexify": "^3.5.1",
+ "inherits": "^2.0.1",
+ "isomorphic-ws": "^4.0.1",
+ "readable-stream": "^2.3.3",
+ "safe-buffer": "^5.1.2",
+ "ws": "*",
+ "xtend": "^4.0.0"
+ }
+ },
+ "node_modules/@httptoolkit/websocket-stream/node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+ },
+ "node_modules/@httptoolkit/websocket-stream/node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/@httptoolkit/websocket-stream/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "node_modules/@httptoolkit/websocket-stream/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
"node_modules/@humanwhocodes/config-array": {
"version": "0.11.11",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz",
@@ -2575,12 +3391,12 @@
}
},
"node_modules/@prisma/client": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.0.0.tgz",
- "integrity": "sha512-XlO5ELNAQ7rV4cXIDJUNBEgdLwX3pjtt9Q/RHqDpGf43szpNJx2hJnggfFs7TKNx0cOFsl6KJCSfqr5duEU/bQ==",
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.3.1.tgz",
+ "integrity": "sha512-ArOKjHwdFZIe1cGU56oIfy7wRuTn0FfZjGuU/AjgEBOQh+4rDkB6nF+AGHP8KaVpkBIiHGPQh3IpwQ3xDMdO0Q==",
"hasInstallScript": true,
"dependencies": {
- "@prisma/engines-version": "4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584"
+ "@prisma/engines-version": "5.3.1-2.61e140623197a131c2a6189271ffee05a7aa9a59"
},
"engines": {
"node": ">=16.13"
@@ -2595,15 +3411,15 @@
}
},
"node_modules/@prisma/engines": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.0.0.tgz",
- "integrity": "sha512-kyT/8fd0OpWmhAU5YnY7eP31brW1q1YrTGoblWrhQJDiN/1K+Z8S1kylcmtjqx5wsUGcP1HBWutayA/jtyt+sg==",
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.3.1.tgz",
+ "integrity": "sha512-6QkILNyfeeN67BNEPEtkgh3Xo2tm6D7V+UhrkBbRHqKw9CTaz/vvTP/ROwYSP/3JT2MtIutZm/EnhxUiuOPVDA==",
"hasInstallScript": true
},
"node_modules/@prisma/engines-version": {
- "version": "4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584",
- "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584.tgz",
- "integrity": "sha512-HHiUF6NixsldsP3JROq07TYBLEjXFKr6PdH8H4gK/XAoTmIplOJBCgrIUMrsRAnEuGyRoRLXKXWUb943+PFoKQ=="
+ "version": "5.3.1-2.61e140623197a131c2a6189271ffee05a7aa9a59",
+ "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.3.1-2.61e140623197a131c2a6189271ffee05a7aa9a59.tgz",
+ "integrity": "sha512-y5qbUi3ql2Xg7XraqcXEdMHh0MocBfnBzDn5GbV1xk23S3Mq8MGs+VjacTNiBh3dtEdUERCrUUG7Z3QaJ+h79w=="
},
"node_modules/@protobufjs/aspromise": {
"version": "1.1.2",
@@ -4203,6 +5019,14 @@
"resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.2.tgz",
"integrity": "sha512-V+MvGwaHH03hYhY+k6Ef/xKd6RYlc4q8WBx+2ANmipHJcKuktNcI/NgEsJgdSUF6Lw32njT6OnrRsKYCdgHjYw=="
},
+ "node_modules/@scure/base": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.3.tgz",
+ "integrity": "sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==",
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
"node_modules/@selderee/plugin-htmlparser2": {
"version": "0.10.0",
"resolved": "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.10.0.tgz",
@@ -4215,6 +5039,650 @@
"url": "https://ko-fi.com/killymxi"
}
},
+ "node_modules/@sindresorhus/slugify": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-2.2.1.tgz",
+ "integrity": "sha512-MkngSCRZ8JdSOCHRaYd+D01XhvU3Hjy6MGl06zhOk614hp9EOAp5gIkBeQg7wtmxpitU6eAL4kdiRMcJa2dlrw==",
+ "dependencies": {
+ "@sindresorhus/transliterate": "^1.0.0",
+ "escape-string-regexp": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@sindresorhus/slugify/node_modules/escape-string-regexp": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@sindresorhus/transliterate": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/transliterate/-/transliterate-1.6.0.tgz",
+ "integrity": "sha512-doH1gimEu3A46VX6aVxpHTeHrytJAG6HgdxntYnCFiIFHEM/ZGpG8KiZGBChchjQmG0XFIBL552kBTjVcMZXwQ==",
+ "dependencies": {
+ "escape-string-regexp": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@sindresorhus/transliterate/node_modules/escape-string-regexp": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@smithy/abort-controller": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.6.tgz",
+ "integrity": "sha512-4I7g0lyGUlW2onf8mD76IzU37oRWSHsQ5zlW5MjDzgg4I4J9bOK4500Gx6qOuoN7+GulAnGLe1YwyrIluzhakg==",
+ "dependencies": {
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/chunked-blob-reader": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-2.0.0.tgz",
+ "integrity": "sha512-k+J4GHJsMSAIQPChGBrjEmGS+WbPonCXesoqP9fynIqjn7rdOThdH8FAeCmokP9mxTYKQAKoHCLPzNlm6gh7Wg==",
+ "dependencies": {
+ "tslib": "^2.5.0"
+ }
+ },
+ "node_modules/@smithy/chunked-blob-reader-native": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-2.0.0.tgz",
+ "integrity": "sha512-HM8V2Rp1y8+1343tkZUKZllFhEQPNmpNdgFAncbTsxkZ18/gqjk23XXv3qGyXWp412f3o43ZZ1UZHVcHrpRnCQ==",
+ "dependencies": {
+ "@smithy/util-base64": "^2.0.0",
+ "tslib": "^2.5.0"
+ }
+ },
+ "node_modules/@smithy/config-resolver": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.7.tgz",
+ "integrity": "sha512-J4J1AWiqaApC+3I9U++SuxAQ3BOoM5VoYnpFzCZcb63aLF80Zpc/nq2pFR1OsEIYyg2UYNdcBKKfHABmwo4WgQ==",
+ "dependencies": {
+ "@smithy/node-config-provider": "^2.0.9",
+ "@smithy/types": "^2.3.0",
+ "@smithy/util-config-provider": "^2.0.0",
+ "@smithy/util-middleware": "^2.0.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/credential-provider-imds": {
+ "version": "2.0.9",
+ "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.9.tgz",
+ "integrity": "sha512-K7WZRkHS5HZofRgK+O8W4YXXyaVexU1K6hp9vlUL/8CsnrFbZS9quyH/6hTROrYh2PuJr24yii1kc83NJdxMGQ==",
+ "dependencies": {
+ "@smithy/node-config-provider": "^2.0.9",
+ "@smithy/property-provider": "^2.0.7",
+ "@smithy/types": "^2.3.0",
+ "@smithy/url-parser": "^2.0.6",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/eventstream-codec": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.6.tgz",
+ "integrity": "sha512-J9xL82mlYRUMXFnB9VaThXkD7z2JLr52FIVZMoQQ1dxZG5ub+NOGmzaTTZC/cMmKXI/nwCoFuwDWCTjwQhYhQA==",
+ "dependencies": {
+ "@aws-crypto/crc32": "3.0.0",
+ "@smithy/types": "^2.3.0",
+ "@smithy/util-hex-encoding": "^2.0.0",
+ "tslib": "^2.5.0"
+ }
+ },
+ "node_modules/@smithy/eventstream-serde-browser": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.0.6.tgz",
+ "integrity": "sha512-cNJqAkmArHytV0CjBka3CKnU/J6zNlOZynvo2Txj98a0cxKeug8gL6SQTpoTyGk+M4LicjcrzQtDs06mU8U0Ag==",
+ "dependencies": {
+ "@smithy/eventstream-serde-universal": "^2.0.6",
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/eventstream-serde-config-resolver": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.0.6.tgz",
+ "integrity": "sha512-jODu0MWaP06kzBMUtSd4Ga3S2DnTp3tfjPgdjaw9K/Z4yI7J9rUB73aNGo6ZxxH/vl/k66b5NZJ/3O1AzZ4ggw==",
+ "dependencies": {
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/eventstream-serde-node": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.0.6.tgz",
+ "integrity": "sha512-ua7ok1g16p7OGAVZntn1l3wegN8RtsyPBl9ebqEDeSxdm+iuEfkAS1E/JFs6S6UBfr8Z0tbql5jTT9iVwIFGGA==",
+ "dependencies": {
+ "@smithy/eventstream-serde-universal": "^2.0.6",
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/eventstream-serde-universal": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.0.6.tgz",
+ "integrity": "sha512-bH1TElelS8tlqll6cJAWKM11Es+pE9htRzjiiFG1+xcyKaM90UFNRX5oKZIrJugZlmP37pvfRwSJ/3ZaaqSBIA==",
+ "dependencies": {
+ "@smithy/eventstream-codec": "^2.0.6",
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/fetch-http-handler": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.1.2.tgz",
+ "integrity": "sha512-3Gm3pQm4viUPU+e7KkRScS9t5phBxSNRS8rQSZ+HeCwK/busrX0/2HJZiwLvGblqPqi1laJB0lD18AdiOioJww==",
+ "dependencies": {
+ "@smithy/protocol-http": "^3.0.2",
+ "@smithy/querystring-builder": "^2.0.6",
+ "@smithy/types": "^2.3.0",
+ "@smithy/util-base64": "^2.0.0",
+ "tslib": "^2.5.0"
+ }
+ },
+ "node_modules/@smithy/hash-blob-browser": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-2.0.6.tgz",
+ "integrity": "sha512-zmJCRb80WDthCZqQ9LiKeFUEmyPM9WUcd0jYa7tlU3p0LsDnaFKuUS+MT0uJehPGyUEicbi1KBdUmtoqEAQr1A==",
+ "dependencies": {
+ "@smithy/chunked-blob-reader": "^2.0.0",
+ "@smithy/chunked-blob-reader-native": "^2.0.0",
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ }
+ },
+ "node_modules/@smithy/hash-node": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.6.tgz",
+ "integrity": "sha512-xz7fzFxSzxohKGGyKPbLReRrY01JOZgRDHIXSks3PxQxG9c8PJMa5nUw0stH8UOySUgkofmMy0n7vTUsF5Mdqg==",
+ "dependencies": {
+ "@smithy/types": "^2.3.0",
+ "@smithy/util-buffer-from": "^2.0.0",
+ "@smithy/util-utf8": "^2.0.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/hash-stream-node": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-2.0.6.tgz",
+ "integrity": "sha512-BWtWJ8Ppc8z+Rz9XBu4Hcl+pC+9BKV5GvbQpXZf4IsQX6oTwqo0qJK7Lwe5mYM0hRnqgwjn2mhQ303fIRN7AMw==",
+ "dependencies": {
+ "@smithy/types": "^2.3.0",
+ "@smithy/util-utf8": "^2.0.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/invalid-dependency": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.6.tgz",
+ "integrity": "sha512-L5MUyl9mzawIvBxr0Hg3J/Q5qZFXKcBgMk0PacfK3Mthp4WAR6h7iMxdSQ23Q7X/kxOrpZuoYEdh1BWLKbDc8Q==",
+ "dependencies": {
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ }
+ },
+ "node_modules/@smithy/is-array-buffer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz",
+ "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==",
+ "dependencies": {
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/md5-js": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-2.0.6.tgz",
+ "integrity": "sha512-Ek2qSFFICJa2E0RRVsIkQ6c1jeJTESwF24SMh3liKFNbr2Ax4uJiWsLhDBDQFOhJwjp1mbC4lN85isfGS+KhQg==",
+ "dependencies": {
+ "@smithy/types": "^2.3.0",
+ "@smithy/util-utf8": "^2.0.0",
+ "tslib": "^2.5.0"
+ }
+ },
+ "node_modules/@smithy/middleware-content-length": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.8.tgz",
+ "integrity": "sha512-fHJFsscHXrYhUSWMFJNXfsZW8KsyhWQfBgU3b0nvDfpm+NAeQLqKYNhywGrDwZQc1k+lt7Fw9faAquhNPxTZRA==",
+ "dependencies": {
+ "@smithy/protocol-http": "^3.0.2",
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/middleware-endpoint": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.0.6.tgz",
+ "integrity": "sha512-MuSPPtEHFal/M77tR3ffLsdOfX29IZpA990nGuoPj5zQnAYrA4PYBGoqqrASQKm8Xb3C0NwuYzOATT7WX4f5Pg==",
+ "dependencies": {
+ "@smithy/middleware-serde": "^2.0.6",
+ "@smithy/types": "^2.3.0",
+ "@smithy/url-parser": "^2.0.6",
+ "@smithy/util-middleware": "^2.0.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/middleware-retry": {
+ "version": "2.0.9",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.9.tgz",
+ "integrity": "sha512-gneEqWj4l/ZjHdZPk0BFMXoTalRArdQ8i579/KqJgBAc6Ux5vnR/SSppkMCkj2kOQYwdypvzSPeqEW3ZrvIg6g==",
+ "dependencies": {
+ "@smithy/node-config-provider": "^2.0.9",
+ "@smithy/protocol-http": "^3.0.2",
+ "@smithy/service-error-classification": "^2.0.0",
+ "@smithy/types": "^2.3.0",
+ "@smithy/util-middleware": "^2.0.0",
+ "@smithy/util-retry": "^2.0.0",
+ "tslib": "^2.5.0",
+ "uuid": "^8.3.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/middleware-serde": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.6.tgz",
+ "integrity": "sha512-8/GODBngYbrS28CMZtaHIL4R9rLNSQ/zgb+N1OAZ02NwBUawlnLDcatve9YRzhJC/IWz0/pt+WimJZaO1sGcig==",
+ "dependencies": {
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/middleware-stack": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.0.tgz",
+ "integrity": "sha512-31XC1xNF65nlbc16yuh3wwTudmqs6qy4EseQUGF8A/p2m/5wdd/cnXJqpniy/XvXVwkHPz/GwV36HqzHtIKATQ==",
+ "dependencies": {
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/node-config-provider": {
+ "version": "2.0.9",
+ "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.0.9.tgz",
+ "integrity": "sha512-TlSPbCwtT/jgNnmPQqKuCR5CFN8UIrCCHRrgUfs3NqRMuaLLeP8TPe1fSKq2J8h1M/jd4BF853gneles0gWevg==",
+ "dependencies": {
+ "@smithy/property-provider": "^2.0.7",
+ "@smithy/shared-ini-file-loader": "^2.0.8",
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/node-http-handler": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.2.tgz",
+ "integrity": "sha512-PdEEDCShuM8zxGoaRxmGB/1ikB8oeqz+ZAF9VIA8FCP3E59j8zDTF+wCELoWd1Y6gtxr+RcTAg5sA8nvn5qH/w==",
+ "dependencies": {
+ "@smithy/abort-controller": "^2.0.6",
+ "@smithy/protocol-http": "^3.0.2",
+ "@smithy/querystring-builder": "^2.0.6",
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/property-provider": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.7.tgz",
+ "integrity": "sha512-XT8Tl7YNxM8tCtGqy7v7DSf6PxyXaPE9cdA/Yj4dEw2b05V3RrPqsP+t5XJiZu0yIsQ7pdeYZWv2sSEWVjNeAg==",
+ "dependencies": {
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/protocol-http": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.2.tgz",
+ "integrity": "sha512-LUOWCPRihvJBkdSs+ivK9m1f/rMfF3n9Zpzg8qdry2eIG4HQqqLBMWQyF9bgk7JhsrrOa3//jJKhXzvL7wL5Xw==",
+ "dependencies": {
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/querystring-builder": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.6.tgz",
+ "integrity": "sha512-HnU00shCGoV8vKJZTiNBkNvR9NogU3NIUaVMAGJPSqNGJj3psWo+TUrC0BVCDcwiCljXwXCFGJqIcsWtClrktQ==",
+ "dependencies": {
+ "@smithy/types": "^2.3.0",
+ "@smithy/util-uri-escape": "^2.0.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/querystring-parser": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.6.tgz",
+ "integrity": "sha512-i4LKoXHP7pTFAPjLIJyQXYOhWokbcFha3WWsX74sAKmuluv0XM2cxONZoFxwEzmWhsNyM6buSwJSZXyPiec0AQ==",
+ "dependencies": {
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/service-error-classification": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.0.tgz",
+ "integrity": "sha512-2z5Nafy1O0cTf69wKyNjGW/sNVMiqDnb4jgwfMG8ye8KnFJ5qmJpDccwIbJNhXIfbsxTg9SEec2oe1cexhMJvw==",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/shared-ini-file-loader": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.0.8.tgz",
+ "integrity": "sha512-4u+V+Dv7JGpJ0tppB5rxCem7WhdFux950z4cGPhV0kHTPkKe8DDgINzOlVa2RBu5dI33D02OBJcxFjhW4FPORg==",
+ "dependencies": {
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/signature-v4": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.6.tgz",
+ "integrity": "sha512-4zNTi8w4sky07YKq7oYucZt4ogY00IEaS1NFDXxmCN5V/ywE0WiK+WMim+8wtYQmB0qy3oExZR4LoCAml6j/rA==",
+ "dependencies": {
+ "@smithy/eventstream-codec": "^2.0.6",
+ "@smithy/is-array-buffer": "^2.0.0",
+ "@smithy/types": "^2.3.0",
+ "@smithy/util-hex-encoding": "^2.0.0",
+ "@smithy/util-middleware": "^2.0.0",
+ "@smithy/util-uri-escape": "^2.0.0",
+ "@smithy/util-utf8": "^2.0.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/smithy-client": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.3.tgz",
+ "integrity": "sha512-nSMMp2AKqcG/ruzCY01ogrMdbq/WS1cvGStTsw7yd6bTpp/bGtlOgXvy3h7e0zP7w2DH1AtvIwzYBD6ejZePsQ==",
+ "dependencies": {
+ "@smithy/middleware-stack": "^2.0.0",
+ "@smithy/types": "^2.3.0",
+ "@smithy/util-stream": "^2.0.9",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/types": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.0.tgz",
+ "integrity": "sha512-pJce3rd39MElkV57UTPAoSYAApjQLELUxjU5adHNLYk9gnPvyIGbJNJTZVVFu00BrgZH3W/cQe8QuFcknDyodQ==",
+ "dependencies": {
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/url-parser": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.6.tgz",
+ "integrity": "sha512-9i6j5QW6bapHZ4rtkXOAm0hOUG1+5IVdVJXNSUTcNskwJchZH5IQuDNPCbgUi/u2P8EZazKt4wXT51QxOXCz1A==",
+ "dependencies": {
+ "@smithy/querystring-parser": "^2.0.6",
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ }
+ },
+ "node_modules/@smithy/util-base64": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.0.tgz",
+ "integrity": "sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA==",
+ "dependencies": {
+ "@smithy/util-buffer-from": "^2.0.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/util-body-length-browser": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.0.tgz",
+ "integrity": "sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==",
+ "dependencies": {
+ "tslib": "^2.5.0"
+ }
+ },
+ "node_modules/@smithy/util-body-length-node": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz",
+ "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==",
+ "dependencies": {
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/util-buffer-from": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz",
+ "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==",
+ "dependencies": {
+ "@smithy/is-array-buffer": "^2.0.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/util-config-provider": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz",
+ "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==",
+ "dependencies": {
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/util-defaults-mode-browser": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.7.tgz",
+ "integrity": "sha512-s1caKxC7Y87Q72Goll//clZs2WNBfG9WtFDWVRS+Qgk147YPCOUYtkpuD0XZAh/vbayObFz5tQ1fiX4G19HSCA==",
+ "dependencies": {
+ "@smithy/property-provider": "^2.0.7",
+ "@smithy/types": "^2.3.0",
+ "bowser": "^2.11.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/@smithy/util-defaults-mode-node": {
+ "version": "2.0.9",
+ "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.9.tgz",
+ "integrity": "sha512-HlV4iNL3/PgPpmDGs0+XrAKtwFQ8rOs5P2y5Dye8dUYaJauadlzHRrNKk7wH2aBYswvT2HM+PIgXamvrE7xbcw==",
+ "dependencies": {
+ "@smithy/config-resolver": "^2.0.7",
+ "@smithy/credential-provider-imds": "^2.0.9",
+ "@smithy/node-config-provider": "^2.0.9",
+ "@smithy/property-provider": "^2.0.7",
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/@smithy/util-hex-encoding": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz",
+ "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==",
+ "dependencies": {
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/util-middleware": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.0.tgz",
+ "integrity": "sha512-eCWX4ECuDHn1wuyyDdGdUWnT4OGyIzV0LN1xRttBFMPI9Ff/4heSHVxneyiMtOB//zpXWCha1/SWHJOZstG7kA==",
+ "dependencies": {
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/util-retry": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.0.tgz",
+ "integrity": "sha512-/dvJ8afrElasuiiIttRJeoS2sy8YXpksQwiM/TcepqdRVp7u4ejd9C4IQURHNjlfPUT7Y6lCDSa2zQJbdHhVTg==",
+ "dependencies": {
+ "@smithy/service-error-classification": "^2.0.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@smithy/util-stream": {
+ "version": "2.0.9",
+ "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.9.tgz",
+ "integrity": "sha512-Fn2/3IMwqu0l2hOC7K3bbtSqFEJ6nOzMLoPVIhuH84yw/95itNkFBwVbIIiAfDaout0ZfZ26+5ch86E2q3avww==",
+ "dependencies": {
+ "@smithy/fetch-http-handler": "^2.1.2",
+ "@smithy/node-http-handler": "^2.1.2",
+ "@smithy/types": "^2.3.0",
+ "@smithy/util-base64": "^2.0.0",
+ "@smithy/util-buffer-from": "^2.0.0",
+ "@smithy/util-hex-encoding": "^2.0.0",
+ "@smithy/util-utf8": "^2.0.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/util-uri-escape": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz",
+ "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==",
+ "dependencies": {
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/util-utf8": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.0.tgz",
+ "integrity": "sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==",
+ "dependencies": {
+ "@smithy/util-buffer-from": "^2.0.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@smithy/util-waiter": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.0.6.tgz",
+ "integrity": "sha512-wjxvKB4XSfgpOg3lr4RulnVhd21fMMC4CPARBwrSN7+3U28fwOifv8f7T+Ibay9DAQTj9qXxmd8ag6WXBRgNhg==",
+ "dependencies": {
+ "@smithy/abort-controller": "^2.0.6",
+ "@smithy/types": "^2.3.0",
+ "tslib": "^2.5.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
"node_modules/@swc/helpers": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz",
@@ -4627,6 +6095,14 @@
"resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.7.tgz",
"integrity": "sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g=="
},
+ "node_modules/@types/ws": {
+ "version": "8.5.5",
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz",
+ "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
"node_modules/@typescript-eslint/eslint-plugin": {
"version": "5.62.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz",
@@ -5224,6 +6700,52 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/aws-crt": {
+ "version": "1.18.0",
+ "resolved": "https://registry.npmjs.org/aws-crt/-/aws-crt-1.18.0.tgz",
+ "integrity": "sha512-H5Vrb/GMzq72+Of2zrW69i/BTQ4gQd3MQvdZ3X3okfppzHdEjSPkdJN6ia8V2/1J1FmFvEtoxaY4nwraHUGQvg==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "@aws-sdk/util-utf8-browser": "^3.109.0",
+ "@httptoolkit/websocket-stream": "^6.0.0",
+ "axios": "^0.24.0",
+ "buffer": "^6.0.3",
+ "crypto-js": "^4.0.0",
+ "mqtt": "^4.3.7",
+ "process": "^0.11.10"
+ }
+ },
+ "node_modules/aws-crt/node_modules/axios": {
+ "version": "0.24.0",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz",
+ "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==",
+ "dependencies": {
+ "follow-redirects": "^1.14.4"
+ }
+ },
+ "node_modules/aws-crt/node_modules/buffer": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
+ "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.2.1"
+ }
+ },
"node_modules/axe-core": {
"version": "4.7.2",
"resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz",
@@ -5326,6 +6848,11 @@
"readable-stream": "^3.4.0"
}
},
+ "node_modules/bowser": {
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz",
+ "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA=="
+ },
"node_modules/bplist-parser": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz",
@@ -6186,6 +7713,15 @@
"node": ">= 6"
}
},
+ "node_modules/commist": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/commist/-/commist-1.1.0.tgz",
+ "integrity": "sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==",
+ "dependencies": {
+ "leven": "^2.1.0",
+ "minimist": "^1.1.0"
+ }
+ },
"node_modules/compare-func": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz",
@@ -6201,6 +7737,20 @@
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
},
+ "node_modules/concat-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz",
+ "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==",
+ "engines": [
+ "node >= 6.0"
+ ],
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^3.0.2",
+ "typedarray": "^0.0.6"
+ }
+ },
"node_modules/condense-newlines": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz",
@@ -6411,6 +7961,11 @@
"node": ">= 8"
}
},
+ "node_modules/crypto-js": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz",
+ "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw=="
+ },
"node_modules/css-unit-converter": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz",
@@ -6568,6 +8123,7 @@
"version": "2.30.0",
"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz",
"integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==",
+ "peer": true,
"dependencies": {
"@babel/runtime": "^7.21.0"
},
@@ -6987,6 +8543,49 @@
"node": ">=12"
}
},
+ "node_modules/duplexify": {
+ "version": "3.7.1",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
+ "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
+ "dependencies": {
+ "end-of-stream": "^1.0.0",
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.0",
+ "stream-shift": "^1.0.0"
+ }
+ },
+ "node_modules/duplexify/node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+ },
+ "node_modules/duplexify/node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/duplexify/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "node_modules/duplexify/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
"node_modules/eastasianwidth": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
@@ -8213,6 +9812,27 @@
"resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz",
"integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw=="
},
+ "node_modules/fast-xml-parser": {
+ "version": "4.2.5",
+ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz",
+ "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==",
+ "funding": [
+ {
+ "type": "paypal",
+ "url": "https://paypal.me/naturalintelligence"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "dependencies": {
+ "strnum": "^1.0.5"
+ },
+ "bin": {
+ "fxparser": "src/cli/cli.js"
+ }
+ },
"node_modules/fastq": {
"version": "1.15.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
@@ -9020,6 +10640,15 @@
"url": "https://opencollective.com/unified"
}
},
+ "node_modules/help-me": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/help-me/-/help-me-3.0.0.tgz",
+ "integrity": "sha512-hx73jClhyk910sidBB7ERlnhMlFsJJIBqSVMFDwPN8o2v9nmp5KgLq1Xz1Bf1fCMMZ6mPrX159iG0VLy/fPMtQ==",
+ "dependencies": {
+ "glob": "^7.1.6",
+ "readable-stream": "^3.6.0"
+ }
+ },
"node_modules/hexoid": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz",
@@ -9748,6 +11377,14 @@
"whatwg-fetch": "^3.4.1"
}
},
+ "node_modules/isomorphic-ws": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz",
+ "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==",
+ "peerDependencies": {
+ "ws": "*"
+ }
+ },
"node_modules/javascript-natural-sort": {
"version": "0.7.1",
"resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz",
@@ -9848,6 +11485,15 @@
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
}
},
+ "node_modules/js-sdsl": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz",
+ "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/js-sdsl"
+ }
+ },
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -9996,6 +11642,14 @@
"url": "https://ko-fi.com/killymxi"
}
},
+ "node_modules/leven": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz",
+ "integrity": "sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/levn": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
@@ -11571,6 +13225,79 @@
"resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz",
"integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q=="
},
+ "node_modules/mqtt": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-4.3.7.tgz",
+ "integrity": "sha512-ew3qwG/TJRorTz47eW46vZ5oBw5MEYbQZVaEji44j5lAUSQSqIEoul7Kua/BatBW0H0kKQcC9kwUHa1qzaWHSw==",
+ "dependencies": {
+ "commist": "^1.0.0",
+ "concat-stream": "^2.0.0",
+ "debug": "^4.1.1",
+ "duplexify": "^4.1.1",
+ "help-me": "^3.0.0",
+ "inherits": "^2.0.3",
+ "lru-cache": "^6.0.0",
+ "minimist": "^1.2.5",
+ "mqtt-packet": "^6.8.0",
+ "number-allocator": "^1.0.9",
+ "pump": "^3.0.0",
+ "readable-stream": "^3.6.0",
+ "reinterval": "^1.1.0",
+ "rfdc": "^1.3.0",
+ "split2": "^3.1.0",
+ "ws": "^7.5.5",
+ "xtend": "^4.0.2"
+ },
+ "bin": {
+ "mqtt": "bin/mqtt.js",
+ "mqtt_pub": "bin/pub.js",
+ "mqtt_sub": "bin/sub.js"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/mqtt-packet": {
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-6.10.0.tgz",
+ "integrity": "sha512-ja8+mFKIHdB1Tpl6vac+sktqy3gA8t9Mduom1BA75cI+R9AHnZOiaBQwpGiWnaVJLDGRdNhQmFaAqd7tkKSMGA==",
+ "dependencies": {
+ "bl": "^4.0.2",
+ "debug": "^4.1.1",
+ "process-nextick-args": "^2.0.1"
+ }
+ },
+ "node_modules/mqtt/node_modules/duplexify": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz",
+ "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==",
+ "dependencies": {
+ "end-of-stream": "^1.4.1",
+ "inherits": "^2.0.3",
+ "readable-stream": "^3.1.1",
+ "stream-shift": "^1.0.0"
+ }
+ },
+ "node_modules/mqtt/node_modules/ws": {
+ "version": "7.5.9",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
+ "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
+ "engines": {
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
"node_modules/mri": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
@@ -11980,6 +13707,15 @@
"set-blocking": "^2.0.0"
}
},
+ "node_modules/number-allocator": {
+ "version": "1.0.14",
+ "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.14.tgz",
+ "integrity": "sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==",
+ "dependencies": {
+ "debug": "^4.3.1",
+ "js-sdsl": "4.3.0"
+ }
+ },
"node_modules/oauth": {
"version": "0.9.15",
"resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz",
@@ -12943,12 +14679,12 @@
"integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew=="
},
"node_modules/prisma": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.0.0.tgz",
- "integrity": "sha512-KYWk83Fhi1FH59jSpavAYTt2eoMVW9YKgu8ci0kuUnt6Dup5Qy47pcB4/TLmiPAbhGrxxSz7gsSnJcCmkyPANA==",
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.3.1.tgz",
+ "integrity": "sha512-Wp2msQIlMPHe+5k5Od6xnsI/WNG7UJGgFUJgqv/ygc7kOECZapcSz/iU4NIEzISs3H1W9sFLjAPbg/gOqqtB7A==",
"hasInstallScript": true,
"dependencies": {
- "@prisma/engines": "5.0.0"
+ "@prisma/engines": "5.3.1"
},
"bin": {
"prisma": "build/index.js"
@@ -12957,6 +14693,19 @@
"node": ">=16.13"
}
},
+ "node_modules/process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+ },
"node_modules/prop-types": {
"version": "15.8.1",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
@@ -13669,6 +15418,11 @@
"url": "https://opencollective.com/unified"
}
},
+ "node_modules/reinterval": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reinterval/-/reinterval-1.1.0.tgz",
+ "integrity": "sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ=="
+ },
"node_modules/remark-frontmatter": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-4.0.1.tgz",
@@ -13902,8 +15656,7 @@
"node_modules/rfdc": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
- "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==",
- "dev": true
+ "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA=="
},
"node_modules/rimraf": {
"version": "3.0.2",
@@ -14420,7 +16173,6 @@
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz",
"integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==",
- "dev": true,
"dependencies": {
"readable-stream": "^3.0.0"
}
@@ -14456,6 +16208,11 @@
"node": ">= 0.6"
}
},
+ "node_modules/stream-shift": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
+ "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ=="
+ },
"node_modules/streamsearch": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
@@ -14654,6 +16411,11 @@
"node": ">=12.*"
}
},
+ "node_modules/strnum": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz",
+ "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA=="
+ },
"node_modules/style-to-js": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.3.tgz",
@@ -15756,6 +17518,11 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="
+ },
"node_modules/typescript": {
"version": "5.1.6",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz",
@@ -16259,6 +18026,26 @@
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
},
+ "node_modules/ws": {
+ "version": "8.14.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.1.tgz",
+ "integrity": "sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
"node_modules/xtend": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
@@ -16364,13 +18151,12 @@
"version": "1.0.0",
"license": "MIT",
"dependencies": {
- "@documenso/tailwind-config": "*",
- "@documenso/tsconfig": "*",
- "@documenso/ui": "*",
"@react-email/components": "^0.0.7",
"nodemailer": "^6.9.3"
},
"devDependencies": {
+ "@documenso/tailwind-config": "*",
+ "@documenso/tsconfig": "*",
"@types/nodemailer": "^6.4.8",
"tsup": "^7.1.0"
}
@@ -16397,10 +18183,15 @@
"version": "1.0.0",
"license": "MIT",
"dependencies": {
+ "@aws-sdk/client-s3": "^3.410.0",
+ "@aws-sdk/s3-request-presigner": "^3.410.0",
+ "@aws-sdk/signature-v4-crt": "^3.410.0",
"@documenso/email": "*",
"@documenso/prisma": "*",
"@next-auth/prisma-adapter": "1.0.7",
"@pdf-lib/fontkit": "^1.1.1",
+ "@scure/base": "^1.1.3",
+ "@sindresorhus/slugify": "^2.2.1",
"@upstash/redis": "^1.20.6",
"bcrypt": "^5.1.0",
"luxon": "^3.4.0",
@@ -16439,8 +18230,12 @@
"version": "1.0.0",
"license": "MIT",
"dependencies": {
- "@prisma/client": "5.0.0",
- "prisma": "5.0.0"
+ "@prisma/client": "5.3.1",
+ "prisma": "5.3.1"
+ },
+ "devDependencies": {
+ "ts-node": "^10.9.1",
+ "typescript": "^5.1.6"
}
},
"packages/tailwind-config": {
@@ -16483,6 +18278,7 @@
"version": "0.0.0",
"license": "MIT",
"dependencies": {
+ "@documenso/lib": "*",
"@radix-ui/react-accordion": "^1.1.1",
"@radix-ui/react-alert-dialog": "^1.0.3",
"@radix-ui/react-aspect-ratio": "^1.0.2",
@@ -16512,7 +18308,6 @@
"class-variance-authority": "^0.6.0",
"clsx": "^1.2.1",
"cmdk": "^0.2.0",
- "date-fns": "^2.30.0",
"framer-motion": "^10.12.8",
"lucide-react": "^0.214.0",
"next": "13.4.12",
@@ -16523,6 +18318,7 @@
"tailwindcss-animate": "^1.0.5"
},
"devDependencies": {
+ "@documenso/tailwind-config": "*",
"@documenso/tsconfig": "*",
"@types/react": "18.2.18",
"@types/react-dom": "18.2.7",
diff --git a/packages/email/package.json b/packages/email/package.json
index 39e2ca67a..c1751dce6 100644
--- a/packages/email/package.json
+++ b/packages/email/package.json
@@ -16,13 +16,12 @@
"worker:test": "tsup worker/index.ts --format esm"
},
"dependencies": {
- "@documenso/tsconfig": "*",
- "@documenso/tailwind-config": "*",
- "@documenso/ui": "*",
"@react-email/components": "^0.0.7",
"nodemailer": "^6.9.3"
},
"devDependencies": {
+ "@documenso/tsconfig": "*",
+ "@documenso/tailwind-config": "*",
"@types/nodemailer": "^6.4.8",
"tsup": "^7.1.0"
}
diff --git a/packages/email/tailwind.config.js b/packages/email/tailwind.config.js
index 81816bdfb..2e138b912 100644
--- a/packages/email/tailwind.config.js
+++ b/packages/email/tailwind.config.js
@@ -4,8 +4,5 @@ const path = require('path');
module.exports = {
...baseConfig,
- content: [
- `templates/**/*.{ts,tsx}`,
- `${path.join(require.resolve('@documenso/ui'), '..')}/**/*.{ts,tsx}`,
- ],
+ content: [`templates/**/*.{ts,tsx}`],
};
diff --git a/packages/lib/client-only/recipient-initials.ts b/packages/lib/client-only/recipient-initials.ts
deleted file mode 100644
index 0712ccd7d..000000000
--- a/packages/lib/client-only/recipient-initials.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-export const initials = (text: string) =>
- text
- ?.split(' ')
- .map((name: string) => name.slice(0, 1).toUpperCase())
- .slice(0, 2)
- .join('') ?? 'UK';
diff --git a/packages/lib/constants/time.ts b/packages/lib/constants/time.ts
new file mode 100644
index 000000000..e2581e14c
--- /dev/null
+++ b/packages/lib/constants/time.ts
@@ -0,0 +1,5 @@
+export const ONE_SECOND = 1000;
+export const ONE_MINUTE = ONE_SECOND * 60;
+export const ONE_HOUR = ONE_MINUTE * 60;
+export const ONE_DAY = ONE_HOUR * 24;
+export const ONE_WEEK = ONE_DAY * 7;
diff --git a/packages/lib/next-auth/guards/is-admin.ts b/packages/lib/next-auth/guards/is-admin.ts
new file mode 100644
index 000000000..2801305dd
--- /dev/null
+++ b/packages/lib/next-auth/guards/is-admin.ts
@@ -0,0 +1,5 @@
+import { Role, User } from '@documenso/prisma/client';
+
+const isAdmin = (user: User) => user.roles.includes(Role.ADMIN);
+
+export { isAdmin };
diff --git a/packages/lib/package.json b/packages/lib/package.json
index 0d04f6c93..757ab7932 100644
--- a/packages/lib/package.json
+++ b/packages/lib/package.json
@@ -12,10 +12,15 @@
],
"scripts": {},
"dependencies": {
+ "@aws-sdk/client-s3": "^3.410.0",
+ "@aws-sdk/s3-request-presigner": "^3.410.0",
+ "@aws-sdk/signature-v4-crt": "^3.410.0",
"@documenso/email": "*",
"@documenso/prisma": "*",
"@next-auth/prisma-adapter": "1.0.7",
"@pdf-lib/fontkit": "^1.1.1",
+ "@scure/base": "^1.1.3",
+ "@sindresorhus/slugify": "^2.2.1",
"@upstash/redis": "^1.20.6",
"bcrypt": "^5.1.0",
"luxon": "^3.4.0",
diff --git a/packages/lib/server-only/admin/get-documents-stats.ts b/packages/lib/server-only/admin/get-documents-stats.ts
new file mode 100644
index 000000000..e0d53373f
--- /dev/null
+++ b/packages/lib/server-only/admin/get-documents-stats.ts
@@ -0,0 +1,26 @@
+import { prisma } from '@documenso/prisma';
+import { ExtendedDocumentStatus } from '@documenso/prisma/types/extended-document-status';
+
+export const getDocumentStats = async () => {
+ const counts = await prisma.document.groupBy({
+ by: ['status'],
+ _count: {
+ _all: true,
+ },
+ });
+
+ const stats: Record, number> = {
+ [ExtendedDocumentStatus.DRAFT]: 0,
+ [ExtendedDocumentStatus.PENDING]: 0,
+ [ExtendedDocumentStatus.COMPLETED]: 0,
+ [ExtendedDocumentStatus.ALL]: 0,
+ };
+
+ counts.forEach((stat) => {
+ stats[stat.status] = stat._count._all;
+
+ stats.ALL += stat._count._all;
+ });
+
+ return stats;
+};
diff --git a/packages/lib/server-only/admin/get-recipients-stats.ts b/packages/lib/server-only/admin/get-recipients-stats.ts
new file mode 100644
index 000000000..f24d0b5a2
--- /dev/null
+++ b/packages/lib/server-only/admin/get-recipients-stats.ts
@@ -0,0 +1,29 @@
+import { prisma } from '@documenso/prisma';
+import { ReadStatus, SendStatus, SigningStatus } from '@documenso/prisma/client';
+
+export const getRecipientsStats = async () => {
+ const results = await prisma.recipient.groupBy({
+ by: ['readStatus', 'signingStatus', 'sendStatus'],
+ _count: true,
+ });
+
+ const stats = {
+ TOTAL_RECIPIENTS: 0,
+ [ReadStatus.OPENED]: 0,
+ [ReadStatus.NOT_OPENED]: 0,
+ [SigningStatus.SIGNED]: 0,
+ [SigningStatus.NOT_SIGNED]: 0,
+ [SendStatus.SENT]: 0,
+ [SendStatus.NOT_SENT]: 0,
+ };
+
+ results.forEach((result) => {
+ const { readStatus, signingStatus, sendStatus, _count } = result;
+ stats[readStatus] += _count;
+ stats[signingStatus] += _count;
+ stats[sendStatus] += _count;
+ stats.TOTAL_RECIPIENTS += _count;
+ });
+
+ return stats;
+};
diff --git a/packages/lib/server-only/admin/get-users-stats.ts b/packages/lib/server-only/admin/get-users-stats.ts
new file mode 100644
index 000000000..09892171a
--- /dev/null
+++ b/packages/lib/server-only/admin/get-users-stats.ts
@@ -0,0 +1,18 @@
+import { prisma } from '@documenso/prisma';
+import { SubscriptionStatus } from '@documenso/prisma/client';
+
+export const getUsersCount = async () => {
+ return await prisma.user.count();
+};
+
+export const getUsersWithSubscriptionsCount = async () => {
+ return await prisma.user.count({
+ where: {
+ Subscription: {
+ some: {
+ status: SubscriptionStatus.ACTIVE,
+ },
+ },
+ },
+ });
+};
diff --git a/packages/lib/server-only/document-data/create-document-data.ts b/packages/lib/server-only/document-data/create-document-data.ts
new file mode 100644
index 000000000..e41f00fe7
--- /dev/null
+++ b/packages/lib/server-only/document-data/create-document-data.ts
@@ -0,0 +1,19 @@
+'use server';
+
+import { prisma } from '@documenso/prisma';
+import { DocumentDataType } from '@documenso/prisma/client';
+
+export type CreateDocumentDataOptions = {
+ type: DocumentDataType;
+ data: string;
+};
+
+export const createDocumentData = async ({ type, data }: CreateDocumentDataOptions) => {
+ return await prisma.documentData.create({
+ data: {
+ type,
+ data,
+ initialData: data,
+ },
+ });
+};
diff --git a/packages/lib/server-only/document/create-document.ts b/packages/lib/server-only/document/create-document.ts
new file mode 100644
index 000000000..b84f8e46e
--- /dev/null
+++ b/packages/lib/server-only/document/create-document.ts
@@ -0,0 +1,19 @@
+'use server';
+
+import { prisma } from '@documenso/prisma';
+
+export type CreateDocumentOptions = {
+ title: string;
+ userId: number;
+ documentDataId: string;
+};
+
+export const createDocument = async ({ userId, title, documentDataId }: CreateDocumentOptions) => {
+ return await prisma.document.create({
+ data: {
+ title,
+ documentDataId,
+ userId,
+ },
+ });
+};
diff --git a/packages/lib/server-only/document/find-documents.ts b/packages/lib/server-only/document/find-documents.ts
index c9c8eaf6c..aa5410c17 100644
--- a/packages/lib/server-only/document/find-documents.ts
+++ b/packages/lib/server-only/document/find-documents.ts
@@ -32,7 +32,7 @@ export const findDocuments = async ({
},
});
- const orderByColumn = orderBy?.column ?? 'created';
+ const orderByColumn = orderBy?.column ?? 'createdAt';
const orderByDirection = orderBy?.direction ?? 'desc';
const termFilters = !term
diff --git a/packages/lib/server-only/document/get-document-by-id.ts b/packages/lib/server-only/document/get-document-by-id.ts
index 12b0d03f9..0fce1af4d 100644
--- a/packages/lib/server-only/document/get-document-by-id.ts
+++ b/packages/lib/server-only/document/get-document-by-id.ts
@@ -11,5 +11,8 @@ export const getDocumentById = async ({ id, userId }: GetDocumentByIdOptions) =>
id,
userId,
},
+ include: {
+ documentData: true,
+ },
});
};
diff --git a/packages/lib/server-only/document/get-document-by-token.ts b/packages/lib/server-only/document/get-document-by-token.ts
index 74bc30c79..62b3ddd48 100644
--- a/packages/lib/server-only/document/get-document-by-token.ts
+++ b/packages/lib/server-only/document/get-document-by-token.ts
@@ -17,6 +17,7 @@ export const getDocumentAndSenderByToken = async ({
},
include: {
User: true,
+ documentData: true,
},
});
diff --git a/packages/lib/server-only/document/seal-document.ts b/packages/lib/server-only/document/seal-document.ts
index 1a74cfaac..883d13e6f 100644
--- a/packages/lib/server-only/document/seal-document.ts
+++ b/packages/lib/server-only/document/seal-document.ts
@@ -1,10 +1,13 @@
'use server';
+import path from 'node:path';
import { PDFDocument } from 'pdf-lib';
import { prisma } from '@documenso/prisma';
import { DocumentStatus, SigningStatus } from '@documenso/prisma/client';
+import { getFile } from '../../universal/upload/get-file';
+import { putFile } from '../../universal/upload/put-file';
import { insertFieldInPDF } from '../pdf/insert-field-in-pdf';
export type SealDocumentOptions = {
@@ -18,8 +21,17 @@ export const sealDocument = async ({ documentId }: SealDocumentOptions) => {
where: {
id: documentId,
},
+ include: {
+ documentData: true,
+ },
});
+ const { documentData } = document;
+
+ if (!documentData) {
+ throw new Error(`Document ${document.id} has no document data`);
+ }
+
if (document.status !== DocumentStatus.COMPLETED) {
throw new Error(`Document ${document.id} has not been completed`);
}
@@ -48,7 +60,7 @@ export const sealDocument = async ({ documentId }: SealDocumentOptions) => {
}
// !: Need to write the fields onto the document as a hard copy
- const { document: pdfData } = document;
+ const pdfData = await getFile(documentData);
const doc = await PDFDocument.load(pdfData);
@@ -58,13 +70,20 @@ export const sealDocument = async ({ documentId }: SealDocumentOptions) => {
const pdfBytes = await doc.save();
- await prisma.document.update({
+ const { name, ext } = path.parse(document.title);
+
+ const { data: newData } = await putFile({
+ name: `${name}_signed${ext}`,
+ type: 'application/pdf',
+ arrayBuffer: async () => Promise.resolve(Buffer.from(pdfBytes)),
+ });
+
+ await prisma.documentData.update({
where: {
- id: document.id,
- status: DocumentStatus.COMPLETED,
+ id: documentData.id,
},
data: {
- document: Buffer.from(pdfBytes).toString('base64'),
+ data: newData,
},
});
};
diff --git a/packages/lib/server-only/document/send-document.tsx b/packages/lib/server-only/document/send-document.tsx
index 37ecc66b7..83a88f24a 100644
--- a/packages/lib/server-only/document/send-document.tsx
+++ b/packages/lib/server-only/document/send-document.tsx
@@ -48,8 +48,8 @@ export const sendDocument = async ({ documentId, userId }: SendDocumentOptions)
return;
}
- const assetBaseUrl = process.env.NEXT_PUBLIC_SITE_URL || 'http://localhost:3000';
- const signDocumentLink = `${process.env.NEXT_PUBLIC_SITE_URL}/sign/${recipient.token}`;
+ const assetBaseUrl = process.env.NEXT_PUBLIC_WEBAPP_URL || 'http://localhost:3000';
+ const signDocumentLink = `${process.env.NEXT_PUBLIC_WEBAPP_URL}/sign/${recipient.token}`;
const template = createElement(DocumentInviteEmailTemplate, {
documentName: document.title,
diff --git a/packages/lib/server-only/recipient/set-recipients-for-document.ts b/packages/lib/server-only/recipient/set-recipients-for-document.ts
index 15db42084..c34885143 100644
--- a/packages/lib/server-only/recipient/set-recipients-for-document.ts
+++ b/packages/lib/server-only/recipient/set-recipients-for-document.ts
@@ -1,8 +1,8 @@
-import { nanoid } from 'nanoid';
-
import { prisma } from '@documenso/prisma';
import { SendStatus, SigningStatus } from '@documenso/prisma/client';
+import { nanoid } from '../../universal/id';
+
export interface SetRecipientsForDocumentOptions {
userId: number;
documentId: number;
diff --git a/packages/lib/tsconfig.json b/packages/lib/tsconfig.json
index 0f63d1612..fdefbd544 100644
--- a/packages/lib/tsconfig.json
+++ b/packages/lib/tsconfig.json
@@ -1,5 +1,8 @@
{
"extends": "@documenso/tsconfig/react-library.json",
+ "compilerOptions": {
+ "types": ["@documenso/tsconfig/process-env.d.ts"]
+ },
"include": ["**/*.ts", "**/*.tsx", "**/*.d.ts"],
"exclude": ["dist", "build", "node_modules"]
}
diff --git a/packages/lib/universal/get-base-url.ts b/packages/lib/universal/get-base-url.ts
index aa8884088..2120c9f54 100644
--- a/packages/lib/universal/get-base-url.ts
+++ b/packages/lib/universal/get-base-url.ts
@@ -8,8 +8,8 @@ export const getBaseUrl = () => {
return `https://${process.env.VERCEL_URL}`;
}
- if (process.env.NEXT_PUBLIC_SITE_URL) {
- return `https://${process.env.NEXT_PUBLIC_SITE_URL}`;
+ if (process.env.NEXT_PUBLIC_WEBAPP_URL) {
+ return process.env.NEXT_PUBLIC_WEBAPP_URL;
}
return `http://localhost:${process.env.PORT ?? 3000}`;
diff --git a/packages/lib/universal/id.ts b/packages/lib/universal/id.ts
new file mode 100644
index 000000000..13738233e
--- /dev/null
+++ b/packages/lib/universal/id.ts
@@ -0,0 +1,5 @@
+import { customAlphabet } from 'nanoid';
+
+export const alphaid = customAlphabet('0123456789abcdefghijklmnopqrstuvwxyz', 10);
+
+export { nanoid } from 'nanoid';
diff --git a/packages/lib/universal/upload/delete-file.ts b/packages/lib/universal/upload/delete-file.ts
new file mode 100644
index 000000000..69f93d7a0
--- /dev/null
+++ b/packages/lib/universal/upload/delete-file.ts
@@ -0,0 +1,22 @@
+import { match } from 'ts-pattern';
+
+import { DocumentDataType } from '@documenso/prisma/client';
+
+import { deleteS3File } from './server-actions';
+
+export type DeleteFileOptions = {
+ type: DocumentDataType;
+ data: string;
+};
+
+export const deleteFile = async ({ type, data }: DeleteFileOptions) => {
+ return await match(type)
+ .with(DocumentDataType.S3_PATH, async () => deleteFileFromS3(data))
+ .otherwise(() => {
+ return;
+ });
+};
+
+const deleteFileFromS3 = async (key: string) => {
+ await deleteS3File(key);
+};
diff --git a/packages/lib/universal/upload/get-file.ts b/packages/lib/universal/upload/get-file.ts
new file mode 100644
index 000000000..10e624aaf
--- /dev/null
+++ b/packages/lib/universal/upload/get-file.ts
@@ -0,0 +1,51 @@
+import { base64 } from '@scure/base';
+import { match } from 'ts-pattern';
+
+import { DocumentDataType } from '@documenso/prisma/client';
+
+import { getPresignGetUrl } from './server-actions';
+
+export type GetFileOptions = {
+ type: DocumentDataType;
+ data: string;
+};
+
+export const getFile = async ({ type, data }: GetFileOptions) => {
+ return await match(type)
+ .with(DocumentDataType.BYTES, () => getFileFromBytes(data))
+ .with(DocumentDataType.BYTES_64, () => getFileFromBytes64(data))
+ .with(DocumentDataType.S3_PATH, async () => getFileFromS3(data))
+ .exhaustive();
+};
+
+const getFileFromBytes = (data: string) => {
+ const encoder = new TextEncoder();
+
+ const binaryData = encoder.encode(data);
+
+ return binaryData;
+};
+
+const getFileFromBytes64 = (data: string) => {
+ const binaryData = base64.decode(data);
+
+ return binaryData;
+};
+
+const getFileFromS3 = async (key: string) => {
+ const { url } = await getPresignGetUrl(key);
+
+ const response = await fetch(url, {
+ method: 'GET',
+ });
+
+ if (!response.ok) {
+ throw new Error(`Failed to get file "${key}", failed with status code ${response.status}`);
+ }
+
+ const buffer = await response.arrayBuffer();
+
+ const binaryData = new Uint8Array(buffer);
+
+ return binaryData;
+};
diff --git a/packages/lib/universal/upload/put-file.ts b/packages/lib/universal/upload/put-file.ts
new file mode 100644
index 000000000..56ed8eb07
--- /dev/null
+++ b/packages/lib/universal/upload/put-file.ts
@@ -0,0 +1,59 @@
+import { base64 } from '@scure/base';
+import { match } from 'ts-pattern';
+
+import { DocumentDataType } from '@documenso/prisma/client';
+
+import { createDocumentData } from '../../server-only/document-data/create-document-data';
+import { getPresignPostUrl } from './server-actions';
+
+type File = {
+ name: string;
+ type: string;
+ arrayBuffer: () => Promise;
+};
+
+export const putFile = async (file: File) => {
+ const { type, data } = await match(process.env.NEXT_PUBLIC_UPLOAD_TRANSPORT)
+ .with('s3', async () => putFileInS3(file))
+ .otherwise(async () => putFileInDatabase(file));
+
+ return await createDocumentData({ type, data });
+};
+
+const putFileInDatabase = async (file: File) => {
+ const contents = await file.arrayBuffer();
+
+ const binaryData = new Uint8Array(contents);
+
+ const asciiData = base64.encode(binaryData);
+
+ return {
+ type: DocumentDataType.BYTES_64,
+ data: asciiData,
+ };
+};
+
+const putFileInS3 = async (file: File) => {
+ const { url, key } = await getPresignPostUrl(file.name, file.type);
+
+ const body = await file.arrayBuffer();
+
+ const reponse = await fetch(url, {
+ method: 'PUT',
+ headers: {
+ 'Content-Type': 'application/octet-stream',
+ },
+ body,
+ });
+
+ if (!reponse.ok) {
+ throw new Error(
+ `Failed to upload file "${file.name}", failed with status code ${reponse.status}`,
+ );
+ }
+
+ return {
+ type: DocumentDataType.S3_PATH,
+ data: key,
+ };
+};
diff --git a/packages/lib/universal/upload/server-actions.ts b/packages/lib/universal/upload/server-actions.ts
new file mode 100644
index 000000000..629d62a2a
--- /dev/null
+++ b/packages/lib/universal/upload/server-actions.ts
@@ -0,0 +1,104 @@
+'use server';
+
+import {
+ DeleteObjectCommand,
+ GetObjectCommand,
+ PutObjectCommand,
+ S3Client,
+} from '@aws-sdk/client-s3';
+import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
+import slugify from '@sindresorhus/slugify';
+import path from 'node:path';
+
+import { ONE_HOUR, ONE_SECOND } from '../../constants/time';
+import { getServerComponentSession } from '../../next-auth/get-server-session';
+import { alphaid } from '../id';
+
+export const getPresignPostUrl = async (fileName: string, contentType: string) => {
+ const client = getS3Client();
+
+ const user = await getServerComponentSession();
+
+ // Get the basename and extension for the file
+ const { name, ext } = path.parse(fileName);
+
+ let key = `${alphaid(12)}/${slugify(name)}${ext}`;
+
+ if (user) {
+ key = `${user.id}/${key}`;
+ }
+
+ const putObjectCommand = new PutObjectCommand({
+ Bucket: process.env.NEXT_PRIVATE_UPLOAD_BUCKET,
+ Key: key,
+ ContentType: contentType,
+ });
+
+ const url = await getSignedUrl(client, putObjectCommand, {
+ expiresIn: ONE_HOUR / ONE_SECOND,
+ });
+
+ return { key, url };
+};
+
+export const getAbsolutePresignPostUrl = async (key: string) => {
+ const client = getS3Client();
+
+ const putObjectCommand = new PutObjectCommand({
+ Bucket: process.env.NEXT_PRIVATE_UPLOAD_BUCKET,
+ Key: key,
+ });
+
+ const url = await getSignedUrl(client, putObjectCommand, {
+ expiresIn: ONE_HOUR / ONE_SECOND,
+ });
+
+ return { key, url };
+};
+
+export const getPresignGetUrl = async (key: string) => {
+ const client = getS3Client();
+
+ const getObjectCommand = new GetObjectCommand({
+ Bucket: process.env.NEXT_PRIVATE_UPLOAD_BUCKET,
+ Key: key,
+ });
+
+ const url = await getSignedUrl(client, getObjectCommand, {
+ expiresIn: ONE_HOUR / ONE_SECOND,
+ });
+
+ return { key, url };
+};
+
+export const deleteS3File = async (key: string) => {
+ const client = getS3Client();
+
+ await client.send(
+ new DeleteObjectCommand({
+ Bucket: process.env.NEXT_PRIVATE_UPLOAD_BUCKET,
+ Key: key,
+ }),
+ );
+};
+
+const getS3Client = () => {
+ if (process.env.NEXT_PUBLIC_UPLOAD_TRANSPORT !== 's3') {
+ throw new Error('Invalid upload transport');
+ }
+
+ const hasCredentials =
+ process.env.NEXT_PRIVATE_UPLOAD_ACCESS_KEY_ID &&
+ process.env.NEXT_PRIVATE_UPLOAD_SECRET_ACCESS_KEY;
+
+ return new S3Client({
+ endpoint: process.env.NEXT_PRIVATE_UPLOAD_ENDPOINT || undefined,
+ region: process.env.NEXT_PRIVATE_UPLOAD_REGION || 'us-east-1',
+ credentials: hasCredentials
+ ? {
+ accessKeyId: String(process.env.NEXT_PRIVATE_UPLOAD_ACCESS_KEY_ID),
+ secretAccessKey: String(process.env.NEXT_PRIVATE_UPLOAD_SECRET_ACCESS_KEY),
+ }
+ : undefined,
+ });
+};
diff --git a/packages/lib/universal/upload/update-file.ts b/packages/lib/universal/upload/update-file.ts
new file mode 100644
index 000000000..e06a8fa5f
--- /dev/null
+++ b/packages/lib/universal/upload/update-file.ts
@@ -0,0 +1,58 @@
+import { base64 } from '@scure/base';
+import { match } from 'ts-pattern';
+
+import { DocumentDataType } from '@documenso/prisma/client';
+
+import { getAbsolutePresignPostUrl } from './server-actions';
+
+export type UpdateFileOptions = {
+ type: DocumentDataType;
+ oldData: string;
+ newData: string;
+};
+
+export const updateFile = async ({ type, oldData, newData }: UpdateFileOptions) => {
+ return await match(type)
+ .with(DocumentDataType.BYTES, () => updateFileWithBytes(newData))
+ .with(DocumentDataType.BYTES_64, () => updateFileWithBytes64(newData))
+ .with(DocumentDataType.S3_PATH, async () => updateFileWithS3(oldData, newData))
+ .exhaustive();
+};
+
+const updateFileWithBytes = (data: string) => {
+ return {
+ type: DocumentDataType.BYTES,
+ data,
+ };
+};
+
+const updateFileWithBytes64 = (data: string) => {
+ const encoder = new TextEncoder();
+
+ const binaryData = encoder.encode(data);
+
+ const asciiData = base64.encode(binaryData);
+
+ return {
+ type: DocumentDataType.BYTES_64,
+ data: asciiData,
+ };
+};
+
+const updateFileWithS3 = async (key: string, data: string) => {
+ const { url } = await getAbsolutePresignPostUrl(key);
+
+ const response = await fetch(url, {
+ method: 'PUT',
+ body: data,
+ });
+
+ if (!response.ok) {
+ throw new Error(`Failed to update file "${key}", failed with status code ${response.status}`);
+ }
+
+ return {
+ type: DocumentDataType.S3_PATH,
+ data: key,
+ };
+};
diff --git a/packages/lib/utils/recipient-formatter.ts b/packages/lib/utils/recipient-formatter.ts
new file mode 100644
index 000000000..da404830b
--- /dev/null
+++ b/packages/lib/utils/recipient-formatter.ts
@@ -0,0 +1,12 @@
+import { Recipient } from '@documenso/prisma/client';
+
+export const recipientInitials = (text: string) =>
+ text
+ .split(' ')
+ .map((name: string) => name.slice(0, 1).toUpperCase())
+ .slice(0, 2)
+ .join('');
+
+export const recipientAbbreviation = (recipient: Recipient) => {
+ return recipientInitials(recipient.name) || recipient.email.slice(0, 1).toUpperCase();
+};
diff --git a/packages/prisma/helper.ts b/packages/prisma/helper.ts
new file mode 100644
index 000000000..865e16239
--- /dev/null
+++ b/packages/prisma/helper.ts
@@ -0,0 +1,52 @@
+///
+
+export const getDatabaseUrl = () => {
+ if (process.env.NEXT_PRIVATE_DATABASE_URL) {
+ return process.env.NEXT_PRIVATE_DATABASE_URL;
+ }
+
+ if (process.env.POSTGRES_URL) {
+ process.env.NEXT_PRIVATE_DATABASE_URL = process.env.POSTGRES_URL;
+ process.env.NEXT_PRIVATE_DIRECT_DATABASE_URL = process.env.POSTGRES_URL;
+ }
+
+ if (process.env.DATABASE_URL) {
+ process.env.NEXT_PRIVATE_DATABASE_URL = process.env.DATABASE_URL;
+ process.env.NEXT_PRIVATE_DIRECT_DATABASE_URL = process.env.DATABASE_URL;
+ }
+
+ if (process.env.POSTGRES_PRISMA_URL) {
+ process.env.NEXT_PRIVATE_DATABASE_URL = process.env.POSTGRES_PRISMA_URL;
+ }
+
+ if (process.env.POSTGRES_URL_NON_POOLING) {
+ process.env.NEXT_PRIVATE_DIRECT_DATABASE_URL = process.env.POSTGRES_URL_NON_POOLING;
+ }
+
+ // We change the protocol from `postgres:` to `https:` so we can construct a easily
+ // mofifiable URL.
+ const url = new URL(process.env.NEXT_PRIVATE_DATABASE_URL.replace('postgres://', 'https://'));
+
+ // If we're using a connection pool, we need to let Prisma know that
+ // we're using PgBouncer.
+ if (process.env.NEXT_PRIVATE_DATABASE_URL !== process.env.NEXT_PRIVATE_DIRECT_DATABASE_URL) {
+ url.searchParams.set('pgbouncer', 'true');
+
+ process.env.NEXT_PRIVATE_DATABASE_URL = url.toString().replace('https://', 'postgres://');
+ }
+
+ // Support for neon.tech (Neon Database)
+ if (url.hostname.endsWith('neon.tech')) {
+ const [projectId, ...rest] = url.hostname.split('.');
+
+ if (!projectId.endsWith('-pooler')) {
+ url.hostname = `${projectId}-pooler.${rest.join('.')}`;
+ }
+
+ url.searchParams.set('pgbouncer', 'true');
+
+ process.env.NEXT_PRIVATE_DATABASE_URL = url.toString().replace('https://', 'postgres://');
+ }
+
+ return process.env.NEXT_PRIVATE_DATABASE_URL;
+};
diff --git a/packages/prisma/index.ts b/packages/prisma/index.ts
index 93a334caa..b9e290add 100644
--- a/packages/prisma/index.ts
+++ b/packages/prisma/index.ts
@@ -1,5 +1,7 @@
import { PrismaClient } from '@prisma/client';
+import { getDatabaseUrl } from './helper';
+
declare global {
// We need `var` to declare a global variable in TypeScript
// eslint-disable-next-line no-var
@@ -7,9 +9,13 @@ declare global {
}
if (!globalThis.prisma) {
- globalThis.prisma = new PrismaClient();
+ globalThis.prisma = new PrismaClient({ datasourceUrl: getDatabaseUrl() });
}
-export const prisma = globalThis.prisma || new PrismaClient();
+export const prisma =
+ globalThis.prisma ||
+ new PrismaClient({
+ datasourceUrl: getDatabaseUrl(),
+ });
export const getPrismaClient = () => prisma;
diff --git a/packages/prisma/migrations/20230907041233_add_document_data_table/migration.sql b/packages/prisma/migrations/20230907041233_add_document_data_table/migration.sql
new file mode 100644
index 000000000..f2c69c4ed
--- /dev/null
+++ b/packages/prisma/migrations/20230907041233_add_document_data_table/migration.sql
@@ -0,0 +1,19 @@
+-- CreateEnum
+CREATE TYPE "DocumentDataType" AS ENUM ('S3_PATH', 'BYTES', 'BYTES_64');
+
+-- CreateTable
+CREATE TABLE "DocumentData" (
+ "id" TEXT NOT NULL,
+ "type" "DocumentDataType" NOT NULL,
+ "data" TEXT NOT NULL,
+ "initialData" TEXT NOT NULL,
+ "documentId" INTEGER NOT NULL,
+
+ CONSTRAINT "DocumentData_pkey" PRIMARY KEY ("id")
+);
+
+-- CreateIndex
+CREATE UNIQUE INDEX "DocumentData_documentId_key" ON "DocumentData"("documentId");
+
+-- AddForeignKey
+ALTER TABLE "DocumentData" ADD CONSTRAINT "DocumentData_documentId_fkey" FOREIGN KEY ("documentId") REFERENCES "Document"("id") ON DELETE CASCADE ON UPDATE CASCADE;
diff --git a/packages/prisma/migrations/20230907074451_insert_old_data_into_document_data_table/migration.sql b/packages/prisma/migrations/20230907074451_insert_old_data_into_document_data_table/migration.sql
new file mode 100644
index 000000000..899c6e2d2
--- /dev/null
+++ b/packages/prisma/migrations/20230907074451_insert_old_data_into_document_data_table/migration.sql
@@ -0,0 +1,14 @@
+INSERT INTO
+ "DocumentData" ("id", "type", "data", "initialData", "documentId") (
+ SELECT
+ CAST(gen_random_uuid() AS TEXT),
+ 'BYTES_64',
+ d."document",
+ d."document",
+ d."id"
+ FROM
+ "Document" d
+ WHERE
+ d."id" IS NOT NULL
+ AND d."document" IS NOT NULL
+ );
diff --git a/packages/prisma/migrations/20230907075057_user_roles/migration.sql b/packages/prisma/migrations/20230907075057_user_roles/migration.sql
new file mode 100644
index 000000000..f47e48361
--- /dev/null
+++ b/packages/prisma/migrations/20230907075057_user_roles/migration.sql
@@ -0,0 +1,5 @@
+-- CreateEnum
+CREATE TYPE "Role" AS ENUM ('ADMIN', 'USER');
+
+-- AlterTable
+ALTER TABLE "User" ADD COLUMN "roles" "Role"[] DEFAULT ARRAY['USER']::"Role"[];
diff --git a/packages/prisma/migrations/20230907080056_add_created_at_and_updated_at_columns/migration.sql b/packages/prisma/migrations/20230907080056_add_created_at_and_updated_at_columns/migration.sql
new file mode 100644
index 000000000..3d30cb4e1
--- /dev/null
+++ b/packages/prisma/migrations/20230907080056_add_created_at_and_updated_at_columns/migration.sql
@@ -0,0 +1,19 @@
+-- AlterTable
+ALTER TABLE "Document" ADD COLUMN "createdAt" TIMESTAMP(3);
+
+-- AlterTable
+ALTER TABLE "Document" ADD COLUMN "updatedAt" TIMESTAMP(3);
+
+-- DefaultValues
+UPDATE "Document"
+SET
+ "createdAt" = COALESCE("created"::TIMESTAMP, NOW()),
+ "updatedAt" = COALESCE("created"::TIMESTAMP, NOW());
+
+-- AlterColumn
+ALTER TABLE "Document" ALTER COLUMN "createdAt" SET DEFAULT NOW();
+ALTER TABLE "Document" ALTER COLUMN "createdAt" SET NOT NULL;
+
+-- AlterColumn
+ALTER TABLE "Document" ALTER COLUMN "updatedAt" SET DEFAULT NOW();
+ALTER TABLE "Document" ALTER COLUMN "updatedAt" SET NOT NULL;
diff --git a/packages/prisma/migrations/20230907082622_remove_old_document_data/migration.sql b/packages/prisma/migrations/20230907082622_remove_old_document_data/migration.sql
new file mode 100644
index 000000000..25c794f65
--- /dev/null
+++ b/packages/prisma/migrations/20230907082622_remove_old_document_data/migration.sql
@@ -0,0 +1,8 @@
+/*
+ Warnings:
+
+ - You are about to drop the column `document` on the `Document` table. All the data in the column will be lost.
+
+*/
+-- AlterTable
+ALTER TABLE "Document" DROP COLUMN "document";
diff --git a/packages/prisma/migrations/20230912011344_reverse_document_data_relation/migration.sql b/packages/prisma/migrations/20230912011344_reverse_document_data_relation/migration.sql
new file mode 100644
index 000000000..7a02d4cfe
--- /dev/null
+++ b/packages/prisma/migrations/20230912011344_reverse_document_data_relation/migration.sql
@@ -0,0 +1,23 @@
+-- DropForeignKey
+ALTER TABLE "DocumentData" DROP CONSTRAINT "DocumentData_documentId_fkey";
+
+-- DropIndex
+DROP INDEX "DocumentData_documentId_key";
+
+-- AlterTable
+ALTER TABLE "Document" ADD COLUMN "documentDataId" TEXT;
+
+-- Reverse relation foreign key ids
+UPDATE "Document" SET "documentDataId" = "DocumentData"."id" FROM "DocumentData" WHERE "Document"."id" = "DocumentData"."documentId";
+
+-- AlterColumn
+ALTER TABLE "Document" ALTER COLUMN "documentDataId" SET NOT NULL;
+
+-- AlterTable
+ALTER TABLE "DocumentData" DROP COLUMN "documentId";
+
+-- CreateIndex
+CREATE UNIQUE INDEX "Document_documentDataId_key" ON "Document"("documentDataId");
+
+-- AddForeignKey
+ALTER TABLE "Document" ADD CONSTRAINT "Document_documentDataId_fkey" FOREIGN KEY ("documentDataId") REFERENCES "DocumentData"("id") ON DELETE CASCADE ON UPDATE CASCADE;
diff --git a/packages/prisma/migrations/20230914031347_remove_redundant_created_column/migration.sql b/packages/prisma/migrations/20230914031347_remove_redundant_created_column/migration.sql
new file mode 100644
index 000000000..79902a8e7
--- /dev/null
+++ b/packages/prisma/migrations/20230914031347_remove_redundant_created_column/migration.sql
@@ -0,0 +1,8 @@
+/*
+ Warnings:
+
+ - You are about to drop the column `created` on the `Document` table. All the data in the column will be lost.
+
+*/
+-- AlterTable
+ALTER TABLE "Document" DROP COLUMN "created";
diff --git a/packages/prisma/package.json b/packages/prisma/package.json
index 3ef12787a..958bcde17 100644
--- a/packages/prisma/package.json
+++ b/packages/prisma/package.json
@@ -9,10 +9,18 @@
"format": "prisma format",
"prisma:generate": "prisma generate",
"prisma:migrate-dev": "prisma migrate dev",
- "prisma:migrate-deploy": "prisma migrate deploy"
+ "prisma:migrate-deploy": "prisma migrate deploy",
+ "prisma:seed": "prisma db seed"
+ },
+ "prisma": {
+ "seed": "ts-node --transpileOnly --skipProject ./seed-database.ts"
},
"dependencies": {
- "@prisma/client": "5.0.0",
- "prisma": "5.0.0"
+ "@prisma/client": "5.3.1",
+ "prisma": "5.3.1"
+ },
+ "devDependencies": {
+ "ts-node": "^10.9.1",
+ "typescript": "^5.1.6"
}
}
diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma
index 2e016f5ec..1ff3d7a75 100644
--- a/packages/prisma/schema.prisma
+++ b/packages/prisma/schema.prisma
@@ -13,6 +13,11 @@ enum IdentityProvider {
GOOGLE
}
+enum Role {
+ ADMIN
+ USER
+}
+
model User {
id Int @id @default(autoincrement())
name String?
@@ -21,6 +26,7 @@ model User {
password String?
source String?
signature String?
+ roles Role[] @default([USER])
identityProvider IdentityProvider @default(DOCUMENSO)
accounts Account[]
sessions Session[]
@@ -85,15 +91,33 @@ enum DocumentStatus {
}
model Document {
- id Int @id @default(autoincrement())
- created DateTime @default(now())
- userId Int
- User User @relation(fields: [userId], references: [id], onDelete: Cascade)
- title String
- status DocumentStatus @default(DRAFT)
- document String
- Recipient Recipient[]
- Field Field[]
+ id Int @id @default(autoincrement())
+ userId Int
+ User User @relation(fields: [userId], references: [id], onDelete: Cascade)
+ title String
+ status DocumentStatus @default(DRAFT)
+ Recipient Recipient[]
+ Field Field[]
+ documentDataId String
+ documentData DocumentData @relation(fields: [documentDataId], references: [id], onDelete: Cascade)
+ createdAt DateTime @default(now())
+ updatedAt DateTime @default(now()) @updatedAt
+
+ @@unique([documentDataId])
+}
+
+enum DocumentDataType {
+ S3_PATH
+ BYTES
+ BYTES_64
+}
+
+model DocumentData {
+ id String @id @default(cuid())
+ type DocumentDataType
+ data String
+ initialData String
+ Document Document?
}
enum ReadStatus {
diff --git a/packages/prisma/seed-database.ts b/packages/prisma/seed-database.ts
new file mode 100644
index 000000000..65daa357e
--- /dev/null
+++ b/packages/prisma/seed-database.ts
@@ -0,0 +1,82 @@
+import { DocumentDataType, Role } from '@prisma/client';
+import fs from 'node:fs';
+import path from 'node:path';
+
+import { hashSync } from '@documenso/lib/server-only/auth/hash';
+
+import { prisma } from './index';
+
+const seedDatabase = async () => {
+ const examplePdf = fs
+ .readFileSync(path.join(__dirname, '../../assets/example.pdf'))
+ .toString('base64');
+
+ const exampleUser = await prisma.user.upsert({
+ where: {
+ email: 'example@documenso.com',
+ },
+ create: {
+ name: 'Example User',
+ email: 'example@documenso.com',
+ password: hashSync('password'),
+ roles: [Role.USER],
+ },
+ update: {},
+ });
+
+ const adminUser = await prisma.user.upsert({
+ where: {
+ email: 'admin@documenso.com',
+ },
+ create: {
+ name: 'Admin User',
+ email: 'admin@documenso.com',
+ password: hashSync('password'),
+ roles: [Role.USER, Role.ADMIN],
+ },
+ update: {},
+ });
+
+ const examplePdfData = await prisma.documentData.upsert({
+ where: {
+ id: 'clmn0kv5k0000pe04vcqg5zla',
+ },
+ create: {
+ id: 'clmn0kv5k0000pe04vcqg5zla',
+ type: DocumentDataType.BYTES_64,
+ data: examplePdf,
+ initialData: examplePdf,
+ },
+ update: {},
+ });
+
+ await prisma.document.upsert({
+ where: {
+ id: 1,
+ },
+ create: {
+ id: 1,
+ title: 'Example Document',
+ documentDataId: examplePdfData.id,
+ userId: exampleUser.id,
+ Recipient: {
+ create: {
+ name: String(adminUser.name),
+ email: adminUser.email,
+ token: Math.random().toString(36).slice(2, 9),
+ },
+ },
+ },
+ update: {},
+ });
+};
+
+seedDatabase()
+ .then(() => {
+ console.log('Database seeded');
+ process.exit(0);
+ })
+ .catch((error) => {
+ console.error(error);
+ process.exit(1);
+ });
diff --git a/packages/prisma/types/document-with-data.ts b/packages/prisma/types/document-with-data.ts
new file mode 100644
index 000000000..d52987552
--- /dev/null
+++ b/packages/prisma/types/document-with-data.ts
@@ -0,0 +1,5 @@
+import { Document, DocumentData } from '@documenso/prisma/client';
+
+export type DocumentWithData = Document & {
+ documentData?: DocumentData | null;
+};
diff --git a/packages/trpc/server/document-router/router.ts b/packages/trpc/server/document-router/router.ts
index f20643327..e436bb391 100644
--- a/packages/trpc/server/document-router/router.ts
+++ b/packages/trpc/server/document-router/router.ts
@@ -1,17 +1,81 @@
import { TRPCError } from '@trpc/server';
+import { createDocument } from '@documenso/lib/server-only/document/create-document';
+import { getDocumentById } from '@documenso/lib/server-only/document/get-document-by-id';
+import { getDocumentAndSenderByToken } from '@documenso/lib/server-only/document/get-document-by-token';
import { sendDocument } from '@documenso/lib/server-only/document/send-document';
import { setFieldsForDocument } from '@documenso/lib/server-only/field/set-fields-for-document';
import { setRecipientsForDocument } from '@documenso/lib/server-only/recipient/set-recipients-for-document';
-import { authenticatedProcedure, router } from '../trpc';
+import { authenticatedProcedure, procedure, router } from '../trpc';
import {
+ ZCreateDocumentMutationSchema,
+ ZGetDocumentByIdQuerySchema,
+ ZGetDocumentByTokenQuerySchema,
ZSendDocumentMutationSchema,
ZSetFieldsForDocumentMutationSchema,
ZSetRecipientsForDocumentMutationSchema,
} from './schema';
export const documentRouter = router({
+ getDocumentById: authenticatedProcedure
+ .input(ZGetDocumentByIdQuerySchema)
+ .query(async ({ input, ctx }) => {
+ try {
+ const { id } = input;
+
+ return await getDocumentById({
+ id,
+ userId: ctx.user.id,
+ });
+ } catch (err) {
+ console.error(err);
+
+ throw new TRPCError({
+ code: 'BAD_REQUEST',
+ message: 'We were unable to find this document. Please try again later.',
+ });
+ }
+ }),
+
+ getDocumentByToken: procedure.input(ZGetDocumentByTokenQuerySchema).query(async ({ input }) => {
+ try {
+ const { token } = input;
+
+ return await getDocumentAndSenderByToken({
+ token,
+ });
+ } catch (err) {
+ console.error(err);
+
+ throw new TRPCError({
+ code: 'BAD_REQUEST',
+ message: 'We were unable to find this document. Please try again later.',
+ });
+ }
+ }),
+
+ createDocument: authenticatedProcedure
+ .input(ZCreateDocumentMutationSchema)
+ .mutation(async ({ input, ctx }) => {
+ try {
+ const { title, documentDataId } = input;
+
+ return await createDocument({
+ userId: ctx.user.id,
+ title,
+ documentDataId,
+ });
+ } catch (err) {
+ console.error(err);
+
+ throw new TRPCError({
+ code: 'BAD_REQUEST',
+ message: 'We were unable to create this document. Please try again later.',
+ });
+ }
+ }),
+
setRecipientsForDocument: authenticatedProcedure
.input(ZSetRecipientsForDocumentMutationSchema)
.mutation(async ({ input, ctx }) => {
diff --git a/packages/trpc/server/document-router/schema.ts b/packages/trpc/server/document-router/schema.ts
index 18c3a93ae..c95417306 100644
--- a/packages/trpc/server/document-router/schema.ts
+++ b/packages/trpc/server/document-router/schema.ts
@@ -2,6 +2,25 @@ import { z } from 'zod';
import { FieldType } from '@documenso/prisma/client';
+export const ZGetDocumentByIdQuerySchema = z.object({
+ id: z.number().min(1),
+});
+
+export type TGetDocumentByIdQuerySchema = z.infer;
+
+export const ZGetDocumentByTokenQuerySchema = z.object({
+ token: z.string().min(1),
+});
+
+export type TGetDocumentByTokenQuerySchema = z.infer;
+
+export const ZCreateDocumentMutationSchema = z.object({
+ title: z.string().min(1),
+ documentDataId: z.string().min(1),
+});
+
+export type TCreateDocumentMutationSchema = z.infer;
+
export const ZSetRecipientsForDocumentMutationSchema = z.object({
documentId: z.number(),
recipients: z.array(
diff --git a/packages/tsconfig/process-env.d.ts b/packages/tsconfig/process-env.d.ts
index 6c031858d..d32b9984a 100644
--- a/packages/tsconfig/process-env.d.ts
+++ b/packages/tsconfig/process-env.d.ts
@@ -1,6 +1,7 @@
declare namespace NodeJS {
export interface ProcessEnv {
- NEXT_PUBLIC_SITE_URL?: string;
+ NEXT_PUBLIC_WEBAPP_URL?: string;
+ NEXT_PUBLIC_MARKETING_URL?: string;
NEXT_PRIVATE_GOOGLE_CLIENT_ID?: string;
NEXT_PRIVATE_GOOGLE_CLIENT_SECRET?: string;
@@ -13,6 +14,13 @@ declare namespace NodeJS {
NEXT_PRIVATE_STRIPE_API_KEY: string;
NEXT_PRIVATE_STRIPE_WEBHOOK_SECRET: string;
+ NEXT_PUBLIC_UPLOAD_TRANSPORT?: 'database' | 's3';
+ NEXT_PRIVATE_UPLOAD_ENDPOINT?: string;
+ NEXT_PRIVATE_UPLOAD_REGION?: string;
+ NEXT_PRIVATE_UPLOAD_BUCKET?: string;
+ NEXT_PRIVATE_UPLOAD_ACCESS_KEY_ID?: string;
+ NEXT_PRIVATE_UPLOAD_SECRET_ACCESS_KEY?: string;
+
NEXT_PRIVATE_SMTP_TRANSPORT?: 'mailchannels' | 'smtp-auth' | 'smtp-api';
NEXT_PRIVATE_MAILCHANNELS_API_KEY?: string;
@@ -33,5 +41,19 @@ declare namespace NodeJS {
NEXT_PRIVATE_SMTP_FROM_NAME?: string;
NEXT_PRIVATE_SMTP_FROM_ADDRESS?: string;
+
+ /**
+ * Vercel environment variables
+ */
+ VERCEL?: string;
+ VERCEL_ENV?: 'production' | 'development' | 'preview';
+ VERCEL_URL?: string;
+
+ DEPLOYMENT_TARGET?: 'webapp' | 'marketing';
+
+ POSTGRES_URL?: string;
+ DATABASE_URL?: string;
+ POSTGRES_PRISMA_URL?: string;
+ POSTGRES_URL_NON_POOLING?: string;
}
}
diff --git a/packages/ui/package.json b/packages/ui/package.json
index 039687491..5a60f6c07 100644
--- a/packages/ui/package.json
+++ b/packages/ui/package.json
@@ -15,6 +15,7 @@
"lint": "eslint \"**/*.ts*\""
},
"devDependencies": {
+ "@documenso/tailwind-config": "*",
"@documenso/tsconfig": "*",
"@types/react": "18.2.18",
"@types/react-dom": "18.2.7",
@@ -22,6 +23,7 @@
"typescript": "^5.1.6"
},
"dependencies": {
+ "@documenso/lib": "*",
"@radix-ui/react-accordion": "^1.1.1",
"@radix-ui/react-alert-dialog": "^1.0.3",
"@radix-ui/react-aspect-ratio": "^1.0.2",
@@ -51,7 +53,6 @@
"class-variance-authority": "^0.6.0",
"clsx": "^1.2.1",
"cmdk": "^0.2.0",
- "date-fns": "^2.30.0",
"framer-motion": "^10.12.8",
"lucide-react": "^0.214.0",
"next": "13.4.12",
@@ -61,4 +62,4 @@
"tailwind-merge": "^1.12.0",
"tailwindcss-animate": "^1.0.5"
}
-}
\ No newline at end of file
+}
diff --git a/packages/ui/primitives/document-flow/add-fields.tsx b/packages/ui/primitives/document-flow/add-fields.tsx
index 5de43c411..ac938b41a 100644
--- a/packages/ui/primitives/document-flow/add-fields.tsx
+++ b/packages/ui/primitives/document-flow/add-fields.tsx
@@ -5,12 +5,12 @@ import { useCallback, useEffect, useRef, useState } from 'react';
import { Caveat } from 'next/font/google';
import { Check, ChevronsUpDown, Info } from 'lucide-react';
-import { nanoid } from 'nanoid';
import { useFieldArray, useForm } from 'react-hook-form';
import { getBoundingClientRect } from '@documenso/lib/client-only/get-bounding-client-rect';
import { useDocumentElement } from '@documenso/lib/client-only/hooks/use-document-element';
import { PDF_VIEWER_PAGE_SELECTOR } from '@documenso/lib/constants/pdf-viewer';
+import { nanoid } from '@documenso/lib/universal/id';
import { Field, FieldType, Recipient, SendStatus } from '@documenso/prisma/client';
import { cn } from '@documenso/ui/lib/utils';
import { Button } from '@documenso/ui/primitives/button';
diff --git a/packages/ui/primitives/document-flow/add-signers.tsx b/packages/ui/primitives/document-flow/add-signers.tsx
index fe52627fd..412fbfc19 100644
--- a/packages/ui/primitives/document-flow/add-signers.tsx
+++ b/packages/ui/primitives/document-flow/add-signers.tsx
@@ -5,9 +5,9 @@ import React, { useId } from 'react';
import { zodResolver } from '@hookform/resolvers/zod';
import { AnimatePresence, motion } from 'framer-motion';
import { Plus, Trash } from 'lucide-react';
-import { nanoid } from 'nanoid';
import { Controller, useFieldArray, useForm } from 'react-hook-form';
+import { nanoid } from '@documenso/lib/universal/id';
import { Field, Recipient, SendStatus } from '@documenso/prisma/client';
import { Button } from '@documenso/ui/primitives/button';
import { FormErrorMessage } from '@documenso/ui/primitives/form/form-error-message';
diff --git a/scripts/remap-vercel-env.cjs b/scripts/remap-vercel-env.cjs
new file mode 100644
index 000000000..95e60cde8
--- /dev/null
+++ b/scripts/remap-vercel-env.cjs
@@ -0,0 +1,45 @@
+/** @typedef {import('@documenso/tsconfig/process-env')} */
+
+/**
+ * Remap Vercel environment variables to our defined Next.js environment variables.
+ *
+ * @deprecated This is no longer needed because we can't inject runtime environment variables via next.config.js
+ *
+ * @returns {void}
+ */
+const remapVercelEnv = () => {
+ if (!process.env.VERCEL || !process.env.DEPLOYMENT_TARGET) {
+ return;
+ }
+
+ if (process.env.POSTGRES_URL) {
+ process.env.NEXT_PRIVATE_DATABASE_URL = process.env.POSTGRES_URL;
+ }
+
+ if (process.env.POSTGRES_URL_NON_POOLING) {
+ process.env.NEXT_PRIVATE_DIRECT_DATABASE_URL = process.env.POSTGRES_URL_NON_POOLING;
+ }
+
+ // If we're using a connection pool, we need to let Prisma know that
+ // we're using PgBouncer.
+ if (process.env.NEXT_PRIVATE_DATABASE_URL !== process.env.NEXT_PRIVATE_DIRECT_DATABASE_URL) {
+ const url = new URL(process.env.NEXT_PRIVATE_DATABASE_URL);
+
+ url.searchParams.set('pgbouncer', 'true');
+
+ process.env.NEXT_PRIVATE_DATABASE_URL = url.toString();
+ }
+
+ if (process.env.VERCEL_ENV !== 'production' && process.env.DEPLOYMENT_TARGET === 'webapp') {
+ process.env.NEXTAUTH_URL = `https://${process.env.VERCEL_URL}`;
+ process.env.NEXT_PUBLIC_WEBAPP_URL = `https://${process.env.VERCEL_URL}`;
+ }
+
+ if (process.env.VERCEL_ENV !== 'production' && process.env.DEPLOYMENT_TARGET === 'marketing') {
+ process.env.NEXT_PUBLIC_MARKETING_URL = `https://${process.env.VERCEL_URL}`;
+ }
+};
+
+module.exports = {
+ remapVercelEnv,
+};
diff --git a/scripts/vercel.sh b/scripts/vercel.sh
new file mode 100755
index 000000000..e4ab23622
--- /dev/null
+++ b/scripts/vercel.sh
@@ -0,0 +1,107 @@
+#!/usr/bin/env bash
+
+# Exit on error.
+set -eo pipefail
+
+# Get the directory of this script, regardless of where it is called from.
+SCRIPT_DIR="$(readlink -f "$(dirname "$0")")"
+
+
+function log() {
+ echo "[VercelBuild]: $1"
+}
+
+function build_webapp() {
+ log "Building webapp for $VERCEL_ENV"
+
+ remap_database_integration
+
+ npm run prisma:generate --workspace=@documenso/prisma
+ npm run prisma:migrate-deploy --workspace=@documenso/prisma
+
+ if [[ "$VERCEL_ENV" != "production" ]]; then
+ log "Seeding database for $VERCEL_ENV"
+
+ npm run prisma:seed --workspace=@documenso/prisma
+ fi
+
+ npm run build -- --filter @documenso/web
+}
+
+function remap_webapp_env() {
+ if [[ "$VERCEL_ENV" != "production" ]]; then
+ log "Remapping webapp environment variables for $VERCEL_ENV"
+
+ export NEXTAUTH_URL="https://$VERCEL_URL"
+ export NEXT_PUBLIC_WEBAPP_URL="https://$VERCEL_URL"
+ fi
+}
+
+function build_marketing() {
+ log "Building marketing for $VERCEL_ENV"
+
+ remap_database_integration
+
+ npm run prisma:generate --workspace=@documenso/prisma
+ npm run build -- --filter @documenso/marketing
+}
+
+function remap_marketing_env() {
+ if [[ "$VERCEL_ENV" != "production" ]]; then
+ log "Remapping marketing environment variables for $VERCEL_ENV"
+
+ export NEXT_PUBLIC_MARKETING_URL="https://$VERCEL_URL"
+ fi
+}
+
+function remap_database_integration() {
+ log "Remapping Supabase integration for $VERCEL_ENV"
+
+ if [[ ! -z "$POSTGRES_URL" ]]; then
+ export NEXT_PRIVATE_DATABASE_URL="$POSTGRES_URL"
+ export NEXT_PRIVATE_DIRECT_DATABASE_URL="$POSTGRES_URL"
+ fi
+
+ if [[ ! -z "$DATABASE_URL" ]]; then
+ export NEXT_PRIVATE_DATABASE_URL="$DATABASE_URL"
+ export NEXT_PRIVATE_DIRECT_DATABASE_URL="$DATABASE_URL"
+ fi
+
+ if [[ ! -z "$POSTGRES_URL_NON_POOLING" ]]; then
+ export NEXT_PRIVATE_DATABASE_URL="$POSTGRES_URL?pgbouncer=true"
+ export NEXT_PRIVATE_DIRECT_DATABASE_URL="$POSTGRES_URL_NON_POOLING"
+ fi
+
+
+ if [[ "$NEXT_PRIVATE_DATABASE_URL" == *"neon.tech"* ]]; then
+ log "Remapping for Neon integration"
+
+ PROJECT_ID="$(echo "$PGHOST" | cut -d'.' -f1)"
+ PGBOUNCER_HOST="$(echo "$PGHOST" | sed "s/${PROJECT_ID}/${PROJECT_ID}-pooler/")"
+
+ export NEXT_PRIVATE_DATABASE_URL="postgres://${PGUSER}:${PGPASSWORD}@${PGBOUNCER_HOST}/${PGDATABASE}?pgbouncer=true"
+ fi
+}
+
+# Navigate to the root of the project.
+cd "$SCRIPT_DIR/.."
+
+# Check if the script is running on Vercel.
+if [[ -z "$VERCEL" ]]; then
+ log "ERROR - This script must be run as part of the Vercel build process."
+ exit 1
+fi
+
+case "$DEPLOYMENT_TARGET" in
+ "webapp")
+ build_webapp
+ ;;
+ "marketing")
+ build_marketing
+ ;;
+ *)
+ log "ERROR - Missing or invalid DEPLOYMENT_TARGET environment variable."
+ log "ERROR - DEPLOYMENT_TARGET must be either 'webapp' or 'marketing'."
+ exit 1
+ ;;
+esac
diff --git a/turbo.json b/turbo.json
index b93b071ea..522f07978 100644
--- a/turbo.json
+++ b/turbo.json
@@ -13,22 +13,29 @@
},
"globalDependencies": ["**/.env.*local"],
"globalEnv": [
+ "APP_VERSION",
"E2E_TEST_USERNAME",
"E2E_TEST_USER_EMAIL",
"E2E_TEST_USER_PASSWORD",
"NEXTAUTH_URL",
"NEXTAUTH_SECRET",
- "NEXT_PUBLIC_APP_URL",
- "NEXT_PUBLIC_SITE_URL",
+ "NEXT_PUBLIC_WEBAPP_URL",
+ "NEXT_PUBLIC_MARKETING_URL",
"NEXT_PUBLIC_POSTHOG_KEY",
"NEXT_PUBLIC_POSTHOG_HOST",
"NEXT_PUBLIC_FEATURE_BILLING_ENABLED",
"NEXT_PUBLIC_STRIPE_COMMUNITY_PLAN_YEARLY_PRICE_ID",
"NEXT_PUBLIC_STRIPE_COMMUNITY_PLAN_MONTHLY_PRICE_ID",
"NEXT_PRIVATE_DATABASE_URL",
- "NEXT_PRIVATE_NEXT_AUTH_SECRET",
+ "NEXT_PRIVATE_DIRECT_DATABASE_URL",
"NEXT_PRIVATE_GOOGLE_CLIENT_ID",
"NEXT_PRIVATE_GOOGLE_CLIENT_SECRET",
+ "NEXT_PUBLIC_UPLOAD_TRANSPORT",
+ "NEXT_PRIVATE_UPLOAD_ENDPOINT",
+ "NEXT_PRIVATE_UPLOAD_REGION",
+ "NEXT_PRIVATE_UPLOAD_BUCKET",
+ "NEXT_PRIVATE_UPLOAD_ACCESS_KEY_ID",
+ "NEXT_PRIVATE_UPLOAD_SECRET_ACCESS_KEY",
"NEXT_PRIVATE_SMTP_TRANSPORT",
"NEXT_PRIVATE_MAILCHANNELS_API_KEY",
"NEXT_PRIVATE_MAILCHANNELS_ENDPOINT",
@@ -44,6 +51,15 @@
"NEXT_PRIVATE_SMTP_SECURE",
"NEXT_PRIVATE_SMTP_FROM_NAME",
"NEXT_PRIVATE_SMTP_FROM_ADDRESS",
- "NEXT_PRIVATE_STRIPE_API_KEY"
+ "NEXT_PRIVATE_STRIPE_API_KEY",
+
+ "VERCEL",
+ "VERCEL_ENV",
+ "VERCEL_URL",
+ "DEPLOYMENT_TARGET",
+ "POSTGRES_URL",
+ "DATABASE_URL",
+ "POSTGRES_PRISMA_URL",
+ "POSTGRES_URL_NON_POOLING"
]
}