From 6c345df1c215d756f91072522278c6eeb2aaeea8 Mon Sep 17 00:00:00 2001 From: Alaguraj0361 Date: Thu, 9 Oct 2025 10:10:50 +0530 Subject: [PATCH] first commit --- .gitignore | 4 + config/db.js | 11 + controllers/auth.controller.js | 150 + controllers/blog.controller.js | 111 + controllers/category.controller.js | 46 + controllers/comment.controller.js | 54 + controllers/crawl.controller.js | 115 + controllers/lighthouseController.js | 113 + .../maisondetreats/cakeOrder.controller.js | 39 + controllers/message.controller.js | 68 + controllers/payment.controller.js | 132 + controllers/sitemap.controller.js | 20 + crawler copy.js | 709 +++ crawler.js | 921 +++ middlewares/auth.middleware.js | 19 + middlewares/pageSpeedErrorHandler.js | 4 + models/blog.model.js | 41 + models/category.model.js | 21 + models/comments.model.js | 10 + models/maisondetreats/cakeOrder.model.js | 18 + models/message.model.js | 12 + models/pageSpeedTest.model.js | 42 + models/payment.model.js | 12 + models/user.model.js | 14 + package-lock.json | 5093 +++++++++++++++++ package.json | 36 + .../treemap-1758885492002.html | 2897 ++++++++++ .../treemap-1758885890915.html | 2897 ++++++++++ .../treemap-1758958684569.html | 2897 ++++++++++ routes/auth.routes.js | 18 + routes/blog.routes.js | 54 + routes/crawl.routes.js | 6 + routes/lighthouse.routes.js | 8 + routes/maisondetreats/cakeOrder.routes.js | 12 + routes/message.routes.js | 12 + routes/payment.route.js | 14 + routes/sitemap.routes.js | 6 + server copy.js | 237 + server.js | 80 + uploads/2176fe75251a06cf07a08e32a845b537 | Bin 0 -> 35300 bytes uploads/240f5f275adf05f94ee3cb81d3a4c829 | Bin 0 -> 35300 bytes uploads/3d2a70806f726d28bd1814bce39b0906 | Bin 0 -> 30538 bytes uploads/866ff6699ca2b462d73b20c4d150b2e0 | Bin 0 -> 35300 bytes uploads/8930208f2d9cc158282fc31953abc6a3 | Bin 0 -> 35300 bytes uploads/d6d36b979d636c9f38a712bd3c298563 | Bin 0 -> 35300 bytes utils/mailer.js | 105 + utils/sitemap.js | 20 + utils/stripe.js | 8 + utils/urlHelpers.js | 11 + 49 files changed, 17097 insertions(+) create mode 100644 .gitignore create mode 100644 config/db.js create mode 100644 controllers/auth.controller.js create mode 100644 controllers/blog.controller.js create mode 100644 controllers/category.controller.js create mode 100644 controllers/comment.controller.js create mode 100644 controllers/crawl.controller.js create mode 100644 controllers/lighthouseController.js create mode 100644 controllers/maisondetreats/cakeOrder.controller.js create mode 100644 controllers/message.controller.js create mode 100644 controllers/payment.controller.js create mode 100644 controllers/sitemap.controller.js create mode 100644 crawler copy.js create mode 100644 crawler.js create mode 100644 middlewares/auth.middleware.js create mode 100644 middlewares/pageSpeedErrorHandler.js create mode 100644 models/blog.model.js create mode 100644 models/category.model.js create mode 100644 models/comments.model.js create mode 100644 models/maisondetreats/cakeOrder.model.js create mode 100644 models/message.model.js create mode 100644 models/pageSpeedTest.model.js create mode 100644 models/payment.model.js create mode 100644 models/user.model.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/lighthouse-treemap/treemap-1758885492002.html create mode 100644 public/lighthouse-treemap/treemap-1758885890915.html create mode 100644 public/lighthouse-treemap/treemap-1758958684569.html create mode 100644 routes/auth.routes.js create mode 100644 routes/blog.routes.js create mode 100644 routes/crawl.routes.js create mode 100644 routes/lighthouse.routes.js create mode 100644 routes/maisondetreats/cakeOrder.routes.js create mode 100644 routes/message.routes.js create mode 100644 routes/payment.route.js create mode 100644 routes/sitemap.routes.js create mode 100644 server copy.js create mode 100644 server.js create mode 100644 uploads/2176fe75251a06cf07a08e32a845b537 create mode 100644 uploads/240f5f275adf05f94ee3cb81d3a4c829 create mode 100644 uploads/3d2a70806f726d28bd1814bce39b0906 create mode 100644 uploads/866ff6699ca2b462d73b20c4d150b2e0 create mode 100644 uploads/8930208f2d9cc158282fc31953abc6a3 create mode 100644 uploads/d6d36b979d636c9f38a712bd3c298563 create mode 100644 utils/mailer.js create mode 100644 utils/sitemap.js create mode 100644 utils/stripe.js create mode 100644 utils/urlHelpers.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a05184b --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +# .gitignore +node_modules +.env +reports \ No newline at end of file diff --git a/config/db.js b/config/db.js new file mode 100644 index 0000000..d3d226f --- /dev/null +++ b/config/db.js @@ -0,0 +1,11 @@ +import mongoose from 'mongoose'; + +export async function connectDB() { + try { + await mongoose.connect(process.env.MONGODB_URI, { dbName: 'crawlerX' }); + console.log('✅ MongoDB connected'); + } catch (err) { + console.error('❌ MongoDB connection error:', err); + process.exit(1); + } +} diff --git a/controllers/auth.controller.js b/controllers/auth.controller.js new file mode 100644 index 0000000..68d7717 --- /dev/null +++ b/controllers/auth.controller.js @@ -0,0 +1,150 @@ +import bcrypt from "bcrypt"; +import jwt from "jsonwebtoken"; +import User from "../models/user.model.js"; +import { sendResetPasswordMail, sendSignupMail, } from "../utils/mailer.js"; +import crypto from "crypto"; + + +export async function signup(req, res) { + try { + const { email, password } = req.body; + if (!email || !password) + return res.status(400).json({ error: "Email and password required" }); + + const exists = await User.findOne({ email }); + if (exists) return res.status(400).json({ error: "User already exists" }); + + const passwordHash = await bcrypt.hash(password, 10); + const user = await User.create({ email, passwordHash }); + + // ✅ send confirmation email (non-blocking) + sendSignupMail(email) + .then(() => console.log("Signup email sent to", email)) + .catch(err => console.error("Email send failed:", err)); + + res.status(201).json({ message: "Signup success, email sent", id: user._id }); + } catch (err) { + console.error(err); + res.status(500).json({ error: "Signup failed" }); + } +} + +export async function login(req, res) { + try { + const { email, password } = req.body; + const user = await User.findOne({ email }); + if (!user) return res.status(401).json({ error: "Invalid credentials" }); + + const match = await bcrypt.compare(password, user.passwordHash); + if (!match) return res.status(401).json({ error: "Invalid credentials" }); + + const token = jwt.sign( + { id: user._id, email: user.email }, + process.env.JWT_SECRET, + { expiresIn: "1h" } + ); + + res.json({ message: "Login success", token }); + } catch (err) { + console.error(err); + res.status(500).json({ error: "Login failed" }); + } +} + +/** + * POST /api/auth/change-password + * Body: { currentPassword, newPassword } + * Header: Authorization: Bearer + */ +export async function changePassword(req, res) { + try { + const { currentPassword, newPassword } = req.body; + + // if using FormData, fields come from req.body AFTER a multipart parser + if (!currentPassword || !newPassword) { + return res.status(400).json({ error: "Current password and new password are required" }); + } + + const user = await User.findById(req.user.id); + if (!user) return res.status(404).json({ error: "User not found" }); + + const isMatch = await bcrypt.compare(currentPassword, user.passwordHash); + if (!isMatch) + return res.status(401).json({ error: "Current password is incorrect" }); + + user.passwordHash = await bcrypt.hash(newPassword, 10); + await user.save(); + + res.json({ message: "Password updated successfully" }); + } catch (err) { + console.error("changePassword error:", err); // ✅ show actual error + res.status(500).json({ error: "Failed to change password" }); + } +} + +/** + * POST /api/auth/forgot-password + * Body: { email } + */ +export async function forgotPassword(req, res) { + try { + const { email } = req.body; + if (!email) return res.status(400).json({ error: "Email is required" }); + + const user = await User.findOne({ email }); + + if (!user) + return res.json({ + message: "If the email is registered, a reset link has been sent.", + verificationCode: null, // user not found + }); + + // Generate 4-digit numeric verification code + const verificationCode = Math.floor(1000 + Math.random() * 9000).toString(); + + // Save code and expiry in DB + user.resetPasswordToken = verificationCode; + user.resetPasswordExpires = Date.now() + 60 * 60 * 1000; // 1 hour + await user.save(); + + // Send code via email + await sendResetPasswordMail(email, verificationCode); + + // ✅ Return verification code in response + res.json({ + message: "If the email is registered, a reset link has been sent.", + verificationCode, // This is the 4-digit code + }); + } catch (err) { + console.error("forgotPassword error:", err); + res.status(500).json({ error: "Failed to send reset link" }); + } +} + +/** + * POST /api/auth/reset-password + * Body: { token, newPassword } + */ +export async function resetPassword(req, res) { + try { + const { token, newPassword } = req.body; + if (!token || !newPassword) + return res.status(400).json({ error: "Token and new password are required" }); + + const user = await User.findOne({ + resetPasswordToken: token, + resetPasswordExpires: { $gt: Date.now() }, + }); + if (!user) return res.status(400).json({ error: "Invalid or expired token" }); + + user.passwordHash = await bcrypt.hash(newPassword, 10); + user.resetPasswordToken = undefined; + user.resetPasswordExpires = undefined; + await user.save(); + + res.json({ message: "Password has been reset successfully" }); + } catch (err) { + console.error("resetPassword error:", err); + res.status(500).json({ error: "Failed to reset password" }); + } +} \ No newline at end of file diff --git a/controllers/blog.controller.js b/controllers/blog.controller.js new file mode 100644 index 0000000..0df299f --- /dev/null +++ b/controllers/blog.controller.js @@ -0,0 +1,111 @@ +import Blog from '../models/blog.model.js'; +import Category from '../models/category.model.js'; +import slugify from 'slugify'; + +// ✅ Create Blog for particular project +export const createBlog = async (req, res) => { + try { + const { projectId, title, description, categoryId, tags } = req.body; + if (!projectId) return res.status(400).json({ message: 'projectId is required' }); + + const slug = slugify(title, { lower: true, strict: true }); + + const blog = await Blog.create({ + projectId, + title, + description, + slug, + category: categoryId, + tags, + imageUrl: req.files?.imageUrl ? `/uploads/${req.files.imageUrl[0].filename}` : '', + bigImageUrl: req.files?.bigImageUrl ? `/uploads/${req.files.bigImageUrl[0].filename}` : '' + }); + + res.status(201).json(blog); + } catch (err) { + res.status(500).json({ message: err.message }); + } +}; + +// ✅ Get All Blogs for a particular project +export const getAllBlogs = async (req, res) => { + try { + const { page = 1, limit = 10, search = '', category, projectId } = req.query; + if (!projectId) return res.status(400).json({ message: 'projectId is required' }); + + const query = { + projectId, + title: { $regex: search, $options: 'i' } + }; + + if (category) { + const cat = await Category.findOne({ slug: category }); + if (cat) query.category = cat._id; + } + + const blogs = await Blog.find(query) + .populate('category', 'name slug') + .sort({ createdAt: -1 }) + .skip((page - 1) * limit) + .limit(parseInt(limit)); + + const total = await Blog.countDocuments(query); + + res.json({ total, page: parseInt(page), blogs }); + } catch (err) { + res.status(500).json({ message: err.message }); + } +}; + +// ✅ Get Single Blog by Slug + projectId +export const getBlogBySlug = async (req, res) => { + try { + const { projectId } = req.query; // 👈 query param மூலம் + if (!projectId) return res.status(400).json({ message: 'projectId is required' }); + + const blog = await Blog.findOne({ slug: req.params.slug, projectId }) + .populate('category', 'name slug'); + + if (!blog) return res.status(404).json({ message: 'Blog not found' }); + res.json(blog); + } catch (err) { + res.status(500).json({ message: err.message }); + } +}; + +// ✅ Add Comment to Blog (projectId check optional – id already unique) +export const addComment = async (req, res) => { + try { + const { text, name } = req.body; + const blog = await Blog.findById(req.params.id); + if (!blog) return res.status(404).json({ message: 'Blog not found' }); + + blog.comments.push({ + user: req.user?._id, + name: name || 'Anonymous', + text + }); + + await blog.save(); + res.json(blog.comments); + } catch (err) { + res.status(500).json({ message: err.message }); + } +}; + +// ✅ Like / Unlike +export const likeBlog = async (req, res) => { + try { + const blog = await Blog.findById(req.params.id); + if (!blog) return res.status(404).json({ message: 'Blog not found' }); + + const userId = req.user._id; + if (blog.likes.includes(userId)) blog.likes.pull(userId); + else blog.likes.push(userId); + + await blog.save(); + res.json({ likesCount: blog.likes.length }); + } catch (err) { + res.status(500).json({ message: err.message }); + } +}; diff --git a/controllers/category.controller.js b/controllers/category.controller.js new file mode 100644 index 0000000..f88107e --- /dev/null +++ b/controllers/category.controller.js @@ -0,0 +1,46 @@ +import Category from '../models/category.model.js'; +import slugify from "slugify"; + +// Create a new category (Admin only) +export const createCategory = async (req, res) => { + try { + const { name, projectId } = req.body; + if (!projectId) return res.status(400).json({ message: "projectId is required" }); + + const slug = slugify(name, { lower: true, strict: true }); + + const category = await Category.create({ + name, + slug, + projectId + }); + + res.status(201).json(category); + } catch (err) { + res.status(500).json({ message: err.message }); + } +}; + +// Get all categories for a project +export const getCategories = async (req, res) => { + try { + const { projectId } = req.query; + if (!projectId) return res.status(400).json({ message: "projectId is required" }); + + const categories = await Category.find({ projectId }).sort({ name: 1 }); + res.json(categories); + } catch (err) { + res.status(500).json({ message: err.message }); + } +}; + +// Delete a category (Admin only) +export const deleteCategory = async (req, res) => { + try { + const { id } = req.params; + await Category.findByIdAndDelete(id); + res.json({ message: "Category deleted" }); + } catch (err) { + res.status(500).json({ message: err.message }); + } +}; diff --git a/controllers/comment.controller.js b/controllers/comment.controller.js new file mode 100644 index 0000000..f3af24b --- /dev/null +++ b/controllers/comment.controller.js @@ -0,0 +1,54 @@ +import Blog from "../models/blog.model.js"; + +// Add comment to a blog +export const addComment = async (req, res) => { + try { + const { blogId } = req.params; + const { text, name } = req.body; + + const blog = await Blog.findById(blogId); + if (!blog) return res.status(404).json({ message: "Blog not found" }); + + blog.comments.push({ + user: req.user?._id || null, + name: name || "Anonymous", + text + }); + + await blog.save(); + res.status(201).json(blog.comments); + } catch (err) { + res.status(500).json({ message: err.message }); + } +}; + +// Get all comments for a blog +export const getComments = async (req, res) => { + try { + const { blogId } = req.params; + + const blog = await Blog.findById(blogId); + if (!blog) return res.status(404).json({ message: "Blog not found" }); + + res.json(blog.comments.sort((a,b) => b.createdAt - a.createdAt)); + } catch (err) { + res.status(500).json({ message: err.message }); + } +}; + +// Delete a comment (Admin only) +export const deleteComment = async (req, res) => { + try { + const { blogId, commentId } = req.params; + + const blog = await Blog.findById(blogId); + if (!blog) return res.status(404).json({ message: "Blog not found" }); + + blog.comments.id(commentId)?.remove(); + await blog.save(); + + res.json({ message: "Comment deleted" }); + } catch (err) { + res.status(500).json({ message: err.message }); + } +}; diff --git a/controllers/crawl.controller.js b/controllers/crawl.controller.js new file mode 100644 index 0000000..042b925 --- /dev/null +++ b/controllers/crawl.controller.js @@ -0,0 +1,115 @@ +import path from "node:path"; +import fs from "node:fs"; +import { fileURLToPath } from "node:url"; +import { crawl } from "../crawler.js"; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +const ts = () => + new Date().toISOString().replaceAll(":", "-").replaceAll(".", "-"); + +function attachJson(res, filename, obj) { + const json = JSON.stringify(obj, null, 2); + res.setHeader("Content-Type", "application/json; charset=utf-8"); + res.setHeader("Content-Disposition", `attachment; filename="${filename}"`); + return res.send(json); +} +function isAbs(p) { + try { + return path.isAbsolute(p); + } catch { + return false; + } +} + +export async function crawlHandler(req, res) { + try { + const { url, max, stream, download, nostore } = req.query; + if (!url) return res.status(400).json({ error: "Missing url param" }); + + const target = new URL(String(url)); + const limit = Math.min(Math.max(parseInt(max ?? "50", 10), 1), 500); + const wantsStream = + String(stream) === "1" || + (req.get("accept") || "").includes("text/event-stream"); + + /* ---------- SSE mode ---------- */ + if (wantsStream) { + if (String(download) === "1") { + return res.status(400).json({ error: "download not supported with stream=1" }); + } + + res.setHeader("Content-Type", "text/event-stream"); + res.setHeader("Cache-Control", "no-cache, no-transform"); + res.setHeader("Connection", "keep-alive"); + res.flushHeaders?.(); + + const send = (obj, evt) => { + if (evt) res.write(`event: ${evt}\n`); + res.write(`data: ${JSON.stringify(obj)}\n\n`); + }; + + const heartbeat = setInterval(() => res.write(":\n\n"), 15000); + let finished = false; + + req.on("close", () => { + clearInterval(heartbeat); + if (!finished) console.warn("SSE client disconnected."); + }); + + const onProgress = (tick) => send(tick, "tick"); + send({ ok: true, message: "Crawl started", url: target.toString(), limit }, "started"); + + const result = await crawl(target.toString(), limit, onProgress, { + persistReports: false, + collectPages: true, + }); + + finished = true; + clearInterval(heartbeat); + send({ ok: true, done: true, result }, "done"); + return res.end(); + } + + /* ---------- Non-streaming mode ---------- */ + const preferMemory = String(nostore) === "1" || String(download) === "1"; + const result = await crawl( + target.toString(), + limit, + undefined, + preferMemory + ? { persistReports: false, collectPages: true } + : { persistReports: true, collectPages: true } + ); + + if (String(download) === "1") { + const filename = `crawl-${ts()}.json`; + + if (Array.isArray(result?.results)) { + return attachJson(res, filename, result.results); + } + + const jsonPath = result?.files?.json; + if (jsonPath) { + const abs = isAbs(jsonPath) ? jsonPath : path.join(__dirname, jsonPath); + if (fs.existsSync(abs)) { + res.setHeader("Content-Type", "application/json; charset=utf-8"); + res.setHeader("Content-Disposition", `attachment; filename="${filename}"`); + return fs.createReadStream(abs).pipe(res); + } + } + return attachJson(res, filename, result ?? {}); + } + + return res.json({ + ok: true, + message: "Crawl completed", + url: target.toString(), + limit, + ...result, + }); + } catch (err) { + console.error("Crawl error:", err); + res.status(500).json({ error: "Crawl failed", details: String(err?.message ?? err) }); + } +} diff --git a/controllers/lighthouseController.js b/controllers/lighthouseController.js new file mode 100644 index 0000000..fb34c87 --- /dev/null +++ b/controllers/lighthouseController.js @@ -0,0 +1,113 @@ +import lighthouse from 'lighthouse'; +import { launch } from 'chrome-launcher'; +import PageSpeedTest from '../models/pageSpeedTest.model.js'; +import path from 'path'; +import fs from 'fs'; + +const reportsDir = path.join(process.cwd(), 'public', 'lighthouse-treemap'); +// Ensure folder exists +if (!fs.existsSync(reportsDir)) fs.mkdirSync(reportsDir, { recursive: true }); + +const launchChromeAndRunLighthouse = async (url, device = 'mobile') => { + const chrome = await launch({ chromeFlags: ['--headless'] }); + + const options = { + port: chrome.port, + emulatedFormFactor: device, + throttlingMethod: device === 'mobile' ? 'simulate' : 'devtools', + output: 'json', // JSON for metrics + }; + + const runnerResult = await lighthouse(url, options); + const lhr = runnerResult.lhr; + + // Create HTML treemap report (only once, for mobile) + let treemapFile = null; + if (device === 'mobile') { + const fileName = `treemap-${Date.now()}.html`; + treemapFile = `/lighthouse-treemap/${fileName}`; + + // Generate HTML report + const htmlReport = await lighthouse(url, { + port: chrome.port, + emulatedFormFactor: device, + throttlingMethod: 'simulate', + output: 'html', + }); + + fs.writeFileSync(path.join(reportsDir, fileName), htmlReport.report); + } + + await chrome.kill(); + + // Structured result + const result = { + url, + device, + scores: { + performance: Math.round(lhr.categories.performance?.score * 100), + accessibility: Math.round(lhr.categories.accessibility?.score * 100), + bestPractices: Math.round(lhr.categories['best-practices']?.score * 100), + seo: Math.round(lhr.categories.seo?.score * 100), + pwa: lhr.categories.pwa?.score ? Math.round(lhr.categories.pwa.score * 100) : null, + }, + metrics: { + firstContentfulPaint: lhr.audits['first-contentful-paint']?.displayValue || null, + largestContentfulPaint: lhr.audits['largest-contentful-paint']?.displayValue || null, + totalBlockingTime: lhr.audits['total-blocking-time']?.displayValue || null, + timeToInteractive: lhr.audits['interactive']?.displayValue || null, + speedIndex: lhr.audits['speed-index']?.displayValue || null, + cumulativeLayoutShift: lhr.audits['cumulative-layout-shift']?.displayValue || null, + }, + opportunities: Object.values(lhr.audits) + .filter(a => a.details?.type === 'opportunity') + .map(a => ({ + title: a.title, + description: a.description, + estimatedSavings: a.details?.overallSavingsMs + ? `${Math.round(a.details.overallSavingsMs)} ms` + : null, + })), + diagnostics: { + usesHTTPS: lhr.audits['is-on-https']?.score === 1, + usesEfficientCachePolicy: lhr.audits['uses-long-cache-ttl']?.score === 1, + imageCompression: lhr.audits['uses-optimized-images']?.score === 1, + }, + failedAudits: Object.values(lhr.audits) + .filter(a => a.score !== null && a.score !== 1 && a.scoreDisplayMode !== 'notApplicable') + .map(a => ({ title: a.title, description: a.description })), + passedAudits: Object.values(lhr.audits) + .filter(a => a.score === 1 && a.scoreDisplayMode !== 'notApplicable' && !a.details?.type) + .map(a => a.title), + notApplicableAudits: Object.values(lhr.audits) + .filter(a => a.scoreDisplayMode === 'notApplicable') + .map(a => a.title), + screenshot: lhr.audits['final-screenshot']?.details?.data || null, + createdAt: new Date(), + treemapPath: treemapFile, + }; + + const report = await PageSpeedTest.create(result); + return { report }; +}; + +export const runAudit = async (req, res, next) => { + try { + const { url } = req.body; + if (!url) return res.status(400).json({ message: 'URL is required' }); + + const mobileResult = await launchChromeAndRunLighthouse(url, 'mobile'); + const desktopResult = await launchChromeAndRunLighthouse(url, 'desktop'); + + res.status(200).json({ + message: 'Audit completed successfully', + results: { + mobile: mobileResult.report, + desktop: desktopResult.report, + treemap: mobileResult.report.treemapPath, // HTML report + }, + }); + } catch (err) { + next(err); + } +}; diff --git a/controllers/maisondetreats/cakeOrder.controller.js b/controllers/maisondetreats/cakeOrder.controller.js new file mode 100644 index 0000000..0a4cd3d --- /dev/null +++ b/controllers/maisondetreats/cakeOrder.controller.js @@ -0,0 +1,39 @@ +import { CakeOrder } from "../../models/maisondetreats/cakeOrder.model.js"; +import { sendCakeOrderMail } from "../../utils/mailer.js"; + +export const createCakeOrder = async (req, res) => { + try { + const { order, email } = req.body; + + if (!order || typeof order !== "object") { + return res.status(400).json({ message: "Order data is required" }); + } + + const newOrder = await CakeOrder.create({ order, email }); + + // ✅ send confirmation email (non-blocking) + if (email) { + sendCakeOrderMail(email, order) + .then(() => console.log("Cake order email sent to", email)) + .catch((err) => console.error("Email send failed:", err)); + } + + res.status(201).json({ + message: "Cake order created successfully", + data: newOrder, + }); + } catch (err) { + console.error("Error creating cake order:", err); + res.status(500).json({ message: "Server error", error: err.message }); + } +}; +// GET /api/cake-orders → List all orders +export const getAllCakeOrders = async (_req, res) => { + try { + const orders = await CakeOrder.find().sort({ createdAt: -1 }); + res.json({ data: orders }); + } catch (err) { + console.error("Error fetching cake orders:", err); + res.status(500).json({ message: "Server error", error: err.message }); + } +}; diff --git a/controllers/message.controller.js b/controllers/message.controller.js new file mode 100644 index 0000000..921b74a --- /dev/null +++ b/controllers/message.controller.js @@ -0,0 +1,68 @@ +// message.controller.js + +import dotenv from "dotenv"; +import axios from "axios"; +import Message from "../models/message.model.js"; + +dotenv.config(); + +export const sendMessage = async (req, res) => { + try { + const { project, name, email, message } = req.body; + + if (!project) return res.status(400).json({ success: false, error: "Project is required" }); + if (!message) return res.status(400).json({ success: false, error: "Message is required" }); + + // Save message to MongoDB + const newMessage = await Message.create({ project, name, email, message }); + + // Send WhatsApp Template Message + const url = `https://graph.facebook.com/v22.0/774121419125441/messages`; + const payload = { + messaging_product: "whatsapp", + to: 917871207631, + type: "template", + template: { + name: "new_message_alert", + language: { code: "en_US" }, + components: [ + { + type: "body", + parameters: [ + { type: "text", text: project || "Project" }, + { type: "text", text: name || "Guest" }, + { type: "text", text: email || "N/A" }, + { type: "text", text: message || "No message" }, + ], + }, + ], + }, + }; + const headers = { + Authorization: `Bearer EAALKxEMPlp0BPkmoTAJlZAZAymtgqzcUuGVdZAZAKSZAw1csXR5Xy2DodBUC2zXckOYvQ2jOV4aFlZAeCo4IuJCyMb5aFt2UfNRQ1pDGk08QlbCjjCTMsZALipZCMNYyNVwN2pTDwUcYeNZByOrweVVdXD1ErZAbzjc04wmR8ilhQXink4it05BatwkZBf3xCLyy3k6R0tgx9JoymQTn83iZANBWDzvmX3vW5dx6Pud6xNEfqYNsjwZDZD`, + "Content-Type": "application/json", + }; + + const response = await axios.post(url, payload, { headers }); + console.log("✅ WhatsApp API Response:", response.data); + + return res.status(201).json({ success: true, data: newMessage }); + } catch (err) { + console.error("❌ WhatsApp API Error:", err.response?.data || err.message); + return res.status(500).json({ success: false, error: "Server Error" }); + } +}; + +// ✅ Add this function and export it +export const getMessages = async (req, res) => { + try { + const { project } = req.query; + if (!project) return res.status(400).json({ success: false, error: "Project is required" }); + + const messages = await Message.find({ project }).sort({ createdAt: -1 }); + return res.status(200).json({ success: true, data: messages }); + } catch (err) { + console.error(err); + return res.status(500).json({ success: false, error: "Server Error" }); + } +}; diff --git a/controllers/payment.controller.js b/controllers/payment.controller.js new file mode 100644 index 0000000..a465115 --- /dev/null +++ b/controllers/payment.controller.js @@ -0,0 +1,132 @@ +// controllers/payment.controller.js +import Stripe from "stripe"; +import { Payment } from "../models/payment.model.js"; + +// ✅ Load Stripe Secret Key from .env +const stripe = new Stripe("sk_test_51SB8SnIFk8fh986GkYaNPVSfZzh6gcuXhq3tOa5hyE4U4vYIqrHwyGRu2OE1N5TNW39tJmfFOyYfsh4HcZOjlsj100xIeM46zU", { + apiVersion: "2022-11-15", +}); + +/** + * 🔹 Option 1: PaymentIntent API (client uses clientSecret) + */ +export async function createPaymentIntent(req, res) { + try { + const { amount } = req.body; + if (!amount) return res.status(400).json({ error: "amount is required" }); + + const paymentIntent = await stripe.paymentIntents.create({ + amount: Math.round(amount * 100), // dollars → cents + currency: "usd", + automatic_payment_methods: { enabled: true }, + }); + + await Payment.create({ + amount: Math.round(amount * 100), + stripePaymentIntentId: paymentIntent.id, + status: "pending", + }); + + res.json({ clientSecret: paymentIntent.client_secret }); + } catch (err) { + console.error("❌ Error creating PaymentIntent:", err); + res.status(500).json({ error: "Internal Server Error" }); + } +} + +/** + * 🔹 Option 2: Stripe Checkout Session (redirect flow) + */ +export async function createCheckoutSession(req, res) { + try { + const { email, amount, planId } = req.body; + if (!email || !amount) { + return res.status(400).json({ error: "email and amount are required" }); + } + + const session = await stripe.checkout.sessions.create({ + payment_method_types: ["card"], + mode: "payment", + customer_email: email, + line_items: [ + { + price_data: { + currency: "usd", + product_data: { name: planId || "SEO Plan" }, + unit_amount: Math.round(amount * 100), + }, + quantity: 1, + }, + ], + success_url: "https://app.crawlerx.co/success", + cancel_url: "https://app.crawlerx.co/cancel", + }); + + // Save to DB using stripeSessionId instead of stripePaymentIntentId + await Payment.create({ + email, + amount: Math.round(amount * 100), + stripeSessionId: session.id, // ✅ use session id + status: "pending", + }); + + res.json({ sessionId: session.id }); + } catch (err) { + console.error("❌ Error creating checkout session:", err); + res.status(500).json({ error: "Internal Server Error" }); + } +} + + +/** + * 🔹 Stripe Webhook + * Stripe requires `express.raw({ type: "application/json" })` in route + */ +export async function handleWebhook(req, res) { + const sig = req.headers["stripe-signature"]; + let event; + + try { + event = stripe.webhooks.constructEvent( + req.rawBody, // Must be raw body + sig, + process.env.STRIPE_WEBHOOK_SECRET + ); + } catch (err) { + console.error("❌ Webhook signature verification failed:", err.message); + return res.status(400).send(`Webhook Error: ${err.message}`); + } + + switch (event.type) { + case "payment_intent.succeeded": { + const paymentIntent = event.data.object; + console.log("✅ PaymentIntent succeeded:", paymentIntent.id); + + await Payment.findOneAndUpdate( + { stripePaymentIntentId: paymentIntent.id }, + { status: "succeeded" } + ); + break; + } + + case "checkout.session.completed": { + const session = event.data.object; + console.log("✅ Checkout session completed:", session.id); + + // Update DB record created earlier + await Payment.findOneAndUpdate( + { email: session.customer_email, status: "pending" }, + { + stripePaymentIntentId: session.payment_intent, + status: "succeeded", + } + ); + break; + } + + default: + console.log(`Unhandled event type ${event.type}`); + } + + res.json({ received: true }); +} diff --git a/controllers/sitemap.controller.js b/controllers/sitemap.controller.js new file mode 100644 index 0000000..25bf7f2 --- /dev/null +++ b/controllers/sitemap.controller.js @@ -0,0 +1,20 @@ +import { getSitemapUrls } from "../utils/sitemap.js"; + +export async function sitemapHandler(req, res) { + try { + const { u } = req.query; + if (!u) return res.status(400).json({ error: "Missing ?u=https://site.com" }); + + const origin = new URL(String(u)); + const urls = await getSitemapUrls(origin.toString()); + res.json({ + ok: true, + origin: origin.origin, + count: urls.length, + urls, + }); + } catch (err) { + console.error("sitemap error:", err); + res.status(500).json({ error: "Failed to fetch sitemap", details: String(err?.message ?? err) }); + } +} diff --git a/crawler copy.js b/crawler copy.js new file mode 100644 index 0000000..a23651e --- /dev/null +++ b/crawler copy.js @@ -0,0 +1,709 @@ +import got from "got"; +import * as cheerio from "cheerio"; +import normalizeUrl from "normalize-url"; +import { isInternal } from "./utils/urlHelpers.js"; +import { getSitemapUrls } from "./utils/sitemap.js"; +import fs from "node:fs"; +import path from "node:path"; +import { chromium } from "playwright"; + +// NEW libs +import pixelWidth from "string-pixel-width"; +import * as readability from "text-readability"; +import stringSimilarity from "string-similarity"; + +/* ------------------------------ globals --------------------------------- */ +const visited = new Set(); +const queue = []; +const results = []; + +// Link provenance: every discovered edge (source -> target) +const edges = []; // { from, raw_href, to, discovered_by } + +// Quick referrer map for error report +const referrers = new Map(); // url -> Array<{from, raw_href, discovered_by}> + +const REAL_UA = + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"; +const REAL_HEADERS = { + "user-agent": REAL_UA, + "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", + "accept-language": "en-US,en;q=0.9", + "upgrade-insecure-requests": "1", +}; + +/* ------------------------------ utils ----------------------------------- */ +function csvEscape(v) { + if (v === undefined || v === null) return ""; + const s = String(v); + return /[",\n]/.test(s) ? `"${s.replace(/"/g, '""')}"` : s; +} +function ensureDir(dir) { + if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true }); +} +function writePageReports(results) { + ensureDir("reports"); + const stamp = new Date().toISOString().replace(/[:T]/g, "-").slice(0, 19); + const base = path.join("reports", `crawl-${stamp}`); + + fs.writeFileSync(`${base}.json`, JSON.stringify(results, null, 2), "utf8"); + console.log(`\n📝 Full JSON report saved: ${base}.json`); + + // Columns (a Screaming-Frog-ish shape with our extras) + const headers = [ + "url", "status", "status_text", "time_ms", "bytes", "content_type", "http_version", + "title", "title_length", "title_pixel_width", + "meta_description", "meta_description_length", "meta_description_pixel_width", + "h1_1", "h1_1_length", "h1_1_pixel_width", "h1_2", "h1_2_length", "h1_2_pixel_width", + "h2_1", "h2_2", + "canonical", "robots_meta", "x_robots_tag", "noindex", "nofollow", + "lang", "word_count", "flesch_reading_ease", "flesch_kincaid_grade", + "gunning_fog", "coleman_liau", "ari", "smog", + "schema_types", "inlinks", "outlinks", "render_mode", + "last_modified", "set_cookie", "crawl_timestamp", + "duplicate_title_exact", "nearest_title_similarity", "nearest_title_url", + "duplicate_description_exact", "nearest_description_similarity", "nearest_description_url" + ]; + const lines = [headers.join(",")]; + for (const r of results) { + lines.push([ + r.url, + r.status, + r.status_text ?? "", + r.time_ms, + r.bytes, + r.content_type, + r.http_version ?? "", + r.title, + r.title_length, + r.title_pixel_width, + r.meta_description, + r.meta_description_length, + r.meta_description_pixel_width, + r.h1_1 ?? "", + r.h1_1_length ?? 0, + r.h1_1_pixel_width ?? "", + r.h1_2 ?? "", + r.h1_2_length ?? 0, + r.h1_2_pixel_width ?? "", + r.h2_1 ?? "", + r.h2_2 ?? "", + r.canonical, + r.robots_meta, + r.x_robots_tag ?? "", + r.noindex, + r.nofollow, + r.lang ?? "", + r.word_count ?? "", + r.flesch_reading_ease ?? "", + r.flesch_kincaid_grade ?? "", + r.gunning_fog ?? "", + r.coleman_liau ?? "", + r.ari ?? "", + r.smog ?? "", + Array.isArray(r.schema_types) ? r.schema_types.join("|") : "", + r.inlinks ?? 0, + r.outlinks ?? 0, + r.render_mode, + r.last_modified ?? "", + r.set_cookie ? "yes" : "no", + r.crawl_timestamp ?? "", + r.duplicate_title_exact ?? "", + r.nearest_title_similarity ?? "", + r.nearest_title_url ?? "", + r.duplicate_description_exact ?? "", + r.nearest_description_similarity ?? "", + r.nearest_description_url ?? "" + ].map(csvEscape).join(",")); + } + //fs.writeFileSync(`${base}.csv`, lines.join("\n"), "utf8"); + //console.log(`\n📝 Page reports saved:\n - ${base}.csv\n - ${base}.json`); +} +function writeLinkEdges(edges) { + ensureDir("reports"); + const stamp = new Date().toISOString().replace(/[:T]/g, "-").slice(0, 19); + const file = path.join("reports", `links-${stamp}.csv`); + const headers = ["from", "raw_href", "to", "discovered_by"]; + const lines = [headers.join(",")]; + for (const e of edges) { + lines.push([e.from, e.raw_href, e.to, e.discovered_by].map(csvEscape).join(",")); + } + fs.writeFileSync(file, lines.join("\n"), "utf8"); + console.log(`🔗 Link provenance saved: ${file}`); +} +function writeErrors(results) { + ensureDir("reports"); + const stamp = new Date().toISOString().replace(/[:T]/g, "-").slice(0, 19); + const file = path.join("reports", `errors-${stamp}.csv`); + const headers = ["url", "status", "title", "from_page", "raw_href", "discovered_by"]; + const lines = [headers.join(",")]; + + for (const r of results) { + if (r && r.status !== null && r.status >= 400) { + const refs = referrers.get(r.url) || []; + if (refs.length === 0) { + lines.push([r.url, r.status, r.title, "", "", ""].map(csvEscape).join(",")); + } else { + for (const ref of refs) { + lines.push([r.url, r.status, r.title, ref.from, ref.raw_href, ref.discovered_by].map(csvEscape).join(",")); + } + } + } + } + fs.writeFileSync(file, lines.join("\n"), "utf8"); + console.log(`❗ Error report saved: ${file}`); +} +function addEdge(from, rawHref, to, discovered_by) { + edges.push({ from, raw_href: rawHref || "", to, discovered_by }); + if (!referrers.has(to)) referrers.set(to, []); + referrers.get(to).push({ from, raw_href: rawHref || "", discovered_by }); +} + +/* ---------------------- parse HTML without JS --------------------------- */ +function safeJsonParse(txt) { + try { return JSON.parse(txt); } catch { return null; } +} +function parseSchemaTypes($) { + const types = new Set(); + $('script[type="application/ld+json"]').each((_, el) => { + const raw = $(el).contents().text(); + const parsed = safeJsonParse(raw); + if (!parsed) return; + const collect = (obj) => { + if (!obj) return; + if (Array.isArray(obj)) { obj.forEach(collect); return; } + if (typeof obj === "object") { + const t = obj["@type"]; + if (typeof t === "string") types.add(t); + else if (Array.isArray(t)) t.forEach(x => typeof x === "string" && types.add(x)); + // nested + Object.values(obj).forEach(collect); + } + }; + collect(parsed); + }); + return [...types]; +} +function parseHtml(html, url) { + const $ = cheerio.load(html); + + let title = ($("title").first().text() || "").trim(); + const ogTitle = $('meta[property="og:title"]').attr("content") || ""; + const twTitle = $('meta[name="twitter:title"]').attr("content") || ""; + + // Headings (capture top two H1s and H2s) + const h1s = $("h1").map((_, el) => $(el).text().trim()).get(); + const h2s = $("h2").map((_, el) => $(el).text().trim()).get(); + + const h1_1 = h1s[0] || ""; + const h1_2 = h1s[1] || ""; + const h2_1 = h2s[0] || ""; + const h2_2 = h2s[1] || ""; + + const totalHeadings = $("h1,h2,h3,h4,h5,h6,[role='heading']").length; + + if (!title) title = (ogTitle || twTitle || h1_1 || "").trim(); + + const metaDesc = ($('meta[name="description"]').attr("content") || "").trim(); + const canonical = ($('link[rel="canonical"]').attr("href") || "").trim(); + const robotsMeta = ($('meta[name="robots"]').attr("content") || "").trim(); + const robotsLower = robotsMeta.toLowerCase(); + const noindex = /(^|[,;\s])noindex([,;\s]|$)/.test(robotsLower); + const nofollow = /(^|[,;\s])nofollow([,;\s]|$)/.test(robotsLower); + + const lang = ($("html").attr("lang") || "").trim(); + + // Basic text body for word count / readability + const bodyText = ($("main").text() || $("body").text() || "").replace(/\s+/g, " ").trim(); + const wordCount = bodyText ? bodyText.split(/\s+/).length : 0; + + // Internal links + raw href + const internalLinks = new Set(); + const rawLinks = []; + $("a[href]").each((_, el) => { + const href = $(el).attr("href"); + if (!href) return; + try { + const abs = new URL(href, url).toString(); + rawLinks.push({ raw: href, abs }); + internalLinks.add(abs); + } catch { } + }); + + // Schema.org JSON-LD types + const schemaTypes = parseSchemaTypes($); + + return { + title, + metaDesc, + h1_1, h1_2, h2_1, h2_2, + totalHeadings, + canonical, robotsMeta, noindex, nofollow, + internalLinks, rawLinks, + lang, + wordCount, + schemaTypes, + bodyText + }; +} + +/* ------------------------------ fetchers -------------------------------- */ +async function fetchWithGot(url) { + const t0 = Date.now(); + const res = await got(url, { + timeout: { request: 20000 }, + throwHttpErrors: false, + headers: REAL_HEADERS, + http2: false + }); + const dt = Date.now() - t0; + const contentType = (res.headers["content-type"] || "").toLowerCase(); + const bytes = res.headers["content-length"] + ? Number(res.headers["content-length"]) + : Buffer.byteLength(res.body || "", "utf8"); + + return { + status: res.statusCode ?? null, + status_text: res.statusMessage ?? "", + time_ms: dt, + contentType, + body: res.body, + bytes, + render_mode: "http", + httpVersion: res.httpVersion ?? "", + headers: res.headers + }; +} + +async function createBrowserContext() { + const browser = await chromium.launch({ headless: true, args: ["--disable-blink-features=AutomationControlled"] }); + const context = await browser.newContext({ + ignoreHTTPSErrors: true, // Ignore SSL certificate errors + userAgent: REAL_UA, + viewport: { width: 1366, height: 768 }, + deviceScaleFactor: 1, + isMobile: false, + locale: "en-US", + extraHTTPHeaders: REAL_HEADERS + }); + await context.addInitScript(() => { + Object.defineProperty(navigator, "webdriver", { get: () => false }); + Object.defineProperty(navigator, "plugins", { get: () => [1, 2, 3] }); + Object.defineProperty(navigator, "languages", { get: () => ["en-US", "en"] }); + }); + return { browser: context.browser(), context }; +} + +async function fetchWithPlaywrightAndExtract(url, shared) { + const page = await shared.context.newPage(); + const t0 = Date.now(); + let status = null, mainHeaders = {}, statusText = ""; + + try { + const resp = await page.goto(url, { waitUntil: "domcontentloaded", timeout: 30000 }); + status = resp?.status() ?? null; + statusText = resp?.statusText() ?? ""; + try { mainHeaders = resp ? await resp.headers() : {}; } catch { } + + try { await page.waitForLoadState("networkidle", { timeout: 12000 }); } catch { } + try { + await page.waitForFunction(() => { + const main = document.querySelector("main") || document.body; + const textLen = (main?.innerText || "").replace(/\s+/g, " ").trim().length; + const hasHeading = !!document.querySelector("h1, h2, [role='heading'], [class*='title'], [class*='heading'], [class*='hero'], [class*='banner']"); + return textLen > 160 || hasHeading; + }, { timeout: 8000 }); + } catch { } + + const dom = await page.evaluate(() => { + const clean = s => (s || "").replace(/\s+/g, " ").trim(); + const getTextList = sel => Array.from(document.querySelectorAll(sel)) + .map(el => clean(el.textContent)).filter(Boolean); + + const title = document.title || ""; + const ogTitle = document.querySelector('meta[property="og:title"]')?.content || ""; + const twTitle = document.querySelector('meta[name="twitter:title"]')?.content || ""; + const metaDesc = document.querySelector('meta[name="description"]')?.content || ""; + const canonical = document.querySelector('link[rel="canonical"]')?.href || ""; + const robotsMeta = document.querySelector('meta[name="robots"]')?.content || ""; + const lang = document.documentElement.getAttribute("lang") || ""; + + const h1 = getTextList("h1"); + const h2 = getTextList("h2"); + const h3 = getTextList("h3"); + const totalHeadings = document.querySelectorAll("h1,h2,h3,h4,h5,h6,[role='heading']").length; + + const links = Array.from(document.querySelectorAll("a[href]")) + .map(a => { + const raw = a.getAttribute("href"); + try { return { raw, abs: new URL(raw, location.href).toString() }; } + catch { return null; } + }) + .filter(Boolean); + + const firstHeading = h1[0] || h2[0] || ""; + const bodyText = clean((document.querySelector("main") || document.body).innerText || ""); + + const schemaScripts = Array.from(document.querySelectorAll('script[type="application/ld+json"]')).map(s => s.textContent || ""); + + return { + htmlLen: (document.documentElement.outerHTML || "").length, + title, ogTitle, twTitle, metaDesc, canonical, robotsMeta, lang, + h1, h2, totalHeadings, + links, + bodyText, + schemaScripts + }; + }); + + // Parse schema types from strings (outside of page) + const schemaTypes = []; + for (const raw of dom.schemaScripts || []) { + try { + const parsed = JSON.parse(raw); + const collect = (obj) => { + if (!obj) return; + if (Array.isArray(obj)) { obj.forEach(collect); return; } + if (typeof obj === "object") { + const t = obj["@type"]; + if (typeof t === "string") schemaTypes.push(t); + else if (Array.isArray(t)) t.forEach(x => typeof x === "string" && schemaTypes.push(x)); + Object.values(obj).forEach(collect); + } + }; + collect(parsed); + } catch { } + } + + const dt = Date.now() - t0; + const robotsLower = (dom.robotsMeta || "").toLowerCase(); + const noindex = /(^|[,;\s])noindex([,;\s]|$)/.test(robotsLower); + const nofollow = /(^|[,;\s])nofollow([,;\s]|$)/.test(robotsLower); + const finalTitle = (dom.title || dom.ogTitle || dom.twTitle || dom.h1?.[0] || "").trim(); + + return { + status, + status_text: statusText, + time_ms: dt, + contentType: "text/html", + bytes: dom.htmlLen || 0, + render_mode: "rendered", + headers: mainHeaders, + domExtract: { + title: finalTitle, + metaDesc: dom.metaDesc || "", + canonical: dom.canonical || "", + robotsMeta: dom.robotsMeta || "", + lang: dom.lang || "", + noindex, nofollow, + h1_1: dom.h1?.[0] || "", + h1_2: dom.h1?.[1] || "", + h2_1: dom.h2?.[0] || "", + h2_2: dom.h2?.[1] || "", + totalHeadings: dom.totalHeadings || 0, + links: new Set((dom.links || []).map(l => l.abs)), + rawLinks: dom.links || [], + bodyText: dom.bodyText || "", + schemaTypes: Array.from(new Set(schemaTypes)) + } + }; + } finally { + await page.close(); + } +} + +/* ------------------------- render decision ------------------------------ */ +function shouldRender(currentUrl, httpRes, parsed, homeTitle) { + const { pathname } = new URL(currentUrl); + if ((httpRes.bytes ?? 0) < 4000) return true; // tiny HTML shell + if (parsed.totalHeadings === 0) return true; + if (homeTitle && parsed.title && parsed.title === homeTitle && pathname !== "/") return true; + return false; +} +function withWWW(urlStr) { + try { const u = new URL(urlStr); if (!u.hostname.startsWith("www.")) u.hostname = "www." + u.hostname; return u.toString(); } + catch { return urlStr; } +} + +/* ------------------------ per-page enrichers ---------------------------- */ +function measurePixelWidth(text, size = 16, font = "arial") { + if (!text) return 0; + try { return pixelWidth(text, { font, size }); } catch { return Math.round(text.length * size * 0.5); } +} +function computeReadability(text) { + if (!text) return {}; + const safe = text.slice(0, 200000); // cap + const out = {}; + try { out.flesch_reading_ease = readability.fleschReadingEase(safe); } catch { } + try { out.flesch_kincaid_grade = readability.fleschKincaidGrade(safe); } catch { } + try { out.gunning_fog = readability.gunningFog(safe); } catch { } + try { out.coleman_liau = readability.colemanLiauIndex(safe); } catch { } + try { out.ari = readability.automatedReadabilityIndex(safe); } catch { } + try { out.smog = readability.smogIndex(safe); } catch { } + return out; +} + +/* -------------------------------- main ---------------------------------- */ +// async function crawl(startUrl, maxPages = 50) { + +export async function crawl(startUrl, maxPages = 50) { + const start = normalizeUrl(startUrl, { stripHash: true }); + queue.push(start); + + // Seed from sitemap.xml + record provenance + try { + const sitemapUrls = await getSitemapUrls(start); + for (const u of sitemapUrls) { + queue.push(u); + addEdge("sitemap.xml", u, u, "sitemap"); + } + console.log(`📌 Seeded ${sitemapUrls.length} URL(s) from sitemap.xml`); + } catch (e) { + console.log("⚠️ Sitemap step skipped:", e.message); + } + + let shared = null; + async function getShared() { if (!shared) shared = await createBrowserContext(); return shared; } + + let homeTitle = null; + + while (queue.length > 0 && visited.size < maxPages) { + const url = queue.shift(); + if (!url) continue; + + const normUrl = normalizeUrl(url, { stripHash: true }); + if (visited.has(normUrl)) continue; + visited.add(normUrl); + + let attemptUrls = [normUrl]; + let usedWWWRetry = false; + + for (let attempt = 0; attempt < attemptUrls.length; attempt++) { + const currentUrl = attemptUrls[attempt]; + try { + // 1) HTTP fetch + let pageRes = await fetchWithGot(currentUrl); + + let parsed = { + title: "", metaDesc: "", h1_1: "", h1_2: "", h2_1: "", h2_2: "", + totalHeadings: 0, canonical: "", robotsMeta: "", noindex: false, nofollow: false, + internalLinks: new Set(), rawLinks: [], + lang: "", wordCount: 0, bodyText: "", schemaTypes: [] + }; + if (pageRes.contentType.includes("text/html")) { + const p = parseHtml(pageRes.body || "", currentUrl); + parsed = { ...parsed, ...p }; + } + + if (!homeTitle && new URL(currentUrl).pathname === "/") { + homeTitle = parsed.title || ""; + } + + // 2) Render if needed + if (pageRes.contentType.includes("text/html") && shouldRender(currentUrl, pageRes, parsed, homeTitle)) { + const s = await getShared(); + const rendered = await fetchWithPlaywrightAndExtract(currentUrl, s); + if (rendered.domExtract) { + pageRes = { ...rendered, body: null }; + parsed = { + ...parsed, + title: rendered.domExtract.title, + metaDesc: rendered.domExtract.metaDesc, + h1_1: rendered.domExtract.h1_1, + h1_2: rendered.domExtract.h1_2, + h2_1: rendered.domExtract.h2_1, + h2_2: rendered.domExtract.h2_2, + totalHeadings: rendered.domExtract.totalHeadings, + canonical: rendered.domExtract.canonical, + robotsMeta: rendered.domExtract.robotsMeta, + noindex: rendered.domExtract.noindex, + nofollow: rendered.domExtract.nofollow, + internalLinks: rendered.domExtract.links, + rawLinks: rendered.domExtract.rawLinks, + lang: rendered.domExtract.lang || parsed.lang, + bodyText: rendered.domExtract.bodyText || parsed.bodyText, + wordCount: (rendered.domExtract.bodyText || "").split(/\s+/).filter(Boolean).length, + schemaTypes: rendered.domExtract.schemaTypes + }; + } + } + + // If still looks empty, try www once + if (!usedWWWRetry && parsed.totalHeadings === 0 && !parsed.h1_1) { + attemptUrls.push(withWWW(currentUrl)); + usedWWWRetry = true; + continue; + } + + // Enqueue internal links + record provenance + for (const link of parsed.internalLinks) { + if (isInternal(start, link)) { + const ln = normalizeUrl(link, { stripHash: true }); + const rawMatch = (parsed.rawLinks || []).find(r => r.abs === link)?.raw ?? ""; + addEdge(currentUrl, rawMatch, ln, pageRes.render_mode); + if (!visited.has(ln)) queue.push(ln); + } + } + + // ---- Per-page metrics & enrichers ---- + const title = parsed.title || ""; + const metaDesc = parsed.metaDesc || ""; + const h1_1 = parsed.h1_1 || ""; + const h1_2 = parsed.h1_2 || ""; + const lang = parsed.lang || ""; + const bodyText = parsed.bodyText || ""; + const wordCount = parsed.wordCount || (bodyText ? bodyText.split(/\s+/).filter(Boolean).length : 0); + + const titlePx = measurePixelWidth(title, 16, "arial"); + const descPx = measurePixelWidth(metaDesc, 14, "arial"); + const h1_1_px = measurePixelWidth(h1_1, 24, "arial"); + const h1_2_px = measurePixelWidth(h1_2, 24, "arial"); + + const read = computeReadability(bodyText); + + const headers = pageRes.headers || {}; + const xRobots = (headers["x-robots-tag"] || headers["x-robots-tag".toLowerCase()]) ?? ""; + const lastModified = headers["last-modified"] ?? headers["Last-Modified"] ?? ""; + const setCookie = !!headers["set-cookie"]; + + const outlinks = parsed.internalLinks.size; + const inlinks = (referrers.get(currentUrl) || []).length; + + // Save page row + results.push({ + url: currentUrl, + status: pageRes.status, + status_text: pageRes.status_text ?? "", + time_ms: pageRes.time_ms, + bytes: pageRes.bytes, + content_type: pageRes.contentType, + http_version: pageRes.httpVersion ?? "", + title, + title_length: title.length, + title_pixel_width: titlePx, + meta_description: metaDesc, + meta_description_length: metaDesc.length, + meta_description_pixel_width: descPx, + h1_1, + h1_1_length: h1_1.length, + h1_1_pixel_width: h1_1_px, + h1_2, + h1_2_length: h1_2.length, + h1_2_pixel_width: h1_2_px, + h2_1: parsed.h2_1 || "", + h2_2: parsed.h2_2 || "", + canonical: parsed.canonical, + robots_meta: parsed.robotsMeta, + x_robots_tag: Array.isArray(xRobots) ? xRobots.join("; ") : xRobots, + noindex: parsed.noindex, + nofollow: parsed.nofollow, + lang, + word_count: wordCount, + flesch_reading_ease: read.flesch_reading_ease ?? "", + flesch_kincaid_grade: read.flesch_kincaid_grade ?? "", + gunning_fog: read.gunning_fog ?? "", + coleman_liau: read.coleman_liau ?? "", + ari: read.ari ?? "", + smog: read.smog ?? "", + schema_types: parsed.schemaTypes || [], + inlinks, + outlinks, + render_mode: pageRes.render_mode, + last_modified: lastModified, + set_cookie: setCookie, + crawl_timestamp: new Date().toISOString() + }); + + console.log( + `[${pageRes.status ?? "ERR"}] ${pageRes.time_ms}ms ${String(pageRes.render_mode).padEnd(8)} H:${parsed.totalHeadings} ${currentUrl} ${title || h1_1}` + ); + break; // success for this URL; stop attempts + } catch (err) { + console.error(`[ERROR] ${currentUrl} -> ${err.message}`); + results.push({ + url: currentUrl, + status: null, status_text: "", time_ms: null, bytes: null, content_type: "", + http_version: "", title: "", title_length: 0, title_pixel_width: "", + meta_description: "", meta_description_length: 0, meta_description_pixel_width: "", + h1_1: "", h1_1_length: 0, h1_1_pixel_width: "", h1_2: "", h1_2_length: 0, h1_2_pixel_width: "", + h2_1: "", h2_2: "", + canonical: "", robots_meta: "", x_robots_tag: "", noindex: false, nofollow: false, + lang: "", word_count: "", flesch_reading_ease: "", flesch_kincaid_grade: "", + gunning_fog: "", coleman_liau: "", ari: "", smog: "", + schema_types: [], inlinks: 0, outlinks: 0, render_mode: "error", + last_modified: "", set_cookie: "", crawl_timestamp: new Date().toISOString() + }); + } + } + } + + if (shared) await shared.browser.close(); + + // -------------------- Post-process: duplicates & similarity ------------- + // Titles + const titleMap = new Map(); + for (const r of results) { + const key = (r.title || "").trim(); + if (!titleMap.has(key)) titleMap.set(key, []); + titleMap.get(key).push(r); + } + for (const [t, arr] of titleMap.entries()) { + if (!t) continue; + const isDup = arr.length > 1; + for (const row of arr) row.duplicate_title_exact = isDup ? "yes" : "no"; + } + + // Meta descriptions + const descMap = new Map(); + for (const r of results) { + const key = (r.meta_description || "").trim(); + if (!descMap.has(key)) descMap.set(key, []); + descMap.get(key).push(r); + } + for (const [d, arr] of descMap.entries()) { + if (!d) continue; + const isDup = arr.length > 1; + for (const row of arr) row.duplicate_description_exact = isDup ? "yes" : "no"; + } + + // Nearest neighbor similarities (within site, lightweight) + const titleList = results.map(r => ({ url: r.url, text: (r.title || "").trim() })); + const descList = results.map(r => ({ url: r.url, text: (r.meta_description || "").trim() })); + for (const r of results) { + // titles + const others = titleList.filter(x => x.url !== r.url && x.text); + let bestT = { rating: 0, target: "" }; + if (r.title && others.length) { + const ratings = stringSimilarity.findBestMatch(r.title, others.map(x => x.text)); + const best = ratings.bestMatch; + bestT.rating = best.rating; + const idx = ratings.ratings.findIndex(x => x.rating === best.rating); + bestT.target = others[idx]?.url || ""; + } + r.nearest_title_similarity = bestT.rating ? bestT.rating.toFixed(3) : ""; + r.nearest_title_url = bestT.target; + + // descriptions + const othersD = descList.filter(x => x.url !== r.url && x.text); + let bestD = { rating: 0, target: "" }; + if (r.meta_description && othersD.length) { + const ratingsD = stringSimilarity.findBestMatch(r.meta_description, othersD.map(x => x.text)); + const best = ratingsD.bestMatch; + bestD.rating = best.rating; + const idx = ratingsD.ratings.findIndex(x => x.rating === best.rating); + bestD.target = othersD[idx]?.url || ""; + } + r.nearest_description_similarity = bestD.rating ? bestD.rating.toFixed(3) : ""; + r.nearest_description_url = bestD.target; + } + + console.log(`\n✅ Crawl finished. Total pages: ${visited.size}`); + writePageReports(results); + writeLinkEdges(edges); + writeErrors(results); +} + +// // CLI: node crawler.js https://site.com 200 +// const START_URL = process.argv[2] || "https://example.com"; +// const MAX_PAGES = Number(process.argv[3] || 100); +// crawl(START_URL, MAX_PAGES); diff --git a/crawler.js b/crawler.js new file mode 100644 index 0000000..aa93be8 --- /dev/null +++ b/crawler.js @@ -0,0 +1,921 @@ +// crawler.js +import got from "got"; +import * as cheerio from "cheerio"; +import normalizeUrl from "normalize-url"; +import { isInternal } from "./utils/urlHelpers.js"; +import { getSitemapUrls } from "./utils/sitemap.js"; +import fs from "node:fs"; +import path from "node:path"; +import { chromium } from "playwright"; + +// NEW libs +import pixelWidth from "string-pixel-width"; +import * as readability from "text-readability"; +import stringSimilarity from "string-similarity"; + +/* ------------------------------ globals --------------------------------- */ +// NOTE: We'll reset these at the start of crawl() so repeated runs don't share state. +const visited = new Set(); +const queue = []; +const results = []; + +// Link provenance: every discovered edge (source -> target) +const edges = []; // { from, raw_href, to, discovered_by } + +// Quick referrer map for error report +const referrers = new Map(); // url -> Array<{from, raw_href, discovered_by}> + +const REAL_UA = + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"; +const REAL_HEADERS = { + "user-agent": REAL_UA, + accept: + "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", + "accept-language": "en-US,en;q=0.9", + "upgrade-insecure-requests": "1", +}; + +/* ------------------------------ utils ----------------------------------- */ +function csvEscape(v) { + if (v === undefined || v === null) return ""; + const s = String(v); + return /[",\n]/.test(s) ? `"${s.replace(/"/g, '""')}"` : s; +} +function ensureDir(dir) { + if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true }); +} +function writePageReports(rows) { + ensureDir("reports"); + const stamp = new Date().toISOString().replace(/[:T]/g, "-").slice(0, 19); + const base = path.join("reports", `crawl-${stamp}`); + + fs.writeFileSync(`${base}.json`, JSON.stringify(rows, null, 2), "utf8"); + console.log(`\n📝 Full JSON report saved: ${base}.json`); + + // Columns (a Screaming-Frog-ish shape with our extras) + const headers = [ + "url", + "status", + "status_text", + "time_ms", + "bytes", + "content_type", + "http_version", + "title", + "title_length", + "title_pixel_width", + "meta_description", + "meta_description_length", + "meta_description_pixel_width", + "h1_1", + "h1_1_length", + "h1_1_pixel_width", + "h1_2", + "h1_2_length", + "h1_2_pixel_width", + "h2_1", + "h2_2", + "canonical", + "robots_meta", + "x_robots_tag", + "noindex", + "nofollow", + "lang", + "word_count", + "flesch_reading_ease", + "flesch_kincaid_grade", + "gunning_fog", + "coleman_liau", + "ari", + "smog", + "schema_types", + "inlinks", + "outlinks", + "render_mode", + "last_modified", + "set_cookie", + "crawl_timestamp", + "duplicate_title_exact", + "nearest_title_similarity", + "nearest_title_url", + "duplicate_description_exact", + "nearest_description_similarity", + "nearest_description_url", + ]; + const lines = [headers.join(",")]; + for (const r of rows) { + lines.push( + [ + r.url, + r.status, + r.status_text ?? "", + r.time_ms, + r.bytes, + r.content_type, + r.http_version ?? "", + r.title, + r.title_length, + r.title_pixel_width, + r.meta_description, + r.meta_description_length, + r.meta_description_pixel_width, + r.h1_1 ?? "", + r.h1_1_length ?? 0, + r.h1_1_pixel_width ?? "", + r.h1_2 ?? "", + r.h1_2_length ?? 0, + r.h1_2_pixel_width ?? "", + r.h2_1 ?? "", + r.h2_2 ?? "", + r.canonical, + r.robots_meta, + r.x_robots_tag ?? "", + r.noindex, + r.nofollow, + r.lang ?? "", + r.word_count ?? "", + r.flesch_reading_ease ?? "", + r.flesch_kincaid_grade ?? "", + r.gunning_fog ?? "", + r.coleman_liau ?? "", + r.ari ?? "", + r.smog ?? "", + Array.isArray(r.schema_types) ? r.schema_types.join("|") : "", + r.inlinks ?? 0, + r.outlinks ?? 0, + r.render_mode, + r.last_modified ?? "", + r.set_cookie ? "yes" : "no", + r.crawl_timestamp ?? "", + r.duplicate_title_exact ?? "", + r.nearest_title_similarity ?? "", + r.nearest_title_url ?? "", + r.duplicate_description_exact ?? "", + r.nearest_description_similarity ?? "", + r.nearest_description_url ?? "", + ] + .map(csvEscape) + .join(",") + ); + } + // If you also want CSV persisted, uncomment: + // fs.writeFileSync(`${base}.csv`, lines.join("\n"), "utf8"); + // console.log(`📝 CSV report saved: ${base}.csv`); + + return { json: path.resolve(`${base}.json`) /*, csv: path.resolve(`${base}.csv`)*/ }; +} +function writeLinkEdges(edges) { + ensureDir("reports"); + const stamp = new Date().toISOString().replace(/[:T]/g, "-").slice(0, 19); + const file = path.join("reports", `links-${stamp}.csv`); + const headers = ["from", "raw_href", "to", "discovered_by"]; + const lines = [headers.join(",")]; + for (const e of edges) { + lines.push([e.from, e.raw_href, e.to, e.discovered_by].map(csvEscape).join(",")); + } + fs.writeFileSync(file, lines.join("\n"), "utf8"); + console.log(`🔗 Link provenance saved: ${file}`); + return { linksCsv: path.resolve(file) }; +} +function writeErrors(rows) { + ensureDir("reports"); + const stamp = new Date().toISOString().replace(/[:T]/g, "-").slice(0, 19); + const file = path.join("reports", `errors-${stamp}.csv`); + const headers = ["url", "status", "title", "from_page", "raw_href", "discovered_by"]; + const lines = [headers.join(",")]; + + for (const r of rows) { + if (r && r.status !== null && r.status >= 400) { + const refs = referrers.get(r.url) || []; + if (refs.length === 0) { + lines.push([r.url, r.status, r.title, "", "", ""].map(csvEscape).join(",")); + } else { + for (const ref of refs) { + lines.push([r.url, r.status, r.title, ref.from, ref.raw_href, ref.discovered_by].map(csvEscape).join(",")); + } + } + } + } + fs.writeFileSync(file, lines.join("\n"), "utf8"); + console.log(`❗ Error report saved: ${file}`); + return { errorsCsv: path.resolve(file) }; +} +function addEdge(from, rawHref, to, discovered_by) { + edges.push({ from, raw_href: rawHref || "", to, discovered_by }); + if (!referrers.has(to)) referrers.set(to, []); + referrers.get(to).push({ from, raw_href: rawHref || "", discovered_by }); +} + +/* ---------------------- parse HTML without JS --------------------------- */ +function safeJsonParse(txt) { + try { + return JSON.parse(txt); + } catch { + return null; + } +} +function parseSchemaTypes($) { + const types = new Set(); + $('script[type="application/ld+json"]').each((_, el) => { + const raw = $(el).contents().text(); + const parsed = safeJsonParse(raw); + if (!parsed) return; + const collect = (obj) => { + if (!obj) return; + if (Array.isArray(obj)) { + obj.forEach(collect); + return; + } + if (typeof obj === "object") { + const t = obj["@type"]; + if (typeof t === "string") types.add(t); + else if (Array.isArray(t)) t.forEach((x) => typeof x === "string" && types.add(x)); + // nested + Object.values(obj).forEach(collect); + } + }; + collect(parsed); + }); + return [...types]; +} +function parseHtml(html, url) { + const $ = cheerio.load(html); + + let title = ($("title").first().text() || "").trim(); + const ogTitle = $('meta[property="og:title"]').attr("content") || ""; + const twTitle = $('meta[name="twitter:title"]').attr("content") || ""; + + // Headings (capture top two H1s and H2s) + const h1s = $("h1") + .map((_, el) => $(el).text().trim()) + .get(); + const h2s = $("h2") + .map((_, el) => $(el).text().trim()) + .get(); + + const h1_1 = h1s[0] || ""; + const h1_2 = h1s[1] || ""; + const h2_1 = h2s[0] || ""; + const h2_2 = h2s[1] || ""; + + const totalHeadings = $("h1,h2,h3,h4,h5,h6,[role='heading']").length; + + if (!title) title = (ogTitle || twTitle || h1_1 || "").trim(); + + const metaDesc = ($('meta[name="description"]').attr("content") || "").trim(); + const canonical = ($('link[rel="canonical"]').attr("href") || "").trim(); + const robotsMeta = ($('meta[name="robots"]').attr("content") || "").trim(); + const robotsLower = robotsMeta.toLowerCase(); + const noindex = /(^|[,;\s])noindex([,;\s]|$)/.test(robotsLower); + const nofollow = /(^|[,;\s])nofollow([,;\s]|$)/.test(robotsLower); + + const lang = ($("html").attr("lang") || "").trim(); + + // Basic text body for word count / readability + const bodyText = ($("main").text() || $("body").text() || "").replace(/\s+/g, " ").trim(); + const wordCount = bodyText ? bodyText.split(/\s+/).length : 0; + + // Internal links + raw href + const internalLinks = new Set(); + const rawLinks = []; + $("a[href]").each((_, el) => { + const href = $(el).attr("href"); + if (!href) return; + try { + const abs = new URL(href, url).toString(); + rawLinks.push({ raw: href, abs }); + internalLinks.add(abs); + } catch {} + }); + + // Schema.org JSON-LD types + const schemaTypes = parseSchemaTypes($); + + return { + title, + metaDesc, + h1_1, + h1_2, + h2_1, + h2_2, + totalHeadings, + canonical, + robotsMeta, + noindex, + nofollow, + internalLinks, + rawLinks, + lang, + wordCount, + schemaTypes, + bodyText, + }; +} + +/* ------------------------------ fetchers -------------------------------- */ +async function fetchWithGot(url) { + const t0 = Date.now(); + const res = await got(url, { + timeout: { request: 20000 }, + throwHttpErrors: false, + headers: REAL_HEADERS, + http2: false, + }); + const dt = Date.now() - t0; + const contentType = (res.headers["content-type"] || "").toLowerCase(); + const bytes = res.headers["content-length"] + ? Number(res.headers["content-length"]) + : Buffer.byteLength(res.body || "", "utf8"); + + return { + status: res.statusCode ?? null, + status_text: res.statusMessage ?? "", + time_ms: dt, + contentType, + body: res.body, + bytes, + render_mode: "http", + httpVersion: res.httpVersion ?? "", + headers: res.headers, + }; +} + +async function createBrowserContext() { + const browser = await chromium.launch({ + headless: true, + args: ["--disable-blink-features=AutomationControlled"], + }); + const context = await browser.newContext({ + ignoreHTTPSErrors: true, // Ignore SSL certificate errors + userAgent: REAL_UA, + viewport: { width: 1366, height: 768 }, + deviceScaleFactor: 1, + isMobile: false, + locale: "en-US", + extraHTTPHeaders: REAL_HEADERS, + }); + await context.addInitScript(() => { + Object.defineProperty(navigator, "webdriver", { get: () => false }); + Object.defineProperty(navigator, "plugins", { get: () => [1, 2, 3] }); + Object.defineProperty(navigator, "languages", { get: () => ["en-US", "en"] }); + }); + return { browser: context.browser(), context }; +} + +async function fetchWithPlaywrightAndExtract(url, shared) { + const page = await shared.context.newPage(); + const t0 = Date.now(); + let status = null, + mainHeaders = {}, + statusText = ""; + + try { + const resp = await page.goto(url, { waitUntil: "domcontentloaded", timeout: 30000 }); + status = resp?.status() ?? null; + statusText = resp?.statusText() ?? ""; + try { + mainHeaders = resp ? await resp.headers() : {}; + } catch {} + + try { + await page.waitForLoadState("networkidle", { timeout: 12000 }); + } catch {} + try { + await page.waitForFunction( + () => { + const main = document.querySelector("main") || document.body; + const textLen = (main?.innerText || "").replace(/\s+/g, " ").trim().length; + const hasHeading = !!document.querySelector( + "h1, h2, [role='heading'], [class*='title'], [class*='heading'], [class*='hero'], [class*='banner']" + ); + return textLen > 160 || hasHeading; + }, + { timeout: 8000 } + ); + } catch {} + + const dom = await page.evaluate(() => { + const clean = (s) => (s || "").replace(/\s+/g, " ").trim(); + const getTextList = (sel) => + Array.from(document.querySelectorAll(sel)) + .map((el) => clean(el.textContent)) + .filter(Boolean); + + const title = document.title || ""; + const ogTitle = document.querySelector('meta[property="og:title"]')?.content || ""; + const twTitle = document.querySelector('meta[name="twitter:title"]')?.content || ""; + const metaDesc = document.querySelector('meta[name="description"]')?.content || ""; + const canonical = document.querySelector('link[rel="canonical"]')?.href || ""; + const robotsMeta = document.querySelector('meta[name="robots"]')?.content || ""; + const lang = document.documentElement.getAttribute("lang") || ""; + + const h1 = getTextList("h1"); + const h2 = getTextList("h2"); + const totalHeadings = document.querySelectorAll("h1,h2,h3,h4,h5,h6,[role='heading']").length; + + const links = Array.from(document.querySelectorAll("a[href]")) + .map((a) => { + const raw = a.getAttribute("href"); + try { + return { raw, abs: new URL(raw, location.href).toString() }; + } catch { + return null; + } + }) + .filter(Boolean); + + const bodyText = clean((document.querySelector("main") || document.body).innerText || ""); + + const schemaScripts = Array.from( + document.querySelectorAll('script[type="application/ld+json"]') + ).map((s) => s.textContent || ""); + + return { + htmlLen: (document.documentElement.outerHTML || "").length, + title, + ogTitle, + twTitle, + metaDesc, + canonical, + robotsMeta, + lang, + h1, + h2, + totalHeadings, + links, + bodyText, + schemaScripts, + }; + }); + + // Parse schema types from strings (outside of page) + const schemaTypes = []; + for (const raw of dom.schemaScripts || []) { + try { + const parsed = JSON.parse(raw); + const collect = (obj) => { + if (!obj) return; + if (Array.isArray(obj)) { + obj.forEach(collect); + return; + } + if (typeof obj === "object") { + const t = obj["@type"]; + if (typeof t === "string") schemaTypes.push(t); + else if (Array.isArray(t)) t.forEach((x) => typeof x === "string" && schemaTypes.push(x)); + Object.values(obj).forEach(collect); + } + }; + collect(parsed); + } catch {} + } + + const dt = Date.now() - t0; + const robotsLower = (dom.robotsMeta || "").toLowerCase(); + const noindex = /(^|[,;\s])noindex([,;\s]|$)/.test(robotsLower); + const nofollow = /(^|[,;\s])nofollow([,;\s]|$)/.test(robotsLower); + const finalTitle = (dom.title || dom.ogTitle || dom.twTitle || dom.h1?.[0] || "").trim(); + + return { + status, + status_text: statusText, + time_ms: dt, + contentType: "text/html", + bytes: dom.htmlLen || 0, + render_mode: "rendered", + headers: mainHeaders, + domExtract: { + title: finalTitle, + metaDesc: dom.metaDesc || "", + canonical: dom.canonical || "", + robotsMeta: dom.robotsMeta || "", + lang: dom.lang || "", + noindex, + nofollow, + h1_1: dom.h1?.[0] || "", + h1_2: dom.h1?.[1] || "", + h2_1: dom.h2?.[0] || "", + h2_2: dom.h2?.[1] || "", + totalHeadings: dom.totalHeadings || 0, + links: new Set((dom.links || []).map((l) => l.abs)), + rawLinks: dom.links || [], + bodyText: dom.bodyText || "", + schemaTypes: Array.from(new Set(schemaTypes)), + }, + }; + } finally { + await page.close(); + } +} + +/* ------------------------- render decision ------------------------------ */ +function shouldRender(currentUrl, httpRes, parsed, homeTitle) { + const { pathname } = new URL(currentUrl); + if ((httpRes.bytes ?? 0) < 4000) return true; // tiny HTML shell + if (parsed.totalHeadings === 0) return true; + if (homeTitle && parsed.title && parsed.title === homeTitle && pathname !== "/") return true; + return false; +} +function withWWW(urlStr) { + try { + const u = new URL(urlStr); + if (!u.hostname.startsWith("www.")) u.hostname = "www." + u.hostname; + return u.toString(); + } catch { + return urlStr; + } +} + +/* ------------------------ per-page enrichers ---------------------------- */ +function measurePixelWidth(text, size = 16, font = "arial") { + if (!text) return 0; + try { + return pixelWidth(text, { font, size }); + } catch { + return Math.round(text.length * size * 0.5); + } +} +function computeReadability(text) { + if (!text) return {}; + const safe = text.slice(0, 200000); // cap + const out = {}; + try { + out.flesch_reading_ease = readability.fleschReadingEase(safe); + } catch {} + try { + out.flesch_kincaid_grade = readability.fleschKincaidGrade(safe); + } catch {} + try { + out.gunning_fog = readability.gunningFog(safe); + } catch {} + try { + out.coleman_liau = readability.colemanLiauIndex(safe); + } catch {} + try { + out.ari = readability.automatedReadabilityIndex(safe); + } catch {} + try { + out.smog = readability.smogIndex(safe); + } catch {} + return out; +} + +/* -------------------------------- main ---------------------------------- */ +/** + * Crawl a site and return a structured report. + * @param {string} startUrl + * @param {number} maxPages + * @param {(tick:any)=>void} [onProgress] optional callback for progress events + * @param {{persistReports?: boolean, collectPages?: boolean}} [options] + * @returns {{ results: any[], files: Record, total: number }} + */ +export async function crawl(startUrl, maxPages = 50, onProgress, options = {}) { + const persistReports = options.persistReports !== false; // default true + + // Reset global state per run + visited.clear(); + queue.length = 0; + results.length = 0; + edges.length = 0; + referrers.clear(); + + const start = normalizeUrl(startUrl, { stripHash: true }); + queue.push(start); + + // Seed from sitemap.xml + record provenance + try { + const sitemapUrls = await getSitemapUrls(start); + for (const u of sitemapUrls) { + queue.push(u); + addEdge("sitemap.xml", u, u, "sitemap"); + } + console.log(`📌 Seeded ${sitemapUrls.length} URL(s) from sitemap.xml`); + } catch (e) { + console.log("⚠️ Sitemap step skipped:", e.message); + } + + let shared = null; + async function getShared() { + if (!shared) shared = await createBrowserContext(); + return shared; + } + + let homeTitle = null; + + while (queue.length > 0 && visited.size < maxPages) { + const url = queue.shift(); + if (!url) continue; + + const normUrl = normalizeUrl(url, { stripHash: true }); + if (visited.has(normUrl)) continue; + visited.add(normUrl); + + const attemptUrls = [normUrl]; + let usedWWWRetry = false; + + for (let attempt = 0; attempt < attemptUrls.length; attempt++) { + const currentUrl = attemptUrls[attempt]; + try { + // 1) HTTP fetch + let pageRes = await fetchWithGot(currentUrl); + + let parsed = { + title: "", + metaDesc: "", + h1_1: "", + h1_2: "", + h2_1: "", + h2_2: "", + totalHeadings: 0, + canonical: "", + robotsMeta: "", + noindex: false, + nofollow: false, + internalLinks: new Set(), + rawLinks: [], + lang: "", + wordCount: 0, + bodyText: "", + schemaTypes: [], + }; + if (pageRes.contentType.includes("text/html")) { + const p = parseHtml(pageRes.body || "", currentUrl); + parsed = { ...parsed, ...p }; + } + + if (!homeTitle && new URL(currentUrl).pathname === "/") { + homeTitle = parsed.title || ""; + } + + // 2) Render if needed + if (pageRes.contentType.includes("text/html") && shouldRender(currentUrl, pageRes, parsed, homeTitle)) { + const s = await getShared(); + const rendered = await fetchWithPlaywrightAndExtract(currentUrl, s); + if (rendered.domExtract) { + pageRes = { ...rendered, body: null }; + parsed = { + ...parsed, + title: rendered.domExtract.title, + metaDesc: rendered.domExtract.metaDesc, + h1_1: rendered.domExtract.h1_1, + h1_2: rendered.domExtract.h1_2, + h2_1: rendered.domExtract.h2_1, + h2_2: rendered.domExtract.h2_2, + totalHeadings: rendered.domExtract.totalHeadings, + canonical: rendered.domExtract.canonical, + robotsMeta: rendered.domExtract.robotsMeta, + noindex: rendered.domExtract.noindex, + nofollow: rendered.domExtract.nofollow, + internalLinks: rendered.domExtract.links, + rawLinks: rendered.domExtract.rawLinks, + lang: rendered.domExtract.lang || parsed.lang, + bodyText: rendered.domExtract.bodyText || parsed.bodyText, + wordCount: (rendered.domExtract.bodyText || "") + .split(/\s+/) + .filter(Boolean).length, + schemaTypes: rendered.domExtract.schemaTypes, + }; + } + } + + // If still looks empty, try www once + if (!usedWWWRetry && parsed.totalHeadings === 0 && !parsed.h1_1) { + attemptUrls.push(withWWW(currentUrl)); + usedWWWRetry = true; + continue; + } + + // Enqueue internal links + record provenance + for (const link of parsed.internalLinks) { + if (isInternal(start, link)) { + const ln = normalizeUrl(link, { stripHash: true }); + const rawMatch = (parsed.rawLinks || []).find((r) => r.abs === link)?.raw ?? ""; + addEdge(currentUrl, rawMatch, ln, pageRes.render_mode); + if (!visited.has(ln)) queue.push(ln); + } + } + + // ---- Per-page metrics & enrichers ---- + const title = parsed.title || ""; + const metaDesc = parsed.metaDesc || ""; + const h1_1 = parsed.h1_1 || ""; + const h1_2 = parsed.h1_2 || ""; + const lang = parsed.lang || ""; + const bodyText = parsed.bodyText || ""; + const wordCount = parsed.wordCount || (bodyText ? bodyText.split(/\s+/).filter(Boolean).length : 0); + + const titlePx = measurePixelWidth(title, 16, "arial"); + const descPx = measurePixelWidth(metaDesc, 14, "arial"); + const h1_1_px = measurePixelWidth(h1_1, 24, "arial"); + const h1_2_px = measurePixelWidth(h1_2, 24, "arial"); + + const read = computeReadability(bodyText); + + const headers = pageRes.headers || {}; + const xRobots = (headers["x-robots-tag"] || headers["x-robots-tag".toLowerCase()]) ?? ""; + const lastModified = headers["last-modified"] ?? headers["Last-Modified"] ?? ""; + const setCookie = !!headers["set-cookie"]; + + const outlinks = parsed.internalLinks.size; + const inlinks = (referrers.get(currentUrl) || []).length; + + // Save page row + results.push({ + url: currentUrl, + status: pageRes.status, + status_text: pageRes.status_text ?? "", + time_ms: pageRes.time_ms, + bytes: pageRes.bytes, + content_type: pageRes.contentType, + http_version: pageRes.httpVersion ?? "", + title, + title_length: title.length, + title_pixel_width: titlePx, + meta_description: metaDesc, + meta_description_length: metaDesc.length, + meta_description_pixel_width: descPx, + h1_1, + h1_1_length: h1_1.length, + h1_1_pixel_width: h1_1_px, + h1_2, + h1_2_length: h1_2.length, + h1_2_pixel_width: h1_2_px, + h2_1: parsed.h2_1 || "", + h2_2: parsed.h2_2 || "", + canonical: parsed.canonical, + robots_meta: parsed.robotsMeta, + x_robots_tag: Array.isArray(xRobots) ? xRobots.join("; ") : xRobots, + noindex: parsed.noindex, + nofollow: parsed.nofollow, + lang, + word_count: wordCount, + flesch_reading_ease: read.flesch_reading_ease ?? "", + flesch_kincaid_grade: read.flesch_kincaid_grade ?? "", + gunning_fog: read.gunning_fog ?? "", + coleman_liau: read.coleman_liau ?? "", + ari: read.ari ?? "", + smog: read.smog ?? "", + schema_types: parsed.schemaTypes || [], + inlinks, + outlinks, + render_mode: pageRes.render_mode, + last_modified: lastModified, + set_cookie: setCookie, + crawl_timestamp: new Date().toISOString(), + }); + + console.log( + `[${pageRes.status ?? "ERR"}] ${pageRes.time_ms}ms ${String(pageRes.render_mode).padEnd(8)} H:${parsed.totalHeadings} ${currentUrl} ${ + title || h1_1 + }` + ); + + // optional progress callback (non-fatal) + try { + onProgress?.({ + url: currentUrl, + status: pageRes.status, + title, + inlinks, + outlinks, + visited: visited.size, + queued: queue.length, + }); + } catch {} + + break; // success for this URL; stop attempts + } catch (err) { + console.error(`[ERROR] ${currentUrl} -> ${err.message}`); + results.push({ + url: currentUrl, + status: null, + status_text: "", + time_ms: null, + bytes: null, + content_type: "", + http_version: "", + title: "", + title_length: 0, + title_pixel_width: "", + meta_description: "", + meta_description_length: 0, + meta_description_pixel_width: "", + h1_1: "", + h1_1_length: 0, + h1_1_pixel_width: "", + h1_2: "", + h1_2_length: 0, + h1_2_pixel_width: "", + h2_1: "", + h2_2: "", + canonical: "", + robots_meta: "", + x_robots_tag: "", + noindex: false, + nofollow: false, + lang: "", + word_count: "", + flesch_reading_ease: "", + flesch_kincaid_grade: "", + gunning_fog: "", + coleman_liau: "", + ari: "", + smog: "", + schema_types: [], + inlinks: 0, + outlinks: 0, + render_mode: "error", + last_modified: "", + set_cookie: "", + crawl_timestamp: new Date().toISOString(), + }); + + try { + onProgress?.({ + url: currentUrl, + error: String(err?.message || err), + visited: visited.size, + queued: queue.length, + }); + } catch {} + } + } + } + + if (shared) await shared.browser.close(); + + // -------------------- Post-process: duplicates & similarity ------------- + // Titles + const titleMap = new Map(); + for (const r of results) { + const key = (r.title || "").trim(); + if (!titleMap.has(key)) titleMap.set(key, []); + titleMap.get(key).push(r); + } + for (const [t, arr] of titleMap.entries()) { + if (!t) continue; + const isDup = arr.length > 1; + for (const row of arr) row.duplicate_title_exact = isDup ? "yes" : "no"; + } + + // Meta descriptions + const descMap = new Map(); + for (const r of results) { + const key = (r.meta_description || "").trim(); + if (!descMap.has(key)) descMap.set(key, []); + descMap.get(key).push(r); + } + for (const [d, arr] of descMap.entries()) { + if (!d) continue; + const isDup = arr.length > 1; + for (const row of arr) row.duplicate_description_exact = isDup ? "yes" : "no"; + } + + // Nearest neighbor similarities (within site, lightweight) + const titleList = results.map((r) => ({ url: r.url, text: (r.title || "").trim() })); + const descList = results.map((r) => ({ url: r.url, text: (r.meta_description || "").trim() })); + for (const r of results) { + // titles + const others = titleList.filter((x) => x.url !== r.url && x.text); + let bestT = { rating: 0, target: "" }; + if (r.title && others.length) { + const ratings = stringSimilarity.findBestMatch(r.title, others.map((x) => x.text)); + const best = ratings.bestMatch; + bestT.rating = best.rating; + const idx = ratings.ratings.findIndex((x) => x.rating === best.rating); + bestT.target = others[idx]?.url || ""; + } + r.nearest_title_similarity = bestT.rating ? bestT.rating.toFixed(3) : ""; + r.nearest_title_url = bestT.target; + + // descriptions + const othersD = descList.filter((x) => x.url !== r.url && x.text); + let bestD = { rating: 0, target: "" }; + if (r.meta_description && othersD.length) { + const ratingsD = stringSimilarity.findBestMatch(r.meta_description, othersD.map((x) => x.text)); + const best = ratingsD.bestMatch; + bestD.rating = best.rating; + const idx = ratingsD.ratings.findIndex((x) => x.rating === best.rating); + bestD.target = othersD[idx]?.url || ""; + } + r.nearest_description_similarity = bestD.rating ? bestD.rating.toFixed(3) : ""; + r.nearest_description_url = bestD.target; + } + + console.log(`\n✅ Crawl finished. Total pages: ${visited.size}`); + + let files = {}; + if (persistReports) { + const a = writePageReports(results); + const b = writeLinkEdges(edges); + const c = writeErrors(results); + files = { ...a, ...b, ...c }; + } + + return { results, files, total: results.length }; +} + +// // CLI: node crawler.js https://site.com 200 +// const START_URL = process.argv[2] || "https://example.com"; +// const MAX_PAGES = Number(process.argv[3] || 100); +// crawl(START_URL, MAX_PAGES); diff --git a/middlewares/auth.middleware.js b/middlewares/auth.middleware.js new file mode 100644 index 0000000..fdf98f9 --- /dev/null +++ b/middlewares/auth.middleware.js @@ -0,0 +1,19 @@ +import jwt from "jsonwebtoken"; + +export function authMiddleware(req, res, next) { + const header = req.headers.authorization; + + if (!header?.startsWith("Bearer ")) { + return res.status(401).json({ error: "Missing token" }); + } + + const token = header.split(" ")[1]; + + try { + req.user = jwt.verify(token, process.env.JWT_SECRET); + next(); + } catch (err) { + console.error("JWT verification failed:", err.message); + return res.status(401).json({ error: "Invalid or expired token" }); + } +} diff --git a/middlewares/pageSpeedErrorHandler.js b/middlewares/pageSpeedErrorHandler.js new file mode 100644 index 0000000..3ad04ed --- /dev/null +++ b/middlewares/pageSpeedErrorHandler.js @@ -0,0 +1,4 @@ +export const errorHandler = (err, req, res, next) => { + console.error(err); + res.status(500).json({ message: err.message || 'Internal Server Error' }); +}; diff --git a/models/blog.model.js b/models/blog.model.js new file mode 100644 index 0000000..cadb8a7 --- /dev/null +++ b/models/blog.model.js @@ -0,0 +1,41 @@ +import mongoose from 'mongoose'; + +const commentSchema = new mongoose.Schema({ + user: { type: mongoose.Schema.Types.ObjectId, ref: 'User' }, + name: String, + text: { type: String, required: true }, + createdAt: { type: Date, default: Date.now } +}); + +const blogSchema = new mongoose.Schema({ + projectId: { type: String, required: true, index: true }, + title: { type: String, required: true }, + slug: { type: String, required: true, unique: false }, + description: { type: String, required: true }, + imageUrl: String, + bigImageUrl: String, // ✅ New field + category: { type: mongoose.Schema.Types.ObjectId, ref: 'Category' }, + tags: [String], + comments: [commentSchema], + likes: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }], + author: { type: mongoose.Schema.Types.ObjectId, ref: 'User' } +}, { timestamps: true }); + +// 👇 projectId + slug combo unique +blogSchema.index({ projectId: 1, slug: 1 }, { unique: true }); + +// 👇 Add base URL when converting to JSON +blogSchema.set('toJSON', { + transform: (doc, ret) => { + const baseUrl = process.env.BACKEND_URL || 'http://localhost:3010'; + if (ret.imageUrl && !ret.imageUrl.startsWith('http')) { + ret.imageUrl = `${baseUrl}${ret.imageUrl}`; + } + if (ret.bigImageUrl && !ret.bigImageUrl.startsWith('http')) { + ret.bigImageUrl = `${baseUrl}${ret.bigImageUrl}`; + } + return ret; + } +}); + +export default mongoose.model('Blog', blogSchema); diff --git a/models/category.model.js b/models/category.model.js new file mode 100644 index 0000000..eaff001 --- /dev/null +++ b/models/category.model.js @@ -0,0 +1,21 @@ +import mongoose from "mongoose"; + +const categorySchema = new mongoose.Schema( + { + name: { + type: String, + required: true, + unique: true, + trim: true, + }, + projectId: { + type: String, // For multi-project support + required: true, + }, + }, + { timestamps: true } +); + +const Category = mongoose.model("Category", categorySchema); + +export default Category; diff --git a/models/comments.model.js b/models/comments.model.js new file mode 100644 index 0000000..03060e5 --- /dev/null +++ b/models/comments.model.js @@ -0,0 +1,10 @@ +import mongoose from "mongoose"; + +const commentSchema = new mongoose.Schema({ + blog: { type: mongoose.Schema.Types.ObjectId, ref: "Blog" }, + name: String, + text: String, + createdAt: { type: Date, default: Date.now } +}); + +export default mongoose.model("Comment", commentSchema); diff --git a/models/maisondetreats/cakeOrder.model.js b/models/maisondetreats/cakeOrder.model.js new file mode 100644 index 0000000..f7569c2 --- /dev/null +++ b/models/maisondetreats/cakeOrder.model.js @@ -0,0 +1,18 @@ +import mongoose from "mongoose"; + +const CakeOrderSchema = new mongoose.Schema( + { + order: { + type: Object, + required: true, + // Example format: + // { + // "Mini Cakes": { "Thandai Cake": 1, "Mango Cardamom": 1 }, + // "Mithai-Inspired Macarons": { "Mango macarons (pack of 6)": 1, "Pista (pack of 6)": 10 } + // } + }, + }, + { timestamps: true } +); + +export const CakeOrder = mongoose.model("CakeOrder", CakeOrderSchema); diff --git a/models/message.model.js b/models/message.model.js new file mode 100644 index 0000000..3f604d9 --- /dev/null +++ b/models/message.model.js @@ -0,0 +1,12 @@ +import mongoose from "mongoose"; + +const MessageSchema = new mongoose.Schema({ + project: { type: String, required: true }, // new field to identify project + name: { type: String, default: "Guest" }, + email: { type: String }, + message: { type: String, required: true }, +}, { timestamps: true }); + +const Message = mongoose.models.Message || mongoose.model("Message", MessageSchema); + +export default Message; diff --git a/models/pageSpeedTest.model.js b/models/pageSpeedTest.model.js new file mode 100644 index 0000000..36f6ad9 --- /dev/null +++ b/models/pageSpeedTest.model.js @@ -0,0 +1,42 @@ +import mongoose from 'mongoose'; + +const pageSpeedTestSchema = new mongoose.Schema({ + url: { type: String, required: true }, + device: { type: String, enum: ['mobile', 'desktop'], required: true }, + scores: { + performance: Number, + accessibility: Number, + bestPractices: Number, + seo: Number, + pwa: Number, + }, + metrics: { + firstContentfulPaint: String, + largestContentfulPaint: String, + totalBlockingTime: String, + timeToInteractive: String, + speedIndex: String, + cumulativeLayoutShift: String, + }, + opportunities: [ + { + title: String, + description: String, + estimatedSavings: String, + }, + ], + diagnostics: Object, + failedAudits: [ + { + title: String, + description: String, + }, + ], + passedAudits: [String], + notApplicableAudits: [String], + screenshot: String, + treemapPath: { type: String }, + createdAt: { type: Date, default: Date.now }, +}); + +export default mongoose.model('PageSpeedTest', pageSpeedTestSchema); diff --git a/models/payment.model.js b/models/payment.model.js new file mode 100644 index 0000000..aac5aa3 --- /dev/null +++ b/models/payment.model.js @@ -0,0 +1,12 @@ +import mongoose from "mongoose"; + +const paymentSchema = new mongoose.Schema({ + email: { type: String, required: true }, + amount: { type: Number, required: true }, // store in cents + currency: { type: String, default: "usd" }, + stripePaymentIntentId: { type: String }, // ❌ remove required: true + stripeSessionId: { type: String }, // ✅ store Checkout Session ID + status: { type: String, default: "pending" }, // pending, succeeded, failed +}, { timestamps: true }); + +export const Payment = mongoose.model("Payment", paymentSchema); diff --git a/models/user.model.js b/models/user.model.js new file mode 100644 index 0000000..702250d --- /dev/null +++ b/models/user.model.js @@ -0,0 +1,14 @@ +import mongoose from "mongoose"; + +const userSchema = new mongoose.Schema( + { + email: { type: String, required: true, unique: true, lowercase: true }, + passwordHash: { type: String, required: true }, + // ➡️ Add these two lines + resetPasswordToken: { type: String }, + resetPasswordExpires: { type: Date }, + }, + { timestamps: true } +); + +export default mongoose.model("User", userSchema); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..a45859b --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5093 @@ +{ + "name": "crawlerx", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "crawlerx", + "version": "1.0.0", + "dependencies": { + "axios": "^1.12.2", + "bcrypt": "^6.0.0", + "cheerio": "^1.1.0", + "chrome-launcher": "^1.2.1", + "cors": "^2.8.5", + "dotenv": "^17.2.2", + "express": "^5.1.0", + "got": "^14.4.7", + "jsonwebtoken": "^9.0.2", + "lighthouse": "^12.8.2", + "mongoose": "^8.18.1", + "multer": "^2.0.2", + "nodemailer": "^7.0.6", + "normalize-url": "^8.0.2", + "sitemapper": "^3.2.7", + "slugify": "^1.6.6", + "string-pixel-width": "^1.11.0", + "string-similarity": "^4.0.4", + "stripe": "^18.5.0", + "text-readability": "^1.1.1" + }, + "devDependencies": { + "nodemon": "^3.1.10", + "playwright": "^1.55.0" + } + }, + "node_modules/@formatjs/ecma402-abstract": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.4.tgz", + "integrity": "sha512-qrycXDeaORzIqNhBOx0btnhpD1c+/qFIHAN9znofuMJX6QBwtbrmlpWfD4oiUUD2vJUOIYFA/gYtg2KAMGG7sA==", + "license": "MIT", + "dependencies": { + "@formatjs/fast-memoize": "2.2.7", + "@formatjs/intl-localematcher": "0.6.1", + "decimal.js": "^10.4.3", + "tslib": "^2.8.0" + } + }, + "node_modules/@formatjs/fast-memoize": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.7.tgz", + "integrity": "sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@formatjs/icu-messageformat-parser": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.11.2.tgz", + "integrity": "sha512-AfiMi5NOSo2TQImsYAg8UYddsNJ/vUEv/HaNqiFjnI3ZFfWihUtD5QtuX6kHl8+H+d3qvnE/3HZrfzgdWpsLNA==", + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "2.3.4", + "@formatjs/icu-skeleton-parser": "1.8.14", + "tslib": "^2.8.0" + } + }, + "node_modules/@formatjs/icu-skeleton-parser": { + "version": "1.8.14", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.14.tgz", + "integrity": "sha512-i4q4V4qslThK4Ig8SxyD76cp3+QJ3sAqr7f6q9VVfeGtxG9OhiAk3y9XF6Q41OymsKzsGQ6OQQoJNY4/lI8TcQ==", + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "2.3.4", + "tslib": "^2.8.0" + } + }, + "node_modules/@formatjs/intl-localematcher": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.6.1.tgz", + "integrity": "sha512-ePEgLgVCqi2BBFnTMWPfIghu6FkbZnnBVhO2sSxvLfrdFw7wCHAHiDoM2h4NRgjbaY7+B7HgOLZGkK187pZTZg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.3.0.tgz", + "integrity": "sha512-zlayKCsIjYb7/IdfqxorK5+xUMyi4vOKcFy10wKJYc63NSdKI8mNME+uJqfatkPmOSMMUiojrL58IePKBm3gvQ==", + "license": "MIT", + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/api-logs": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.57.2.tgz", + "integrity": "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/context-async-hooks": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.30.1.tgz", + "integrity": "sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/core": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", + "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/core/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz", + "integrity": "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.57.2", + "@types/shimmer": "^1.2.0", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-amqplib": { + "version": "0.46.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.46.1.tgz", + "integrity": "sha512-AyXVnlCf/xV3K/rNumzKxZqsULyITJH6OVLiW6730JPRqWA7Zc9bvYoVNpN6iOpTU8CasH34SU/ksVJmObFibQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-connect": { + "version": "0.43.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.43.1.tgz", + "integrity": "sha512-ht7YGWQuV5BopMcw5Q2hXn3I8eG8TH0J/kc/GMcW4CuNTgiP6wCu44BOnucJWL3CmFWaRHI//vWyAhaC8BwePw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/connect": "3.4.38" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-dataloader": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.16.1.tgz", + "integrity": "sha512-K/qU4CjnzOpNkkKO4DfCLSQshejRNAJtd4esgigo/50nxCB6XCyi1dhAblUHM9jG5dRm8eu0FB+t87nIo99LYQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-express": { + "version": "0.47.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.47.1.tgz", + "integrity": "sha512-QNXPTWteDclR2B4pDFpz0TNghgB33UMjUt14B+BZPmtH1MwUFAfLHBaP5If0Z5NZC+jaH8oF2glgYjrmhZWmSw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fs": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.19.1.tgz", + "integrity": "sha512-6g0FhB3B9UobAR60BGTcXg4IHZ6aaYJzp0Ki5FhnxyAPt8Ns+9SSvgcrnsN2eGmk3RWG5vYycUGOEApycQL24A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-generic-pool": { + "version": "0.43.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.43.1.tgz", + "integrity": "sha512-M6qGYsp1cURtvVLGDrPPZemMFEbuMmCXgQYTReC/IbimV5sGrLBjB+/hANUpRZjX67nGLdKSVLZuQQAiNz+sww==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-graphql": { + "version": "0.47.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.47.1.tgz", + "integrity": "sha512-EGQRWMGqwiuVma8ZLAZnExQ7sBvbOx0N/AE/nlafISPs8S+QtXX+Viy6dcQwVWwYHQPAcuY3bFt3xgoAwb4ZNQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-hapi": { + "version": "0.45.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.45.2.tgz", + "integrity": "sha512-7Ehow/7Wp3aoyCrZwQpU7a2CnoMq0XhIcioFuKjBb0PLYfBfmTsFTUyatlHu0fRxhwcRsSQRTvEhmZu8CppBpQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http": { + "version": "0.57.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.57.2.tgz", + "integrity": "sha512-1Uz5iJ9ZAlFOiPuwYg29Bf7bJJc/GeoeJIFKJYQf67nTVKFe8RHbEtxgkOmK4UGZNHKXcpW4P8cWBYzBn1USpg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/instrumentation": "0.57.2", + "@opentelemetry/semantic-conventions": "1.28.0", + "forwarded-parse": "2.1.2", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-ioredis": { + "version": "0.47.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.47.1.tgz", + "integrity": "sha512-OtFGSN+kgk/aoKgdkKQnBsQFDiG8WdCxu+UrHr0bXScdAmtSzLSraLo7wFIb25RVHfRWvzI5kZomqJYEg/l1iA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-kafkajs": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.7.1.tgz", + "integrity": "sha512-OtjaKs8H7oysfErajdYr1yuWSjMAectT7Dwr+axIoZqT9lmEOkD/H/3rgAs8h/NIuEi2imSXD+vL4MZtOuJfqQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-knex": { + "version": "0.44.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.44.1.tgz", + "integrity": "sha512-U4dQxkNhvPexffjEmGwCq68FuftFK15JgUF05y/HlK3M6W/G2iEaACIfXdSnwVNe9Qh0sPfw8LbOPxrWzGWGMQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-koa": { + "version": "0.47.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.47.1.tgz", + "integrity": "sha512-l/c+Z9F86cOiPJUllUCt09v+kICKvT+Vg1vOAJHtHPsJIzurGayucfCMq2acd/A/yxeNWunl9d9eqZ0G+XiI6A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-lru-memoizer": { + "version": "0.44.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.44.1.tgz", + "integrity": "sha512-5MPkYCvG2yw7WONEjYj5lr5JFehTobW7wX+ZUFy81oF2lr9IPfZk9qO+FTaM0bGEiymwfLwKe6jE15nHn1nmHg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongodb": { + "version": "0.52.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.52.0.tgz", + "integrity": "sha512-1xmAqOtRUQGR7QfJFfGV/M2kC7wmI2WgZdpru8hJl3S0r4hW0n3OQpEHlSGXJAaNFyvT+ilnwkT+g5L4ljHR6g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongoose": { + "version": "0.46.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.46.1.tgz", + "integrity": "sha512-3kINtW1LUTPkiXFRSSBmva1SXzS/72we/jL22N+BnF3DFcoewkdkHPYOIdAAk9gSicJ4d5Ojtt1/HeibEc5OQg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql": { + "version": "0.45.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.45.1.tgz", + "integrity": "sha512-TKp4hQ8iKQsY7vnp/j0yJJ4ZsP109Ht6l4RHTj0lNEG1TfgTrIH5vJMbgmoYXWzNHAqBH2e7fncN12p3BP8LFg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/mysql": "2.15.26" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql2": { + "version": "0.45.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.45.2.tgz", + "integrity": "sha512-h6Ad60FjCYdJZ5DTz1Lk2VmQsShiViKe0G7sYikb0GHI0NVvApp2XQNRHNjEMz87roFttGPLHOYVPlfy+yVIhQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@opentelemetry/sql-common": "^0.40.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg": { + "version": "0.51.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.51.1.tgz", + "integrity": "sha512-QxgjSrxyWZc7Vk+qGSfsejPVFL1AgAJdSBMYZdDUbwg730D09ub3PXScB9d04vIqPriZ+0dqzjmQx0yWKiCi2Q==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.26.0", + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@opentelemetry/sql-common": "^0.40.1", + "@types/pg": "8.6.1", + "@types/pg-pool": "2.0.6" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis-4": { + "version": "0.46.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.46.1.tgz", + "integrity": "sha512-UMqleEoabYMsWoTkqyt9WAzXwZ4BlFZHO40wr3d5ZvtjKCHlD4YXLm+6OLCeIi/HkX7EXvQaz8gtAwkwwSEvcQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-tedious": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.18.1.tgz", + "integrity": "sha512-5Cuy/nj0HBaH+ZJ4leuD7RjgvA844aY2WW+B5uLcWtxGjRZl3MNLuxnNg5DYWZNPO+NafSSnra0q49KWAHsKBg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.57.1", + "@opentelemetry/semantic-conventions": "^1.27.0", + "@types/tedious": "^4.0.14" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-undici": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.10.1.tgz", + "integrity": "sha512-rkOGikPEyRpMCmNu9AQuV5dtRlDmJp2dK5sw8roVshAGoB6hH/3QjDtRhdwd75SsJwgynWUNRUYe0wAkTo16tQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.57.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.7.0" + } + }, + "node_modules/@opentelemetry/redis-common": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.2.tgz", + "integrity": "sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.30.1.tgz", + "integrity": "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.30.1.tgz", + "integrity": "sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/resources": "1.30.1", + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.37.0.tgz", + "integrity": "sha512-JD6DerIKdJGmRp4jQyX5FlrQjA4tjOw1cvfsPAZXfOOEErMUHjPcPSICS+6WnM0nB0efSFARh0KAZss+bvExOA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sql-common": { + "version": "0.40.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.40.1.tgz", + "integrity": "sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^1.1.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0" + } + }, + "node_modules/@paulirish/trace_engine": { + "version": "0.0.59", + "resolved": "https://registry.npmjs.org/@paulirish/trace_engine/-/trace_engine-0.0.59.tgz", + "integrity": "sha512-439NUzQGmH+9Y017/xCchBP9571J4bzhpcNhrxorf7r37wcyJZkgUfrUsRL3xl+JDcZ6ORhoFCzCw98c6S3YHw==", + "license": "BSD-3-Clause", + "dependencies": { + "legacy-javascript": "latest", + "third-party-web": "latest" + } + }, + "node_modules/@prisma/instrumentation": { + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/@prisma/instrumentation/-/instrumentation-6.11.1.tgz", + "integrity": "sha512-mrZOev24EDhnefmnZX7WVVT7v+r9LttPRqf54ONvj6re4XMF7wFTpK2tLJi4XHB7fFp/6xhYbgRel8YV7gQiyA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0 || ^0.53.0 || ^0.54.0 || ^0.55.0 || ^0.56.0 || ^0.57.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.8" + } + }, + "node_modules/@puppeteer/browsers": { + "version": "2.10.10", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.10.tgz", + "integrity": "sha512-3ZG500+ZeLql8rE0hjfhkycJjDj0pI/btEh3L9IkWUYcOrgP0xCNRq3HbtbqOPbvDhFaAWD88pDFtlLv8ns8gA==", + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.4.3", + "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/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "license": "MIT" + }, + "node_modules/@sentry/core": { + "version": "9.46.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-9.46.0.tgz", + "integrity": "sha512-it7JMFqxVproAgEtbLgCVBYtQ9fIb+Bu0JD+cEplTN/Ukpe6GaolyYib5geZqslVxhp2sQgT+58aGvfd/k0N8Q==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/node": { + "version": "9.46.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-9.46.0.tgz", + "integrity": "sha512-pRLqAcd7GTGvN8gex5FtkQR5Mcol8gOy1WlyZZFq4rBbVtMbqKOQRhohwqnb+YrnmtFpj7IZ7KNDo077MvNeOQ==", + "license": "MIT", + "dependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/context-async-hooks": "^1.30.1", + "@opentelemetry/core": "^1.30.1", + "@opentelemetry/instrumentation": "^0.57.2", + "@opentelemetry/instrumentation-amqplib": "^0.46.1", + "@opentelemetry/instrumentation-connect": "0.43.1", + "@opentelemetry/instrumentation-dataloader": "0.16.1", + "@opentelemetry/instrumentation-express": "0.47.1", + "@opentelemetry/instrumentation-fs": "0.19.1", + "@opentelemetry/instrumentation-generic-pool": "0.43.1", + "@opentelemetry/instrumentation-graphql": "0.47.1", + "@opentelemetry/instrumentation-hapi": "0.45.2", + "@opentelemetry/instrumentation-http": "0.57.2", + "@opentelemetry/instrumentation-ioredis": "0.47.1", + "@opentelemetry/instrumentation-kafkajs": "0.7.1", + "@opentelemetry/instrumentation-knex": "0.44.1", + "@opentelemetry/instrumentation-koa": "0.47.1", + "@opentelemetry/instrumentation-lru-memoizer": "0.44.1", + "@opentelemetry/instrumentation-mongodb": "0.52.0", + "@opentelemetry/instrumentation-mongoose": "0.46.1", + "@opentelemetry/instrumentation-mysql": "0.45.1", + "@opentelemetry/instrumentation-mysql2": "0.45.2", + "@opentelemetry/instrumentation-pg": "0.51.1", + "@opentelemetry/instrumentation-redis-4": "0.46.1", + "@opentelemetry/instrumentation-tedious": "0.18.1", + "@opentelemetry/instrumentation-undici": "0.10.1", + "@opentelemetry/resources": "^1.30.1", + "@opentelemetry/sdk-trace-base": "^1.30.1", + "@opentelemetry/semantic-conventions": "^1.34.0", + "@prisma/instrumentation": "6.11.1", + "@sentry/core": "9.46.0", + "@sentry/node-core": "9.46.0", + "@sentry/opentelemetry": "9.46.0", + "import-in-the-middle": "^1.14.2", + "minimatch": "^9.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/node-core": { + "version": "9.46.0", + "resolved": "https://registry.npmjs.org/@sentry/node-core/-/node-core-9.46.0.tgz", + "integrity": "sha512-XRVu5pqoklZeh4wqhxCLZkz/ipoKhitctgEFXX9Yh1e1BoHM2pIxT52wf+W6hHM676TFmFXW3uKBjsmRM3AjgA==", + "license": "MIT", + "dependencies": { + "@sentry/core": "9.46.0", + "@sentry/opentelemetry": "9.46.0", + "import-in-the-middle": "^1.14.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/context-async-hooks": "^1.30.1 || ^2.0.0", + "@opentelemetry/core": "^1.30.1 || ^2.0.0", + "@opentelemetry/instrumentation": ">=0.57.1 <1", + "@opentelemetry/resources": "^1.30.1 || ^2.0.0", + "@opentelemetry/sdk-trace-base": "^1.30.1 || ^2.0.0", + "@opentelemetry/semantic-conventions": "^1.34.0" + } + }, + "node_modules/@sentry/node/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@sentry/node/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@sentry/opentelemetry": { + "version": "9.46.0", + "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-9.46.0.tgz", + "integrity": "sha512-w2zTxqrdmwRok0cXBoh+ksXdGRUHUZhlpfL/H2kfTodOL+Mk8rW72qUmfqQceXoqgbz8UyK8YgJbyt+XS5H4Qg==", + "license": "MIT", + "dependencies": { + "@sentry/core": "9.46.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/context-async-hooks": "^1.30.1 || ^2.0.0", + "@opentelemetry/core": "^1.30.1 || ^2.0.0", + "@opentelemetry/sdk-trace-base": "^1.30.1 || ^2.0.0", + "@opentelemetry/semantic-conventions": "^1.34.0" + } + }, + "node_modules/@sindresorhus/is": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.0.2.tgz", + "integrity": "sha512-d9xRovfKNz1SKieM0qJdO+PQonjnnIfSNWfHYnBSJ9hkjm0ZPw6HlxscDXYstp3z+7V2GOFHc+J0CYrYTjqCJw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "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/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "license": "MIT" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mysql": { + "version": "2.15.26", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.26.tgz", + "integrity": "sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "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", + "dependencies": { + "undici-types": "~7.10.0" + } + }, + "node_modules/@types/pg": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz", + "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "node_modules/@types/pg-pool": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.6.tgz", + "integrity": "sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==", + "license": "MIT", + "dependencies": { + "@types/pg": "*" + } + }, + "node_modules/@types/pluralize": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/pluralize/-/pluralize-0.0.29.tgz", + "integrity": "sha512-BYOID+l2Aco2nBik+iYS4SZX0Lf20KPILP5RGmM1IgzdwNdTs0eebiFriOPcej1sX9mLnSoiNte5zcFxssgpGA==", + "license": "MIT" + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/shimmer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.2.0.tgz", + "integrity": "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==", + "license": "MIT" + }, + "node_modules/@types/tedious": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@types/tedious/-/tedious-4.0.14.tgz", + "integrity": "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==", + "license": "MIT" + }, + "node_modules/@types/whatwg-url": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz", + "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==", + "license": "MIT", + "dependencies": { + "@types/webidl-conversions": "*" + } + }, + "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/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "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/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==", + "license": "MIT" + }, + "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/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/atomically": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/atomically/-/atomically-2.0.3.tgz", + "integrity": "sha512-kU6FmrwZ3Lx7/7y3hPS5QnbJfaohcIul5fGqf7ok+4KklIEk9tJ0C2IQPdacSbVUWv6zVHXEBWoWd6NrVMT7Cw==", + "dependencies": { + "stubborn-fs": "^1.2.5", + "when-exit": "^2.1.1" + } + }, + "node_modules/axe-core": { + "version": "4.10.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz", + "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==", + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axios": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", + "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/b4a": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", + "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, + "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==", + "license": "MIT" + }, + "node_modules/bare-events": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.7.0.tgz", + "integrity": "sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA==", + "license": "Apache-2.0" + }, + "node_modules/bare-fs": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.4.4.tgz", + "integrity": "sha512-Q8yxM1eLhJfuM7KXVP3zjhBvtMJCYRByoTT+wHXjpdMELv0xICFJX+1w4c7csa+WZEOsq4ItJ4RGwvzid6m/dw==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" + }, + "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/bare-url": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.2.2.tgz", + "integrity": "sha512-g+ueNGKkrjMazDG3elZO1pNs3HY5+mMmOet1jtKyhOaCnkLzitxf26z7hoAEkDNgdNmnc1KIlt/dw6Po6xZMpA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-path": "^3.0.0" + } + }, + "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/bcrypt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-6.0.0.tgz", + "integrity": "sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^8.3.0", + "node-gyp-build": "^4.8.4" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "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/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bson": { + "version": "6.10.4", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.4.tgz", + "integrity": "sha512-WIsKqkSC0ABoBJuT1LEX+2HEvNmNKKgnTAyd0fL8qzK4SH2i9NXg+t08YtdZp/V9IZ33cxe3iV4yM0qg8lMQng==", + "license": "Apache-2.0", + "engines": { + "node": ">=16.20.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/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==", + "license": "MIT" + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-12.0.1.tgz", + "integrity": "sha512-Yo9wGIQUaAfIbk+qY0X4cDQgCosecfBe3V9NSyeY4qPC2SAkbCS4Xj79VP8WOzitpJUZKc/wsRCYF5ariDIwkg==", + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "^4.0.4", + "get-stream": "^9.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.4", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.1", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/cheerio": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.0.tgz", + "integrity": "sha512-+0hMx9eYhJvWbgpKV9hN7jg0JcwydpopZE4hgi+KvQtByZXPp04NiCWU0LzcAbP63abZckIHkTQaXVF52mX3xQ==", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "encoding-sniffer": "^0.2.0", + "htmlparser2": "^10.0.0", + "parse5": "^7.3.0", + "parse5-htmlparser2-tree-adapter": "^7.1.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^7.10.0", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=18.17" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-launcher": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-1.2.1.tgz", + "integrity": "sha512-qmFR5PLMzHyuNJHwOloHPAHhbaNglkfeV/xDtt5b7xiFFyU1I+AZZX0PYseMuhenJSSirgxELYIbswcoc+5H4A==", + "license": "Apache-2.0", + "dependencies": { + "@types/node": "*", + "escape-string-regexp": "^4.0.0", + "is-wsl": "^2.2.0", + "lighthouse-logger": "^2.0.1" + }, + "bin": { + "print-chrome-path": "bin/print-chrome-path.cjs" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/chromium-bidi": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-9.1.0.tgz", + "integrity": "sha512-rlUzQ4WzIAWdIbY/viPShhZU2n21CxDUgazXVbw4Hu1MwaeUSEksSeM6DqPgpRjCLXRk702AVRxJxoOz0dw4OA==", + "license": "Apache-2.0", + "dependencies": { + "mitt": "^3.0.1", + "zod": "^3.24.1" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "license": "MIT" + }, + "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/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clone-response/node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "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/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "engines": [ + "node >= 6.0" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/configstore": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-7.1.0.tgz", + "integrity": "sha512-N4oog6YJWbR9kGyXvS7jEykLDXIE2C0ILYqNBZBp9iwiJpoCBWYsuAdW6PPFn6w06jjnC+3JstVvWHO4cZqvRg==", + "license": "BSD-2-Clause", + "dependencies": { + "atomically": "^2.0.3", + "dot-prop": "^9.0.0", + "graceful-fs": "^4.2.11", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/csp_evaluator": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/csp_evaluator/-/csp_evaluator-1.1.5.tgz", + "integrity": "sha512-EL/iN9etCTzw/fBnp0/uj0f5BOOGvZut2mzsiiBZ/FdT6gFQCKRO/tmcKOxn5drWZ2Ndm/xBb1SI4zwWbGtmIw==", + "license": "Apache-2.0" + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "license": "MIT" + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/devtools-protocol": { + "version": "0.0.1507524", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1507524.tgz", + "integrity": "sha512-OjaNE7qpk6GRTXtqQjAE5bGx6+c4F1zZH0YXtpZQLM92HNXx4zMAaqlKhP4T52DosG6hDW8gPMNhGOF8xbwk/w==", + "license": "BSD-3-Clause" + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-prop": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-9.0.0.tgz", + "integrity": "sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^4.18.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dotenv": { + "version": "17.2.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.2.tgz", + "integrity": "sha512-Sf2LSQP+bOlhKWWyhFsn0UsfdK/kCWRv1iuA2gXAwt3dyNabr6QSj00I2V10pidqz69soatm9ZwZvpQMTIOd5Q==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "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/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding-sniffer": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, + "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/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "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==", + "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/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/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/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, + "node_modules/express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "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/extract-zip/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/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-xml-parser": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.3.tgz", + "integrity": "sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^1.1.1" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "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/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data-encoder": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-4.1.0.tgz", + "integrity": "sha512-G6NsmEW15s0Uw9XnCg+33H3ViYRyiM0hMrMhhqQOR8NFc5GhYrI+6I3u7OTw7b91J2g8rtvMBZJDbcGb2YUniw==", + "license": "MIT", + "engines": { + "node": ">= 18" + } + }, + "node_modules/form-data/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/form-data/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/forwarded-parse": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/forwarded-parse/-/forwarded-parse-2.1.2.tgz", + "integrity": "sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==", + "license": "MIT" + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "license": "MIT", + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "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": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "14.4.7", + "resolved": "https://registry.npmjs.org/got/-/got-14.4.7.tgz", + "integrity": "sha512-DI8zV1231tqiGzOiOzQWDhsBmncFW7oQDH6Zgy6pDPrqJuVZMtoSgPLLsBZQj8Jg4JFfwoOsDA8NGtLQLnIx2g==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^7.0.1", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^12.0.1", + "decompress-response": "^6.0.0", + "form-data-encoder": "^4.0.2", + "http2-wrapper": "^2.2.1", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^4.0.1", + "responselike": "^3.0.0", + "type-fest": "^4.26.1" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "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==", + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/htmlparser2": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", + "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.1", + "entities": "^6.0.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-link-header": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/http-link-header/-/http-link-header-1.1.3.tgz", + "integrity": "sha512-3cZ0SRL8fb9MUlU3mKM61FcQvPfXx2dBrZW3Vbg5CXa8jFlK8OaEpePenLe1oEXQduhz8b0QjsqfS59QP4AJDQ==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "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/http2-wrapper": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "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/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true, + "license": "ISC" + }, + "node_modules/image-ssim": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/image-ssim/-/image-ssim-0.2.0.tgz", + "integrity": "sha512-W7+sO6/yhxy83L0G7xR8YAc5Z5QFtYEXXRV6EaE8tuYBZJnA3gVgp3q7X7muhLZVodeb9UfvjSbwt9VJwjIYAg==", + "license": "MIT" + }, + "node_modules/import-in-the-middle": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.14.4.tgz", + "integrity": "sha512-eWjxh735SJLFJJDs5X82JQ2405OdJeAHDBnaoFCfdr5GVc7AWc9xU7KbrF+3Xd5F2ccP1aQFKtY+65X6EfKZ7A==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/intl-messageformat": { + "version": "10.7.16", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.16.tgz", + "integrity": "sha512-UmdmHUmp5CIKKjSoE10la5yfU+AYJAaiYLsodbjL4lji83JNvgOQUjGaGhGrpFCb0Uh7sl7qfP1IyILa8Z40ug==", + "license": "BSD-3-Clause", + "dependencies": { + "@formatjs/ecma402-abstract": "2.3.4", + "@formatjs/fast-memoize": "2.2.7", + "@formatjs/icu-messageformat-parser": "2.11.2", + "tslib": "^2.8.0" + } + }, + "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/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/is-gzip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-2.0.0.tgz", + "integrity": "sha512-jtO4Njg6q58zDo/Pu4027beSZ0VdsZlt8/5Moco6yAg+DIxb5BK/xUYqYG2+MD4+piKldXJNHxRkhEYI2fvrxA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jpeg-js": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", + "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==", + "license": "BSD-3-Clause" + }, + "node_modules/js-library-detector": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/js-library-detector/-/js-library-detector-6.7.0.tgz", + "integrity": "sha512-c80Qupofp43y4cJ7+8TTDN/AsDwLi5oOm/plBrWI+iQt485vKXCco+yVmOwEgdo9VOdsYTuV0UlTeetVPTriXA==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "license": "MIT", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jwa": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", + "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "license": "MIT", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/kareem": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz", + "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/legacy-javascript": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/legacy-javascript/-/legacy-javascript-0.0.1.tgz", + "integrity": "sha512-lPyntS4/aS7jpuvOlitZDFifBCb4W8L/3QU0PLbUTUj+zYah8rfVjYic88yG7ZKTxhS5h9iz7duT8oUXKszLhg==", + "license": "Apache-2.0" + }, + "node_modules/lighthouse": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/lighthouse/-/lighthouse-12.8.2.tgz", + "integrity": "sha512-+5SKYzVaTFj22MgoYDPNrP9tlD2/Ay7j3SxPSFD9FpPyVxGr4UtOQGKyrdZ7wCmcnBaFk0mCkPfARU3CsE0nvA==", + "license": "Apache-2.0", + "dependencies": { + "@paulirish/trace_engine": "0.0.59", + "@sentry/node": "^9.28.1", + "axe-core": "^4.10.3", + "chrome-launcher": "^1.2.0", + "configstore": "^7.0.0", + "csp_evaluator": "1.1.5", + "devtools-protocol": "0.0.1507524", + "enquirer": "^2.3.6", + "http-link-header": "^1.1.1", + "intl-messageformat": "^10.5.3", + "jpeg-js": "^0.4.4", + "js-library-detector": "^6.7.0", + "lighthouse-logger": "^2.0.2", + "lighthouse-stack-packs": "1.12.2", + "lodash-es": "^4.17.21", + "lookup-closest-locale": "6.2.0", + "metaviewport-parser": "0.3.0", + "open": "^8.4.0", + "parse-cache-control": "1.0.1", + "puppeteer-core": "^24.17.1", + "robots-parser": "^3.0.1", + "speedline-core": "^1.4.3", + "third-party-web": "^0.27.0", + "tldts-icann": "^7.0.12", + "ws": "^7.0.0", + "yargs": "^17.3.1", + "yargs-parser": "^21.0.0" + }, + "bin": { + "chrome-debug": "core/scripts/manual-chrome-launcher.js", + "lighthouse": "cli/index.js", + "smokehouse": "cli/test/smokehouse/frontends/smokehouse-bin.js" + }, + "engines": { + "node": ">=18.16" + } + }, + "node_modules/lighthouse-logger": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-2.0.2.tgz", + "integrity": "sha512-vWl2+u5jgOQuZR55Z1WM0XDdrJT6mzMP8zHUct7xTlWhuQs+eV0g+QL0RQdFjT54zVmbhLCP8vIVpy1wGn/gCg==", + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.4.1", + "marky": "^1.2.2" + } + }, + "node_modules/lighthouse-stack-packs": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/lighthouse-stack-packs/-/lighthouse-stack-packs-1.12.2.tgz", + "integrity": "sha512-Ug8feS/A+92TMTCK6yHYLwaFMuelK/hAKRMdldYkMNwv+d9PtWxjXEg6rwKtsUXTADajhdrhXyuNCJ5/sfmPFw==", + "license": "Apache-2.0" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, + "node_modules/lodash.deburr": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-4.1.0.tgz", + "integrity": "sha512-m/M1U1f3ddMCs6Hq2tAsYThTBDaAKFDX3dwDo97GEYzamXi9SqUpjWi/Rrj/gf3X2n8ktwgZrlP1z6E3v/IExQ==", + "license": "MIT" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" + }, + "node_modules/lookup-closest-locale": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/lookup-closest-locale/-/lookup-closest-locale-6.2.0.tgz", + "integrity": "sha512-/c2kL+Vnp1jnV6K6RpDTHK3dgg0Tu2VVp+elEiJpjfS1UyY7AjOYHohRug6wT0OpoX2qFgNORndE9RqesfVxWQ==", + "license": "MIT" + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/marky": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", + "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", + "license": "Apache-2.0" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "license": "MIT" + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/metaviewport-parser": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/metaviewport-parser/-/metaviewport-parser-0.3.0.tgz", + "integrity": "sha512-EoYJ8xfjQ6kpe9VbVHvZTZHiOl4HL1Z18CrZ+qahvLXT7ZO4YTC2JMyt5FaUp9JJp6J4Ybb/z7IsCXZt86/QkQ==", + "license": "MIT" + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/module-details-from-path": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz", + "integrity": "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==", + "license": "MIT" + }, + "node_modules/mongodb": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.18.0.tgz", + "integrity": "sha512-fO5ttN9VC8P0F5fqtQmclAkgXZxbIkYRTUi1j8JO6IYwvamkhtYDilJr35jOPELR49zqCJgXZWwCtW7B+TM8vQ==", + "license": "Apache-2.0", + "dependencies": { + "@mongodb-js/saslprep": "^1.1.9", + "bson": "^6.10.4", + "mongodb-connection-string-url": "^3.0.0" + }, + "engines": { + "node": ">=16.20.1" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.1.0 || ^2.0.0", + "gcp-metadata": "^5.2.0", + "kerberos": "^2.0.1", + "mongodb-client-encryption": ">=6.0.0 <7", + "snappy": "^7.2.2", + "socks": "^2.7.1" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "gcp-metadata": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + }, + "socks": { + "optional": true + } + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.2.tgz", + "integrity": "sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==", + "license": "Apache-2.0", + "dependencies": { + "@types/whatwg-url": "^11.0.2", + "whatwg-url": "^14.1.0 || ^13.0.0" + } + }, + "node_modules/mongoose": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.18.1.tgz", + "integrity": "sha512-K0RfrUXXufqNRZZjvAGdyjydB91SnbWxlwFYi5t7zN2DxVWFD3c6puia0/7xfBwZm6RCpYOVdYFlRFpoDWiC+w==", + "license": "MIT", + "dependencies": { + "bson": "^6.10.4", + "kareem": "2.6.3", + "mongodb": "~6.18.0", + "mpath": "0.9.0", + "mquery": "5.0.0", + "ms": "2.1.3", + "sift": "17.1.3" + }, + "engines": { + "node": ">=16.20.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", + "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", + "license": "MIT", + "dependencies": { + "debug": "4.x" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "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/multer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz", + "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==", + "license": "MIT", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.6.0", + "concat-stream": "^2.0.0", + "mkdirp": "^0.5.6", + "object-assign": "^4.1.1", + "type-is": "^1.6.18", + "xtend": "^4.0.2" + }, + "engines": { + "node": ">= 10.16.0" + } + }, + "node_modules/multer/node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/multer/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/multer/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/multer/node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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/node-addon-api": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", + "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/nodemailer": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-7.0.6.tgz", + "integrity": "sha512-F44uVzgwo49xboqbFgBGkRaiMgtoBrBEWCVincJPK9+S9Adkzt/wXCLKbf7dxucmxfTI5gHGB+bEmdyzN6QKjw==", + "license": "MIT-0", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/nodemon": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz", + "integrity": "sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "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/normalize-strings": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/normalize-strings/-/normalize-strings-1.1.1.tgz", + "integrity": "sha512-fARPRdTwmrQDLYhmeh7j/eZwrCP6WzxD6uKOdK/hT/uKACAE9AG2Bc2dgqOZLkfmmctHpfcJ9w3AQnfLgg3GYg==", + "license": "MIT" + }, + "node_modules/normalize-url": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.2.tgz", + "integrity": "sha512-Ee/R3SyN4BuynXcnTaekmaVdbDAEiNrHqjQIA37mHU8G9pf7aaAD4ZX3XjBLo6rsdcxA/gtkcNYZLt30ACgynw==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-cancelable": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-4.0.1.tgz", + "integrity": "sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg==", + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "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/parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.3", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "license": "MIT", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "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/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.3.tgz", + "integrity": "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==", + "license": "MIT" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/playwright": { + "version": "1.55.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.55.0.tgz", + "integrity": "sha512-sdCWStblvV1YU909Xqx0DhOjPZE4/5lJsIS84IfN9dAZfcl/CIZ5O8l3o0j7hPMjDvqoTF8ZUcc+i/GL5erstA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.55.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.55.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.55.0.tgz", + "integrity": "sha512-GvZs4vU3U5ro2nZpeiwyb0zuFaqb9sUiAJuyrWpcGouD8y9/HLgGbNRjIph7zU9D3hnPaisMl9zG9CgFi/biIg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.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-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "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/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true, + "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==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/puppeteer-core": { + "version": "24.22.3", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.22.3.tgz", + "integrity": "sha512-M/Jhg4PWRANSbL/C9im//Yb55wsWBS5wdp+h59iwM+EPicVQQCNs56iC5aEAO7avfDPRfxs4MM16wHjOYHNJEw==", + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.10.10", + "chromium-bidi": "9.1.0", + "debug": "^4.4.3", + "devtools-protocol": "0.0.1495869", + "typed-query-selector": "^2.12.0", + "webdriver-bidi-protocol": "0.2.11", + "ws": "^8.18.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer-core/node_modules/devtools-protocol": { + "version": "0.0.1495869", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1495869.tgz", + "integrity": "sha512-i+bkd9UYFis40RcnkW7XrOprCujXRAHg62IVh/Ah3G8MmNXpCGt1m0dTFhSdx/AVs8XEMbdOGRwdkR1Bcta8AA==", + "license": "BSD-3-Clause" + }, + "node_modules/puppeteer-core/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/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.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==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "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/require-in-the-middle": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", + "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "license": "MIT" + }, + "node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "license": "MIT", + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/robots-parser": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/robots-parser/-/robots-parser-3.0.1.tgz", + "integrity": "sha512-s+pyvQeIKIZ0dx5iJiQk1tPLJAWln39+MI5jtM8wnyws+G5azk+dMnMX0qfbqNetKKNgcWWOdi0sfm+FbQbgdQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "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/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==", + "license": "BSD-2-Clause" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sift": { + "version": "17.1.3", + "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz", + "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==", + "license": "MIT" + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sitemapper": { + "version": "3.2.24", + "resolved": "https://registry.npmjs.org/sitemapper/-/sitemapper-3.2.24.tgz", + "integrity": "sha512-AWOmGaRyShZAoAPr4StgX0bgk15+J04J165qP6z9CpZ+8EUvmOpV0F0Gol28WbQW2prNALWFRf3X04q6lUr4mA==", + "license": "MIT", + "dependencies": { + "fast-xml-parser": "^4.5.0", + "got": "^11.8.0", + "is-gzip": "2.0.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/sitemapper/node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/sitemapper/node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sitemapper/node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/sitemapper/node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sitemapper/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/sitemapper/node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/sitemapper/node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/sitemapper/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/sitemapper/node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sitemapper/node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/sitemapper/node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/slugify": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", + "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "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/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "license": "MIT", + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/speedline-core": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/speedline-core/-/speedline-core-1.4.3.tgz", + "integrity": "sha512-DI7/OuAUD+GMpR6dmu8lliO2Wg5zfeh+/xsdyJZCzd8o5JgFUjCeLsBDuZjIQJdwXS3J0L/uZYrELKYqx+PXog==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "image-ssim": "^0.2.0", + "jpeg-js": "^0.4.1" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/streamx": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", + "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", + "license": "MIT", + "dependencies": { + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.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==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-pixel-width": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/string-pixel-width/-/string-pixel-width-1.11.0.tgz", + "integrity": "sha512-GeKuNcCza7Gf3tlMJiZY8SF1LtbFGeMUEpHifncgJn+ZcUpnoPyE69HEyb0rXrJ3bejY/M/kBylu7IDlPJD9Ng==", + "license": "MIT", + "dependencies": { + "lodash.deburr": "^4.1.0" + } + }, + "node_modules/string-similarity": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/string-similarity/-/string-similarity-4.0.4.tgz", + "integrity": "sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "license": "ISC" + }, + "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/stripe": { + "version": "18.5.0", + "resolved": "https://registry.npmjs.org/stripe/-/stripe-18.5.0.tgz", + "integrity": "sha512-Hp+wFiEQtCB0LlNgcFh5uVyKznpDjzyUZ+CNVEf+I3fhlYvh7rZruIg+jOwzJRCpy0ZTPMjlzm7J2/M2N6d+DA==", + "license": "MIT", + "dependencies": { + "qs": "^6.11.0" + }, + "engines": { + "node": ">=12.*" + }, + "peerDependencies": { + "@types/node": ">=12.x.x" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/strnum": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", + "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/stubborn-fs": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/stubborn-fs/-/stubborn-fs-1.2.5.tgz", + "integrity": "sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==" + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/syllable": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/syllable/-/syllable-5.0.1.tgz", + "integrity": "sha512-HWtNCp6v7J8H0lrT8j1HHjfOLltRoDcC7QRFVu25p4BE52JqetXG65nqC7CsatT8WQRfY4Qvh93BWJIUxbmXFg==", + "license": "MIT", + "dependencies": { + "@types/pluralize": "^0.0.29", + "normalize-strings": "^1.1.0", + "pluralize": "^8.0.0" + }, + "bin": { + "syllable": "cli.js" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tar-fs": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", + "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", + "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/text-readability": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/text-readability/-/text-readability-1.1.1.tgz", + "integrity": "sha512-lo0KlcNRhlBAxTCEPXMFricim2vJVm0xAVdy40N6WQDn+MeKDBFxl0bMdP2YIMm9ph34CPvxYO/Lxb1QIi67ig==", + "license": "ISC", + "dependencies": { + "pluralize": "^8.0.0", + "syllable": "^5.0.1" + } + }, + "node_modules/third-party-web": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/third-party-web/-/third-party-web-0.27.0.tgz", + "integrity": "sha512-h0JYX+dO2Zr3abCQpS6/uFjujaOjA1DyDzGQ41+oFn9VW/ARiq9g5ln7qEP9+BTzDpOMyIfsfj4OvfgXAsMUSA==", + "license": "MIT" + }, + "node_modules/tldts-core": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.16.tgz", + "integrity": "sha512-XHhPmHxphLi+LGbH0G/O7dmUH9V65OY20R7vH8gETHsp5AZCjBk9l8sqmRKLaGOxnETU7XNSDUPtewAy/K6jbA==", + "license": "MIT" + }, + "node_modules/tldts-icann": { + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/tldts-icann/-/tldts-icann-7.0.16.tgz", + "integrity": "sha512-WS/pPasPs2cx6orcxCcIz01SlG3dwYlgjLAnQt7vLAusTuTLqdI8zmkqbM8TWYEf3Z0o1S4BzM3oSRFPk/6WnA==", + "license": "MIT", + "dependencies": { + "tldts-core": "^7.0.16" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true, + "license": "ISC", + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "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-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "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/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "license": "MIT" + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/undici": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.14.0.tgz", + "integrity": "sha512-Vqs8HTzjpQXZeXdpsfChQTlafcMQaaIwnGwLam1wudSSjlJeQ3bw1j+TLPePgrCnCpUXx7Ba5Pdpf5OBih62NQ==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "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" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/webdriver-bidi-protocol": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.2.11.tgz", + "integrity": "sha512-Y9E1/oi4XMxcR8AT0ZC4OvYntl34SPgwjmELH+owjBr0korAX4jKgZULBWILGCVGdVCQ0dodTToIETozhG8zvA==", + "license": "Apache-2.0" + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "license": "MIT", + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/when-exit": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/when-exit/-/when-exit-2.1.4.tgz", + "integrity": "sha512-4rnvd3A1t16PWzrBUcSDZqcAmsUIy4minDXT/CZ8F2mVDgd65i4Aalimgz1aQkRGU0iH5eT5+6Rx2TK8o443Pg==", + "license": "MIT" + }, + "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": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xdg-basedir": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "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==", + "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..5157ea1 --- /dev/null +++ b/package.json @@ -0,0 +1,36 @@ +{ + "name": "crawlerx", + "version": "1.0.0", + "type": "module", + "main": "crawler.js", + "scripts": { + "start": "node crawler.js https://example.com 200", + "dev": "nodemon crawler.js https://example.com 200" + }, + "dependencies": { + "axios": "^1.12.2", + "bcrypt": "^6.0.0", + "cheerio": "^1.1.0", + "chrome-launcher": "^1.2.1", + "cors": "^2.8.5", + "dotenv": "^17.2.2", + "express": "^5.1.0", + "got": "^14.4.7", + "jsonwebtoken": "^9.0.2", + "lighthouse": "^12.8.2", + "mongoose": "^8.18.1", + "multer": "^2.0.2", + "nodemailer": "^7.0.6", + "normalize-url": "^8.0.2", + "sitemapper": "^3.2.7", + "slugify": "^1.6.6", + "string-pixel-width": "^1.11.0", + "string-similarity": "^4.0.4", + "stripe": "^18.5.0", + "text-readability": "^1.1.1" + }, + "devDependencies": { + "nodemon": "^3.1.10", + "playwright": "^1.55.0" + } +} diff --git a/public/lighthouse-treemap/treemap-1758885492002.html b/public/lighthouse-treemap/treemap-1758885492002.html new file mode 100644 index 0000000..027dd23 --- /dev/null +++ b/public/lighthouse-treemap/treemap-1758885492002.html @@ -0,0 +1,2897 @@ + + + + + + + + Lighthouse Report + + + + + +
+ + + + + + diff --git a/public/lighthouse-treemap/treemap-1758885890915.html b/public/lighthouse-treemap/treemap-1758885890915.html new file mode 100644 index 0000000..b22768f --- /dev/null +++ b/public/lighthouse-treemap/treemap-1758885890915.html @@ -0,0 +1,2897 @@ + + + + + + + + Lighthouse Report + + + + + +
+ + + + + + diff --git a/public/lighthouse-treemap/treemap-1758958684569.html b/public/lighthouse-treemap/treemap-1758958684569.html new file mode 100644 index 0000000..00d5467 --- /dev/null +++ b/public/lighthouse-treemap/treemap-1758958684569.html @@ -0,0 +1,2897 @@ + + + + + + + + Lighthouse Report + + + + + +
+ + + + + + diff --git a/routes/auth.routes.js b/routes/auth.routes.js new file mode 100644 index 0000000..3976890 --- /dev/null +++ b/routes/auth.routes.js @@ -0,0 +1,18 @@ +import express from "express"; +import { signup, login, changePassword, forgotPassword, resetPassword } from "../controllers/auth.controller.js"; +import { authMiddleware } from "../middlewares/auth.middleware.js"; + +const router = express.Router(); + +router.post("/signup", signup); +router.post("/login", login); +router.post("/change-password", authMiddleware, changePassword); +router.post("/forgot-password", forgotPassword); +router.post("/reset-password", resetPassword); + +// example protected route +router.get("/profile", authMiddleware, (req, res) => { + res.json({ user: req.user }); +}); + +export default router; diff --git a/routes/blog.routes.js b/routes/blog.routes.js new file mode 100644 index 0000000..0ca6d09 --- /dev/null +++ b/routes/blog.routes.js @@ -0,0 +1,54 @@ +import express from "express"; +import multer from "multer"; +import { + createBlog, + getAllBlogs, + getBlogBySlug, + likeBlog, +} from "../controllers/blog.controller.js"; + +import { + createCategory, + getCategories, + deleteCategory, +} from "../controllers/category.controller.js"; + +import { + addComment as addCommentController, + getComments, + deleteComment, +} from "../controllers/comment.controller.js"; + +const router = express.Router(); +const upload = multer({ dest: "uploads/" }); + +// ======================= +// Blog Routes +// ======================= +// Create a blog +router.post("/", upload.single("image"), createBlog); + +// Get all blogs +router.get("/", getAllBlogs); + +// Get blog by slug +router.get("/:slug", getBlogBySlug); + +// Like a blog +router.post("/:id/like", likeBlog); + +// ======================= +// Category Routes +// ======================= +router.post("/category", createCategory); // Create Category (admin) +router.get("/category", getCategories); // List Categories +router.delete("/category/:id", deleteCategory); // Delete Category (admin) + +// ======================= +// Comment Routes +// ======================= +router.post("/:blogId/comments", addCommentController); // Add Comment +router.get("/:blogId/comments", getComments); // Get Comments +router.delete("/:blogId/comments/:commentId", deleteComment); // Delete Comment (admin) + +export default router; diff --git a/routes/crawl.routes.js b/routes/crawl.routes.js new file mode 100644 index 0000000..1262c1c --- /dev/null +++ b/routes/crawl.routes.js @@ -0,0 +1,6 @@ +import { Router } from "express"; +import { crawlHandler } from "../controllers/crawl.controller.js"; + +const router = Router(); +router.get("/", crawlHandler); +export default router; diff --git a/routes/lighthouse.routes.js b/routes/lighthouse.routes.js new file mode 100644 index 0000000..d24e133 --- /dev/null +++ b/routes/lighthouse.routes.js @@ -0,0 +1,8 @@ +import express from 'express'; +import { runAudit } from '../controllers/lighthouseController.js'; + +const router = express.Router(); + +router.post('/audit', runAudit); + +export default router; diff --git a/routes/maisondetreats/cakeOrder.routes.js b/routes/maisondetreats/cakeOrder.routes.js new file mode 100644 index 0000000..7d31960 --- /dev/null +++ b/routes/maisondetreats/cakeOrder.routes.js @@ -0,0 +1,12 @@ +import express from "express"; +import { createCakeOrder, getAllCakeOrders } from "../../controllers/maisondetreats/cakeOrder.controller.js"; + +const router = express.Router(); + +// Create a new cake order +router.post("/", createCakeOrder); + +// Get all cake orders +router.get("/", getAllCakeOrders); + +export default router; diff --git a/routes/message.routes.js b/routes/message.routes.js new file mode 100644 index 0000000..18ec256 --- /dev/null +++ b/routes/message.routes.js @@ -0,0 +1,12 @@ +import express from "express"; +import { sendMessage, getMessages } from "../controllers/message.controller.js"; + +const router = express.Router(); + +// POST /api/messages → Save a message +router.post("/", sendMessage); + +// GET /api/messages → Get all messages (optional) +router.get("/", getMessages); + +export default router; diff --git a/routes/payment.route.js b/routes/payment.route.js new file mode 100644 index 0000000..b7eafe2 --- /dev/null +++ b/routes/payment.route.js @@ -0,0 +1,14 @@ +import express from "express"; +import { + createPaymentIntent, + createCheckoutSession, + handleWebhook +} from "../controllers/payment.controller.js"; + +const router = express.Router(); + +router.post("/create-intent", createPaymentIntent); +router.post("/create-checkout-session", createCheckoutSession); +router.post("/webhook", express.raw({ type: "application/json" }), handleWebhook); + +export default router; diff --git a/routes/sitemap.routes.js b/routes/sitemap.routes.js new file mode 100644 index 0000000..0ba998d --- /dev/null +++ b/routes/sitemap.routes.js @@ -0,0 +1,6 @@ +import { Router } from "express"; +import { sitemapHandler } from "../controllers/sitemap.controller.js"; + +const router = Router(); +router.get("/", sitemapHandler); +export default router; diff --git a/server copy.js b/server copy.js new file mode 100644 index 0000000..6aeb5a3 --- /dev/null +++ b/server copy.js @@ -0,0 +1,237 @@ +// // server.js +// import express from "express"; +// import { Queue } from "bullmq"; +// import { connection } from "./redis.js"; +// import crypto from "crypto"; + +// const app = express(); +// app.use(express.json()); + +// const crawlQueue = new Queue("crawl", { connection }); + +// // Start a new crawl +// app.post("/crawl", async (req, res) => { +// const { startUrl } = req.body; +// if (!startUrl) return res.status(400).json({ error: "Missing startUrl" }); + +// const crawlId = crypto.randomUUID(); +// await crawlQueue.add("fetch", { crawlId, url: startUrl }); + +// res.json({ crawlId, message: "Crawl started" }); +// }); + +// // (Optional) Check progress +// app.get("/status/:id", async (req, res) => { +// // For now just reply with "in progress" +// res.json({ crawlId: req.params.id, status: "in progress" }); +// }); + +// app.listen(3000, () => { +// console.log("Crawler API running at http://localhost:3000"); +// }); + + +// // server.js +// import express from "express"; +// import cors from "cors"; // ← optional but recommended +// import { crawl } from "./crawler.js"; // ensure crawl is a NAMED export; if default, use: import crawl from "./crawler.js"; + +// const app = express(); +// const PORT = process.env.PORT || 3010; + +// /* Parse JSON BEFORE any middleware that might read req.body */ +// app.use(express.json()); + +// /* CORS (adjust origins as needed) */ +// app.use(cors({ +// origin: [ +// "http://localhost:3000", +// "https://your-frontend.example" // ← replace or remove +// ], +// })); + +// /* Safe request logger */ +// app.use((req, res, next) => { +// console.log(`[${new Date().toISOString()}] ${req.method} ${req.originalUrl}`); +// if (req.query && Object.keys(req.query).length) console.log("Query:", req.query); +// if (req.body && typeof req.body === "object" && Object.keys(req.body).length) console.log("Body:", req.body); +// next(); +// }); + +// /* GET /crawl?url=https://site.com&max=50 */ +// app.get("/crawl", async (req, res) => { +// try { +// const { url, max } = req.query; +// if (!url) return res.status(400).json({ error: "Missing url param" }); + +// // validate & normalize +// const target = new URL(String(url)); // throws if invalid +// const limit = Math.min(Math.max(parseInt(max ?? "50", 10), 1), 500); + +// await crawl(target.toString(), limit); +// res.json({ ok: true, message: `Crawl started`, url: target.toString(), limit }); +// } catch (err) { +// console.error("Crawl error:", err); +// res.status(500).json({ error: "Crawl failed", details: String(err?.message ?? err) }); +// } +// }); + +// /* Global safety nets so crashes don’t become silent restart loops */ +// process.on("unhandledRejection", (err) => console.error("unhandledRejection:", err)); +// process.on("uncaughtException", (err) => console.error("uncaughtException:", err)); + +// /* Bind to all interfaces so remote calls work */ +// app.listen(PORT, "0.0.0.0", () => { +// console.log(`🚀 Server running at http://localhost:${PORT}`); +// }); + +// server.js +import express from "express"; +import cors from "cors"; +import path from "node:path"; +import fs from "node:fs"; +import fsp from "node:fs/promises"; +import { fileURLToPath } from "node:url"; +import { crawl } from "./crawler.js"; // crawl(target, limit, onProgress?, options?) + +const app = express(); +const PORT = process.env.PORT || 3010; +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +/* ------------ Middleware ------------ */ +app.use(express.json()); +app.use(cors({ origin: ["http://localhost:3000", "https://app.crawlerx.co"] })); +app.use(express.static(path.join(__dirname, "public"))); +app.get("/", (_req, res) => { + const viewer = path.join(__dirname, "public", "crawlerx_viewer.html"); + return fs.existsSync(viewer) + ? res.sendFile(viewer) + : res.type("text/plain").send("CrawlerX backend is running."); +}); +app.get("/healthz", (_req, res) => res.json({ ok: true, time: new Date().toISOString() })); + +/* ------------ Helpers ------------ */ +const ts = () => + new Date().toISOString().replaceAll(":", "-").replaceAll(".", "-"); // safe filename +function attachJson(res, filename, obj) { + const json = JSON.stringify(obj, null, 2); + res.setHeader("Content-Type", "application/json; charset=utf-8"); + res.setHeader("Content-Disposition", `attachment; filename="${filename}"`); + return res.send(json); +} +function isAbs(p) { + try { return path.isAbsolute(p); } catch { return false; } +} + +/* ------------ Crawl endpoint ------------ */ +/** + * GET /crawl?url=https://site.com&max=50[&stream=1][&download=1][&nostore=1] + * - stream=1 : SSE live progress (no download) + * - download=1 : respond as a JSON download (attachment) + * - nostore=1 : ask crawler not to write files (if supported by your crawler) + */ +app.get("/crawl", async (req, res) => { + try { + const { url, max, stream, download, nostore } = req.query; + if (!url) return res.status(400).json({ error: "Missing url param" }); + + const target = new URL(String(url)); // validate + const limit = Math.min(Math.max(parseInt(max ?? "50", 10), 1), 500); + const wantsStream = + String(stream) === "1" || + (req.get("accept") || "").includes("text/event-stream"); + + /* ---------- SSE mode ---------- */ + if (wantsStream) { + if (String(download) === "1") { + return res.status(400).json({ error: "download not supported with stream=1" }); + } + res.setHeader("Content-Type", "text/event-stream"); + res.setHeader("Cache-Control", "no-cache, no-transform"); + res.setHeader("Connection", "keep-alive"); + res.flushHeaders?.(); + const heartbeat = setInterval(() => res.write(":\n\n"), 15000); + const send = (obj, evt) => { + if (evt) res.write(`event: ${evt}\n`); + res.write(`data: ${JSON.stringify(obj)}\n\n`); + }; + send({ ok: true, message: "Crawl started", url: target.toString(), limit }, "started"); + + let finished = false; + req.on("close", () => { clearInterval(heartbeat); if (!finished) console.warn("SSE client disconnected."); }); + + const result = await crawl( + target.toString(), + limit, + (tick) => send(tick), + // If your crawler supports it, this avoids writing files during SSE runs: + { persistReports: false, collectPages: true } + ); + + finished = true; + clearInterval(heartbeat); + send({ ok: true, done: true, result }, "done"); + return res.end(); + } + + /* ---------- Non-streaming mode ---------- */ + // Ask crawler (if it supports options) to avoid writing files when nostore=1 or download requested. + const preferMemory = String(nostore) === "1" || String(download) === "1"; + const result = await crawl( + target.toString(), + limit, + undefined, + preferMemory ? { persistReports: false, collectPages: true } : undefined + ); + + // If caller wants a downloadable JSON file... + if (String(download) === "1") { + const filename = `crawl-${ts()}.json`; + + // 1) Best case: crawler returned in-memory data (no disk IO). + // Use whichever property your crawler exposes. We try common shapes. + const inMemory = + result?.jsonData ?? + result?.pages ?? + result?.report ?? + (Array.isArray(result) ? result : null); + + if (inMemory) { + return attachJson(res, filename, inMemory); + } + + // 2) Fallback: crawler saved a JSON report path that we can stream. + const jsonPath = result?.reports?.json; + if (jsonPath && fs.existsSync(isAbs(jsonPath) ? jsonPath : path.join(__dirname, jsonPath))) { + const abs = isAbs(jsonPath) ? jsonPath : path.join(__dirname, jsonPath); + res.setHeader("Content-Type", "application/json; charset=utf-8"); + res.setHeader("Content-Disposition", `attachment; filename="${filename}"`); + return fs.createReadStream(abs).pipe(res); + } + + // 3) Last resort: send the entire result itself as JSON. + return attachJson(res, filename, result); + } + + // Default JSON (inline, not attachment) + return res.json({ + ok: true, + message: "Crawl completed", + url: target.toString(), + limit, + result + }); + } catch (err) { + console.error("Crawl error:", err); + return res.status(500).json({ error: "Crawl failed", details: String(err?.message ?? err) }); + } +}); + +/* ------------ Safety nets ------------ */ +process.on("unhandledRejection", (e) => console.error("unhandledRejection:", e)); +process.on("uncaughtException", (e) => console.error("uncaughtException:", e)); + +/* ------------ Start server ------------ */ +app.listen(PORT, "0.0.0.0", () => { + console.log(`🚀 Server running at http://localhost:${PORT}`); +}); \ No newline at end of file diff --git a/server.js b/server.js new file mode 100644 index 0000000..ae301e5 --- /dev/null +++ b/server.js @@ -0,0 +1,80 @@ +import express from "express"; +import cors from "cors"; +import path from "node:path"; +import fs from "node:fs"; +import { fileURLToPath } from "node:url"; +import dotenv from "dotenv"; + +import crawlRoutes from "./routes/crawl.routes.js"; +import sitemapRoutes from "./routes/sitemap.routes.js"; +import authRoutes from "./routes/auth.routes.js"; // Login & Signup endpoints +import paymentRoutes from "./routes/payment.route.js"; +import lighthouseRoutes from "./routes/lighthouse.routes.js"; // <-- ADD THIS +import messageRoutes from "./routes/message.routes.js"; +import cakeOrderRoutes from "./routes/maisondetreats/cakeOrder.routes.js"; +import blogRoutes from "./routes/blog.routes.js"; +import { connectDB } from "./config/db.js"; +import { mailer } from "./utils/mailer.js"; + +// ------------------ Load environment ------------------ +dotenv.config(); // Must be first + +// ------------------ Connect database ------------------ +await connectDB(); + +// ------------------ Express setup ------------------ +const app = express(); +const PORT = process.env.PORT || 3010; +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +app.use(express.json()); +app.use( + cors({ + origin: [ + "http://localhost:3000", + "http://127.0.0.1:3000", + "https://api.crawlerx.co", + "https://app.crawlerx.co", + ], + }) +); +app.use(express.static(path.join(__dirname, "public"))); + +// ------------------ SMTP verification ------------------ + +console.log("SMTP Host:", process.env.SMTP_HOST); +console.log("SMTP Port:", process.env.SMTP_PORT); +// ------------------ Routes ------------------ +app.get("/", (_req, res) => { + const viewer = path.join(__dirname, "public", "crawlerx_viewer.html"); + if (fs.existsSync(viewer)) { + return res.sendFile(viewer); + } else { + return res + .type("text/plain") + .send("CrawlerX backend is running."); + } +}); + +app.get("/healthz", (_req, res) => res.json({ ok: true, time: new Date().toISOString() })); + +app.use("/crawl", crawlRoutes); +app.use("/sitemap", sitemapRoutes); +app.use("/api/auth", authRoutes); // Login & Signup endpoints +app.use("/api/payment", paymentRoutes); +app.use("/api/lighthouse", lighthouseRoutes); +app.use("/api/blog", blogRoutes); // All blog/category/comment routes now prefixed with /api/blog +app.use("/api/messages", messageRoutes); +app.use("/api/cake-orders", cakeOrderRoutes); + +// Serve uploaded files +app.use('/uploads', express.static(path.join(process.cwd(), 'uploads'))); + +// ------------------ Safety nets ------------------ +process.on("unhandledRejection", (err) => console.error("Unhandled Rejection:", err)); +process.on("uncaughtException", (err) => console.error("Uncaught Exception:", err)); + +// ------------------ Start server ------------------ +app.listen(PORT, "0.0.0.0", () => { + console.log(`🚀 Server running at http://localhost:${PORT}`); +}); diff --git a/uploads/2176fe75251a06cf07a08e32a845b537 b/uploads/2176fe75251a06cf07a08e32a845b537 new file mode 100644 index 0000000000000000000000000000000000000000..f20633e285d569501f57d2835a1e93391ba24b14 GIT binary patch literal 35300 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%0A(si>dSN0HVF)|TD36WrROpfXR* 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%0A(si>dSN0HVF)|TD36WrROpfXR* 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

