From 59ad48087907a50ba43e5b6f00e6eb36b2ee731e Mon Sep 17 00:00:00 2001 From: Hammer1279 Date: Thu, 24 Apr 2025 15:10:31 +0000 Subject: [PATCH] Initial commit x2 --- README.md | 4 +- config.json | 7 + index.js | 349 +++++ package-lock.json | 2028 +++++++++++++++++++++++++++++ package.json | 29 + pages.jsonc | 34 + private/templates/base.handlebars | 40 + private/views/home.html | 66 + public/css/style.css | 27 + public/font/visitor1.ttf | Bin 0 -> 27552 bytes public/font/visitor2.ttf | Bin 0 -> 37388 bytes public/html/home-live.html | 147 +++ public/img/stars3.gif | Bin 0 -> 15973 bytes 13 files changed, 2730 insertions(+), 1 deletion(-) create mode 100644 config.json create mode 100644 index.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 pages.jsonc create mode 100644 private/templates/base.handlebars create mode 100644 private/views/home.html create mode 100644 public/css/style.css create mode 100644 public/font/visitor1.ttf create mode 100644 public/font/visitor2.ttf create mode 100644 public/html/home-live.html create mode 100644 public/img/stars3.gif diff --git a/README.md b/README.md index d3db213..5a8894d 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ # ht-dev.de -Source for the main Website \ No newline at end of file +Source for the main Website + +Currently this still uses mustache, I plan on migrating everything to handlebars as soon as possible \ No newline at end of file diff --git a/config.json b/config.json new file mode 100644 index 0000000..ba32df2 --- /dev/null +++ b/config.json @@ -0,0 +1,7 @@ +{ + "port": 8080, + "logging": false, + "logfile": "server.log", + "trustedProxies": [], + "webconfig": "./pages.jsonc" +} \ No newline at end of file diff --git a/index.js b/index.js new file mode 100644 index 0000000..8639dc8 --- /dev/null +++ b/index.js @@ -0,0 +1,349 @@ +// HT-Web Server (possibly the new Web Framework) + +import fs from 'fs'; +import express from 'express'; +import superagent from 'superagent'; +import { containsCidr } from 'cidr-tools'; +import { join, resolve, dirname } from 'path'; +import { parse } from "jsonc-parser"; +import morgan from 'morgan'; +import { fileURLToPath } from 'url'; +import { readFile } from 'fs/promises'; +import { mustache } from "consolidate"; +import { renderFile, render as ejsRender } from 'ejs'; +import { engine as handlebars, create } from 'express-handlebars'; +import NodeCache from 'node-cache'; + +import config from './config.json' with { + type: "json" +}; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +// allow comments in pages file +const pages = parse(fs.readFileSync(config.webconfig).toString()); + +const cache = new NodeCache({ + stdTTL: 3600, + useClones: false +}); + +const app = express(); + +app.use(morgan('dev')); // development and console logging +if (config.logging) { + // Ensure log file directory exists + const logDir = dirname(join(process.cwd(), config.logFile)); + if (!fs.existsSync(logDir)) { + fs.mkdirSync(logDir, { recursive: true }); + } + fs.appendFileSync(join(process.cwd(), config.logfile), `Server started at ${new Date().toUTCString()}\n`); + app.use(morgan('combined', { + stream: fs.createWriteStream(join(process.cwd(), config.logfile), { flags: 'a' }) + })); // production + process.once('SIGINT', () => { + fs.appendFileSync(join(process.cwd(), config.logfile), `Server stopped at ${new Date().toUTCString()}\n`); + process.exit(); + }); +} + +app.use((req, res, next) => { + res.setHeader('Server', "HT Web-Framework V2"); + res.setHeader('X-Powered-By', "HT Web-Framework V2"); + next(); +}); + +app.use((req, res, next) => { + // Enable for choosing framing options, not migrated yet + // if (config.management.embedSite) { + // res.setHeader('X-Frame-Options', 'ALLOW-FROM ' + config.management.embedSite); + // res.setHeader('Content-Security-Policy', 'frame-ancestors ' + config.management.embedSite); + // } else { + // res.setHeader('X-Frame-Options', 'DENY'); + // res.setHeader('Content-Security-Policy', 'frame-ancestors \'none\''); + // } + res.setHeader('X-Content-Type-Options', 'nosniff'); + // res.setHeader('Content-Security-Policy', 'default-src \'self\''); + res.setHeader('Referrer-Policy', 'same-origin'); + res.setHeader('Feature-Policy', 'geolocation \'none\'; microphone \'none\'; camera \'none\'; speaker \'none\'; vibrate \'none\'; payment \'none\'; usb \'none\';'); + res.setHeader('X-Permitted-Cross-Domain-Policies', 'none'); + next(); +}); + +// real IP assignment +app.use(async (req, res, next) => { + let ip = "0.0.0.0/0"; + if ("x-forwarded-for" in req.headers) { + if (containsCidr(["127.0.0.1", "::1", ...config.trustedProxies], req.ip)) { + ip = req.headers['x-forwarded-for'] || req.ip; + } else { + console.warn("Proxy IP not in list:", req.ip); + return res.sendStatus(403); + } + } else if ("cf-connecting-ip" in req.headers){ + if (!cache.has("cfcidrList")) { + cache.set("cfcidrList", (await superagent.get("https://api.cloudflare.com/client/v4/ips")).body); + } + const cfcidrList = cache.get("cfcidrList"); + if (!cfcidrList.success) { + return next(cfcidrList.errors.join(", ")); + } + if (containsCidr([...cfcidrList.result.ipv4_cidrs, ...cfcidrList.result.ipv6_cidrs], req.ip)) { + ip = req.headers['cf-connecting-ip'] || req.ip; + } else { + console.warn("CF IP not in list:", req.ip); + return res.sendStatus(403); + } + } else { + ip = req.ip; // Do nothing + } + req.realIp = ip; + next(); +}); + +app.set('views', join(__dirname, 'views')); +app.engine('mustache', mustache); +app.engine('ejs', renderFile); +app.engine('handlebars', handlebars()); +app.set('view engine', pages.settings.defaultType); +const extension = "." + pages.settings.defaultType; +const hbs = create({ + extname: ".handlebars", + // defaultLayout: 'base.mustache', + defaultLayout: false, + layoutsDir: join(__dirname, "private", "templates"), + partialsDir: join(__dirname, "private", "templates"), +}); +app.use(express.json()); + +app.use(express.urlencoded({ extended: true })); + +app.use("/static", express.static(join(process.cwd(), "public"))); + +/** + * Send a page to the client + * @param {import('express').Request} req Express Request + * @param {import('express').Response} res Express Response + * @param {string} view Name of the view/file to render + * @param {object} context context to pass to the template, can be modified + * @param {Function} [cb] (optional) callback + * @returns {Promise} + */ +async function render(req, res, view, context, cb) { + // Inject Servers + context.pages = [...pages.navpages]; + + // Active Detection + context.pages.forEach(element => { + element.active = req.url == element.url; + }); + + if (context.type == "html") { + console.debug("Rendering HTML"); + res.sendFile(join(viewsDir, view + ".html"), { headers: { "Content-Type": "text/html" } }); + return; + } else if (context.type == "ejs") { + console.debug("Rendering EJS"); + const ejsResult = await renderFile(join(viewsDir, view + ".ejs"), context); + partials['view'] = join(partialsDir, 'ejs.mustache'); + res.render(partials['base'], { ...context, partials: partials, ejs: ejsResult }, cb); + return; + } else if (context.type == "handlebars") { + console.debug("Rendering Handlebars"); + const handlebarsResult = await hbs.renderView(join(viewsDir, view + ".handlebars"), context); + partials['view'] = join(partialsDir, 'handlebars.mustache'); + res.render(partials['base'], { ...context, partials: partials, handlebars: handlebarsResult }, cb); + return; + } else if (context.type == "mustache") { + // Add current view + partials['view'] = join(viewsDir, view + ".mustache"); + res.render(partials['base'], { ...context, partials: partials }, cb); + } else { + throw new Error("Unknown template type: " + context.type); + } +} + +/** + * check for site access here, if allowed, call {@link render()} + * @param {import('express').Request} req Express Request + * @param {import('express').Response} res Express Response + * @param {string} view Name of the view/file to render + * @param {object} context context to pass to the template, can be modified + * @param {string[]} perms Array of permissions that need to be fulfilled by the user + * @param {Function} [cb] (optional) callback + * @returns {Promise} + */ +async function renderRestricted(req, res, view, context, perms, cb) { + res.sendStatus(500); + throw new Error("Not implemented yet"); +} + +function isJSON(str) { + try { + return JSON.stringify(str) && !!str; + } catch (e) { + return false; + } +} + +// Read partial templates +const partialsDir = join(__dirname, "private", "templates"); + +const viewsDir = join(__dirname, "private", "views"); + +// Map Partials +const partials = {} +fs.readdirSync(partialsDir).map(part => partials[part.replace(extension, '')] = join(partialsDir, part)); + +// Generate Routes +for (const path in pages.paths.get) { + if (Object.hasOwn(pages.paths.get, path)) { + const element = pages.paths.get[path]; + if (element.file) { + app.get(path, async (req, res, next) => { + let patches = { + type: element.type ?? pages.settings.defaultType, + } + if (element.scripts) { + try { + for await (const file of element.scripts) { + const module = await import("file://" + resolve(join("private", "scripts", file + ".js"))); + let result = module.get ? await module.get(element, { req, res, next }, config) : await module.default(element, { req, res, next }, config); + if (isJSON(result) && !(result?.done ?? false)) { + patches = { ...patches, ...result } + } else { + console.debug("Request already handled, returning...") + return; + } + } + } catch (error) { + return next(error); + } + } + if (element.settings && element.settings.subtitle) { + patches.title = element.settings.subtitle + " | " + settings.title; + } + const context = { ...settings, ...element.settings, ...patches }; + if (element.restriction) { + renderRestricted(req, res, element.file, context, element.restriction); + } else { + // TODO: add way to handle the script already handling requests and then skip this + try { + await render(req, res, element.file, context); + } catch (error) { + // TODO: check why errors are just ignored + console.debug(error); + // return next(error); + } + } + }) + } else { + app.get(path, async (req, res, next) => { + if (element.scripts) { + try { + for await (const file of element.scripts) { + const module = await import("file://" + resolve(join('web', 'scripts', file + ".js"))); + module.get ? await module.get(element, { req, res, next }, config) : await module.default(element, { req, res, next }, config); + } + } catch (error) { + return next(error); + } + } else { + next(); + } + }) + } + } +} +for (const path in pages.paths.post) { + if (Object.hasOwn(pages.paths.post, path)) { + const element = pages.paths.post[path]; + if (element.file) { + app.post(path, async (req, res, next) => { + let patches = { + type: element.type ?? pages.settings.defaultType, + } + if (element.scripts) { + try { + for await (const file of element.scripts) { + const module = await import("file://" + resolve(join('web', 'scripts', file + ".js"))); + let result = module.post ? await module.post(element, { req, res, next }, config) : await module.default(element, { req, res, next }, config); + if (isJSON(result) && !(result?.done ?? false)) { + patches = { ...patches, ...result } + } else { + console.debug("Request already handled, returning...") + return; + } + } + } catch (error) { + return next(error); + } + } + if (element.settings && element.settings.subtitle) { + patches.title = element.settings.subtitle + " | " + settings.title; + } + const context = { ...settings, ...element.settings, ...patches }; + if (element.restriction) { + renderRestricted(req, res, element.file, context, element.restriction); + } else { + // TODO: add way to handle the script already handling requests and then skip this + try { + await render(req, res, element.file, context); + } catch (error) { + // TODO: check why errors are just ignored + console.debug(error); + // return next(error); + } + } + }) + } else { + app.post(path, async (req, res, next) => { + if (element.scripts) { + try { + for await (const file of element.scripts) { + const module = await import("file://" + resolve(join('web', 'scripts', file + ".js"))); + module.post ? await module.post(element, { req, res, next }, config) : await module.default(element, { req, res, next }, config); + } + } catch (error) { + return next(error); + } + } else { + next(); + } + }) + } + } +} + +let settings = { + ...pages.settings, + pages: [...pages.navpages], +}; + +app.get('/', async (req, res) => { + try { + const currentConfigFile = await readFile(join(process.cwd(), 'config.json'), 'utf-8'); + const currentConfig = JSON.parse(currentConfigFile); + res.json(currentConfig); + } catch (error) { + console.error('Error reading config file:', error); + res.status(500).json({ error: 'Failed to read configuration' }); + } +}); + +// Error handling middleware +app.use((err, req, res, next) => { + console.error('Error:', err); + // res.status(500).json({ + // error: 'Internal Server Error', + // message: err.message, + // stack: err.stack + // }); + res.status(500).send(`ERR: ${err.message}

