From ed95dd08a2c089c013bf80b92e0700526f78a5af Mon Sep 17 00:00:00 2001 From: Keli Grubb Date: Fri, 29 Aug 2025 22:56:40 -0400 Subject: [PATCH] initial commit --- .gitignore | 3 + .woodpecker/ci.yml | 48 + README.md | 78 ++ assets/parchment.jpg | Bin 0 -> 29209 bytes dungeonGenerator.js | 126 +++ dungeonTemplate.js | 165 ++++ eslint.config.js | 7 + generateDungeon.js | 22 + index.js | 31 + package-lock.json | 2037 ++++++++++++++++++++++++++++++++++++++++++ package.json | 23 + 11 files changed, 2540 insertions(+) create mode 100644 .gitignore create mode 100644 .woodpecker/ci.yml create mode 100644 README.md create mode 100644 assets/parchment.jpg create mode 100644 dungeonGenerator.js create mode 100644 dungeonTemplate.js create mode 100644 eslint.config.js create mode 100644 generateDungeon.js create mode 100644 index.js create mode 100644 package-lock.json create mode 100644 package.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b661d49 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.pdf +.env +node_modules/** diff --git a/.woodpecker/ci.yml b/.woodpecker/ci.yml new file mode 100644 index 0000000..dd67357 --- /dev/null +++ b/.woodpecker/ci.yml @@ -0,0 +1,48 @@ +when: + - event: cron + branch: main + cron: "0 2 * * *" + - event: pull_request + - event: push + branch: main + +steps: + - name: deps + image: node:22 + commands: + - npm ci + caches: + - node_modules + + - name: lint + image: node:22 + when: + event: + - pull_request + - push + commands: + - npm run lint + caches: + - node_modules + + - name: generate-dungeon + image: node:22 + when: + event: + - cron + commands: + - npm start + caches: + - node_modules + + - name: upload-nextcloud + image: curlimages/curl:latest + when: + event: + - cron + environment: + NEXTCLOUD_URL: ${NEXTCLOUD_URL} + NEXTCLOUD_TOKEN: ${NEXTCLOUD_TOKEN} + commands: + - echo "not uploading yet..." + # - curl -X PUT -H "Authorization: Bearer $NEXTCLOUD_TOKEN" -H "Content-Type: application/pdf" --upload-file tomb-of-shadows.pdf "$NEXTCLOUD_URL/tomb-of-shadows-$(date +%F).pdf" diff --git a/README.md b/README.md new file mode 100644 index 0000000..39ffc5b --- /dev/null +++ b/README.md @@ -0,0 +1,78 @@ +# Scrollsmith + +Scrollsmith is a Node.js tool for generating Dungeons & Dragons one-page dungeon PDFs automatically. It uses an Ollama LLM server to create dungeon content, proofreads and refines it, then formats it into a structured PDF with maps, rooms, encounters, treasure, and NPCs. + +--- + +## Features + +- **Three-pass dungeon generation**: + 1. Draft: initial dungeon ideas + 2. Refine: proofread, add flavor, fill in vague details + 3. JSON conversion: output strictly valid JSON for PDF generation +- Automatically generates a PDF named after the dungeon title +- PDF layout includes three columns: map & hooks, rooms, encounters & treasure & NPCs +- Easy to integrate with a local Ollama server + +--- + +## Requirements + +- Node.js 22+ +- Ollama server running and accessible +- Nextcloud (optional) for PDF uploads +- `.env` file with: + +```env +OLLAMA_API_URL=http://localhost:3000/api/chat/completions +OLLAMA_API_KEY=your_api_key_here +```` + +--- + +## Installation + +```bash +git clone https://github.com/yourusername/scrollsmith.git +cd scrollsmith +npm install +``` + +--- + +## Usage + +1. Make sure your Ollama server is running and `.env` is configured. +2. Run: + +```bash +npm start +``` + +3. A PDF will be generated automatically. The filename matches the dungeon title. + +Optional: update the map path in `index.js` if you have a local dungeon map. + +--- + +## Example Output + +* `the-tomb-of-shadows.pdf` +* Three-column layout: + + * Column 1: Map, Adventure Hooks, Rumors + * Column 2: Keyed Rooms + * Column 3: Encounters, Treasure, NPCs + +--- + +## Notes + +* Make sure your Ollama server is accessible and API key is valid. +* Dungeon generation can take a few minutes depending on your LLM response time. + +--- + +## License + +PROPRIETARY diff --git a/assets/parchment.jpg b/assets/parchment.jpg new file mode 100644 index 0000000000000000000000000000000000000000..807aecd4855813fc749e57ee18888e1deaee9099 GIT binary patch literal 29209 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 setTimeout(resolve, ms)); +} + +async function callOllama(prompt, model = "gemma3:4b", retries = 3) { + let attempt = 0; + while (attempt < retries) { + try { + const response = await fetch(OLLAMA_API_URL, { + method: "POST", + headers: { + "Authorization": `Bearer ${OLLAMA_API_KEY}`, + "Content-Type": "application/json", + }, + body: JSON.stringify({ + model, + messages: [{ role: "user", content: prompt }], + }), + }); + + if (!response.ok) { + throw new Error(`Ollama API request failed: ${response.status} ${response.statusText}`); + } + + const data = await response.json(); + const text = data.choices?.[0]?.message?.content; + if (!text) throw new Error("No response from Ollama"); + return text; + + } catch (err) { + attempt++; + console.warn(`⚠️ Ollama call failed (attempt ${attempt}/${retries}): ${err.message}`); + if (attempt >= retries) throw err; + await sleep(1000 * attempt); // exponential backoff + } + } +} + +/** + * Three-pass dungeon generation with full resiliency and JSON retry + */ +export async function generateDungeon() { + console.log("🏗️ Starting dungeon generation..."); + + let draft, refined, jsonText; + + // Draft Pass + try { + console.log("📝 Draft pass..."); + const draftPrompt = ` +Generate a Dungeons & Dragons one-page dungeon concept. +Include a title, flavor text, hooks, rumors, rooms, encounters, treasure, and NPCs. +Output in readable text (not JSON). Focus on interesting ideas and adventure hooks. +`; + draft = await callOllama(draftPrompt); + console.log("✅ Draft pass complete."); + } catch (err) { + console.error("❌ Draft pass failed:", err); + throw new Error("Dungeon generation failed at draft step"); + } + + // Refine Pass + try { + console.log("🔧 Refine pass..."); + const refinePrompt = ` +Here is a draft dungeon description: + +${draft} + +Please carefully proofread this dungeon and improve it for professionalism and clarity: +- Fix any spelling, grammar, or phrasing issues +- Flesh out any vague or unclear descriptions +- Add richer flavor text to rooms, encounters, and NPCs +- Ensure all hooks, rumors, and treasures are compelling and well-explained +- Make the dungeon read as a polished, professional one-page adventure + +Keep the output as readable text format, not JSON. +`; + refined = await callOllama(refinePrompt); + console.log("✅ Refine pass complete."); + } catch (err) { + console.warn("⚠️ Refine pass failed, using draft as fallback:", err.message); + refined = draft; + } + + // JSON Pass with retries + const jsonPrompt = ` +Convert the following improved dungeon description into strictly valid JSON. +Use the following fields: +- title +- flavor +- map (just a placeholder string like "map.png") +- hooks (array of strings) +- rumors (array of strings) +- rooms (array of objects with "name" and "description") +- encounters (array of objects with "name" and "details") +- treasure (array of strings) +- npcs (array of objects with "name" and "trait") +Do not include any commentary, only output valid JSON. + +Dungeon description: +${refined} +`; + + const maxJsonRetries = 3; + for (let attempt = 1; attempt <= maxJsonRetries; attempt++) { + try { + console.log(`📦 JSON pass (attempt ${attempt}/${maxJsonRetries})...`); + jsonText = await callOllama(jsonPrompt); + const cleaned = jsonText.replace(/```json|```/g, "").trim(); + const result = JSON.parse(cleaned); + console.log("🎉 Dungeon generation complete!"); + return result; + } catch (err) { + console.warn(`⚠️ JSON parse failed (attempt ${attempt}/${maxJsonRetries}): ${err.message}`); + if (attempt === maxJsonRetries) { + console.error("❌ JSON pass ultimately failed. Raw output:", jsonText); + throw new Error("Dungeon generation failed at JSON step"); + } + await sleep(1000 * attempt); + } + } +} diff --git a/dungeonTemplate.js b/dungeonTemplate.js new file mode 100644 index 0000000..36609cf --- /dev/null +++ b/dungeonTemplate.js @@ -0,0 +1,165 @@ +export function dungeonTemplate(data) { + return ` + + + + + ${data.title} + + + + +

${data.title}

+

${data.flavor}

+ +
+ +
+

Map

+
+ Dungeon Map +
+ +

Adventure Hooks

+
    + ${data.hooks.map(h => `
  • ${h}
  • `).join("")} +
+ +

Rumors

+
    + ${data.rumors.map(r => `
  • ${r}
  • `).join("")} +
+
+ + +
+

Keyed Rooms

+ ${data.rooms.map((room, i) => ` +
+

${i+1}. ${room.name}

+

${room.description}

+
+ `).join("")} +
+ + +
+

Encounters

+ + + ${data.encounters.map(e => ` + + + + + `).join("")} +
NameDetails
${e.name}${e.details}
+ +

Treasure

+
    + ${data.treasure.map(t => `
  • ${t}
  • `).join("")} +
+ +

NPCs

+
    + ${data.npcs.map(n => `
  • ${n.name}: ${n.trait}
  • `).join("")} +
+
+
+ + + + + `; +} diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..c510269 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,7 @@ +import js from "@eslint/js"; +import globals from "globals"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + { files: ["**/*.{js,mjs,cjs}"], plugins: { js }, extends: ["js/recommended"], languageOptions: { globals: globals.node } }, +]); diff --git a/generateDungeon.js b/generateDungeon.js new file mode 100644 index 0000000..6098a6e --- /dev/null +++ b/generateDungeon.js @@ -0,0 +1,22 @@ +import puppeteer from "puppeteer"; +import { dungeonTemplate } from "./dungeonTemplate.js"; + +export async function generateDungeonPDF(data, outputPath = "dungeon.pdf") { + const browser = await puppeteer.launch({ + args: ['--no-sandbox', '--disable-setuid-sandbox'] + }); + const page = await browser.newPage(); + + const html = dungeonTemplate(data); + await page.setContent(html, { waitUntil: "networkidle0" }); + + await page.pdf({ + path: outputPath, + format: "A4", + landscape: true, + printBackground: true, + }); + + await browser.close(); + console.log(`Dungeon PDF saved to ${outputPath}`); +} diff --git a/index.js b/index.js new file mode 100644 index 0000000..6540672 --- /dev/null +++ b/index.js @@ -0,0 +1,31 @@ +import 'dotenv/config'; +import { generateDungeonPDF } from "./generateDungeon.js"; +import { generateDungeon } from "./dungeonGenerator.js"; + +// Utility to create a filesystem-safe filename from the dungeon title +function slugify(text) { + return text + .toLowerCase() + .replace(/[^a-z0-9]+/g, '-') // replace non-alphanumeric with hyphens + .replace(/^-+|-+$/g, ''); // trim leading/trailing hyphens +} + +(async () => { + try { + // Generate dungeon JSON from Ollama + const dungeonData = await generateDungeon(); + + // Optional: replace the map placeholder with your local map path + // dungeonData.map = "/absolute/path/to/dungeon-map.png"; + + // Generate a safe filename based on the dungeon's title + const filename = `${slugify(dungeonData.title)}.pdf`; + + // Generate PDF + await generateDungeonPDF(dungeonData, filename); + + console.log(`Dungeon PDF successfully generated: ${filename}`); + } catch (err) { + console.error("Error generating dungeon:", err); + } +})(); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..0bbbc11 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2037 @@ +{ + "name": "auto-dm", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "auto-dm", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "dotenv": "^17.2.1", + "puppeteer": "^24.17.1" + }, + "devDependencies": { + "@eslint/js": "^9.34.0", + "eslint": "^9.34.0", + "globals": "^16.3.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", + "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.34.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz", + "integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.15.2", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@puppeteer/browsers": { + "version": "2.10.8", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.8.tgz", + "integrity": "sha512-f02QYEnBDE0p8cteNoPYHHjbDuwyfbe4cCIVlNi8/MRicIxFW4w4CfgU0LNgWEID6s06P+hRJ1qjpBLMhPRCiQ==", + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.4.1", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.5.0", + "semver": "^7.7.2", + "tar-fs": "^3.1.0", + "yargs": "^17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", + "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", + "license": "MIT", + "optional": true, + "dependencies": { + "undici-types": "~7.10.0" + } + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "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", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/bare-events": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.6.1.tgz", + "integrity": "sha512-AuTJkq9XmE6Vk0FJVNq5QxETrSA/vKHarWVBG5l/JbdCL1prJemiyJqUS0jrlXO0MftuPq4m3YVYhoNc5+aE/g==", + "license": "Apache-2.0", + "optional": true + }, + "node_modules/bare-fs": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.2.1.tgz", + "integrity": "sha512-mELROzV0IhqilFgsl1gyp48pnZsaV9xhQapHLDsvn4d4ZTfbFhcghQezl7FTEDNBcGqLUnNI3lUlm6ecrLWdFA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-os": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", + "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-os": "^3.0.1" + } + }, + "node_modules/bare-stream": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz", + "integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "streamx": "^2.21.0" + }, + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chromium-bidi": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-8.0.0.tgz", + "integrity": "sha512-d1VmE0FD7lxZQHzcDUCKZSNRtRwISXDsdg4HjdTR5+Ll5nQ/vzU12JeNmupD6VWffrPSlrnGhEWlLESKH3VO+g==", + "license": "Apache-2.0", + "dependencies": { + "mitt": "^3.0.1", + "zod": "^3.24.1" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "license": "MIT", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/devtools-protocol": { + "version": "0.0.1475386", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1475386.tgz", + "integrity": "sha512-RQ809ykTfJ+dgj9bftdeL2vRVxASAuGU+I9LEx9Ij5TXU5HrgAQVmzi72VA+mkzscE12uzlRv5/tWWv9R9J1SA==", + "license": "BSD-3-Clause" + }, + "node_modules/dotenv": { + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.1.tgz", + "integrity": "sha512-kQhDYKZecqnM0fCnzI5eIv5L4cAe/iRI+HqMbO/hbRdTAeXDG+M9FjipUxNfbARuEg4iHIbhnhs78BCHNbSxEQ==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/eslint": { + "version": "9.34.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz", + "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.1", + "@eslint/core": "^0.15.2", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.34.0", + "@eslint/plugin-kit": "^0.3.5", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": 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==", + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "license": "MIT", + "dependencies": { + "pend": "~1.2.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", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-uri": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", + "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", + "license": "MIT", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.3.0.tgz", + "integrity": "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/ip-address": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", + "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "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==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "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==", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "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/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pac-proxy-agent": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", + "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "license": "MIT", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "license": "MIT", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "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==", + "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", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proxy-agent": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.6", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.1.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "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", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/puppeteer": { + "version": "24.17.1", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.17.1.tgz", + "integrity": "sha512-KIuX0w+0um4TUbm55yFl2WIsbgjya2BHIgW9ylTuhavtwjXCOM7lMo9oLR1jQnCxrFvm9h/Yeb+zfs4nlgntPg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.10.8", + "chromium-bidi": "8.0.0", + "cosmiconfig": "^9.0.0", + "devtools-protocol": "0.0.1475386", + "puppeteer-core": "24.17.1", + "typed-query-selector": "^2.12.0" + }, + "bin": { + "puppeteer": "lib/cjs/puppeteer/node/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer-core": { + "version": "24.17.1", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.17.1.tgz", + "integrity": "sha512-Msh/kf9k1XFN0wuKiT4/npMmMWOT7kPBEUw01gWvRoKOOoz3It9TEmWjnt4Gl4eO+p73VMrvR+wfa0dm9rfxjw==", + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.10.8", + "chromium-bidi": "8.0.0", + "debug": "^4.4.1", + "devtools-protocol": "0.0.1475386", + "typed-query-selector": "^2.12.0", + "ws": "^8.18.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "license": "MIT", + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/streamx": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz", + "integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==", + "license": "MIT", + "dependencies": { + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "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/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar-fs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.0.tgz", + "integrity": "sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.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==", + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/text-decoder": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typed-query-selector": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", + "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", + "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", + "license": "MIT", + "optional": true + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "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", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..cc60891 --- /dev/null +++ b/package.json @@ -0,0 +1,23 @@ +{ + "name": "auto-dm", + "version": "1.0.0", + "main": "index.js", + "type": "module", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "lint": "eslint .", + "start": "node index.js" + }, + "author": "", + "license": "SEE LICENSE IN README.md", + "description": "", + "dependencies": { + "dotenv": "^17.2.1", + "puppeteer": "^24.17.1" + }, + "devDependencies": { + "@eslint/js": "^9.34.0", + "eslint": "^9.34.0", + "globals": "^16.3.0" + } +}