K0rp0iH%mGoD94ty#W*eXI*g8VSJ*=_x{$u@oF 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 literal 0 HcmV?d00001 diff --git a/uploads/866ff6699ca2b462d73b20c4d150b2e0 b/uploads/866ff6699ca2b462d73b20c4d150b2e0 new file mode 100644 index 0000000000000000000000000000000000000000..f20633e285d569501f57d2835a1e93391ba24b14 GIT binary patch literal 35300 zcma%gW0fZQHhOK4aUqJ(G8n{c>fKY_jJ^>+Zg~tLt=ESKUgI zVq#kn008QuLJDdM90YU!lo4)#asa9P!3P2P0{AkeNQo(`3Yk199S|VR?Vc*T-)H*> ze#}`l{P0u(&)83j)%k!!l}!tQ^Qq{^_oDnVhWV;Lk2BW$+65hd%foEgtQ6*UxgE`+k`dwIAf~b`O60e@484-s|r8kNXCFH~qqY2Tpcx z^*4V^ye;?q4!p5`?BD91{SNsZ`o?~ae4c-af7mzkD*1(6pughYZ$I@XXYcqsb*lH^ zpLVbLZ+{1WUVm%e!M^Zceo}pJf2Mxw-unFc&-}LhR(z&>$oKLt^P2Sm^8WfY{jUDp z|41K@f8+oBGmiHA^4t2i>pQPM?{W9$_w{%D)A{%J74x&__jeok<@ERWyI_L5>%WXn zOb^*`4i?9ecN#g=`U5|1Sfy%R)UGHF`tA1fhnkLn=+a%HU8+l;$G)YNFN_&Pm+mxg z%Q=b%jhyZOFCLKTB6tLVQ|#2A7mLjs?>Ml9JojWjBE( zStF&{NF$o=r^Yu-itC{hsTW_7oxiC3FQb^<-(hAHCYvU}pvT0l?$2U@knu^JWvv%< zW3J{dCS=R1?D~1i?%popVFVlyl2lnEvL0xbgKfx74y0!v%N(T2Nku2Qoar2M!Myeh z%h0Hwd`73Vz2<*O$bah;N*e2)LZA))E;T=744Q*~KcQAluh+QmI`a;sESFUvst;e{ zl`(xIyA>w+LhUN7SZa>X^|!2nK%lq{qtEaWlEW(N$mVWQk`~!ECzAi#Ss2cTTO+9X zLEFIG!cIj{6b#IZjhdu}6G3S7O77-gaMHJKo6vHO!Tb*kO(X7zr-!u52DQD%$*t{? z1fU;8s*B@!t9YNmA?|l5i8_T!fTJKg(GGdg06nku9VUxfR-MpiFc3YckTVHZM_I0( z-riagV03$c5c%{gyxBlN!)*4@4J>AK?pQAFkivLar)JR+Q)Fhnnye4lvz+u5g`#Rb zyO#!OIOi*oJ&vxnQb2w>fPX)Jjl41^vJl+VWuU3(2cVC>V&s!?>Ql5#NSpt|=F znoa&e`l$;kZNu-N3*HVE91F}Ag&S6xQ(jYtUB%MLHtHDvNlTTF2Qbb2bY7o<9C-9a zWM=qk{NdO0Gn7bFQr=d*&fAuU!Y6S( zATB~^_Ptq1{brce(cTLefr#3{*@d`d8F~~San#0{vlKAFi~1^kEWTivNI9_C=e>cq z32whndF2+`^zYT&XQq!diK!Vyh|ayC`mlz-He|@>t!-B-C@mO!`((U!`e_#HIM() z#AsDBXt2JIYuZ8B?%1(47@!Tqq5PVNQ9-9$7W*IK|C5@omo)!bak((!JV{B)0m=e(dx7W<>IP$!3kooVH(aCja-FC)DcjGo* z)X{8o0so|C>8v~LEo$hL(LkyZfq~9E*?`_vx?@TH#5L&PNq^rszx-`wg|mW6%1p6H zYYOzU##h*B8caW_pg8hUEZAG}$;+KY9@t_8uYNZR&dFj5m>KOWdqUnlvRgk5{C6sw zNv~&IDsy}`aChbBNFkBp)`G>3T^U;)8w1x*F>IZU#H@*aW(jc>_I-!N5Ww?ezpF9U znK$4P=Oj#R^9gRh4FtnhxpLbM9?Hzfs{$F3Ct_d71JfcXdjyV1dW~?m|HyvbsDPDZ1n~CrP788>5?&(=fs&2<@LBdehAJL^5%- z7(y=0(-86!J$0(2|b8{Hanbqg0hMQbmFkQSXoMyK6ol^iYK-kTL^RDBJ zm=Nk$nD!XdzGAFi5uf@jRT5b|J2Mp!0A>OT@418~OKB zO*T22c?B(NFLw*9;4L4LrY6mZ5Q+z|((reKZ1`PWW=5(7y+^^p z$wE9rY$ZkaqhA}?RY*KlvBtKj&ID}cNiikD{)TDNe?G9dhc&%h0 zrAQ(*zQdbZG@H>R#7ahqe{76w*BEqNXUVAPco;9pV6S34-P-%yhhoL)s7F7O)b8e{ zk#I6s*vI*XzyW(S0j&sn&1~?mUVqscm%hVRx@(@1+rMCsE5QWClQ={F5z)DJA78}@ z0yMfH13KR)$KKI~&~il$cvE#k1CYi4H})gjO!4@U9J=Z}oyN;8<9HR#Rt6<_xxge}`iGOt*6n4$$n*VKFpz$uUs)Lpex0R))`2o2tJSir( zh0URzB6*8cRh5};8eE%fJB)P_qBT@cyehe1ux@W73*XZAd#aBYG@KcC$g9P+(HJ?;r zn$OMRvRB2;b46|5_H5h^BdIjK_k6(dGAeo^`;w`Gq{Qk`l&!WEdj4f!|Bq`P5@-33 zE4K@>Z?au4%;W8hDd2onm_{04`H5a;1)Z{?8;|0{-P149)s74cangf!@-X%LdLND4 zY~md{K3P4a?1*|xNQ|BcjQ${pTQ%xN$-7ROtZvh5``qzSLKL8cYAT7z|6J&O}mT??l} zlFRlPvzYf~X^40{6w-O%M9rR*2ny~hI)*G2*22|6M9(M!>|q7`zY3#FP8-|{kn0Zw*?^^jlUubca^6)5<*Yj9NOX!@Gbv94hIM=(Sh zDR!dK6NmsDj9{;>Wh=Q@#s&?z;aihBB7~=Hb_7NI5dy4??v|TCz~N+7)1^8~wo%zU z4s~%laDn8}!cgEBh|DrbJA7u^AtIFgyZY6|Ip>N$J-`=`&KoNamy#Lif(3 z&kLx_)@0d@x8M`8?gDn25xd?1yWR7@jqE}gkuP!P@mKMvUsKh?U_;NjA)1KSTj+{uvUmnJ{4<@#VhIs& zYk(Nm;{8P!cqZKccnFDPg(!#88WYP0j_L-oLb0j&X?wlu_LaUzq6)1x7d~_)`IjxR z;!C%`mn8Ye>0x$BkYrg^edBDEK!c}q>$t%%zmDc z3D^6d$YB=_EFU0@c&P!Eye#5y?>9Rcp!#`|eqObNMTtm4*O3V#0u`g3*AqMusV&X~+wtr$!hUwsy^D!7Ab@)U2ea2yqz z&9U5kCmM0y6_zj}&K}Vzu@=}&u#=joL~^8&S;tjn@=0&{BZd8a> zi9_4Jm~WpT4#>5n1JL=&1iptMGv)=9CXJUxTus-`3{i)zv~k;OMp#s{aD+*x5(b^5 z#N3BBYNSf6k&eClLT8%Ys zAELIcw9UexI-k!k6b*SN~?MaD3< zK2trE!y!?RIA#zjwRwlBHW5B00=9O}Q_;#u51kUAEI#4JTP`>A*S1>B1rPe==QFRP zE@y#z25tJYz?SFATbzz@)_aXkC+&_U3SybB&i;`Zobx0 z#nj~PM$|AbgEkgiHNA3C^9215qw23u=JPJE3in&0R`Kk4urL#t>Ftb8$l(PD5%cAr zR>e-h!kuye(Xyfvt_TIM0kZJtcv4meK+eyb7O7>F(daN~EDmdAWV|xwkl76I zpg-`yQ94PCW2Y}L74p7%c@2Ca8p*@;m+^8MVeyIgRsS-o|7RZUlGHvWHX}irIia&v9dq_4VmySS&k$!|`dWnLKu5Z3G?U}*HG%ZN=Z*iVSE`aqN$VJD@%k2Iw)$oU&Pl^tIF@V_~I|G@*y zii{%-v5I+!sgOtMYy_%Y();u~qmy}_8l5yAq+qN{@+oxj7D^?Ae2Sz+9>(R1TiFgr=k3zlf&^-=K0C(f+ z5okLHsMGupbN?@usFSu3RTU~4V>P@2ANwvu9gVCqfuf|^+WZ`8z2afmpZ8wP;MEq7 zuMgR66BAkQsb4v=i@>gC>OMBx;!#9hEWAc`L&?Ig;-;XzM_etDDci{ zmtjR5PThqmWd==F`=VX^*TMfhTF?;Jyz)->L0;xz81%)&V!DfN64fGNkeEu;jmlx& zAGsqB|9iR1gJXtF>XLySR%lyLH%RrTezA9?(vlnXR$4TRdBd2$)@*?Kp)zz8~-oZFHa;e8PMOqcURIqoEAFH|gLv`0cSK$Fz}E1Cwi z1HlyJJTSq7L6ylnbhQi{<;>>H|Nr3gC9~)TDE_RF6e=%kyX-S*KF7#hF%f2%VVD7d zo!#8c1lkaG<}8V}Lgj5rH6-rUDV_A1+hI>P;n)9;+ptR|Rf6*tA?+Uh!3* z0SV{bQ$c{i-Hyq*uqyNGBvK#4$4#~70>tV!MMA6O-^JKM1yTh6D4AL=p@{iEg`}`R z%Z8T7F-sQwb-k!lbACNX;Y1St&#sgk4-V~Gn6ZB{m20f|NAv~&Hyhx+&@vc`!`@jm&4vGHK+oPDV zZ;Dgfqeo~Lk1MT!Sa5@A-9a=r0P9E%Pky^+8CrprJyaZN#D5;m3t4!13>>@ zf7^b>naJ&anI+<9IpohEgYRywuu{Y!V*m@sBMz?MSKtL|Izj6HkUZ+EakDgr14B4< zlNe}f$Di)`I!19AfGArnVe|@hBF;FiTIsqZE5FAUZA$yTYW*8p7id$nWFuh-4nc%w z`n_&^tqc}Mh?LKDLVxv$xJ;P~-VPE?F+yAV6s~UHA4xq)aI!B@U>!Kr)vep>6PS90 z*5vNf!WAl$!z;fL+m7W7#gj_@f8ON(w7AFK^=w@-Gn1r%VO$?Yl6u{oRcKe`R6IUs zf);PA127WF(y5C04m#aee2(=_ZJE9Pq5Go#GQ2lQ6|s9rCno^3DU=>`B(N_gDxNxO z=|B^M8tny9R(M0SRLa%Gk8?Zqkc6M36#B)TzRfW=#K(LaXmv>LhcL$aWBP`Jio?yC zUBF%{Vc$f@8d`B2Xhs>pk>~ykc5C<^>i*<+k(3iTe7K`CdH6U+@~hgXVSl_MZcQD0 z(w-(Vd5?zG^Pel~-@cqc8o6$}wskvU`6}ow_#DW*$d;R`BO3f{QRmzs0`EuaPr>?G zZ5L(sUiPUxczBlX>cj!^LC5UwIYin;pkh8kA^TIIi7q@wi@SOXC^w^L_hfFwKim}y z>;e4z{A7E%8CX%5Mr73lcPcjn{5zn?5V@AWIiv$gulZPae?CzI{YbjifY@1U*Zf%HUC%q}l}Fft%y=Ro~$r1<_l`uuPq&w+2Fr3kR|(mr$H?Cl6_@@ZoA3 zvD9@p5u^L^$rVkV@%n#pqn~PRe1Gg2kTk6W^=+yO7w7=LS29c}5KTf<*J|3yHtIH>Q!4XSn+D@Com)X@7GnVBH~|i^AwjfeA(F zDS2NsY^~ROguUk{2|d8(0@^q{LmTtjXT1;N6XPns9X>34!Ch%XaYL<)$Vko2r_CKn zO5}Qe4tBfn5~3k5D?yUt2l;=l&LQrM zT-p$D%!)AXbpQS>cYq}>qiaxzlk&=zV|hdNqTzxtPhEzaqk9-ZWD}?SM!g-aGv9;# zpV9+lDV{BJ%XXh3S-ZHyh?LN9C_H{^MGRUK0RQN=yC>#sHT)f@h?WHzCqLMQLIa%+16>#BcqAjL`H!T`U#&R$_%V^rI<`JU)i zW=s^?lAv^%5#FjBGEGBoRMfCHF~4o5vsoF482xl7n((Q_j_lC3n{&+Y%G@ zT5&ap@-NN-03iM>Z!hVp3>JBAuPN;vks&z|zD1{tA5^1*NVb7( z(X!w}B1Zff*PgCA+Y68zyyqlzzy`Tl_@H2~tX!R=>1+r-7B2TCe5u+5iCGKY`Oxe! zHS_#CRugeFOC3nI>dAf4Q4AUvJ(mh?*zZABw_S!D>994w!*Q#aQZDP8D<|w{L^K;f zwZgytcZKV$6dr}-=0Nj(DQK#0Adi7HsV|GXR7&|1zK)EQV)K#$!m{qATBzN9*nmny zg4Eb8Uunl{N}tP?HAg(u)JE`TSx9AV z?LGxIP~s20(fIji@~U!{-_K+(VA2cJ3%V|$6|YP>K%x8I-j^qg^PudQ)Qk#rK6Y=+>`sQeaO_!> zJ4fH`2(Q;SLK{&RlX~3@Hc(MK0(ugQVB|rftxnEyz(`$^M8H>M_|wGk?=dAm0a5F5 zd;seEV_lr-?!D=2(l^-}ssb-S$DA#lo_!Mjkzz}1RGDW%?Zs2ET#nUVTt!MGG|CnC6uj}bS3Seayy8tc~WAL%E}%3+O{CQ z5b8l_@E!6qQC{y< zbh@!grjeX6MqI!f!E~uKO!D`{w|k(?mw^Sw70aztB8R87_YL21a!%u6YZ|sb<7tdM z9S7s_;t35>jpc3gx<~Rvo8-pDnot^qyrIY^;#0(Rl33%Vu!PNr`eztOR{mnf1JuwA zxqUC+a z+L48;K3F&a0Qsrl{`69HGQ9}P_(%=(B;PjqJ-x!eu@YF_!wU6;t?c#DwE~>WNNU@d zEba6Y_c%+S@qS5A1})%TpyJ@$>2b{oXey+b8DcUA9Epkw*q)IhWCuA)l9}URmO_Xr zy;^?dd44fz7Z|JSnn|Yi&&!91TfZZTe&HiWwtimpJLp^|_2j2H^*_&)BDj}K0xaq| zhQwPIceHmzXCvIWL`dJ0z-p~rkR$>+7vM3Zo*v_~X7`0_ZkjF2l+Ge2T!4L~qcTjD zqs4-oh`5)g%IC&RO-c^)=O&oJ&%}MleiN(=7TnLG-7%x-fo$HH&@Ie?U;_QP^nT3s zDaHb_Bw**6*W08OKZ~#g?t^YKom$T(W_wj%!v+{YTkg0y2|#XN*{};ZHW7we9%F0n zqnawJH**UvP=^JrJCu`U0miy~zyKt{HEs6I7pZ})Iu|g}#Y9wlDRpRA`Pq51gz*-T zuuN+t1^c;xAM%?GcY`Dv6Fg0MIv&E~rat8n)IJJKicin95@)j6{c6dco2>~ODsx#{ z$OTu)!qgH|P#);-OM@-e;*btka_d$!O44bsW^KSX_+ZV9)2L%7pIgsH3pt-R9YaBT z#;G=83IejZ#m=X3$2n3USy3IDa+LTaKN3TRAnOVK+0)p^;Y%{{i>zmM^;qrnJ<6|% zcSUz3%N++x{f{wC>?RnC3^CN^q%{N55#ggCyl!)3LF$mOOQ=;qG~uLozewM`VA&Mu zK*|#R50UW!JmwjutvyP9Fl#|>4uo@-lpub*xl8)d{92frSFX?^*c)f4qdH|d}xjWgx_GJ);Dv_S1z*(ky< zJbwpCf6-IP%hdl!FpI?TaVDT~j)8$YOpW*}QC*BakJL(8gG0s_a+2jS&wU_=7qGKg1raNijKq9Z29Ziz&-R zeFYI1SldK$;nP6fuG&PkvO;I~G3$FGu9szWl~4e!RoKA@!vVGCY{w^iEA~c@;;GoK zWZr8tZ>igI$xPI}gKPjv&e_wU_!sUPrYup_A3gMHlL66NdaRotoe0gV=Ailu#FCw~ zX;F;cs7>C0-I;~Br~jHWVG(u%qJ3^4Fa#YRL#W|$o!1$=-TU;fdO$u@xauaF@+%Cj zqQGVmZcx6}iKLQdM2>F<0h(X@QbJj6bv2q$(8!5Kt@Kghf=9tji))bdB)Q0Bjxg?Y zf2R!e^k^rK%M2_F=Q&F2=PwiAw$#XJUS<;|!+<_vl|39wbXI|gFbaDxT02CGs#FdQ zd}Rzn3BOJMJ}#-!A3y5@dF}OJirzA??n>g6Jqr07SgQ8A6=1vB=r_YFVNY0TYP_T0 zWJZ9ex!B-5b5goT!J^jrXe;wW)fZ@8sp2~+=AU-)OJQ6kX>J@{j6&AMJ8p26dhzSZ zm=`YLJ+i$MIzj4DvTJH{@H`u|g{$B`j4FvQ!l@3b0z)3EuZ>p2V_=K;(}rwuetM9u z#aBrlnInN%h_S#2R8~j!yZj$c^=^Y5PgITe$p@$Lh7`KM5giUP~)Ffv#k zVVtqqzaeZe!}bN?1{&3+^}{_wC&B{VK+F}9SygPi^qRZf!b`=uen*374_D6rSR_Nm zFRj~JXOj6K1vNn-u5H0ReRqq{rVkp{k>Wix^xIEy`faoAf(ROypbaDmxs3w()dq-aJ3zx9dG8Gz2eo=V zKex;uDGmFjBgAtJ#oP??o_CmAz2=~}pWqaeqf&q5+c1oy4jnfMt`;(YdG?Wyr8xLp zfr5jET65x1?ZXs|B7Djqes{krZ}C**Qit6$g>Rmh_ZH`V!4z)F$^H`FS`lufPBQLI z0X=qoizs_QjiZN$z+8%bn4U+UZL4iYXceQmE-`C^D0eMR=J1j$6;Xk6`*?_R!-EKe zlhM7Ms7+nEd8r>s?W_X+Kmk<*psmXGK+2EAC`O2eE?>+KOZ6ut8`xJo-0P1F72R+{ zW@o@vc|{fTGJ#au{QBa30zRj(m2v9u-lv$#S+xn|FEs;zyT&#i6}4uBwQ1?t^>J+> z_HL6j38<9ylmlN_Ltazgp0OVekRX9^By%kEoW!|M`XCPWni|q0^^oiT2A92RXU8BP zK`EN8u=gOlUW}3DEGW45vOrg1J9Jo4MN1||6)w8wAEHON^x{Bdt_#S=$S=E$PY@(4 zOpcT#6|hI^{VK!H#AsK-SKD@8IwY#SXmR^pm$`?y@l1b+axW*T944o(`D%R(U#30= zeXa+2%?zP#Bj1d}QzZ8(f8+?)srtf$TenLbFt*ccd->l?-KX5RZO>4JD^y3l^Meq% zul?u(G80=YTqt`=ZolI*4WOd$m8{;Zq)ZHmWDCmK(piI2+q{<791PNe4r=iv*$I)q z(~N#Y%I*=DbJC?2rDKgyr7}e0bDJJs$>i6E&5rpPqgxu#^q!=zObIblbVcuBHZck2 zsoUyxE$%X}J{OhS;#M()in&vIAax=?8Q~-5j_U3UzwbJ29@ns{w|=<#Jo!Z3O!-;} z`yiY>A=ROu<5WujVxM~@Rxe+86AL6}hu03)rkUSpDHym0mDrvH$nyrqysfx5{~=w@MPA;XfV#zFChJuizz*nK7$VNUZWiaTc4$ofvxZ^d zBaEOAaXtW%$@*+|ZSD^o<*mu8<+4~09iB<*(AvImxlPVD^X}B4v2GA(u&a91O&?@7 zmatp`x^-$GUDd)HU~R7qe(a4GI|*63xnC8vLgiPU`U{Fke&od%>OpZ;$M&gh!!4ir zO7J*`?M^j+ytg1fWr81}CQ>Q#K?7RAPaP4*ol8FMlLNsQrZyB;edhGg^%j+JJ7A)@ z6LMf;wYHu?aVm`;D_+llr142t<+Vw%00$$&Ahu#$B*Z3%@zFdi7EpAl%)foa!rxGmZuIm%^a^bcpXw7Cso zFW2kJvmfMP&L_E|OBd>x9nT;$u*K4pvKHiS$KO*S%KJd+`rJ?I@KE2-9K8mgjpC5p zcB5{3R(pfIa^iExT=>k|)l7fQ5UK4I zQaH^ky1;g>8M}MjEj^Dmixd!;->f$&bvyCSJ02MaT(_y(qsYC*!?*NQg&>CL>(vl~ zf@eJp;raS(XnsN#lKZF*op$i}?0zP8>EvdRD((iir6zTtm#S*hRz+jbE#2GbJwLbg z1m*_St6EhlUrl z$L_{EWJ&|q7fE2Qz>jQ%TW|atzP+6B(-+7b?2)~FmQt~0X&??mL;l%Hgi8Or%+6zHB5S!e&%wPf7`xA*pp8+$>zH-8R;&K!GNv z{=p-u7rByO*UfvH-utJM0J+OAV)7I4hBWvK%H7M|C#2SZO<`QA&^=r&OIH6zr5qv4 zki6V~ zJd53MNi#5^o*;lKXr(IdO!9hvY%%Ld{kVxqBdyhc{f|9bwwv=_hflcPH(+`nm zP^h6Dn1(56lx<8zDRXC;GTwnUQ|m6&k5J~^ro5u=gMVWrF3*(pugLKmFI)Le+yK%< zdJYF(WE{9n>l4uKij^$B1bTrp`bSdl3}I&X(#xwRU2O**&S`h=pN?7vdZ!ed7E$Wr zYnwf@f_I5;Me0%?4i?ax1a9U)fX(YteC0DBY{(avqj|UMCnaqznqNSvy{K9C@{-mT z5?b~1dzyGu-%CDM`}OC-^||uiv3IPS$=7*<^nG-Z<tY&=EeuY zhPR9hupl6o-){iWBq`889f`OXST1TYw1V_)T8v?wHD}Qp$NtSy zZ#}A;AS0$2(M+p-q!k8I*jhV~)a&>N7jH54XJdVW33((6xH;iE*eC_x~QO7^paJDhP zmDykuGh!0;%$-008X;k2AO_)NrdpK|W;?ciB8bJ48Xg-=Cm$o9lf)X;GXB-Y%mP%V zcgjOEIrsF)c|4jZZpv)ML&}c04y8%BEzO1ZP*Su%G4vnYLfP0=1_w|X;mldypU zOb2oG&4zf&T}3#At~z21BplB22LrP*>%I;Qc4If*CjoPUxby^@gh{cT;P(xzxI<60x^>fVEwh_W&5CQ3FNXhoYx=;m=PmC_X{RLhnl*> zEaWz@y|Ge;i%1CGqtK)PqbSc|r%R4OqPZMq0oS+3Ge8F6IM)7Zjs0aLO(bPm99?^* z@pl=ej4llmRTL_M?6=ZiS&t=}Duxl;8hYK+(VI5nA~+Af3$Y-tWJJm*#S(AD^}yEs zDh}kO3JiTdZDjV^wk>g`Ga&X=C+t*<$6-Ue`_Mjy2o97e0Z=0sV=3ARKzb-^eH1@V!0v@cng8=?;x^ArLCw89eiqA?dDeXiJRwxuxA8()f#Wo>CQO0#=>bW5VK zb8tou$xtIA^U+p4gOM;Kib<1LQie*k0FzQ0K9pE$k=t~V|GDP?KJT#v3rU%kkbtxW zm2Ibh`ZoL`iqbSpsXg_J4?t-WcJ6sfqV^?MekW>n`BX+qg>_|244h&Sh+l}%`1FIo z!b}m|X$CB|11X;>ut$wg+(2*&sJ6q)r$=@%i!@jCp zocckgCz6St(%M@xRQh+9p=u;8006Hl)a+mE+5jBR@w9<{%f@8M!t)iI<`BiQN_gEh z>MZ6MTn=Ou?fw~ZEmk8Ttg&)P9fxJ}0CjoC#3zfOl z(UhblTZG!QKP|(?wL<9PzBmEwMpM{ECL_*rf^IZ15zV@K8QwGadY%HF>6eW|FbwqjsCFCo;;5JVYe8Z?cRvk9lRE>TTu6F}tC~2x z{#QW1FjwI^L*tBPGQ%RSbOKy(Af-2ust@W7AHE5m!4ggDhX_>Xn6v!b3J@<1o2>`n zexu=k0S+4slN8K3ET{MeoVA@uV~bQnKW)!9oA<`4Yf8~Dpr`^Hz2FmTU4wbYskQGO@{inQhLC1A z8}iOLx5TW%Gso1mwkNK!wy@!_AJNGRb&`vqCaZk~5qgU^9ABOuzB91tq~ZQ-!^zn; zWyJjx@a{D;vO8}Pqw2+Eegcw-M;Q!VZ(`{UHb)=tQe}@7%1GV$xW7y#ul&gId@e&R z5otPpUIt^yiMJCv6gqwlyb`{z1{JN10E`VABGY)SnMz%z&$vBkTkHQgrRcj{fQe$k z{)Kj1sRbsCl`VN&iJ0~srC+l+YR}zIR7b&+Ea)Lj#P6_45i>@fAut@zW_3%-lmz)X zyDb$5N2!qu!Ok^)-o)9cw3t@~xsqXtI_J_H0hRzgg5q_kCRXTE5J@F$oo3l&u|yTP==}8tN_m6ID%`&x`{^L{ zy3WcDkmC9^X*l3%0A(si>dSN0HVF)|TD36WrROpfXR* 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%0A(si>dSN0HVF)|TD36WrROpfXR* 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%0A(si>dSN0HVF)|TD36WrROpfXR* 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, + to: toEmail, + subject: "Welcome to CrawlerX", + html: ` +

