From 39bd821d0fa4b0a93cbe21578bef3ae6e62f79dd Mon Sep 17 00:00:00 2001 From: sokari Date: Sat, 7 Dec 2024 20:14:15 +0100 Subject: [PATCH] feat: Slack bot! --- .env.slack.example | 2 + .github/workflows/actions-example.yml | 2 + .gitignore | 3 +- Dockerfile | 8 +- README.md | 27 +- assets/slack-block-template.json | 77 + assets/slack-bot.png | Bin 0 -> 38679 bytes docker-compose.yaml | 9 +- start.sh | 2 +- test.Dockerfile | 18 + worker/app/cloud-storage.ts | 2 - worker/app/notifier.ts | 164 ++ worker/app/report-builder.ts | 11 +- worker/app/site-builder.ts | 122 - worker/app/util.ts | 103 +- worker/cucumber.js | 8 + worker/index.ts | 46 +- worker/package-lock.json | 2720 +++++++++++++++++++++- worker/package.json | 6 +- worker/test/features/file-upload.feature | 8 + worker/test/step_definitions/Setup.ts | 44 + worker/tsconfig.json | 9 +- 22 files changed, 3138 insertions(+), 253 deletions(-) create mode 100644 .env.slack.example create mode 100644 assets/slack-block-template.json create mode 100644 assets/slack-bot.png create mode 100644 test.Dockerfile create mode 100644 worker/app/notifier.ts delete mode 100644 worker/app/site-builder.ts create mode 100644 worker/cucumber.js create mode 100644 worker/test/features/file-upload.feature create mode 100644 worker/test/step_definitions/Setup.ts diff --git a/.env.slack.example b/.env.slack.example new file mode 100644 index 0000000..ad2eadb --- /dev/null +++ b/.env.slack.example @@ -0,0 +1,2 @@ +SLACK_TOKEN= +SLACK_CONVERSION_ID= \ No newline at end of file diff --git a/.github/workflows/actions-example.yml b/.github/workflows/actions-example.yml index 24c45a1..2ddcbf1 100644 --- a/.github/workflows/actions-example.yml +++ b/.github/workflows/actions-example.yml @@ -51,6 +51,8 @@ jobs: -e WEBSITE_EXPIRES=${{ github.event.inputs.website-expires }} \ -e KEEP_RETRIES=${{ github.event.inputs.keep-retries }} \ -e KEEP_HISTORY=${{ github.event.inputs.keep-history }} \ + -e SLACK_TOKEN=${{secrets.SLACK_TOKEN}} \ + -e SLACK_CHANNEL_ID=${{secrets.SLACK_CHANNEL_ID}} \ -v $GITHUB_STEP_SUMMARY:/github/summary.txt \ -v ${{ github.workspace }}/assets/allure-results:/allure-results \ -v ${{ github.workspace }}/gcp-key.json:/credentials/gcp-key.json \ diff --git a/.gitignore b/.gitignore index 5f1d1a7..50327ec 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ allure-firebase.iml */node_modules worker/allure-* worker/lib -credentials/gcp-key.json \ No newline at end of file +credentials/gcp-key.json +.env.slack \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index ba5885a..267bc4e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,11 +12,11 @@ RUN npm install -g firebase-tools RUN mkdir "allure-results" # create staging # Copy app files and install deps COPY worker/. /app/ -RUN npm install -g typescript -RUN npm install --omit=dev && npm run build -RUN npm uninstall -g typescript +#RUN npm install -g typescript +#RUN npm install --omit=dev && npm run build +#RUN npm uninstall -g typescript ## Remove .ts files -RUN rm -rf app +#RUN rm -rf app COPY start.sh / CMD ["/bin/sh", "/start.sh"] \ No newline at end of file diff --git a/README.md b/README.md index dce54b5..f417131 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ Works in both CI and local environments with minimal setup, utilizing [Firebase - **Cloud Storage**: Automatically backs up Allure test results and history in a Google Cloud Storage bucket. - **Preview URLs**: Generates ephemeral Allure report URLs hosted on Firebase for easy sharing with stakeholders. -- **Slack Integration**: _(Coming Soon)_ Notify team members with preview URLs directly in Slack after each test run. +- **Slack Integration**: Notify team members with preview URLs directly in Slack after each test run. - **Continuous Deployment**: In Watch Mode, the container detects changes, generates reports, and uploads them automatically. Suitable for testing locally. @@ -75,13 +75,28 @@ jobs: ``` -**URL preview in GitHub Actions job summary** +--- + +#### View your report details in GitHub Actions job summary +
URL preview in GitHub Actions summary
-**Test result files in Firebase Storage** +--- + +#### Receive build success update in Slack + +
URL preview in GitHub Actions summary
+ +--- + +#### View your test result file on the Firebase Developer console +
Test result files in Firebase Storage
-**Test report example site** +--- + +#### Test report example site +
Test report example site
Tips @@ -179,6 +194,8 @@ services: | `KEEP_RETRIES` | Backup files in the `allure-results` directory after report generation | false | | `WATCH_MODE` | Keep the container running to auto deploy new test reports and results | false | | `TTL_SECS` | Time to wait (in seconds) after last file is detected before generating and uploading the report. Only works when `WATCH_MODE=true` | 45 | +| `SLACK_TOKEN` | Your Slack Bot token | None | +| `SLACK_CHANNEL_ID` | The ID of the channel or conversation you want to receive your status | None | **Note**: Either `STORAGE_BUCKET` or `WEBSITE_ID` must be provided. Both can be configured if you want to enable all functionalities. @@ -193,7 +210,7 @@ services: | **Cloud Storage backup** | ✅ Automatically backs up test result files to Google Cloud Storage. | ❌ No backup functionality; relies on GitHub repositories for report storage. | | **Direct deployment without Git commits** | ✅ Deploys directly to Firebase Hosting without committing generated reports to Git. | ❌ Requires committing generated reports to GitHub Pages. | | **Further analysis capabilities** | ✅ Allows access to all saved test result files for additional analysis beyond the Allure-generated report. | ❌ No such functionality provided. | -| **Slack notifications** | 🚧 Planned (Coming Soon). | ❌ Not supported. | +| **Slack notifications** | ✅ Receive your test report URL in Slack | ❌ Not supported. | diff --git a/assets/slack-block-template.json b/assets/slack-block-template.json new file mode 100644 index 0000000..eac4e08 --- /dev/null +++ b/assets/slack-block-template.json @@ -0,0 +1,77 @@ +{ + "blocks": [ + { + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Your Allure report is ready* :female-teacher:" + } + }, + { + "type": "context", + "elements": [ + { + "type": "mrkdwn", + "text": ":file_folder: *Files uploaded:* 54" + } + ] + }, + { + "type": "context", + "elements": [ + { + "type": "mrkdwn", + "text": ":mag: *Files processed:* 49" + } + ] + }, + { + "type": "context", + "elements": [ + { + "type": "mrkdwn", + "text": ":stopwatch: *Duration:* 11.206 seconds" + } + ] + }, + { + "type": "actions", + "elements": [ + { + "type": "button", + "text": { + "type": "plain_text", + "text": "View report", + "emoji": true + }, + "value": "click_me_123" + }, + { + "type": "button", + "text": { + "type": "plain_text", + "text": "View files in storage", + "emoji": true + }, + "value": "click_me_123", + "url": "https://google.com" + } + ] + }, + { + "type": "actions", + "elements": [ + { + "type": "button", + "text": { + "type": "plain_text", + "text": "Star us on GitHub :smile:", + "emoji": true + }, + "value": "click_me_123", + "action_id": "actionId-0" + } + ] + } + ] +} \ No newline at end of file diff --git a/assets/slack-bot.png b/assets/slack-bot.png new file mode 100644 index 0000000000000000000000000000000000000000..8cde3cd9a7b32e52353e85a5227e9de9a174cfc0 GIT binary patch literal 38679 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 YXP;;m)Q!kr0xCT`UHx3vIVCg!0A96VNB{r; literal 0 HcmV?d00001 diff --git a/docker-compose.yaml b/docker-compose.yaml index ddf841a..9324f66 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -3,9 +3,8 @@ services: image: goatlab/firebase-emulator:1.2-arm64 container_name: emulator ports: - - "9199:9199" # Storage - - "4001:3000" # UI - - "4000:4000" # UI + - "9199:9199" + - "4000:4000" command: ["firebase", "emulators:start", "--only", "storage,logging", "--project", "fir-demo-project", '--config', "./startfirebase.json"] restart: unless-stopped healthcheck: @@ -20,8 +19,8 @@ services: dockerfile: Dockerfile context: . container_name: allure-deployer + env_file: .env.slack environment: - DEBUG: true # Dev mode FIREBASE_STORAGE_EMULATOR_HOST: 127.0.0.1:9199 # Dev mode GOOGLE_APPLICATION_CREDENTIALS: ${PWD}/service-account.json STORAGE_BUCKET: "fir-demo-project.appspot.com" @@ -32,7 +31,7 @@ services: # WATCH_MODE: true TTL_SECS: 4 volumes: - - ./worker:/app #devs only. This overrides the /app dir + - ./worker:/app #Devs only. This overrides the /app dir - ${PWD}/gcp-key.json:${PWD}/service-account.json:ro - /Users/sokari/IdeaProjects/appium/reports/ios/allure-results:/allure-results cpus: 1 diff --git a/start.sh b/start.sh index 02f2bf4..6054639 100644 --- a/start.sh +++ b/start.sh @@ -35,7 +35,7 @@ fi GITHUB_SUMMARY_FILE="/github/summary.txt" if [ ! -f "$GITHUB_SUMMARY_FILE" ]; then export GITHUB_SUMMARY_FILE - echo "Git summary file directory mounted" + echo "Running on GitHub. Summary will be available in a bit" fi if [ -n "$TTL_SECS" ]; then diff --git a/test.Dockerfile b/test.Dockerfile new file mode 100644 index 0000000..84ebc64 --- /dev/null +++ b/test.Dockerfile @@ -0,0 +1,18 @@ +FROM node:22-alpine@sha256:adeb6d34aff46b81fb1dcf746961b6363180c53a91741c3c5c5db926c8df576c +#WORK_DIR env is used in code to manage files +ENV WORK_DIR=/app +WORKDIR $WORK_DIR +USER root +# JRE for Allure commandline +RUN apk add openjdk17-jre +# Firebase Hosting +RUN npm install -g firebase-tools +# Mount dir /allure-results +# Staging dir /app/allure-results +RUN mkdir "allure-results" # create staging +# Copy app files and install deps +COPY worker/. /app/ +RUN npm install -g typescript +RUN npm install + +CMD ["npm", "run", "test"] \ No newline at end of file diff --git a/worker/app/cloud-storage.ts b/worker/app/cloud-storage.ts index 8858bdf..98b4cc9 100644 --- a/worker/app/cloud-storage.ts +++ b/worker/app/cloud-storage.ts @@ -81,8 +81,6 @@ export class CloudStorage { } public async uploadResults() { - // try to delete any history file in STAGING_PATH/history - // await fs.rm(`${STAGING_PATH}/history`, {recursive: true,force: true}); const files = getAllFilesStream(MOUNTED_PATH) await this.uploadFiles(files) } diff --git a/worker/app/notifier.ts b/worker/app/notifier.ts new file mode 100644 index 0000000..48ba458 --- /dev/null +++ b/worker/app/notifier.ts @@ -0,0 +1,164 @@ +import counter from "./counter"; +import {cloudStorage, keepHistory, keepRetires, STORAGE_BUCKET, websiteId} from "../index"; +import {WebClient} from '@slack/web-api'; +import {StringBuilder} from "./string-builder"; +import {getProjectIdFromCredentialsFile} from "./util"; +import * as fs from "node:fs"; + +type SlackCredentials = { + token: string, + conversationId: string, + url?: string | undefined | null +} + +class Notifier { + private lineBreak = '
' + + public async SendSlackMsg(cred: SlackCredentials) { + const web = new WebClient(cred.token); + // See: https://api.slack.com/methods/chat.postMessage + + const blocks = [] + blocks.push({ + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Your Allure report is ready* :female-teacher:" + } + }) + if (cloudStorage) { + + blocks.push({ + "type": "context", + "elements": [ + { + "type": "mrkdwn", + "text": ":file_folder: *Files uploaded:* 54" + } + ] + }, + { + "type": "context", + "elements": [ + { + "type": "mrkdwn", + "text": ":mag: *Files processed:* 49" + } + ] + },) + } + blocks.push({ + "type": "context", + "elements": [ + { + "type": "mrkdwn", + "text": ":stopwatch: *Duration:* 11.206 seconds" + } + ] + }) + if (cred.url) { + blocks.push({ + "type": "actions", + "elements": [ + { + "type": "button", + "text": { + "type": "plain_text", + "text": "View report", + "emoji": true + }, + "url": cred.url + } + ] + }) + } + if(cloudStorage){ + const projectId = await getProjectIdFromCredentialsFile() + const firebaseDashboardUrl = `https://console.firebase.google.com/project/${projectId}/storage/${STORAGE_BUCKET}/files` + blocks.push({ + "type": "actions", + "elements": [ + { + "type": "button", + "text": { + "type": "plain_text", + "text": "View files in storage", + "emoji": true + }, + "url": firebaseDashboardUrl + } + ] + }) + } + blocks.push({ + "type": "actions", + "elements": [ + { + "type": "button", + "text": { + "type": "plain_text", + "text": "Star us on GitHub :smile:", + "emoji": true + }, + "url": "https://github.com/cybersokari/allure-docker-deploy" + } + ] + }) + + const result = await web.chat.postMessage({ + channel: cred.conversationId, + blocks: blocks, + }); + + console.log('Message sent: ', result.ts); + } + + public async printGithubSummary(data: { mountedFilePath: string, url: string | undefined }): Promise { + const builder = new StringBuilder() + builder.append(`**Your report is ready :female-teacher:** ${data.url}`) + .append(this.lineBreak).append(this.lineBreak) + if (data.url) { + builder.append(`**[View report](${data.url})**`) + .append(this.lineBreak).append(this.lineBreak) + } + if (cloudStorage) { + const projectId = await getProjectIdFromCredentialsFile() + const firebaseDashboardUrl = `https://console.firebase.google.com/project/${projectId}/storage/${STORAGE_BUCKET}/files` + builder.append(`**[View files](${firebaseDashboardUrl})**`) + .append(this.lineBreak).append(this.lineBreak) + + builder.append(`📂 Files uploaded: ${counter.filesUploaded}`) + .append(this.lineBreak).append(this.lineBreak) + .append(`🔍 Files processed: ${counter.filesProcessed}`) + .append(this.lineBreak).append(this.lineBreak) + } + builder + .append(`**⏱️ Duration: ${counter.getElapsedSeconds()} seconds**`) + try { + fs.writeFileSync(data.mountedFilePath, builder.toString(), {flag: 'a'}); // Append to the file + } catch (err) { + console.warn('Failed to write to $GITHUB_STEP_SUMMARY:', err); + } + } + + public printStats() { + if (!websiteId) { + console.log('Report publishing disabled because WEBSITE_ID is not provided'); + } + if (cloudStorage) { + if (keepHistory && keepRetires) { + console.log(`KEEP_HISTORY and KEEP_RETRIES enabled`) + } else if (!keepHistory && !keepRetires) { + console.log(`KEEP_HISTORY and KEEP_RETRIES disabled`) + } else if (keepHistory) { + console.log(`KEEP_HISTORY enabled`) + } else if (keepRetires) { + console.log(`KEEP_RETRIES enabled`) + } + } else { + console.log('STORAGE_BUCKET is not provided, KEEP_HISTORY and KEEP_RETRIES disabled'); + } + } +} + +export default new Notifier(); \ No newline at end of file diff --git a/worker/app/report-builder.ts b/worker/app/report-builder.ts index fc16323..e330aa5 100644 --- a/worker/app/report-builder.ts +++ b/worker/app/report-builder.ts @@ -1,11 +1,11 @@ import {REPORTS_DIR, STAGING_PATH} from "../index"; const allure = require('allure-commandline') -import {changePermissionsRecursively, createFirebaseJson, publishToFireBaseHosting} from "./site-builder"; import * as path from "node:path"; import * as fs from 'fs/promises' import counter from "./counter"; import pLimit from 'p-limit'; +import {publishToFireBaseHosting} from "./util"; class ReportBuilder { @@ -20,7 +20,7 @@ class ReportBuilder { clearTimeout(this.timeOut) this.timeOut = setTimeout(async () => { await this.generate() - return await this.host() + await publishToFireBaseHosting() }, this.ttl * 1000) } @@ -88,13 +88,6 @@ class ReportBuilder { return this } - public async host() { - await createFirebaseJson() - // Grant execution permission to website files - await changePermissionsRecursively(REPORTS_DIR, 0o755) - return await publishToFireBaseHosting() - } - } export default new ReportBuilder() \ No newline at end of file diff --git a/worker/app/site-builder.ts b/worker/app/site-builder.ts deleted file mode 100644 index 0bd701b..0000000 --- a/worker/app/site-builder.ts +++ /dev/null @@ -1,122 +0,0 @@ -import * as fs from "fs/promises"; -import {StringBuilder} from "./string-builder"; -import * as fsSync from "fs"; -import * as path from "node:path"; -import * as util from 'node:util' -import {DEBUG, REPORTS_DIR, websiteId} from "../index"; -import {validateWebsiteExpires} from "./util"; -import counter from "./counter"; - -const exec = util.promisify(require('child_process').exec) - -export async function createFirebaseJson() { - const hosting = { - "hosting": { - "public": ".", - "ignore": [ - "firebase.json", - "**/.*", - ] - } - } - try { - const configDir = `${REPORTS_DIR}/firebase.json` - await fs.writeFile(configDir, JSON.stringify(hosting), {mode: 0o755, encoding: 'utf-8'}) - return configDir - } catch (e) { - console.info(`firebase.json write failed: ${e}`) - throw e - } -} - -export async function changePermissionsRecursively(dirPath: string, mode: fsSync.Mode) { - await fs.chmod(dirPath, mode); - - const files = await fs.readdir(dirPath); - - for (const file of files) { - const fullPath = path.join(dirPath, file); - const stat = await fs.stat(fullPath); - - if (stat.isDirectory()) { - await changePermissionsRecursively(fullPath, mode); - } else { - await fs.chmod(fullPath, mode); - } - } -} - -export async function publishToFireBaseHosting() { - if (DEBUG) { - console.warn('DEBUG=true: Skipping live deployment') - return - } - console.log(`Deploying Allure report site...`) - const builder = new StringBuilder() - builder.append('firebase hosting:channel:deploy').append(' ') - .append(`--config ${REPORTS_DIR}/firebase.json`).append(' ') - .append(`--project ${process.env.FIREBASE_PROJECT_ID}`).append(' ') - .append('--no-authorized-domains').append(' ') - .append(websiteId!) - - // Website expiration setup - builder.append(' ') - .append('--expires') - .append(' ') - const expires = process.env.WEBSITE_EXPIRES - if (expires && validateWebsiteExpires(expires)) { - console.log(`WEBSITE_EXPIRES set to ${expires}`) - builder.append(expires) - } else { - console.log('No valid WEBSITE_EXPIRES provided, defaults to 7d') - builder.append('7d') - } - - const {stdout, stderr} = await exec(builder.toString()) - - if (stderr && !stdout) { - console.error(`Error from hosting: ${stderr}`) - } - // Try to extract - const regex = /hosting:channel: Channel URL.*\((.*?)\):\s+(https?:\/\/\S+)/; - const match = stdout.match(regex); - - if (match && match[2]) { - const url = match[2] - console.log(`Allure test report URL: ${url}`) - return url as string - } else { - console.warn('Could not parse URL from hosting.') - console.log(stdout) - return null - } - -} - -export function writeGitHubSummary({summaryPath = '', url = ''}) { - - const summaryContent = ` -### Allure Docker Deploy 🚀 - -**📝 Test Report URL:** ${url} - -**📂 Files uploaded: ${counter.filesUploaded}** - -**🔍 Files processed: ${counter.filesProcessed}** - -**⏱️ Duration: ${counter.getElapsedSeconds()} seconds** -`; - if (!summaryPath) { - console.warn('GITHUB_STEP_SUMMARY is not defined. Are you running inside a GitHub Action?'); - } - try { - fsSync.writeFileSync(summaryPath, summaryContent, {flag: 'a'}); // Append to the file - console.log('Summary written to $GITHUB_STEP_SUMMARY'); - } catch (err) { - console.warn('Failed to write to $GITHUB_STEP_SUMMARY:', err); - } -} - - - - diff --git a/worker/app/util.ts b/worker/app/util.ts index 74c8db7..1ba6e62 100644 --- a/worker/app/util.ts +++ b/worker/app/util.ts @@ -1,13 +1,17 @@ import * as fsSync from 'fs' import * as fs from 'fs/promises' import * as path from "node:path"; +import util from "node:util"; +const exec = util.promisify(require('child_process').exec) +import {REPORTS_DIR, websiteId} from "../index"; +import {StringBuilder} from "./string-builder"; -export const getProjectIdFromCredentialsFile = () => { +export const getProjectIdFromCredentialsFile = async () => { try { const credentialsContent = JSON.parse( - fsSync.readFileSync(process.env.GOOGLE_APPLICATION_CREDENTIALS!, 'utf8') + await fs.readFile(process.env.GOOGLE_APPLICATION_CREDENTIALS!, 'utf8') ); - return credentialsContent.project_id + return credentialsContent.project_id as string; } catch (error) { console.error('Failed to get project_id from Google credentials:', error); throw error; @@ -15,7 +19,6 @@ export const getProjectIdFromCredentialsFile = () => { } - export async function* getAllFilesStream(dir: string): AsyncGenerator { const entries = await fs.readdir(dir, { withFileTypes: true }); for (const entry of entries) { @@ -29,7 +32,6 @@ export async function* getAllFilesStream(dir: string): AsyncGenerator { } - export function validateWebsiteExpires(expires: string): boolean { const length = expires.trim().length @@ -38,7 +40,7 @@ export function validateWebsiteExpires(expires: string): boolean { } - // Regex to validate format: number followed by h/d/w + // Regex to validate a format: number followed by h/d/w const validFormatRegex = /^(\d+)([hdw])$/; const match = expires.match(validFormatRegex); @@ -68,5 +70,94 @@ export function validateWebsiteExpires(expires: string): boolean { } +export async function changePermissionsRecursively(dirPath: string, mode: fsSync.Mode) { + await fs.chmod(dirPath, mode); + + const files = await fs.readdir(dirPath); + + for (const file of files) { + const fullPath = path.join(dirPath, file); + const stat = await fs.stat(fullPath); + + if (stat.isDirectory()) { + await changePermissionsRecursively(fullPath, mode); + } else { + await fs.chmod(fullPath, mode); + } + } +} + +export async function publishToFireBaseHosting(): Promise { + // if (DEBUG) { + // console.warn('DEBUG=true: Skipping live deployment') + // return + // } + const hosting = { + "hosting": { + "public": ".", + "ignore": [ + "firebase.json", + "**/.*", + ] + } + } + try { + await changePermissionsRecursively(REPORTS_DIR, 0o755) + const configDir = `${REPORTS_DIR}/firebase.json` + await fs.writeFile(configDir, JSON.stringify(hosting), {mode: 0o755, encoding: 'utf-8'}) + } catch (e) { + // Overwrite fail, this is not suppose to happen + console.info(`Cannot create firebase.json. Aborting deployment ${e}`) + return + } + + console.log(`Deploying Allure report site...`) + const projectId = await getProjectIdFromCredentialsFile() + const builder = new StringBuilder() + builder.append('firebase hosting:channel:deploy').append(' ') + .append(`--config ${REPORTS_DIR}/firebase.json`).append(' ') + .append(`--project ${projectId}`).append(' ') + .append('--no-authorized-domains').append(' ') + .append(websiteId!) + + // Website expiration setup + builder.append(' ') + .append('--expires') + .append(' ') + const expires = process.env.WEBSITE_EXPIRES + if (expires && validateWebsiteExpires(expires)) { + console.log(`WEBSITE_EXPIRES set to ${expires}`) + builder.append(expires) + } else { + console.log('No valid WEBSITE_EXPIRES provided, defaults to 7d') + builder.append('7d') + } + + const {stdout, stderr} = await exec(builder.toString()) + + if (stderr && !stdout) { + console.error(`Error from hosting: ${stderr}`) + } + // Try to extract + const regex = /hosting:channel: Channel URL.*\((.*?)\):\s+(https?:\/\/\S+)/; + const match = stdout.match(regex); + + if (match && match[2]) { + const url = match[2] + console.log(`Allure test report URL: ${url}`) + return url as string + } else { + console.warn('Could not parse URL from hosting.') + console.log(stdout) + return + } + +} + + + + + + diff --git a/worker/cucumber.js b/worker/cucumber.js new file mode 100644 index 0000000..a54b3d1 --- /dev/null +++ b/worker/cucumber.js @@ -0,0 +1,8 @@ +module.exports = { + default: { + require: ['test/step_definitions/*.ts'], // Load step definitions + requireModule: ['ts-node/register'], // Enable TypeScript in Cucumber + format: ['json:reports/cucumber-report.json'], // Output report for Allure + publishQuiet: true, // Disable publishing results online + }, +} \ No newline at end of file diff --git a/worker/index.ts b/worker/index.ts index 60691a3..146493d 100644 --- a/worker/index.ts +++ b/worker/index.ts @@ -1,19 +1,19 @@ import * as chokidar from 'chokidar'; -import {getAllFilesStream, - getProjectIdFromCredentialsFile, +import { + getAllFilesStream, publishToFireBaseHosting, } from "./app/util"; import ReportBuilder from "./app/report-builder"; import {CloudStorage} from "./app/cloud-storage"; import counter from "./app/counter"; -import {writeGitHubSummary} from "./app/site-builder"; +import notifier from "./app/notifier"; -export const DEBUG = process.env.DEBUG === "true" || false; +export const DEBUG = process.env.FIREBASE_STORAGE_EMULATOR_HOST !== undefined || false; export const MOUNTED_PATH = '/allure-results' export const HOME_DIR = '/app' export const STAGING_PATH = `${HOME_DIR}/allure-results`; export const REPORTS_DIR = `${HOME_DIR}/allure-report` export const websiteId = process.env.WEBSITE_ID || null; -const STORAGE_BUCKET = process.env.STORAGE_BUCKET || null; +export const STORAGE_BUCKET = process.env.STORAGE_BUCKET || null; export const cloudStorage = STORAGE_BUCKET ? CloudStorage.getInstance(STORAGE_BUCKET) : null; export const keepHistory = process.env.KEEP_HISTORY?.toLowerCase() === 'true' export const keepRetires = process.env.KEEP_RETRIES?.toLowerCase() === 'true' @@ -26,21 +26,20 @@ const watchMode = process.env.WATCH_MODE?.toLowerCase() === 'true'; * 1. Upload files to cloud storage if STORAGE_BUCKET is provided * 2. Move files to STAGING_PATH and set ttl for hosting if WEBSITE_ID is provided */ -function main(): void { +export function main(): void { counter.startTimer() if (!cloudStorage && !websiteId) { console.warn('WEBSITE_ID or STORAGE_BUCKET is required'); return } - process.env.FIREBASE_PROJECT_ID = getProjectIdFromCredentialsFile() if (watchMode) { - // + chokidar.watch('/allure-results', { ignored: '^(?!.*\\.(json|png|jpeg|jpg|gif|properties|log|webm)$).*$', persistent: true, awaitWriteFinish: true, - usePolling: true, // Avoid unnecessary polling + usePolling: true, depth: 2, // Limit recursive depth }).on('add', (filePath: string) => { // console.log(`New result file: ${filePath}`); @@ -58,7 +57,6 @@ function main(): void { }); console.log(`Waiting for new files at ${MOUNTED_PATH}`); } else { - (async () => { let url @@ -69,7 +67,7 @@ function main(): void { cloudStorage?.stageRemoteFiles() ]) await ReportBuilder.generate() - url = await ReportBuilder.host() + url = await publishToFireBaseHosting() if(keepHistory){ await cloudStorage?.uploadHistory() } @@ -80,28 +78,16 @@ function main(): void { } const summaryPath = process.env.GITHUB_SUMMARY_FILE if(url && summaryPath){ - writeGitHubSummary({summaryPath, url}) + notifier.printGithubSummary({mountedFilePath: summaryPath, url: url}) + } + const token = process.env.SLACK_TOKEN; + const conversationId = process.env.SLACK_CHANNEL_ID; + if(conversationId && token){ + await notifier.SendSlackMsg({conversationId: conversationId, token: token, url: url}) } - })() - - } - if (!websiteId) { - console.log('Report publishing disabled because WEBSITE_ID is not provided'); - } - if (cloudStorage) { - if (keepHistory && keepRetires) { - console.log(`KEEP_HISTORY and KEEP_RETRIES enabled`) - } else if (!keepHistory && !keepRetires) { - console.log(`KEEP_HISTORY and KEEP_RETRIES disabled`) - } else if (keepHistory) { - console.log(`KEEP_HISTORY enabled`) - } else if (keepRetires) { - console.log(`KEEP_RETRIES enabled`) - } - } else { - console.log('STORAGE_BUCKET is not provided, KEEP_HISTORY and KEEP_RETRIES disabled'); } + notifier.printStats() } if (require.main === module) { diff --git a/worker/package-lock.json b/worker/package-lock.json index 959d270..1267107 100644 --- a/worker/package-lock.json +++ b/worker/package-lock.json @@ -6,6 +6,7 @@ "": { "name": "allure-deploy", "dependencies": { + "@slack/web-api": "^7.8.0", "allure-commandline": "^2.32.0", "async-mutex": "^0.5.0", "chokidar": "^4.0.1", @@ -13,11 +14,13 @@ "p-limit": "^6.1.0" }, "devDependencies": { + "@cucumber/cucumber": "^11.1.0", "@typescript-eslint/eslint-plugin": "^8.17.0", "@typescript-eslint/parser": "^8.17.0", "eslint": "^9.16.0", "eslint-config-google": "^0.14.0", "eslint-plugin-import": "^2.31.0", + "testcontainers": "^10.16.0", "ts-node-dev": "^2.0.0", "typescript": "^4.9.0" }, @@ -25,6 +28,49 @@ "node": "22" } }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@balena/dockerignore": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@balena/dockerignore/-/dockerignore-1.0.2.tgz", + "integrity": "sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -38,6 +84,300 @@ "node": ">=12" } }, + "node_modules/@cucumber/ci-environment": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@cucumber/ci-environment/-/ci-environment-10.0.1.tgz", + "integrity": "sha512-/+ooDMPtKSmvcPMDYnMZt4LuoipfFfHaYspStI4shqw8FyKcfQAmekz6G+QKWjQQrvM+7Hkljwx58MEwPCwwzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@cucumber/cucumber": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@cucumber/cucumber/-/cucumber-11.1.0.tgz", + "integrity": "sha512-INDycPL2AR1Ky3X+81n2MfChvVe8Z8we52GG6I0lld34755Dn3xsiM7a2g9eCr6wRX8+9vnOom1D7Pbc2238RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cucumber/ci-environment": "10.0.1", + "@cucumber/cucumber-expressions": "17.1.0", + "@cucumber/gherkin": "28.0.0", + "@cucumber/gherkin-streams": "5.0.1", + "@cucumber/gherkin-utils": "9.0.0", + "@cucumber/html-formatter": "21.6.0", + "@cucumber/junit-xml-formatter": "0.6.0", + "@cucumber/message-streams": "4.0.1", + "@cucumber/messages": "24.1.0", + "@cucumber/tag-expressions": "6.1.0", + "assertion-error-formatter": "^3.0.0", + "capital-case": "^1.0.4", + "chalk": "^4.1.2", + "cli-table3": "0.6.3", + "commander": "^10.0.0", + "debug": "^4.3.4", + "error-stack-parser": "^2.1.4", + "figures": "^3.2.0", + "glob": "^10.3.10", + "has-ansi": "^4.0.1", + "indent-string": "^4.0.0", + "is-installed-globally": "^0.4.0", + "is-stream": "^2.0.0", + "knuth-shuffle-seeded": "^1.0.6", + "lodash.merge": "^4.6.2", + "lodash.mergewith": "^4.6.2", + "luxon": "3.2.1", + "mime": "^3.0.0", + "mkdirp": "^2.1.5", + "mz": "^2.7.0", + "progress": "^2.0.3", + "read-pkg-up": "^7.0.1", + "resolve-pkg": "^2.0.0", + "semver": "7.5.3", + "string-argv": "0.3.1", + "supports-color": "^8.1.1", + "tmp": "0.2.3", + "type-fest": "^4.8.3", + "util-arity": "^1.1.0", + "yaml": "^2.2.2", + "yup": "1.2.0" + }, + "bin": { + "cucumber-js": "bin/cucumber.js" + }, + "engines": { + "node": "18 || 20 || 22 || >=23" + }, + "funding": { + "url": "https://opencollective.com/cucumber" + } + }, + "node_modules/@cucumber/cucumber-expressions": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/@cucumber/cucumber-expressions/-/cucumber-expressions-17.1.0.tgz", + "integrity": "sha512-PCv/ppsPynniKPWJr5v566daCVe+pbxQpHGrIu/Ev57cCH9Rv+X0F6lio4Id3Z64TaG7btCRLUGewIgLwmrwOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regexp-match-indices": "1.0.2" + } + }, + "node_modules/@cucumber/cucumber/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@cucumber/cucumber/node_modules/mkdirp": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz", + "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@cucumber/cucumber/node_modules/semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@cucumber/cucumber/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@cucumber/gherkin": { + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-28.0.0.tgz", + "integrity": "sha512-Ee6zJQq0OmIUPdW0mSnsCsrWA2PZAELNDPICD2pLfs0Oz7RAPgj80UsD2UCtqyAhw2qAR62aqlktKUlai5zl/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cucumber/messages": ">=19.1.4 <=24" + } + }, + "node_modules/@cucumber/gherkin-streams": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@cucumber/gherkin-streams/-/gherkin-streams-5.0.1.tgz", + "integrity": "sha512-/7VkIE/ASxIP/jd4Crlp4JHXqdNFxPGQokqWqsaCCiqBiu5qHoKMxcWNlp9njVL/n9yN4S08OmY3ZR8uC5x74Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "9.1.0", + "source-map-support": "0.5.21" + }, + "bin": { + "gherkin-javascript": "bin/gherkin" + }, + "peerDependencies": { + "@cucumber/gherkin": ">=22.0.0", + "@cucumber/message-streams": ">=4.0.0", + "@cucumber/messages": ">=17.1.1" + } + }, + "node_modules/@cucumber/gherkin-streams/node_modules/commander": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.1.0.tgz", + "integrity": "sha512-i0/MaqBtdbnJ4XQs4Pmyb+oFQl+q0lsAmokVUH92SlSw4fkeAcG3bVon+Qt7hmtF+u3Het6o4VgrcY3qAoEB6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/@cucumber/gherkin-utils": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@cucumber/gherkin-utils/-/gherkin-utils-9.0.0.tgz", + "integrity": "sha512-clk4q39uj7pztZuZtyI54V8lRsCUz0Y/p8XRjIeHh7ExeEztpWkp4ca9q1FjUOPfQQ8E7OgqFbqoQQXZ1Bx7fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cucumber/gherkin": "^28.0.0", + "@cucumber/messages": "^24.0.0", + "@teppeis/multimaps": "3.0.0", + "commander": "12.0.0", + "source-map-support": "^0.5.21" + }, + "bin": { + "gherkin-utils": "bin/gherkin-utils" + } + }, + "node_modules/@cucumber/gherkin-utils/node_modules/commander": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.0.0.tgz", + "integrity": "sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@cucumber/html-formatter": { + "version": "21.6.0", + "resolved": "https://registry.npmjs.org/@cucumber/html-formatter/-/html-formatter-21.6.0.tgz", + "integrity": "sha512-Qw1tdObBJrgXgXwVjKVjB3hFhFPI8WhIFb+ULy8g5lDl5AdnKDiyDXAMvAWRX+pphnRMMNdkPCt6ZXEfWvUuAA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@cucumber/messages": ">=18" + } + }, + "node_modules/@cucumber/junit-xml-formatter": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@cucumber/junit-xml-formatter/-/junit-xml-formatter-0.6.0.tgz", + "integrity": "sha512-++PAuxliQhq7yr2Bn9P0fwBUo46OoKAK5f6M4PrwoHBqIsl/6pUS4mqpviuBrgZ8RD7BTrmASk4lUDJClAz/qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cucumber/query": "^13.0.2", + "@teppeis/multimaps": "^3.0.0", + "xmlbuilder": "^15.1.1" + }, + "peerDependencies": { + "@cucumber/messages": "*" + } + }, + "node_modules/@cucumber/message-streams": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@cucumber/message-streams/-/message-streams-4.0.1.tgz", + "integrity": "sha512-Kxap9uP5jD8tHUZVjTWgzxemi/0uOsbGjd4LBOSxcJoOCRbESFwemUzilJuzNTB8pcTQUh8D5oudUyxfkJOKmA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@cucumber/messages": ">=17.1.1" + } + }, + "node_modules/@cucumber/messages": { + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-24.1.0.tgz", + "integrity": "sha512-hxVHiBurORcobhVk80I9+JkaKaNXkW6YwGOEFIh/2aO+apAN+5XJgUUWjng9NwqaQrW1sCFuawLB1AuzmBaNdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/uuid": "9.0.8", + "class-transformer": "0.5.1", + "reflect-metadata": "0.2.1", + "uuid": "9.0.1" + } + }, + "node_modules/@cucumber/messages/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@cucumber/query": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/@cucumber/query/-/query-13.0.2.tgz", + "integrity": "sha512-ykjwL99F5ZmJ3XnIRPe/eA8LvfSTc+C6ZZXrD5QrAfhfMRomBNpZT03MNnxrJ92ge18eDbculhclrIJQiVJCJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@teppeis/multimaps": "3.0.0", + "assert": "^2.1.0" + }, + "peerDependencies": { + "@cucumber/messages": "*" + } + }, + "node_modules/@cucumber/tag-expressions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@cucumber/tag-expressions/-/tag-expressions-6.1.0.tgz", + "integrity": "sha512-+3DwRumrCJG27AtzCIL37A/X+A/gSfxOPLg8pZaruh5SLumsTmpvilwroVWBT2fPzmno/tGXypeK5a7NHU4RzA==", + "dev": true, + "license": "MIT" + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", @@ -522,6 +862,109 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -609,6 +1052,17 @@ "node": ">=8.0.0" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -690,22 +1144,93 @@ "dev": true, "license": "MIT" }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "node_modules/@slack/logger": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-4.0.0.tgz", + "integrity": "sha512-Wz7QYfPAlG/DR+DfABddUZeNgoeY7d1J39OCR2jR+v7VBsB8ezulDK5szTnDDPDwLH5IWhLvXIHlCFZV7MSKgA==", "license": "MIT", - "optional": true, + "dependencies": { + "@types/node": ">=18.0.0" + }, "engines": { - "node": ">= 10" + "node": ">= 18", + "npm": ">= 8.6.0" } }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true, - "license": "MIT" + "node_modules/@slack/types": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/@slack/types/-/types-2.14.0.tgz", + "integrity": "sha512-n0EGm7ENQRxlXbgKSrQZL69grzg1gHLAVd+GlRVQJ1NSORo0FrApR7wql/gaKdu2n4TO83Sq/AmeUOqD60aXUA==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0", + "npm": ">= 6.12.0" + } + }, + "node_modules/@slack/web-api": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@slack/web-api/-/web-api-7.8.0.tgz", + "integrity": "sha512-d4SdG+6UmGdzWw38a4sN3lF/nTEzsDxhzU13wm10ejOpPehtmRoqBKnPztQUfFiWbNvSb4czkWYJD4kt+5+Fuw==", + "license": "MIT", + "dependencies": { + "@slack/logger": "^4.0.0", + "@slack/types": "^2.9.0", + "@types/node": ">=18.0.0", + "@types/retry": "0.12.0", + "axios": "^1.7.8", + "eventemitter3": "^5.0.1", + "form-data": "^4.0.0", + "is-electron": "2.2.2", + "is-stream": "^2", + "p-queue": "^6", + "p-retry": "^4", + "retry": "^0.13.1" + }, + "engines": { + "node": ">= 18", + "npm": ">= 8.6.0" + } + }, + "node_modules/@slack/web-api/node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@teppeis/multimaps": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@teppeis/multimaps/-/multimaps-3.0.0.tgz", + "integrity": "sha512-ID7fosbc50TbT0MK0EG12O+gAP3W3Aa/Pz4DaTtQtEvlc9Odaqi0de+xuZ7Li2GtK4HzEX7IuRWS/JmZLksR3Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true, + "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", @@ -754,6 +1279,29 @@ "@types/node": "*" } }, + "node_modules/@types/docker-modem": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/docker-modem/-/docker-modem-3.0.6.tgz", + "integrity": "sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/ssh2": "*" + } + }, + "node_modules/@types/dockerode": { + "version": "3.3.32", + "resolved": "https://registry.npmjs.org/@types/dockerode/-/dockerode-3.3.32.tgz", + "integrity": "sha512-xxcG0g5AWKtNyh7I7wswLdFvym4Mlqks5ZlKzxEUrGHS0r0PUOfxm2T0mspwu10mHQqu3Ck3MI3V2HqvLWE1fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/docker-modem": "*", + "@types/node": "*", + "@types/ssh2": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", @@ -836,6 +1384,13 @@ "undici-types": "~6.20.0" } }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/qs": { "version": "6.9.17", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", @@ -861,6 +1416,12 @@ "form-data": "^2.5.0" } }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "license": "MIT" + }, "node_modules/@types/send": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", @@ -882,6 +1443,43 @@ "@types/send": "*" } }, + "node_modules/@types/ssh2": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@types/ssh2/-/ssh2-1.15.1.tgz", + "integrity": "sha512-ZIbEqKAsi5gj35y4P4vkJYly642wIbY6PqoN0xiyQGshKUGXR9WQjF/iF9mXBQ8uBKy3ezfsCkcoHKhd0BzuDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^18.11.18" + } + }, + "node_modules/@types/ssh2-streams": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/@types/ssh2-streams/-/ssh2-streams-0.1.12.tgz", + "integrity": "sha512-Sy8tpEmCce4Tq0oSOYdfqaBpA3hDM8SoxoFh5vzFsu2oL+znzGz8oVWW7xb4K920yYMUY+PIG31qZnFMfPWNCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ssh2/node_modules/@types/node": { + "version": "18.19.67", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.67.tgz", + "integrity": "sha512-wI8uHusga+0ZugNp0Ol/3BqQfEcCCNfojtO6Oou9iVNGPTL6QNSdnUdqq85fRgIorLhLMuPIKpsN98QE9Nh+KQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/ssh2/node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", @@ -903,6 +1501,13 @@ "license": "MIT", "optional": true }, + "node_modules/@types/uuid": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", + "dev": true, + "license": "MIT" + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.17.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.17.0.tgz", @@ -1118,8 +1723,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "devOptional": true, "license": "MIT", - "optional": true, "dependencies": { "event-target-shim": "^5.0.0" }, @@ -1205,8 +1810,8 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "devOptional": true, "license": "MIT", - "optional": true, "engines": { "node": ">=8" } @@ -1227,6 +1832,13 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -1241,6 +1853,99 @@ "node": ">= 8" } }, + "node_modules/archiver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", + "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "archiver-utils": "^5.0.2", + "async": "^3.2.4", + "buffer-crc32": "^1.0.0", + "readable-stream": "^4.0.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^3.0.0", + "zip-stream": "^6.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/archiver-utils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", + "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^10.0.0", + "graceful-fs": "^4.2.0", + "is-stream": "^2.0.1", + "lazystream": "^1.0.0", + "lodash": "^4.17.15", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/archiver-utils/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/archiver/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -1385,6 +2090,56 @@ "node": ">=8" } }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" + } + }, + "node_modules/assertion-error-formatter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/assertion-error-formatter/-/assertion-error-formatter-3.0.0.tgz", + "integrity": "sha512-6YyAVLrEze0kQ7CmJfUgrLHb+Y7XghmL2Ie7ijVa2Y9ynP3LV+VDiwFk62Dn0qtqbmY0BT0ss6p1xxpiF2PYbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "diff": "^4.0.1", + "pad-right": "^0.2.2", + "repeat-string": "^1.6.1" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-lock": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", + "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", + "dev": true, + "license": "MIT" + }, "node_modules/async-mutex": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.5.0.tgz", @@ -1408,8 +2163,7 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/available-typed-arrays": { "version": "1.0.7", @@ -1427,6 +2181,38 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/axios": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1434,6 +2220,57 @@ "dev": true, "license": "MIT" }, + "node_modules/bare-events": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.0.tgz", + "integrity": "sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==", + "dev": true, + "license": "Apache-2.0", + "optional": true + }, + "node_modules/bare-fs": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz", + "integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-events": "^2.0.0", + "bare-path": "^2.0.0", + "bare-stream": "^2.0.0" + } + }, + "node_modules/bare-os": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz", + "integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true + }, + "node_modules/bare-path": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", + "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-os": "^2.1.0" + } + }, + "node_modules/bare-stream": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.4.2.tgz", + "integrity": "sha512-XZ4ln/KV4KT+PXdIWTKjsLY+quqCaEtqqtgGJVPw9AoM73By03ij64YjepK0aQvHSWDb6AfAZwqKaFu68qkrdA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "streamx": "^2.20.0" + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -1454,6 +2291,16 @@ ], "license": "MIT" }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, "node_modules/bignumber.js": { "version": "9.1.2", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", @@ -1476,6 +2323,43 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -1499,27 +2383,82 @@ "node": ">=8" } }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "license": "BSD-3-Clause" - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-crc32": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/buildcheck": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.6.tgz", + "integrity": "sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==", + "dev": true, + "optional": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/byline": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", + "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" @@ -1555,6 +2494,18 @@ "node": ">=6" } }, + "node_modules/capital-case": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", + "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1587,6 +2538,36 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true, + "license": "ISC" + }, + "node_modules/class-transformer": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", + "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==", + "dev": true, + "license": "MIT" + }, + "node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -1627,7 +2608,6 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "license": "MIT", - "optional": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -1635,6 +2615,50 @@ "node": ">= 0.8" } }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/compress-commons": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", + "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "crc-32": "^1.2.0", + "crc32-stream": "^6.0.0", + "is-stream": "^2.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/compress-commons/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1642,6 +2666,72 @@ "dev": true, "license": "MIT" }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cpu-features": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.10.tgz", + "integrity": "sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "buildcheck": "~0.0.6", + "nan": "^2.19.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", + "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", + "dev": true, + "license": "MIT", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/crc32-stream/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -1783,7 +2873,6 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "license": "MIT", - "optional": true, "engines": { "node": ">=0.4.0" } @@ -1798,6 +2887,80 @@ "node": ">=0.3.1" } }, + "node_modules/docker-compose": { + "version": "0.24.8", + "resolved": "https://registry.npmjs.org/docker-compose/-/docker-compose-0.24.8.tgz", + "integrity": "sha512-plizRs/Vf15H+GCVxq2EUvyPK7ei9b/cVesHvjnX4xaXjM9spHe2Ytq0BitndFgvTJ3E3NljPNUEl7BAN43iZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "yaml": "^2.2.2" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/docker-modem": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/docker-modem/-/docker-modem-3.0.8.tgz", + "integrity": "sha512-f0ReSURdM3pcKPNS30mxOHSbaFLcknGmQjwSfmbcdOw1XWKXVhukM3NJHhr7NpY9BIyyWQb0EBo3KQvvuU5egQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.1.1", + "readable-stream": "^3.5.0", + "split-ca": "^1.0.1", + "ssh2": "^1.11.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/dockerode": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/dockerode/-/dockerode-3.3.5.tgz", + "integrity": "sha512-/0YNa3ZDNeLr/tSckmD69+Gq+qVNhvKfAHNeZJBnp7EOP6RGKV8ORrJHkUn20So5wU+xxT7+1n5u8PjHbfjbSA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@balena/dockerignore": "^1.0.2", + "docker-modem": "^3.0.0", + "tar-fs": "~2.0.1" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/dockerode/node_modules/tar-fs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.1.tgz", + "integrity": "sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.0.0" + } + }, + "node_modules/dockerode/node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -1834,6 +2997,13 @@ "xtend": "^4.0.0" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -1847,19 +3017,39 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT", - "optional": true + "devOptional": true, + "license": "MIT" }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "devOptional": true, "license": "MIT", - "optional": true, "dependencies": { "once": "^1.4.0" } }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "stackframe": "^1.3.4" + } + }, "node_modules/es-abstract": { "version": "1.23.5", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz", @@ -2372,12 +3562,28 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "devOptional": true, "license": "MIT", - "optional": true, "engines": { "node": ">=6" } }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -2400,6 +3606,13 @@ "devOptional": true, "license": "MIT" }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true, + "license": "MIT" + }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", @@ -2489,6 +3702,32 @@ "node": ">=0.8.0" } }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -2578,6 +3817,26 @@ "dev": true, "license": "ISC" }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -2588,10 +3847,27 @@ "is-callable": "^1.1.3" } }, - "node_modules/form-data": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.2.tgz", - "integrity": "sha512-GgwY0PS7DbXqajuGf4OYlsrIu3zgxD6Vvql43IBhm6MahqA5SK/7mwhtNj2AdH2z35YR34ujJ7BN+3fFC3jP5Q==", + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.2.tgz", + "integrity": "sha512-GgwY0PS7DbXqajuGf4OYlsrIu3zgxD6Vvql43IBhm6MahqA5SK/7mwhtNj2AdH2z35YR34ujJ7BN+3fFC3jP5Q==", "license": "MIT", "optional": true, "dependencies": { @@ -2604,6 +3880,13 @@ "node": ">= 0.12" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, + "license": "MIT" + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2744,6 +4027,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-port": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", + "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-symbol-description": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", @@ -2821,6 +4117,22 @@ "node": "*" } }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", @@ -2919,6 +4231,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -2939,6 +4258,29 @@ "node": ">=14.0.0" } }, + "node_modules/has-ansi": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-4.0.1.tgz", + "integrity": "sha512-Qr4RtTm30xvEdqUXbSBVWDu+PrTokJOwe/FU+VdfJPk+MXAPoeOzKpRyrDTnZIJwAkQ4oBLTU53nu0HrkF/Z2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -3030,6 +4372,13 @@ "node": ">= 0.4" } }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "license": "ISC" + }, "node_modules/html-entities": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", @@ -3094,6 +4443,27 @@ "node": ">= 14" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -3131,6 +4501,16 @@ "node": ">=0.8.19" } }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -3150,6 +4530,16 @@ "devOptional": true, "license": "ISC" }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/internal-slot": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", @@ -3165,6 +4555,23 @@ "node": ">= 0.4" } }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-array-buffer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", @@ -3182,6 +4589,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, "node_modules/is-async-function": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", @@ -3305,6 +4719,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-electron": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.2.tgz", + "integrity": "sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==", + "license": "MIT" + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -3335,8 +4755,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "devOptional": true, "license": "MIT", - "optional": true, "engines": { "node": ">=8" } @@ -3370,6 +4790,23 @@ "node": ">=0.10.0" } }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", @@ -3383,6 +4820,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-negative-zero": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", @@ -3423,6 +4877,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-regex": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.0.tgz", @@ -3591,6 +5055,22 @@ "dev": true, "license": "ISC" }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jose": { "version": "4.15.9", "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", @@ -3600,6 +5080,13 @@ "url": "https://github.com/sponsors/panva" } }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -3629,6 +5116,13 @@ "dev": true, "license": "MIT" }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -3747,6 +5241,69 @@ "json-buffer": "3.0.1" } }, + "node_modules/knuth-shuffle-seeded": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/knuth-shuffle-seeded/-/knuth-shuffle-seeded-1.0.6.tgz", + "integrity": "sha512-9pFH0SplrfyKyojCLxZfMcvkhf5hH0d+UwR9nTVJ/DDQJGuzcXjTwB7TP7sDfehSudlGGaOLblmEWqv04ERVWg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "seed-random": "~2.2.0" + } + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -3766,6 +5323,13 @@ "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -3782,6 +5346,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", @@ -3838,6 +5409,13 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", @@ -3851,6 +5429,16 @@ "license": "Apache-2.0", "optional": true }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -3873,6 +5461,16 @@ "lru-cache": "6.0.0" } }, + "node_modules/luxon": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.2.1.tgz", + "integrity": "sha512-QrwPArQCNLAKGO/C+ZIilgIuDnEnKx5QYODdDtbFaxzsbZcc/a7WFq7MhsVYgRlwawLtvOUESTlfJ+hc/USqPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -3908,8 +5506,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "devOptional": true, "license": "MIT", - "optional": true, "bin": { "mime": "cli.js" }, @@ -3922,7 +5520,6 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "license": "MIT", - "optional": true, "engines": { "node": ">= 0.6" } @@ -3932,7 +5529,6 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "license": "MIT", - "optional": true, "dependencies": { "mime-db": "1.52.0" }, @@ -3966,6 +5562,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -3979,12 +5585,39 @@ "node": ">=10" } }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true, + "license": "MIT" + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nan": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz", + "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -3992,6 +5625,17 @@ "dev": true, "license": "MIT" }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -4021,12 +5665,45 @@ "node": ">= 6.13.0" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4054,6 +5731,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -4163,6 +5857,15 @@ "node": ">= 0.8.0" } }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/p-limit": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.1.0.tgz", @@ -4223,6 +5926,83 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue/node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/pad-right": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/pad-right/-/pad-right-0.2.2.tgz", + "integrity": "sha512-4cy8M95ioIGolCoMmm2cMntGR1lPLEbOMzOKu8bzjuJP6JpzEMQcDHmh7hHLYGgob+nKe1YHFMaG4V59HQa89g==", + "dev": true, + "license": "MIT", + "dependencies": { + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -4236,6 +6016,25 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -4273,6 +6072,37 @@ "dev": true, "license": "MIT" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -4306,6 +6136,86 @@ "node": ">= 0.8.0" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, + "node_modules/proper-lockfile/node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/proper-lockfile/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/properties-reader": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/properties-reader/-/properties-reader-2.3.0.tgz", + "integrity": "sha512-z597WicA7nDZxK12kZqHr2TcvwNU1GCfA5UwfDY/HDp3hXPoPlb5rlEx9bwGTiJnc0OqbBTkU975jDToth8Gxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mkdirp": "^1.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/steveukx/properties?sponsor=1" + } + }, + "node_modules/property-expr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz", + "integrity": "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==", + "dev": true, + "license": "MIT" + }, "node_modules/proto3-json-serializer": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.2.tgz", @@ -4344,6 +6254,23 @@ "node": ">=12.0.0" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -4374,12 +6301,129 @@ ], "license": "MIT" }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "dev": true, + "license": "MIT" + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "devOptional": true, "license": "MIT", - "optional": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -4389,6 +6433,29 @@ "node": ">= 6" } }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/readdirp": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", @@ -4402,6 +6469,14 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/reflect-metadata": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.1.tgz", + "integrity": "sha512-i5lLI6iw9AU3Uu4szRNPPEkomnkjRTaVt9hy/bn5g/oSzekBSMeLZblcjP74AW0vBabqERLLIrz+gR8QYR54Tw==", + "deprecated": "This version has a critical bug in fallback handling. Please upgrade to reflect-metadata@0.2.2 or newer.", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/reflect.getprototypeof": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.7.tgz", @@ -4424,6 +6499,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/regexp-match-indices": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regexp-match-indices/-/regexp-match-indices-1.0.2.tgz", + "integrity": "sha512-DwZuAkt8NF5mKwGGER1EGh2PRqyvhRhhLviH+R8y8dIuaQROlUfXjt4s9ZTXstIsSkptf06BSvwcEmmfheJJWQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "regexp-tree": "^0.1.11" + } + }, + "node_modules/regexp-tree": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "dev": true, + "license": "MIT", + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, "node_modules/regexp.prototype.flags": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", @@ -4443,6 +6538,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -4491,12 +6596,34 @@ "node": ">=4" } }, + "node_modules/resolve-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg/-/resolve-pkg-2.0.0.tgz", + "integrity": "sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-pkg/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/retry": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "license": "MIT", - "optional": true, "engines": { "node": ">= 4" } @@ -4622,6 +6749,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/seed-random": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/seed-random/-/seed-random-2.2.0.tgz", + "integrity": "sha512-34EQV6AAHQGhoc0tn/96a9Fsi6v2xdqe/dMUwljGRaFOzR3EgRmECvD0O8vi8X+/uQ50LGHfkNu/Eue5TPKZkQ==", + "dev": true, + "license": "MIT" + }, "node_modules/semver": { "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", @@ -4704,10 +6845,23 @@ "object-inspect": "^1.13.1" }, "engines": { - "node": ">= 0.4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/source-map": { @@ -4731,6 +6885,96 @@ "source-map": "^0.6.0" } }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", + "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/split-ca": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz", + "integrity": "sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ssh-remote-port-forward": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/ssh-remote-port-forward/-/ssh-remote-port-forward-1.0.4.tgz", + "integrity": "sha512-x0LV1eVDwjf1gmG7TTnfqIzf+3VPRz7vrNIjX6oYLbeCrf/PeVY6hkT68Mg+q02qXxQhrLjB0jfgvhevoCRmLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ssh2": "^0.5.48", + "ssh2": "^1.4.0" + } + }, + "node_modules/ssh-remote-port-forward/node_modules/@types/ssh2": { + "version": "0.5.52", + "resolved": "https://registry.npmjs.org/@types/ssh2/-/ssh2-0.5.52.tgz", + "integrity": "sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/ssh2-streams": "*" + } + }, + "node_modules/ssh2": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.16.0.tgz", + "integrity": "sha512-r1X4KsBGedJqo7h8F5c4Ybpcr5RjyP+aWIG007uBPRjmdQWfEiVLzSK71Zji1B9sKxwaCvD8y8cwSkYrlLiRRg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "asn1": "^0.2.6", + "bcrypt-pbkdf": "^1.0.2" + }, + "engines": { + "node": ">=10.16.0" + }, + "optionalDependencies": { + "cpu-features": "~0.0.10", + "nan": "^2.20.0" + } + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "dev": true, + "license": "MIT" + }, "node_modules/stream-events": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", @@ -4748,22 +6992,63 @@ "license": "MIT", "optional": true }, + "node_modules/streamx": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.21.0.tgz", + "integrity": "sha512-Qz6MsDZXJ6ur9u+b+4xCG18TluU7PGlRfXVAAjNiGsFrBUt/ioyLkxbFaKJygoPs+/kW4VyBj0bSj89Qu0IGyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-fifo": "^1.3.2", + "queue-tick": "^1.0.1", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "devOptional": true, "license": "MIT", - "optional": true, "dependencies": { "safe-buffer": "~5.2.0" } }, + "node_modules/string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -4829,8 +7114,22 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "license": "MIT", - "optional": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -4901,6 +7200,33 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tar-fs": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", + "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, "node_modules/teeny-request": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz", @@ -4959,6 +7285,80 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/testcontainers": { + "version": "10.16.0", + "resolved": "https://registry.npmjs.org/testcontainers/-/testcontainers-10.16.0.tgz", + "integrity": "sha512-oxPLuOtrRWS11A+Yn0+zXB7GkmNarflWqmy6CQJk8KJ75LZs2/zlUXDpizTbPpCGtk4kE2EQYwFZjrE967F8Wg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@balena/dockerignore": "^1.0.2", + "@types/dockerode": "^3.3.29", + "archiver": "^7.0.1", + "async-lock": "^1.4.1", + "byline": "^5.0.0", + "debug": "^4.3.5", + "docker-compose": "^0.24.8", + "dockerode": "^3.3.5", + "get-port": "^5.1.1", + "proper-lockfile": "^4.1.2", + "properties-reader": "^2.3.0", + "ssh-remote-port-forward": "^1.0.4", + "tar-fs": "^3.0.6", + "tmp": "^0.2.3", + "undici": "^5.28.4" + } + }, + "node_modules/text-decoder": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.2.tgz", + "integrity": "sha512-/MDslo7ZyWTA2vnk1j7XoDVfXsGk3tp+zFEJHJGm0UjIlQifonVFwlVbQDFh8KJzTBnT8ie115TYqir6bclddA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tiny-case": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz", + "integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -4972,6 +7372,13 @@ "node": ">=8.0" } }, + "node_modules/toposort": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", + "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==", + "dev": true, + "license": "MIT" + }, "node_modules/tr46": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", @@ -5179,6 +7586,13 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true, + "license": "Unlicense" + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -5192,6 +7606,19 @@ "node": ">= 0.8.0" } }, + "node_modules/type-fest": { + "version": "4.30.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.30.0.tgz", + "integrity": "sha512-G6zXWS1dLj6eagy6sVhOMQiLtJdxQBHIA9Z6HFUNLOlr6MFOgzV8wvmidtPONfPtEUv0uZsy77XJNzTAfwPDaA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/typed-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", @@ -5300,18 +7727,72 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici": { + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, "node_modules/undici-types": { "version": "6.20.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", "license": "MIT" }, + "node_modules/undici/node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/upper-case-first": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", + "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-arity": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/util-arity/-/util-arity-1.1.0.tgz", + "integrity": "sha512-kkyIsXKwemfSy8ZEoaIz06ApApnWsk5hQO0vLjZS6UkBiGiW++Jsyb8vSBoc0WKlffGoGs5yYy/j5pp8zckrFA==", + "dev": true, + "license": "MIT" + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT", - "optional": true + "devOptional": true, + "license": "MIT" }, "node_modules/uuid": { "version": "11.0.3", @@ -5333,6 +7814,17 @@ "dev": true, "license": "MIT" }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -5509,6 +8001,25 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -5516,6 +8027,16 @@ "devOptional": true, "license": "ISC" }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -5542,6 +8063,19 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, + "node_modules/yaml": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", + "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", @@ -5592,6 +8126,64 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/yup": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/yup/-/yup-1.2.0.tgz", + "integrity": "sha512-PPqYKSAXjpRCgLgLKVGPA33v5c/WgEx3wi6NFjIiegz90zSwyMpvTFp/uGcVnnbx6to28pgnzp/q8ih3QRjLMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "property-expr": "^2.0.5", + "tiny-case": "^1.0.3", + "toposort": "^2.0.2", + "type-fest": "^2.19.0" + } + }, + "node_modules/yup/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zip-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", + "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "archiver-utils": "^5.0.0", + "compress-commons": "^6.0.2", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/zip-stream/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } } } } diff --git a/worker/package.json b/worker/package.json index 0f55248..6bcf9d3 100644 --- a/worker/package.json +++ b/worker/package.json @@ -4,13 +4,15 @@ "scripts": { "lint": "eslint --ext .js,.ts .", "build": "tsc", - "build:watch": "tsc --watch" + "build:watch": "tsc --watch", + "test": "tsc && cucumber-js" }, "engines": { "node": "22" }, "main": "lib/index.js", "dependencies": { + "@slack/web-api": "^7.8.0", "allure-commandline": "^2.32.0", "async-mutex": "^0.5.0", "chokidar": "^4.0.1", @@ -18,11 +20,13 @@ "p-limit": "^6.1.0" }, "devDependencies": { + "@cucumber/cucumber": "^11.1.0", "@typescript-eslint/eslint-plugin": "^8.17.0", "@typescript-eslint/parser": "^8.17.0", "eslint": "^9.16.0", "eslint-config-google": "^0.14.0", "eslint-plugin-import": "^2.31.0", + "testcontainers": "^10.16.0", "ts-node-dev": "^2.0.0", "typescript": "^4.9.0" }, diff --git a/worker/test/features/file-upload.feature b/worker/test/features/file-upload.feature new file mode 100644 index 0000000..8cd3ddb --- /dev/null +++ b/worker/test/features/file-upload.feature @@ -0,0 +1,8 @@ +Feature: Cloud Storage + Background: + Given I set a valid Google Credential + And I set a valid Storage Bucket + + Scenario: Saves history to Storage + Given I set keepHistory to true + When I run the app in CI mode diff --git a/worker/test/step_definitions/Setup.ts b/worker/test/step_definitions/Setup.ts new file mode 100644 index 0000000..033aec0 --- /dev/null +++ b/worker/test/step_definitions/Setup.ts @@ -0,0 +1,44 @@ +import {AfterAll, BeforeAll, Given, setDefaultTimeout, When} from "@cucumber/cucumber"; +import {GenericContainer, StartedTestContainer} from "testcontainers"; +import {main} from "../../index"; +let container : StartedTestContainer; +setDefaultTimeout(40 * 1000) +export const defaultBucket = 'fir-demo-project.appspot.com' +BeforeAll(async () => { + container = await new GenericContainer("goatlab/firebase-emulator:1.2-arm64") + .withName("firebase-emulator") + .withExposedPorts({container: 9199, host: 9199}, {container: 4000, host: 4000}) + .withCommand([ + "firebase", + "emulators:start", + "--only", + "storage,logging", + "--project", + "fir-demo-project", + "--config", + "/app/startfirebase.json", + ]).start(); + + const host = container.getHost(); + const mappedPort9199 = container.getMappedPort(9199); + const mappedPort4000 = container.getMappedPort(4000); + console.log(`Firebase emulator is running on:`); + console.log(`- Storage: http://${host}:${mappedPort9199}`); + console.log(`- Logging: http://${host}:${mappedPort4000}`); + process.env.FIREBASE_STORAGE_EMULATOR_HOST = '127.0.0.1:9199' +}) +Given(/^I set a valid Google Credential$/, function () { + process.env.GOOGLE_APPLICATION_CREDENTIALS = '' +}); +Given(/^I set a valid Storage Bucket$/, function () { + process.env.STORAGE_BUCKET = defaultBucket +}); +AfterAll(async () => { + await container.stop(); +}) +Given(/^I set keepHistory to (true|false)$/, function (value: string) { + process.env.KEEP_HISTORY = value +}); +When(/^I run the app in CI mode$/, function () { + main() +}); \ No newline at end of file diff --git a/worker/tsconfig.json b/worker/tsconfig.json index 1351dd4..712a624 100644 --- a/worker/tsconfig.json +++ b/worker/tsconfig.json @@ -7,11 +7,14 @@ "sourceMap": true, "strict": true, "target": "es2017", - "allowSyntheticDefaultImports": true + "allowSyntheticDefaultImports": true, + "esModuleInterop": true }, + "compileOnSave": true, "include": [ "index.ts", - "app/*.ts" - ] + "app/*.ts", + "test/step_definitions/*.ts" + ], }