From f2aeaf57e885a592f4bbff459e6de2107af0af12 Mon Sep 17 00:00:00 2001 From: vsmart-06 Date: Sat, 8 Nov 2025 14:28:45 -0600 Subject: [PATCH 1/3] Add new invoices to database and create stripe customers when required --- src/api/functions/stripe.ts | 153 ++++++++++++++++++++++++++++++++++++ src/api/routes/stripe.ts | 32 ++++++++ src/common/types/stripe.ts | 21 ++++- 3 files changed, 205 insertions(+), 1 deletion(-) diff --git a/src/api/functions/stripe.ts b/src/api/functions/stripe.ts index 25005085..079b4309 100644 --- a/src/api/functions/stripe.ts +++ b/src/api/functions/stripe.ts @@ -2,6 +2,16 @@ import { isProd } from "api/utils.js"; import { InternalServerError, ValidationError } from "common/errors/index.js"; import { capitalizeFirstLetter } from "common/types/roomRequest.js"; import Stripe from "stripe"; +import { createLock, IoredisAdapter, type SimpleLock } from "redlock-universal"; +import { Redis } from "api/types.js"; +import { + TransactWriteItemsCommand, + QueryCommand, + UpdateItemCommand, + DynamoDBClient, +} from "@aws-sdk/client-dynamodb"; +import { genericConfig } from "common/config.js"; +import { marshall } from "@aws-sdk/util-dynamodb"; export type StripeLinkCreateParams = { invoiceId: string; @@ -325,3 +335,146 @@ export const createStripeCustomer = async ({ ); return customer.id; }; + +export type checkCustomerParams = { + acmOrg: string; + emailDomain: string; + redisClient: Redis; + dynamoClient: DynamoDBClient; + customerEmail: string; + customerName: string; + stripeApiKey: string; +}; + +export const checkOrCreateCustomer = async ({ + acmOrg, + emailDomain, + redisClient, + dynamoClient, + customerEmail, + customerName, + stripeApiKey, +}: checkCustomerParams): Promise => { + const lock = createLock({ + adapter: new IoredisAdapter(redisClient), + key: `stripe:${acmOrg}:${emailDomain}`, + retryAttempts: 5, + retryDelay: 300, + }) as SimpleLock; + + const pk = `${acmOrg}#${emailDomain}`; + + return await lock.using(async () => { + const checkCustomer = new QueryCommand({ + TableName: genericConfig.StripePaymentsDynamoTableName, + KeyConditionExpression: "primaryKey = :pk AND sortKey = :sk", + ExpressionAttributeValues: { + ":pk": { S: pk }, + ":sk": { S: "CUSTOMER" }, + }, + ConsistentRead: true, + }); + + const customerResponse = await dynamoClient.send(checkCustomer); + + if (customerResponse.Count === 0) { + const customer = await createStripeCustomer({ + email: customerEmail, + name: customerName, + stripeApiKey, + }); + const createCustomer = new TransactWriteItemsCommand({ + TransactItems: [ + { + Put: { + TableName: genericConfig.StripePaymentsDynamoTableName, + Item: marshall( + { + primaryKey: pk, + sortKey: "CUSTOMER", + stripeCustomerId: customer, + totalAmount: 0, + createdAt: new Date().toISOString(), + }, + { removeUndefinedValues: true }, + ), + }, + }, + ], + }); + await dynamoClient.send(createCustomer); + return customer; + } + + return customerResponse.Items![0].stripeCustomerId.S!; + }); +}; + +export type InvoiceAddParams = { + acmOrg: string; + emailDomain: string; + invoiceId: string; + invoiceAmountUsd: number; + redisClient: Redis; + dynamoClient: DynamoDBClient; + contactEmail: string; + contactName: string; + stripeApiKey: string; +}; + +export const addInvoice = async ({ + contactName, + contactEmail, + acmOrg, + invoiceId, + invoiceAmountUsd, + emailDomain, + redisClient, + dynamoClient, + stripeApiKey, +}: InvoiceAddParams): Promise => { + const pk = `${acmOrg}#${emailDomain}`; + + const customerId = await checkOrCreateCustomer({ + acmOrg, + emailDomain, + redisClient, + dynamoClient, + customerEmail: contactEmail, + customerName: contactName, + stripeApiKey, + }); + + const dynamoCommand = new TransactWriteItemsCommand({ + TransactItems: [ + { + Put: { + TableName: genericConfig.StripePaymentsDynamoTableName, + Item: marshall( + { + primaryKey: pk, + sortKey: `CHARGE#${invoiceId}`, + invoiceAmtUsd: invoiceAmountUsd, + createdAt: new Date().toISOString(), + }, + { removeUndefinedValues: true }, + ), + }, + Update: { + TableName: genericConfig.StripePaymentsDynamoTableName, + Key: { + primaryKey: { S: pk }, + sortKey: { S: "CUSTOMER" }, + }, + UpdateExpression: "SET totalAmount = totalAmount + :inc", + ExpressionAttributeValues: { + ":inc": { N: invoiceAmountUsd.toString() }, + }, + }, + }, + ], + }); + + await dynamoClient.send(dynamoCommand); + return customerId; +}; diff --git a/src/api/routes/stripe.ts b/src/api/routes/stripe.ts index f69676b3..90cdff40 100644 --- a/src/api/routes/stripe.ts +++ b/src/api/routes/stripe.ts @@ -9,6 +9,7 @@ import { marshall, unmarshall } from "@aws-sdk/util-dynamodb"; import { withRoles, withTags } from "api/components/index.js"; import { buildAuditLogTransactPut } from "api/functions/auditLog.js"; import { + addInvoice, createStripeLink, deactivateStripeLink, deactivateStripeProduct, @@ -16,6 +17,7 @@ import { getPaymentMethodForPaymentIntent, paymentMethodTypeToFriendlyName, StripeLinkCreateParams, + InvoiceAddParams, SupportedStripePaymentMethod, supportedStripePaymentMethods, } from "api/functions/stripe.js"; @@ -36,6 +38,7 @@ import { AppRoles } from "common/roles.js"; import { invoiceLinkPostResponseSchema, invoiceLinkPostRequestSchema, + createInvoicePostRequestSchema, invoiceLinkGetResponseSchema, } from "common/types/stripe.js"; import { FastifyPluginAsync } from "fastify"; @@ -110,6 +113,35 @@ const stripeRoutes: FastifyPluginAsync = async (fastify, _options) => { reply.status(200).send(parsed); }, ); + fastify.withTypeProvider().post( + "/createInvoice", + { + schema: withRoles( + [AppRoles.STRIPE_LINK_CREATOR], + withTags(["Stripe"], { + summary: "Create a new invoice.", + body: createInvoicePostRequestSchema, + }), + ), + onRequest: fastify.authorizeFromSchema, + }, + async (request, reply) => { + const emailDomain = request.body.contactEmail.split("@").at(-1); + + const secretApiConfig = fastify.secretConfig; + const payload: InvoiceAddParams = { + ...request.body, + emailDomain: emailDomain!, + redisClient: fastify.redisClient, + dynamoClient: fastify.dynamoClient, + stripeApiKey: secretApiConfig.stripe_secret_key as string, + }; + + const stripeCustomer = await addInvoice(payload); + + reply.status(201).send({ link: "" }); + }, + ); fastify.withTypeProvider().post( "/paymentLinks", { diff --git a/src/common/types/stripe.ts b/src/common/types/stripe.ts index 7439ec55..88731b7f 100644 --- a/src/common/types/stripe.ts +++ b/src/common/types/stripe.ts @@ -19,6 +19,25 @@ export type PostInvoiceLinkRequest = z.infer< export type PostInvoiceLinkResponse = z.infer< typeof invoiceLinkPostResponseSchema>; +export const createInvoicePostResponseSchema = z.object({ + id: z.string().min(1), + link: z.url() +}); + +export const createInvoicePostRequestSchema = z.object({ + invoiceId: z.string().min(1), + invoiceAmountUsd: z.number().min(50), + contactName: z.string().min(1), + contactEmail: z.email(), + acmOrg: z.string().min(1) +}); + +export type PostCreateInvoiceRequest = z.infer< + typeof createInvoicePostRequestSchema>; + + +export type PostCreateInvoiceResponse = z.infer< + typeof createInvoicePostResponseSchema>; export const invoiceLinkGetResponseSchema = z.array( z.object({ @@ -33,4 +52,4 @@ export const invoiceLinkGetResponseSchema = z.array( ); export type GetInvoiceLinksResponse = z.infer< - typeof invoiceLinkGetResponseSchema>; \ No newline at end of file + typeof invoiceLinkGetResponseSchema>; From 7df5f737f64463b9a82a921b80f80d755dc8f33a Mon Sep 17 00:00:00 2001 From: Aditya Kshirsagar Date: Mon, 17 Nov 2025 12:59:38 -0600 Subject: [PATCH 2/3] updated to update customer info and also send metadata for payment succeeded webhook --- src/api/functions/stripe.ts | 96 ++++++++++++++++++++++++++++++++++--- src/api/routes/stripe.ts | 38 ++++++++++++++- src/common/types/stripe.ts | 23 +++++++++ 3 files changed, 148 insertions(+), 9 deletions(-) diff --git a/src/api/functions/stripe.ts b/src/api/functions/stripe.ts index 079b4309..3fc85e36 100644 --- a/src/api/functions/stripe.ts +++ b/src/api/functions/stripe.ts @@ -346,6 +346,13 @@ export type checkCustomerParams = { stripeApiKey: string; }; +export type CheckOrCreateResult = { + customerId: string; + needsConfirmation?: boolean; + current?: { name?: string | null; email?: string | null }; + incoming?: { name: string; email: string }; +}; + export const checkOrCreateCustomer = async ({ acmOrg, emailDomain, @@ -354,7 +361,7 @@ export const checkOrCreateCustomer = async ({ customerEmail, customerName, stripeApiKey, -}: checkCustomerParams): Promise => { +}: checkCustomerParams): Promise => { const lock = createLock({ adapter: new IoredisAdapter(redisClient), key: `stripe:${acmOrg}:${emailDomain}`, @@ -363,6 +370,7 @@ export const checkOrCreateCustomer = async ({ }) as SimpleLock; const pk = `${acmOrg}#${emailDomain}`; + const normalizedEmail = customerEmail.trim().toLowerCase(); return await lock.using(async () => { const checkCustomer = new QueryCommand({ @@ -379,10 +387,11 @@ export const checkOrCreateCustomer = async ({ if (customerResponse.Count === 0) { const customer = await createStripeCustomer({ - email: customerEmail, + email: normalizedEmail, name: customerName, stripeApiKey, }); + const createCustomer = new TransactWriteItemsCommand({ TransactItems: [ { @@ -398,15 +407,84 @@ export const checkOrCreateCustomer = async ({ }, { removeUndefinedValues: true }, ), + ConditionExpression: + "attribute_not_exists(primaryKey) AND attribute_not_exists(sortKey)", + }, + }, + { + Put: { + TableName: genericConfig.StripePaymentsDynamoTableName, + Item: marshall( + { + primaryKey: pk, + sortKey: `EMAIL#${normalizedEmail}`, + stripeCustomerId: customer, + createdAt: new Date().toISOString(), + }, + { removeUndefinedValues: true }, + ), + ConditionExpression: + "attribute_not_exists(primaryKey) AND attribute_not_exists(sortKey)", }, }, ], }); await dynamoClient.send(createCustomer); - return customer; + return { customerId: customer }; } - return customerResponse.Items![0].stripeCustomerId.S!; + const existingCustomerId = (customerResponse.Items![0] as any) + .stripeCustomerId.S as string; + + const stripeClient = new Stripe(stripeApiKey); + const stripeCustomer = + await stripeClient.customers.retrieve(existingCustomerId); + + const liveName = + "name" in stripeCustomer ? (stripeCustomer as any).name : null; + const liveEmail = + "email" in stripeCustomer ? (stripeCustomer as any).email : null; + + const needsConfirmation = + (!!liveName && liveName !== customerName) || + (!!liveEmail && liveEmail.toLowerCase() !== normalizedEmail); + + const ensureEmailMap = new TransactWriteItemsCommand({ + TransactItems: [ + { + Put: { + TableName: genericConfig.StripePaymentsDynamoTableName, + Item: marshall( + { + primaryKey: pk, + sortKey: `EMAIL#${normalizedEmail}`, + stripeCustomerId: existingCustomerId, + createdAt: new Date().toISOString(), + }, + { removeUndefinedValues: true }, + ), + ConditionExpression: + "attribute_not_exists(primaryKey) AND attribute_not_exists(sortKey)", + }, + }, + ], + }); + try { + await dynamoClient.send(ensureEmailMap); + } catch (e) { + // ignore + } + + if (needsConfirmation) { + return { + customerId: existingCustomerId, + needsConfirmation: true, + current: { name: liveName ?? null, email: liveEmail ?? null }, + incoming: { name: customerName, email: normalizedEmail }, + }; + } + + return { customerId: existingCustomerId }; }); }; @@ -432,10 +510,10 @@ export const addInvoice = async ({ redisClient, dynamoClient, stripeApiKey, -}: InvoiceAddParams): Promise => { +}: InvoiceAddParams): Promise => { const pk = `${acmOrg}#${emailDomain}`; - const customerId = await checkOrCreateCustomer({ + const result = await checkOrCreateCustomer({ acmOrg, emailDomain, redisClient, @@ -445,6 +523,10 @@ export const addInvoice = async ({ stripeApiKey, }); + if (result.needsConfirmation) { + return result; + } + const dynamoCommand = new TransactWriteItemsCommand({ TransactItems: [ { @@ -476,5 +558,5 @@ export const addInvoice = async ({ }); await dynamoClient.send(dynamoCommand); - return customerId; + return { customerId: result.customerId }; }; diff --git a/src/api/routes/stripe.ts b/src/api/routes/stripe.ts index 90cdff40..bf78ff69 100644 --- a/src/api/routes/stripe.ts +++ b/src/api/routes/stripe.ts @@ -11,6 +11,7 @@ import { buildAuditLogTransactPut } from "api/functions/auditLog.js"; import { addInvoice, createStripeLink, + createCheckoutSessionWithCustomer, deactivateStripeLink, deactivateStripeProduct, getPaymentMethodDescriptionString, @@ -137,9 +138,42 @@ const stripeRoutes: FastifyPluginAsync = async (fastify, _options) => { stripeApiKey: secretApiConfig.stripe_secret_key as string, }; - const stripeCustomer = await addInvoice(payload); + const result = await addInvoice(payload); - reply.status(201).send({ link: "" }); + if (result.needsConfirmation) { + return reply.status(409).send({ + needsConfirmation: true, + customerId: result.customerId, + current: result.current, + incoming: result.incoming, + message: "Customer info differs. Confirm update before proceeding.", + }); + } + + const checkoutUrl = await createCheckoutSessionWithCustomer({ + customerId: result.customerId, + stripeApiKey: secretApiConfig.stripe_secret_key as string, + items: [ + { + price: "", + quantity: 1, + }, + ], + initiator: request.username || "system", + allowPromotionCodes: true, + successUrl: `${fastify.environmentConfig.UserFacingUrl}/success`, + returnUrl: `${fastify.environmentConfig.UserFacingUrl}/cancel`, + metadata: { + acm_org: request.body.acmOrg, + billing_email: request.body.contactEmail, + invoice_id: request.body.invoiceId, + }, + }); + + reply.status(201).send({ + id: request.body.invoiceId, + link: checkoutUrl, + }); }, ); fastify.withTypeProvider().post( diff --git a/src/common/types/stripe.ts b/src/common/types/stripe.ts index 88731b7f..f1b4e3e0 100644 --- a/src/common/types/stripe.ts +++ b/src/common/types/stripe.ts @@ -24,6 +24,29 @@ export const createInvoicePostResponseSchema = z.object({ link: z.url() }); +export const createInvoiceConflictResponseSchema = z.object({ + needsConfirmation: z.literal(true), + customerId: z.string().min(1), + current: z.object({ + name: z.string().nullable().optional(), + email: z.string().nullable().optional(), + }), + incoming: z.object({ + name: z.string().min(1), + email: z.string().email(), + }), + message: z.string().min(1), +}); + +export const createInvoicePostResponseSchemaUnion = z.union([ + createInvoicePostResponseSchema, // success: 201 + createInvoiceConflictResponseSchema, // info mismatch: 409 +]); + +export type PostCreateInvoiceResponseUnion = z.infer< + typeof createInvoicePostResponseSchemaUnion +>; + export const createInvoicePostRequestSchema = z.object({ invoiceId: z.string().min(1), invoiceAmountUsd: z.number().min(50), From 9e14803ecaff51f25c6c8f184ecf06bf8531837a Mon Sep 17 00:00:00 2001 From: Aditya Kshirsagar Date: Sun, 7 Dec 2025 17:55:37 -0600 Subject: [PATCH 3/3] fixed CodeRabbit issues involving zod schema and certain functions --- eslint.config.mjs | 4 + src/api/functions/stripe.ts | 30 +++- src/api/package.json | 6 +- src/api/routes/stripe.ts | 11 +- src/common/types/stripe.ts | 17 ++- yarn.lock | 292 ++++++++++++++++++++++++++++++------ 6 files changed, 300 insertions(+), 60 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index c0dd8c1a..8b637d79 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -39,6 +39,10 @@ export default defineConfig([ alwaysTryTypes: true, project: ["src/api/tsconfig.json", "src/ui/tsconfig.json"], }, + node: { + paths: ["src/api", "src/ui"], + extensions: [".js", ".ts", ".jsx", ".tsx"], + }, }, }, diff --git a/src/api/functions/stripe.ts b/src/api/functions/stripe.ts index 3fc85e36..1b95eef6 100644 --- a/src/api/functions/stripe.ts +++ b/src/api/functions/stripe.ts @@ -362,15 +362,23 @@ export const checkOrCreateCustomer = async ({ customerName, stripeApiKey, }: checkCustomerParams): Promise => { + const normalizedEmail = customerEmail.trim().toLowerCase(); + const [, domainPart] = normalizedEmail.split("@"); + + if (!domainPart) { + throw new Error(`Could not derive email domain for "${customerEmail}".`); + } + + const normalizedDomain = domainPart.toLowerCase(); + const lock = createLock({ adapter: new IoredisAdapter(redisClient), - key: `stripe:${acmOrg}:${emailDomain}`, + key: `stripe:${acmOrg}:${normalizedDomain}`, retryAttempts: 5, retryDelay: 300, }) as SimpleLock; - const pk = `${acmOrg}#${emailDomain}`; - const normalizedEmail = customerEmail.trim().toLowerCase(); + const pk = `${acmOrg}#${normalizedDomain}`; return await lock.using(async () => { const checkCustomer = new QueryCommand({ @@ -511,11 +519,19 @@ export const addInvoice = async ({ dynamoClient, stripeApiKey, }: InvoiceAddParams): Promise => { - const pk = `${acmOrg}#${emailDomain}`; + const normalizedEmail = contactEmail.trim().toLowerCase(); + const [, domainPart] = normalizedEmail.split("@"); + + if (!domainPart) { + throw new Error(`Could not derive email domain for "${contactEmail}".`); + } + + const normalizedDomain = domainPart.toLowerCase(); + const pk = `${acmOrg}#${normalizedDomain}`; const result = await checkOrCreateCustomer({ acmOrg, - emailDomain, + emailDomain: normalizedDomain, redisClient, dynamoClient, customerEmail: contactEmail, @@ -541,7 +557,11 @@ export const addInvoice = async ({ }, { removeUndefinedValues: true }, ), + ConditionExpression: + "attribute_not_exists(primaryKey) AND attribute_not_exists(sortKey)", }, + }, + { Update: { TableName: genericConfig.StripePaymentsDynamoTableName, Key: { diff --git a/src/api/package.json b/src/api/package.json index a0801051..13876f41 100644 --- a/src/api/package.json +++ b/src/api/package.json @@ -15,14 +15,14 @@ "prettier:write": "prettier --write *.ts **/*.ts" }, "dependencies": { - "@aws-sdk/s3-request-presigner": "^3.914.0", - "@aws-sdk/client-s3": "^3.914.0", "@aws-sdk/client-dynamodb": "^3.922.0", "@aws-sdk/client-lambda": "^3.922.0", + "@aws-sdk/client-s3": "^3.922.0", "@aws-sdk/client-secrets-manager": "^3.922.0", "@aws-sdk/client-ses": "^3.922.0", "@aws-sdk/client-sqs": "^3.922.0", "@aws-sdk/client-sts": "^3.922.0", + "@aws-sdk/s3-request-presigner": "^3.922.0", "@aws-sdk/signature-v4-crt": "^3.922.0", "@aws-sdk/util-dynamodb": "^3.922.0", "@azure/msal-node": "^3.8.1", @@ -75,4 +75,4 @@ "pino-pretty": "^13.1.1", "yaml": "^2.8.1" } -} \ No newline at end of file +} diff --git a/src/api/routes/stripe.ts b/src/api/routes/stripe.ts index bf78ff69..5ef4ddee 100644 --- a/src/api/routes/stripe.ts +++ b/src/api/routes/stripe.ts @@ -150,12 +150,21 @@ const stripeRoutes: FastifyPluginAsync = async (fastify, _options) => { }); } + const stripe = new Stripe(secretApiConfig.stripe_secret_key as string); + + const dynamicPrice = await stripe.prices.create({ + unit_amount: request.body.invoiceAmountUsd * 100, // USD → cents + currency: "usd", + product_data: { + name: `Invoice ${request.body.invoiceId}`, + }, + }); const checkoutUrl = await createCheckoutSessionWithCustomer({ customerId: result.customerId, stripeApiKey: secretApiConfig.stripe_secret_key as string, items: [ { - price: "", + price: dynamicPrice.id, quantity: 1, }, ], diff --git a/src/common/types/stripe.ts b/src/common/types/stripe.ts index 6e1d6bdd..7b782dd3 100644 --- a/src/common/types/stripe.ts +++ b/src/common/types/stripe.ts @@ -2,7 +2,7 @@ import * as z from "zod/v4"; export const invoiceLinkPostResponseSchema = z.object({ id: z.string().min(1), - link: z.string().url() + link: z.string().url(), }); export const invoiceLinkPostRequestSchema = z.object({ @@ -22,7 +22,7 @@ export type PostInvoiceLinkResponse = z.infer< export const createInvoicePostResponseSchema = z.object({ id: z.string().min(1), - link: z.url() + link: z.url(), }); export const createInvoiceConflictResponseSchema = z.object({ @@ -53,15 +53,17 @@ export const createInvoicePostRequestSchema = z.object({ invoiceAmountUsd: z.number().min(50), contactName: z.string().min(1), contactEmail: z.email(), - acmOrg: z.string().min(1) + acmOrg: z.string().min(1), }); export type PostCreateInvoiceRequest = z.infer< - typeof createInvoicePostRequestSchema>; + typeof createInvoicePostRequestSchema +>; export type PostCreateInvoiceResponse = z.infer< - typeof createInvoicePostResponseSchema>; + typeof createInvoicePostResponseSchema +>; export const invoiceLinkGetResponseSchema = z.array( z.object({ @@ -71,9 +73,10 @@ export const invoiceLinkGetResponseSchema = z.array( active: z.boolean(), invoiceId: z.string().min(1), invoiceAmountUsd: z.number().min(50), - createdAt: z.union([z.string().datetime(), z.null()]) + createdAt: z.union([z.string().datetime(), z.null()]), }) ); export type GetInvoiceLinksResponse = z.infer< - typeof invoiceLinkGetResponseSchema>; + typeof invoiceLinkGetResponseSchema +>; diff --git a/yarn.lock b/yarn.lock index 5c811d64..15ba4a9b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -242,7 +242,7 @@ "@smithy/util-waiter" "^4.2.4" tslib "^2.6.2" -"@aws-sdk/client-s3@^3.914.0": +"@aws-sdk/client-s3@^3.922.0": version "3.922.0" resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.922.0.tgz#5752a59ad5cf4e370ede00774f1e09e9c0af6235" integrity sha512-SZRaZUUAHCWfEyBf4SRSPd29ko4uFoJpfd0E/w1meE68XhFB52FTtz/71UqYcwqZmN+s7oUNFFZT+DE/dnQSEA== @@ -874,7 +874,7 @@ "@smithy/types" "^4.8.1" tslib "^2.6.2" -"@aws-sdk/s3-request-presigner@^3.914.0": +"@aws-sdk/s3-request-presigner@^3.922.0": version "3.922.0" resolved "https://registry.yarnpkg.com/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.922.0.tgz#f71ad9565d2f1e790ed258c192e3844430ce484c" integrity sha512-x/WZXOMAN10X/hbjHnaXjtU34RmV3/eJMiHoJsohquSgz8+pfRN1DeK65oa/XPoKCMPfV31RfHSzCduligHfsQ== @@ -1989,7 +1989,7 @@ resolved "https://registry.yarnpkg.com/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.81.tgz#e76784880f26d48f4863d73c9891c53f161ffe6e" integrity sha512-57ryVbhm/z7RE9/UVcS7mrLPdlayLesy+9U0Uf6epCoeSGrs99tfieCcgZWFbIgmByQ1AZnNtFI2N6huqDLlWQ== -"@napi-rs/canvas@^0.1.65": +"@napi-rs/canvas@^0.1.65", "@napi-rs/canvas@^0.1.80", "@napi-rs/canvas@^0.1.81": version "0.1.81" resolved "https://registry.yarnpkg.com/@napi-rs/canvas/-/canvas-0.1.81.tgz#4cb1556171a64480e52d2a3766aa5413bfc4a9b1" integrity sha512-ReCjd5SYI/UKx/olaQLC4GtN6wUQGjlgHXs1lvUvWGXfBMR3Fxnik3cL+OxKN5ithNdoU0/GlCrdKcQDFh2XKQ== @@ -4154,6 +4154,11 @@ resolved "https://registry.yarnpkg.com/@vladfrangu/async_event_emitter/-/async_event_emitter-2.4.6.tgz#508b6c45b03f917112a9008180b308ba0e4d1805" integrity sha512-RaI5qZo6D2CVS6sTHFKg1v5Ohq/+Bo2LZ5gzUEwZ/WkHhwtGTCB/sVLw8ijOkAUxasZ+WshN/Rzj4ywsABJ5ZA== +"@yarnpkg/lockfile@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + "@zxing/browser@0.0.7": version "0.0.7" resolved "https://registry.yarnpkg.com/@zxing/browser/-/browser-0.0.7.tgz#5fa7680a867b660f48d3288fdf63e0174ad531c7" @@ -4575,7 +4580,7 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== -bl@^4.0.2: +bl@^4.0.2, bl@^4.0.3: version "4.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== @@ -4716,6 +4721,14 @@ caniuse-lite@^1.0.30001726: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001726.tgz#a15bd87d5a4bf01f6b6f70ae7c97fdfd28b5ae47" integrity sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw== +canvas@^3.0.0-rc2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/canvas/-/canvas-3.2.0.tgz#877c51aabdb99cbb5b2b378138a6cdd681e9d390" + integrity sha512-jk0GxrLtUEmW/TmFsk2WghvgHe8B0pxGilqCL21y8lHkPUGa6FTsnCNtHPOzT8O3y+N+m3espawV80bbBlgfTA== + dependencies: + node-addon-api "^7.0.0" + prebuild-install "^7.1.3" + chai@^5.1.1, chai@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/chai/-/chai-5.2.0.tgz#1358ee106763624114addf84ab02697e411c9c05" @@ -4777,6 +4790,11 @@ chokidar@^3.5.2, chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + cli-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" @@ -4861,6 +4879,11 @@ colorette@^2.0.7: resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== +colors@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -4868,6 +4891,16 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" +commander@^2.11.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + commist@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/commist/-/commist-1.1.0.tgz#17811ec6978f6c15ee4de80c45c9beb77cee35d5" @@ -5094,6 +5127,13 @@ decimal.js@^10.5.0: resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.5.0.tgz#0f371c7cf6c4898ce0afb09836db73cd82010f22" integrity sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw== +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + deep-eql@^5.0.1: version "5.0.2" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-5.0.2.tgz#4b756d8d770a9257300825d52a2c2cff99c3a341" @@ -5123,6 +5163,11 @@ deep-equal@^2.0.5: which-collection "^1.0.1" which-typed-array "^1.1.13" +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -5176,6 +5221,11 @@ dequal@^2.0.2, dequal@^2.0.3: resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== +detect-libc@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.1.2.tgz#689c5dcdc1900ef5583a4cb9f6d7b473742074ad" + integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ== + detect-node-es@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" @@ -5407,6 +5457,11 @@ env-paths@^2.2.1: resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== +eol@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/eol/-/eol-0.10.0.tgz#51b35c6b9aa0329a26d102b6ddc454be8654739b" + integrity sha512-+w3ktYrOphcIqC1XKmhQYvM+o2uxgQFiimL7B6JPZJlWVxf7Lno9e/JWLPIgbHo7DoZ+b7jsf/NzrUcNe6ZTZQ== + error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -5997,6 +6052,11 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + expect-type@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/expect-type/-/expect-type-1.2.1.tgz#af76d8b357cf5fa76c41c09dafb79c549e75f71f" @@ -6338,6 +6398,11 @@ formidable@^3.5.4: dezalgo "^1.0.4" once "^1.4.0" +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + fs-extra@^10.0.1: version "10.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" @@ -6444,6 +6509,11 @@ get-tsconfig@^4.10.1, get-tsconfig@^4.7.5: dependencies: resolve-pkg-maps "^1.0.0" +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== + glob-parent@^5.0.0, glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -6796,7 +6866,7 @@ inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, i resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ini@^1.3.5: +ini@^1.3.5, ini@~1.3.0: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== @@ -7577,7 +7647,7 @@ lodash.truncate@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== -lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.21: +lodash@4.17.21, lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -7776,6 +7846,11 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + min-indent@^1.0.0, min-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" @@ -7802,7 +7877,7 @@ minimatch@^9.0.4: dependencies: brace-expansion "^2.0.1" -minimist@^1.1.0, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: +minimist@^1.1.0, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -7812,6 +7887,11 @@ minimist@^1.1.0, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== +mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + mkdirp@^0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" @@ -7897,6 +7977,11 @@ nanoid@^3.3.11: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== +napi-build-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-2.0.0.tgz#13c22c0187fcfccce1461844136372a47ddc027e" + integrity sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA== + napi-postinstall@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/napi-postinstall/-/napi-postinstall-0.3.0.tgz#888e51d1fb500e86dcf6ace1baccdbb377e654ce" @@ -7928,6 +8013,25 @@ nise@^6.0.0: just-extend "^6.2.0" path-to-regexp "^8.1.0" +nmtree@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/nmtree/-/nmtree-1.0.6.tgz#953e057ad545e9e627f1275bd25fea4e92c1cf63" + integrity sha512-SUPCoyX5w/lOT6wD/PZEymR+J899984tYEOYjuDqQlIOeX5NSb1MEsCcT0az+dhZD0MLAj5hGBZEpKQxuDdniA== + dependencies: + commander "^2.11.0" + +node-abi@^3.3.0: + version "3.80.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.80.0.tgz#d7390951f27caa129cceeec01e1c20fc9f07581c" + integrity sha512-LyPuZJcI9HVwzXK1GPxWNzrr+vr8Hp/3UqlmWxxh8p54U1ZbclOqbSog9lWHaCX+dBaiGi6n/hIX+mKu74GmPA== + dependencies: + semver "^7.3.5" + +node-addon-api@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558" + integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== + node-addon-api@^8.5.0: version "8.5.0" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-8.5.0.tgz#c91b2d7682fa457d2e1c388150f0dff9aafb8f3f" @@ -8313,6 +8417,11 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +path2d@^0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/path2d/-/path2d-0.2.2.tgz#cc85d61ed7827e7863a2ee36713d4b5315a3d85d" + integrity sha512-+vnG6S4dYcYxZd+CZxzXCNKdELYZSKfohrk98yajCo1PtRoDgCTrrwOvK1GT0UoAdVszagDVllQc0U1vaX4NUQ== + pathe@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" @@ -8323,13 +8432,35 @@ pathval@^2.0.0: resolved "https://registry.yarnpkg.com/pathval/-/pathval-2.0.1.tgz#8855c5a2899af072d6ac05d11e46045ad0dc605d" integrity sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ== -pdfjs-dist@4.8.69, pdfjs-dist@5.4.296, pdfjs-dist@^4.6.82, pdfjs-dist@^4.8.69, pdfjs-dist@^5.4.394: +pdfjs-dist@4.8.69: + version "4.8.69" + resolved "https://registry.yarnpkg.com/pdfjs-dist/-/pdfjs-dist-4.8.69.tgz#61ea5d66863d49b40e5eacbd4070341175bdda2e" + integrity sha512-IHZsA4T7YElCKNNXtiLgqScw4zPd3pG9do8UrznC757gMd7UPeHSL2qwNNMJo4r79fl8oj1Xx+1nh2YkzdMpLQ== + optionalDependencies: + canvas "^3.0.0-rc2" + path2d "^0.2.1" + +pdfjs-dist@5.4.296: + version "5.4.296" + resolved "https://registry.yarnpkg.com/pdfjs-dist/-/pdfjs-dist-5.4.296.tgz#b1aa7ded8828f29537bc7cc99c1343c8b3a5d2d6" + integrity sha512-DlOzet0HO7OEnmUmB6wWGJrrdvbyJKftI1bhMitK7O2N8W2gc757yyYBbINy9IDafXAV9wmKr9t7xsTaNKRG5Q== + optionalDependencies: + "@napi-rs/canvas" "^0.1.80" + +pdfjs-dist@^4.6.82: version "4.10.38" resolved "https://registry.yarnpkg.com/pdfjs-dist/-/pdfjs-dist-4.10.38.tgz#3ee698003790dc266cc8b55c0e662ccb9ae18f53" integrity sha512-/Y3fcFrXEAsMjJXeL9J8+ZG9U01LbuWaYypvDW2ycW1jL269L3js3DVBjDJ0Up9Np1uqDXsDrRihHANhZOlwdQ== optionalDependencies: "@napi-rs/canvas" "^0.1.65" +pdfjs-dist@^5.4.394: + version "5.4.394" + resolved "https://registry.yarnpkg.com/pdfjs-dist/-/pdfjs-dist-5.4.394.tgz#48697151afce097132673883a55bede103ded6e4" + integrity sha512-9ariAYGqUJzx+V/1W4jHyiyCep6IZALmDzoaTLZ6VNu8q9LWi1/ukhzHgE2Xsx96AZi0mbZuK4/ttIbqSbLypg== + optionalDependencies: + "@napi-rs/canvas" "^0.1.81" + picocolors@1.1.1, picocolors@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" @@ -8525,6 +8656,24 @@ postcss@^8.3.11, postcss@^8.5.3, postcss@^8.5.6: picocolors "^1.1.1" source-map-js "^1.2.1" +prebuild-install@^7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.3.tgz#d630abad2b147443f20a212917beae68b8092eec" + integrity sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug== + dependencies: + detect-libc "^2.0.0" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^2.0.0" + node-abi "^3.3.0" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^4.0.0" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -8649,6 +8798,16 @@ raw-body@^3.0.0: iconv-lite "0.6.3" unpipe "1.0.0" +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + react-docgen-typescript@^2.2.2: version "2.4.0" resolved "https://registry.yarnpkg.com/react-docgen-typescript/-/react-docgen-typescript-2.4.0.tgz#033428b4a6a639d050ac8baf2a5195c596521713" @@ -8670,20 +8829,13 @@ react-docgen@^8.0.0: resolve "^1.22.1" strip-indent "^4.0.0" -"react-dom@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0": +"react-dom@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", react-dom@^19.2.0: version "19.2.0" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.2.0.tgz#00ed1e959c365e9a9d48f8918377465466ec3af8" integrity sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ== dependencies: scheduler "^0.27.0" -react-dom@^19.2.1: - version "19.2.1" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.2.1.tgz#ce3527560bda4f997e47d10dab754825b3061f59" - integrity sha512-ibrK8llX2a4eOskq1mXKu/TGZj9qzomO+sNfO98M6d9zIPOEhlBkMkBUBLd1vgS0gQsLDBzA+8jJBVXDnfHmJg== - dependencies: - scheduler "^0.27.0" - react-dropzone@14.3.8: version "14.3.8" resolved "https://registry.yarnpkg.com/react-dropzone/-/react-dropzone-14.3.8.tgz#a7eab118f8a452fe3f8b162d64454e81ba830582" @@ -8777,17 +8929,17 @@ react-remove-scroll@^2.7.1: use-callback-ref "^1.3.3" use-sidecar "^1.1.3" -react-router-dom@^7.10.0: - version "7.10.0" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-7.10.0.tgz#88e706f9f09cc5039c3694b643993bd8ef93fc12" - integrity sha512-Q4haR150pN/5N75O30iIsRJcr3ef7p7opFaKpcaREy0GQit6uCRu1NEiIFIwnHJQy0bsziRFBweR/5EkmHgVUQ== +react-router-dom@^7.9.5: + version "7.9.5" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-7.9.5.tgz#99a88cde83919bdfc84fbb3d6bf7c6fc18ca0758" + integrity sha512-mkEmq/K8tKN63Ae2M7Xgz3c9l9YNbY+NHH6NNeUmLA3kDkhKXRsNb/ZpxaEunvGo2/3YXdk5EJU3Hxp3ocaBPw== dependencies: - react-router "7.10.0" + react-router "7.9.5" -react-router@7.10.0: - version "7.10.0" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-7.10.0.tgz#45b666036800a023997137ee6caef6d4b8c79f78" - integrity sha512-FVyCOH4IZ0eDDRycODfUqoN8ZSR2LbTvtx6RPsBgzvJ8xAXlMZNCrOFpu+jb8QbtZnpAd/cEki2pwE848pNGxw== +react-router@7.9.5: + version "7.9.5" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-7.9.5.tgz#68722186b4c9f42be36e658d9fe5d62ac1e0808b" + integrity sha512-JmxqrnBZ6E9hWmf02jzNn9Jm3UqyeimyiwzD69NjxGySG6lIz/1LVPsoTCwN7NBX2XjCEa1LIX5EMz1j2b6u6A== dependencies: cookie "^1.0.1" set-cookie-parser "^2.6.0" @@ -8819,16 +8971,11 @@ react-transition-group@4.4.5: loose-envify "^1.4.0" prop-types "^15.6.2" -"react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0": +"react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", react@^19.2.0: version "19.2.0" resolved "https://registry.yarnpkg.com/react/-/react-19.2.0.tgz#d33dd1721698f4376ae57a54098cb47fc75d93a5" integrity sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ== -react@^19.2.1: - version "19.2.1" - resolved "https://registry.yarnpkg.com/react/-/react-19.2.1.tgz#8600fa205e58e2e807f6ef431c9f6492591a2700" - integrity sha512-DGrYcCWK7tvYMnWh79yrPHt+vdx9tY+1gPZa7nJQtO/p8bLTDaHp4dzwEhQB7pZ4Xe3ok4XKuEPrVuc+wlpkmw== - readable-stream@^2.0.0, readable-stream@^2.3.3: version "2.3.8" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" @@ -9191,7 +9338,7 @@ semver@^6.1.2, semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.2, semver@^7.7.1: +semver@^7.3.5, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.2, semver@^7.6.3, semver@^7.7.1: version "7.7.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.3.tgz#4b5f4143d007633a8dc671cd0a6ef9147b8bb946" integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== @@ -9326,6 +9473,20 @@ signal-exit@^4.0.1: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== + dependencies: + decompress-response "^6.0.0" + once "^1.3.1" + simple-concat "^1.0.0" + simple-update-notifier@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" @@ -9384,6 +9545,11 @@ sonic-boom@^4.0.1: dependencies: atomic-sleep "^1.0.0" +sort-object-keys@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sort-object-keys/-/sort-object-keys-1.1.3.tgz#bff833fe85cab147b34742e45863453c1e190b45" + integrity sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg== + source-map-js@^1.0.1, source-map-js@^1.2.0, source-map-js@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" @@ -9661,6 +9827,11 @@ strip-json-comments@^5.0.2: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-5.0.2.tgz#14a76abd63b84a6d2419d14f26a0281d0cf6ea46" integrity sha512-4X2FR3UwhNUE9G49aIsJW5hRRR3GXGTBTZRMfv568O60ojM8HcWjV/VxAxCDW3SUND33O6ZY66ZuRcdkj73q2g== +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + strip-literal@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-3.0.0.tgz#ce9c452a91a0af2876ed1ae4e583539a353df3fc" @@ -9846,6 +10017,21 @@ synckit@^0.11.7: dependencies: "@pkgr/core" "^0.2.4" +synp@^1.9.14: + version "1.9.14" + resolved "https://registry.yarnpkg.com/synp/-/synp-1.9.14.tgz#1feb222d273f6092c6c264746277e95655c60717" + integrity sha512-0e4u7KtrCrMqvuXvDN4nnHSEQbPlONtJuoolRWzut0PfuT2mEOvIFnYFHEpn5YPIOv7S5Ubher0b04jmYRQOzQ== + dependencies: + "@yarnpkg/lockfile" "^1.1.0" + colors "1.4.0" + commander "^7.2.0" + eol "^0.10.0" + fast-glob "^3.3.2" + lodash "4.17.21" + nmtree "^1.0.6" + semver "^7.6.3" + sort-object-keys "^1.1.3" + tabbable@^6.0.0: version "6.2.0" resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" @@ -9872,6 +10058,27 @@ table@^6.9.0: string-width "^4.2.3" strip-ansi "^6.0.1" +tar-fs@^2.0.0: + version "2.1.4" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.4.tgz#800824dbf4ef06ded9afea4acafe71c67c76b930" + integrity sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + test-exclude@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-7.0.1.tgz#20b3ba4906ac20994e275bbcafd68d510264c2a2" @@ -10075,6 +10282,13 @@ tsx@^4.20.4: optionalDependencies: fsevents "~2.3.3" +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -10724,22 +10938,12 @@ zod-openapi@^5.4.0: resolved "https://registry.yarnpkg.com/zod-openapi/-/zod-openapi-5.4.3.tgz#ec886fac181b778bc2e9ccc3462c470543f23e26" integrity sha512-6kJ/gJdvHZtuxjYHoMtkl2PixCwRuZ/s79dVkEr7arHvZGXfx7Cvh53X3HfJ5h9FzGelXOXlnyjwfX0sKEPByw== -zod-validation-error@^4.0.1: +zod-validation-error@^4.0.1, zod-validation-error@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/zod-validation-error/-/zod-validation-error-4.0.2.tgz#bc605eba49ce0fcd598c127fee1c236be3f22918" integrity sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ== -zod-validation-error@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/zod-validation-error/-/zod-validation-error-5.0.0.tgz#96db948070b7bfcb13bfec5134113e580f9eee38" - integrity sha512-hmk+pkyKq7Q71PiWVSDUc3VfpzpvcRHZ3QPw9yEMVvmtCekaMeOHnbr3WbxfrgEnQTv6haGP4cmv0Ojmihzsxw== - -zod@^4.0.14: +zod@^4.0.14, zod@^4.1.12: version "4.1.12" resolved "https://registry.yarnpkg.com/zod/-/zod-4.1.12.tgz#64f1ea53d00eab91853195653b5af9eee68970f0" integrity sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ== - -zod@^4.1.13: - version "4.1.13" - resolved "https://registry.yarnpkg.com/zod/-/zod-4.1.13.tgz#93699a8afe937ba96badbb0ce8be6033c0a4b6b1" - integrity sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==