Welcome!

+

Your signup was successful. You can now log in and start using the app.

+ `, + }); + console.log(`✅ Signup email sent to ${toEmail}`); + } catch (err) { + console.error("❌ Error sending signup email:", err); + } +} + +// +// Send reset-password email with 4-digit code or token link +// +export async function sendResetPasswordMail(email, token) { + try { + const resetURL = `${process.env.FRONTEND_URL}/reset-password?email=${email}&token=${token}`; + await mailer.sendMail({ + from: `"CrawlerX" <${process.env.SMTP_USER}>`, + to: email, + subject: "Reset your password", + html: ` +

You requested a password reset.

+

Click here to reset: ${resetURL}

+

This link is valid for 1 hour.

+ `, + }); + console.log(`✅ Reset password email sent to ${email}`); + } catch (err) { + console.error("❌ Error sending reset password email:", err); + } +} + + +export const sendCakeOrderMail = async (toEmail, orderData) => { + try { + const transporter = nodemailer.createTransport({ + host: "mail.crawlerx.co", + port: 587, + secure: false, // use TLS? false for port 587 + auth: { + user: "info@crawlerx.co", + pass: "CrawlerX@2025", + }, + tls: { + rejectUnauthorized: false, // <--- allow self-signed certificate + }, + }); + + const orderItems = Object.entries(orderData) + .map(([category, flavours]) => { + const items = Object.entries(flavours) + .map(([flavour, qty]) => `• ${flavour}: ${qty}`) + .join("\n"); + return `${category}:\n${items}`; + }) + .join("\n\n"); + + const mailOptions = { + from: `"Maison de Treats" `, + to: toEmail, + subject: "🎉 Your Cake Order Confirmation", + text: `Thank you for your order! Here are the details:\n\n${orderItems}`, + html: `

Thank you for your order!

+

Here are your cake order details:

+
${orderItems}
`, + }; + + await transporter.sendMail(mailOptions); + console.log("Cake order email sent to", toEmail); + } catch (err) { + console.error("Failed to send cake order email:", err); + } +}; \ No newline at end of file diff --git a/utils/sitemap.js b/utils/sitemap.js new file mode 100644 index 0000000..9ee751c --- /dev/null +++ b/utils/sitemap.js @@ -0,0 +1,20 @@ +import Sitemapper from "sitemapper"; +import normalizeUrl from "normalize-url"; + +/** Return an array of normalized URLs from /sitemap.xml (or [] if none). */ +export async function getSitemapUrls(startUrl) { + const origin = new URL(startUrl).origin; + const sitemapUrl = `${origin}/sitemap.xml`; + const sm = new Sitemapper({ url: sitemapUrl, timeout: 15000 }); + + try { + const { sites } = await sm.fetch(); + const out = []; + for (const u of sites || []) { + try { out.push(normalizeUrl(u, { stripHash: true })); } catch {} + } + return out; + } catch { + return []; + } +} diff --git a/utils/stripe.js b/utils/stripe.js new file mode 100644 index 0000000..a8ded10 --- /dev/null +++ b/utils/stripe.js @@ -0,0 +1,8 @@ +import Stripe from "stripe"; +import dotenv from "dotenv"; + +dotenv.config(); + +export const stripe = new Stripe(process.env.STRIPE_SECRET_KEY, { + apiVersion: "2024-06-20", +}); diff --git a/utils/urlHelpers.js b/utils/urlHelpers.js new file mode 100644 index 0000000..e21b4ee --- /dev/null +++ b/utils/urlHelpers.js @@ -0,0 +1,11 @@ +export function isInternal(base, candidate) { + try { + const baseUrl = new URL(base); + const testUrl = new URL(candidate, base); + const protocolOk = testUrl.protocol === "http:" || testUrl.protocol === "https:"; + const stripWWW = (h) => h.replace(/^www\./i, ""); + return protocolOk && stripWWW(baseUrl.hostname) === stripWWW(testUrl.hostname); + } catch { + return false; + } +}