500: Internal Server Error

${err.stack.replaceAll('\n', "
")}

`); +}); + +app.listen(config.port, () => { + console.log(`Server listening on port ${config.port}`); +}); + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..039b3ad --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2028 @@ +{ + "name": "ht-dev.de", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ht-dev.de", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "cidr-tools": "^11.0.3", + "consolidate": "^1.0.4", + "ejs": "^3.1.10", + "express": "^5.1.0", + "express-handlebars": "^8.0.1", + "jsonc-parser": "^3.3.1", + "morgan": "^1.10.0", + "mustache": "^4.2.0", + "node-cache": "^5.1.2", + "superagent": "^10.2.0" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/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/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "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/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "license": "MIT" + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "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/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/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "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/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.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/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/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cidr-tools": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/cidr-tools/-/cidr-tools-11.0.3.tgz", + "integrity": "sha512-7p0rp7B2P+nZfBkJlrQzUMDyUHeYK2h/XCJY80VUl1v5oxwLxQjZMy39BXVOXugwAX67l0oJ/QQ6OhANgUtUbw==", + "license": "BSD-2-Clause", + "dependencies": { + "ip-bigint": "^8.2.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "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/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/consolidate": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-1.0.4.tgz", + "integrity": "sha512-RuZ3xnqEDsxiwaoIkqVeeK3gg9qxw7+YKYX2tKhLs1eukVKMgSr4VYI3iYFsRHi4TloHYDlugrz3kvkjs3nynA==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@babel/core": "^7.22.5", + "arc-templates": "^0.5.3", + "atpl": ">=0.7.6", + "bracket-template": "^1.1.5", + "coffee-script": "^1.12.7", + "dot": "^1.1.3", + "dust": "^0.3.0", + "dustjs-helpers": "^1.7.4", + "dustjs-linkedin": "^2.7.5", + "eco": "^1.1.0-rc-3", + "ect": "^0.5.9", + "ejs": "^3.1.5", + "haml-coffee": "^1.14.1", + "hamlet": "^0.3.3", + "hamljs": "^0.6.2", + "handlebars": "^4.7.6", + "hogan.js": "^3.0.2", + "htmling": "^0.0.8", + "jazz": "^0.0.18", + "jqtpl": "~1.1.0", + "just": "^0.1.8", + "liquid-node": "^3.0.1", + "liquor": "^0.0.5", + "lodash": "^4.17.20", + "mote": "^0.2.0", + "mustache": "^4.0.1", + "nunjucks": "^3.2.2", + "plates": "~0.4.11", + "pug": "^3.0.0", + "qejs": "^3.0.5", + "ractive": "^1.3.12", + "react": ">=16.13.1", + "react-dom": ">=16.13.1", + "slm": "^2.0.0", + "swig": "^1.4.2", + "swig-templates": "^2.0.3", + "teacup": "^2.0.0", + "templayed": ">=0.2.3", + "then-pug": "*", + "tinyliquid": "^0.2.34", + "toffee": "^0.3.6", + "twig": "^1.15.2", + "twing": "^5.0.2", + "underscore": "^1.11.0", + "vash": "^0.13.0", + "velocityjs": "^2.0.1", + "walrus": "^0.10.1", + "whiskers": "^0.4.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "arc-templates": { + "optional": true + }, + "atpl": { + "optional": true + }, + "bracket-template": { + "optional": true + }, + "coffee-script": { + "optional": true + }, + "dot": { + "optional": true + }, + "dust": { + "optional": true + }, + "dustjs-helpers": { + "optional": true + }, + "dustjs-linkedin": { + "optional": true + }, + "eco": { + "optional": true + }, + "ect": { + "optional": true + }, + "ejs": { + "optional": true + }, + "haml-coffee": { + "optional": true + }, + "hamlet": { + "optional": true + }, + "hamljs": { + "optional": true + }, + "handlebars": { + "optional": true + }, + "hogan.js": { + "optional": true + }, + "htmling": { + "optional": true + }, + "jazz": { + "optional": true + }, + "jqtpl": { + "optional": true + }, + "just": { + "optional": true + }, + "liquid-node": { + "optional": true + }, + "liquor": { + "optional": true + }, + "lodash": { + "optional": true + }, + "mote": { + "optional": true + }, + "mustache": { + "optional": true + }, + "nunjucks": { + "optional": true + }, + "plates": { + "optional": true + }, + "pug": { + "optional": true + }, + "qejs": { + "optional": true + }, + "ractive": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "slm": { + "optional": true + }, + "swig": { + "optional": true + }, + "swig-templates": { + "optional": true + }, + "teacup": { + "optional": true + }, + "templayed": { + "optional": true + }, + "then-pug": { + "optional": true + }, + "tinyliquid": { + "optional": true + }, + "toffee": { + "optional": true + }, + "twig": { + "optional": true + }, + "twing": { + "optional": true + }, + "underscore": { + "optional": true + }, + "vash": { + "optional": true + }, + "velocityjs": { + "optional": true + }, + "walrus": { + "optional": true + }, + "whiskers": { + "optional": true + } + } + }, + "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/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "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/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "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/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "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/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "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/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/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/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/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/express-handlebars": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/express-handlebars/-/express-handlebars-8.0.1.tgz", + "integrity": "sha512-mdas0PTbgQnwSyAjcYM7OMaftM8nJ3Kqz6yAyK4iCFvMOGGvh6pv42IHwcE5PBpS6ffYeZRSsgAdYUMG4CSjhQ==", + "license": "BSD-3-Clause", + "dependencies": { + "glob": "^11.0.0", + "graceful-fs": "^4.2.11", + "handlebars": "^4.7.8" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "license": "MIT" + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "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/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "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/formidable": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.2.tgz", + "integrity": "sha512-Jqc1btCy3QzRbJaICGwKcBfGWuLADRerLzDqi2NwSt/UkXLsHJw2TVResiaoBufHVHy9aSgClOHCeJsSsFLTbg==", + "license": "MIT", + "dependencies": { + "dezalgo": "^1.0.4", + "hexoid": "^2.0.0", + "once": "^1.4.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "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/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/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-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/glob": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.1.tgz", + "integrity": "sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/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/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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/hexoid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-2.0.0.tgz", + "integrity": "sha512-qlspKUK7IlSQv2o+5I7yhUd7TxlOG2Vr5LTa3ve2XSNVKAL/n/u/7KLvKmFNimomDIKvZFXWHv0T12mv7rT8Aw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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/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/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/ip-bigint": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/ip-bigint/-/ip-bigint-8.2.1.tgz", + "integrity": "sha512-ji9uf6Sfp+v2TgsDEWKRRRDEJHbWOF+2Oaqqd0keUtNRHymJQ/HaL1svJScL+aqMWlEhH34OaJC1Ai2e+3YUzA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=18" + } + }, + "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-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-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/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.0.tgz", + "integrity": "sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jake/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", + "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "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/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/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "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/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "license": "MIT", + "dependencies": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/morgan/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/morgan/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/morgan/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "license": "MIT", + "bin": { + "mustache": "bin/mustache" + } + }, + "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/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" + }, + "node_modules/node-cache": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-5.1.2.tgz", + "integrity": "sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==", + "license": "MIT", + "dependencies": { + "clone": "2.x" + }, + "engines": { + "node": ">= 8.0.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/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "license": "MIT", + "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/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "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-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/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/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/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/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/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/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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", + "engines": { + "node": ">=0.10.0" + } + }, + "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/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/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/string-width-cjs/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/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/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/superagent": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.2.0.tgz", + "integrity": "sha512-IKeoGox6oG9zyDeizaezkJ2/aK0wc5la9st7WsAKyrAkfJ56W3whVbVtF68k6wuc87/y9T85NyON5FLz7Mrzzw==", + "license": "MIT", + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.4", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^3.5.2", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/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/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "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/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/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi-cjs/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/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?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" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..3b68a92 --- /dev/null +++ b/package.json @@ -0,0 +1,29 @@ +{ + "name": "ht-dev.de", + "version": "1.0.0", + "description": "Source for the main Website", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "https://git.ht-dev.de/Hammer1279/ht-dev.de.git" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "cidr-tools": "^11.0.3", + "consolidate": "^1.0.4", + "ejs": "^3.1.10", + "express": "^5.1.0", + "express-handlebars": "^8.0.1", + "jsonc-parser": "^3.3.1", + "morgan": "^1.10.0", + "mustache": "^4.2.0", + "node-cache": "^5.1.2", + "superagent": "^10.2.0" + }, + "type": "module" +} diff --git a/pages.jsonc b/pages.jsonc new file mode 100644 index 0000000..a961fd4 --- /dev/null +++ b/pages.jsonc @@ -0,0 +1,34 @@ +// Defines the routes used by the Webserver +{ + "settings": { + "title": "Title", // tab title + "headerTitle": "Header Title", // title in navbar + // base_* are the default stylesheets and scripts (client side) to load on every page + "base_stylesheets": [], // stylesheets that will always be loaded + "base_scripts": [], // scripts that will always be loaded + "widgets": [], // widgets are the easiest way for quick dynamic data, but should otherwise be avoided + "defaultType": "handlebars" // default template engine to use + }, + "paths": { + "get": { + "/": { + "file": "home", + "type": "html", // possible values: "mustache", "handlebars", "ejs", "html" + "scripts": [], + "settings": { // these are part of the context of a object + "stylesheets": [], + "scripts": [], + "widgets": [] + }, + "restriction": false + } + }, + "post": {} + }, + "navpages": [ + { + "name": "Home", + "url": "/" + } + ] +} \ No newline at end of file diff --git a/private/templates/base.handlebars b/private/templates/base.handlebars new file mode 100644 index 0000000..f68644c --- /dev/null +++ b/private/templates/base.handlebars @@ -0,0 +1,40 @@ + + + + + + + {{title}} + + + {{#base_stylesheets}} + + {{/base_stylesheets}} + {{#stylesheets}} + + {{/stylesheets}} + + + + + + + + + + + + + + + + {{! }} + \ No newline at end of file diff --git a/private/views/home.html b/private/views/home.html new file mode 100644 index 0000000..0ec178f --- /dev/null +++ b/private/views/home.html @@ -0,0 +1,66 @@ + + + + + + + + HT-Dev DE + + + + + + + + + + + +
+
+

HT-Dev.DE

+

Hello World! Hello from Germany!

+

My personal effort for decentralizing and personalizing the web again.

+

This page is in honor to the old (and free) internet.

+
+
+

I'm mostly a backend developer, so forgive this crude website, its backend is really good tho :D

+

However you have found this domain, welcome! We have lots of services here:

+ +

Personal Open-Source Projects to check out:

+ +

Hosted Sites via our Servers:

+ +
+

If you need to contact me, there are several ways:

+ +
+
+

HT-Dev.DE ©2025 Hammer1279

+

All rights reserved.

+

Powered by HT-Web-Framework V2 (to serve a static html page??)

+
+ + + \ No newline at end of file diff --git a/public/css/style.css b/public/css/style.css new file mode 100644 index 0000000..0900e6e --- /dev/null +++ b/public/css/style.css @@ -0,0 +1,27 @@ +@font-face { + font-family: 'visitor1'; + src: url('/static/font/visitor1.ttf'), url('../font/visitor1.ttf'); +} + +@font-face { + font-family: 'visitor2'; + src: url('/static/font/visitor2.ttf'), url('../font/visitor2.ttf'); +} + +body { + font-family: 'visitor1', sans-serif; + font-size: x-large; + background-color: #000; + color: #fff; + /* text-align: center; */ + background-image: url('/static/img/stars3.gif'), url('../img/stars3.gif'); + background-repeat: repeat; +} + +h1, h2, h3, h4, h5, h6 { + text-align: center; +} + +.center { + text-align: center; +} \ No newline at end of file diff --git a/public/font/visitor1.ttf b/public/font/visitor1.ttf new file mode 100644 index 0000000000000000000000000000000000000000..04ce123d4bbfbe14c4e60982181804b847a96025 GIT binary patch literal 27552 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 Ps8Xvx0u{mUV6OhZx}kpw literal 0 HcmV?d00001 diff --git a/public/font/visitor2.ttf b/public/font/visitor2.ttf new file mode 100644 index 0000000000000000000000000000000000000000..870130d76f1567ecf27436d678d1a328f55d1a75 GIT binary patch literal 37388 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
-T||v~$~jp@_0#c#H*8 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 jhi|&(hO4fmD;~b-@KxcS>u + + + + + + + HT-Dev DE + + + + + + + + + + + + + +

Logo is still WIP

+
+
+

HT-Dev.DE

+

Hello World! Hello from Germany!

+

My personal effort for decentralizing and personalizing the web again.

+

This page is in honor to the old (and free) internet.

+
+
+

I'm mostly a backend developer, so please forgive this crude website.

+

This page is still under active development and will improve hopefully.

+

However you have found this domain, welcome! We have lots of services here:

+ +

Personal Open-Source Projects to check out:

+ +

Hosted Sites via our Servers:

+ +
+

If you need to contact me, there are several ways:

+ +
+
+
+ Badges and cool sites: +
+
+ + Created by a human with a heart + + + + + + + + + + + + + + + + + The text "cadence now!" on a purple background. There is a moon-shaped logo on the left side and a tiny star in the bottom right. + + Visit Melonking.Net! + +
+
+

Honestly no idea how...

+ My computer geek score is greater than 100% of all people in the world! How do you compare? Click here to find out! + +

The visitor counter above usually links back to a horse insurance website and hides it and breaks if you remove it... NO!

+
+ + + +
+

HT-Dev.DE ©2025 Hammer1279

+

All rights reserved.

+ + +
+

Unique Visitors (we don't talk about its accuracy)

+ Visit counter For Websites + + + \ No newline at end of file diff --git a/public/img/stars3.gif b/public/img/stars3.gif new file mode 100644 index 0000000000000000000000000000000000000000..717ad16ace10bbd6f1051c714bc56272b6748245 GIT binary patch literal 15973 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 literal 0 HcmV?d00001