From 56691c4ab912428f46cd0a8b1f14a8952ef77837 Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Fri, 3 Oct 2025 14:51:46 -0500 Subject: [PATCH 01/11] Gsuite directory sync lambda --- package.json | 5 +- src/archival/build.js | 10 +- src/common/utils.ts | 51 +++ src/dirsync/.gitignore | 216 +++++++++++ src/dirsync/README.md | 1 + src/dirsync/build.js | 40 +++ src/dirsync/config.ts | 68 ++++ src/dirsync/entra.ts | 116 ++++++ src/dirsync/logging.ts | 5 + src/dirsync/package.json | 29 ++ src/dirsync/sync.ts | 24 ++ src/dirsync/tsconfig.json | 14 + terraform/envs/qa/main.tf | 8 + terraform/modules/dirsync/main.tf | 136 +++++++ terraform/modules/dirsync/variables.tf | 21 ++ yarn.lock | 477 ++++++++++++------------- 16 files changed, 967 insertions(+), 254 deletions(-) create mode 100644 src/dirsync/.gitignore create mode 100644 src/dirsync/README.md create mode 100644 src/dirsync/build.js create mode 100644 src/dirsync/config.ts create mode 100644 src/dirsync/entra.ts create mode 100644 src/dirsync/logging.ts create mode 100644 src/dirsync/package.json create mode 100644 src/dirsync/sync.ts create mode 100644 src/dirsync/tsconfig.json create mode 100644 terraform/modules/dirsync/main.tf create mode 100644 terraform/modules/dirsync/variables.tf diff --git a/package.json b/package.json index a9d428df..62693b4a 100644 --- a/package.json +++ b/package.json @@ -6,13 +6,14 @@ "workspaces": [ "src/api", "src/ui", - "src/archival" + "src/archival", + "src/dirsync" ], "packageManager": "yarn@1.22.22", "scripts": { "postinstall": "npm run setup", "setup": "git config blame.ignoreRevsFile .git-blame-ignore-revs", - "build": "concurrently --names 'api,ui,archival' 'yarn workspace infra-core-api run build' 'yarn workspace infra-core-ui run build' 'yarn workspace infra-core-archival run build'", + "build": "concurrently --names 'api,ui,archival,dirsync' 'yarn workspace infra-core-api run build' 'yarn workspace infra-core-ui run build' 'yarn workspace infra-core-archival run build' 'yarn workspace infra-core-gsuite-dirsync run build'", "postbuild": "node src/api/createLambdaPackage.js && yarn lockfile-manage", "dev": "cross-env DISABLE_AUDIT_LOG=true concurrently --names 'api,ui' 'yarn workspace infra-core-api run dev' 'yarn workspace infra-core-ui run dev'", "lockfile-manage": "synp --with-workspace --source-file yarn.lock", diff --git a/src/archival/build.js b/src/archival/build.js index fec8912e..7d583b9e 100644 --- a/src/archival/build.js +++ b/src/archival/build.js @@ -30,11 +30,13 @@ const commonParams = { esbuild .build({ ...commonParams, - entryPoints: ["archival/dynamoStream.js"], - outdir: "../../dist/archival/", + entryPoints: ["dirsync/sync.js"], + outdir: "../../dist/dirsync/", }) - .then(() => console.log("Archival lambda build completed successfully!")) + .then(() => + console.log("Directory sync lambda build completed successfully!"), + ) .catch((error) => { - console.error("Archival lambda build failed:", error); + console.error("Directory sync lambda build failed:", error); process.exit(1); }); diff --git a/src/common/utils.ts b/src/common/utils.ts index 9386edb8..b57e22fc 100644 --- a/src/common/utils.ts +++ b/src/common/utils.ts @@ -60,3 +60,54 @@ export const getAllUserEmails = (username?: string) => { } return [username.replace("@illinois.edu", "@acm.illinois.edu")] } + + +/** + * Parses a display name into first and last name components + * Handles common formats: + * - "First Last" + * - "Last, First" + * - "First Middle Last" (treats everything except last word as first name) + * - Single names (treated as first name) + */ +export const parseDisplayName = (displayName: string): { givenName: string; familyName: string } => { + if (!displayName || displayName.trim() === '') { + return { givenName: '', familyName: '' }; + } + + const trimmed = displayName.trim(); + + // Handle "Last, First" format + if (trimmed.includes(',')) { + const parts = trimmed.split(',').map(p => p.trim()); + return { + familyName: parts[0] || '', + givenName: parts[1] || '' + }; + } + + // Handle "First Last" or "First Middle Last" format + const parts = trimmed.split(/\s+/); + + if (parts.length === 1) { + // Single name - treat as first name + return { + givenName: parts[0], + familyName: '' + }; + } + + if (parts.length === 2) { + // Simple "First Last" + return { + givenName: parts[0], + familyName: parts[1] + }; + } + + // Multiple parts - last part is family name, rest is given name + const familyName = parts[parts.length - 1]; + const givenName = parts.slice(0, -1).join(' '); + + return { givenName, familyName }; +}; diff --git a/src/dirsync/.gitignore b/src/dirsync/.gitignore new file mode 100644 index 00000000..a84f520a --- /dev/null +++ b/src/dirsync/.gitignore @@ -0,0 +1,216 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[codz] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py.cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +# Pipfile.lock + +# UV +# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# uv.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +# poetry.lock +# poetry.toml + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python. +# https://pdm-project.org/en/latest/usage/project/#working-with-version-control +# pdm.lock +# pdm.toml +.pdm-python +.pdm-build/ + +# pixi +# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control. +# pixi.lock +# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one +# in the .venv directory. It is recommended not to include this directory in version control. +.pixi + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# Redis +*.rdb +*.aof +*.pid + +# RabbitMQ +mnesia/ +rabbitmq/ +rabbitmq-data/ + +# ActiveMQ +activemq-data/ + +# SageMath parsed files +*.sage.py + +# Environments +.env +.envrc +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +# .idea/ + +# Abstra +# Abstra is an AI-powered process automation framework. +# Ignore directories containing user credentials, local state, and settings. +# Learn more at https://abstra.io/docs +.abstra/ + +# Visual Studio Code +# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore +# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore +# and can be added to the global gitignore or merged into this file. However, if you prefer, +# you could uncomment the following to ignore the entire vscode folder +# .vscode/ + +# Ruff stuff: +.ruff_cache/ + +# PyPI configuration file +.pypirc + +# Marimo +marimo/_static/ +marimo/_lsp/ +__marimo__/ + +# Streamlit +.streamlit/secrets.tomls diff --git a/src/dirsync/README.md b/src/dirsync/README.md new file mode 100644 index 00000000..b001bde6 --- /dev/null +++ b/src/dirsync/README.md @@ -0,0 +1 @@ +# Entra ID to Google Workspace External Contact Sync diff --git a/src/dirsync/build.js b/src/dirsync/build.js new file mode 100644 index 00000000..fec8912e --- /dev/null +++ b/src/dirsync/build.js @@ -0,0 +1,40 @@ +/* eslint-disable no-console */ +import esbuild from "esbuild"; + +const commonParams = { + bundle: true, + format: "esm", + minify: true, + outExtension: { ".js": ".mjs" }, + loader: { + ".png": "file", + ".pkpass": "file", + ".json": "file", + }, // File loaders + target: "es2022", // Target ES2022 + sourcemap: true, + platform: "node", + external: ["@aws-sdk/*"], + banner: { + js: ` + import path from 'path'; + import { fileURLToPath } from 'url'; + import { createRequire as topLevelCreateRequire } from 'module'; + const require = topLevelCreateRequire(import.meta.url); + const __filename = fileURLToPath(import.meta.url); + const __dirname = path.dirname(__filename); + `.trim(), + }, // Banner for compatibility with CommonJS +}; + +esbuild + .build({ + ...commonParams, + entryPoints: ["archival/dynamoStream.js"], + outdir: "../../dist/archival/", + }) + .then(() => console.log("Archival lambda build completed successfully!")) + .catch((error) => { + console.error("Archival lambda build failed:", error); + process.exit(1); + }); diff --git a/src/dirsync/config.ts b/src/dirsync/config.ts new file mode 100644 index 00000000..de2221b0 --- /dev/null +++ b/src/dirsync/config.ts @@ -0,0 +1,68 @@ +import { + GetSecretValueCommand, + SecretsManagerClient, +} from "@aws-sdk/client-secrets-manager"; +import { z } from "zod"; + +export const CONFIG_SECRET = "infra-core-api-gsuite-dirsync"; + +const SecretsConfigSchema = z.object({ + entraTenantId: z.string().min(1, "entraTenantId is required"), + entraClientId: z.string().min(1, "entraClientId is required"), + entraClientSecret: z.string().min(1, "entraClientSecret is required"), + googleDelegatedUser: z + .string() + .email("googleDelegatedUser must be a valid email"), + googleServiceAccountJson: z + .string() + .min(1, "googleServiceAccountJson is required"), + deleteRemovedContacts: z.boolean().default(false), +}); + +const EnvironmentSchema = z.enum(["dev", "prod"]); + +export type SecretsConfig = z.infer; +export type Environment = z.infer; + +export interface Config extends SecretsConfig { + environment: Environment; +} + +export const getSecrets = async (): Promise => { + const smClient = new SecretsManagerClient(); + const data = await smClient.send( + new GetSecretValueCommand({ SecretId: CONFIG_SECRET }), + ); + if (!data.SecretString) { + return null; + } + try { + return JSON.parse(data.SecretString); + } catch { + return null; + } +}; + +export const getConfig = async (): Promise => { + const secrets = await getSecrets(); + + if (!secrets) { + throw new Error( + `Failed to load configuration from secret: ${CONFIG_SECRET}`, + ); + } + const parsedSecrets = SecretsConfigSchema.parse(secrets); + + const environment = EnvironmentSchema.parse(process.env.RunEnvironment); + + const config: Config = { + ...parsedSecrets, + environment, + }; + + console.log( + `Configuration loaded successfully for environment: ${config.environment}`, + ); + + return config; +}; diff --git a/src/dirsync/entra.ts b/src/dirsync/entra.ts new file mode 100644 index 00000000..cedf4d97 --- /dev/null +++ b/src/dirsync/entra.ts @@ -0,0 +1,116 @@ +import { Client } from "@microsoft/microsoft-graph-client"; +import { ClientSecretCredential } from "@azure/identity"; +import { parseDisplayName } from "../common/utils.js"; + +export interface EntraUser { + email: string; + upn: string; + givenName: string; + familyName: string; + displayName: string; +} + +interface GraphUser { + userPrincipalName?: string; + mail?: string; + givenName?: string; + surname?: string; + displayName?: string; +} + +/** + * Creates a Microsoft Graph client with the provided credentials + */ +export const createEntraClient = ( + tenantId: string, + clientId: string, + clientSecret: string, +): Client => { + const credential = new ClientSecretCredential( + tenantId, + clientId, + clientSecret, + ); + + return Client.initWithMiddleware({ + authProvider: { + getAccessToken: async () => { + const token = await credential.getToken( + "https://graph.microsoft.com/.default", + ); + return token?.token || ""; + }, + }, + }); +}; + +/** + * Fetches all enabled users from Entra ID + */ +export const getAllEntraUsers = async ( + client: Client, +): Promise => { + console.log("Fetching users from Entra ID..."); + const users: EntraUser[] = []; + + try { + let response = await client + .api("/users") + .select("userPrincipalName,mail,givenName,surname,displayName") + .filter("accountEnabled eq true") + .top(999) + .get(); + + while (response) { + const graphUsers: GraphUser[] = response.value || []; + + for (const user of graphUsers) { + // Require at least UPN or mail + if (!user.userPrincipalName && !user.mail) { + continue; + } + + const displayName = + user.displayName || user.mail || user.userPrincipalName || ""; + let givenName = user.givenName || ""; + let familyName = user.surname || ""; + + // If we have displayName but missing first/last name, try to parse it + if (displayName && (!givenName || !familyName)) { + const parsed = parseDisplayName(displayName); + if (!givenName) { + givenName = parsed.givenName; + } + if (!familyName) { + familyName = parsed.familyName; + } + } + + users.push({ + email: user.mail || "", + upn: user.userPrincipalName || "", + givenName, + familyName, + displayName, + }); + } + + // Handle pagination + if (response["@odata.nextLink"]) { + response = await client.api(response["@odata.nextLink"]).get(); + } else { + break; + } + } + + console.log(`Fetched ${users.length} users from Entra ID`); + return users; + } catch (error) { + console.error("Error fetching Entra ID users:", error); + throw error; + } +}; + +export const getPrimaryEmail = (user: EntraUser): string => { + return (user.email || user.upn).toLowerCase(); +}; diff --git a/src/dirsync/logging.ts b/src/dirsync/logging.ts new file mode 100644 index 00000000..3181857b --- /dev/null +++ b/src/dirsync/logging.ts @@ -0,0 +1,5 @@ +import pino from "pino"; + +export const logger = pino({ + level: process.env.LOG_LEVEL || "info", +}); diff --git a/src/dirsync/package.json b/src/dirsync/package.json new file mode 100644 index 00000000..5684503b --- /dev/null +++ b/src/dirsync/package.json @@ -0,0 +1,29 @@ +{ + "name": "infra-core-gsuite-dirsync", + "version": "1.0.0", + "description": "Syncs EntraID directory to GSuite", + "type": "module", + "main": "index.js", + "author": "ACM@UIUC", + "license": "BSD-3-Clause", + "scripts": { + "build": "tsc && node build.js", + "prettier": "prettier --check *.ts **/*.ts", + "lint": "eslint . --ext .ts --cache", + "prettier:write": "prettier --write *.ts **/*.ts" + }, + "devDependencies": { + "@types/aws-lambda": "^8.10.138", + "@types/node": "^24.3.0", + "esbuild": "^0.25.3", + "typescript": "^5.9.2" + }, + "dependencies": { + "@aws-sdk/client-secrets-manager": "^3.895.0", + "@azure/identity": "^4.12.0", + "@microsoft/microsoft-graph-client": "^3.0.7", + "@types/pino": "^7.0.5", + "pino": "^10.0.0", + "zod": "^4.1.11" + } +} diff --git a/src/dirsync/sync.ts b/src/dirsync/sync.ts new file mode 100644 index 00000000..8540ba34 --- /dev/null +++ b/src/dirsync/sync.ts @@ -0,0 +1,24 @@ +import { type Context, type EventBridgeEvent } from "aws-lambda"; +import { getConfig } from "./config"; +import { logger } from "./logging"; +import { createEntraClient, getAllEntraUsers } from "./entra"; + +const secretConfig = await getConfig(); + +export const handler = async ( + event: EventBridgeEvent<"Scheduled Event", string>, + _context: Context, +): Promise => { + logger.info("Started the sync lambda handler!"); + logger.info("Creating the Entra ID client"); + const entraClient = createEntraClient( + secretConfig.entraTenantId, + secretConfig.entraClientId, + secretConfig.entraClientSecret, + ); + const entraUsers = await getAllEntraUsers(entraClient); + return { + statusCode: 200, + body: JSON.stringify("Done!"), + }; +}; diff --git a/src/dirsync/tsconfig.json b/src/dirsync/tsconfig.json new file mode 100644 index 00000000..a7ea8819 --- /dev/null +++ b/src/dirsync/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "compilerOptions": { + "module": "Node16", + "rootDir": "../", + "outDir": "../../dist", + "baseUrl": "../" + }, + "ts-node": { + "esm": true + }, + "include": ["../api/**/*.ts", "../common/**/*.ts"], + "exclude": ["../../node_modules", "../../dist"] +} diff --git a/terraform/envs/qa/main.tf b/terraform/envs/qa/main.tf index 84505781..6fc1bfd7 100644 --- a/terraform/envs/qa/main.tf +++ b/terraform/envs/qa/main.tf @@ -88,6 +88,14 @@ module "archival" { }) } +module "archival" { + source = "../../modules/dirsync" + ProjectId = var.ProjectId + RunEnvironment = "dev" + LogRetentionDays = var.LogRetentionDays + SyncFrequency = "rate(1 hour)" +} + resource "aws_cloudfront_key_value_store" "linkry_kv" { name = "${var.ProjectId}-cloudfront-linkry-kv" } diff --git a/terraform/modules/dirsync/main.tf b/terraform/modules/dirsync/main.tf new file mode 100644 index 00000000..ed71487a --- /dev/null +++ b/terraform/modules/dirsync/main.tf @@ -0,0 +1,136 @@ +data "archive_file" "lambda_code" { + type = "zip" + source_dir = "${path.module}/../../../dist/dirsync" + output_path = "${path.module}/../../../dist/terraform/dirsync.zip" +} +locals { + sync_lambda_name = "${var.ProjectId}-gsuite-dirsync" +} +data "aws_caller_identity" "current" {} +data "aws_region" "current" {} +resource "aws_cloudwatch_log_group" "this" { + name = "/aws/lambda/${local.sync_lambda_name}" + retention_in_days = var.LogRetentionDays +} + +resource "aws_iam_role" "this" { + name = "${local.sync_lambda_name}-exec-role" + assume_role_policy = jsonencode({ + Version = "2012-10-17" + Statement = [ + { + Action = "sts:AssumeRole" + Effect = "Allow" + Principal = { + Service = "lambda.amazonaws.com" + }, + }, + ] + }) +} + +resource "aws_iam_policy" "this" { + name = "${local.sync_lambda_name}-base-policy" + policy = jsonencode({ + Version = "2012-10-17" + Statement = [ + { + Action = ["logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents"], + Effect = "Allow", + Resource = ["${aws_cloudwatch_log_group.archive_logs.arn}:*"] + }, + { + Action = ["secretsmanager:GetSecretValue"], + Effect = "Allow", + Resource = [ + "arn:aws:secretsmanager:${data.aws_region.current.region}:${data.aws_caller_identity.current.account_id}:secret:infra-core-api-gsuite-dirsync*", + ] + }, + ] + }) +} + +resource "aws_iam_role_policy_attachment" "this" { + role = aws_iam_role.this.name + policy_arn = aws_iam_policy.this.arn +} + +resource "aws_lambda_function" "this" { + depends_on = [aws_cloudwatch_log_group.this] + function_name = local.sync_lambda_name + role = aws_iam_role.this.arn + architectures = ["arm64"] + handler = "sync.handler" + runtime = "nodejs22.x" + filename = data.archive_file.lambda_code.output_path + timeout = 900 + memory_size = 2048 + source_code_hash = data.archive_file.lambda_code.output_sha256 + description = "GSuite Sync Lambda." + environment { + variables = { + "RunEnvironment" = var.RunEnvironment + } + } +} + +resource "aws_cloudwatch_event_rule" "this" { + name = "${local.sync_lambda_name}-schedule" + description = "Trigger GSuite directory sync on a schedule" + schedule_expression = var.SyncFrequency +} + +resource "aws_lambda_permission" "eventbridge" { + statement_id = "AllowExecutionFromEventBridge" + action = "lambda:InvokeFunction" + function_name = aws_lambda_function.this.function_name + principal = "events.amazonaws.com" + source_arn = aws_cloudwatch_event_rule.this.arn +} + +resource "aws_cloudwatch_event_target" "lambda_target" { + rule = aws_cloudwatch_event_rule.this.name + target_id = "DirsyncLambdaTarget" + arn = aws_lambda_function.this.arn +} + +resource "aws_secretsmanager_secret" "config" { + name = "infra-core-api-gsuite-dirsync" + description = "Configuration for Entra ID to Google Workspace directory sync" + + lifecycle { + ignore_changes = [ + name, + description, + ] + } +} + +resource "aws_secretsmanager_secret_version" "config" { + secret_id = aws_secretsmanager_secret.config.id + secret_string = jsonencode({ + entraTenantId = "REPLACE_WITH_TENANT_ID" + entraClientId = "REPLACE_WITH_CLIENT_ID" + entraClientSecret = "REPLACE_WITH_CLIENT_SECRET" + googleDelegatedUser = "admin@yourdomain.com" + googleServiceAccountJson = jsonencode({ + type = "service_account" + project_id = "REPLACE_WITH_PROJECT_ID" + private_key_id = "REPLACE_WITH_PRIVATE_KEY_ID" + private_key = "REPLACE_WITH_PRIVATE_KEY" + client_email = "REPLACE_WITH_CLIENT_EMAIL" + client_id = "REPLACE_WITH_CLIENT_ID" + auth_uri = "https://accounts.google.com/o/oauth2/auth" + token_uri = "https://oauth2.googleapis.com/token" + auth_provider_x509_cert_url = "https://www.googleapis.com/oauth2/v1/certs" + client_x509_cert_url = "REPLACE_WITH_CERT_URL" + }) + deleteRemovedContacts = false + }) + + lifecycle { + ignore_changes = [ + secret_string, + ] + } +} diff --git a/terraform/modules/dirsync/variables.tf b/terraform/modules/dirsync/variables.tf new file mode 100644 index 00000000..65dfc05a --- /dev/null +++ b/terraform/modules/dirsync/variables.tf @@ -0,0 +1,21 @@ +variable "ProjectId" { + type = string + description = "Prefix before each resource" +} + +variable "LogRetentionDays" { + type = number +} + +variable "RunEnvironment" { + type = string + validation { + condition = var.RunEnvironment == "dev" || var.RunEnvironment == "prod" + error_message = "The lambda run environment must be dev or prod." + } +} + +variable "SyncFrequency" { + type = string + description = "EventBridge cron frequency for triggering the sync lambda" +} diff --git a/yarn.lock b/yarn.lock index 6176d58b..a935e1bf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -906,6 +906,89 @@ resolved "https://registry.yarnpkg.com/@aws/lambda-invoke-store/-/lambda-invoke-store-0.0.1.tgz#92d792a7dda250dfcb902e13228f37a81be57c8f" integrity sha512-ORHRQ2tmvnBXc8t/X9Z8IcSbBA4xTLKuN873FopzklHMeqBst7YG0d+AX97inkvDX+NChYtSr+qGfcqGFaI8Zw== +"@azure/abort-controller@^2.0.0", "@azure/abort-controller@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@azure/abort-controller/-/abort-controller-2.1.2.tgz#42fe0ccab23841d9905812c58f1082d27784566d" + integrity sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA== + dependencies: + tslib "^2.6.2" + +"@azure/core-auth@^1.10.0", "@azure/core-auth@^1.9.0": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@azure/core-auth/-/core-auth-1.10.1.tgz#68a17fa861ebd14f6fd314055798355ef6bedf1b" + integrity sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg== + dependencies: + "@azure/abort-controller" "^2.1.2" + "@azure/core-util" "^1.13.0" + tslib "^2.6.2" + +"@azure/core-client@^1.9.2": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@azure/core-client/-/core-client-1.10.1.tgz#83d78f97d647ab22e6811a7a68bb4223e7a1d019" + integrity sha512-Nh5PhEOeY6PrnxNPsEHRr9eimxLwgLlpmguQaHKBinFYA/RU9+kOYVOQqOrTsCL+KSxrLLl1gD8Dk5BFW/7l/w== + dependencies: + "@azure/abort-controller" "^2.1.2" + "@azure/core-auth" "^1.10.0" + "@azure/core-rest-pipeline" "^1.22.0" + "@azure/core-tracing" "^1.3.0" + "@azure/core-util" "^1.13.0" + "@azure/logger" "^1.3.0" + tslib "^2.6.2" + +"@azure/core-rest-pipeline@^1.17.0", "@azure/core-rest-pipeline@^1.22.0": + version "1.22.1" + resolved "https://registry.yarnpkg.com/@azure/core-rest-pipeline/-/core-rest-pipeline-1.22.1.tgz#f47bc02ff9a79f62e6a32aa375420b1b86dcbccd" + integrity sha512-UVZlVLfLyz6g3Hy7GNDpooMQonUygH7ghdiSASOOHy97fKj/mPLqgDX7aidOijn+sCMU+WU8NjlPlNTgnvbcGA== + dependencies: + "@azure/abort-controller" "^2.1.2" + "@azure/core-auth" "^1.10.0" + "@azure/core-tracing" "^1.3.0" + "@azure/core-util" "^1.13.0" + "@azure/logger" "^1.3.0" + "@typespec/ts-http-runtime" "^0.3.0" + tslib "^2.6.2" + +"@azure/core-tracing@^1.0.0", "@azure/core-tracing@^1.3.0": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@azure/core-tracing/-/core-tracing-1.3.1.tgz#e971045c901ea9c110616b0e1db272507781d5f6" + integrity sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ== + dependencies: + tslib "^2.6.2" + +"@azure/core-util@^1.11.0", "@azure/core-util@^1.13.0": + version "1.13.1" + resolved "https://registry.yarnpkg.com/@azure/core-util/-/core-util-1.13.1.tgz#6dff2ff6d3c9c6430c6f4d3b3e65de531f10bafe" + integrity sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A== + dependencies: + "@azure/abort-controller" "^2.1.2" + "@typespec/ts-http-runtime" "^0.3.0" + tslib "^2.6.2" + +"@azure/identity@^4.12.0": + version "4.12.0" + resolved "https://registry.yarnpkg.com/@azure/identity/-/identity-4.12.0.tgz#272e39a8742191aac0b9f5ec683984bf4d88e7cb" + integrity sha512-6vuh2R3Cte6SD6azNalLCjIDoryGdcvDVEV7IDRPtm5lHX5ffkDlIalaoOp5YJU08e4ipjJENel20kSMDLAcug== + dependencies: + "@azure/abort-controller" "^2.0.0" + "@azure/core-auth" "^1.9.0" + "@azure/core-client" "^1.9.2" + "@azure/core-rest-pipeline" "^1.17.0" + "@azure/core-tracing" "^1.0.0" + "@azure/core-util" "^1.11.0" + "@azure/logger" "^1.0.0" + "@azure/msal-browser" "^4.2.0" + "@azure/msal-node" "^3.5.0" + open "^10.1.0" + tslib "^2.2.0" + +"@azure/logger@^1.0.0", "@azure/logger@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@azure/logger/-/logger-1.3.0.tgz#5501cf85d4f52630602a8cc75df76568c969a827" + integrity sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA== + dependencies: + "@typespec/ts-http-runtime" "^0.3.0" + tslib "^2.6.2" + "@azure/msal-browser@^4.11.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@azure/msal-browser/-/msal-browser-4.18.0.tgz#ea11137669916f6aca67448a424e029417fc99de" @@ -913,11 +996,32 @@ dependencies: "@azure/msal-common" "15.9.0" +"@azure/msal-browser@^4.2.0": + version "4.24.1" + resolved "https://registry.yarnpkg.com/@azure/msal-browser/-/msal-browser-4.24.1.tgz#16a79bd17f53da866eb36ccdb44c176fb27e2d71" + integrity sha512-e4sp8ihJIyZQvN0ZM1MMuKlEiiLWUS9V9+kxsVAc6K8MtpXHui8VINmKUxXH0OOksLhFDpdq4sGW1w6uYp431A== + dependencies: + "@azure/msal-common" "15.13.0" + +"@azure/msal-common@15.13.0": + version "15.13.0" + resolved "https://registry.yarnpkg.com/@azure/msal-common/-/msal-common-15.13.0.tgz#229008f8badbf5af6a446a0be1c436be2f4c8cd9" + integrity sha512-8oF6nj02qX7eE/6+wFT5NluXRHc05AgdCC3fJnkjiJooq8u7BcLmxaYYSwc2AfEkWRMRi6Eyvvbeqk4U4412Ag== + "@azure/msal-common@15.9.0": version "15.9.0" resolved "https://registry.yarnpkg.com/@azure/msal-common/-/msal-common-15.9.0.tgz#49b62a798dd1b47b410e6e540fd36009f1d4d18e" integrity sha512-lbz/D+C9ixUG3hiZzBLjU79a0+5ZXCorjel3mwXluisKNH0/rOS/ajm8yi4yI9RP5Uc70CAcs9Ipd0051Oh/kA== +"@azure/msal-node@^3.5.0": + version "3.8.0" + resolved "https://registry.yarnpkg.com/@azure/msal-node/-/msal-node-3.8.0.tgz#17634ebab1b4d6f6a3fac1a378c4929fdeeae79d" + integrity sha512-23BXm82Mp5XnRhrcd4mrHa0xuUNRp96ivu3nRatrfdAqjoeWAGyD0eEAafxAOHAEWWmdlyFK4ELFcdziXyw2sA== + dependencies: + "@azure/msal-common" "15.13.0" + jsonwebtoken "^9.0.0" + uuid "^8.3.0" + "@azure/msal-node@^3.5.1": version "3.6.4" resolved "https://registry.yarnpkg.com/@azure/msal-node/-/msal-node-3.6.4.tgz#937f0e37e73d48dfb68ab8f3a503a0cf21a65285" @@ -1797,6 +1901,14 @@ dependencies: "@types/mdx" "^2.0.0" +"@microsoft/microsoft-graph-client@^3.0.7": + version "3.0.7" + resolved "https://registry.yarnpkg.com/@microsoft/microsoft-graph-client/-/microsoft-graph-client-3.0.7.tgz#535507df2db40bd7ed24a670dc68c87c628177a4" + integrity sha512-/AazAV/F+HK4LIywF9C+NYHcJo038zEnWkteilcxC1FM/uK/4NVGDKGrxx7nNq1ybspAroRKT4I1FHfxQzxkUw== + dependencies: + "@babel/runtime" "^7.12.5" + tslib "^2.2.0" + "@middy/core@^6.1.6": version "6.4.1" resolved "https://registry.yarnpkg.com/@middy/core/-/core-6.4.1.tgz#9e8b87e31c6907ca57bc14421e3f51f78b269508" @@ -1824,101 +1936,51 @@ resolved "https://registry.yarnpkg.com/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.77.tgz#58debdab512a950d505f17cd499e7171f33a5184" integrity sha512-jC8YX0rbAnu9YrLK1A52KM2HX9EDjrJSCLVuBf9Dsov4IC6GgwMLS2pwL9GFLJnSZBFgdwnA84efBehHT9eshA== -"@napi-rs/canvas-android-arm64@0.1.80": - version "0.1.80" - resolved "https://registry.yarnpkg.com/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.80.tgz#2779ca5c8aaeb46c85eb72d29f1eb34efd46fb45" - integrity sha512-sk7xhN/MoXeuExlggf91pNziBxLPVUqF2CAVnB57KLG/pz7+U5TKG8eXdc3pm0d7Od0WreB6ZKLj37sX9muGOQ== - "@napi-rs/canvas-darwin-arm64@0.1.77": version "0.1.77" resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.77.tgz#84bbbf72d2ca647d2be7d1a0a64548ba086b8b95" integrity sha512-VFaCaCgAV0+hPwXajDIiHaaGx4fVCuUVYp/CxCGXmTGz699ngIEBx3Sa2oDp0uk3X+6RCRLueb7vD44BKBiPIg== -"@napi-rs/canvas-darwin-arm64@0.1.80": - version "0.1.80" - resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.80.tgz#638eaa2d0a2a373c7d15748743182718dcd95c4b" - integrity sha512-O64APRTXRUiAz0P8gErkfEr3lipLJgM6pjATwavZ22ebhjYl/SUbpgM0xcWPQBNMP1n29afAC/Us5PX1vg+JNQ== - "@napi-rs/canvas-darwin-x64@0.1.77": version "0.1.77" resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.77.tgz#e0f845fa5d2ad7eafe49c5e862a94b4be1dbc040" integrity sha512-uD2NSkf6I4S3o0POJDwweK85FE4rfLNA2N714MgiEEMMw5AmupfSJGgpYzcyEXtPzdaca6rBfKcqNvzR1+EyLQ== -"@napi-rs/canvas-darwin-x64@0.1.80": - version "0.1.80" - resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.80.tgz#bd6bc048dbd4b02b9620d9d07117ed93e6970978" - integrity sha512-FqqSU7qFce0Cp3pwnTjVkKjjOtxMqRe6lmINxpIZYaZNnVI0H5FtsaraZJ36SiTHNjZlUB69/HhxNDT1Aaa9vA== - "@napi-rs/canvas-linux-arm-gnueabihf@0.1.77": version "0.1.77" resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.77.tgz#51f2d786951c9c1eac8dbc92471a128212392cb6" integrity sha512-03GxMMZGhHRQxiA4gyoKT6iQSz8xnA6T9PAfg/WNJnbkVMFZG782DwUJUb39QIZ1uE1euMCPnDgWAJ092MmgJQ== -"@napi-rs/canvas-linux-arm-gnueabihf@0.1.80": - version "0.1.80" - resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.80.tgz#ce6bfbeb19d9234c42df5c384e5989aa7d734789" - integrity sha512-eyWz0ddBDQc7/JbAtY4OtZ5SpK8tR4JsCYEZjCE3dI8pqoWUC8oMwYSBGCYfsx2w47cQgQCgMVRVTFiiO38hHQ== - "@napi-rs/canvas-linux-arm64-gnu@0.1.77": version "0.1.77" resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.77.tgz#e92897dac7f3b7acb806529bf8a0ab20ac26e84f" integrity sha512-ZO+d2gRU9JU1Bb7SgJcJ1k9wtRMCpSWjJAJ+2phhu0Lw5As8jYXXXmLKmMTGs1bOya2dBMYDLzwp7KS/S/+aCA== -"@napi-rs/canvas-linux-arm64-gnu@0.1.80": - version "0.1.80" - resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.80.tgz#3b7a7832fef763826fa5fb740d5757204e52607d" - integrity sha512-qwA63t8A86bnxhuA/GwOkK3jvb+XTQaTiVML0vAWoHyoZYTjNs7BzoOONDgTnNtr8/yHrq64XXzUoLqDzU+Uuw== - "@napi-rs/canvas-linux-arm64-musl@0.1.77": version "0.1.77" resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.77.tgz#f2ba1f00e734c6ab142efd86263adf5cb391a228" integrity sha512-S1KtnP1+nWs2RApzNkdNf8X4trTLrHaY7FivV61ZRaL8NvuGOkSkKa+gWN2iedIGFEDz6gecpl/JAUSewwFXYg== -"@napi-rs/canvas-linux-arm64-musl@0.1.80": - version "0.1.80" - resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.80.tgz#d8ccd91f31d70760628623cd575134ada17690a3" - integrity sha512-1XbCOz/ymhj24lFaIXtWnwv/6eFHXDrjP0jYkc6iHQ9q8oXKzUX1Lc6bu+wuGiLhGh2GS/2JlfORC5ZcXimRcg== - "@napi-rs/canvas-linux-riscv64-gnu@0.1.77": version "0.1.77" resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.77.tgz#c6b3cb3cd277de835ac06a87403eca51efa67acd" integrity sha512-A4YIKFYUwDtrSzCtdCAO5DYmRqlhCVKHdpq0+dBGPnIEhOQDFkPBTfoTAjO3pjlEnorlfKmNMOH21sKQg2esGA== -"@napi-rs/canvas-linux-riscv64-gnu@0.1.80": - version "0.1.80" - resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.80.tgz#927a3b859a0e3c691beaf52a19bc4736c4ffc9b8" - integrity sha512-XTzR125w5ZMs0lJcxRlS1K3P5RaZ9RmUsPtd1uGt+EfDyYMu4c6SEROYsxyatbbu/2+lPe7MPHOO/0a0x7L/gw== - "@napi-rs/canvas-linux-x64-gnu@0.1.77": version "0.1.77" resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.77.tgz#c36c7dbec434d6c60529edbfe46a32d1ac21d096" integrity sha512-Lt6Sef5l0+5O1cSZ8ysO0JI+x+rSrqZyXs5f7+kVkCAOVq8X5WTcDVbvWvEs2aRhrWTp5y25Jf2Bn+3IcNHOuQ== -"@napi-rs/canvas-linux-x64-gnu@0.1.80": - version "0.1.80" - resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.80.tgz#25c0416bcedd6fadc15295e9afa8d9697232050c" - integrity sha512-BeXAmhKg1kX3UCrJsYbdQd3hIMDH/K6HnP/pG2LuITaXhXBiNdh//TVVVVCBbJzVQaV5gK/4ZOCMrQW9mvuTqA== - "@napi-rs/canvas-linux-x64-musl@0.1.77": version "0.1.77" resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.77.tgz#36c20eae7c46f724da406a68199755601a7b311d" integrity sha512-NiNFvC+D+omVeJ3IjYlIbyt/igONSABVe9z0ZZph29epHgZYu4eHwV9osfpRt1BGGOAM8LkFrHk4LBdn2EDymA== -"@napi-rs/canvas-linux-x64-musl@0.1.80": - version "0.1.80" - resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.80.tgz#de85d644e09120a60996bbe165cc2efee804551b" - integrity sha512-x0XvZWdHbkgdgucJsRxprX/4o4sEed7qo9rCQA9ugiS9qE2QvP0RIiEugtZhfLH3cyI+jIRFJHV4Fuz+1BHHMg== - "@napi-rs/canvas-win32-x64-msvc@0.1.77": version "0.1.77" resolved "https://registry.yarnpkg.com/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.77.tgz#1cb0b9964e0b4db348e4120eea39b5c60aa5432c" integrity sha512-fP6l0hZiWykyjvpZTS3sI46iib8QEflbPakNoUijtwyxRuOPTTBfzAWZUz5z2vKpJJ/8r305wnZeZ8lhsBHY5A== -"@napi-rs/canvas-win32-x64-msvc@0.1.80": - version "0.1.80" - resolved "https://registry.yarnpkg.com/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.80.tgz#6bb95885d9377912d71f1372fc1916fb54d6ef0a" - integrity sha512-Z8jPsM6df5V8B1HrCHB05+bDiCxjE9QA//3YrkKIdVDEwn5RKaqOxCJDRJkl48cJbylcrJbW4HxZbTte8juuPg== - "@napi-rs/canvas@^0.1.65": version "0.1.77" resolved "https://registry.yarnpkg.com/@napi-rs/canvas/-/canvas-0.1.77.tgz#e78e208adb79cf211f6d260664d766b6f26da341" @@ -1935,22 +1997,6 @@ "@napi-rs/canvas-linux-x64-musl" "0.1.77" "@napi-rs/canvas-win32-x64-msvc" "0.1.77" -"@napi-rs/canvas@^0.1.67", "@napi-rs/canvas@^0.1.77": - version "0.1.80" - resolved "https://registry.yarnpkg.com/@napi-rs/canvas/-/canvas-0.1.80.tgz#53615bea56fd94e07331ab13caa7a39efc4914ab" - integrity sha512-DxuT1ClnIPts1kQx8FBmkk4BQDTfI5kIzywAaMjQSXfNnra5UFU9PwurXrl+Je3bJ6BGsp/zmshVVFbCmyI+ww== - optionalDependencies: - "@napi-rs/canvas-android-arm64" "0.1.80" - "@napi-rs/canvas-darwin-arm64" "0.1.80" - "@napi-rs/canvas-darwin-x64" "0.1.80" - "@napi-rs/canvas-linux-arm-gnueabihf" "0.1.80" - "@napi-rs/canvas-linux-arm64-gnu" "0.1.80" - "@napi-rs/canvas-linux-arm64-musl" "0.1.80" - "@napi-rs/canvas-linux-riscv64-gnu" "0.1.80" - "@napi-rs/canvas-linux-x64-gnu" "0.1.80" - "@napi-rs/canvas-linux-x64-musl" "0.1.80" - "@napi-rs/canvas-win32-x64-msvc" "0.1.80" - "@napi-rs/wasm-runtime@^0.2.11": version "0.2.11" resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.11.tgz#192c1610e1625048089ab4e35bc0649ce478500e" @@ -3439,6 +3485,13 @@ dependencies: undici-types "~7.10.0" +"@types/pino@^7.0.5": + version "7.0.5" + resolved "https://registry.yarnpkg.com/@types/pino/-/pino-7.0.5.tgz#1c84a81b924a6a9e263dbb581dffdbad7a3c60c4" + integrity sha512-wKoab31pknvILkxAF8ss+v9iNyhw5Iu/0jLtRkUD74cNfOOLJNnqfFKAv0r7wVaTQxRZtWrMpGfShwwBjOcgcg== + dependencies: + pino "*" + "@types/pluralize@^0.0.33": version "0.0.33" resolved "https://registry.yarnpkg.com/@types/pluralize/-/pluralize-0.0.33.tgz#8ad9018368c584d268667dd9acd5b3b806e8c82a" @@ -3747,6 +3800,15 @@ "@typescript-eslint/types" "8.41.0" eslint-visitor-keys "^4.2.1" +"@typespec/ts-http-runtime@^0.3.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.1.tgz#2fa94050f25b4d85d0bc8b9d97874b8d347a9173" + integrity sha512-SnbaqayTVFEA6/tYumdF0UmybY0KHyKwGPBXnyckFlrrKdhWFrL3a2HIPXHjht5ZOElKGcXfD2D63P36btb+ww== + dependencies: + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.0" + tslib "^2.6.2" + "@ungap/with-resolvers@^0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@ungap/with-resolvers/-/with-resolvers-0.1.0.tgz#63a07b13bbf10ffff074a36498cce8d82aeeecc4" @@ -4426,7 +4488,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.3: +bl@^4.0.2: version "4.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== @@ -4503,6 +4565,13 @@ buffer@^6.0.3: base64-js "^1.3.1" ieee754 "^1.2.1" +bundle-name@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-4.1.0.tgz#f3b96b34160d6431a19d7688135af7cfb8797889" + integrity sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q== + dependencies: + run-applescript "^7.0.0" + bytes@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" @@ -4567,14 +4636,6 @@ 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" @@ -4636,11 +4697,6 @@ 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" @@ -4973,13 +5029,6 @@ 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" @@ -5009,11 +5058,6 @@ 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" @@ -5024,6 +5068,19 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== +default-browser-id@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-5.0.0.tgz#a1d98bf960c15082d8a3fa69e83150ccccc3af26" + integrity sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA== + +default-browser@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-5.2.1.tgz#7b7ba61204ff3e425b556869ae6d3e9d9f1712cf" + integrity sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg== + dependencies: + bundle-name "^4.1.0" + default-browser-id "^5.0.0" + define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" @@ -5038,6 +5095,11 @@ define-lazy-prop@^2.0.0: resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== +define-lazy-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" + integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== + define-properties@^1.1.3, define-properties@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" @@ -5067,11 +5129,6 @@ 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.1" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.1.1.tgz#9f1e511ace6bb525efea4651345beac424dac7b9" - integrity sha512-ecqj/sy1jcK1uWrwpR67UhYrIFQ+5WlGxth34WquCbamhFA6hkkwiu37o6J5xCHdo1oixJRfVRw+ywV+Hq/0Aw== - 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" @@ -5898,11 +5955,6 @@ 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" @@ -6237,11 +6289,6 @@ 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" @@ -6348,11 +6395,6 @@ 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" @@ -6602,7 +6644,7 @@ http-errors@2.0.0, http-errors@^2.0.0: statuses "2.0.1" toidentifier "1.0.1" -http-proxy-agent@^7.0.2: +http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.2: version "7.0.2" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== @@ -6610,7 +6652,7 @@ http-proxy-agent@^7.0.2: agent-base "^7.1.0" debug "^4.3.4" -https-proxy-agent@^7.0.6: +https-proxy-agent@^7.0.0, https-proxy-agent@^7.0.6: version "7.0.6" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== @@ -6705,7 +6747,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.0: +ini@^1.3.5: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== @@ -6865,6 +6907,11 @@ is-docker@^2.0.0, is-docker@^2.1.1: resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== +is-docker@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" + integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -6904,6 +6951,13 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-inside-container@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" + integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== + dependencies: + is-docker "^3.0.0" + is-map@^2.0.2, is-map@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" @@ -7010,6 +7064,13 @@ is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" +is-wsl@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-3.1.0.tgz#e1c657e39c10090afcbedec61720f6b924c3cbd2" + integrity sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw== + dependencies: + is-inside-container "^1.0.0" + isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" @@ -7685,11 +7746,6 @@ 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" @@ -7716,7 +7772,7 @@ minimatch@^9.0.4: dependencies: brace-expansion "^2.0.1" -minimist@^1.1.0, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6: +minimist@^1.1.0, minimist@^1.2.0, 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== @@ -7726,11 +7782,6 @@ minimist@^1.1.0, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1. 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" @@ -7816,11 +7867,6 @@ 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" @@ -7859,18 +7905,6 @@ nmtree@^1.0.6: dependencies: commander "^2.11.0" -node-abi@^3.3.0: - version "3.77.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.77.0.tgz#3ad90d5c9d45663420e5aa4ff58dbf4e3625419a" - integrity sha512-DSmt0OEcLoK4i3NuscSbGjOf3bqiDEutejqENSplMSFA/gmB8mkED9G4pKWnPl7MDU4rSHebKPHeitpDfyH0cQ== - 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.4.0: version "8.5.0" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-8.5.0.tgz#c91b2d7682fa457d2e1c388150f0dff9aafb8f3f" @@ -8057,6 +8091,16 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" +open@^10.1.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/open/-/open-10.2.0.tgz#b9d855be007620e80b6fb05fac98141fe62db73c" + integrity sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA== + dependencies: + default-browser "^5.2.1" + define-lazy-prop "^3.0.0" + is-inside-container "^1.0.0" + wsl-utils "^0.1.0" + open@^8.0.4: version "8.4.2" resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" @@ -8256,11 +8300,6 @@ 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" @@ -8271,35 +8310,13 @@ 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: - 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.3.31: - version "5.3.31" - resolved "https://registry.yarnpkg.com/pdfjs-dist/-/pdfjs-dist-5.3.31.tgz#0c429f3bc43c57ec1a95fa2874f2f93189d2d40e" - integrity sha512-EhPdIjNX0fcdwYQO+e3BAAJPXt+XI29TZWC7COhIXs/K0JHcUt1Gdz1ITpebTwVMFiLsukdUZ3u0oTO7jij+VA== - optionalDependencies: - "@napi-rs/canvas" "^0.1.67" - -pdfjs-dist@^4.6.82: +pdfjs-dist@4.8.69, pdfjs-dist@5.3.31, pdfjs-dist@^4.6.82, pdfjs-dist@^4.8.69, pdfjs-dist@^5.2.133: 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.2.133: - version "5.4.149" - resolved "https://registry.yarnpkg.com/pdfjs-dist/-/pdfjs-dist-5.4.149.tgz#7ff5b8427f37cd43e16377adf509af8595938afc" - integrity sha512-Xe8/1FMJEQPUVSti25AlDpwpUm2QAVmNOpFP0SIahaPIOKBKICaefbzogLdwey3XGGoaP4Lb9wqiw2e9Jqp0LA== - optionalDependencies: - "@napi-rs/canvas" "^0.1.77" - picocolors@1.1.1, picocolors@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" @@ -8346,6 +8363,23 @@ pino-std-serializers@^7.0.0: resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz#7c625038b13718dbbd84ab446bd673dc52259e3b" integrity sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA== +pino@*, pino@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/pino/-/pino-10.0.0.tgz#3d1a8abc7a700142edebf02a7b291834da199fbe" + integrity sha512-eI9pKwWEix40kfvSzqEP6ldqOoBIN7dwD/o91TY5z8vQI12sAffpR/pOqAD1IVVwIVHDpHjkq0joBPdJD0rafA== + dependencies: + atomic-sleep "^1.0.0" + on-exit-leak-free "^2.1.0" + pino-abstract-transport "^2.0.0" + pino-std-serializers "^7.0.0" + process-warning "^5.0.0" + quick-format-unescaped "^4.0.3" + real-require "^0.2.0" + safe-stable-stringify "^2.3.1" + slow-redact "^0.3.0" + sonic-boom "^4.0.1" + thread-stream "^3.0.0" + pino@^9.0.0, pino@^9.6.0: version "9.7.0" resolved "https://registry.yarnpkg.com/pino/-/pino-9.7.0.tgz#ff7cd86eb3103ee620204dbd5ca6ffda8b53f645" @@ -8478,24 +8512,6 @@ 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" @@ -8620,16 +8636,6 @@ 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" @@ -9021,6 +9027,11 @@ rrweb-cssom@^0.8.0: resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz#3021d1b4352fbf3b614aaeed0bc0d5739abe0bc2" integrity sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw== +run-applescript@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-7.1.0.tgz#2e9e54c4664ec3106c5b5630e249d3d6595c4911" + integrity sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q== + run-async@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" @@ -9146,7 +9157,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.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: +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.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== @@ -9281,20 +9292,6 @@ 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" @@ -9346,6 +9343,11 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" +slow-redact@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/slow-redact/-/slow-redact-0.3.1.tgz#4cb9ad7011dcba97b8a4b58ce8a5d660243100f6" + integrity sha512-NvFvl1GuLZNW4U046Tfi8b26zXo8aBzgCAS2f7yVJR/fArN93mOqSA99cB9uITm92ajSz01bsu1K7SCVVjIMpQ== + sonic-boom@^4.0.1: version "4.2.0" resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-4.2.0.tgz#e59a525f831210fa4ef1896428338641ac1c124d" @@ -9635,11 +9637,6 @@ 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" @@ -9866,27 +9863,6 @@ 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,7 +10051,7 @@ tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.0.1, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.6.2, tslib@^2.6.3, tslib@^2.7.0: +tslib@^2.0.0, tslib@^2.0.1, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.6.2, tslib@^2.6.3, tslib@^2.7.0: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== @@ -10090,13 +10066,6 @@ 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" @@ -10641,6 +10610,13 @@ ws@^7.5.5: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== +wsl-utils@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/wsl-utils/-/wsl-utils-0.1.0.tgz#8783d4df671d4d50365be2ee4c71917a0557baab" + integrity sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw== + dependencies: + is-wsl "^3.1.0" + xml-name-validator@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-5.0.0.tgz#82be9b957f7afdacf961e5980f1bf227c0bf7673" @@ -10755,3 +10731,8 @@ zod@^4.0.14: version "4.0.14" resolved "https://registry.yarnpkg.com/zod/-/zod-4.0.14.tgz#cc3a0a21981e63e0f99c0f4f1decd92ec3be7e9f" integrity sha512-nGFJTnJN6cM2v9kXL+SOBq3AtjQby3Mv5ySGFof5UGRHrRioSJ5iG680cYNjE/yWk671nROcpPj4hAS8nyLhSw== + +zod@^4.1.11: + version "4.1.11" + resolved "https://registry.yarnpkg.com/zod/-/zod-4.1.11.tgz#4aab62f76cfd45e6c6166519ba31b2ea019f75f5" + integrity sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg== From 2192ef0b2f0898cd2fbe24aad193be7e218d2d4b Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Fri, 3 Oct 2025 14:53:32 -0500 Subject: [PATCH 02/11] fix terraform module name --- terraform/envs/qa/main.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/terraform/envs/qa/main.tf b/terraform/envs/qa/main.tf index 6fc1bfd7..7efe371b 100644 --- a/terraform/envs/qa/main.tf +++ b/terraform/envs/qa/main.tf @@ -88,7 +88,7 @@ module "archival" { }) } -module "archival" { +module "dirsync" { source = "../../modules/dirsync" ProjectId = var.ProjectId RunEnvironment = "dev" From 12d05dd05c12db2fe045baf624fef5a7505b8cca Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Fri, 3 Oct 2025 14:54:43 -0500 Subject: [PATCH 03/11] Reduce infracost usage --- infracost-usage.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/infracost-usage.yml b/infracost-usage.yml index 9ac255c8..e95a5d8c 100644 --- a/infracost-usage.yml +++ b/infracost-usage.yml @@ -356,7 +356,7 @@ resource_type_default_usage: monthly_bulk_data_retrieval_gb: 0 # Monthly data retrievals in GB (for bulk level of S3 Glacier). early_delete_gb: 0 # If an archive is deleted within 6 months of being uploaded, you will be charged an early deletion fee per GB. aws_secretsmanager_secret: - monthly_requests: 1000000 # Monthly API requests to Secrets Manager. + monthly_requests: 20000 # Monthly API requests to Secrets Manager. aws_sfn_state_machine: monthly_transitions: 200000 # Monthly number of state transitions. Only applicable for Standard Workflows. monthly_requests: 5000000 # Monthly number of workflow requests. Only applicable for Express Workflows. From 4d280c55ac3c1ced49fe4d31f4daa7dcfa348779 Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Fri, 3 Oct 2025 14:56:36 -0500 Subject: [PATCH 04/11] fix terraform --- terraform/modules/dirsync/main.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/terraform/modules/dirsync/main.tf b/terraform/modules/dirsync/main.tf index ed71487a..4b7b585b 100644 --- a/terraform/modules/dirsync/main.tf +++ b/terraform/modules/dirsync/main.tf @@ -37,7 +37,7 @@ resource "aws_iam_policy" "this" { { Action = ["logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents"], Effect = "Allow", - Resource = ["${aws_cloudwatch_log_group.archive_logs.arn}:*"] + Resource = ["${aws_cloudwatch_log_group.this.arn}:*"] }, { Action = ["secretsmanager:GetSecretValue"], From 78d8b3531317b83c35c5a6701ed525d57c1e5b49 Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Fri, 3 Oct 2025 15:02:31 -0500 Subject: [PATCH 05/11] Add logging statement --- src/dirsync/sync.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dirsync/sync.ts b/src/dirsync/sync.ts index 8540ba34..b718cc60 100644 --- a/src/dirsync/sync.ts +++ b/src/dirsync/sync.ts @@ -17,6 +17,7 @@ export const handler = async ( secretConfig.entraClientSecret, ); const entraUsers = await getAllEntraUsers(entraClient); + logger.info(`Retrieved ${entraUsers.length} users from Entra ID.`); return { statusCode: 200, body: JSON.stringify("Done!"), From 148babe76e6a3757005e776829d9dfe8b2851add Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Fri, 3 Oct 2025 15:04:15 -0500 Subject: [PATCH 06/11] don't store the thing --- terraform/modules/dirsync/main.tf | 41 ------------------------------- 1 file changed, 41 deletions(-) diff --git a/terraform/modules/dirsync/main.tf b/terraform/modules/dirsync/main.tf index 4b7b585b..6f6ec457 100644 --- a/terraform/modules/dirsync/main.tf +++ b/terraform/modules/dirsync/main.tf @@ -93,44 +93,3 @@ resource "aws_cloudwatch_event_target" "lambda_target" { target_id = "DirsyncLambdaTarget" arn = aws_lambda_function.this.arn } - -resource "aws_secretsmanager_secret" "config" { - name = "infra-core-api-gsuite-dirsync" - description = "Configuration for Entra ID to Google Workspace directory sync" - - lifecycle { - ignore_changes = [ - name, - description, - ] - } -} - -resource "aws_secretsmanager_secret_version" "config" { - secret_id = aws_secretsmanager_secret.config.id - secret_string = jsonencode({ - entraTenantId = "REPLACE_WITH_TENANT_ID" - entraClientId = "REPLACE_WITH_CLIENT_ID" - entraClientSecret = "REPLACE_WITH_CLIENT_SECRET" - googleDelegatedUser = "admin@yourdomain.com" - googleServiceAccountJson = jsonencode({ - type = "service_account" - project_id = "REPLACE_WITH_PROJECT_ID" - private_key_id = "REPLACE_WITH_PRIVATE_KEY_ID" - private_key = "REPLACE_WITH_PRIVATE_KEY" - client_email = "REPLACE_WITH_CLIENT_EMAIL" - client_id = "REPLACE_WITH_CLIENT_ID" - auth_uri = "https://accounts.google.com/o/oauth2/auth" - token_uri = "https://oauth2.googleapis.com/token" - auth_provider_x509_cert_url = "https://www.googleapis.com/oauth2/v1/certs" - client_x509_cert_url = "REPLACE_WITH_CERT_URL" - }) - deleteRemovedContacts = false - }) - - lifecycle { - ignore_changes = [ - secret_string, - ] - } -} From 35e0f0eff7392d79f5b7d6466d7cec848277e486 Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Fri, 3 Oct 2025 15:18:55 -0500 Subject: [PATCH 07/11] Update secret config --- Makefile | 1 - src/dirsync/config.ts | 16 +++++++++------- src/dirsync/entra.ts | 15 ++++++++------- src/dirsync/sync.ts | 2 +- terraform/modules/dirsync/main.tf | 2 +- 5 files changed, 19 insertions(+), 17 deletions(-) diff --git a/Makefile b/Makefile index e90169ff..c8240539 100644 --- a/Makefile +++ b/Makefile @@ -41,7 +41,6 @@ build: src/ rm -rf node_modules/aws-crt/dist/bin/{darwin*,linux-x64*,linux-arm64-musl} && \ rm -rf node_modules/argon2/prebuilds/{darwin*,freebsd*,linux-arm,linux-x64*,win32-x64*} && \ rm -rf node_modules/argon2/prebuilds/linux-arm64/argon2.armv8.musl.node" - local: VITE_BUILD_HASH=$(GIT_HASH) yarn run dev diff --git a/src/dirsync/config.ts b/src/dirsync/config.ts index de2221b0..a14e65d3 100644 --- a/src/dirsync/config.ts +++ b/src/dirsync/config.ts @@ -4,18 +4,20 @@ import { } from "@aws-sdk/client-secrets-manager"; import { z } from "zod"; -export const CONFIG_SECRET = "infra-core-api-gsuite-dirsync"; +export const CONFIG_SECRET = "infra-core-api-gsuite-dirsync-config"; const SecretsConfigSchema = z.object({ entraTenantId: z.string().min(1, "entraTenantId is required"), entraClientId: z.string().min(1, "entraClientId is required"), - entraClientSecret: z.string().min(1, "entraClientSecret is required"), - googleDelegatedUser: z + entraClientCertificate: z .string() - .email("googleDelegatedUser must be a valid email"), - googleServiceAccountJson: z - .string() - .min(1, "googleServiceAccountJson is required"), + .min(1, "entraClientCertificate is required"), + // googleDelegatedUser: z + // .string() + // .email("googleDelegatedUser must be a valid email"), + // googleServiceAccountJson: z + // .string() + // .min(1, "googleServiceAccountJson is required"), deleteRemovedContacts: z.boolean().default(false), }); diff --git a/src/dirsync/entra.ts b/src/dirsync/entra.ts index cedf4d97..a09e3025 100644 --- a/src/dirsync/entra.ts +++ b/src/dirsync/entra.ts @@ -1,5 +1,5 @@ import { Client } from "@microsoft/microsoft-graph-client"; -import { ClientSecretCredential } from "@azure/identity"; +import { ClientCertificateCredential } from "@azure/identity"; import { parseDisplayName } from "../common/utils.js"; export interface EntraUser { @@ -24,13 +24,14 @@ interface GraphUser { export const createEntraClient = ( tenantId: string, clientId: string, - clientSecret: string, + clientCertificate: string, // Base64 encoded PFX or PEM certificate ): Client => { - const credential = new ClientSecretCredential( - tenantId, - clientId, - clientSecret, - ); + // Decode the certificate from base64 + const certificateBuffer = Buffer.from(clientCertificate, "base64"); + + const credential = new ClientCertificateCredential(tenantId, clientId, { + certificate: certificateBuffer.toString("utf-8"), // For PEM format + }); return Client.initWithMiddleware({ authProvider: { diff --git a/src/dirsync/sync.ts b/src/dirsync/sync.ts index b718cc60..047f6c68 100644 --- a/src/dirsync/sync.ts +++ b/src/dirsync/sync.ts @@ -14,7 +14,7 @@ export const handler = async ( const entraClient = createEntraClient( secretConfig.entraTenantId, secretConfig.entraClientId, - secretConfig.entraClientSecret, + secretConfig.entraClientCertificate, ); const entraUsers = await getAllEntraUsers(entraClient); logger.info(`Retrieved ${entraUsers.length} users from Entra ID.`); diff --git a/terraform/modules/dirsync/main.tf b/terraform/modules/dirsync/main.tf index 6f6ec457..19689216 100644 --- a/terraform/modules/dirsync/main.tf +++ b/terraform/modules/dirsync/main.tf @@ -43,7 +43,7 @@ resource "aws_iam_policy" "this" { Action = ["secretsmanager:GetSecretValue"], Effect = "Allow", Resource = [ - "arn:aws:secretsmanager:${data.aws_region.current.region}:${data.aws_caller_identity.current.account_id}:secret:infra-core-api-gsuite-dirsync*", + "arn:aws:secretsmanager:${data.aws_region.current.region}:${data.aws_caller_identity.current.account_id}:secret:infra-core-api-gsuite-dirsync-config*", ] }, ] From 410ab92e3cf63c9ab9b419329d2ad9b8f5ba64e2 Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Fri, 3 Oct 2025 15:44:43 -0500 Subject: [PATCH 08/11] Update --- src/dirsync/README.md | 10 ++++++++++ src/dirsync/entra.ts | 16 +++++++++------- src/dirsync/sync.ts | 2 -- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/dirsync/README.md b/src/dirsync/README.md index b001bde6..6f977b34 100644 --- a/src/dirsync/README.md +++ b/src/dirsync/README.md @@ -1 +1,11 @@ # Entra ID to Google Workspace External Contact Sync + + +# Creating certificates +```bash +openssl req -x509 -newkey rsa:2048 -keyout private-key.pem -out certificate.pem -days 7350 -nodes -subj "/CN=DirSync" +cat private-key.pem certificate.pem > combined.pem +base64 -i combined.pem -o combined-base64.txt +``` + +Upload `certificate.pem` to Azure, and the contents of `combined-base64.txt` to Secrets Manager. diff --git a/src/dirsync/entra.ts b/src/dirsync/entra.ts index a09e3025..39fee48c 100644 --- a/src/dirsync/entra.ts +++ b/src/dirsync/entra.ts @@ -1,6 +1,7 @@ import { Client } from "@microsoft/microsoft-graph-client"; import { ClientCertificateCredential } from "@azure/identity"; import { parseDisplayName } from "../common/utils.js"; +import { logger } from "./logging.js"; export interface EntraUser { email: string; @@ -24,13 +25,14 @@ interface GraphUser { export const createEntraClient = ( tenantId: string, clientId: string, - clientCertificate: string, // Base64 encoded PFX or PEM certificate + clientCertificate: string, ): Client => { - // Decode the certificate from base64 - const certificateBuffer = Buffer.from(clientCertificate, "base64"); - + logger.info("Creating the Entra ID client"); + const certificatePem = Buffer.from(clientCertificate, "base64").toString( + "utf-8", + ); const credential = new ClientCertificateCredential(tenantId, clientId, { - certificate: certificateBuffer.toString("utf-8"), // For PEM format + certificate: certificatePem, }); return Client.initWithMiddleware({ @@ -51,7 +53,7 @@ export const createEntraClient = ( export const getAllEntraUsers = async ( client: Client, ): Promise => { - console.log("Fetching users from Entra ID..."); + logger.info("Fetching users from Entra ID..."); const users: EntraUser[] = []; try { @@ -104,7 +106,7 @@ export const getAllEntraUsers = async ( } } - console.log(`Fetched ${users.length} users from Entra ID`); + logger.info(`Fetched ${users.length} users from Entra ID`); return users; } catch (error) { console.error("Error fetching Entra ID users:", error); diff --git a/src/dirsync/sync.ts b/src/dirsync/sync.ts index 047f6c68..5437b115 100644 --- a/src/dirsync/sync.ts +++ b/src/dirsync/sync.ts @@ -10,14 +10,12 @@ export const handler = async ( _context: Context, ): Promise => { logger.info("Started the sync lambda handler!"); - logger.info("Creating the Entra ID client"); const entraClient = createEntraClient( secretConfig.entraTenantId, secretConfig.entraClientId, secretConfig.entraClientCertificate, ); const entraUsers = await getAllEntraUsers(entraClient); - logger.info(`Retrieved ${entraUsers.length} users from Entra ID.`); return { statusCode: 200, body: JSON.stringify("Done!"), From 2be9ed6b9054ef3d641092b836553ca63469a317 Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Fri, 3 Oct 2025 15:45:25 -0500 Subject: [PATCH 09/11] Update logging statements --- src/dirsync/config.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/dirsync/config.ts b/src/dirsync/config.ts index a14e65d3..e12e8458 100644 --- a/src/dirsync/config.ts +++ b/src/dirsync/config.ts @@ -3,6 +3,7 @@ import { SecretsManagerClient, } from "@aws-sdk/client-secrets-manager"; import { z } from "zod"; +import { logger } from "./logging"; export const CONFIG_SECRET = "infra-core-api-gsuite-dirsync-config"; @@ -62,8 +63,8 @@ export const getConfig = async (): Promise => { environment, }; - console.log( - `Configuration loaded successfully for environment: ${config.environment}`, + logger.info( + `Configuration loaded successfully for "${config.environment}" environment`, ); return config; From 5b7cb14a18efa561b9ae8ba482f9d67a3c2f7a67 Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Sun, 5 Oct 2025 02:01:14 -0500 Subject: [PATCH 10/11] Update --- src/dirsync/config.ts | 10 +- src/dirsync/gsuite.ts | 311 ++++++++++++++++++++++++++++++ src/dirsync/package.json | 2 + src/dirsync/sync.ts | 232 +++++++++++++++++++++-- yarn.lock | 399 ++++++++++++++++++++++++++++++++++++++- 5 files changed, 922 insertions(+), 32 deletions(-) create mode 100644 src/dirsync/gsuite.ts diff --git a/src/dirsync/config.ts b/src/dirsync/config.ts index e12e8458..9d659661 100644 --- a/src/dirsync/config.ts +++ b/src/dirsync/config.ts @@ -13,12 +13,10 @@ const SecretsConfigSchema = z.object({ entraClientCertificate: z .string() .min(1, "entraClientCertificate is required"), - // googleDelegatedUser: z - // .string() - // .email("googleDelegatedUser must be a valid email"), - // googleServiceAccountJson: z - // .string() - // .min(1, "googleServiceAccountJson is required"), + googleDelegatedUser: z.email("googleDelegatedUser must be a valid email"), + googleServiceAccountJson: z + .string() + .min(1, "googleServiceAccountJson is required"), deleteRemovedContacts: z.boolean().default(false), }); diff --git a/src/dirsync/gsuite.ts b/src/dirsync/gsuite.ts new file mode 100644 index 00000000..c42085b1 --- /dev/null +++ b/src/dirsync/gsuite.ts @@ -0,0 +1,311 @@ +import { google } from "googleapis"; +import { GoogleAuth } from "google-auth-library"; + +export interface GoogleContact { + email: string; + upn: string; + givenName: string; + familyName: string; + displayName: string; +} + +export interface ExistingContact { + id: string; // Contact ID for updates/deletes + contact: GoogleContact; +} + +/** + * Creates a Google API client with domain-wide delegation + */ +export const createGoogleClient = ( + serviceAccountJson: string, + delegatedUser: string, +): GoogleAuth => { + const serviceAccountInfo = JSON.parse(serviceAccountJson); + + const auth = new google.auth.GoogleAuth({ + credentials: serviceAccountInfo, + scopes: ["https://www.google.com/m8/feeds"], // Domain Shared Contacts API scope + clientOptions: { + subject: delegatedUser, + }, + }); + + return auth; +}; + +/** + * Fetches all domain shared contacts + */ +export const getAllDomainContacts = async ( + auth: GoogleAuth, + domain: string, +): Promise> => { + console.log("Fetching existing domain shared contacts..."); + const contacts = new Map(); + + try { + const client = await auth.getClient(); + const accessToken = await client.getAccessToken(); + + if (!accessToken.token) { + throw new Error("Failed to get access token"); + } + + // Use the Domain Shared Contacts API + const feedUrl = `https://www.google.com/m8/feeds/contacts/${domain}/full`; + + let startIndex = 1; + const maxResults = 1000; + let hasMore = true; + + while (hasMore) { + const url = `${feedUrl}?max-results=${maxResults}&start-index=${startIndex}&alt=json`; + + const response = await fetch(url, { + headers: { + Authorization: `Bearer ${accessToken.token}`, + "GData-Version": "3.0", + }, + }); + + if (!response.ok) { + throw new Error(`Failed to fetch contacts: ${response.statusText}`); + } + + const data = await response.json(); + const entries = data.feed?.entry || []; + + for (const entry of entries) { + const contact = parseContactEntry(entry); + if (contact) { + const key = getPrimaryEmail(contact); + contacts.set(key, { + id: getContactId(entry), + contact, + }); + } + } + + // Check if there are more results + hasMore = entries.length === maxResults; + startIndex += maxResults; + } + + console.log(`Found ${contacts.size} existing domain shared contacts`); + return contacts; + } catch (error) { + console.error("Error fetching domain contacts:", error); + throw error; + } +}; + +/** + * Creates a new domain shared contact + */ +export const createDomainContact = async ( + auth: GoogleAuth, + domain: string, + contact: GoogleContact, +): Promise => { + try { + const client = await auth.getClient(); + const accessToken = await client.getAccessToken(); + + if (!accessToken.token) { + throw new Error("Failed to get access token"); + } + + const feedUrl = `https://www.google.com/m8/feeds/contacts/${domain}/full`; + const atomEntry = contactToAtomXml(contact); + + const response = await fetch(feedUrl, { + method: "POST", + headers: { + Authorization: `Bearer ${accessToken.token}`, + "GData-Version": "3.0", + "Content-Type": "application/atom+xml", + }, + body: atomEntry, + }); + + if (!response.ok) { + throw new Error(`Failed to create contact: ${response.statusText}`); + } + + console.log(`Created contact: ${getPrimaryEmail(contact)}`); + return true; + } catch (error) { + console.error(`Error creating contact ${getPrimaryEmail(contact)}:`, error); + return false; + } +}; + +/** + * Updates an existing domain shared contact + */ +export const updateDomainContact = async ( + auth: GoogleAuth, + domain: string, + contactId: string, + contact: GoogleContact, +): Promise => { + try { + const client = await auth.getClient(); + const accessToken = await client.getAccessToken(); + + if (!accessToken.token) { + throw new Error("Failed to get access token"); + } + + const editUrl = `https://www.google.com/m8/feeds/contacts/${domain}/full/${contactId}`; + const atomEntry = contactToAtomXml(contact); + + const response = await fetch(editUrl, { + method: "PUT", + headers: { + Authorization: `Bearer ${accessToken.token}`, + "GData-Version": "3.0", + "Content-Type": "application/atom+xml", + "If-Match": "*", // Overwrite regardless of version + }, + body: atomEntry, + }); + + if (!response.ok) { + throw new Error(`Failed to update contact: ${response.statusText}`); + } + + console.log(`Updated contact: ${getPrimaryEmail(contact)}`); + return true; + } catch (error) { + console.error(`Error updating contact ${getPrimaryEmail(contact)}:`, error); + return false; + } +}; + +/** + * Deletes a domain shared contact + */ +export const deleteDomainContact = async ( + auth: GoogleAuth, + domain: string, + contactId: string, + email: string, +): Promise => { + try { + const client = await auth.getClient(); + const accessToken = await client.getAccessToken(); + + if (!accessToken.token) { + throw new Error("Failed to get access token"); + } + + const editUrl = `https://www.google.com/m8/feeds/contacts/${domain}/full/${contactId}`; + + const response = await fetch(editUrl, { + method: "DELETE", + headers: { + Authorization: `Bearer ${accessToken.token}`, + "GData-Version": "3.0", + "If-Match": "*", + }, + }); + + if (!response.ok) { + throw new Error(`Failed to delete contact: ${response.statusText}`); + } + + console.log(`Deleted contact: ${email}`); + return true; + } catch (error) { + console.error(`Error deleting contact ${email}:`, error); + return false; + } +}; + +/** + * Converts a contact to Atom XML format for Google's API + */ +const contactToAtomXml = (contact: GoogleContact): string => { + const emails: string[] = []; + + if (contact.email) { + emails.push( + ``, + ); + } + + if ( + contact.upn && + contact.upn.toLowerCase() !== contact.email.toLowerCase() + ) { + emails.push( + ``, + ); + } + + return ` + + + + ${escapeXml(contact.givenName)} + ${escapeXml(contact.familyName)} + ${escapeXml(contact.displayName)} + + ${emails.join("\n ")} +`; +}; + +/** + * Parses a contact entry from the API response + */ +const parseContactEntry = (entry: any): GoogleContact | null => { + const emails = entry.gd$email || []; + if (emails.length === 0) { + return null; + } + + const primaryEmail = + emails.find((e: any) => e.primary === "true")?.address || emails[0].address; + const otherEmail = + emails.find((e: any) => e.rel?.includes("other"))?.address || ""; + + const name = entry.gd$name || {}; + + return { + email: primaryEmail || "", + upn: otherEmail || "", + givenName: name.gd$givenName?.$t || "", + familyName: name.gd$familyName?.$t || "", + displayName: name.gd$fullName?.$t || primaryEmail || "", + }; +}; + +/** + * Extracts the contact ID from an entry + */ +const getContactId = (entry: any): string => { + const id = entry.id?.$t || ""; + // Extract the last part of the ID (after the last /) + return id.split("/").pop() || id; +}; + +/** + * Gets the primary email identifier for a contact + */ +const getPrimaryEmail = (contact: GoogleContact): string => { + return (contact.email || contact.upn).toLowerCase(); +}; + +/** + * Escapes XML special characters + */ +const escapeXml = (str: string): string => { + return str + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'"); +}; diff --git a/src/dirsync/package.json b/src/dirsync/package.json index 5684503b..5c17efec 100644 --- a/src/dirsync/package.json +++ b/src/dirsync/package.json @@ -23,6 +23,8 @@ "@azure/identity": "^4.12.0", "@microsoft/microsoft-graph-client": "^3.0.7", "@types/pino": "^7.0.5", + "google-auth-library": "^10.4.0", + "googleapis": "^161.0.0", "pino": "^10.0.0", "zod": "^4.1.11" } diff --git a/src/dirsync/sync.ts b/src/dirsync/sync.ts index 5437b115..4bbb2b4c 100644 --- a/src/dirsync/sync.ts +++ b/src/dirsync/sync.ts @@ -1,23 +1,221 @@ -import { type Context, type EventBridgeEvent } from "aws-lambda"; -import { getConfig } from "./config"; -import { logger } from "./logging"; -import { createEntraClient, getAllEntraUsers } from "./entra"; +import { EventBridgeEvent, Context } from "aws-lambda"; +import { logger } from "./logging.js"; +import { getConfig } from "./config.js"; +import { + createEntraClient, + getAllEntraUsers, + getPrimaryEmail, +} from "./entra.js"; +import { + createGoogleClient, + getAllDomainContacts, + createDomainContact, + updateDomainContact, + deleteDomainContact, + GoogleContact, +} from "./gsuite.js"; -const secretConfig = await getConfig(); +interface SyncStats { + totalEntraUsers: number; + totalGoogleContacts: number; + created: number; + updated: number; + deleted: number; + errors: number; +} +/** + * Extracts domain from email address + */ +const extractDomain = (email: string): string => { + const match = email.match(/@(.+)$/); + return match ? match[1] : ""; +}; + +/** + * Checks if two contacts differ + */ +const contactsDiffer = ( + entra: GoogleContact, + google: GoogleContact, +): boolean => { + return ( + entra.givenName !== google.givenName || + entra.familyName !== google.familyName || + entra.displayName !== google.displayName || + entra.email !== google.email || + entra.upn !== google.upn + ); +}; + +/** + * Syncs contacts from Entra ID to Google Workspace Domain Shared Contacts + */ +const syncContacts = async ( + entraUsers: any[], + googleAuth: any, + domain: string, + deleteRemoved: boolean, +): Promise => { + logger.info("Starting contact sync"); + + const stats: SyncStats = { + totalEntraUsers: entraUsers.length, + totalGoogleContacts: 0, + created: 0, + updated: 0, + deleted: 0, + errors: 0, + }; + + // Fetch existing Google contacts + const googleContacts = await getAllDomainContacts(googleAuth, domain); + stats.totalGoogleContacts = googleContacts.size; + + // Build lookup map for Entra users + const entraMap = new Map(); + for (const user of entraUsers) { + const contact: GoogleContact = { + email: user.email, + upn: user.upn, + givenName: user.givenName, + familyName: user.familyName, + displayName: user.displayName, + }; + entraMap.set(getPrimaryEmail(user), contact); + } + + // Determine what operations to perform + const toCreate: GoogleContact[] = []; + const toUpdate: Array<{ id: string; contact: GoogleContact }> = []; + const toDelete: Array<{ id: string; email: string }> = []; + + // Find contacts to create or update + for (const [email, entraContact] of entraMap) { + const existing = googleContacts.get(email); + if (existing) { + if (contactsDiffer(entraContact, existing.contact)) { + toUpdate.push({ id: existing.id, contact: entraContact }); + } + } else { + toCreate.push(entraContact); + } + } + + // Find contacts to delete + if (deleteRemoved) { + for (const [email, googleContact] of googleContacts) { + if (!entraMap.has(email)) { + toDelete.push({ id: googleContact.id, email }); + } + } + } + + logger.info( + { + toCreate: toCreate.length, + toUpdate: toUpdate.length, + toDelete: toDelete.length, + }, + "Sync plan calculated", + ); + + // Execute create operations + for (const contact of toCreate) { + const success = await createDomainContact(googleAuth, domain, contact); + if (success) { + stats.created++; + } else { + stats.errors++; + } + } + + // Execute update operations + for (const { id, contact } of toUpdate) { + const success = await updateDomainContact(googleAuth, domain, id, contact); + if (success) { + stats.updated++; + } else { + stats.errors++; + } + } + + // Execute delete operations + for (const { id, email } of toDelete) { + const success = await deleteDomainContact(googleAuth, domain, id, email); + if (success) { + stats.deleted++; + } else { + stats.errors++; + } + } + + return stats; +}; + +/** + * Lambda handler for EventBridge scheduled sync + */ export const handler = async ( - event: EventBridgeEvent<"Scheduled Event", string>, + event: EventBridgeEvent<"Scheduled Event", any>, _context: Context, ): Promise => { - logger.info("Started the sync lambda handler!"); - const entraClient = createEntraClient( - secretConfig.entraTenantId, - secretConfig.entraClientId, - secretConfig.entraClientCertificate, - ); - const entraUsers = await getAllEntraUsers(entraClient); - return { - statusCode: 200, - body: JSON.stringify("Done!"), - }; + logger.info({ event }, "Started sync lambda handler"); + + try { + // Load configuration + const config = await getConfig(); + logger.info({ environment: config.environment }, "Configuration loaded"); + + // Extract domain from delegated user email + const domain = extractDomain(config.googleDelegatedUser); + if (!domain) { + throw new Error( + `Invalid googleDelegatedUser email: ${config.googleDelegatedUser}`, + ); + } + + // Create Entra ID client and fetch users + const entraClient = createEntraClient( + config.entraTenantId, + config.entraClientId, + config.entraClientCertificate, + ); + const entraUsers = await getAllEntraUsers(entraClient); + + // Create Google client + const googleAuth = createGoogleClient( + config.googleServiceAccountJson, + config.googleDelegatedUser, + ); + + // Perform sync + const stats = await syncContacts( + entraUsers, + googleAuth, + domain, + config.deleteRemovedContacts, + ); + + logger.info({ stats }, "Sync completed successfully"); + + return { + statusCode: 200, + body: JSON.stringify({ + message: "Sync completed successfully", + environment: config.environment, + stats, + }), + }; + } catch (error) { + logger.error({ error }, "Sync failed"); + + return { + statusCode: 500, + body: JSON.stringify({ + message: "Sync failed", + error: error instanceof Error ? error.message : "Unknown error", + }), + }; + } }; diff --git a/yarn.lock b/yarn.lock index a935e1bf..5b4614b5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1936,51 +1936,101 @@ resolved "https://registry.yarnpkg.com/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.77.tgz#58debdab512a950d505f17cd499e7171f33a5184" integrity sha512-jC8YX0rbAnu9YrLK1A52KM2HX9EDjrJSCLVuBf9Dsov4IC6GgwMLS2pwL9GFLJnSZBFgdwnA84efBehHT9eshA== +"@napi-rs/canvas-android-arm64@0.1.80": + version "0.1.80" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.80.tgz#2779ca5c8aaeb46c85eb72d29f1eb34efd46fb45" + integrity sha512-sk7xhN/MoXeuExlggf91pNziBxLPVUqF2CAVnB57KLG/pz7+U5TKG8eXdc3pm0d7Od0WreB6ZKLj37sX9muGOQ== + "@napi-rs/canvas-darwin-arm64@0.1.77": version "0.1.77" resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.77.tgz#84bbbf72d2ca647d2be7d1a0a64548ba086b8b95" integrity sha512-VFaCaCgAV0+hPwXajDIiHaaGx4fVCuUVYp/CxCGXmTGz699ngIEBx3Sa2oDp0uk3X+6RCRLueb7vD44BKBiPIg== +"@napi-rs/canvas-darwin-arm64@0.1.80": + version "0.1.80" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.80.tgz#638eaa2d0a2a373c7d15748743182718dcd95c4b" + integrity sha512-O64APRTXRUiAz0P8gErkfEr3lipLJgM6pjATwavZ22ebhjYl/SUbpgM0xcWPQBNMP1n29afAC/Us5PX1vg+JNQ== + "@napi-rs/canvas-darwin-x64@0.1.77": version "0.1.77" resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.77.tgz#e0f845fa5d2ad7eafe49c5e862a94b4be1dbc040" integrity sha512-uD2NSkf6I4S3o0POJDwweK85FE4rfLNA2N714MgiEEMMw5AmupfSJGgpYzcyEXtPzdaca6rBfKcqNvzR1+EyLQ== +"@napi-rs/canvas-darwin-x64@0.1.80": + version "0.1.80" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.80.tgz#bd6bc048dbd4b02b9620d9d07117ed93e6970978" + integrity sha512-FqqSU7qFce0Cp3pwnTjVkKjjOtxMqRe6lmINxpIZYaZNnVI0H5FtsaraZJ36SiTHNjZlUB69/HhxNDT1Aaa9vA== + "@napi-rs/canvas-linux-arm-gnueabihf@0.1.77": version "0.1.77" resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.77.tgz#51f2d786951c9c1eac8dbc92471a128212392cb6" integrity sha512-03GxMMZGhHRQxiA4gyoKT6iQSz8xnA6T9PAfg/WNJnbkVMFZG782DwUJUb39QIZ1uE1euMCPnDgWAJ092MmgJQ== +"@napi-rs/canvas-linux-arm-gnueabihf@0.1.80": + version "0.1.80" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.80.tgz#ce6bfbeb19d9234c42df5c384e5989aa7d734789" + integrity sha512-eyWz0ddBDQc7/JbAtY4OtZ5SpK8tR4JsCYEZjCE3dI8pqoWUC8oMwYSBGCYfsx2w47cQgQCgMVRVTFiiO38hHQ== + "@napi-rs/canvas-linux-arm64-gnu@0.1.77": version "0.1.77" resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.77.tgz#e92897dac7f3b7acb806529bf8a0ab20ac26e84f" integrity sha512-ZO+d2gRU9JU1Bb7SgJcJ1k9wtRMCpSWjJAJ+2phhu0Lw5As8jYXXXmLKmMTGs1bOya2dBMYDLzwp7KS/S/+aCA== +"@napi-rs/canvas-linux-arm64-gnu@0.1.80": + version "0.1.80" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.80.tgz#3b7a7832fef763826fa5fb740d5757204e52607d" + integrity sha512-qwA63t8A86bnxhuA/GwOkK3jvb+XTQaTiVML0vAWoHyoZYTjNs7BzoOONDgTnNtr8/yHrq64XXzUoLqDzU+Uuw== + "@napi-rs/canvas-linux-arm64-musl@0.1.77": version "0.1.77" resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.77.tgz#f2ba1f00e734c6ab142efd86263adf5cb391a228" integrity sha512-S1KtnP1+nWs2RApzNkdNf8X4trTLrHaY7FivV61ZRaL8NvuGOkSkKa+gWN2iedIGFEDz6gecpl/JAUSewwFXYg== +"@napi-rs/canvas-linux-arm64-musl@0.1.80": + version "0.1.80" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.80.tgz#d8ccd91f31d70760628623cd575134ada17690a3" + integrity sha512-1XbCOz/ymhj24lFaIXtWnwv/6eFHXDrjP0jYkc6iHQ9q8oXKzUX1Lc6bu+wuGiLhGh2GS/2JlfORC5ZcXimRcg== + "@napi-rs/canvas-linux-riscv64-gnu@0.1.77": version "0.1.77" resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.77.tgz#c6b3cb3cd277de835ac06a87403eca51efa67acd" integrity sha512-A4YIKFYUwDtrSzCtdCAO5DYmRqlhCVKHdpq0+dBGPnIEhOQDFkPBTfoTAjO3pjlEnorlfKmNMOH21sKQg2esGA== +"@napi-rs/canvas-linux-riscv64-gnu@0.1.80": + version "0.1.80" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.80.tgz#927a3b859a0e3c691beaf52a19bc4736c4ffc9b8" + integrity sha512-XTzR125w5ZMs0lJcxRlS1K3P5RaZ9RmUsPtd1uGt+EfDyYMu4c6SEROYsxyatbbu/2+lPe7MPHOO/0a0x7L/gw== + "@napi-rs/canvas-linux-x64-gnu@0.1.77": version "0.1.77" resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.77.tgz#c36c7dbec434d6c60529edbfe46a32d1ac21d096" integrity sha512-Lt6Sef5l0+5O1cSZ8ysO0JI+x+rSrqZyXs5f7+kVkCAOVq8X5WTcDVbvWvEs2aRhrWTp5y25Jf2Bn+3IcNHOuQ== +"@napi-rs/canvas-linux-x64-gnu@0.1.80": + version "0.1.80" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.80.tgz#25c0416bcedd6fadc15295e9afa8d9697232050c" + integrity sha512-BeXAmhKg1kX3UCrJsYbdQd3hIMDH/K6HnP/pG2LuITaXhXBiNdh//TVVVVCBbJzVQaV5gK/4ZOCMrQW9mvuTqA== + "@napi-rs/canvas-linux-x64-musl@0.1.77": version "0.1.77" resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.77.tgz#36c20eae7c46f724da406a68199755601a7b311d" integrity sha512-NiNFvC+D+omVeJ3IjYlIbyt/igONSABVe9z0ZZph29epHgZYu4eHwV9osfpRt1BGGOAM8LkFrHk4LBdn2EDymA== +"@napi-rs/canvas-linux-x64-musl@0.1.80": + version "0.1.80" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.80.tgz#de85d644e09120a60996bbe165cc2efee804551b" + integrity sha512-x0XvZWdHbkgdgucJsRxprX/4o4sEed7qo9rCQA9ugiS9qE2QvP0RIiEugtZhfLH3cyI+jIRFJHV4Fuz+1BHHMg== + "@napi-rs/canvas-win32-x64-msvc@0.1.77": version "0.1.77" resolved "https://registry.yarnpkg.com/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.77.tgz#1cb0b9964e0b4db348e4120eea39b5c60aa5432c" integrity sha512-fP6l0hZiWykyjvpZTS3sI46iib8QEflbPakNoUijtwyxRuOPTTBfzAWZUz5z2vKpJJ/8r305wnZeZ8lhsBHY5A== +"@napi-rs/canvas-win32-x64-msvc@0.1.80": + version "0.1.80" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.80.tgz#6bb95885d9377912d71f1372fc1916fb54d6ef0a" + integrity sha512-Z8jPsM6df5V8B1HrCHB05+bDiCxjE9QA//3YrkKIdVDEwn5RKaqOxCJDRJkl48cJbylcrJbW4HxZbTte8juuPg== + "@napi-rs/canvas@^0.1.65": version "0.1.77" resolved "https://registry.yarnpkg.com/@napi-rs/canvas/-/canvas-0.1.77.tgz#e78e208adb79cf211f6d260664d766b6f26da341" @@ -1997,6 +2047,22 @@ "@napi-rs/canvas-linux-x64-musl" "0.1.77" "@napi-rs/canvas-win32-x64-msvc" "0.1.77" +"@napi-rs/canvas@^0.1.67", "@napi-rs/canvas@^0.1.77": + version "0.1.80" + resolved "https://registry.yarnpkg.com/@napi-rs/canvas/-/canvas-0.1.80.tgz#53615bea56fd94e07331ab13caa7a39efc4914ab" + integrity sha512-DxuT1ClnIPts1kQx8FBmkk4BQDTfI5kIzywAaMjQSXfNnra5UFU9PwurXrl+Je3bJ6BGsp/zmshVVFbCmyI+ww== + optionalDependencies: + "@napi-rs/canvas-android-arm64" "0.1.80" + "@napi-rs/canvas-darwin-arm64" "0.1.80" + "@napi-rs/canvas-darwin-x64" "0.1.80" + "@napi-rs/canvas-linux-arm-gnueabihf" "0.1.80" + "@napi-rs/canvas-linux-arm64-gnu" "0.1.80" + "@napi-rs/canvas-linux-arm64-musl" "0.1.80" + "@napi-rs/canvas-linux-riscv64-gnu" "0.1.80" + "@napi-rs/canvas-linux-x64-gnu" "0.1.80" + "@napi-rs/canvas-linux-x64-musl" "0.1.80" + "@napi-rs/canvas-win32-x64-msvc" "0.1.80" + "@napi-rs/wasm-runtime@^0.2.11": version "0.2.11" resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.11.tgz#192c1610e1625048089ab4e35bc0649ce478500e" @@ -4466,7 +4532,7 @@ base64-arraybuffer@^1.0.2: resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc" integrity sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ== -base64-js@^1.3.1: +base64-js@^1.3.0, base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -4483,12 +4549,17 @@ better-opn@^3.0.2: dependencies: open "^8.0.4" +bignumber.js@^9.0.0: + version "9.3.1" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.3.1.tgz#759c5aaddf2ffdc4f154f7b493e1c8770f88c4d7" + integrity sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ== + binary-extensions@^2.0.0: version "2.3.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== @@ -4636,6 +4707,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" @@ -4697,6 +4776,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" @@ -4960,6 +5044,11 @@ damerau-levenshtein@^1.0.8: resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== +data-uri-to-buffer@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e" + integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== + data-urls@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-5.0.0.tgz#2f76906bce1824429ffecb6920f45a0b30f00dde" @@ -5029,6 +5118,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" @@ -5058,6 +5154,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" @@ -5129,6 +5230,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.1" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.1.1.tgz#9f1e511ace6bb525efea4651345beac424dac7b9" + integrity sha512-ecqj/sy1jcK1uWrwpR67UhYrIFQ+5WlGxth34WquCbamhFA6hkkwiu37o6J5xCHdo1oixJRfVRw+ywV+Hq/0Aw== + 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" @@ -5311,7 +5417,7 @@ eastasianwidth@^0.2.0: resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== -ecdsa-sig-formatter@1.0.11: +ecdsa-sig-formatter@1.0.11, ecdsa-sig-formatter@^1.0.11: version "1.0.11" resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== @@ -5955,11 +6061,21 @@ 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" integrity sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw== +extend@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + external-editor@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" @@ -6139,6 +6255,14 @@ fengari@^0.1.4: sprintf-js "^1.1.1" tmp "^0.0.33" +fetch-blob@^3.1.2, fetch-blob@^3.1.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.2.0.tgz#f09b8d4bbd45adc6f0c20b7e787e793e309dcce9" + integrity sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ== + dependencies: + node-domexception "^1.0.0" + web-streams-polyfill "^3.0.3" + fflate@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.2.tgz#fc8631f5347812ad6028bbe4a2308b2792aa1dea" @@ -6280,6 +6404,13 @@ form-data@^4.0.0, form-data@^4.0.4: hasown "^2.0.2" mime-types "^2.1.12" +formdata-polyfill@^4.0.10: + version "4.0.10" + resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423" + integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== + dependencies: + fetch-blob "^3.1.2" + formidable@^3.5.4: version "3.5.4" resolved "https://registry.yarnpkg.com/formidable/-/formidable-3.5.4.tgz#ac9a593b951e829b3298f21aa9a2243932f32ed9" @@ -6289,6 +6420,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" @@ -6340,6 +6476,24 @@ functions-have-names@^1.2.3: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== +gaxios@^7.0.0, gaxios@^7.0.0-rc.4: + version "7.1.2" + resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-7.1.2.tgz#4954bc5628e3cd108e5252cb597b03a5f16c21ac" + integrity sha512-/Szrn8nr+2TsQT1Gp8iIe/BEytJmbyfrbFh419DfGQSkEgNEhbPi7JRJuughjkTzPWgU9gBQf5AVu3DbHt0OXA== + dependencies: + extend "^3.0.2" + https-proxy-agent "^7.0.1" + node-fetch "^3.3.2" + +gcp-metadata@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-7.0.1.tgz#43bb9cd482cf0590629b871ab9133af45b78382d" + integrity sha512-UcO3kefx6dCcZkgcTGgVOTFb7b1LlQ02hY1omMjjrrBzkajRMCFgYOjs7J71WqnuG1k2b+9ppGL7FsOfhZMQKQ== + dependencies: + gaxios "^7.0.0" + google-logging-utils "^1.0.0" + json-bigint "^1.0.0" + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -6395,6 +6549,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" @@ -6503,6 +6662,43 @@ globrex@^0.1.2: resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== +google-auth-library@^10.1.0, google-auth-library@^10.2.0, google-auth-library@^10.4.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-10.4.0.tgz#2d5e36f3e0b0f33b1c5466a2f25617ff2c258c91" + integrity sha512-CmIrSy1bqMQUsPmA9+hcSbAXL80cFhu40cGMUjCaLpNKVzzvi+0uAHq8GNZxkoGYIsTX4ZQ7e4aInAqWxgn4fg== + dependencies: + base64-js "^1.3.0" + ecdsa-sig-formatter "^1.0.11" + gaxios "^7.0.0" + gcp-metadata "^7.0.0" + google-logging-utils "^1.0.0" + gtoken "^8.0.0" + jws "^4.0.0" + +google-logging-utils@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/google-logging-utils/-/google-logging-utils-1.1.1.tgz#4a1f44a69a187eb954629c88c5af89c0dfbca51a" + integrity sha512-rcX58I7nqpu4mbKztFeOAObbomBbHU2oIb/d3tJfF3dizGSApqtSwYJigGCooHdnMyQBIw8BrWyK96w3YXgr6A== + +googleapis-common@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/googleapis-common/-/googleapis-common-8.0.0.tgz#7a3ea3aa3863c9d3e7635070314d639dadfa164a" + integrity sha512-66if47It7y+Sab3HMkwEXx1kCq9qUC9px8ZXoj1CMrmLmUw81GpbnsNlXnlyZyGbGPGcj+tDD9XsZ23m7GLaJQ== + dependencies: + extend "^3.0.2" + gaxios "^7.0.0-rc.4" + google-auth-library "^10.1.0" + qs "^6.7.0" + url-template "^2.0.8" + +googleapis@^161.0.0: + version "161.0.0" + resolved "https://registry.yarnpkg.com/googleapis/-/googleapis-161.0.0.tgz#63c1e3bf675683fdf131d5f05ae4f9613c5f60ee" + integrity sha512-JZy2cWMxgUF8E09KHzplI+z+FVG8NWDB/bsf4xevt9Um4bInb0X1qaG9qpDn49DHT5HsU0mOp3EOBGb8+AdE3Q== + dependencies: + google-auth-library "^10.2.0" + googleapis-common "^8.0.0" + gopd@^1.0.1, gopd@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" @@ -6518,6 +6714,14 @@ graphemer@^1.4.0: resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== +gtoken@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-8.0.0.tgz#d67a0e346dd441bfb54ad14040ddc3b632886575" + integrity sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw== + dependencies: + gaxios "^7.0.0" + jws "^4.0.0" + handlebars@^4.7.8: version "4.7.8" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" @@ -6652,7 +6856,7 @@ http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.2: agent-base "^7.1.0" debug "^4.3.4" -https-proxy-agent@^7.0.0, https-proxy-agent@^7.0.6: +https-proxy-agent@^7.0.0, https-proxy-agent@^7.0.1, https-proxy-agent@^7.0.6: version "7.0.6" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== @@ -6747,7 +6951,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== @@ -7243,6 +7447,13 @@ jsesc@^3.0.2: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== +json-bigint@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" + integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== + dependencies: + bignumber.js "^9.0.0" + json-buffer@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" @@ -7350,6 +7561,15 @@ jwa@^1.4.1: ecdsa-sig-formatter "1.0.11" safe-buffer "^5.0.1" +jwa@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-2.0.1.tgz#bf8176d1ad0cd72e0f3f58338595a13e110bc804" + integrity sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg== + dependencies: + buffer-equal-constant-time "^1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + jwks-rsa@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/jwks-rsa/-/jwks-rsa-3.2.0.tgz#132bc8bfa7b03928a273bbc93486f70226449e04" @@ -7370,6 +7590,14 @@ jws@^3.2.2: jwa "^1.4.1" safe-buffer "^5.0.1" +jws@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jws/-/jws-4.0.0.tgz#2d4e8cf6a318ffaa12615e9dec7e86e6c97310f4" + integrity sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg== + dependencies: + jwa "^2.0.0" + safe-buffer "^5.0.1" + keyv@^4.5.4: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" @@ -7746,6 +7974,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" @@ -7772,7 +8005,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== @@ -7782,6 +8015,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" @@ -7867,6 +8105,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" @@ -7905,6 +8148,18 @@ nmtree@^1.0.6: dependencies: commander "^2.11.0" +node-abi@^3.3.0: + version "3.77.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.77.0.tgz#3ad90d5c9d45663420e5aa4ff58dbf4e3625419a" + integrity sha512-DSmt0OEcLoK4i3NuscSbGjOf3bqiDEutejqENSplMSFA/gmB8mkED9G4pKWnPl7MDU4rSHebKPHeitpDfyH0cQ== + 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.4.0: version "8.5.0" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-8.5.0.tgz#c91b2d7682fa457d2e1c388150f0dff9aafb8f3f" @@ -7917,6 +8172,20 @@ node-cache@^5.1.2: dependencies: clone "2.x" +node-domexception@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" + integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== + +node-fetch@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.2.tgz#d1e889bacdf733b4ff3b2b243eb7a12866a0b78b" + integrity sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA== + dependencies: + data-uri-to-buffer "^4.0.0" + fetch-blob "^3.1.4" + formdata-polyfill "^4.0.10" + node-forge@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" @@ -8300,6 +8569,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" @@ -8310,13 +8584,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.3.31, pdfjs-dist@^4.6.82, pdfjs-dist@^4.8.69, pdfjs-dist@^5.2.133: +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.3.31: + version "5.3.31" + resolved "https://registry.yarnpkg.com/pdfjs-dist/-/pdfjs-dist-5.3.31.tgz#0c429f3bc43c57ec1a95fa2874f2f93189d2d40e" + integrity sha512-EhPdIjNX0fcdwYQO+e3BAAJPXt+XI29TZWC7COhIXs/K0JHcUt1Gdz1ITpebTwVMFiLsukdUZ3u0oTO7jij+VA== + optionalDependencies: + "@napi-rs/canvas" "^0.1.67" + +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.2.133: + version "5.4.149" + resolved "https://registry.yarnpkg.com/pdfjs-dist/-/pdfjs-dist-5.4.149.tgz#7ff5b8427f37cd43e16377adf509af8595938afc" + integrity sha512-Xe8/1FMJEQPUVSti25AlDpwpUm2QAVmNOpFP0SIahaPIOKBKICaefbzogLdwey3XGGoaP4Lb9wqiw2e9Jqp0LA== + optionalDependencies: + "@napi-rs/canvas" "^0.1.77" + picocolors@1.1.1, picocolors@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" @@ -8512,6 +8808,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" @@ -8609,7 +8923,7 @@ qrcode@^1.5.4: pngjs "^5.0.0" yargs "^15.3.1" -qs@^6.11.0, qs@^6.11.2: +qs@^6.11.0, qs@^6.11.2, qs@^6.7.0: version "6.14.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930" integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w== @@ -8636,6 +8950,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" @@ -9157,7 +9481,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.6.3, 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.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== @@ -9292,6 +9616,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" @@ -9637,6 +9975,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" @@ -9863,6 +10206,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" @@ -10066,6 +10430,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" @@ -10285,6 +10656,11 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +url-template@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21" + integrity sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw== + use-callback-ref@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.3.tgz#98d9fab067075841c5b2c6852090d5d0feabe2bf" @@ -10424,6 +10800,11 @@ warning@^4.0.0: dependencies: loose-envify "^1.0.0" +web-streams-polyfill@^3.0.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" + integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== + webidl-conversions@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" From 03b764616533bfd399e588f8025a15f72fd00f4b Mon Sep 17 00:00:00 2001 From: Dev Singh Date: Sun, 5 Oct 2025 13:08:55 -0500 Subject: [PATCH 11/11] Remove gsuite dirsync from core --- src/dirsync/.gitignore | 216 --------- src/dirsync/README.md | 11 - src/dirsync/build.js | 40 -- src/dirsync/config.ts | 69 --- src/dirsync/entra.ts | 119 ----- src/dirsync/gsuite.ts | 311 ------------ src/dirsync/logging.ts | 5 - src/dirsync/package.json | 31 -- src/dirsync/sync.ts | 221 --------- src/dirsync/tsconfig.json | 14 - terraform/envs/qa/main.tf | 7 - terraform/modules/dirsync/main.tf | 95 ---- terraform/modules/dirsync/variables.tf | 21 - yarn.lock | 624 +------------------------ 14 files changed, 11 insertions(+), 1773 deletions(-) delete mode 100644 src/dirsync/.gitignore delete mode 100644 src/dirsync/README.md delete mode 100644 src/dirsync/build.js delete mode 100644 src/dirsync/config.ts delete mode 100644 src/dirsync/entra.ts delete mode 100644 src/dirsync/gsuite.ts delete mode 100644 src/dirsync/logging.ts delete mode 100644 src/dirsync/package.json delete mode 100644 src/dirsync/sync.ts delete mode 100644 src/dirsync/tsconfig.json delete mode 100644 terraform/modules/dirsync/main.tf delete mode 100644 terraform/modules/dirsync/variables.tf diff --git a/src/dirsync/.gitignore b/src/dirsync/.gitignore deleted file mode 100644 index a84f520a..00000000 --- a/src/dirsync/.gitignore +++ /dev/null @@ -1,216 +0,0 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[codz] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py.cover -.hypothesis/ -.pytest_cache/ -cover/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -.pybuilder/ -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -# For a library or package, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -# .python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -# Pipfile.lock - -# UV -# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control. -# This is especially recommended for binary packages to ensure reproducibility, and is more -# commonly ignored for libraries. -# uv.lock - -# poetry -# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. -# This is especially recommended for binary packages to ensure reproducibility, and is more -# commonly ignored for libraries. -# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control -# poetry.lock -# poetry.toml - -# pdm -# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. -# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python. -# https://pdm-project.org/en/latest/usage/project/#working-with-version-control -# pdm.lock -# pdm.toml -.pdm-python -.pdm-build/ - -# pixi -# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control. -# pixi.lock -# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one -# in the .venv directory. It is recommended not to include this directory in version control. -.pixi - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# Redis -*.rdb -*.aof -*.pid - -# RabbitMQ -mnesia/ -rabbitmq/ -rabbitmq-data/ - -# ActiveMQ -activemq-data/ - -# SageMath parsed files -*.sage.py - -# Environments -.env -.envrc -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# pytype static type analyzer -.pytype/ - -# Cython debug symbols -cython_debug/ - -# PyCharm -# JetBrains specific template is maintained in a separate JetBrains.gitignore that can -# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore -# and can be added to the global gitignore or merged into this file. For a more nuclear -# option (not recommended) you can uncomment the following to ignore the entire idea folder. -# .idea/ - -# Abstra -# Abstra is an AI-powered process automation framework. -# Ignore directories containing user credentials, local state, and settings. -# Learn more at https://abstra.io/docs -.abstra/ - -# Visual Studio Code -# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore -# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore -# and can be added to the global gitignore or merged into this file. However, if you prefer, -# you could uncomment the following to ignore the entire vscode folder -# .vscode/ - -# Ruff stuff: -.ruff_cache/ - -# PyPI configuration file -.pypirc - -# Marimo -marimo/_static/ -marimo/_lsp/ -__marimo__/ - -# Streamlit -.streamlit/secrets.tomls diff --git a/src/dirsync/README.md b/src/dirsync/README.md deleted file mode 100644 index 6f977b34..00000000 --- a/src/dirsync/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# Entra ID to Google Workspace External Contact Sync - - -# Creating certificates -```bash -openssl req -x509 -newkey rsa:2048 -keyout private-key.pem -out certificate.pem -days 7350 -nodes -subj "/CN=DirSync" -cat private-key.pem certificate.pem > combined.pem -base64 -i combined.pem -o combined-base64.txt -``` - -Upload `certificate.pem` to Azure, and the contents of `combined-base64.txt` to Secrets Manager. diff --git a/src/dirsync/build.js b/src/dirsync/build.js deleted file mode 100644 index fec8912e..00000000 --- a/src/dirsync/build.js +++ /dev/null @@ -1,40 +0,0 @@ -/* eslint-disable no-console */ -import esbuild from "esbuild"; - -const commonParams = { - bundle: true, - format: "esm", - minify: true, - outExtension: { ".js": ".mjs" }, - loader: { - ".png": "file", - ".pkpass": "file", - ".json": "file", - }, // File loaders - target: "es2022", // Target ES2022 - sourcemap: true, - platform: "node", - external: ["@aws-sdk/*"], - banner: { - js: ` - import path from 'path'; - import { fileURLToPath } from 'url'; - import { createRequire as topLevelCreateRequire } from 'module'; - const require = topLevelCreateRequire(import.meta.url); - const __filename = fileURLToPath(import.meta.url); - const __dirname = path.dirname(__filename); - `.trim(), - }, // Banner for compatibility with CommonJS -}; - -esbuild - .build({ - ...commonParams, - entryPoints: ["archival/dynamoStream.js"], - outdir: "../../dist/archival/", - }) - .then(() => console.log("Archival lambda build completed successfully!")) - .catch((error) => { - console.error("Archival lambda build failed:", error); - process.exit(1); - }); diff --git a/src/dirsync/config.ts b/src/dirsync/config.ts deleted file mode 100644 index 9d659661..00000000 --- a/src/dirsync/config.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { - GetSecretValueCommand, - SecretsManagerClient, -} from "@aws-sdk/client-secrets-manager"; -import { z } from "zod"; -import { logger } from "./logging"; - -export const CONFIG_SECRET = "infra-core-api-gsuite-dirsync-config"; - -const SecretsConfigSchema = z.object({ - entraTenantId: z.string().min(1, "entraTenantId is required"), - entraClientId: z.string().min(1, "entraClientId is required"), - entraClientCertificate: z - .string() - .min(1, "entraClientCertificate is required"), - googleDelegatedUser: z.email("googleDelegatedUser must be a valid email"), - googleServiceAccountJson: z - .string() - .min(1, "googleServiceAccountJson is required"), - deleteRemovedContacts: z.boolean().default(false), -}); - -const EnvironmentSchema = z.enum(["dev", "prod"]); - -export type SecretsConfig = z.infer; -export type Environment = z.infer; - -export interface Config extends SecretsConfig { - environment: Environment; -} - -export const getSecrets = async (): Promise => { - const smClient = new SecretsManagerClient(); - const data = await smClient.send( - new GetSecretValueCommand({ SecretId: CONFIG_SECRET }), - ); - if (!data.SecretString) { - return null; - } - try { - return JSON.parse(data.SecretString); - } catch { - return null; - } -}; - -export const getConfig = async (): Promise => { - const secrets = await getSecrets(); - - if (!secrets) { - throw new Error( - `Failed to load configuration from secret: ${CONFIG_SECRET}`, - ); - } - const parsedSecrets = SecretsConfigSchema.parse(secrets); - - const environment = EnvironmentSchema.parse(process.env.RunEnvironment); - - const config: Config = { - ...parsedSecrets, - environment, - }; - - logger.info( - `Configuration loaded successfully for "${config.environment}" environment`, - ); - - return config; -}; diff --git a/src/dirsync/entra.ts b/src/dirsync/entra.ts deleted file mode 100644 index 39fee48c..00000000 --- a/src/dirsync/entra.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { Client } from "@microsoft/microsoft-graph-client"; -import { ClientCertificateCredential } from "@azure/identity"; -import { parseDisplayName } from "../common/utils.js"; -import { logger } from "./logging.js"; - -export interface EntraUser { - email: string; - upn: string; - givenName: string; - familyName: string; - displayName: string; -} - -interface GraphUser { - userPrincipalName?: string; - mail?: string; - givenName?: string; - surname?: string; - displayName?: string; -} - -/** - * Creates a Microsoft Graph client with the provided credentials - */ -export const createEntraClient = ( - tenantId: string, - clientId: string, - clientCertificate: string, -): Client => { - logger.info("Creating the Entra ID client"); - const certificatePem = Buffer.from(clientCertificate, "base64").toString( - "utf-8", - ); - const credential = new ClientCertificateCredential(tenantId, clientId, { - certificate: certificatePem, - }); - - return Client.initWithMiddleware({ - authProvider: { - getAccessToken: async () => { - const token = await credential.getToken( - "https://graph.microsoft.com/.default", - ); - return token?.token || ""; - }, - }, - }); -}; - -/** - * Fetches all enabled users from Entra ID - */ -export const getAllEntraUsers = async ( - client: Client, -): Promise => { - logger.info("Fetching users from Entra ID..."); - const users: EntraUser[] = []; - - try { - let response = await client - .api("/users") - .select("userPrincipalName,mail,givenName,surname,displayName") - .filter("accountEnabled eq true") - .top(999) - .get(); - - while (response) { - const graphUsers: GraphUser[] = response.value || []; - - for (const user of graphUsers) { - // Require at least UPN or mail - if (!user.userPrincipalName && !user.mail) { - continue; - } - - const displayName = - user.displayName || user.mail || user.userPrincipalName || ""; - let givenName = user.givenName || ""; - let familyName = user.surname || ""; - - // If we have displayName but missing first/last name, try to parse it - if (displayName && (!givenName || !familyName)) { - const parsed = parseDisplayName(displayName); - if (!givenName) { - givenName = parsed.givenName; - } - if (!familyName) { - familyName = parsed.familyName; - } - } - - users.push({ - email: user.mail || "", - upn: user.userPrincipalName || "", - givenName, - familyName, - displayName, - }); - } - - // Handle pagination - if (response["@odata.nextLink"]) { - response = await client.api(response["@odata.nextLink"]).get(); - } else { - break; - } - } - - logger.info(`Fetched ${users.length} users from Entra ID`); - return users; - } catch (error) { - console.error("Error fetching Entra ID users:", error); - throw error; - } -}; - -export const getPrimaryEmail = (user: EntraUser): string => { - return (user.email || user.upn).toLowerCase(); -}; diff --git a/src/dirsync/gsuite.ts b/src/dirsync/gsuite.ts deleted file mode 100644 index c42085b1..00000000 --- a/src/dirsync/gsuite.ts +++ /dev/null @@ -1,311 +0,0 @@ -import { google } from "googleapis"; -import { GoogleAuth } from "google-auth-library"; - -export interface GoogleContact { - email: string; - upn: string; - givenName: string; - familyName: string; - displayName: string; -} - -export interface ExistingContact { - id: string; // Contact ID for updates/deletes - contact: GoogleContact; -} - -/** - * Creates a Google API client with domain-wide delegation - */ -export const createGoogleClient = ( - serviceAccountJson: string, - delegatedUser: string, -): GoogleAuth => { - const serviceAccountInfo = JSON.parse(serviceAccountJson); - - const auth = new google.auth.GoogleAuth({ - credentials: serviceAccountInfo, - scopes: ["https://www.google.com/m8/feeds"], // Domain Shared Contacts API scope - clientOptions: { - subject: delegatedUser, - }, - }); - - return auth; -}; - -/** - * Fetches all domain shared contacts - */ -export const getAllDomainContacts = async ( - auth: GoogleAuth, - domain: string, -): Promise> => { - console.log("Fetching existing domain shared contacts..."); - const contacts = new Map(); - - try { - const client = await auth.getClient(); - const accessToken = await client.getAccessToken(); - - if (!accessToken.token) { - throw new Error("Failed to get access token"); - } - - // Use the Domain Shared Contacts API - const feedUrl = `https://www.google.com/m8/feeds/contacts/${domain}/full`; - - let startIndex = 1; - const maxResults = 1000; - let hasMore = true; - - while (hasMore) { - const url = `${feedUrl}?max-results=${maxResults}&start-index=${startIndex}&alt=json`; - - const response = await fetch(url, { - headers: { - Authorization: `Bearer ${accessToken.token}`, - "GData-Version": "3.0", - }, - }); - - if (!response.ok) { - throw new Error(`Failed to fetch contacts: ${response.statusText}`); - } - - const data = await response.json(); - const entries = data.feed?.entry || []; - - for (const entry of entries) { - const contact = parseContactEntry(entry); - if (contact) { - const key = getPrimaryEmail(contact); - contacts.set(key, { - id: getContactId(entry), - contact, - }); - } - } - - // Check if there are more results - hasMore = entries.length === maxResults; - startIndex += maxResults; - } - - console.log(`Found ${contacts.size} existing domain shared contacts`); - return contacts; - } catch (error) { - console.error("Error fetching domain contacts:", error); - throw error; - } -}; - -/** - * Creates a new domain shared contact - */ -export const createDomainContact = async ( - auth: GoogleAuth, - domain: string, - contact: GoogleContact, -): Promise => { - try { - const client = await auth.getClient(); - const accessToken = await client.getAccessToken(); - - if (!accessToken.token) { - throw new Error("Failed to get access token"); - } - - const feedUrl = `https://www.google.com/m8/feeds/contacts/${domain}/full`; - const atomEntry = contactToAtomXml(contact); - - const response = await fetch(feedUrl, { - method: "POST", - headers: { - Authorization: `Bearer ${accessToken.token}`, - "GData-Version": "3.0", - "Content-Type": "application/atom+xml", - }, - body: atomEntry, - }); - - if (!response.ok) { - throw new Error(`Failed to create contact: ${response.statusText}`); - } - - console.log(`Created contact: ${getPrimaryEmail(contact)}`); - return true; - } catch (error) { - console.error(`Error creating contact ${getPrimaryEmail(contact)}:`, error); - return false; - } -}; - -/** - * Updates an existing domain shared contact - */ -export const updateDomainContact = async ( - auth: GoogleAuth, - domain: string, - contactId: string, - contact: GoogleContact, -): Promise => { - try { - const client = await auth.getClient(); - const accessToken = await client.getAccessToken(); - - if (!accessToken.token) { - throw new Error("Failed to get access token"); - } - - const editUrl = `https://www.google.com/m8/feeds/contacts/${domain}/full/${contactId}`; - const atomEntry = contactToAtomXml(contact); - - const response = await fetch(editUrl, { - method: "PUT", - headers: { - Authorization: `Bearer ${accessToken.token}`, - "GData-Version": "3.0", - "Content-Type": "application/atom+xml", - "If-Match": "*", // Overwrite regardless of version - }, - body: atomEntry, - }); - - if (!response.ok) { - throw new Error(`Failed to update contact: ${response.statusText}`); - } - - console.log(`Updated contact: ${getPrimaryEmail(contact)}`); - return true; - } catch (error) { - console.error(`Error updating contact ${getPrimaryEmail(contact)}:`, error); - return false; - } -}; - -/** - * Deletes a domain shared contact - */ -export const deleteDomainContact = async ( - auth: GoogleAuth, - domain: string, - contactId: string, - email: string, -): Promise => { - try { - const client = await auth.getClient(); - const accessToken = await client.getAccessToken(); - - if (!accessToken.token) { - throw new Error("Failed to get access token"); - } - - const editUrl = `https://www.google.com/m8/feeds/contacts/${domain}/full/${contactId}`; - - const response = await fetch(editUrl, { - method: "DELETE", - headers: { - Authorization: `Bearer ${accessToken.token}`, - "GData-Version": "3.0", - "If-Match": "*", - }, - }); - - if (!response.ok) { - throw new Error(`Failed to delete contact: ${response.statusText}`); - } - - console.log(`Deleted contact: ${email}`); - return true; - } catch (error) { - console.error(`Error deleting contact ${email}:`, error); - return false; - } -}; - -/** - * Converts a contact to Atom XML format for Google's API - */ -const contactToAtomXml = (contact: GoogleContact): string => { - const emails: string[] = []; - - if (contact.email) { - emails.push( - ``, - ); - } - - if ( - contact.upn && - contact.upn.toLowerCase() !== contact.email.toLowerCase() - ) { - emails.push( - ``, - ); - } - - return ` - - - - ${escapeXml(contact.givenName)} - ${escapeXml(contact.familyName)} - ${escapeXml(contact.displayName)} - - ${emails.join("\n ")} -`; -}; - -/** - * Parses a contact entry from the API response - */ -const parseContactEntry = (entry: any): GoogleContact | null => { - const emails = entry.gd$email || []; - if (emails.length === 0) { - return null; - } - - const primaryEmail = - emails.find((e: any) => e.primary === "true")?.address || emails[0].address; - const otherEmail = - emails.find((e: any) => e.rel?.includes("other"))?.address || ""; - - const name = entry.gd$name || {}; - - return { - email: primaryEmail || "", - upn: otherEmail || "", - givenName: name.gd$givenName?.$t || "", - familyName: name.gd$familyName?.$t || "", - displayName: name.gd$fullName?.$t || primaryEmail || "", - }; -}; - -/** - * Extracts the contact ID from an entry - */ -const getContactId = (entry: any): string => { - const id = entry.id?.$t || ""; - // Extract the last part of the ID (after the last /) - return id.split("/").pop() || id; -}; - -/** - * Gets the primary email identifier for a contact - */ -const getPrimaryEmail = (contact: GoogleContact): string => { - return (contact.email || contact.upn).toLowerCase(); -}; - -/** - * Escapes XML special characters - */ -const escapeXml = (str: string): string => { - return str - .replace(/&/g, "&") - .replace(//g, ">") - .replace(/"/g, """) - .replace(/'/g, "'"); -}; diff --git a/src/dirsync/logging.ts b/src/dirsync/logging.ts deleted file mode 100644 index 3181857b..00000000 --- a/src/dirsync/logging.ts +++ /dev/null @@ -1,5 +0,0 @@ -import pino from "pino"; - -export const logger = pino({ - level: process.env.LOG_LEVEL || "info", -}); diff --git a/src/dirsync/package.json b/src/dirsync/package.json deleted file mode 100644 index 5c17efec..00000000 --- a/src/dirsync/package.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "infra-core-gsuite-dirsync", - "version": "1.0.0", - "description": "Syncs EntraID directory to GSuite", - "type": "module", - "main": "index.js", - "author": "ACM@UIUC", - "license": "BSD-3-Clause", - "scripts": { - "build": "tsc && node build.js", - "prettier": "prettier --check *.ts **/*.ts", - "lint": "eslint . --ext .ts --cache", - "prettier:write": "prettier --write *.ts **/*.ts" - }, - "devDependencies": { - "@types/aws-lambda": "^8.10.138", - "@types/node": "^24.3.0", - "esbuild": "^0.25.3", - "typescript": "^5.9.2" - }, - "dependencies": { - "@aws-sdk/client-secrets-manager": "^3.895.0", - "@azure/identity": "^4.12.0", - "@microsoft/microsoft-graph-client": "^3.0.7", - "@types/pino": "^7.0.5", - "google-auth-library": "^10.4.0", - "googleapis": "^161.0.0", - "pino": "^10.0.0", - "zod": "^4.1.11" - } -} diff --git a/src/dirsync/sync.ts b/src/dirsync/sync.ts deleted file mode 100644 index 4bbb2b4c..00000000 --- a/src/dirsync/sync.ts +++ /dev/null @@ -1,221 +0,0 @@ -import { EventBridgeEvent, Context } from "aws-lambda"; -import { logger } from "./logging.js"; -import { getConfig } from "./config.js"; -import { - createEntraClient, - getAllEntraUsers, - getPrimaryEmail, -} from "./entra.js"; -import { - createGoogleClient, - getAllDomainContacts, - createDomainContact, - updateDomainContact, - deleteDomainContact, - GoogleContact, -} from "./gsuite.js"; - -interface SyncStats { - totalEntraUsers: number; - totalGoogleContacts: number; - created: number; - updated: number; - deleted: number; - errors: number; -} - -/** - * Extracts domain from email address - */ -const extractDomain = (email: string): string => { - const match = email.match(/@(.+)$/); - return match ? match[1] : ""; -}; - -/** - * Checks if two contacts differ - */ -const contactsDiffer = ( - entra: GoogleContact, - google: GoogleContact, -): boolean => { - return ( - entra.givenName !== google.givenName || - entra.familyName !== google.familyName || - entra.displayName !== google.displayName || - entra.email !== google.email || - entra.upn !== google.upn - ); -}; - -/** - * Syncs contacts from Entra ID to Google Workspace Domain Shared Contacts - */ -const syncContacts = async ( - entraUsers: any[], - googleAuth: any, - domain: string, - deleteRemoved: boolean, -): Promise => { - logger.info("Starting contact sync"); - - const stats: SyncStats = { - totalEntraUsers: entraUsers.length, - totalGoogleContacts: 0, - created: 0, - updated: 0, - deleted: 0, - errors: 0, - }; - - // Fetch existing Google contacts - const googleContacts = await getAllDomainContacts(googleAuth, domain); - stats.totalGoogleContacts = googleContacts.size; - - // Build lookup map for Entra users - const entraMap = new Map(); - for (const user of entraUsers) { - const contact: GoogleContact = { - email: user.email, - upn: user.upn, - givenName: user.givenName, - familyName: user.familyName, - displayName: user.displayName, - }; - entraMap.set(getPrimaryEmail(user), contact); - } - - // Determine what operations to perform - const toCreate: GoogleContact[] = []; - const toUpdate: Array<{ id: string; contact: GoogleContact }> = []; - const toDelete: Array<{ id: string; email: string }> = []; - - // Find contacts to create or update - for (const [email, entraContact] of entraMap) { - const existing = googleContacts.get(email); - if (existing) { - if (contactsDiffer(entraContact, existing.contact)) { - toUpdate.push({ id: existing.id, contact: entraContact }); - } - } else { - toCreate.push(entraContact); - } - } - - // Find contacts to delete - if (deleteRemoved) { - for (const [email, googleContact] of googleContacts) { - if (!entraMap.has(email)) { - toDelete.push({ id: googleContact.id, email }); - } - } - } - - logger.info( - { - toCreate: toCreate.length, - toUpdate: toUpdate.length, - toDelete: toDelete.length, - }, - "Sync plan calculated", - ); - - // Execute create operations - for (const contact of toCreate) { - const success = await createDomainContact(googleAuth, domain, contact); - if (success) { - stats.created++; - } else { - stats.errors++; - } - } - - // Execute update operations - for (const { id, contact } of toUpdate) { - const success = await updateDomainContact(googleAuth, domain, id, contact); - if (success) { - stats.updated++; - } else { - stats.errors++; - } - } - - // Execute delete operations - for (const { id, email } of toDelete) { - const success = await deleteDomainContact(googleAuth, domain, id, email); - if (success) { - stats.deleted++; - } else { - stats.errors++; - } - } - - return stats; -}; - -/** - * Lambda handler for EventBridge scheduled sync - */ -export const handler = async ( - event: EventBridgeEvent<"Scheduled Event", any>, - _context: Context, -): Promise => { - logger.info({ event }, "Started sync lambda handler"); - - try { - // Load configuration - const config = await getConfig(); - logger.info({ environment: config.environment }, "Configuration loaded"); - - // Extract domain from delegated user email - const domain = extractDomain(config.googleDelegatedUser); - if (!domain) { - throw new Error( - `Invalid googleDelegatedUser email: ${config.googleDelegatedUser}`, - ); - } - - // Create Entra ID client and fetch users - const entraClient = createEntraClient( - config.entraTenantId, - config.entraClientId, - config.entraClientCertificate, - ); - const entraUsers = await getAllEntraUsers(entraClient); - - // Create Google client - const googleAuth = createGoogleClient( - config.googleServiceAccountJson, - config.googleDelegatedUser, - ); - - // Perform sync - const stats = await syncContacts( - entraUsers, - googleAuth, - domain, - config.deleteRemovedContacts, - ); - - logger.info({ stats }, "Sync completed successfully"); - - return { - statusCode: 200, - body: JSON.stringify({ - message: "Sync completed successfully", - environment: config.environment, - stats, - }), - }; - } catch (error) { - logger.error({ error }, "Sync failed"); - - return { - statusCode: 500, - body: JSON.stringify({ - message: "Sync failed", - error: error instanceof Error ? error.message : "Unknown error", - }), - }; - } -}; diff --git a/src/dirsync/tsconfig.json b/src/dirsync/tsconfig.json deleted file mode 100644 index a7ea8819..00000000 --- a/src/dirsync/tsconfig.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "@tsconfig/node22/tsconfig.json", - "compilerOptions": { - "module": "Node16", - "rootDir": "../", - "outDir": "../../dist", - "baseUrl": "../" - }, - "ts-node": { - "esm": true - }, - "include": ["../api/**/*.ts", "../common/**/*.ts"], - "exclude": ["../../node_modules", "../../dist"] -} diff --git a/terraform/envs/qa/main.tf b/terraform/envs/qa/main.tf index 7efe371b..bd14f5fc 100644 --- a/terraform/envs/qa/main.tf +++ b/terraform/envs/qa/main.tf @@ -88,13 +88,6 @@ module "archival" { }) } -module "dirsync" { - source = "../../modules/dirsync" - ProjectId = var.ProjectId - RunEnvironment = "dev" - LogRetentionDays = var.LogRetentionDays - SyncFrequency = "rate(1 hour)" -} resource "aws_cloudfront_key_value_store" "linkry_kv" { name = "${var.ProjectId}-cloudfront-linkry-kv" diff --git a/terraform/modules/dirsync/main.tf b/terraform/modules/dirsync/main.tf deleted file mode 100644 index 19689216..00000000 --- a/terraform/modules/dirsync/main.tf +++ /dev/null @@ -1,95 +0,0 @@ -data "archive_file" "lambda_code" { - type = "zip" - source_dir = "${path.module}/../../../dist/dirsync" - output_path = "${path.module}/../../../dist/terraform/dirsync.zip" -} -locals { - sync_lambda_name = "${var.ProjectId}-gsuite-dirsync" -} -data "aws_caller_identity" "current" {} -data "aws_region" "current" {} -resource "aws_cloudwatch_log_group" "this" { - name = "/aws/lambda/${local.sync_lambda_name}" - retention_in_days = var.LogRetentionDays -} - -resource "aws_iam_role" "this" { - name = "${local.sync_lambda_name}-exec-role" - assume_role_policy = jsonencode({ - Version = "2012-10-17" - Statement = [ - { - Action = "sts:AssumeRole" - Effect = "Allow" - Principal = { - Service = "lambda.amazonaws.com" - }, - }, - ] - }) -} - -resource "aws_iam_policy" "this" { - name = "${local.sync_lambda_name}-base-policy" - policy = jsonencode({ - Version = "2012-10-17" - Statement = [ - { - Action = ["logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents"], - Effect = "Allow", - Resource = ["${aws_cloudwatch_log_group.this.arn}:*"] - }, - { - Action = ["secretsmanager:GetSecretValue"], - Effect = "Allow", - Resource = [ - "arn:aws:secretsmanager:${data.aws_region.current.region}:${data.aws_caller_identity.current.account_id}:secret:infra-core-api-gsuite-dirsync-config*", - ] - }, - ] - }) -} - -resource "aws_iam_role_policy_attachment" "this" { - role = aws_iam_role.this.name - policy_arn = aws_iam_policy.this.arn -} - -resource "aws_lambda_function" "this" { - depends_on = [aws_cloudwatch_log_group.this] - function_name = local.sync_lambda_name - role = aws_iam_role.this.arn - architectures = ["arm64"] - handler = "sync.handler" - runtime = "nodejs22.x" - filename = data.archive_file.lambda_code.output_path - timeout = 900 - memory_size = 2048 - source_code_hash = data.archive_file.lambda_code.output_sha256 - description = "GSuite Sync Lambda." - environment { - variables = { - "RunEnvironment" = var.RunEnvironment - } - } -} - -resource "aws_cloudwatch_event_rule" "this" { - name = "${local.sync_lambda_name}-schedule" - description = "Trigger GSuite directory sync on a schedule" - schedule_expression = var.SyncFrequency -} - -resource "aws_lambda_permission" "eventbridge" { - statement_id = "AllowExecutionFromEventBridge" - action = "lambda:InvokeFunction" - function_name = aws_lambda_function.this.function_name - principal = "events.amazonaws.com" - source_arn = aws_cloudwatch_event_rule.this.arn -} - -resource "aws_cloudwatch_event_target" "lambda_target" { - rule = aws_cloudwatch_event_rule.this.name - target_id = "DirsyncLambdaTarget" - arn = aws_lambda_function.this.arn -} diff --git a/terraform/modules/dirsync/variables.tf b/terraform/modules/dirsync/variables.tf deleted file mode 100644 index 65dfc05a..00000000 --- a/terraform/modules/dirsync/variables.tf +++ /dev/null @@ -1,21 +0,0 @@ -variable "ProjectId" { - type = string - description = "Prefix before each resource" -} - -variable "LogRetentionDays" { - type = number -} - -variable "RunEnvironment" { - type = string - validation { - condition = var.RunEnvironment == "dev" || var.RunEnvironment == "prod" - error_message = "The lambda run environment must be dev or prod." - } -} - -variable "SyncFrequency" { - type = string - description = "EventBridge cron frequency for triggering the sync lambda" -} diff --git a/yarn.lock b/yarn.lock index 5b4614b5..790b6943 100644 --- a/yarn.lock +++ b/yarn.lock @@ -906,89 +906,6 @@ resolved "https://registry.yarnpkg.com/@aws/lambda-invoke-store/-/lambda-invoke-store-0.0.1.tgz#92d792a7dda250dfcb902e13228f37a81be57c8f" integrity sha512-ORHRQ2tmvnBXc8t/X9Z8IcSbBA4xTLKuN873FopzklHMeqBst7YG0d+AX97inkvDX+NChYtSr+qGfcqGFaI8Zw== -"@azure/abort-controller@^2.0.0", "@azure/abort-controller@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@azure/abort-controller/-/abort-controller-2.1.2.tgz#42fe0ccab23841d9905812c58f1082d27784566d" - integrity sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA== - dependencies: - tslib "^2.6.2" - -"@azure/core-auth@^1.10.0", "@azure/core-auth@^1.9.0": - version "1.10.1" - resolved "https://registry.yarnpkg.com/@azure/core-auth/-/core-auth-1.10.1.tgz#68a17fa861ebd14f6fd314055798355ef6bedf1b" - integrity sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg== - dependencies: - "@azure/abort-controller" "^2.1.2" - "@azure/core-util" "^1.13.0" - tslib "^2.6.2" - -"@azure/core-client@^1.9.2": - version "1.10.1" - resolved "https://registry.yarnpkg.com/@azure/core-client/-/core-client-1.10.1.tgz#83d78f97d647ab22e6811a7a68bb4223e7a1d019" - integrity sha512-Nh5PhEOeY6PrnxNPsEHRr9eimxLwgLlpmguQaHKBinFYA/RU9+kOYVOQqOrTsCL+KSxrLLl1gD8Dk5BFW/7l/w== - dependencies: - "@azure/abort-controller" "^2.1.2" - "@azure/core-auth" "^1.10.0" - "@azure/core-rest-pipeline" "^1.22.0" - "@azure/core-tracing" "^1.3.0" - "@azure/core-util" "^1.13.0" - "@azure/logger" "^1.3.0" - tslib "^2.6.2" - -"@azure/core-rest-pipeline@^1.17.0", "@azure/core-rest-pipeline@^1.22.0": - version "1.22.1" - resolved "https://registry.yarnpkg.com/@azure/core-rest-pipeline/-/core-rest-pipeline-1.22.1.tgz#f47bc02ff9a79f62e6a32aa375420b1b86dcbccd" - integrity sha512-UVZlVLfLyz6g3Hy7GNDpooMQonUygH7ghdiSASOOHy97fKj/mPLqgDX7aidOijn+sCMU+WU8NjlPlNTgnvbcGA== - dependencies: - "@azure/abort-controller" "^2.1.2" - "@azure/core-auth" "^1.10.0" - "@azure/core-tracing" "^1.3.0" - "@azure/core-util" "^1.13.0" - "@azure/logger" "^1.3.0" - "@typespec/ts-http-runtime" "^0.3.0" - tslib "^2.6.2" - -"@azure/core-tracing@^1.0.0", "@azure/core-tracing@^1.3.0": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@azure/core-tracing/-/core-tracing-1.3.1.tgz#e971045c901ea9c110616b0e1db272507781d5f6" - integrity sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ== - dependencies: - tslib "^2.6.2" - -"@azure/core-util@^1.11.0", "@azure/core-util@^1.13.0": - version "1.13.1" - resolved "https://registry.yarnpkg.com/@azure/core-util/-/core-util-1.13.1.tgz#6dff2ff6d3c9c6430c6f4d3b3e65de531f10bafe" - integrity sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A== - dependencies: - "@azure/abort-controller" "^2.1.2" - "@typespec/ts-http-runtime" "^0.3.0" - tslib "^2.6.2" - -"@azure/identity@^4.12.0": - version "4.12.0" - resolved "https://registry.yarnpkg.com/@azure/identity/-/identity-4.12.0.tgz#272e39a8742191aac0b9f5ec683984bf4d88e7cb" - integrity sha512-6vuh2R3Cte6SD6azNalLCjIDoryGdcvDVEV7IDRPtm5lHX5ffkDlIalaoOp5YJU08e4ipjJENel20kSMDLAcug== - dependencies: - "@azure/abort-controller" "^2.0.0" - "@azure/core-auth" "^1.9.0" - "@azure/core-client" "^1.9.2" - "@azure/core-rest-pipeline" "^1.17.0" - "@azure/core-tracing" "^1.0.0" - "@azure/core-util" "^1.11.0" - "@azure/logger" "^1.0.0" - "@azure/msal-browser" "^4.2.0" - "@azure/msal-node" "^3.5.0" - open "^10.1.0" - tslib "^2.2.0" - -"@azure/logger@^1.0.0", "@azure/logger@^1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@azure/logger/-/logger-1.3.0.tgz#5501cf85d4f52630602a8cc75df76568c969a827" - integrity sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA== - dependencies: - "@typespec/ts-http-runtime" "^0.3.0" - tslib "^2.6.2" - "@azure/msal-browser@^4.11.0": version "4.18.0" resolved "https://registry.yarnpkg.com/@azure/msal-browser/-/msal-browser-4.18.0.tgz#ea11137669916f6aca67448a424e029417fc99de" @@ -996,32 +913,11 @@ dependencies: "@azure/msal-common" "15.9.0" -"@azure/msal-browser@^4.2.0": - version "4.24.1" - resolved "https://registry.yarnpkg.com/@azure/msal-browser/-/msal-browser-4.24.1.tgz#16a79bd17f53da866eb36ccdb44c176fb27e2d71" - integrity sha512-e4sp8ihJIyZQvN0ZM1MMuKlEiiLWUS9V9+kxsVAc6K8MtpXHui8VINmKUxXH0OOksLhFDpdq4sGW1w6uYp431A== - dependencies: - "@azure/msal-common" "15.13.0" - -"@azure/msal-common@15.13.0": - version "15.13.0" - resolved "https://registry.yarnpkg.com/@azure/msal-common/-/msal-common-15.13.0.tgz#229008f8badbf5af6a446a0be1c436be2f4c8cd9" - integrity sha512-8oF6nj02qX7eE/6+wFT5NluXRHc05AgdCC3fJnkjiJooq8u7BcLmxaYYSwc2AfEkWRMRi6Eyvvbeqk4U4412Ag== - "@azure/msal-common@15.9.0": version "15.9.0" resolved "https://registry.yarnpkg.com/@azure/msal-common/-/msal-common-15.9.0.tgz#49b62a798dd1b47b410e6e540fd36009f1d4d18e" integrity sha512-lbz/D+C9ixUG3hiZzBLjU79a0+5ZXCorjel3mwXluisKNH0/rOS/ajm8yi4yI9RP5Uc70CAcs9Ipd0051Oh/kA== -"@azure/msal-node@^3.5.0": - version "3.8.0" - resolved "https://registry.yarnpkg.com/@azure/msal-node/-/msal-node-3.8.0.tgz#17634ebab1b4d6f6a3fac1a378c4929fdeeae79d" - integrity sha512-23BXm82Mp5XnRhrcd4mrHa0xuUNRp96ivu3nRatrfdAqjoeWAGyD0eEAafxAOHAEWWmdlyFK4ELFcdziXyw2sA== - dependencies: - "@azure/msal-common" "15.13.0" - jsonwebtoken "^9.0.0" - uuid "^8.3.0" - "@azure/msal-node@^3.5.1": version "3.6.4" resolved "https://registry.yarnpkg.com/@azure/msal-node/-/msal-node-3.6.4.tgz#937f0e37e73d48dfb68ab8f3a503a0cf21a65285" @@ -1901,14 +1797,6 @@ dependencies: "@types/mdx" "^2.0.0" -"@microsoft/microsoft-graph-client@^3.0.7": - version "3.0.7" - resolved "https://registry.yarnpkg.com/@microsoft/microsoft-graph-client/-/microsoft-graph-client-3.0.7.tgz#535507df2db40bd7ed24a670dc68c87c628177a4" - integrity sha512-/AazAV/F+HK4LIywF9C+NYHcJo038zEnWkteilcxC1FM/uK/4NVGDKGrxx7nNq1ybspAroRKT4I1FHfxQzxkUw== - dependencies: - "@babel/runtime" "^7.12.5" - tslib "^2.2.0" - "@middy/core@^6.1.6": version "6.4.1" resolved "https://registry.yarnpkg.com/@middy/core/-/core-6.4.1.tgz#9e8b87e31c6907ca57bc14421e3f51f78b269508" @@ -1936,101 +1824,51 @@ resolved "https://registry.yarnpkg.com/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.77.tgz#58debdab512a950d505f17cd499e7171f33a5184" integrity sha512-jC8YX0rbAnu9YrLK1A52KM2HX9EDjrJSCLVuBf9Dsov4IC6GgwMLS2pwL9GFLJnSZBFgdwnA84efBehHT9eshA== -"@napi-rs/canvas-android-arm64@0.1.80": - version "0.1.80" - resolved "https://registry.yarnpkg.com/@napi-rs/canvas-android-arm64/-/canvas-android-arm64-0.1.80.tgz#2779ca5c8aaeb46c85eb72d29f1eb34efd46fb45" - integrity sha512-sk7xhN/MoXeuExlggf91pNziBxLPVUqF2CAVnB57KLG/pz7+U5TKG8eXdc3pm0d7Od0WreB6ZKLj37sX9muGOQ== - "@napi-rs/canvas-darwin-arm64@0.1.77": version "0.1.77" resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.77.tgz#84bbbf72d2ca647d2be7d1a0a64548ba086b8b95" integrity sha512-VFaCaCgAV0+hPwXajDIiHaaGx4fVCuUVYp/CxCGXmTGz699ngIEBx3Sa2oDp0uk3X+6RCRLueb7vD44BKBiPIg== -"@napi-rs/canvas-darwin-arm64@0.1.80": - version "0.1.80" - resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-arm64/-/canvas-darwin-arm64-0.1.80.tgz#638eaa2d0a2a373c7d15748743182718dcd95c4b" - integrity sha512-O64APRTXRUiAz0P8gErkfEr3lipLJgM6pjATwavZ22ebhjYl/SUbpgM0xcWPQBNMP1n29afAC/Us5PX1vg+JNQ== - "@napi-rs/canvas-darwin-x64@0.1.77": version "0.1.77" resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.77.tgz#e0f845fa5d2ad7eafe49c5e862a94b4be1dbc040" integrity sha512-uD2NSkf6I4S3o0POJDwweK85FE4rfLNA2N714MgiEEMMw5AmupfSJGgpYzcyEXtPzdaca6rBfKcqNvzR1+EyLQ== -"@napi-rs/canvas-darwin-x64@0.1.80": - version "0.1.80" - resolved "https://registry.yarnpkg.com/@napi-rs/canvas-darwin-x64/-/canvas-darwin-x64-0.1.80.tgz#bd6bc048dbd4b02b9620d9d07117ed93e6970978" - integrity sha512-FqqSU7qFce0Cp3pwnTjVkKjjOtxMqRe6lmINxpIZYaZNnVI0H5FtsaraZJ36SiTHNjZlUB69/HhxNDT1Aaa9vA== - "@napi-rs/canvas-linux-arm-gnueabihf@0.1.77": version "0.1.77" resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.77.tgz#51f2d786951c9c1eac8dbc92471a128212392cb6" integrity sha512-03GxMMZGhHRQxiA4gyoKT6iQSz8xnA6T9PAfg/WNJnbkVMFZG782DwUJUb39QIZ1uE1euMCPnDgWAJ092MmgJQ== -"@napi-rs/canvas-linux-arm-gnueabihf@0.1.80": - version "0.1.80" - resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm-gnueabihf/-/canvas-linux-arm-gnueabihf-0.1.80.tgz#ce6bfbeb19d9234c42df5c384e5989aa7d734789" - integrity sha512-eyWz0ddBDQc7/JbAtY4OtZ5SpK8tR4JsCYEZjCE3dI8pqoWUC8oMwYSBGCYfsx2w47cQgQCgMVRVTFiiO38hHQ== - "@napi-rs/canvas-linux-arm64-gnu@0.1.77": version "0.1.77" resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.77.tgz#e92897dac7f3b7acb806529bf8a0ab20ac26e84f" integrity sha512-ZO+d2gRU9JU1Bb7SgJcJ1k9wtRMCpSWjJAJ+2phhu0Lw5As8jYXXXmLKmMTGs1bOya2dBMYDLzwp7KS/S/+aCA== -"@napi-rs/canvas-linux-arm64-gnu@0.1.80": - version "0.1.80" - resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-gnu/-/canvas-linux-arm64-gnu-0.1.80.tgz#3b7a7832fef763826fa5fb740d5757204e52607d" - integrity sha512-qwA63t8A86bnxhuA/GwOkK3jvb+XTQaTiVML0vAWoHyoZYTjNs7BzoOONDgTnNtr8/yHrq64XXzUoLqDzU+Uuw== - "@napi-rs/canvas-linux-arm64-musl@0.1.77": version "0.1.77" resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.77.tgz#f2ba1f00e734c6ab142efd86263adf5cb391a228" integrity sha512-S1KtnP1+nWs2RApzNkdNf8X4trTLrHaY7FivV61ZRaL8NvuGOkSkKa+gWN2iedIGFEDz6gecpl/JAUSewwFXYg== -"@napi-rs/canvas-linux-arm64-musl@0.1.80": - version "0.1.80" - resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-arm64-musl/-/canvas-linux-arm64-musl-0.1.80.tgz#d8ccd91f31d70760628623cd575134ada17690a3" - integrity sha512-1XbCOz/ymhj24lFaIXtWnwv/6eFHXDrjP0jYkc6iHQ9q8oXKzUX1Lc6bu+wuGiLhGh2GS/2JlfORC5ZcXimRcg== - "@napi-rs/canvas-linux-riscv64-gnu@0.1.77": version "0.1.77" resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.77.tgz#c6b3cb3cd277de835ac06a87403eca51efa67acd" integrity sha512-A4YIKFYUwDtrSzCtdCAO5DYmRqlhCVKHdpq0+dBGPnIEhOQDFkPBTfoTAjO3pjlEnorlfKmNMOH21sKQg2esGA== -"@napi-rs/canvas-linux-riscv64-gnu@0.1.80": - version "0.1.80" - resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-riscv64-gnu/-/canvas-linux-riscv64-gnu-0.1.80.tgz#927a3b859a0e3c691beaf52a19bc4736c4ffc9b8" - integrity sha512-XTzR125w5ZMs0lJcxRlS1K3P5RaZ9RmUsPtd1uGt+EfDyYMu4c6SEROYsxyatbbu/2+lPe7MPHOO/0a0x7L/gw== - "@napi-rs/canvas-linux-x64-gnu@0.1.77": version "0.1.77" resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.77.tgz#c36c7dbec434d6c60529edbfe46a32d1ac21d096" integrity sha512-Lt6Sef5l0+5O1cSZ8ysO0JI+x+rSrqZyXs5f7+kVkCAOVq8X5WTcDVbvWvEs2aRhrWTp5y25Jf2Bn+3IcNHOuQ== -"@napi-rs/canvas-linux-x64-gnu@0.1.80": - version "0.1.80" - resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-x64-gnu/-/canvas-linux-x64-gnu-0.1.80.tgz#25c0416bcedd6fadc15295e9afa8d9697232050c" - integrity sha512-BeXAmhKg1kX3UCrJsYbdQd3hIMDH/K6HnP/pG2LuITaXhXBiNdh//TVVVVCBbJzVQaV5gK/4ZOCMrQW9mvuTqA== - "@napi-rs/canvas-linux-x64-musl@0.1.77": version "0.1.77" resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.77.tgz#36c20eae7c46f724da406a68199755601a7b311d" integrity sha512-NiNFvC+D+omVeJ3IjYlIbyt/igONSABVe9z0ZZph29epHgZYu4eHwV9osfpRt1BGGOAM8LkFrHk4LBdn2EDymA== -"@napi-rs/canvas-linux-x64-musl@0.1.80": - version "0.1.80" - resolved "https://registry.yarnpkg.com/@napi-rs/canvas-linux-x64-musl/-/canvas-linux-x64-musl-0.1.80.tgz#de85d644e09120a60996bbe165cc2efee804551b" - integrity sha512-x0XvZWdHbkgdgucJsRxprX/4o4sEed7qo9rCQA9ugiS9qE2QvP0RIiEugtZhfLH3cyI+jIRFJHV4Fuz+1BHHMg== - "@napi-rs/canvas-win32-x64-msvc@0.1.77": version "0.1.77" resolved "https://registry.yarnpkg.com/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.77.tgz#1cb0b9964e0b4db348e4120eea39b5c60aa5432c" integrity sha512-fP6l0hZiWykyjvpZTS3sI46iib8QEflbPakNoUijtwyxRuOPTTBfzAWZUz5z2vKpJJ/8r305wnZeZ8lhsBHY5A== -"@napi-rs/canvas-win32-x64-msvc@0.1.80": - version "0.1.80" - resolved "https://registry.yarnpkg.com/@napi-rs/canvas-win32-x64-msvc/-/canvas-win32-x64-msvc-0.1.80.tgz#6bb95885d9377912d71f1372fc1916fb54d6ef0a" - integrity sha512-Z8jPsM6df5V8B1HrCHB05+bDiCxjE9QA//3YrkKIdVDEwn5RKaqOxCJDRJkl48cJbylcrJbW4HxZbTte8juuPg== - "@napi-rs/canvas@^0.1.65": version "0.1.77" resolved "https://registry.yarnpkg.com/@napi-rs/canvas/-/canvas-0.1.77.tgz#e78e208adb79cf211f6d260664d766b6f26da341" @@ -2047,22 +1885,6 @@ "@napi-rs/canvas-linux-x64-musl" "0.1.77" "@napi-rs/canvas-win32-x64-msvc" "0.1.77" -"@napi-rs/canvas@^0.1.67", "@napi-rs/canvas@^0.1.77": - version "0.1.80" - resolved "https://registry.yarnpkg.com/@napi-rs/canvas/-/canvas-0.1.80.tgz#53615bea56fd94e07331ab13caa7a39efc4914ab" - integrity sha512-DxuT1ClnIPts1kQx8FBmkk4BQDTfI5kIzywAaMjQSXfNnra5UFU9PwurXrl+Je3bJ6BGsp/zmshVVFbCmyI+ww== - optionalDependencies: - "@napi-rs/canvas-android-arm64" "0.1.80" - "@napi-rs/canvas-darwin-arm64" "0.1.80" - "@napi-rs/canvas-darwin-x64" "0.1.80" - "@napi-rs/canvas-linux-arm-gnueabihf" "0.1.80" - "@napi-rs/canvas-linux-arm64-gnu" "0.1.80" - "@napi-rs/canvas-linux-arm64-musl" "0.1.80" - "@napi-rs/canvas-linux-riscv64-gnu" "0.1.80" - "@napi-rs/canvas-linux-x64-gnu" "0.1.80" - "@napi-rs/canvas-linux-x64-musl" "0.1.80" - "@napi-rs/canvas-win32-x64-msvc" "0.1.80" - "@napi-rs/wasm-runtime@^0.2.11": version "0.2.11" resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.11.tgz#192c1610e1625048089ab4e35bc0649ce478500e" @@ -3551,13 +3373,6 @@ dependencies: undici-types "~7.10.0" -"@types/pino@^7.0.5": - version "7.0.5" - resolved "https://registry.yarnpkg.com/@types/pino/-/pino-7.0.5.tgz#1c84a81b924a6a9e263dbb581dffdbad7a3c60c4" - integrity sha512-wKoab31pknvILkxAF8ss+v9iNyhw5Iu/0jLtRkUD74cNfOOLJNnqfFKAv0r7wVaTQxRZtWrMpGfShwwBjOcgcg== - dependencies: - pino "*" - "@types/pluralize@^0.0.33": version "0.0.33" resolved "https://registry.yarnpkg.com/@types/pluralize/-/pluralize-0.0.33.tgz#8ad9018368c584d268667dd9acd5b3b806e8c82a" @@ -3866,15 +3681,6 @@ "@typescript-eslint/types" "8.41.0" eslint-visitor-keys "^4.2.1" -"@typespec/ts-http-runtime@^0.3.0": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.1.tgz#2fa94050f25b4d85d0bc8b9d97874b8d347a9173" - integrity sha512-SnbaqayTVFEA6/tYumdF0UmybY0KHyKwGPBXnyckFlrrKdhWFrL3a2HIPXHjht5ZOElKGcXfD2D63P36btb+ww== - dependencies: - http-proxy-agent "^7.0.0" - https-proxy-agent "^7.0.0" - tslib "^2.6.2" - "@ungap/with-resolvers@^0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@ungap/with-resolvers/-/with-resolvers-0.1.0.tgz#63a07b13bbf10ffff074a36498cce8d82aeeecc4" @@ -4532,7 +4338,7 @@ base64-arraybuffer@^1.0.2: resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc" integrity sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ== -base64-js@^1.3.0, base64-js@^1.3.1: +base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -4549,17 +4355,12 @@ better-opn@^3.0.2: dependencies: open "^8.0.4" -bignumber.js@^9.0.0: - version "9.3.1" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.3.1.tgz#759c5aaddf2ffdc4f154f7b493e1c8770f88c4d7" - integrity sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ== - binary-extensions@^2.0.0: version "2.3.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.3: +bl@^4.0.2: version "4.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== @@ -4636,13 +4437,6 @@ buffer@^6.0.3: base64-js "^1.3.1" ieee754 "^1.2.1" -bundle-name@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-4.1.0.tgz#f3b96b34160d6431a19d7688135af7cfb8797889" - integrity sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q== - dependencies: - run-applescript "^7.0.0" - bytes@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" @@ -4707,14 +4501,6 @@ 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" @@ -4776,11 +4562,6 @@ 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" @@ -5044,11 +4825,6 @@ damerau-levenshtein@^1.0.8: resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== -data-uri-to-buffer@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e" - integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== - data-urls@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-5.0.0.tgz#2f76906bce1824429ffecb6920f45a0b30f00dde" @@ -5118,13 +4894,6 @@ 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" @@ -5154,11 +4923,6 @@ 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" @@ -5169,19 +4933,6 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== -default-browser-id@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-5.0.0.tgz#a1d98bf960c15082d8a3fa69e83150ccccc3af26" - integrity sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA== - -default-browser@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-5.2.1.tgz#7b7ba61204ff3e425b556869ae6d3e9d9f1712cf" - integrity sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg== - dependencies: - bundle-name "^4.1.0" - default-browser-id "^5.0.0" - define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" @@ -5196,11 +4947,6 @@ define-lazy-prop@^2.0.0: resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== -define-lazy-prop@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" - integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== - define-properties@^1.1.3, define-properties@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" @@ -5230,11 +4976,6 @@ 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.1" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.1.1.tgz#9f1e511ace6bb525efea4651345beac424dac7b9" - integrity sha512-ecqj/sy1jcK1uWrwpR67UhYrIFQ+5WlGxth34WquCbamhFA6hkkwiu37o6J5xCHdo1oixJRfVRw+ywV+Hq/0Aw== - 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" @@ -5417,7 +5158,7 @@ eastasianwidth@^0.2.0: resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== -ecdsa-sig-formatter@1.0.11, ecdsa-sig-formatter@^1.0.11: +ecdsa-sig-formatter@1.0.11: version "1.0.11" resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== @@ -6061,21 +5802,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" integrity sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw== -extend@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - external-editor@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" @@ -6255,14 +5986,6 @@ fengari@^0.1.4: sprintf-js "^1.1.1" tmp "^0.0.33" -fetch-blob@^3.1.2, fetch-blob@^3.1.4: - version "3.2.0" - resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.2.0.tgz#f09b8d4bbd45adc6f0c20b7e787e793e309dcce9" - integrity sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ== - dependencies: - node-domexception "^1.0.0" - web-streams-polyfill "^3.0.3" - fflate@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.2.tgz#fc8631f5347812ad6028bbe4a2308b2792aa1dea" @@ -6404,13 +6127,6 @@ form-data@^4.0.0, form-data@^4.0.4: hasown "^2.0.2" mime-types "^2.1.12" -formdata-polyfill@^4.0.10: - version "4.0.10" - resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423" - integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== - dependencies: - fetch-blob "^3.1.2" - formidable@^3.5.4: version "3.5.4" resolved "https://registry.yarnpkg.com/formidable/-/formidable-3.5.4.tgz#ac9a593b951e829b3298f21aa9a2243932f32ed9" @@ -6420,11 +6136,6 @@ 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" @@ -6476,24 +6187,6 @@ functions-have-names@^1.2.3: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== -gaxios@^7.0.0, gaxios@^7.0.0-rc.4: - version "7.1.2" - resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-7.1.2.tgz#4954bc5628e3cd108e5252cb597b03a5f16c21ac" - integrity sha512-/Szrn8nr+2TsQT1Gp8iIe/BEytJmbyfrbFh419DfGQSkEgNEhbPi7JRJuughjkTzPWgU9gBQf5AVu3DbHt0OXA== - dependencies: - extend "^3.0.2" - https-proxy-agent "^7.0.1" - node-fetch "^3.3.2" - -gcp-metadata@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-7.0.1.tgz#43bb9cd482cf0590629b871ab9133af45b78382d" - integrity sha512-UcO3kefx6dCcZkgcTGgVOTFb7b1LlQ02hY1omMjjrrBzkajRMCFgYOjs7J71WqnuG1k2b+9ppGL7FsOfhZMQKQ== - dependencies: - gaxios "^7.0.0" - google-logging-utils "^1.0.0" - json-bigint "^1.0.0" - gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -6549,11 +6242,6 @@ 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" @@ -6662,43 +6350,6 @@ globrex@^0.1.2: resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== -google-auth-library@^10.1.0, google-auth-library@^10.2.0, google-auth-library@^10.4.0: - version "10.4.0" - resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-10.4.0.tgz#2d5e36f3e0b0f33b1c5466a2f25617ff2c258c91" - integrity sha512-CmIrSy1bqMQUsPmA9+hcSbAXL80cFhu40cGMUjCaLpNKVzzvi+0uAHq8GNZxkoGYIsTX4ZQ7e4aInAqWxgn4fg== - dependencies: - base64-js "^1.3.0" - ecdsa-sig-formatter "^1.0.11" - gaxios "^7.0.0" - gcp-metadata "^7.0.0" - google-logging-utils "^1.0.0" - gtoken "^8.0.0" - jws "^4.0.0" - -google-logging-utils@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/google-logging-utils/-/google-logging-utils-1.1.1.tgz#4a1f44a69a187eb954629c88c5af89c0dfbca51a" - integrity sha512-rcX58I7nqpu4mbKztFeOAObbomBbHU2oIb/d3tJfF3dizGSApqtSwYJigGCooHdnMyQBIw8BrWyK96w3YXgr6A== - -googleapis-common@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/googleapis-common/-/googleapis-common-8.0.0.tgz#7a3ea3aa3863c9d3e7635070314d639dadfa164a" - integrity sha512-66if47It7y+Sab3HMkwEXx1kCq9qUC9px8ZXoj1CMrmLmUw81GpbnsNlXnlyZyGbGPGcj+tDD9XsZ23m7GLaJQ== - dependencies: - extend "^3.0.2" - gaxios "^7.0.0-rc.4" - google-auth-library "^10.1.0" - qs "^6.7.0" - url-template "^2.0.8" - -googleapis@^161.0.0: - version "161.0.0" - resolved "https://registry.yarnpkg.com/googleapis/-/googleapis-161.0.0.tgz#63c1e3bf675683fdf131d5f05ae4f9613c5f60ee" - integrity sha512-JZy2cWMxgUF8E09KHzplI+z+FVG8NWDB/bsf4xevt9Um4bInb0X1qaG9qpDn49DHT5HsU0mOp3EOBGb8+AdE3Q== - dependencies: - google-auth-library "^10.2.0" - googleapis-common "^8.0.0" - gopd@^1.0.1, gopd@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" @@ -6714,14 +6365,6 @@ graphemer@^1.4.0: resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== -gtoken@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-8.0.0.tgz#d67a0e346dd441bfb54ad14040ddc3b632886575" - integrity sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw== - dependencies: - gaxios "^7.0.0" - jws "^4.0.0" - handlebars@^4.7.8: version "4.7.8" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" @@ -6848,7 +6491,7 @@ http-errors@2.0.0, http-errors@^2.0.0: statuses "2.0.1" toidentifier "1.0.1" -http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.2: +http-proxy-agent@^7.0.2: version "7.0.2" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== @@ -6856,7 +6499,7 @@ http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.2: agent-base "^7.1.0" debug "^4.3.4" -https-proxy-agent@^7.0.0, https-proxy-agent@^7.0.1, https-proxy-agent@^7.0.6: +https-proxy-agent@^7.0.6: version "7.0.6" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== @@ -6951,7 +6594,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.0: +ini@^1.3.5: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== @@ -7111,11 +6754,6 @@ is-docker@^2.0.0, is-docker@^2.1.1: resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== -is-docker@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" - integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -7155,13 +6793,6 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" -is-inside-container@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" - integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== - dependencies: - is-docker "^3.0.0" - is-map@^2.0.2, is-map@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" @@ -7268,13 +6899,6 @@ is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" -is-wsl@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-3.1.0.tgz#e1c657e39c10090afcbedec61720f6b924c3cbd2" - integrity sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw== - dependencies: - is-inside-container "^1.0.0" - isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" @@ -7447,13 +7071,6 @@ jsesc@^3.0.2: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== -json-bigint@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" - integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== - dependencies: - bignumber.js "^9.0.0" - json-buffer@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" @@ -7561,15 +7178,6 @@ jwa@^1.4.1: ecdsa-sig-formatter "1.0.11" safe-buffer "^5.0.1" -jwa@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/jwa/-/jwa-2.0.1.tgz#bf8176d1ad0cd72e0f3f58338595a13e110bc804" - integrity sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg== - dependencies: - buffer-equal-constant-time "^1.0.1" - ecdsa-sig-formatter "1.0.11" - safe-buffer "^5.0.1" - jwks-rsa@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/jwks-rsa/-/jwks-rsa-3.2.0.tgz#132bc8bfa7b03928a273bbc93486f70226449e04" @@ -7590,14 +7198,6 @@ jws@^3.2.2: jwa "^1.4.1" safe-buffer "^5.0.1" -jws@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jws/-/jws-4.0.0.tgz#2d4e8cf6a318ffaa12615e9dec7e86e6c97310f4" - integrity sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg== - dependencies: - jwa "^2.0.0" - safe-buffer "^5.0.1" - keyv@^4.5.4: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" @@ -7974,11 +7574,6 @@ 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" @@ -8005,7 +7600,7 @@ minimatch@^9.0.4: dependencies: brace-expansion "^2.0.1" -minimist@^1.1.0, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1.2.6: +minimist@^1.1.0, minimist@^1.2.0, 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== @@ -8015,11 +7610,6 @@ minimist@^1.1.0, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5, minimist@^1. 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" @@ -8105,11 +7695,6 @@ 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" @@ -8148,18 +7733,6 @@ nmtree@^1.0.6: dependencies: commander "^2.11.0" -node-abi@^3.3.0: - version "3.77.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.77.0.tgz#3ad90d5c9d45663420e5aa4ff58dbf4e3625419a" - integrity sha512-DSmt0OEcLoK4i3NuscSbGjOf3bqiDEutejqENSplMSFA/gmB8mkED9G4pKWnPl7MDU4rSHebKPHeitpDfyH0cQ== - 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.4.0: version "8.5.0" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-8.5.0.tgz#c91b2d7682fa457d2e1c388150f0dff9aafb8f3f" @@ -8172,20 +7745,6 @@ node-cache@^5.1.2: dependencies: clone "2.x" -node-domexception@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" - integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== - -node-fetch@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.2.tgz#d1e889bacdf733b4ff3b2b243eb7a12866a0b78b" - integrity sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA== - dependencies: - data-uri-to-buffer "^4.0.0" - fetch-blob "^3.1.4" - formdata-polyfill "^4.0.10" - node-forge@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" @@ -8360,16 +7919,6 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" -open@^10.1.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/open/-/open-10.2.0.tgz#b9d855be007620e80b6fb05fac98141fe62db73c" - integrity sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA== - dependencies: - default-browser "^5.2.1" - define-lazy-prop "^3.0.0" - is-inside-container "^1.0.0" - wsl-utils "^0.1.0" - open@^8.0.4: version "8.4.2" resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" @@ -8569,11 +8118,6 @@ 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" @@ -8584,35 +8128,13 @@ 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: - 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.3.31: - version "5.3.31" - resolved "https://registry.yarnpkg.com/pdfjs-dist/-/pdfjs-dist-5.3.31.tgz#0c429f3bc43c57ec1a95fa2874f2f93189d2d40e" - integrity sha512-EhPdIjNX0fcdwYQO+e3BAAJPXt+XI29TZWC7COhIXs/K0JHcUt1Gdz1ITpebTwVMFiLsukdUZ3u0oTO7jij+VA== - optionalDependencies: - "@napi-rs/canvas" "^0.1.67" - -pdfjs-dist@^4.6.82: +pdfjs-dist@4.8.69, pdfjs-dist@5.3.31, pdfjs-dist@^4.6.82, pdfjs-dist@^4.8.69, pdfjs-dist@^5.2.133: 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.2.133: - version "5.4.149" - resolved "https://registry.yarnpkg.com/pdfjs-dist/-/pdfjs-dist-5.4.149.tgz#7ff5b8427f37cd43e16377adf509af8595938afc" - integrity sha512-Xe8/1FMJEQPUVSti25AlDpwpUm2QAVmNOpFP0SIahaPIOKBKICaefbzogLdwey3XGGoaP4Lb9wqiw2e9Jqp0LA== - optionalDependencies: - "@napi-rs/canvas" "^0.1.77" - picocolors@1.1.1, picocolors@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" @@ -8659,23 +8181,6 @@ pino-std-serializers@^7.0.0: resolved "https://registry.yarnpkg.com/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz#7c625038b13718dbbd84ab446bd673dc52259e3b" integrity sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA== -pino@*, pino@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/pino/-/pino-10.0.0.tgz#3d1a8abc7a700142edebf02a7b291834da199fbe" - integrity sha512-eI9pKwWEix40kfvSzqEP6ldqOoBIN7dwD/o91TY5z8vQI12sAffpR/pOqAD1IVVwIVHDpHjkq0joBPdJD0rafA== - dependencies: - atomic-sleep "^1.0.0" - on-exit-leak-free "^2.1.0" - pino-abstract-transport "^2.0.0" - pino-std-serializers "^7.0.0" - process-warning "^5.0.0" - quick-format-unescaped "^4.0.3" - real-require "^0.2.0" - safe-stable-stringify "^2.3.1" - slow-redact "^0.3.0" - sonic-boom "^4.0.1" - thread-stream "^3.0.0" - pino@^9.0.0, pino@^9.6.0: version "9.7.0" resolved "https://registry.yarnpkg.com/pino/-/pino-9.7.0.tgz#ff7cd86eb3103ee620204dbd5ca6ffda8b53f645" @@ -8808,24 +8313,6 @@ 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" @@ -8923,7 +8410,7 @@ qrcode@^1.5.4: pngjs "^5.0.0" yargs "^15.3.1" -qs@^6.11.0, qs@^6.11.2, qs@^6.7.0: +qs@^6.11.0, qs@^6.11.2: version "6.14.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930" integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w== @@ -8950,16 +8437,6 @@ 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" @@ -9351,11 +8828,6 @@ rrweb-cssom@^0.8.0: resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz#3021d1b4352fbf3b614aaeed0bc0d5739abe0bc2" integrity sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw== -run-applescript@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-7.1.0.tgz#2e9e54c4664ec3106c5b5630e249d3d6595c4911" - integrity sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q== - run-async@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" @@ -9481,7 +8953,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.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: +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.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== @@ -9616,20 +9088,6 @@ 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" @@ -9681,11 +9139,6 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" -slow-redact@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/slow-redact/-/slow-redact-0.3.1.tgz#4cb9ad7011dcba97b8a4b58ce8a5d660243100f6" - integrity sha512-NvFvl1GuLZNW4U046Tfi8b26zXo8aBzgCAS2f7yVJR/fArN93mOqSA99cB9uITm92ajSz01bsu1K7SCVVjIMpQ== - sonic-boom@^4.0.1: version "4.2.0" resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-4.2.0.tgz#e59a525f831210fa4ef1896428338641ac1c124d" @@ -9975,11 +9428,6 @@ 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" @@ -10206,27 +9654,6 @@ 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" @@ -10415,7 +9842,7 @@ tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.0.1, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.6.2, tslib@^2.6.3, tslib@^2.7.0: +tslib@^2.0.0, tslib@^2.0.1, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.6.2, tslib@^2.6.3, tslib@^2.7.0: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== @@ -10430,13 +9857,6 @@ 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" @@ -10656,11 +10076,6 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -url-template@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21" - integrity sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw== - use-callback-ref@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.3.tgz#98d9fab067075841c5b2c6852090d5d0feabe2bf" @@ -10800,11 +10215,6 @@ warning@^4.0.0: dependencies: loose-envify "^1.0.0" -web-streams-polyfill@^3.0.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" - integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== - webidl-conversions@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" @@ -10991,13 +10401,6 @@ ws@^7.5.5: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== -wsl-utils@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/wsl-utils/-/wsl-utils-0.1.0.tgz#8783d4df671d4d50365be2ee4c71917a0557baab" - integrity sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw== - dependencies: - is-wsl "^3.1.0" - xml-name-validator@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-5.0.0.tgz#82be9b957f7afdacf961e5980f1bf227c0bf7673" @@ -11112,8 +10515,3 @@ zod@^4.0.14: version "4.0.14" resolved "https://registry.yarnpkg.com/zod/-/zod-4.0.14.tgz#cc3a0a21981e63e0f99c0f4f1decd92ec3be7e9f" integrity sha512-nGFJTnJN6cM2v9kXL+SOBq3AtjQby3Mv5ySGFof5UGRHrRioSJ5iG680cYNjE/yWk671nROcpPj4hAS8nyLhSw== - -zod@^4.1.11: - version "4.1.11" - resolved "https://registry.yarnpkg.com/zod/-/zod-4.1.11.tgz#4aab62f76cfd45e6c6166519ba31b2ea019f75f5" - integrity sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg==