diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..97acc881 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +charset = utf-8 +end_of_line = crlf +indent_size = 4 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true \ No newline at end of file diff --git a/.github/workflows/azure-webapps-node.yml b/.github/workflows/azure-webapps-node.yml new file mode 100644 index 00000000..9c2a6ecc --- /dev/null +++ b/.github/workflows/azure-webapps-node.yml @@ -0,0 +1,88 @@ +on: + push: + branches: + - "master" + pull_request: + branches: + - "master" + +env: + AZURE_WEBAPP_NAME: at11 + AZURE_WEBAPP_PACKAGE_PATH: "." + NODE_VERSION: "24.x" + +permissions: + contents: read + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + + - name: Set up Node.js + uses: actions/setup-node@v6 + with: + node-version: ${{ env.NODE_VERSION }} + cache: "npm" + + - name: Install and build + run: | + npm ci + npm run build + + - name: Linting & formatting checks + run: | + npm run lint + npm run format:check + + - name: Run tests + run: | + npm install mocha-ctrf-json-reporter --no-save + npm test -- --reporter mocha-ctrf-json-reporter + + - name: Publish Test Report + uses: ctrf-io/github-test-reporter@v1 + with: + report-path: "./ctrf/*.json" + github-report: true + + - name: Cleanup dev dependencies + run: | + npm prune --omit=dev + + - name: Upload artifact + uses: actions/upload-artifact@v7 + with: + name: at11-app + path: | + dist/**/*.js + !dist/test/ + static/ + views/ + node_modules/ + package.json + + deploy: + if: github.ref_name == 'master' && github.event_name == 'push' + permissions: + contents: none + runs-on: ubuntu-latest + needs: build + environment: + name: "Production" + url: ${{ steps.deploy-to-webapp.outputs.webapp-url }} + + steps: + - name: Download artifact from build job + uses: actions/download-artifact@v8 + with: + name: at11-app + + - name: "Deploy to Azure WebApp" + id: deploy-to-webapp + uses: azure/webapps-deploy@v2 + with: + app-name: ${{ env.AZURE_WEBAPP_NAME }} + publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }} + package: ${{ env.AZURE_WEBAPP_PACKAGE_PATH }} diff --git a/.gitignore b/.gitignore index 38131955..f1410d4a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,21 +1,23 @@ -lib-cov -*.seed -*.log -*.csv -*.dat -*.out -*.pid -*.gz -*~ - -pids -logs -results -temp - -npm-debug.log -node_modules -/nbproject/private/ -.idea/ -*.iml -.vscode \ No newline at end of file +lib-cov +*.seed +*.log +*.csv +*.dat +*.out +*.pid +*.gz +*~ + +pids +logs +results +temp + +npm-debug.log +node_modules +/nbproject/private/ +.idea/ +*.iml +dist +.env +ctrf diff --git a/.jscsrc b/.jscsrc deleted file mode 100644 index d943eba8..00000000 --- a/.jscsrc +++ /dev/null @@ -1,51 +0,0 @@ -{ - "disallowEmptyBlocks": true, - "disallowMixedSpacesAndTabs": true, - "disallowMultipleLineStrings": true, - "disallowMultipleSpaces": {"allowEOLComments": true}, - "disallowOperatorBeforeLineBreak": ["+", "."], - "disallowPaddingNewlinesInBlocks": true, - "disallowSpaceAfterPrefixUnaryOperators": true, - "disallowSpaceBeforeComma": true, - "disallowSpaceBeforePostfixUnaryOperators": true, - "disallowSpaceBeforeSemicolon": true, - "disallowSpacesInAnonymousFunctionExpression": { - "beforeOpeningRoundBrace": true - }, - "disallowSpacesInCallExpression": true, - "disallowSpacesInFunctionExpression": { - "beforeOpeningRoundBrace": true - }, - "disallowSpacesInFunction": { - "beforeOpeningRoundBrace": true - }, - "disallowSpacesInNamedFunctionExpression": { - "beforeOpeningRoundBrace": true - }, - "disallowSpacesInsideParentheses": true, - "disallowTrailingComma": true, - "disallowTrailingWhitespace": "ignoreEmptyLines", - "disallowYodaConditions": true, - "requireCamelCaseOrUpperCaseIdentifiers": true, - "requireCapitalizedConstructors": true, - "requireCommaBeforeLineBreak": true, - "requireCurlyBraces": true, - "requireLineBreakAfterVariableAssignment": true, - "requireLineFeedAtFileEnd": true, - "requireParenthesesAroundIIFE": true, - "requireSemicolons": true, - "requireSpaceAfterBinaryOperators": true, - "requireSpaceBeforeBinaryOperators": true, - "requireSpaceBeforeObjectValues": true, - "requireSpaceBetweenArguments": true, - "requireSpacesInConditionalExpression": { - "afterTest": true, - "beforeConsequent": true, - "afterConsequent": true, - "beforeAlternate": true - }, - "requireSpacesInForStatement": true, - "requireSpacesInsideObjectBrackets": "all" - //"validateIndentation": 4 - //"validateQuoteMarks": "\"" -} \ No newline at end of file diff --git a/.jshintrc b/.jshintrc deleted file mode 100644 index 6c5f96bc..00000000 --- a/.jshintrc +++ /dev/null @@ -1,21 +0,0 @@ -{ -//rules - "curly": true, - "eqeqeq": true, - "forin": true, - "freeze": true, - "maxcomplexity": 10, - "maxdepth": 4, - "maxstatements": 20, - "noarg": true, - "nonbsp": true, - "nonew": true, - "undef": true, - "unused": true, - "esversion": 6, -//enviroments - "node": true, - "browser": true, - "nonstandard": true, - "jquery": true -} \ No newline at end of file diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..380b4f99 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,2 @@ +test/samples +package-lock.json diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 37f562af..00000000 --- a/.travis.yml +++ /dev/null @@ -1,6 +0,0 @@ -sudo: false -language: node_js -node_js: - - "6.9" -deploy: - provider: azure_web_apps diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..3ea3f926 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,38 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Debug at11", + "runtimeArgs": ["--env-file-if-exists=.env"], + "program": "${workspaceFolder}/app.ts", + "preLaunchTask": "${defaultBuildTask}", + "outFiles": ["${workspaceFolder}/dist/**/*.js"], + "internalConsoleOptions": "openOnSessionStart", + "serverReadyAction": { + "action": "openExternally", + "pattern": "Done, listening on .* port: (\\d+)" + } + }, + { + "type": "node", + "request": "launch", + "name": "Debug tests", + "runtimeExecutable": "npx", + "runtimeArgs": [ + "mocha", + "--exit", + "--no-timeouts", + "--colors", + "./dist/test" + ], + "preLaunchTask": "${defaultBuildTask}", + "outFiles": ["${workspaceFolder}/dist/**/*.js"], + "internalConsoleOptions": "openOnSessionStart" + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..054992d8 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "js/ts.tsdk.path": "node_modules/typescript/lib", + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode" +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 00000000..f8e0a261 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,16 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "type": "typescript", + "tsconfig": "tsconfig.json", + "problemMatcher": ["$tsc"], + "group": { + "kind": "build", + "isDefault": true + } + } + ] +} diff --git a/README.md b/README.md index 0769dddf..95635a73 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,24 @@ -[![Build Status](https://travis-ci.org/ERNICommunity/at11.svg?branch=master)](https://travis-ci.org/ERNICommunity/at11) -[![Dependency Status](https://david-dm.org/ERNICommunity/at11.svg)](https://david-dm.org/ERNICommunity/at11) - -at11 -========== - -Simple web application that fetches daily lunch menus from popular restaurants near [ERNI Slovakia office](http://erni.sk). - -Live application is running at [http://at11.azurewebsites.net/](http://at11.azurewebsites.net/). - - -Developer's installation instructions ---- - -This is a [Node.js](http://nodejs.org). powered application, so first you need to have Node.js up and running. You can get node.js installers [from here](https://nodejs.org/en/download/). - -1. Get the [sources](https://github.com/at11/at11/archive/master.zip) and extract them locally. You can also clone the repository if you wish. If you want to contribute feel free to [fork the repo](https://help.github.com/articles/fork-a-repo), make improvements and create pull requests. -2. Change into directory with sources `cd path/to/sources`. -3. Execute `npm install`. This might take a while as all required dependecies need to be downloaded. -4. After successful installation execute `npm start`. This will prompt a few messages, last of them being `Done, listening on http://:::54321` and hang. -5. Navigate your browser to [http://localhost:54321](http://localhost:54321) and you should see today's menus. -6. You can execute `npm test` to run the tests. +![Workflow Status](https://github.com/ERNICommunity/at11//actions/workflows/azure-webapps-node.yml/badge.svg) + +# at11 + +Simple web application that fetches daily lunch menus from popular restaurants near [ERNI Slovakia office](http://erni.sk). + +Live application is running at [http://at11.azurewebsites.net/](http://at11.azurewebsites.net/). + +## Developer's installation instructions + +This is a [Node.js](http://nodejs.org) powered application writen it [TypeScript](https://www.typescriptlang.org), so first you need to have Node.js up and running. + +1. Get the source code by either [downloading a zip](https://github.com/at11/at11/archive/master.zip) or cloning this repo. +1. Change into directory with extracted/cloned sources `cd path/to/sources`. +1. Execute `npm install`. This might take a moment as all required dependecies need to be downloaded. +1. Execute `npm start`. This will build and start the application. +1. Navigate your browser to [http://localhost:54321](http://localhost:54321) and you should see today's menus. +1. You can execute `npm test` to run the tests and linter. + +P.S.: [Visual Studio Code](https://code.visualstudio.com/) settings are included in the repo, so if you use it, you are all set up (including debugging). You need to do only first 3 steps, then launch VS Code in that directory (`code .`), hit _F5_, lean back and relax... + +## Contributing + +Feel free to [fork the repo](https://help.github.com/articles/fork-a-repo), make improvements and create a pull request. diff --git a/app.js b/app.js deleted file mode 100644 index e4269524..00000000 --- a/app.js +++ /dev/null @@ -1,109 +0,0 @@ -var express = require('express'); -var hbs = require('hbs'); -var moment = require("moment-timezone"); - -//our modules -var config = require('./config'); -var menuFetcher = require('./menuFetcher'); -var parserUtil = require('./parsers/parserUtil'); - -console.log("Initializing..."); -var actions = {}; -function createAction(url, postParams, parseCallback) { - return function(date, doneCallback) { - menuFetcher.fetchMenu(url, date, postParams, parseCallback, doneCallback); - }; -} -for (var i = 0; i < config.restaurants.length; i++) -{ - console.log(config.restaurants[i]); - try - { - var parserModule = require("./parsers/" + config.restaurants[i].module); - if (typeof parserModule.parse !== "function") - { - throw "Module is missing parse method"; - } - if (parserModule.parse.length !== 3) - { - throw "Module parse(..) method should have 3 parameters (html, date, callback)"; - } - var id = config.restaurants[i].id; - if (typeof actions[id] !== "undefined") - { - throw "Non unique id '" + id + "' provided"; - } - var url = config.restaurants[i].url; - var postParams = config.restaurants[i].post; - actions[id] = createAction(url, postParams, parserModule.parse); - } - catch (e) - { - console.warn(e); - } -} - -if (Object.keys(actions).length === 0) -{ - console.error("Initialization failed, exiting"); - process.exit(1); -} -console.log("Initialization successful (" + Object.keys(actions).length + " of " + config.restaurants.length + ")"); - -console.log("Registering partials..."); -hbs.registerPartials(__dirname + '/views/partials'); -console.log("Done"); - -console.log("Global setup..."); -moment.locale('sk'); -moment.tz.setDefault("Europe/Bratislava"); -console.log("Done"); - -console.log("Express setup..."); -var app = express(); -app.set('view engine', 'html'); -app.engine('html', hbs.__express); -app.use(express.static('static')); -app.get('/:theme?', function(req, res) { - res.setHeader('Content-Type', 'text/html; charset=UTF-8'); - res.setHeader('Content-Language', 'sk'); - var theme = parserUtil.parseTheme(req); - - res.cookie('theme', theme, { maxAge: 315360000000, httpOnly: true }); - res.render(config.themes[theme].template, { restaurants: config.restaurants, themes: config.themes }); -}); -app.get('/menu/:id/:day', function(req, res) { - if (typeof actions[req.params.id] === "undefined") - { - res.statusCode = 404; - res.send("Restaurant " + req.params.id + " not found\n"); - } - else - { - actions[req.params.id](moment(req.params.day, "YYYY-MM-DD"), function(error, cachedMenu) { - if (error) - { - res.statusCode = 500; - res.send(error.toString()); - } - else - { - res.json(cachedMenu ? { menu: cachedMenu.value, timeago: moment(cachedMenu.timestamp).fromNow() } : null); - } - }); - } -}); -console.log("Done"); - -console.log("Creating server..."); -app.listen(config.port, function(err) { - if(err){ - console.error("Unable to create server", err); - process.exit(1); - return; - } - var host = this.address().address; - var port = this.address().port; - - console.log('Done, listening on http://%s:%s', host, port); -}); diff --git a/app.ts b/app.ts new file mode 100644 index 00000000..3916fc4f --- /dev/null +++ b/app.ts @@ -0,0 +1,90 @@ +import * as appInsights from "applicationinsights"; +import express from "express"; +import hbs from "hbs"; +import NodeCache from "node-cache"; + +import { Config } from "./config.js"; +import { MenuFetcher, IMenuResult } from "./menuFetcher.js"; +import { sk } from "date-fns/locale"; +import { formatDistance, parse, isValid } from "date-fns"; + +const config = new Config(); +if (config.appInsightsConnectionString) { + appInsights + .setup(config.appInsightsConnectionString) + .setAutoCollectConsole(true, true) + .setDistributedTracingMode( + appInsights.DistributedTracingModes.AI_AND_W3C, + ) + .start(); +} + +console.debug("Initializing..."); +const cache = new NodeCache({ + checkperiod: config.cacheExpiration / 2, +}); +const menuFetcher = new MenuFetcher(config, cache); + +const actions = new Map Promise>(); +for (const [key, value] of Object.entries(config.restaurants)) { + console.debug(`Processing '${key}': ${value.name}`); + actions.set(key, (date) => menuFetcher.fetchMenu(date, value.parser)); +} + +if (actions.size === 0) { + throw new Error("Actions initialization failed"); +} + +console.debug("Express setup..."); +const app = express(); +app.set("view engine", "html"); +// eslint-disable-next-line @typescript-eslint/unbound-method +app.engine("html", hbs.__express); +app.use(express.static(import.meta.dirname + "/../static")); +app.get("/", (req, res) => { + res.setHeader("Content-Type", "text/html; charset=UTF-8"); + res.setHeader("Content-Language", "sk"); + const now = new Date(); + res.render(import.meta.dirname + "/../views/index.html", { + restaurants: Object.entries(config.restaurants).map(([k, v]) => ({ + id: k, + name: v.name, + url: v.parser.urlFactory(now), + })), + appInsightsConnectionString: config.appInsightsConnectionString, + }); +}); +app.get("/menu/:key", async (req, res) => { + const date = parse(req.query.date as string, "yyyy-M-d", new Date(), { + locale: sk, + }); + if (!isValid(date)) { + res.statusCode = 400; + res.send("Missing/incorrect 'date' query parameter"); + return; + } + + if (!actions.has(req.params.key)) { + res.statusCode = 404; + res.send(`Restaurant action for '${req.params.key}' not found`); + return; + } + + const result = await actions.get(req.params.key)!(date); + const timeago = formatDistance(result.timestamp, new Date(), { + addSuffix: true, + locale: sk, + }); + if (result.type === "error") { + res.status(500).json({ error: result.error, timeago }); + } else { + res.json({ menu: result.menu, timeago }); + } +}); +const server = app.listen(config.port, (err) => { + if (err) { + console.error("Error starting server", err); + } else { + console.info("Done, listening on", server.address()); + } +}); diff --git a/cache.js b/cache.js deleted file mode 100644 index cc74f2f4..00000000 --- a/cache.js +++ /dev/null @@ -1,31 +0,0 @@ -var config = require('./config'); - -module.exports = new (function() { // jshint ignore:line - var cache = {}; - setInterval(cleanUp, config.cacheExpiration); - - this.set = function(key, value) { - if(typeof value !== "object") - { - throw "Only objects can be cached"; - } - cache[key] = { value: value, timestamp: Date.now() }; - }; - - this.get = function(key) { - return isValid(key) ? cache[key] : null; - }; - - function isValid(key) { - var enterTime = cache[key] && cache[key].timestamp; - return !!enterTime && (enterTime + config.cacheExpiration > Date.now()); - } - - function cleanUp() { - for(var key in cache){ - if(cache.hasOwnProperty(key) && !isValid(key)){ - delete cache[key]; - } - } - } -})(); diff --git a/config.js b/config.js deleted file mode 100644 index 08f3da52..00000000 --- a/config.js +++ /dev/null @@ -1,25 +0,0 @@ -module.exports = { - port: process.env.PORT || 54321, - cacheExpiration: 2 * 60 * 60 * 1000, //2h - parserTimeout: 10 * 1000, //10s - restaurants: [ - { id: 1, name: 'U Daňováka', url: 'http://www.udanovaka.sk/obedove-menu/', module: 'danovak' }, - { id: 11, name: 'Kaša', url: 'https://restauracie.sme.sk/restauracia/kasa-2_8386-petrzalka_664/denne-menu', module: 'kasa' }, - { id: 3, name: 'ITB', url: 'http://www.citycantina.sk/prevadzka/1', module: 'itb' }, - { id: 2, name: 'Giuliano', url: 'http://www.giuliano.sk/-denne-menu', module: 'giuliano' }, - { id: 4, name: 'Alfa', url: 'http://restauracie.sme.sk/restauracia/restauracia-alfa_2512-petrzalka_664/denne-menu', module: 'alfa' }, - { id: 5, name: 'Škôlka', url: 'http://jedalen.vysnivany.sk/ukazka-strany', module: 'skolka' }, - { id: 6, name: 'Pizza Pazza', url: 'http://pizzapazza.sk/?page_id=645', module: 'pizzapazza', post: 'prevadzka2=1' }, - { id: 7, name: 'Kamenica - Corleone Pizza', url: 'http://www.pizzacorleone.sk/obedove-menu.html', module: 'kamenica' }, - { id: 8, name: 'Numero Uno', url: 'http://www.numerouno.sk/denne-menu/', module: 'numerouno' }, - { id: 9, name: 'Engerau restaurant', url: 'https://www.zomato.com/sk/bratislava/engerau-restaurant-petr%C5%BEalka-bratislava-v/denn%C3%A9-menu', module: 'engerau' }, - { id: 10, name: 'Lokálka', url: 'http://www.lokalka.sk/kopcianska-2/', module: 'lokalka' } - ], - themes: { - 'jano': { name: 'Jano', template: '../views/index.html' }, - 'matus': { name: 'Matúš', template: '../views/index3.html' }, - 'iveta': { name: 'Iveta', template: '../views/index4.html' }, - 'diana': { name: 'Diana', template: '../views/index6.html' }, - 'telka': { name: 'Telka', template: '../views/index5.html' } - } -}; diff --git a/config.ts b/config.ts new file mode 100644 index 00000000..e1602073 --- /dev/null +++ b/config.ts @@ -0,0 +1,36 @@ +import { IParser } from "./parsers/types.js"; +import { DerbyPub } from "./parsers/einpark/derbypub.js"; +import { MKMRestaurant } from "./parsers/einpark/mkmrestaurant.js"; +import { PomodoroRosso } from "./parsers/einpark/pomodoro-rosso.js"; + +export interface IConfig { + readonly isProduction: boolean; + readonly scraperApiKey?: string; + readonly appInsightsConnectionString?: string; + readonly port: number; + readonly bypassCache: boolean; + readonly cacheExpiration: number; + readonly requestTimeout: number; + readonly parserTimeout: number; + readonly restaurants: Record; +} + +export class Config implements IConfig { + public readonly isProduction = process.env.NODE_ENV === "production"; + public readonly scraperApiKey = process.env.SCRAPER_API_KEY; + public readonly appInsightsConnectionString = + process.env.APPLICATIONINSIGHTS_CONNECTION_STRING; + public readonly port = (process.env.PORT as unknown as number) || 54321; + public readonly bypassCache = process.env.AT11_NO_CACHE === "true"; + public readonly cacheExpiration = 2 * 60 * 60; // 2h + public readonly requestTimeout = 15 * 1000; // 15s + public readonly parserTimeout = 15 * 1000; // 15s + public readonly restaurants = { + derby: { name: "Derby Pub", parser: new DerbyPub() }, + mkm: { name: "MKM Restaurant", parser: new MKMRestaurant() }, + "pomodoro-rosso": { + name: "Pomodoro Rosso", + parser: new PomodoroRosso(), + }, + }; +} diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..5f6438e4 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,33 @@ +import eslint from "@eslint/js"; +import { defineConfig, globalIgnores } from "eslint/config"; +import tseslint from "typescript-eslint"; +import globals from "globals"; +import eslintConfigPrettier from "eslint-config-prettier/flat"; + +export default defineConfig( + globalIgnores(["dist/**"]), + eslint.configs.recommended, + tseslint.configs.recommendedTypeChecked, + { + files: ["**/*.ts"], + languageOptions: { + parserOptions: { + projectService: true, + }, + }, + }, + { + files: ["**/*.js", "**/*.mjs"], + extends: [tseslint.configs.disableTypeChecked], + }, + { + files: ["**/*.js"], + languageOptions: { + globals: { + ...globals.browser, + ...globals.jquery, + }, + }, + }, + eslintConfigPrettier, +); diff --git a/menuFetcher.js b/menuFetcher.js deleted file mode 100644 index b58a7b34..00000000 --- a/menuFetcher.js +++ /dev/null @@ -1,111 +0,0 @@ -var request = require('request'); -var cache = require('./cache'); -var config = require('./config'); -var charset = require('charset'); -var iconv = require('iconv-lite'); - -module.exports.fetchMenu = function(url, date, postParams, parseCallback, doneCallback) { - var cached = cache.get(date + ":" + url); - if (cached && !process.env.AT11_NO_CACHE) - { - doneCallback(null, cached); - } - else - { - load(url, date, postParams, parseCallback, function(error, menu) { - if (!error) - { - if (menu.length > 0) - { - cache.set(date + ":" + url, menu); - } - //we need to go through cache to get cache timestamp - doneCallback(null, cache.get(date + ":" + url)); - } - else - { - console.error("Error for %s: %s", url, error); - doneCallback(error); - } - }); - } - - function load(url, date, postParams, parse, done) { - var options = { - url: url, - method: postParams ? "POST" : "GET", - form: postParams, - encoding: 'binary', - timeout: 10 * 1000 // 10s timeout for request - }; - request(options, function(error, response, body) { - if (!error && response.statusCode === 200) - { - var enc = charset(response.headers, body); - if (enc !== 'utf-8') - { - body = iconv.decode(new Buffer(body, 'binary'), enc).toString('utf-8'); - } - - var timer = setTimeout(function() { - timer = null;//clear needed as value is kept even after timeout fired - done(new Error("Parser timeout")); - }, config.parserTimeout); - - try - { - parse(body, date, function(menu) { - if (!timer) - { - //multiple calls in parser or parser called after timeout - return; - } - clearTimeout(timer); - timer = null; //clearTimeout does not null the value - - try - { - if (!Array.isArray(menu)) - { - throw "Invalid menu returned (expected array, got " + typeof menu + ")"; - } - menu.forEach(function(item) { - if (typeof item !== "object") - { - throw "Menu item should be object, but got " + typeof item; - } - if (typeof item.isSoup !== "boolean") - { - throw "Menu item has wrong 'isSoup' flag (" + typeof item.isSoup + ")"; - } - if (typeof item.text !== "string") - { - throw "Menu item has wrong 'text' property (" + typeof item.text + ")"; - } - if (typeof item.price !== "number") - { - throw "Menu item has wrong 'price' property (" + typeof item.price + ")"; - } - item.price = isNaN(item.price) ? "" : item.price.toFixed(2).replace(".", ",") + " €"; //convert to presentable form - }); - done(null, menu); - } - catch (err) - { - done(err); - } - }); - } - catch (err) //catches only synchronous errors in parser code - { - clearTimeout(timer); - doneCallback(err); - } - } - else - { - doneCallback(error || new Error("Response code " + response.statusCode)); - } - }); - } -}; diff --git a/menuFetcher.ts b/menuFetcher.ts new file mode 100644 index 00000000..cbbdb299 --- /dev/null +++ b/menuFetcher.ts @@ -0,0 +1,99 @@ +import get, { isAxiosError } from "axios"; +import NodeCache from "node-cache"; + +import { IConfig } from "./config.js"; +import { IMenuItem, IParser } from "./parsers/types.js"; +import { parserTimeout } from "./parsers/parserUtil.js"; + +export type IMenuResult = + | { + type: "menu"; + timestamp: Date; + menu: IMenuItem[]; + } + | { + type: "error"; + timestamp: Date; + error: string; + }; + +export class MenuFetcher { + private readonly _runningRequests: { [url: string]: Promise } = + {}; + + constructor( + private readonly _config: IConfig, + private readonly _cache: NodeCache, + ) {} + + public async fetchMenu(date: Date, parser: IParser): Promise { + const url = parser.urlFactory(date); + const cacheKey = date.toISOString() + ":" + url; + const cached = this._cache.get(cacheKey); + if (cached && !this._config.bypassCache) { + return cached; + } else { + try { + const menu = await this.load(url, date, parser); + this._cache.set( + cacheKey, + { type: "menu", menu, timestamp: new Date() }, + this._config.cacheExpiration, + ); + } catch (error) { + console.error( + `Error loading menu from ${url}`, + isAxiosError(error) ? error.message : error, + ); + this._cache.set( + cacheKey, + { + type: "error", + error: String(error), + timestamp: new Date(), + }, + this._config.cacheExpiration / 2, + ); + } + return this._cache.get(cacheKey)!; + } + } + + private load( + url: string, + date: Date, + parser: IParser, + ): Promise { + // on production (azure) use scraper api for zomato requests, otherwise zomato blocks them + if (this._config.isProduction && url.search("zomato") >= 0) { + url = `http://api.scraperapi.com?api_key=${this._config.scraperApiKey}&url=${encodeURIComponent(url)}`; + } + + if (this._runningRequests[url] === undefined) { + this._runningRequests[url] = get(url, { + method: "get", + headers: { + "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)", + Accept: "text/html,*/*", + "Accept-Language": "sk", // we want response in slovak (useful for menu portals that use localization, like zomato) + }, + timeout: this._config.requestTimeout, + }) + .then((response) => { + if (response.status === 200) { + return Promise.race([ + parserTimeout(this._config.parserTimeout), + parser.parse(response.data, date), + ]); + } + throw new Error( + `Wrong response status ${response.status} for ${url}`, + ); + }) + .finally(() => { + delete this._runningRequests[url]; + }); + } + return this._runningRequests[url]; + } +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..0c26aaac --- /dev/null +++ b/package-lock.json @@ -0,0 +1,7500 @@ +{ + "name": "at11", + "version": "2.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "at11", + "version": "2.1.0", + "license": "Unlicense", + "dependencies": { + "applicationinsights": "^3.15.1", + "axios": "^1.18.1", + "cheerio": "^1.2.0", + "date-fns": "^4.4.0", + "express": "^5.2.1", + "hbs": "^4.2.1", + "node-cache": "^5.1.2" + }, + "devDependencies": { + "@eslint/js": "^10.0.1", + "@types/express": "^5.0.6", + "@types/hbs": "^4.0.5", + "@types/mocha": "^10.0.10", + "@types/node": "^24.0.0", + "eslint": "^10.7.0", + "eslint-config-prettier": "^10.1.8", + "globals": "^17.7.0", + "mocha": "^11.7.6", + "prettier": "^3.9.6", + "typescript": "^6.0.3", + "typescript-eslint": "^8.65.0" + } + }, + "node_modules/@azure-rest/core-client": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@azure-rest/core-client/-/core-client-2.8.0.tgz", + "integrity": "sha512-F1ybHeN+++QhyFCF/ehLUEvrOB6fehPdFBFtGdj0C3B2lpQ9zkPiO5JDgsqc6IfjuUe6b3dAbXK0a7+VgSGfhw==", + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.1.2", + "@azure/core-auth": "^1.10.0", + "@azure/core-rest-pipeline": "^1.24.0", + "@azure/core-tracing": "^1.3.0", + "@typespec/ts-http-runtime": "^0.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@azure/abort-controller": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.2.0.tgz", + "integrity": "sha512-fNAjWnA/nZ2jz31kxR/AqRaUT8ewHBw/WuBIosK0moMy1C9e5ValbDfFdIxJzVOOYaYkV/b2F1S4H/aHiqfVQg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@azure/core-auth": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.11.0.tgz", + "integrity": "sha512-IUZydyTUkDnYdstOW9pFOOUQlBjAepK5teihDE3x6yxsPJs/hsAaaYpeGxdxrgtOiJbBKSjKW7MDk7AEhb4LRg==", + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.1.2", + "@azure/core-util": "^1.13.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@azure/core-client": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.11.0.tgz", + "integrity": "sha512-JjQWO6akOck45PH/XBrxzsQGAiKrfFl4m5iggJ0ItMIz5omRufOXWpqCPpdjKN3vKDzlSUvFjaMb7Zwf0gvAdA==", + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.1.2", + "@azure/core-auth": "^1.10.0", + "@azure/core-rest-pipeline": "^1.22.0", + "@azure/core-tracing": "^1.3.0", + "@azure/core-util": "^1.13.0", + "@azure/logger": "^1.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@azure/core-rest-pipeline": { + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.25.0.tgz", + "integrity": "sha512-bMs8ekJLjX8wPV+9IPBges1SLPyuDtE9g5gLDWOpxzKcoOFQnpLGkbcT1tdw3FaAmDS1gnPmMmJ6y/T5B96kIA==", + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.1.2", + "@azure/core-auth": "^1.10.0", + "@azure/core-tracing": "^1.3.0", + "@azure/core-util": "^1.13.0", + "@azure/logger": "^1.3.0", + "@typespec/ts-http-runtime": "^0.3.4", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@azure/core-tracing": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.4.0.tgz", + "integrity": "sha512-eGwxD0AtncrxeBM4tG8R55Pc3rdX1hNW2WibJAgYpCVA6E93mvvVH+LcssoVjOBrSKWS55yEIHsk0X8ctHmfOQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@azure/core-util": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.14.0.tgz", + "integrity": "sha512-9n2pWK61veAuN0V20t9lOuoV4CFMdyAZ1ygZzvBGk/pBBJRib/PjL9PLXa/aI2CcPpyHfqVsxxqLCYl6uZlfDw==", + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.1.2", + "@typespec/ts-http-runtime": "^0.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@azure/functions": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/@azure/functions/-/functions-4.16.2.tgz", + "integrity": "sha512-6uq0Z7e3njy8fHpgCVIJWDtbkZz+BYXc6L8fQjisf8+hPdnauM5yZ70j9YC8xas6zvL1dFA+EfLuZcNYyuWLTg==", + "license": "MIT", + "dependencies": { + "@azure/functions-extensions-base": "0.3.0", + "cookie": "^0.7.0" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@azure/functions-extensions-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@azure/functions-extensions-base/-/functions-extensions-base-0.3.0.tgz", + "integrity": "sha512-Cux0hLu5ZXlC/Kb+yvJVhRLIdkfFwui2HeT5oGZL00r/GCUUkhGTzRfZUjRN4Bq729mPv3okPucz2z7SMQLStA==", + "license": "MIT", + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@azure/identity": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.13.1.tgz", + "integrity": "sha512-5C/2WD5Vb1lHnZS16dNQRPMjN6oV/Upba+C9nBIs15PmOi6A3ZGs4Lr2u60zw4S04gi+u3cEXiqTVP7M4Pz3kw==", + "license": "MIT", + "dependencies": { + "@azure/abort-controller": "^2.0.0", + "@azure/core-auth": "^1.9.0", + "@azure/core-client": "^1.9.2", + "@azure/core-rest-pipeline": "^1.17.0", + "@azure/core-tracing": "^1.0.0", + "@azure/core-util": "^1.11.0", + "@azure/logger": "^1.0.0", + "@azure/msal-browser": "^5.5.0", + "@azure/msal-node": "^5.1.0", + "open": "^10.1.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/logger": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.4.0.tgz", + "integrity": "sha512-rbAE25KUfjU/s3XHUdJgceoCP5dEOpMx85J04kF+QMdta73XkuG9JGHHinch+XIoKpBdqljin+KqURpJriSzLA==", + "license": "MIT", + "dependencies": { + "@typespec/ts-http-runtime": "^0.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@azure/monitor-opentelemetry": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/@azure/monitor-opentelemetry/-/monitor-opentelemetry-1.18.2.tgz", + "integrity": "sha512-Alk3qvFew2HAq+PEe/TPlbIOMOX+VivEDF8U7JfBpkqYVACdw5Ae5TbhS5SnXvREnmO/FmkfGqf8ILgOD77Row==", + "license": "MIT", + "dependencies": { + "@azure-rest/core-client": "^2.5.2", + "@azure/core-auth": "^1.10.1", + "@azure/core-rest-pipeline": "^1.22.2", + "@azure/core-tracing": "^1.2.0", + "@azure/logger": "^1.3.0", + "@azure/monitor-opentelemetry-exporter": "1.0.0-beta.43", + "@azure/opentelemetry-instrumentation-azure-sdk": "^1.1.0-beta.1", + "@microsoft/applicationinsights-web-snippet": "^1.2.3", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/api-logs": "^0.219.0", + "@opentelemetry/core": "^2.8.0", + "@opentelemetry/instrumentation": "^0.219.0", + "@opentelemetry/instrumentation-bunyan": "^0.62.0", + "@opentelemetry/instrumentation-http": "^0.219.0", + "@opentelemetry/instrumentation-mongodb": "^0.70.0", + "@opentelemetry/instrumentation-mysql": "^0.63.0", + "@opentelemetry/instrumentation-pg": "^0.69.0", + "@opentelemetry/instrumentation-redis": "^0.65.0", + "@opentelemetry/instrumentation-winston": "^0.61.0", + "@opentelemetry/resource-detector-azure": "^0.25.0", + "@opentelemetry/resources": "^2.8.0", + "@opentelemetry/sdk-logs": "^0.219.0", + "@opentelemetry/sdk-metrics": "^2.8.0", + "@opentelemetry/sdk-node": "^0.219.0", + "@opentelemetry/sdk-trace-base": "^2.8.0", + "@opentelemetry/sdk-trace-node": "^2.8.0", + "@opentelemetry/semantic-conventions": "^1.40.0", + "@opentelemetry/winston-transport": "^0.27.0", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@azure/monitor-opentelemetry-exporter": { + "version": "1.0.0-beta.43", + "resolved": "https://registry.npmjs.org/@azure/monitor-opentelemetry-exporter/-/monitor-opentelemetry-exporter-1.0.0-beta.43.tgz", + "integrity": "sha512-551lMY6gSf7TO+j15nmQ23+nG9fExb664TH9RDs9zUul1xHt3NUtfsZe90nNhOzMEeg+I1f7zn955dvH5o6yjA==", + "license": "MIT", + "dependencies": { + "@azure-rest/core-client": "^2.5.2", + "@azure/core-auth": "^1.9.0", + "@azure/core-client": "^1.9.2", + "@azure/core-rest-pipeline": "^1.19.0", + "@azure/core-util": "^1.11.0", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/api-logs": "^0.219.0", + "@opentelemetry/core": "^2.8.0", + "@opentelemetry/resources": "^2.8.0", + "@opentelemetry/sdk-logs": "^0.219.0", + "@opentelemetry/sdk-metrics": "^2.8.0", + "@opentelemetry/sdk-trace-base": "^2.8.0", + "@opentelemetry/semantic-conventions": "^1.40.0", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@azure/monitor-opentelemetry-exporter/node_modules/@opentelemetry/api-logs": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.219.0.tgz", + "integrity": "sha512-FFx7YnaYJlIjqWW/AG/yAZ0L/NEY724PipXXXQLdtZPbLwBGbUMTGL1i/esI56TWfTUXxhLfpgrnWJCG8aUJyg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@azure/monitor-opentelemetry-exporter/node_modules/@opentelemetry/core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.8.0.tgz", + "integrity": "sha512-hd1Lfh8p545nNz+jq1Ejfz+Mn1hyLuxYn1YzTfFNrxr8urEWMNQLPf1Th8kjOH+HxwawCrtgBp8JpBUR4ZSgww==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@azure/monitor-opentelemetry-exporter/node_modules/@opentelemetry/resources": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.8.0.tgz", + "integrity": "sha512-qmXQ27ilDbUK/vGMqwL8D4/rhn76C+sherM4wTbjlfknR8Nvfc/hCxjRJPhkzZzUsPiNg16SA31NxMabwttRjg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@azure/monitor-opentelemetry-exporter/node_modules/@opentelemetry/sdk-logs": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.219.0.tgz", + "integrity": "sha512-s6lTKRakaPClvKoWHRChxnXjDMkM/TQ30ff78jN6EBGf7MI7VzANE5PU3f4z9qDUudWjvZjOLHG0rBnBKYvoXA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.219.0", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.10.0" + } + }, + "node_modules/@azure/monitor-opentelemetry/node_modules/@azure/opentelemetry-instrumentation-azure-sdk": { + "version": "1.1.0-beta.1", + "resolved": "https://registry.npmjs.org/@azure/opentelemetry-instrumentation-azure-sdk/-/opentelemetry-instrumentation-azure-sdk-1.1.0-beta.1.tgz", + "integrity": "sha512-FJCHWlMA//XMs5rxf1z/mN0gaWPbJhlAVw5l4IxKhEtZX2bgNERlqbdBWXNjjkok+nTh0UcKqV5G0rrCupo+4A==", + "license": "MIT", + "dependencies": { + "@azure/core-tracing": "^1.2.0", + "@azure/logger": "^1.0.0", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.211.0", + "@opentelemetry/sdk-trace-web": "^2.0.0", + "tslib": "^2.7.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/monitor-opentelemetry/node_modules/@azure/opentelemetry-instrumentation-azure-sdk/node_modules/@opentelemetry/api-logs": { + "version": "0.211.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.211.0.tgz", + "integrity": "sha512-swFdZq8MCdmdR22jTVGQDhwqDzcI4M10nhjXkLr1EsIzXgZBqm4ZlmmcWsg3TSNf+3mzgOiqveXmBLZuDi2Lgg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@azure/monitor-opentelemetry/node_modules/@azure/opentelemetry-instrumentation-azure-sdk/node_modules/@opentelemetry/instrumentation": { + "version": "0.211.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.211.0.tgz", + "integrity": "sha512-h0nrZEC/zvI994nhg7EgQ8URIHt0uDTwN90r3qQUdZORS455bbx+YebnGeEuFghUT0HlJSrLF4iHw67f+odY+Q==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.211.0", + "import-in-the-middle": "^2.0.0", + "require-in-the-middle": "^8.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@azure/monitor-opentelemetry/node_modules/@opentelemetry/api-logs": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.219.0.tgz", + "integrity": "sha512-FFx7YnaYJlIjqWW/AG/yAZ0L/NEY724PipXXXQLdtZPbLwBGbUMTGL1i/esI56TWfTUXxhLfpgrnWJCG8aUJyg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@azure/monitor-opentelemetry/node_modules/@opentelemetry/core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.8.0.tgz", + "integrity": "sha512-hd1Lfh8p545nNz+jq1Ejfz+Mn1hyLuxYn1YzTfFNrxr8urEWMNQLPf1Th8kjOH+HxwawCrtgBp8JpBUR4ZSgww==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@azure/monitor-opentelemetry/node_modules/@opentelemetry/resources": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.8.0.tgz", + "integrity": "sha512-qmXQ27ilDbUK/vGMqwL8D4/rhn76C+sherM4wTbjlfknR8Nvfc/hCxjRJPhkzZzUsPiNg16SA31NxMabwttRjg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@azure/monitor-opentelemetry/node_modules/@opentelemetry/sdk-logs": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.219.0.tgz", + "integrity": "sha512-s6lTKRakaPClvKoWHRChxnXjDMkM/TQ30ff78jN6EBGf7MI7VzANE5PU3f4z9qDUudWjvZjOLHG0rBnBKYvoXA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.219.0", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.10.0" + } + }, + "node_modules/@azure/monitor-opentelemetry/node_modules/import-in-the-middle": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", + "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.15.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^2.2.0", + "module-details-from-path": "^1.0.4" + } + }, + "node_modules/@azure/msal-browser": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-5.17.1.tgz", + "integrity": "sha512-zBhRGzABKSI7hfWh5EaZmril5ybZ7imBN1qEZl5sDTaelr+l8SnPjZO50Q4dnKnm347YPIlBMSnXKZyh3Yu5DQ==", + "license": "MIT", + "dependencies": { + "@azure/msal-common": "16.11.2" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/msal-common": { + "version": "16.11.2", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-16.11.2.tgz", + "integrity": "sha512-yDhtBOGDCdK9ipQ9g3+wmlMEPnZx2pXaDicDd9jYyR1L+7lEbvEohTDmF5qejZDutZY3m9pWPxeYxzNC701A2w==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/msal-node": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-5.4.2.tgz", + "integrity": "sha512-fnqOpGYAV+i0RH4W5HB6Oy1IhqGZoCdnp7Y2Sa9k18FlT8aBkCA7L8Hv19hUHLDUK6kVjUO29AfnGX6wgAHyNg==", + "license": "MIT", + "dependencies": { + "@azure/msal-common": "16.11.2", + "jsonwebtoken": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@azure/opentelemetry-instrumentation-azure-sdk": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@azure/opentelemetry-instrumentation-azure-sdk/-/opentelemetry-instrumentation-azure-sdk-1.0.0.tgz", + "integrity": "sha512-Y8rZOIMXQY/GwNRL+uLVuwIn9aEa/KnnggyYUmFxC1MigmRJCNH5NxMmxKSpddXF9SW6Z1ijRd6Pptd2A5OhGw==", + "license": "MIT", + "dependencies": { + "@azure/core-tracing": "^1.2.0", + "@azure/logger": "^1.0.0", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.211.0", + "@opentelemetry/sdk-trace-web": "^2.0.0", + "tslib": "^2.7.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@azure/opentelemetry-instrumentation-azure-sdk/node_modules/@opentelemetry/api-logs": { + "version": "0.211.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.211.0.tgz", + "integrity": "sha512-swFdZq8MCdmdR22jTVGQDhwqDzcI4M10nhjXkLr1EsIzXgZBqm4ZlmmcWsg3TSNf+3mzgOiqveXmBLZuDi2Lgg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@azure/opentelemetry-instrumentation-azure-sdk/node_modules/@opentelemetry/instrumentation": { + "version": "0.211.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.211.0.tgz", + "integrity": "sha512-h0nrZEC/zvI994nhg7EgQ8URIHt0uDTwN90r3qQUdZORS455bbx+YebnGeEuFghUT0HlJSrLF4iHw67f+odY+Q==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.211.0", + "import-in-the-middle": "^2.0.0", + "require-in-the-middle": "^8.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@azure/opentelemetry-instrumentation-azure-sdk/node_modules/import-in-the-middle": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-2.0.6.tgz", + "integrity": "sha512-3vZV3jX0XRFW3EJDTwzWoZa+RH1b8eTTx6YOCjglrLyPuepwoBti1k3L2dKwdCUrnVEfc5CuRuGstaC/uQJJaw==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.15.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^2.2.0", + "module-details-from-path": "^1.0.4" + } + }, + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^3.0.5", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz", + "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/js": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", + "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "eslint": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@eslint/object-schema": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz", + "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.4.tgz", + "integrity": "sha512-k9Dj3DV/itK9D06Y8f190Qgop7/Ui+D0njFV3LHMPwPT75DpXLQohE9Wmz0QElrJnzsjB7KPWiKJbOl7IPDArQ==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/proto-loader": "^0.8.0", + "@js-sdsl/ordered-map": "^4.4.2" + }, + "engines": { + "node": ">=12.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.1.tgz", + "integrity": "sha512-wtF6h+DY6M3YaDBPAmvuuA6jV8Sif9MjtOI5euKFWRgCDl5PeDpPsHR9u2l6St5ceY8AZgoNDww5+HvEsXFsGg==", + "license": "Apache-2.0", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.5.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/@microsoft/applicationinsights-web-snippet": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-web-snippet/-/applicationinsights-web-snippet-1.2.3.tgz", + "integrity": "sha512-59ex4x1/PabGQIg+o0GKG5olqAJYBvMOiXec/9HCD3hK2y36YMWT0ivq5mequvtS5+21kco3SOnMB6QyScLPIA==", + "license": "MIT" + }, + "node_modules/@opentelemetry/api": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz", + "integrity": "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/api-logs": { + "version": "0.218.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.218.0.tgz", + "integrity": "sha512-fmEWp5kXlGEc3i/lR698Hz41DfGyN4Tbe4g7L1AxSc7fF8Xeh/FQ9Quqpa9dVA413Q1Ad43QOLzU4JoXgbFPWw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/configuration": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/configuration/-/configuration-0.219.0.tgz", + "integrity": "sha512-wXZUYv4ngu43nA4WEhuXNacm46LW+17LRM8nKyIhBzroRA24PBYjMnakwzR/w777nFUB5xlgsYTTeuXxumZM1Q==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "yaml": "^2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.9.0" + } + }, + "node_modules/@opentelemetry/configuration/node_modules/@opentelemetry/core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.8.0.tgz", + "integrity": "sha512-hd1Lfh8p545nNz+jq1Ejfz+Mn1hyLuxYn1YzTfFNrxr8urEWMNQLPf1Th8kjOH+HxwawCrtgBp8JpBUR4ZSgww==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/context-async-hooks": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.8.0.tgz", + "integrity": "sha512-/3FIraneMcng67SUJCxvyInk/oxzwsxyadufk0wwfOBLf5wqtAGX4MoQASwSbndBPeARzBryUM9Azr5kHIdWLw==", + "license": "Apache-2.0", + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/core": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.10.0.tgz", + "integrity": "sha512-/wNZ8twnEQQA4HoHu22+vcsdru6pWPWxW+7w+FlxT6Id7PE/WIbZmVKkte+PF72e0F2dnImFeHD2syyE1Mw6MQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-grpc": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-grpc/-/exporter-logs-otlp-grpc-0.219.0.tgz", + "integrity": "sha512-7SvzDCIclHWAcCwZ1MTOLcwn4BVNPGI3QxS/DJraPNe1TTL+4TvUBq5zeQV8tsnYvtDN7wKW2qocVmaCP2l7sQ==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.14.3", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/otlp-exporter-base": "0.219.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.219.0", + "@opentelemetry/otlp-transformer": "0.219.0", + "@opentelemetry/sdk-logs": "0.219.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-grpc/node_modules/@opentelemetry/api-logs": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.219.0.tgz", + "integrity": "sha512-FFx7YnaYJlIjqWW/AG/yAZ0L/NEY724PipXXXQLdtZPbLwBGbUMTGL1i/esI56TWfTUXxhLfpgrnWJCG8aUJyg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-grpc/node_modules/@opentelemetry/core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.8.0.tgz", + "integrity": "sha512-hd1Lfh8p545nNz+jq1Ejfz+Mn1hyLuxYn1YzTfFNrxr8urEWMNQLPf1Th8kjOH+HxwawCrtgBp8JpBUR4ZSgww==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-grpc/node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.219.0.tgz", + "integrity": "sha512-zvIxQX/AZUVKDU+hCuYx+7UkiP7GRdnk1ZbFQRYzHvYp47cAWR4j3IhoPhV9KaeXEv2xdGq3IA6PnpzDmLcmSA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/otlp-transformer": "0.219.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-grpc/node_modules/@opentelemetry/otlp-transformer": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.219.0.tgz", + "integrity": "sha512-aaYKAyXhw9VchKZVGOopD3Gw/kPsyrX2c6IQ0AW32mTjqmZOh5Y6Gf5OYqTNqVktAeBjmFinhyFaCwW6GYK9YQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.219.0", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/sdk-logs": "0.219.0", + "@opentelemetry/sdk-metrics": "2.8.0", + "@opentelemetry/sdk-trace-base": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-grpc/node_modules/@opentelemetry/resources": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.8.0.tgz", + "integrity": "sha512-qmXQ27ilDbUK/vGMqwL8D4/rhn76C+sherM4wTbjlfknR8Nvfc/hCxjRJPhkzZzUsPiNg16SA31NxMabwttRjg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-grpc/node_modules/@opentelemetry/sdk-logs": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.219.0.tgz", + "integrity": "sha512-s6lTKRakaPClvKoWHRChxnXjDMkM/TQ30ff78jN6EBGf7MI7VzANE5PU3f4z9qDUudWjvZjOLHG0rBnBKYvoXA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.219.0", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-grpc/node_modules/@opentelemetry/sdk-metrics": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.8.0.tgz", + "integrity": "sha512-UDBGaj6W0Rgy5rTTaoxs8gVGF/aGkAKyjurJv7se6wjRxJu7FoquTLT/vt54DZfo4crbprYfhX/SOK9+BPw1qg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-grpc/node_modules/@opentelemetry/sdk-trace-base": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.8.0.tgz", + "integrity": "sha512-mhU4jp+vW0mGbFRd+GeXHvmfA4aDqWjBjLC3pE5XMpLs0IE2ryYb019Ts2AQrOq67gaTF25D91+fgvEHDZEnuQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-http": { + "version": "0.218.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.218.0.tgz", + "integrity": "sha512-Qx+4rpVHzgg89dawcWRHyt+XRXeLnhFz/qBtvggmjkcgPUdr+NAB0/u/eIPA8yAeJV0J80Vz43JZCh/XFvZFGw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.218.0", + "@opentelemetry/core": "2.7.1", + "@opentelemetry/otlp-exporter-base": "0.218.0", + "@opentelemetry/otlp-transformer": "0.218.0", + "@opentelemetry/sdk-logs": "0.218.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-http/node_modules/@opentelemetry/core": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.1.tgz", + "integrity": "sha512-QAqIj32AtK6+pEVNG7EOVxHdE06RP+FM5qpiEJ4RtDcFIqKUZHYhl7/7UY5efhwmwNAg7j8QbJVBLxMerc0+gw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-proto": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-proto/-/exporter-logs-otlp-proto-0.219.0.tgz", + "integrity": "sha512-Ayw4Gf71PS9jhBVaYywa4WsajnqfDehMkTdVH3TSAVHqPcsAv/AhH/wTNRYNt99szeYr6Gbd/D6RjZD77wAxHg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.219.0", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/otlp-exporter-base": "0.219.0", + "@opentelemetry/otlp-transformer": "0.219.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/sdk-logs": "0.219.0", + "@opentelemetry/sdk-trace-base": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/api-logs": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.219.0.tgz", + "integrity": "sha512-FFx7YnaYJlIjqWW/AG/yAZ0L/NEY724PipXXXQLdtZPbLwBGbUMTGL1i/esI56TWfTUXxhLfpgrnWJCG8aUJyg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.8.0.tgz", + "integrity": "sha512-hd1Lfh8p545nNz+jq1Ejfz+Mn1hyLuxYn1YzTfFNrxr8urEWMNQLPf1Th8kjOH+HxwawCrtgBp8JpBUR4ZSgww==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.219.0.tgz", + "integrity": "sha512-zvIxQX/AZUVKDU+hCuYx+7UkiP7GRdnk1ZbFQRYzHvYp47cAWR4j3IhoPhV9KaeXEv2xdGq3IA6PnpzDmLcmSA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/otlp-transformer": "0.219.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/otlp-transformer": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.219.0.tgz", + "integrity": "sha512-aaYKAyXhw9VchKZVGOopD3Gw/kPsyrX2c6IQ0AW32mTjqmZOh5Y6Gf5OYqTNqVktAeBjmFinhyFaCwW6GYK9YQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.219.0", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/sdk-logs": "0.219.0", + "@opentelemetry/sdk-metrics": "2.8.0", + "@opentelemetry/sdk-trace-base": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/resources": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.8.0.tgz", + "integrity": "sha512-qmXQ27ilDbUK/vGMqwL8D4/rhn76C+sherM4wTbjlfknR8Nvfc/hCxjRJPhkzZzUsPiNg16SA31NxMabwttRjg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/sdk-logs": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.219.0.tgz", + "integrity": "sha512-s6lTKRakaPClvKoWHRChxnXjDMkM/TQ30ff78jN6EBGf7MI7VzANE5PU3f4z9qDUudWjvZjOLHG0rBnBKYvoXA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.219.0", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/sdk-metrics": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.8.0.tgz", + "integrity": "sha512-UDBGaj6W0Rgy5rTTaoxs8gVGF/aGkAKyjurJv7se6wjRxJu7FoquTLT/vt54DZfo4crbprYfhX/SOK9+BPw1qg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-logs-otlp-proto/node_modules/@opentelemetry/sdk-trace-base": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.8.0.tgz", + "integrity": "sha512-mhU4jp+vW0mGbFRd+GeXHvmfA4aDqWjBjLC3pE5XMpLs0IE2ryYb019Ts2AQrOq67gaTF25D91+fgvEHDZEnuQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-grpc": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-grpc/-/exporter-metrics-otlp-grpc-0.219.0.tgz", + "integrity": "sha512-6LaaSrPxK5L55bXevWajvOMxGOpNm0n12tG53TeZaUeNzXwLPg6d2KCC1zAlGsojan+xRG71mA4Qqs9K2VVrKQ==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.14.3", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/exporter-metrics-otlp-http": "0.219.0", + "@opentelemetry/otlp-exporter-base": "0.219.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.219.0", + "@opentelemetry/otlp-transformer": "0.219.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/sdk-metrics": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/api-logs": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.219.0.tgz", + "integrity": "sha512-FFx7YnaYJlIjqWW/AG/yAZ0L/NEY724PipXXXQLdtZPbLwBGbUMTGL1i/esI56TWfTUXxhLfpgrnWJCG8aUJyg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.8.0.tgz", + "integrity": "sha512-hd1Lfh8p545nNz+jq1Ejfz+Mn1hyLuxYn1YzTfFNrxr8urEWMNQLPf1Th8kjOH+HxwawCrtgBp8JpBUR4ZSgww==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/exporter-metrics-otlp-http": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.219.0.tgz", + "integrity": "sha512-6CaDRbMVHZSDWzNXwrR8y/H4B/Z1eMNnkHiPQlTx3Ojz2OHY4X/aff/UC4P/3pHUQSuTfi3oh2UsPPZppw+Vrg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/otlp-exporter-base": "0.219.0", + "@opentelemetry/otlp-transformer": "0.219.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/sdk-metrics": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.219.0.tgz", + "integrity": "sha512-zvIxQX/AZUVKDU+hCuYx+7UkiP7GRdnk1ZbFQRYzHvYp47cAWR4j3IhoPhV9KaeXEv2xdGq3IA6PnpzDmLcmSA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/otlp-transformer": "0.219.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/otlp-transformer": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.219.0.tgz", + "integrity": "sha512-aaYKAyXhw9VchKZVGOopD3Gw/kPsyrX2c6IQ0AW32mTjqmZOh5Y6Gf5OYqTNqVktAeBjmFinhyFaCwW6GYK9YQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.219.0", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/sdk-logs": "0.219.0", + "@opentelemetry/sdk-metrics": "2.8.0", + "@opentelemetry/sdk-trace-base": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/resources": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.8.0.tgz", + "integrity": "sha512-qmXQ27ilDbUK/vGMqwL8D4/rhn76C+sherM4wTbjlfknR8Nvfc/hCxjRJPhkzZzUsPiNg16SA31NxMabwttRjg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/sdk-logs": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.219.0.tgz", + "integrity": "sha512-s6lTKRakaPClvKoWHRChxnXjDMkM/TQ30ff78jN6EBGf7MI7VzANE5PU3f4z9qDUudWjvZjOLHG0rBnBKYvoXA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.219.0", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/sdk-metrics": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.8.0.tgz", + "integrity": "sha512-UDBGaj6W0Rgy5rTTaoxs8gVGF/aGkAKyjurJv7se6wjRxJu7FoquTLT/vt54DZfo4crbprYfhX/SOK9+BPw1qg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-grpc/node_modules/@opentelemetry/sdk-trace-base": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.8.0.tgz", + "integrity": "sha512-mhU4jp+vW0mGbFRd+GeXHvmfA4aDqWjBjLC3pE5XMpLs0IE2ryYb019Ts2AQrOq67gaTF25D91+fgvEHDZEnuQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-http": { + "version": "0.218.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.218.0.tgz", + "integrity": "sha512-bV7d2OuMpZu2+gAaxUAhzfZ0h3WVZk8ETQUEE3DNSntbTaMpuITjtm8I0rNyHFdm7Ax57K6ty7SgFXlBmOLIvQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "@opentelemetry/otlp-exporter-base": "0.218.0", + "@opentelemetry/otlp-transformer": "0.218.0", + "@opentelemetry/resources": "2.7.1", + "@opentelemetry/sdk-metrics": "2.7.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/core": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.1.tgz", + "integrity": "sha512-QAqIj32AtK6+pEVNG7EOVxHdE06RP+FM5qpiEJ4RtDcFIqKUZHYhl7/7UY5efhwmwNAg7j8QbJVBLxMerc0+gw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/resources": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.1.tgz", + "integrity": "sha512-DeT6KKolmC4e/dRQvMQ/RwlnzhaqeiFOXY5ngoOPJ07GgVVKxZOg9EcrNZb5aTzUn+iCrJldAgOfQm1O/QfPAQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/sdk-metrics": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.7.1.tgz", + "integrity": "sha512-MpDJdkiFDs3Pm1RHO3KByuZbuBdJEXEAkiC0+yJdsZGVCdf1RpHR6n+LHDcS7ffmfrt5kVCzJSCfm4z2C7v0uQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "@opentelemetry/resources": "2.7.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-proto": { + "version": "0.218.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-proto/-/exporter-metrics-otlp-proto-0.218.0.tgz", + "integrity": "sha512-ubLddKjWULhla9YZRCj/rTBeppjJYE4e9w0icx5mTu3eFhWjQzbV75NYjXuIlEG+NJsBl6d+sTFw5Qu+oej4oQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "@opentelemetry/exporter-metrics-otlp-http": "0.218.0", + "@opentelemetry/otlp-exporter-base": "0.218.0", + "@opentelemetry/otlp-transformer": "0.218.0", + "@opentelemetry/resources": "2.7.1", + "@opentelemetry/sdk-metrics": "2.7.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/core": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.1.tgz", + "integrity": "sha512-QAqIj32AtK6+pEVNG7EOVxHdE06RP+FM5qpiEJ4RtDcFIqKUZHYhl7/7UY5efhwmwNAg7j8QbJVBLxMerc0+gw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/resources": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.1.tgz", + "integrity": "sha512-DeT6KKolmC4e/dRQvMQ/RwlnzhaqeiFOXY5ngoOPJ07GgVVKxZOg9EcrNZb5aTzUn+iCrJldAgOfQm1O/QfPAQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-metrics-otlp-proto/node_modules/@opentelemetry/sdk-metrics": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.7.1.tgz", + "integrity": "sha512-MpDJdkiFDs3Pm1RHO3KByuZbuBdJEXEAkiC0+yJdsZGVCdf1RpHR6n+LHDcS7ffmfrt5kVCzJSCfm4z2C7v0uQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "@opentelemetry/resources": "2.7.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-prometheus": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.219.0.tgz", + "integrity": "sha512-TxOnJ85eWJY5JyOJsNMXiRTYlkDcOv0u3KbXEzWCc+tUS9sjL/BC6BcdxZ0B9r2OFVqsrZFXUzSD2sZUy42Ucw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/sdk-metrics": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.8.0.tgz", + "integrity": "sha512-hd1Lfh8p545nNz+jq1Ejfz+Mn1hyLuxYn1YzTfFNrxr8urEWMNQLPf1Th8kjOH+HxwawCrtgBp8JpBUR4ZSgww==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/resources": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.8.0.tgz", + "integrity": "sha512-qmXQ27ilDbUK/vGMqwL8D4/rhn76C+sherM4wTbjlfknR8Nvfc/hCxjRJPhkzZzUsPiNg16SA31NxMabwttRjg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/sdk-metrics": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.8.0.tgz", + "integrity": "sha512-UDBGaj6W0Rgy5rTTaoxs8gVGF/aGkAKyjurJv7se6wjRxJu7FoquTLT/vt54DZfo4crbprYfhX/SOK9+BPw1qg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.219.0.tgz", + "integrity": "sha512-BkDNv1UD6BscW19MxbAxVmSYSSFuyeqR6buV2/HTYqA7GrR0EbTFzqG6h86T3PtXmpdbsWjMGLDdjG2rikG27Q==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.14.3", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/otlp-exporter-base": "0.219.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.219.0", + "@opentelemetry/otlp-transformer": "0.219.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/sdk-trace-base": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/api-logs": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.219.0.tgz", + "integrity": "sha512-FFx7YnaYJlIjqWW/AG/yAZ0L/NEY724PipXXXQLdtZPbLwBGbUMTGL1i/esI56TWfTUXxhLfpgrnWJCG8aUJyg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.8.0.tgz", + "integrity": "sha512-hd1Lfh8p545nNz+jq1Ejfz+Mn1hyLuxYn1YzTfFNrxr8urEWMNQLPf1Th8kjOH+HxwawCrtgBp8JpBUR4ZSgww==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.219.0.tgz", + "integrity": "sha512-zvIxQX/AZUVKDU+hCuYx+7UkiP7GRdnk1ZbFQRYzHvYp47cAWR4j3IhoPhV9KaeXEv2xdGq3IA6PnpzDmLcmSA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/otlp-transformer": "0.219.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/otlp-transformer": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.219.0.tgz", + "integrity": "sha512-aaYKAyXhw9VchKZVGOopD3Gw/kPsyrX2c6IQ0AW32mTjqmZOh5Y6Gf5OYqTNqVktAeBjmFinhyFaCwW6GYK9YQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.219.0", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/sdk-logs": "0.219.0", + "@opentelemetry/sdk-metrics": "2.8.0", + "@opentelemetry/sdk-trace-base": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/resources": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.8.0.tgz", + "integrity": "sha512-qmXQ27ilDbUK/vGMqwL8D4/rhn76C+sherM4wTbjlfknR8Nvfc/hCxjRJPhkzZzUsPiNg16SA31NxMabwttRjg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/sdk-logs": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.219.0.tgz", + "integrity": "sha512-s6lTKRakaPClvKoWHRChxnXjDMkM/TQ30ff78jN6EBGf7MI7VzANE5PU3f4z9qDUudWjvZjOLHG0rBnBKYvoXA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.219.0", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/sdk-metrics": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.8.0.tgz", + "integrity": "sha512-UDBGaj6W0Rgy5rTTaoxs8gVGF/aGkAKyjurJv7se6wjRxJu7FoquTLT/vt54DZfo4crbprYfhX/SOK9+BPw1qg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/sdk-trace-base": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.8.0.tgz", + "integrity": "sha512-mhU4jp+vW0mGbFRd+GeXHvmfA4aDqWjBjLC3pE5XMpLs0IE2ryYb019Ts2AQrOq67gaTF25D91+fgvEHDZEnuQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http": { + "version": "0.218.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.218.0.tgz", + "integrity": "sha512-8dqezsmPhtKitIK/eTipZhYl9EX2/gNQ5zUMhaz3uxEURwfkNf8IPvo6yNfrzbxdtpAOybS/+h7wmIWYqFSpiw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "@opentelemetry/otlp-exporter-base": "0.218.0", + "@opentelemetry/otlp-transformer": "0.218.0", + "@opentelemetry/resources": "2.7.1", + "@opentelemetry/sdk-trace-base": "2.7.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/core": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.1.tgz", + "integrity": "sha512-QAqIj32AtK6+pEVNG7EOVxHdE06RP+FM5qpiEJ4RtDcFIqKUZHYhl7/7UY5efhwmwNAg7j8QbJVBLxMerc0+gw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/resources": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.1.tgz", + "integrity": "sha512-DeT6KKolmC4e/dRQvMQ/RwlnzhaqeiFOXY5ngoOPJ07GgVVKxZOg9EcrNZb5aTzUn+iCrJldAgOfQm1O/QfPAQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/sdk-trace-base": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.7.1.tgz", + "integrity": "sha512-NAYIlsF8MPUsKqJMiDQJTMPOmlbawC1Iz/omMLygZ1C9am8fTKYjTaI+OZM+WTY3t3Glo0wnOg/6/pac6RGPPw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "@opentelemetry/resources": "2.7.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.219.0.tgz", + "integrity": "sha512-lF/LUBfhOFmxJa+SQsLN7ziV4MHa2pyKgOM6JNehSOfU+npjM4gwm9oIKEJrzrWcexMcqydiyoFy0XCb1Ql3wQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/otlp-exporter-base": "0.219.0", + "@opentelemetry/otlp-transformer": "0.219.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/sdk-trace-base": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/api-logs": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.219.0.tgz", + "integrity": "sha512-FFx7YnaYJlIjqWW/AG/yAZ0L/NEY724PipXXXQLdtZPbLwBGbUMTGL1i/esI56TWfTUXxhLfpgrnWJCG8aUJyg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.8.0.tgz", + "integrity": "sha512-hd1Lfh8p545nNz+jq1Ejfz+Mn1hyLuxYn1YzTfFNrxr8urEWMNQLPf1Th8kjOH+HxwawCrtgBp8JpBUR4ZSgww==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.219.0.tgz", + "integrity": "sha512-zvIxQX/AZUVKDU+hCuYx+7UkiP7GRdnk1ZbFQRYzHvYp47cAWR4j3IhoPhV9KaeXEv2xdGq3IA6PnpzDmLcmSA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/otlp-transformer": "0.219.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/otlp-transformer": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.219.0.tgz", + "integrity": "sha512-aaYKAyXhw9VchKZVGOopD3Gw/kPsyrX2c6IQ0AW32mTjqmZOh5Y6Gf5OYqTNqVktAeBjmFinhyFaCwW6GYK9YQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.219.0", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/sdk-logs": "0.219.0", + "@opentelemetry/sdk-metrics": "2.8.0", + "@opentelemetry/sdk-trace-base": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/resources": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.8.0.tgz", + "integrity": "sha512-qmXQ27ilDbUK/vGMqwL8D4/rhn76C+sherM4wTbjlfknR8Nvfc/hCxjRJPhkzZzUsPiNg16SA31NxMabwttRjg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/sdk-logs": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.219.0.tgz", + "integrity": "sha512-s6lTKRakaPClvKoWHRChxnXjDMkM/TQ30ff78jN6EBGf7MI7VzANE5PU3f4z9qDUudWjvZjOLHG0rBnBKYvoXA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.219.0", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/sdk-metrics": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.8.0.tgz", + "integrity": "sha512-UDBGaj6W0Rgy5rTTaoxs8gVGF/aGkAKyjurJv7se6wjRxJu7FoquTLT/vt54DZfo4crbprYfhX/SOK9+BPw1qg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/sdk-trace-base": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.8.0.tgz", + "integrity": "sha512-mhU4jp+vW0mGbFRd+GeXHvmfA4aDqWjBjLC3pE5XMpLs0IE2ryYb019Ts2AQrOq67gaTF25D91+fgvEHDZEnuQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-zipkin": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-2.8.0.tgz", + "integrity": "sha512-Mj84UkEa17BK2o903VTXW3wM8CrSZexGs4tRGVZVIMM9ni1T6TuGx5IrRfoWKAbshx42D5/kc7YV+axypLPYyA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/sdk-trace-base": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.8.0.tgz", + "integrity": "sha512-hd1Lfh8p545nNz+jq1Ejfz+Mn1hyLuxYn1YzTfFNrxr8urEWMNQLPf1Th8kjOH+HxwawCrtgBp8JpBUR4ZSgww==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/resources": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.8.0.tgz", + "integrity": "sha512-qmXQ27ilDbUK/vGMqwL8D4/rhn76C+sherM4wTbjlfknR8Nvfc/hCxjRJPhkzZzUsPiNg16SA31NxMabwttRjg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/sdk-trace-base": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.8.0.tgz", + "integrity": "sha512-mhU4jp+vW0mGbFRd+GeXHvmfA4aDqWjBjLC3pE5XMpLs0IE2ryYb019Ts2AQrOq67gaTF25D91+fgvEHDZEnuQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/instrumentation": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.219.0.tgz", + "integrity": "sha512-X5t7I8GyIO9rmGHwoedZLREpQqrF1WW2nxzNNym6HOKpFiE+rvqV3ngC0xcZVO2YwIGf3KKmRdWrYwdwz3H9RQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.219.0", + "import-in-the-middle": "^3.0.0", + "require-in-the-middle": "^8.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-bunyan": { + "version": "0.62.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.62.0.tgz", + "integrity": "sha512-4PjSfgyzKzhnnczUkbh8ogDclQqInBsSK0J3BQX4wRueK7cCGUyQghLQYqPW1TbzrXUfM0kNtrnu1D5Xbk3LEA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "^0.217.0", + "@opentelemetry/instrumentation": "^0.217.0", + "@types/bunyan": "1.8.11" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-bunyan/node_modules/@opentelemetry/api-logs": { + "version": "0.217.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.217.0.tgz", + "integrity": "sha512-Cdq0jW2lknrNfrAm92MyEAvpe2cRsKjdnQLHUL6xRA4IVUnsWx6P65E7NcUO0Y+L4w1Aee5iV8FvjSwd+lrs9A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-bunyan/node_modules/@opentelemetry/instrumentation": { + "version": "0.217.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.217.0.tgz", + "integrity": "sha512-24ucQMjz7Y34Kw3trbxL2ZrssbtgWnR+Clpaa+YdeWuuyH3Cvk23Q03PcQvqiZrDvt8AmQmjgg9v6Y9PHoxG7w==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.217.0", + "import-in-the-middle": "^3.0.0", + "require-in-the-middle": "^8.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.219.0.tgz", + "integrity": "sha512-nNt1fqpyah/OKjNHdEOu8xLwISppRU2qJuF8aR+fCcftVwdFkPgtworBLA+TI1HU2iF508jcQBF2gerWczJAXg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/instrumentation": "0.219.0", + "@opentelemetry/semantic-conventions": "^1.29.0", + "forwarded-parse": "2.1.2" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.8.0.tgz", + "integrity": "sha512-hd1Lfh8p545nNz+jq1Ejfz+Mn1hyLuxYn1YzTfFNrxr8urEWMNQLPf1Th8kjOH+HxwawCrtgBp8JpBUR4ZSgww==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongodb": { + "version": "0.70.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.70.0.tgz", + "integrity": "sha512-9DeBe6SiOkguL5uRyj20ma0I1lXgW0EYc9mUnABlMzbxYC3b7sczUFSj37eWaLzZNzTVQNr+U8UZZP2LvlZ+vw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.217.0", + "@opentelemetry/semantic-conventions": "^1.33.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongodb/node_modules/@opentelemetry/api-logs": { + "version": "0.217.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.217.0.tgz", + "integrity": "sha512-Cdq0jW2lknrNfrAm92MyEAvpe2cRsKjdnQLHUL6xRA4IVUnsWx6P65E7NcUO0Y+L4w1Aee5iV8FvjSwd+lrs9A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongodb/node_modules/@opentelemetry/instrumentation": { + "version": "0.217.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.217.0.tgz", + "integrity": "sha512-24ucQMjz7Y34Kw3trbxL2ZrssbtgWnR+Clpaa+YdeWuuyH3Cvk23Q03PcQvqiZrDvt8AmQmjgg9v6Y9PHoxG7w==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.217.0", + "import-in-the-middle": "^3.0.0", + "require-in-the-middle": "^8.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql": { + "version": "0.63.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.63.0.tgz", + "integrity": "sha512-IFzZiZtLgQEzK74OHT921n1ARRUyRWWe/5oa5nezuwQF4XzLEXIqTP+vthrZ4QJc1qIkRLgPROVDcjz20gEKew==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.217.0", + "@opentelemetry/semantic-conventions": "^1.33.0", + "@types/mysql": "2.15.27" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql/node_modules/@opentelemetry/api-logs": { + "version": "0.217.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.217.0.tgz", + "integrity": "sha512-Cdq0jW2lknrNfrAm92MyEAvpe2cRsKjdnQLHUL6xRA4IVUnsWx6P65E7NcUO0Y+L4w1Aee5iV8FvjSwd+lrs9A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql/node_modules/@opentelemetry/instrumentation": { + "version": "0.217.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.217.0.tgz", + "integrity": "sha512-24ucQMjz7Y34Kw3trbxL2ZrssbtgWnR+Clpaa+YdeWuuyH3Cvk23Q03PcQvqiZrDvt8AmQmjgg9v6Y9PHoxG7w==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.217.0", + "import-in-the-middle": "^3.0.0", + "require-in-the-middle": "^8.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg": { + "version": "0.69.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.69.0.tgz", + "integrity": "sha512-5tHz2AOyuYaWJePxybooIHPlV8v1EPBwrgFlfuuGXBV/EFnnQME+KEPJ9u9e3oe2aKd0gi8CEkTzZ61VwuWo5g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.217.0", + "@opentelemetry/semantic-conventions": "^1.34.0", + "@opentelemetry/sql-common": "^0.41.2", + "@types/pg": "8.15.6", + "@types/pg-pool": "2.0.7" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg/node_modules/@opentelemetry/api-logs": { + "version": "0.217.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.217.0.tgz", + "integrity": "sha512-Cdq0jW2lknrNfrAm92MyEAvpe2cRsKjdnQLHUL6xRA4IVUnsWx6P65E7NcUO0Y+L4w1Aee5iV8FvjSwd+lrs9A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg/node_modules/@opentelemetry/instrumentation": { + "version": "0.217.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.217.0.tgz", + "integrity": "sha512-24ucQMjz7Y34Kw3trbxL2ZrssbtgWnR+Clpaa+YdeWuuyH3Cvk23Q03PcQvqiZrDvt8AmQmjgg9v6Y9PHoxG7w==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.217.0", + "import-in-the-middle": "^3.0.0", + "require-in-the-middle": "^8.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis": { + "version": "0.65.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.65.0.tgz", + "integrity": "sha512-NwEhtBXwIKvcPSEGyYqjWaUZB1vfda1aVbEOTjhtBSbNDsxSXnGF1/xlwBB2yYZtLC4oYzlc9FRS7wX//X4LTg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/instrumentation": "^0.217.0", + "@opentelemetry/redis-common": "^0.38.3", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis/node_modules/@opentelemetry/api-logs": { + "version": "0.217.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.217.0.tgz", + "integrity": "sha512-Cdq0jW2lknrNfrAm92MyEAvpe2cRsKjdnQLHUL6xRA4IVUnsWx6P65E7NcUO0Y+L4w1Aee5iV8FvjSwd+lrs9A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis/node_modules/@opentelemetry/instrumentation": { + "version": "0.217.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.217.0.tgz", + "integrity": "sha512-24ucQMjz7Y34Kw3trbxL2ZrssbtgWnR+Clpaa+YdeWuuyH3Cvk23Q03PcQvqiZrDvt8AmQmjgg9v6Y9PHoxG7w==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.217.0", + "import-in-the-middle": "^3.0.0", + "require-in-the-middle": "^8.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-winston": { + "version": "0.61.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.61.0.tgz", + "integrity": "sha512-H600rWjFPFXK0UDGmWucEcbylXKI9i+7i2g8LGSkYqU44PCw09xFhKwv4VPTvyGmcEsCIlckbIKj/GvYy0UeEw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "^0.217.0", + "@opentelemetry/instrumentation": "^0.217.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-winston/node_modules/@opentelemetry/api-logs": { + "version": "0.217.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.217.0.tgz", + "integrity": "sha512-Cdq0jW2lknrNfrAm92MyEAvpe2cRsKjdnQLHUL6xRA4IVUnsWx6P65E7NcUO0Y+L4w1Aee5iV8FvjSwd+lrs9A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-winston/node_modules/@opentelemetry/instrumentation": { + "version": "0.217.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.217.0.tgz", + "integrity": "sha512-24ucQMjz7Y34Kw3trbxL2ZrssbtgWnR+Clpaa+YdeWuuyH3Cvk23Q03PcQvqiZrDvt8AmQmjgg9v6Y9PHoxG7w==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.217.0", + "import-in-the-middle": "^3.0.0", + "require-in-the-middle": "^8.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation/node_modules/@opentelemetry/api-logs": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.219.0.tgz", + "integrity": "sha512-FFx7YnaYJlIjqWW/AG/yAZ0L/NEY724PipXXXQLdtZPbLwBGbUMTGL1i/esI56TWfTUXxhLfpgrnWJCG8aUJyg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.218.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.218.0.tgz", + "integrity": "sha512-ZwqpkNL5W7RyGJPDZ9g06DvKp8KFTWPJPN12anpMQYSKpTSU0z3EIZuPq9vPGpS8siFyOqDYDAuCwlNO9FqgbA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "@opentelemetry/otlp-transformer": "0.218.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-exporter-base/node_modules/@opentelemetry/core": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.1.tgz", + "integrity": "sha512-QAqIj32AtK6+pEVNG7EOVxHdE06RP+FM5qpiEJ4RtDcFIqKUZHYhl7/7UY5efhwmwNAg7j8QbJVBLxMerc0+gw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-grpc-exporter-base": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.219.0.tgz", + "integrity": "sha512-iIk/s8QQu39zpTrRRmsW/Eg3SE2+Hg8tLWepr2FLRgmwUpNd0IpCTLJEHJ77hpt4hgIS8MAh44UYI4xQPZwWlw==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.14.3", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/otlp-exporter-base": "0.219.0", + "@opentelemetry/otlp-transformer": "0.219.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/api-logs": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.219.0.tgz", + "integrity": "sha512-FFx7YnaYJlIjqWW/AG/yAZ0L/NEY724PipXXXQLdtZPbLwBGbUMTGL1i/esI56TWfTUXxhLfpgrnWJCG8aUJyg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.8.0.tgz", + "integrity": "sha512-hd1Lfh8p545nNz+jq1Ejfz+Mn1hyLuxYn1YzTfFNrxr8urEWMNQLPf1Th8kjOH+HxwawCrtgBp8JpBUR4ZSgww==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.219.0.tgz", + "integrity": "sha512-zvIxQX/AZUVKDU+hCuYx+7UkiP7GRdnk1ZbFQRYzHvYp47cAWR4j3IhoPhV9KaeXEv2xdGq3IA6PnpzDmLcmSA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/otlp-transformer": "0.219.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/otlp-transformer": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.219.0.tgz", + "integrity": "sha512-aaYKAyXhw9VchKZVGOopD3Gw/kPsyrX2c6IQ0AW32mTjqmZOh5Y6Gf5OYqTNqVktAeBjmFinhyFaCwW6GYK9YQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.219.0", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/sdk-logs": "0.219.0", + "@opentelemetry/sdk-metrics": "2.8.0", + "@opentelemetry/sdk-trace-base": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/resources": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.8.0.tgz", + "integrity": "sha512-qmXQ27ilDbUK/vGMqwL8D4/rhn76C+sherM4wTbjlfknR8Nvfc/hCxjRJPhkzZzUsPiNg16SA31NxMabwttRjg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/sdk-logs": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.219.0.tgz", + "integrity": "sha512-s6lTKRakaPClvKoWHRChxnXjDMkM/TQ30ff78jN6EBGf7MI7VzANE5PU3f4z9qDUudWjvZjOLHG0rBnBKYvoXA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.219.0", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/sdk-metrics": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.8.0.tgz", + "integrity": "sha512-UDBGaj6W0Rgy5rTTaoxs8gVGF/aGkAKyjurJv7se6wjRxJu7FoquTLT/vt54DZfo4crbprYfhX/SOK9+BPw1qg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-grpc-exporter-base/node_modules/@opentelemetry/sdk-trace-base": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.8.0.tgz", + "integrity": "sha512-mhU4jp+vW0mGbFRd+GeXHvmfA4aDqWjBjLC3pE5XMpLs0IE2ryYb019Ts2AQrOq67gaTF25D91+fgvEHDZEnuQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer": { + "version": "0.218.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.218.0.tgz", + "integrity": "sha512-CFaKH87WAzjuJ4awowTTLzUvMfaRfiOFG5+qm5S5ncyalRtN4ecQ+YmuANJSCrVPuvZFEkUgKhBPBndxi3rHsQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.218.0", + "@opentelemetry/core": "2.7.1", + "@opentelemetry/resources": "2.7.1", + "@opentelemetry/sdk-logs": "0.218.0", + "@opentelemetry/sdk-metrics": "2.7.1", + "@opentelemetry/sdk-trace-base": "2.7.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/core": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.1.tgz", + "integrity": "sha512-QAqIj32AtK6+pEVNG7EOVxHdE06RP+FM5qpiEJ4RtDcFIqKUZHYhl7/7UY5efhwmwNAg7j8QbJVBLxMerc0+gw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/resources": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.1.tgz", + "integrity": "sha512-DeT6KKolmC4e/dRQvMQ/RwlnzhaqeiFOXY5ngoOPJ07GgVVKxZOg9EcrNZb5aTzUn+iCrJldAgOfQm1O/QfPAQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-metrics": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.7.1.tgz", + "integrity": "sha512-MpDJdkiFDs3Pm1RHO3KByuZbuBdJEXEAkiC0+yJdsZGVCdf1RpHR6n+LHDcS7ffmfrt5kVCzJSCfm4z2C7v0uQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "@opentelemetry/resources": "2.7.1" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-trace-base": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.7.1.tgz", + "integrity": "sha512-NAYIlsF8MPUsKqJMiDQJTMPOmlbawC1Iz/omMLygZ1C9am8fTKYjTaI+OZM+WTY3t3Glo0wnOg/6/pac6RGPPw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "@opentelemetry/resources": "2.7.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagator-b3": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-2.8.0.tgz", + "integrity": "sha512-SazlvuSKi5533rPHTW2TwBwdMakhjZST4SYs0YauuvfGDkT13KbG1gJS75hV0uWVeevhtVP9sAIlaZLTHdSbMg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagator-b3/node_modules/@opentelemetry/core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.8.0.tgz", + "integrity": "sha512-hd1Lfh8p545nNz+jq1Ejfz+Mn1hyLuxYn1YzTfFNrxr8urEWMNQLPf1Th8kjOH+HxwawCrtgBp8JpBUR4ZSgww==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagator-jaeger": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-2.8.0.tgz", + "integrity": "sha512-Xnz9zZvvQzUw+9DrOn0MomR7BxFCkA2pcfXBQuHC28ndJpSbjLs7knzYb05kw5SyCjSsEWombkZMgGcJSk8JVg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagator-jaeger/node_modules/@opentelemetry/core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.8.0.tgz", + "integrity": "sha512-hd1Lfh8p545nNz+jq1Ejfz+Mn1hyLuxYn1YzTfFNrxr8urEWMNQLPf1Th8kjOH+HxwawCrtgBp8JpBUR4ZSgww==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/redis-common": { + "version": "0.38.3", + "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.38.3.tgz", + "integrity": "sha512-VCghU1JYs/4gP6Gqf/xro9MEsZ7LrMv2uONVsaESKL38ZOB9BqnI98FfS23wjMnHlpuE+TTaWSoAVNpTwYXzjw==", + "license": "Apache-2.0", + "engines": { + "node": "^18.19.0 || >=20.6.0" + } + }, + "node_modules/@opentelemetry/resource-detector-azure": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-azure/-/resource-detector-azure-0.25.0.tgz", + "integrity": "sha512-e/NRDC3W2NYfxXJIto38wF1qgEyWpelaKp6QPIHGn320EknobnHCI7gUuoOAB6J2EJaW9ewNTIoDWDhO3AbdKA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/resources": "^2.0.0", + "@opentelemetry/semantic-conventions": "^1.37.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.10.0.tgz", + "integrity": "sha512-q6MMm2zhggzsHVNbabYwut+a6nbuQQe3URUoxaojM/8K1IBfwwPzvxIjNi2/lI1TFe+fMHMW9MWhrtDLEXEnkA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-logs": { + "version": "0.218.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.218.0.tgz", + "integrity": "sha512-QvnNdugatFTVCJXH0Mcu7GOOJSylA9j127kIezOE4YwTI4YbowRons2K4WZTv5FMS8T4q9P0NdaRHdkSmeAIag==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.218.0", + "@opentelemetry/core": "2.7.1", + "@opentelemetry/resources": "2.7.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/core": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.1.tgz", + "integrity": "sha512-QAqIj32AtK6+pEVNG7EOVxHdE06RP+FM5qpiEJ4RtDcFIqKUZHYhl7/7UY5efhwmwNAg7j8QbJVBLxMerc0+gw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/resources": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.1.tgz", + "integrity": "sha512-DeT6KKolmC4e/dRQvMQ/RwlnzhaqeiFOXY5ngoOPJ07GgVVKxZOg9EcrNZb5aTzUn+iCrJldAgOfQm1O/QfPAQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-metrics": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.10.0.tgz", + "integrity": "sha512-t6r1VSvXNtSDnPXU1FbZeetJb7yyovHmgu0wRSoftxtE0g2rSNhQZQUy69sRUCL+iioJpX8SN/S6wq6ZtvLySQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0", + "@opentelemetry/resources": "2.10.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-node": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.219.0.tgz", + "integrity": "sha512-NWLpWLEb8gV3+JBHYoIrktbM385wyHpRJoh3J/4Q52d4PR+AlPMNGJT3DzBUrDSUEVbKAXoHR+EDAPxtiNcj8g==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.219.0", + "@opentelemetry/configuration": "0.219.0", + "@opentelemetry/context-async-hooks": "2.8.0", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/exporter-logs-otlp-grpc": "0.219.0", + "@opentelemetry/exporter-logs-otlp-http": "0.219.0", + "@opentelemetry/exporter-logs-otlp-proto": "0.219.0", + "@opentelemetry/exporter-metrics-otlp-grpc": "0.219.0", + "@opentelemetry/exporter-metrics-otlp-http": "0.219.0", + "@opentelemetry/exporter-metrics-otlp-proto": "0.219.0", + "@opentelemetry/exporter-prometheus": "0.219.0", + "@opentelemetry/exporter-trace-otlp-grpc": "0.219.0", + "@opentelemetry/exporter-trace-otlp-http": "0.219.0", + "@opentelemetry/exporter-trace-otlp-proto": "0.219.0", + "@opentelemetry/exporter-zipkin": "2.8.0", + "@opentelemetry/instrumentation": "0.219.0", + "@opentelemetry/otlp-exporter-base": "0.219.0", + "@opentelemetry/otlp-grpc-exporter-base": "0.219.0", + "@opentelemetry/propagator-b3": "2.8.0", + "@opentelemetry/propagator-jaeger": "2.8.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/sdk-logs": "0.219.0", + "@opentelemetry/sdk-metrics": "2.8.0", + "@opentelemetry/sdk-trace-base": "2.8.0", + "@opentelemetry/sdk-trace-node": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/api-logs": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.219.0.tgz", + "integrity": "sha512-FFx7YnaYJlIjqWW/AG/yAZ0L/NEY724PipXXXQLdtZPbLwBGbUMTGL1i/esI56TWfTUXxhLfpgrnWJCG8aUJyg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.8.0.tgz", + "integrity": "sha512-hd1Lfh8p545nNz+jq1Ejfz+Mn1hyLuxYn1YzTfFNrxr8urEWMNQLPf1Th8kjOH+HxwawCrtgBp8JpBUR4ZSgww==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/exporter-logs-otlp-http": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.219.0.tgz", + "integrity": "sha512-mhl2HL6GmZI8b8PwPfqMws/5ovJfbRTxwc9Y5agVVHiQ+e5SL1btsFr/kJDgt7YCexDtsUn5HAreHQO9szFS0A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.219.0", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/otlp-exporter-base": "0.219.0", + "@opentelemetry/otlp-transformer": "0.219.0", + "@opentelemetry/sdk-logs": "0.219.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/exporter-metrics-otlp-http": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.219.0.tgz", + "integrity": "sha512-6CaDRbMVHZSDWzNXwrR8y/H4B/Z1eMNnkHiPQlTx3Ojz2OHY4X/aff/UC4P/3pHUQSuTfi3oh2UsPPZppw+Vrg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/otlp-exporter-base": "0.219.0", + "@opentelemetry/otlp-transformer": "0.219.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/sdk-metrics": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/exporter-metrics-otlp-proto": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-proto/-/exporter-metrics-otlp-proto-0.219.0.tgz", + "integrity": "sha512-DUS7XyIiEnoeccQUvuKy0G2/YqeKhpN8FVIrGbrLNIVMj10yeIFLRzRv0tibCI2kXXvlTTABVexGAk78wHk2ug==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/exporter-metrics-otlp-http": "0.219.0", + "@opentelemetry/otlp-exporter-base": "0.219.0", + "@opentelemetry/otlp-transformer": "0.219.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/sdk-metrics": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/exporter-trace-otlp-http": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.219.0.tgz", + "integrity": "sha512-9t6SvBXXBEjOBcIzgozvBbd3jWrv3Gt3ngGhl1fhdZ/zRc7oZDVOFEqbi2zlBpW9BXhgDMKv422J0DL/3iQWfw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/otlp-exporter-base": "0.219.0", + "@opentelemetry/otlp-transformer": "0.219.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/sdk-trace-base": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.219.0.tgz", + "integrity": "sha512-zvIxQX/AZUVKDU+hCuYx+7UkiP7GRdnk1ZbFQRYzHvYp47cAWR4j3IhoPhV9KaeXEv2xdGq3IA6PnpzDmLcmSA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/otlp-transformer": "0.219.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/otlp-transformer": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.219.0.tgz", + "integrity": "sha512-aaYKAyXhw9VchKZVGOopD3Gw/kPsyrX2c6IQ0AW32mTjqmZOh5Y6Gf5OYqTNqVktAeBjmFinhyFaCwW6GYK9YQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.219.0", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/sdk-logs": "0.219.0", + "@opentelemetry/sdk-metrics": "2.8.0", + "@opentelemetry/sdk-trace-base": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/resources": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.8.0.tgz", + "integrity": "sha512-qmXQ27ilDbUK/vGMqwL8D4/rhn76C+sherM4wTbjlfknR8Nvfc/hCxjRJPhkzZzUsPiNg16SA31NxMabwttRjg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-logs": { + "version": "0.219.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.219.0.tgz", + "integrity": "sha512-s6lTKRakaPClvKoWHRChxnXjDMkM/TQ30ff78jN6EBGf7MI7VzANE5PU3f4z9qDUudWjvZjOLHG0rBnBKYvoXA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.219.0", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-metrics": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.8.0.tgz", + "integrity": "sha512-UDBGaj6W0Rgy5rTTaoxs8gVGF/aGkAKyjurJv7se6wjRxJu7FoquTLT/vt54DZfo4crbprYfhX/SOK9+BPw1qg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.9.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-trace-base": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.8.0.tgz", + "integrity": "sha512-mhU4jp+vW0mGbFRd+GeXHvmfA4aDqWjBjLC3pE5XMpLs0IE2ryYb019Ts2AQrOq67gaTF25D91+fgvEHDZEnuQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.8.0", + "@opentelemetry/resources": "2.8.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-trace-node": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.8.0.tgz", + "integrity": "sha512-nZt9OGufioAc3AfoLTqA9bsAeaMJAictYDdI2VcNQ+PmT+3rfKjAZDZvgPfd8VPX0O5Bw1hdQF6kDK8VSpZiWg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/context-async-hooks": "2.8.0", + "@opentelemetry/core": "2.8.0", + "@opentelemetry/sdk-trace-base": "2.8.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace/-/sdk-trace-2.10.0.tgz", + "integrity": "sha512-MfQGq3GRmTh5fM/y+OjaO0vj6+luCB1XO2gfXCalKCfgKw0eHL++sm75DNweC6ohlp+aFvACqeE0fYayqdRaoQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0", + "@opentelemetry/resources": "2.10.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.10.0.tgz", + "integrity": "sha512-GuYQQT7QD2EeO8lcZLRQzcbOyhqAzL+6WWTKTU9mSUBYBazkEDl+VrQcXQhbB08OWM9anD1aHleVadzulpOaUQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0", + "@opentelemetry/resources": "2.10.0", + "@opentelemetry/sdk-trace": "2.10.0", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.10.0.tgz", + "integrity": "sha512-GZK/G6oZyBLGlH1pUgeDch7D91KoHd2uotUGIkWCPi9GI5T9X0p4L7nNAMDR1BQjkRYoDqo+ddfVx9t5Uhys+Q==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/context-async-hooks": "2.10.0", + "@opentelemetry/core": "2.10.0", + "@opentelemetry/sdk-trace-base": "2.10.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/context-async-hooks": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.10.0.tgz", + "integrity": "sha512-bvyMcgLEkozzSzpEEEo1OMoeQ97bxj6Qs2uN3mPrSdDvObMI1myffD/BPqcLlzZO9//d1SqQA/WPw7Cz2AiqhA==", + "license": "Apache-2.0", + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-web": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-web/-/sdk-trace-web-2.10.0.tgz", + "integrity": "sha512-6WqXdWSlBH0GNjDhv1gg6SLVtMtIBVhLaWqd1hiKSXS8meXXP13sVPQoYFHz1uVo0feUTUCdP9vMS54KflisAw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.10.0", + "@opentelemetry/sdk-trace-base": "2.10.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.43.0.tgz", + "integrity": "sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sql-common": { + "version": "0.41.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.41.2.tgz", + "integrity": "sha512-4mhWm3Z8z+i508zQJ7r6Xi7y4mmoJpdvH0fZPFRkWrdp5fq7hhZ2HhYokEOLkfqSMgPR4Z9EyB3DBkbKGOqZiQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "^2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0" + } + }, + "node_modules/@opentelemetry/winston-transport": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/winston-transport/-/winston-transport-0.27.0.tgz", + "integrity": "sha512-Imeoqm9CqxSJRo6INwtOn1Kx2XXYZzkyrH6q2teIDJ7ZypKx7DRf23l5ylQZ3vYibkcCLIANbzpeMqCNPp4CEw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "^0.217.0", + "winston-transport": "4.*" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + } + }, + "node_modules/@opentelemetry/winston-transport/node_modules/@opentelemetry/api-logs": { + "version": "0.217.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.217.0.tgz", + "integrity": "sha512-Cdq0jW2lknrNfrAm92MyEAvpe2cRsKjdnQLHUL6xRA4IVUnsWx6P65E7NcUO0Y+L4w1Aee5iV8FvjSwd+lrs9A==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", + "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz", + "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz", + "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.2.tgz", + "integrity": "sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==", + "license": "BSD-3-Clause" + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bunyan": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.11.tgz", + "integrity": "sha512-758fRH7umIMk5qt5ELmRMff4mLDlN+xyYzC+dkPTdKwbSkJFvz6xwyScrytPU0QIBbRRwbiE8/BIg8bpajerNQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", + "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "^2" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.2.tgz", + "integrity": "sha512-d3KvEXBSo/lOAMc2u6fkyDHBvetBHeqD7wm/AcXfLpSOQwlmG9D/aQ0SFswVjv05p7ullQS7Mjohj6/VdbZuTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/hbs": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/hbs/-/hbs-4.0.5.tgz", + "integrity": "sha512-B08DCNOC1Dg9p/02Ny0wgvZOXQXe13wI02HvaA7p0BARqkNmQP380C6ZeNWuPRA9Qp7ek2p5nt46tRi7JqZQDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "handlebars": "^4.1.0" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mocha": { + "version": "10.0.10", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", + "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mysql": { + "version": "2.15.27", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.27.tgz", + "integrity": "sha512-YfWiV16IY0OeBfBCk8+hXKmdTKrKlwKN1MNKAPBu5JYxLwBEZl7QzeEpGnlZb3VMGJrrGmB84gXiH+ofs/TezA==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", + "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/pg": { + "version": "8.15.6", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.6.tgz", + "integrity": "sha512-NoaMtzhxOrubeL/7UZuNTrejB4MPAJ0RpxZqXQf2qXuVlTPuG6Y8p4u9dKRaue4yjmC7ZhzVO2/Yyyn25znrPQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "node_modules/@types/pg-pool": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.7.tgz", + "integrity": "sha512-U4CwmGVQcbEuqpyju8/ptOKg6gEC+Tqsvj2xS9o1g71bUh8twxnC6ZL5rZKCsGN0iyH0CwgUyc9VR5owNQF9Ng==", + "license": "MIT", + "dependencies": { + "@types/pg": "*" + } + }, + "node_modules/@types/qs": { + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*" + } + }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.65.0.tgz", + "integrity": "sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.65.0", + "@typescript-eslint/type-utils": "8.65.0", + "@typescript-eslint/utils": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.65.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.6.tgz", + "integrity": "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.65.0.tgz", + "integrity": "sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.65.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.65.0.tgz", + "integrity": "sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.65.0", + "@typescript-eslint/types": "^8.65.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.65.0.tgz", + "integrity": "sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.65.0.tgz", + "integrity": "sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.65.0.tgz", + "integrity": "sha512-YjaZ7PRI5qY7ax2L3PbvX0rRyGtipAReCWs0mhhDBHjH/vl0g0BonaGXrKdKpMbIIsMIwDgbk/xzkBTyAltS5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0", + "@typescript-eslint/utils": "8.65.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.65.0.tgz", + "integrity": "sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.65.0.tgz", + "integrity": "sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.65.0", + "@typescript-eslint/tsconfig-utils": "8.65.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.65.0.tgz", + "integrity": "sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.65.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.65.0.tgz", + "integrity": "sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.65.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typespec/ts-http-runtime": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.7.tgz", + "integrity": "sha512-JVUD8X2tfDMWjcjLs4yVxxVrS8yR5vnh386GAXT9Qj79nBxxXSaHFQZg5FweLmT8HlPQ3kii6noUB+Z9RN7DvQ==", + "license": "MIT", + "dependencies": { + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "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.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", + "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/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "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/applicationinsights": { + "version": "3.15.1", + "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-3.15.1.tgz", + "integrity": "sha512-uIk4ju/fmAtkiB9e5B1WG9+iTqExdX/XdcbNX3pcVDpTaIG96PAj0gsBU2nWxurPukxlKvKIwNvqlQymeqkv7A==", + "license": "MIT", + "dependencies": { + "@azure/core-auth": "^1.9.0", + "@azure/functions": "^4.11.2", + "@azure/identity": "^4.13.1", + "@azure/monitor-opentelemetry": "^1.18.1", + "@azure/monitor-opentelemetry-exporter": ">=1.0.0-beta.41 <1.0.0-c || ^1.0.0", + "@azure/opentelemetry-instrumentation-azure-sdk": "^1.0.0-beta.7", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/api-logs": "^0.218.0", + "@opentelemetry/core": "^2.7.1", + "@opentelemetry/exporter-logs-otlp-http": "^0.218.0", + "@opentelemetry/exporter-metrics-otlp-http": "^0.218.0", + "@opentelemetry/exporter-metrics-otlp-proto": "^0.218.0", + "@opentelemetry/exporter-trace-otlp-http": "^0.218.0", + "@opentelemetry/otlp-exporter-base": "^0.218.0", + "@opentelemetry/resources": "^2.7.1", + "@opentelemetry/sdk-logs": "^0.218.0", + "@opentelemetry/sdk-metrics": "^2.7.1", + "@opentelemetry/sdk-trace-base": "^2.7.1", + "@opentelemetry/sdk-trace-node": "^2.7.1", + "@opentelemetry/semantic-conventions": "^1.38.0", + "diagnostic-channel": "1.1.1", + "diagnostic-channel-publishers": "1.0.8" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "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/axios": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.18.1.tgz", + "integrity": "sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.16.0", + "form-data": "^4.0.5", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/axios/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/axios/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/body-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", + "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^2.0.0", + "debug": "^4.4.3", + "http-errors": "^2.0.1", + "iconv-lite": "^0.7.2", + "on-finished": "^2.4.1", + "qs": "^6.15.2", + "raw-body": "^3.0.2", + "type-is": "^2.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/body-parser/node_modules/content-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", + "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", + "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "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": "5.0.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", + "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true, + "license": "ISC" + }, + "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/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cheerio": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz", + "integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==", + "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.1", + "htmlparser2": "^10.1.0", + "parse5": "^7.3.0", + "parse5-htmlparser2-tree-adapter": "^7.1.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^7.19.0", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=20.18.1" + }, + "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": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/cjs-module-lexer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", + "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==", + "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/cliui/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/cliui/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/cliui/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/cliui/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/cliui/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/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/content-disposition": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", + "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "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/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/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/date-fns": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.4.0.tgz", + "integrity": "sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "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/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/default-browser": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/diagnostic-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/diagnostic-channel/-/diagnostic-channel-1.1.1.tgz", + "integrity": "sha512-r2HV5qFkUICyoaKlBEpLKHjxMXATUf/l+h8UZPGBHGLy4DDiY2sOLcIctax4eRnTw5wH2jTMExLntGPJ8eOJxw==", + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + } + }, + "node_modules/diagnostic-channel-publishers": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/diagnostic-channel-publishers/-/diagnostic-channel-publishers-1.0.8.tgz", + "integrity": "sha512-HmSm9hXxSPxA9BaLGY98QU1zsdjeCk113KjAYGPCen1ZP6mhVaTPzHd6UYv5r21DnWANi+f+NyPOHruGT9jpqQ==", + "license": "MIT", + "peerDependencies": { + "diagnostic-channel": "*" + } + }, + "node_modules/diff": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "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/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "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": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/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/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-module-lexer": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.1.tgz", + "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==", + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "10.7.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.7.0.tgz", + "integrity": "sha512-GVTD7s1vdIl6UYvAfriOPeY1Df8LIZjfofLvHwde+erDHGGuHyuM6xoxRxmHiebhYuD2p1vN4wWh0XzPARSGDQ==", + "dev": true, + "license": "MIT", + "workspaces": [ + "packages/*" + ], + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.6.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.2", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "minimatch": "^10.2.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "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==", + "dev": true, + "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/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.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/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", + "license": "MIT" + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "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": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.3.tgz", + "integrity": "sha512-/zipXxyO6rGvuNGDiULY9MvEGSkb2gaG4GGH4ygMi0ZZzyMHdUZBmntJmx5x1G2VuPytCwGN4xsJP6cw+sK+vQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreachasync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", + "integrity": "sha512-J+ler7Ta54FwwNcx6wQRDhTIbNeyDcARMkOcguEqnEdtm0jKvN3Li3PDAb2Du3ubJYEWfYL83XMROXdsXAXycw==", + "license": "Apache2" + }, + "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==", + "dev": true, + "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.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.4", + "mime-types": "^2.1.35" + }, + "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/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/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/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.2.tgz", + "integrity": "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "17.7.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.7.0.tgz", + "integrity": "sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/handlebars": { + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", + "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==", + "dev": true, + "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.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hbs": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/hbs/-/hbs-4.2.1.tgz", + "integrity": "sha512-jkX8bTB17JCUMhyDobTkbMcdZi3xOplVbWjzp8i40O6ZITQhcjGIy11AmF51IyBe80GnJIRhUtKL9dg/ho/uog==", + "license": "MIT", + "dependencies": { + "handlebars": "4.7.9", + "walk": "2.3.15" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/htmlparser2": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", + "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", + "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.2", + "entities": "^7.0.1" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/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": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-in-the-middle": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-3.3.2.tgz", + "integrity": "sha512-jTd2FfOgOWOdgjkHuk/1Ms8VKFXkPs15ymYBETw1sAOrO/dY3XeGVRWir9qBbw7pXr0T2eTFwfCZ+N02HmiNGA==", + "license": "Apache-2.0", + "dependencies": { + "cjs-module-lexer": "^2.2.0", + "es-module-lexer": "^2.2.0", + "module-details-from-path": "^1.0.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/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/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-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "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-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "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/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-yaml": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonwebtoken": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", + "license": "MIT", + "dependencies": { + "jws": "^4.0.1", + "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": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "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": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "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/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/logform": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", + "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", + "license": "MIT", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/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/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.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 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.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mocha": { + "version": "11.7.6", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.6.tgz", + "integrity": "sha512-nS9xOGbw2I3cjCpxwZAEJ9xK9lmJ08vEkQvLtz4du9ZrF9UrjRpeJGiIgl2Z+Qs++pmB4ecDe48Fwsh+j+j7xA==", + "dev": true, + "license": "MIT", + "dependencies": { + "browser-stdout": "^1.3.1", + "chokidar": "^4.0.1", + "debug": "^4.3.5", + "diff": "^7.0.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^10.4.5", + "he": "^1.2.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^9.0.5", + "ms": "^2.1.3", + "picocolors": "^1.1.1", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^9.2.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/mocha/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.2.tgz", + "integrity": "sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/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/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-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": "10.2.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/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-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-to-regexp": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", + "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "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.15.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.15.0.tgz", + "integrity": "sha512-cq9sECI5s0+uPUXjbz8ioyPJni6RzsRib0US67i5IoTZKw8fNeYlVE7u8F4dG7vEJJtc5wdD1K189lCCUwqWTQ==", + "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/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", + "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", + "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/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.9.6", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz", + "integrity": "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/protobufjs": { + "version": "7.6.5", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.5.tgz", + "integrity": "sha512-/FPD0nUc9jH6rfFjji9IBqOz4pcSE3CsT1m7Ep6Mdb0LxSUMj8hgl6GomOvZzpNpAqqGaXA0P3VSrZLFzIhQrw==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.5", + "@protobufjs/eventemitter": "^1.1.1", + "@protobufjs/fetch": "^1.1.1", + "@protobufjs/float": "^1.0.2", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.1", + "@types/node": ">=13.7.0", + "long": "^5.3.2" + }, + "engines": { + "node": ">=12.0.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-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "license": "BSD-3-Clause", + "dependencies": { + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.3.0.tgz", + "integrity": "sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", + "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "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": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "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": "8.0.1", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-8.0.1.tgz", + "integrity": "sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3" + }, + "engines": { + "node": ">=9.3.0 || >=8.10.0 <9.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/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "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.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "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.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "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==", + "dev": true, + "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.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "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/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-is": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz", + "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==", + "license": "MIT", + "dependencies": { + "content-type": "^2.0.0", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/type-is/node_modules/content-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", + "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.65.0.tgz", + "integrity": "sha512-/ggrHAwyjENDusvyxbuqxAC2dTnZg/Z8F+fgQtYIz+L6n/9HfSlEZcFGV/NsMNa6CkGk0xUjUAFwC0vHOflvIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.65.0", + "@typescript-eslint/parser": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0", + "@typescript-eslint/utils": "8.65.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "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/undici": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz", + "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "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/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/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/walk": { + "version": "2.3.15", + "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.15.tgz", + "integrity": "sha512-4eRTBZljBfIISK1Vnt69Gvr2w/wc3U6Vtrw7qiN5iqYJPH7LElcYh/iU4XWhdCy2dZqv1ToMyYlybDylfG/5Vg==", + "license": "(MIT OR Apache-2.0)", + "dependencies": { + "foreachasync": "^3.0.0" + } + }, + "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==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "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/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/winston-transport": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", + "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", + "license": "MIT", + "dependencies": { + "logform": "^2.7.0", + "readable-stream": "^3.6.2", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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/workerpool": { + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.4.tgz", + "integrity": "sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "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" + }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "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/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs": { + "version": "17.7.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", + "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", + "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/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/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/yargs/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/yargs/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/yargs/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/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json index fdae07e4..bda5683b 100644 --- a/package.json +++ b/package.json @@ -1,70 +1,88 @@ -{ - "name": "at11", - "description": "Daily lunch menu application", - "version": "1.0.0", - "dependencies": { - "charset": "^1.0.0", - "cheerio": "^0.22.0", - "express": "^4.15.2", - "hbs": "^4.0.0", - "iconv-lite": "^0.4.15", - "moment-timezone": "^0.5.13", - "request": "^2.81.0" - }, - "devDependencies": { - "mocha": "^3.2.0", - "jshint": "^2.9.1", - "jscs": "^3.0.7" - }, - "scripts": { - "start": "node app.js", - "pretest": "jshint --verbose app.js cache.js config.js menuFetcher.js parsers/ static/js/", - "test": "mocha --reporter spec", - "posttest": "jscs --verbose app.js cache.js config.js menuFetcher.js parsers/ static/js/" - }, - "author": { - "name": "Jakub Šturc", - "email": "jakub.sturc@erni.sk" - }, - "contributors": [ - { - "name": "Ján Neščivera", - "email": "jan.nescivera@erni.sk" - }, - { - "name": "Matúš Brliť", - "email": "matus.brlit@erni.sk" - }, - { - "name": "Peter Matejka", - "email": "peter.matejka@erni.sk" - }, - { - "name": "Andrej Mandli", - "email": "andrej.mandli@erni.sk" - }, - { - "name": "Marek Linka", - "email": "marek.linka@erni.sk" - } - ], - "keywords": [ - "lunch", - "menu", - "at11", - "erni", - "obed" - ], - "repository": { - "type": "git", - "url": "https://github.com/at11/at11.git" - }, - "bugs": { - "url": "https://github.com/at11/at11/issues" - }, - "engines": { - "node": "6.9.x" - }, - "license": "SEE LICENSE IN LICENSE", - "main": "app.js" -} +{ + "name": "at11", + "description": "Daily lunch menu application", + "homepage": "https://at11.azurewebsites.net/", + "version": "2.1.0", + "type": "module", + "dependencies": { + "applicationinsights": "^3.15.1", + "axios": "^1.18.1", + "cheerio": "^1.2.0", + "date-fns": "^4.4.0", + "express": "^5.2.1", + "hbs": "^4.2.1", + "node-cache": "^5.1.2" + }, + "devDependencies": { + "@eslint/js": "^10.0.1", + "@types/express": "^5.0.6", + "@types/hbs": "^4.0.5", + "@types/mocha": "^10.0.10", + "@types/node": "^24.0.0", + "eslint": "^10.7.0", + "eslint-config-prettier": "^10.1.8", + "globals": "^17.7.0", + "mocha": "^11.7.6", + "prettier": "^3.9.6", + "typescript": "^6.0.3", + "typescript-eslint": "^8.65.0" + }, + "scripts": { + "build": "tsc", + "prestart": "npm run build", + "start": "node --env-file-if-exists=.env dist/app.js", + "start:prod": "node dist/app.js", + "lint": "eslint .", + "test": "mocha ./dist/test --exit", + "format:check": "prettier . --check" + }, + "author": { + "name": "Ján Neščivera", + "email": "jan.nescivera@betterask.erni" + }, + "contributors": [ + { + "name": "Jakub Šturc", + "email": "jakub.sturc@erni.sk" + }, + { + "name": "Matúš Brliť", + "email": "matus.brlit@erni.sk" + }, + { + "name": "Peter Matejka", + "email": "peter.matejka@erni.sk" + }, + { + "name": "Andrej Mandli", + "email": "andrej.mandli@erni.sk" + }, + { + "name": "Marek Linka", + "email": "marek.linka@erni.sk" + }, + { + "name": "Milos Karas", + "email": "caesar1987@centrum.sk" + }, + { + "name": "Peter Václavek", + "email": "peter.vaclavek@erni.sk" + } + ], + "keywords": [ + "lunch", + "menu", + "at11", + "erni", + "obed" + ], + "repository": { + "type": "git", + "url": "https://github.com/ERNICommunity/at11" + }, + "bugs": { + "url": "https://github.com/ERNICommunity/at11/issues" + }, + "license": "Unlicense" +} diff --git a/parsers/alfa.js b/parsers/alfa.js deleted file mode 100644 index 059a0f78..00000000 --- a/parsers/alfa.js +++ /dev/null @@ -1,58 +0,0 @@ -var cheerio = require('cheerio'); -require('./parserUtil'); - -module.exports.parse = function(html, date, callback) { - var $ = cheerio.load(html); - var dayMenu = []; - - var dateStr = date.format("DD.MM.YYYY"); - - var denneMenuElem = $('.dnesne_menu, .ostatne_menu').filter(function(){ - var nadpis = $(this).find('h2').text(); - return nadpis.indexOf(dateStr) > -1; - }); - - var soupElems = []; - var mealElems = []; - var pushingSoups = false; - denneMenuElem.first().find('.jedlo_polozka').each(function() { - var elem = $(this); - var txt = elem.text().trim(); - - if(txt === "Polievka"){ - pushingSoups = true; - return; - } - if(txt === "Hlavné jedlá"){ - pushingSoups = false; - return; - } - - if(pushingSoups) { - soupElems.push(elem); - } - else { - mealElems.push(elem); - } - }); - - soupElems.forEach((elem) => { - var text = normalize($('.left', elem).text()); - dayMenu.push({ isSoup: true, text: text, price: NaN }); - }); - - mealElems.forEach((elem) => { - var text = normalize($('.left', elem).text()); - var price = parseFloat($('.right', elem).text().trim()); - dayMenu.push({ isSoup: false, text: text, price: price }); - }); - - callback(dayMenu); - - function normalize(str) { - return str.normalizeWhitespace() - .removeMetrics() - .correctCommaSpacing() - .removeItemNumbering(); - } -}; diff --git a/parsers/common/sme.ts b/parsers/common/sme.ts new file mode 100644 index 00000000..e8410093 --- /dev/null +++ b/parsers/common/sme.ts @@ -0,0 +1,40 @@ +import { load } from "cheerio"; + +import { IMenuItem } from "../types.js"; +import { getDateRegex } from "../parserUtil.js"; + +export abstract class Sme { + protected parseBase(html: string, date: Date): IMenuItem[] { + const $ = load(html); + const dateRegex = getDateRegex(date); + + const denneMenuElem = $(".dnesne_menu, .ostatne_menu").filter( + (i, elem) => { + const nadpis = $(elem).find("h2").text(); + return dateRegex.test(nadpis); + }, + ); + + const items = new Array(); + + denneMenuElem + .first() + .find(".jedlo_polozka") + .each((i, elem) => { + const text = normalize($(".left", elem).text()); + const price = parseFloat($(".right", elem).text().trim()); + items.push({ text, price, isSoup: false }); + }); + + return items; + + function normalize(str: string): string { + return str + .normalizeWhitespace() + .removeMetrics() + .removeItemNumbering() + .capitalizeFirstLetter() + .removeAlergens(); + } + } +} diff --git a/parsers/danovak.js b/parsers/danovak.js deleted file mode 100644 index 5f356905..00000000 --- a/parsers/danovak.js +++ /dev/null @@ -1,37 +0,0 @@ -var cheerio = require('cheerio'); -require('./parserUtil'); - -module.exports.parse = function(html, date, callback) { - var $ = cheerio.load(html, { decodeEntities: true }); - var dayMenu = []; - - var currentDay = $('div#privitanie>div').children().filter(function(index, item) { return $(item).text().indexOf(date.format("DD.MM.YYYY")) > -1; }).eq(0); - if (currentDay) { - let menuHolder = currentDay.next(); - let menuTextNodes = menuHolder.contents().filter(function() { return this.type === 'text'; }); - - menuTextNodes[0].data.trim().split(/\//g).forEach(function(itemTxt) { // on first line there are soups separated by '/' - dayMenu.push({ isSoup: true, text: itemTxt.trim(), price: NaN }); - }); - for (let i = 1; i < menuTextNodes.length; i++) { - let text = menuTextNodes[i].data.trim(); - let price = NaN; - /* jshint -W083 */ - text = text.replace(/\d+,\d+\s?€/, (match) => { - price = parseFloat(match.replace(',', '.')); - return ''; - }); - /* jshint +W083 */ - dayMenu.push({ isSoup: false, text: normalize(text), price: price }); - } - } - - callback(dayMenu); - - function normalize(str) { - return str.removeItemNumbering() - .normalizeWhitespace() - .removeMetrics() - .correctCommaSpacing(); - } -}; diff --git a/parsers/einpark/derbypub.ts b/parsers/einpark/derbypub.ts new file mode 100644 index 00000000..a72fe0d5 --- /dev/null +++ b/parsers/einpark/derbypub.ts @@ -0,0 +1,56 @@ +import { Cheerio, load } from "cheerio"; +import type { Element } from "domhandler"; + +import { IMenuItem, IParser } from "../types.js"; +import { format } from "date-fns"; +import { sk } from "date-fns/locale"; + +export class DerbyPub implements IParser { + public readonly urlFactory = () => + "https://www.derbypub.sk/menu/obedove-menu"; + + public parse(html: string, date: Date): Promise { + const $ = load(html); + const dayMenu = new Array(); + const todayText = format(date, "d. LLLL yyyy", { locale: sk }); + + $(".pm-date-sub").each((i, elem) => { + const node = $(elem); + const text = node.text().trim(); + if (todayText === text) { + parseDailyMenu(node.nextAll(".pm-item").first().find("table")); + return false; + } + }); + + return Promise.resolve(dayMenu); + + function parseDailyMenu(table: Cheerio) { + const rows = table.find("tr"); + rows.each((index, elem) => { + if (index === 0) { + dayMenu.push(parseSoup(elem)); + } else { + dayMenu.push(parseOther(elem)); + } + }); + } + + function parseSoup(row: Element): IMenuItem { + const cells = $(row).find("td"); + const text = cells.eq(2).text().trim(); + return { isSoup: true, text: normalize(text), price: NaN }; + } + + function parseOther(row: Element): IMenuItem { + const cells = $(row).find("td"); + const text = cells.eq(2).text().trim(); + const price = parseFloat(cells.eq(4).text().replace(",", ".")); + return { isSoup: false, text: normalize(text), price }; + } + + function normalize(str: string) { + return str.removeAlergens().removeMetrics().capitalizeFirstLetter(); + } + } +} diff --git a/parsers/einpark/mkmrestaurant.ts b/parsers/einpark/mkmrestaurant.ts new file mode 100644 index 00000000..06c8308f --- /dev/null +++ b/parsers/einpark/mkmrestaurant.ts @@ -0,0 +1,24 @@ +import { IMenuItem, IParser } from "../types.js"; +import { Sme } from "../common/sme.js"; +import { parsePrice } from "../parserUtil.js"; + +export class MKMRestaurant extends Sme implements IParser { + public readonly urlFactory = () => + "https://restauracie.sme.sk/restauracia/mkm-pizzeria_1742-petrzalka_664/denne-menu"; + + public parse(html: string, date: Date): Promise { + const menuItems = super.parseBase(html, date); + + if (menuItems.length > 0) { + // first item is soup + menuItems[0].isSoup = true; + menuItems.forEach((item) => { + const result = parsePrice(item.text); + item.price = result.price; + item.text = result.text.removeMetrics(); + }); + } + + return Promise.resolve(menuItems); + } +} diff --git a/parsers/einpark/pomodoro-rosso.ts b/parsers/einpark/pomodoro-rosso.ts new file mode 100644 index 00000000..c67233de --- /dev/null +++ b/parsers/einpark/pomodoro-rosso.ts @@ -0,0 +1,92 @@ +import { load } from "cheerio"; + +import { IMenuItem, IParser } from "../types.js"; +import { addDays, endOfWeek, format, startOfWeek, subDays } from "date-fns"; +import { sk } from "date-fns/locale"; +import { parsePrice } from "../parserUtil.js"; + +export class PomodoroRosso implements IParser { + public urlFactory(d: Date): string { + const weekStart = startOfWeek(d, { locale: sk }); + const dayBeforeStart = subDays(weekStart, 1); + const weekEnd = endOfWeek(d, { locale: sk }); + const fridayBeforeEnd = subDays(weekEnd, 2); + return ( + "https://www.pizzeriapomodororosso.sk/" + + format(dayBeforeStart, "yyyy/MM/dd", { locale: sk }) + + `/denne-menu-${format(weekStart, "d-M-yyyy", { locale: sk })}-${format(fridayBeforeEnd, "d-M-yyyy", { locale: sk })}/` + ); + } + + public parse(html: string, date: Date): Promise { + const $ = load(html); + const currentDayName = format(date, "eeee", { locale: sk }); + const nextDayName = format(addDays(date, 1), "eeee", { locale: sk }); + + const allMenuText = $("article.post.tag-denne-menu .entry-content") + .find("br") + .replaceWith("\n") + .end() + .text() + .split("\n") + .map((t) => t.trim()) + .filter(Boolean); + + return Promise.resolve( + this.parseDailyMenu(allMenuText, currentDayName, nextDayName), + ); + } + + private parseDailyMenu( + rows: string[], + currentDay: string, + nextDay: string, + ): IMenuItem[] { + const menu: IMenuItem[] = []; + + const current = new RegExp(currentDay, "i"); + const next = new RegExp(nextDay, "i"); + const note = new RegExp("Cena denného menu", "i"); + + let dailyMenuStarted = false; + for (const r of rows) { + if (!dailyMenuStarted && current.test(r)) { + dailyMenuStarted = true; + continue; + } + if (dailyMenuStarted && (next.test(r) || note.test(r))) { + break; + } + if (dailyMenuStarted) { + if (/Polievka/i.test(r)) { + menu.push(this.parseSoup(r)); + } else { + menu.push(this.parseOther(r)); + } + } + } + + return menu; + } + + private parseSoup(row: string): IMenuItem { + const text = row.replace(/Polievka:?/i, "").trim(); + return { isSoup: true, text: this.normalize(text), price: NaN }; + } + + private parseOther(row: string): IMenuItem { + const { text, price } = parsePrice(row); + return { + isSoup: false, + text: this.normalize(text.replace("//", "").trim()), + price, + }; + } + + private normalize(str: string) { + return str + .removeMetrics() + .removeItemNumbering() + .capitalizeFirstLetter(); + } +} diff --git a/parsers/engerau.js b/parsers/engerau.js deleted file mode 100644 index 53ec3d71..00000000 --- a/parsers/engerau.js +++ /dev/null @@ -1,27 +0,0 @@ -var zomato = require('./zomato'); - -module.exports.parse = function(html, date, callback) { - zomato.parse(html, date, function(menuItems) { - var price = NaN; - var lastElems = menuItems.splice(-3); // last 3 items are parsed wrongly by zomato parser, need to be fixed manually - var dayMenu = menuItems.map(function(item){ - if (item.isSoup) { - price = item.price; - item.price = NaN; - } else { - item.price = price; - } - item.text = normalize(item.text); - return item; - }); - // fix last item - dayMenu.push(lastElems[1]); - dayMenu[dayMenu.length - 1].isSoup = false; - dayMenu[dayMenu.length - 1].text = normalize(dayMenu[dayMenu.length - 1].text); - callback(dayMenu); - }); - - function normalize(str){ - return str.replace(/\*.*$/, ''); - } -}; diff --git a/parsers/giuliano.js b/parsers/giuliano.js deleted file mode 100644 index d5c5bbc2..00000000 --- a/parsers/giuliano.js +++ /dev/null @@ -1,49 +0,0 @@ -var cheerio = require('cheerio'); -require('./parserUtil'); - -module.exports.parse = function(html, date, callback) { - var $ = cheerio.load(html, { normalizeWhitespace: true }); - var dayMenu = []; - - $('table#denne-menu tr').each(function() { - var $this = $(this); - var dateCellText = $this.children("td").first().text(); - - if (dateCellText.indexOf(date.format("DD.MM.YYYY")) > -1) - { - var items = $this.children("td").eq(1).children().filter(function() { - var txt = $(this).text().trim(); - if(txt === "") { - return false; - } - var cnt = cheerio.load(txt); - cnt.root().contents() - .filter(function() { return this.type === 'comment'; }) - .remove(); // strip comments - return cnt.text().trim() !== ""; - }); - - var priceText = $this.children("td").eq(2).text(); - var price = parseFloat(priceText.replace(",", ".")); - - Array.prototype.forEach.call(items, function(item, index) { - var tmp = { isSoup: false, text: normalize($(item).text()), price: price }; - if (index === 0) - {//I think it is safe enough to assume that the first item in menu is the soup - tmp.isSoup = true; - tmp.price = NaN; - } - dayMenu.push(tmp); - }); - return false; - } - }); - - callback(dayMenu); - - function normalize(str) { - return str.normalizeWhitespace() - .removeMetrics() - .correctCommaSpacing(); - } -}; diff --git a/parsers/itb.js b/parsers/itb.js deleted file mode 100644 index 592f0908..00000000 --- a/parsers/itb.js +++ /dev/null @@ -1,65 +0,0 @@ -var cheerio = require('cheerio'); -require('./parserUtil'); - -module.exports.parse = function(html, date, callback) { - var $ = cheerio.load(html); - var dayMenu = []; - - var todayNameRegex = new RegExp(date.format("dddd"), "i"); - var tomorrowNameRegex = new RegExp(date.clone().add(1, 'days').format('dddd'), "i"); - - var menuRows = $('.tabularmenu').children('div.one-third, div.one-third-last, h2'); - var foundCurrentDay = false; - menuRows.each(function(index, element) { - var $row = $(element); - var text = $row.eq(0).text(); - if (tomorrowNameRegex.test(text)) { - return false; - } - if (foundCurrentDay) { - var meal = parseMeal($row); - if (!isNaN(meal.price)) { - dayMenu.push(parseMeal($row)); - } - } - if (todayNameRegex.test(text)) { - foundCurrentDay = true; - } - }); - - dayMenu.sort(function(item) { - if (item.isSoup) { - return 0; - } else { - return 1; - } - }); - callback(dayMenu); - - function parseMeal(tablerow) { - var menuItem = {}; - if (tablerow.find('li').length === 0) { - return menuItem; - } - menuItem.isSoup = /polievka/i.test(tablerow.children('h3').text()); - var textParts = tablerow.find('li').children('span').eq(1)[0].children; - var mergedText = textParts.length > 1 ? $(textParts[0]).text() + "," + $(textParts[2]).text() : $(textParts[0]).text(); - menuItem.text = normalize(mergedText); - menuItem.price = parseFloat(tablerow.find('li').children('span').eq(0).text().replace(/,/, '.')); - - return menuItem; - } - - function removeTrailingAlergens(str) { - return str.trim().replace(/,?\s*alerg.*/i, '').trim(); - } - - function normalize(str) { - return removeTrailingAlergens(str.normalizeWhitespace() - .removeItemNumbering() - .removeMetrics() - .correctCommaSpacing() - .toLowerCase() - .capitalizeFirstLetter()); - } -}; diff --git a/parsers/kamenica.js b/parsers/kamenica.js deleted file mode 100644 index 768e69c7..00000000 --- a/parsers/kamenica.js +++ /dev/null @@ -1,46 +0,0 @@ -var cheerio = require('cheerio'); -require('./parserUtil'); - -module.exports.parse = function(html, date, callback) { - var $ = cheerio.load(html); - var dayMenu = []; - - var soupPattern = /0[\.,]\d+\s?l?$/; - var dayOfWeek = parseInt(date.format('e')) + 1; - - var elements = $('.obedove-nadpis', '#content'); - var price = NaN; - elements.eq(0).text().replace(/\d,\d{2}\s€/, function(match){ - price = parseFloat(match.replace(',', '.')); - }); - - elements.eq(dayOfWeek).next().find('td').text() - .split('\n').filter(function(item){ return item; }) - .forEach(function(item) { - dayMenu.push(item); - }); - - //convert to menu item object - dayMenu = dayMenu.map(function(item) { - var menuItem = { isSoup: soupPattern.test(item.trim()) }; - if(menuItem.isSoup){ - menuItem.text = normalize(item.replace(soupPattern, '')); - menuItem.price = NaN; - } - else - { - menuItem.text = normalize(item); - menuItem.price = price; - } - return menuItem; - }); - - callback(dayMenu); - - function normalize(str) { - return str.normalizeWhitespace() - .removeMetrics() - .correctCommaSpacing() - .removeItemNumbering(); - } - }; diff --git a/parsers/kasa.js b/parsers/kasa.js deleted file mode 100644 index 0b385e6e..00000000 --- a/parsers/kasa.js +++ /dev/null @@ -1,47 +0,0 @@ -var cheerio = require('cheerio'); -require('./parserUtil'); - -module.exports.parse = function(html, date, callback) { - var $ = cheerio.load(html); - var dayMenu = []; - - var dateStr = date.format("DD.MM.YYYY"); - - var denneMenuElem = $('.dnesne_menu, .ostatne_menu').filter(function(){ - var nadpis = $(this).find('h2').text(); - return nadpis.indexOf(dateStr) > -1; - }); - - var soupElems = []; - var mealElems = []; - denneMenuElem.first().find('.jedlo_polozka').each(function(index) { - var elem = $(this); - if(index === 0) { - soupElems.push(elem); - } - else { - mealElems.push(elem); - } - }); - - soupElems.forEach((elem) => { - var text = normalize($('.left', elem).text()); - text = text.replace(/polievka:?\s*/, ''); - dayMenu.push({ isSoup: true, text: text, price: NaN }); - }); - - mealElems.forEach((elem) => { - var text = normalize($('.left', elem).text()); - var price = parseFloat($('.right', elem).text().trim()); - dayMenu.push({ isSoup: false, text: text, price: price }); - }); - - callback(dayMenu); - - function normalize(str) { - return str.normalizeWhitespace() - .removeMetrics() - .correctCommaSpacing() - .removeItemNumbering(); - } -}; diff --git a/parsers/lokalka.js b/parsers/lokalka.js deleted file mode 100644 index c7a6f73b..00000000 --- a/parsers/lokalka.js +++ /dev/null @@ -1,53 +0,0 @@ -var cheerio = require('cheerio'); -require('./parserUtil'); - -module.exports.parse = function(html, date, callback) { - var $ = cheerio.load(html); - var dayMenu = []; - var todayDate = date.format('DD.MM.YYYY'); - - var elements = $('li.fdm-item', 'div.entry-content.post-content'); - elements.each(function(){ - var node = $(this); - var title = node.find('p.fdm-item-title').text(); - if(isToday(title)){ - parseDailyMenu(node.find('table')); - return false; - } - }); - - callback(dayMenu); - - function isToday(title) { - return title.toLowerCase().indexOf(todayDate) !== -1; - } - - function parseDailyMenu(table) { - var rows = table.find('tr'); - rows.each(function(index, elem){ - if(index === 0){ - return; - } - if(index === 1){ - dayMenu = dayMenu.concat(parseSoup(elem)); - } - else{ - dayMenu.push(parseOther(elem)); - } - }); - } - - function parseSoup(row) { - var cells = $(row).find('td'); - var price = parseFloat(cells.eq(5).text().replace(',', '.')); - var text = cells.eq(1).text() + " " + cells.eq(2).text(); - var soups = text.split('/'); - - return soups.map(function(item) { return { isSoup: true, text: item.trim(), price: price }; }); - } - - function parseOther(row) { - var cells = $(row).find('td'); - return { isSoup: false, text: cells.eq(0).text(), price: parseFloat(cells.eq(3).text().replace(',', '.')) }; - } - }; diff --git a/parsers/numerouno.js b/parsers/numerouno.js deleted file mode 100644 index 4e9f60dd..00000000 --- a/parsers/numerouno.js +++ /dev/null @@ -1,74 +0,0 @@ -var cheerio = require('cheerio'); -var parserUtil = require('./parserUtil'); - -module.exports.parse = function(html, date, callback) { - var $ = cheerio.load(html); - var dayMenu = []; - - - var menuText = $('div.entry-content').first().text().trim().split(/\n/).map(function(line) { - return line.replace(/\t/g, ''); - }); - - dayMenu = parseDailyMenu(menuText, date); - - //sometimes one menu item is scattered across multiple lines of HTML - //if item does not start with number it should be added to previous one - for (var i = 1; i < dayMenu.length; i++) { - if (!/^\d/.test(dayMenu[i])) { - dayMenu[i - 1] = dayMenu[i - 1] + " " + dayMenu[i].trim(); - dayMenu.splice(i, 1); - i--; - } - else { - dayMenu[i] = dayMenu[i].trim(); - } - } - - //convert to objects - dayMenu = dayMenu.map(function(item, index) { - var priced = parserUtil.parsePrice(item); - return { isSoup: index === 0, text: normalize(priced.text), price: priced.price }; - }); - - callback(dayMenu); - - function parseDailyMenu(menuText, date) { - var todayName = date.format("dddd"); - var tomorrowName = date.clone().add(1, "days").format("dddd"); - - var startLine, endLine; - for (var i = 0; i < menuText.length; i++) { - if (menuText[i].toLowerCase().indexOf(todayName) !== -1) { - startLine = i; - } - if (startLine && (/^[-–—]+$/.test(menuText[i].trim()) || //dashed separator line - menuText[i].toLowerCase().indexOf(tomorrowName) !== -1 || //next day name - menuText[i].toLowerCase().indexOf("alerg") !== -1)) //alergeny - { - endLine = i; - break; - } - } - if (startLine === undefined || (startLine >= endLine)) { - return []; - } - var menuResult = menuText.slice(startLine, endLine); - menuResult = menuResult.filter(function(line) { - return /\S/.test(line); - }); //remove empty lines - //remove name of the day from the first menu entry - menuResult[0] = menuResult[0].substring(todayName.length).trim(); - - return menuResult; - } - - function normalize(str) { - return str.replace(/(–)\1+/, '').replace(/(\d,? ?)+$/, '') - .normalizeWhitespace() - .removeItemNumbering() - .removeMetrics() - .correctCommaSpacing(); - } -}; - diff --git a/parsers/parserUtil.js b/parsers/parserUtil.js deleted file mode 100644 index 092ab0ce..00000000 --- a/parsers/parserUtil.js +++ /dev/null @@ -1,73 +0,0 @@ -var config = require('../config'); - -module.exports.parsePrice = function(item) { - var priceRegex = /(\d+(?:[\.,]\d+)?)[\.,]?\s*(?:€|Eur)/i; - var price = NaN; - var text = item.replace(priceRegex, function(matchStr, group1) { - price = parseFloat(group1.replace(/\s/g, "").replace(",", ".")); - return ""; - }); - return { - price: price, - text: text - }; -}; - -var accentPairs = { 'a': "á", 'e': 'é', 'i': 'í', 'o': 'ó', 'u': 'ú', 'y': 'ý', 't': 'ť', 'l': 'ľ' }; - -global.String.prototype.tidyAfterOCR = global.String.prototype.tidyAfterOCR || function() { - return this.replace(/(\w)[`']/g, function(m, g) { - return accentPairs[g] || m; - }).replace('%:', '€'); -}; - -global.String.prototype.normalizeWhitespace = global.String.prototype.normalizeWhitespace || function() { - // also single spaces are replaced as there are different charcodes for space (32 vs. 160) - // and we need to be consistent because of comparisons in tests - return this.trim().replace(/\s+/g, ' '); -}; - -global.String.prototype.correctCommaSpacing = global.String.prototype.correctCommaSpacing || function() { - return this.replace(/(\S) *(,|\.) *(\S)/g, '$1$2 $3'); -}; - -global.String.prototype.removeMetrics = global.String.prototype.removeMetrics || function() { - //after metrics removal there might be whitespaces left at the ends so trim it afterwards - return this.replace(/\s*\(?(?:\d+\/)?( ?\d[\doO\s]*)+ *(?:[,\.]\d[\doO]*)? *[lLgG]\)?\.?\s*/g, ' ').trim(); -}; - -global.String.prototype.capitalizeFirstLetter = global.String.prototype.capitalizeFirstLetter || function() { - return this.replace(/(^[A-Za-z\u00C0-\u017F])/, function(a) { return a.toUpperCase(); }); -}; - -global.String.prototype.removeItemNumbering = global.String.prototype.removeItemNumbering || function() { - return this.trim().replace(/^\W\s+/, '').replace(/^[\w\d] *[\)\.,]+[AB]?\s*/, '').trim(); -}; - -module.exports.parseTheme = function(req) { - var cookies = this.parseCookies(req); - - //if no theme parameter is defined in URL, but it is in cookies - if (!req.params.theme && typeof cookies.theme !== "undefined") - { - return config.themes[cookies.theme] ? cookies.theme : "diana"; - } - - //use parameter from URL or default if not defined - return config.themes[req.params.theme] ? req.params.theme : "diana"; -}; - -module.exports.parseCookies = function(request) { - var list = {}, - rc = request.headers.cookie; - - if(rc) - { - rc.split(';').forEach(function(cookie) { - var parts = cookie.split('='); - list[parts.shift().trim()] = unescape(parts.join('=')); - }); - } - - return list; -}; diff --git a/parsers/parserUtil.ts b/parsers/parserUtil.ts new file mode 100644 index 00000000..bcca1594 --- /dev/null +++ b/parsers/parserUtil.ts @@ -0,0 +1,91 @@ +import { IMenuItem } from "./types.js"; + +declare global { + interface String { + tidyAfterOCR: () => string; + normalizeWhitespace: () => string; + removeMetrics: () => string; + removeAlergens: () => string; + capitalizeFirstLetter: () => string; + removeItemNumbering: () => string; + } +} + +export function parsePrice(item: string): { price: number; text: string } { + const priceRegex = /(\d+(?:[.,]\d+)?)[.,]?\s*(?:€|Eur)/gi; + let price = NaN; + const text = item.replace(priceRegex, (matchStr, group1: string) => { + price = parseFloat(group1.replace(/\s/g, "").replace(",", ".")); + return ""; + }); + return { + price, + text: text.trim(), + }; +} + +export function getDateRegex(date: Date): RegExp { + return new RegExp( + `0?${date.getDate()}\\.\\s?0?${date.getMonth() + 1}\\.\\s?${date.getFullYear()}`, + ); +} + +const accentPairs: { [key: string]: string } = { + a: "á", + e: "é", + i: "í", + o: "ó", + u: "ú", + y: "ý", + t: "ť", + l: "ľ", +}; + +String.prototype.tidyAfterOCR = function (this: string): string { + return this.replace(/(\w)[`']/g, (m: string, g: string) => { + return accentPairs[g] || m; + }).replace("%:", "€"); +}; + +String.prototype.normalizeWhitespace = function (this: string) { + // also single spaces are replaced as there are different charcodes for space (32 vs. 160) + // and we need to be consistent because of comparisons in tests + return this.trim().replace(/\s+/g, " "); +}; + +String.prototype.removeMetrics = function (this: string) { + return this.replace( + /\s*\(?(?:\d+\/)?( ?\d[\doO\s]*)+ *(?:[,.]\d[\doO]*)? *[lLgG]\)?\.?\s*/g, + " ", + ).trim(); +}; + +String.prototype.removeAlergens = function (this: string) { + return this.replace(/\s*[\s(\d,)]+$/g, ""); +}; + +String.prototype.capitalizeFirstLetter = function (this: string) { + return this.replace(/(^[A-Za-z\u00C0-\u017F])/, (a: string) => + a.toUpperCase(), + ); +}; + +String.prototype.removeItemNumbering = function (this: string) { + return this.trim() + .replace(/^\W\s+/, "") + .replace(/^[\dA-Z][ ).,:;]+(?:[AB]\s+)?/, "") + .trim(); +}; + +// Soup first menu item comparere +export function compareMenuItems(first: IMenuItem, second: IMenuItem): number { + const f = first.isSoup ? 0 : 1; + const s = second.isSoup ? 0 : 1; + return f - s; +} + +export function parserTimeout(ms: number): Promise { + return new Promise((_, reject) => { + setTimeout(() => reject(new Error("Parser timeout")), ms); + }); +} diff --git a/parsers/pizzapazza.js b/parsers/pizzapazza.js deleted file mode 100644 index c4739b9a..00000000 --- a/parsers/pizzapazza.js +++ /dev/null @@ -1,27 +0,0 @@ -var cheerio = require('cheerio'); -require('./parserUtil'); - -module.exports.parse = function(html, date, callback) { - var $ = cheerio.load(html); - var dayMenu = []; - - var menuTable = $("table#menu").first(); - var todayName = date.format("dddd"); - - menuTable.find("tr").each(function() { - var cells = $(this).children("td"); - if (cells.eq(1).find("h3").text().indexOf(todayName) > -1) { - dayMenu.push(parseItem(cells)); - } - }); - - callback(dayMenu); - - function parseItem(cells) { - var item = { isSoup: cells.eq(1).find("h3").text().indexOf("Polievka") > -1 }; - cells.eq(1).find("p").find("br").text(" - "); - item.text = cells.eq(1).find("p").text().normalizeWhitespace(); - item.price = parseFloat(cells.eq(3).text().replace(",", ".")); - return item; - } -}; diff --git a/parsers/skolka.js b/parsers/skolka.js deleted file mode 100644 index be4a9fdf..00000000 --- a/parsers/skolka.js +++ /dev/null @@ -1,90 +0,0 @@ -var cheerio = require('cheerio'); -var parserUtil = require('./parserUtil'); -var request = require('request'); - -module.exports.parse = function(html, date, callback) { - var $ = cheerio.load(html); - - var dateReg = new RegExp("^\\s*0?" + date.date() + "\\.\\s*0?" + (date.month() + 1) + "\\.\\s*" + date.year()); - var todayNameReg = new RegExp("^\\s*" + date.format("dddd"), "i"); - - var pic = $('.entry-content img'); - var link = $('.entry-content a').filter(function() { - return $(this).text() !== '' && !/ 0) { - var pdfUrl = link.attr('href'); - callOcr(pdfUrl, 'pdf'); - } - else if (pic.parent().filter("a").length > 0) { - pic = pic.parent().attr('href'); - callOcr(pic, "url"); - } - else if (pic.attr('src') !== undefined) { - pic = pic.attr('src'); - callOcr(pic, "encoded"); - } else { - parseMenu($('div.entry-content', '#post-2').text()); - } - - function callOcr(picData, actionMetod) { - request.post({ - headers: { 'Content-type': 'application/x-www-form-urlencoded' }, - url: 'http://at11ocr.azurewebsites.net/api/process/' + actionMetod, - body: "=" + encodeURIComponent(picData) - }, function(error, response, body) { - if (!error) { - parseMenu(body); - } - callback([]); - }); - } - - function parseMenu(menuString) { - var lines = menuString.split("\n").filter(function(val) { - return val.trim(); - }); - - var dayMenu = []; - var price; - for (var i = 0; i < lines.length; i++) { - if (todayNameReg.test(lines[i])) { - for (var offset = 0; offset < 3; offset++)//3 menu lines each day - { - var txt = lines[i + offset]; - if (offset === 0) { - txt = txt.replace(todayNameReg, ""); - } - if (offset === 1) { - txt = txt.replace(dateReg, ""); - } - txt = normalize(txt); - if (txt) { - dayMenu.push(txt); - } - } - } - if (/Hodnota/.test(lines[i])) { - price = parserUtil.parsePrice(lines[i]).price; - } - else { - price = price || NaN; - } - } - - //convert to menu item object - dayMenu = dayMenu.map(function(item, index) { - return { isSoup: /polievka/i.test(item), text: item, price: index === 0 ? NaN : price }; - }); - callback(dayMenu); - } - - function normalize(str) { - return str.tidyAfterOCR() - .removeItemNumbering() - .removeMetrics() - .normalizeWhitespace() - .correctCommaSpacing(); - } -}; diff --git a/parsers/types.ts b/parsers/types.ts new file mode 100644 index 00000000..f638bbb8 --- /dev/null +++ b/parsers/types.ts @@ -0,0 +1,10 @@ +export interface IMenuItem { + text: string; + price: number; + isSoup: boolean; +} + +export interface IParser { + urlFactory(date: Date): string; + parse(html: string, date: Date): Promise; +} diff --git a/parsers/zomato.js b/parsers/zomato.js deleted file mode 100644 index 71470117..00000000 --- a/parsers/zomato.js +++ /dev/null @@ -1,55 +0,0 @@ -var cheerio = require('cheerio'); -require('./parserUtil'); - -module.exports.parse = function(html, date, callback) { - var $ = cheerio.load(html); - var dayMenu = []; - - $('#daily-menu-container').find('.tmi-group').each(function() { - var $this = $(this); - - var text = $this.children('.tmi-group-name').text(); - var day = getDay(text); - - if(day === date.format('dddd')){ - $this.children('.tmi-daily').each(function() { - var text = $(this).find('.tmi-name').text().trim(); - var price = parseFloat($(this).find('.tmi-price').text().replace(/,/, '.')); - if(isNaN(price)){//price probably directly in text, extract it - text = text.replace(/\d[\.,]\d{2}$/, function(match){ - price = parseFloat(match.replace(',', '.')); - return ''; - }); - } - - if (!/^\d\s?[\.,]/.test(text)) { //soups dont have numbering - text.split('/').forEach(function(item){ - dayMenu.push({ isSoup: true, text: item.trim(), price: price }); - }); - } else { - dayMenu.push({ isSoup: false, text: normalize(text), price: price }); - } - }); - return false; - } - }); - - callback(dayMenu); - - function getDay(text) { - var found = text.trim().match(/^(.+),/); - if (!found || found.length < 1) { - return null; - } - - return found[1].toLowerCase(); - } - - function normalize(str) { - return str.removeItemNumbering() - .removeMetrics() - .replace(/A\s(\d\s?[\.,]?\s?)+$/, '') - .correctCommaSpacing() - .normalizeWhitespace(); - } -}; diff --git a/static/css/css3timepiece-at11.css b/static/css/css3timepiece-at11.css deleted file mode 100644 index 02a53547..00000000 --- a/static/css/css3timepiece-at11.css +++ /dev/null @@ -1,59 +0,0 @@ -.outer_face { - position: relative; - width: 237px; /* width of clock */ - height: 237px; /* height of clock */ - background-image: url("../img/clock_canvas.png"); - margin: 30px 0 0 0; - } - -.inner_face { - position: absolute; - width: 237px; - height: 237px; - margin: 0px; - -moz-border-radius: 1000px; - -webkit-border-radius: 1000px; - border-radius: 1000px; - z-index: 1000; - } - -.hand, .hand.hour { - position: absolute; - width: 28.5px; /* width of hour hand */ - height: 125px; /* height of hour hand */ - left: 118.5px; - margin-left: -14.25px; /* set this value to 1/2 width */ - margin-top: -6.5px; - background-image: url("../img/at11_hand_hour.png"); - background-repeat: none; - background-position: center; - -moz-transform: rotate(0deg); - -ms-transform: rotate(0deg); - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - -moz-transform-origin: bottom; - -ms-transform-origin: bottom; - -webkit-transform-origin: bottom; - transform-origin: bottom; - z-index: 2; - } - -.hand.minute { - height: 165px; /* height of min hand */ - width: 43.7px; /* width of min hand */ - margin-left: -21.85px; /* set this value to 1/2 width */ - margin-top: -47px; - background-image: url("../img/at11_hand_minute.png"); - background-repeat: none; - background-position: center; - z-index: 1; - } - -.hand.second { - height: 80.5px; /* height of sec hand */ - width: 1px; /* width of sec hand */ - margin-left: -0.5px; /* set this value to 1/2 width */ - margin-top: 38px; - background: #DEDCDE; - z-index: -1; - } \ No newline at end of file diff --git a/static/css/style.css b/static/css/style.css deleted file mode 100644 index c048ceb7..00000000 --- a/static/css/style.css +++ /dev/null @@ -1,208 +0,0 @@ -html, body { - margin: 0; - padding: 0; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - background-color: white; - color: rgb(50,50,50); -} - -body { - display: flex; - min-height: 100vh; - flex-direction: column; -} - -a, a:active, a:visited { - text-decoration: inherit; - color: inherit; -} - -header, footer, section { - border-width: 1px; - border-color: rgb(50,50,50); - background-color: rgb(250,250,250); -} - -header, footer { - width: 100%; - display: table; -} - - header > *, footer > * { - display: table-cell; - vertical-align: middle; - padding: 0.5em 0; - } - - header > *:first-child, footer > *:first-child { - text-align: left; - padding-left: 50px; - } - - header > *:last-child, footer > *:last-child { - text-align: right; - padding-right: 50px; - } - -header { - border-bottom-style: solid; -} - - header h1 { - font-size: 3em; - } - - header h1 > span { - color: rgb(210,210,210); - white-space: nowrap; - } - -footer { - font-size: 0.8em; - border-top-style: solid; -} - - footer a.github { - font-weight: bold; - white-space: nowrap; - } - -main { - flex: 1; - -ms-flex-preferred-size: auto; -} - -div#container { - margin: 10px 40px; -} - -section { - display: inline-block; - vertical-align: top; - width: 30em; - margin: 10px; - padding: 1em; - border-style: solid; -} - - section h2 { - font-size: 2em; - margin: 0.5em 0; - } - - section h2 a:hover:after { - font-family: FontAwesome; - font-style: normal; - font-weight: normal; - content: " \f08e"; - color: rgb(210,210,210); - } - - section ul { - display: table; - width: 29.5em; - padding-left: 0.5em; - border-collapse: collapse; - } - - section ul li { - display: table-row; - } - - section ul li > * { - display: table-cell; - } - - section ul li > *.price { - white-space: nowrap; - text-align: right; - padding-left: 0.5em; - } - - section ul li:before { - content: "\f0f5"; - font-family: FontAwesome; - font-weight: normal; - font-style: normal; - font-size: 0.875em; - text-align: center; - width: 2em; - display: table-cell; - } - section ul li.soup:before { - content: "\f1b1"; - } - section ul li.error:before { - content: "\f071"; - } - - section ul li.soup { - font-weight: bold; - } - - section > span.timeago { - display: block; - font-size: 0.7em; - text-align: right; - margin-right: 0.5em; - } - -/* settings*/ -div#settings { - font-size: 2em; - cursor: pointer; - display: inline-block; - position: relative; - padding: 0.5em 0 0.5em 0.5em; -} -div#settings > div { - position: absolute; - right: 0; - top: 3.5em; - z-index: 1; - display: none; - background-color: white; - border: 1px solid rgb(50,50,50); - text-align: left; - font-size: 0.5em; -} -div#settings:hover > div, div#settings.hover-effect > div { - display: block; -} -div#settings span, div#settings li{ - white-space: nowrap; -} -div#settings span { - display: block; - padding: 0.5em; - font-weight: bold; - background-color: rgb(250,250,250); -} -div#settings ul { - margin: 0; - padding: 0; - list-style: none; - display: block; -} -div#settings li:hover { - background-color: rgb(250,250,250); -} -div#settings li i.fa-fw { - text-align: left; -} - -ul#restaurantSelector { - overflow-y: scroll; - max-height: 10em; -} -ul#restaurantSelector li { - padding: 0.2em 0.5em; -} - -ul#themeSwitcher li a { - display: block; - padding: 0.4em 0.5em; -} -ul#themeSwitcher li a:hover { - text-decoration: underline; -} diff --git a/static/css/style3.css b/static/css/style3.css deleted file mode 100644 index 5b538cad..00000000 --- a/static/css/style3.css +++ /dev/null @@ -1,103 +0,0 @@ -a.github { - font-weight: bold; - white-space: nowrap; -} - -body { - font-size: 16px; -} - -header { - font-size: 20px; -} - -body > div { - margin: 10px 40px; -} - -section { - display: inline-block; - vertical-align: top; - width: 30em; - margin: 10px; - padding: 1em; - border: 1px solid gray; - border-radius: 4px; - background-color: rgb(250,250,250); -} - - section ul { - display: table; - width: 29em; - padding-left: 0.5em; - padding-right: 1.5em; - } - - section ul li { - display: table-row; - } - - section ul li > * { - display: table-cell; - } - - section ul li > *.price { - white-space: nowrap; - text-align: right; - padding-left: 0.5em; - } - - section ul li:before { - content: "\f0f5"; - font-family: FontAwesome; - font-weight: normal; - font-style: normal; - font-size: 0.875em; - text-align: center; - width: 2em; - display: table-cell; - } - section ul li.soup:before { - content: "\f1b1"; - } - section ul li.error:before { - content: "\f071"; - } - - section ul li.soup { - font-weight: bold; - } - - section ul li.error { - color: #a94442; - } - - section ul li.error > * { - padding: 0.5em 0; - background-color: #f2dede; - } - - section ul li.error > *:first-child { - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; - } - - section ul li.error > *:last-child { - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; - } - - section > span.timeago { - display: block; - font-size: 0.7em; - text-align: right; - margin-right: 0.5em; - } - -a.checkbox > input[type=checkbox] { - margin: 10px 0 0 0; -} - -a.checkbox > span:hover { - text-decoration: none; -} diff --git a/static/css/style4.css b/static/css/style4.css deleted file mode 100644 index 4905ad87..00000000 --- a/static/css/style4.css +++ /dev/null @@ -1,136 +0,0 @@ -a.github { - font-weight: bold; - white-space: nowrap; -} - -a:hover, a:focus, .btn-link:hover, .btn-link:focus { - color: salmon; - outline: none; -} - -.nav > li > a:hover, .nav > li > a:focus { - background-color: seashell; -} - -.btn-link:hover, .btn-link:focus { - background-color: seashell; -} - -.dropdown-menu>li>a:hover, .dropdown-menu>li>a:focus { - background-color: seashell; -} - -.nav .open > a, .nav .open > a:hover, .nav .open > a:focus { - background-color: seashell; -} - -a, h3, h1, .btn-link, .timeago { - color: #ff9ec2; -} - -section ul li.error { - color: purple; -} - -.navbar-default { - background-color: seashell; -} - -body { - font-size: 16px; -} - -header { - font-size: 20px; -} - -body > div { - margin: 10px 40px; -} - -section { - display: inline-block; - vertical-align: top; - width: 30em; - margin: 10px; - padding: 1em; - border: 1px solid gray; - border-radius: 4px; - background-color: seashell; -} - -section ul { - display: table; - width: 29em; - padding-left: 0.5em; - padding-right: 1.5em; -} - -section ul li { - display: table-row; -} - -section ul li > * { - display: table-cell; -} - -section ul li > *.price { - white-space: nowrap; - text-align: right; - padding-left: 0.5em; -} - -section ul li:before { - content: "\f0f5"; - font-family: FontAwesome; - font-weight: normal; - font-style: normal; - font-size: 0.875em; - text-align: center; - width: 2em; - display: table-cell; -} -section ul li.soup:before { - content: "\f1b1"; -} -section ul li.error:before { - content: "\f071"; -} - -section ul li.soup { - font-weight: bold; -} - -section ul li.error { - color: #a94442; -} - -section ul li.error > * { - padding: 0.5em 0; - background-color: #f2dede; -} - -section ul li.error > *:first-child { - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; -} - -section ul li.error > *:last-child { - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; -} - -section > span.timeago { - display: block; - font-size: 0.7em; - text-align: right; - margin-right: 0.5em; -} - -a.checkbox > input[type=checkbox] { - margin: 10px 0 0 0; -} - -a.checkbox > span:hover { - text-decoration: none; -} diff --git a/static/css/style5.css b/static/css/style5.css deleted file mode 100644 index 1a2144e7..00000000 --- a/static/css/style5.css +++ /dev/null @@ -1,167 +0,0 @@ -html, body { - margin: 0; - padding: 0; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - background-color: white; - color: rgb(50,50,50); -} - -body { - display: flex; - min-height: 100vh; - flex-direction: column; -} - -a, a:active, a:visited { - text-decoration: inherit; - color: inherit; -} - -header, footer, section { - border-width: 1px; - border-color: rgb(50,50,50); - background-color: rgb(250,250,250); -} - -header, footer { - width: 100%; - display: table; -} - - header > *, footer > * { - display: table-cell; - vertical-align: middle; - padding: 0.5em 0; - } - - header > *:first-child, footer > *:first-child { - text-align: left; - padding-left: 50px; - } - - header > *:last-child, footer > *:last-child { - text-align: right; - padding-right: 50px; - } - -header { - font-size: 3em; - border-bottom-style: solid; - font-weight: bold; -} - - header span#date { - color: rgb(210,210,210); - } - - header span#themes > ul { - position: absolute; - top: 80px; - right: 50px; - display: none; - text-align: left; - font-size: 16px; - padding: 0; - margin: 0; - font-weight: normal; - border: 1px solid rgb(50,50,50); - background-color: white; - } - header span#themes > ul li { - list-style: none; - padding: 4px 10px; - } - header span#themes:hover > ul { - display: inline-block; - } - -footer { - font-size: 0.8em; - border-top-style: solid; -} - - footer a.github { - font-weight: bold; - white-space: nowrap; - } - -main { - flex: 1; - -ms-flex-preferred-size: auto; -} - -div#container { - margin: 10px 50px; -} - -section { - padding: 1em; - border-style: solid; -} -section.item { - display: none; -} -section.item.active { - display: block; -} - - section h2 { - font-size: 2em; - margin: 0.5em 0; - } - - section h2 a:hover:after { - font-family: FontAwesome; - font-style: normal; - font-weight: normal; - content: " \f08e"; - color: rgb(210,210,210); - } - - section ul { - display: table; - width: 100%; - border-collapse: collapse; - } - - section ul li { - display: table-row; - } - - section ul li > * { - display: table-cell; - } - - section ul li > *.price { - white-space: nowrap; - text-align: right; - padding-left: 0.5em; - } - - section ul li:before { - content: "\f0f5"; - font-family: FontAwesome; - font-weight: normal; - font-style: normal; - font-size: 0.875em; - text-align: center; - width: 2em; - display: table-cell; - } - section ul li.soup:before { - content: "\f1b1"; - } - section ul li.error:before { - content: "\f071"; - } - - section ul li.soup { - font-weight: bold; - } - - section > span.timeago { - display: block; - font-size: 0.7em; - text-align: right; - margin-right: 0.5em; - } diff --git a/static/css/style6.css b/static/css/style6.css deleted file mode 100644 index 74390aef..00000000 --- a/static/css/style6.css +++ /dev/null @@ -1,525 +0,0 @@ -/* amatic-sc-regular - latin-ext_latin */ -@font-face { - font-family: 'Amatic SC'; - font-style: normal; - font-weight: 400; - src: url('../fonts/amatic-sc-v9-latin-ext_latin-regular.eot'); /* IE9 Compat Modes */ - src: local('Amatic SC Regular'), local('AmaticSC-Regular'), - url('../fonts/amatic-sc-v9-latin-ext_latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ - url('../fonts/amatic-sc-v9-latin-ext_latin-regular.woff2') format('woff2'), /* Super Modern Browsers */ - url('../fonts/amatic-sc-v9-latin-ext_latin-regular.woff') format('woff'), /* Modern Browsers */ - url('../fonts/amatic-sc-v9-latin-ext_latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */ - url('../fonts/amatic-sc-v9-latin-ext_latin-regular.svg#AmaticSC') format('svg'); /* Legacy iOS */ - } - -/* amatic-sc-700 - latin-ext_latin */ -@font-face { - font-family: 'Amatic SC'; - font-style: normal; - font-weight: 700; - src: url('../fonts/amatic-sc-v9-latin-ext_latin-700.eot'); /* IE9 Compat Modes */ - src: local('Amatic SC Bold'), local('AmaticSC-Bold'), - url('../fonts/amatic-sc-v9-latin-ext_latin-700.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ - url('../fonts/amatic-sc-v9-latin-ext_latin-700.woff2') format('woff2'), /* Super Modern Browsers */ - url('../fonts/amatic-sc-v9-latin-ext_latin-700.woff') format('woff'), /* Modern Browsers */ - url('../fonts/amatic-sc-v9-latin-ext_latin-700.ttf') format('truetype'), /* Safari, Android, iOS */ - url('../fonts/amatic-sc-v9-latin-ext_latin-700.svg#AmaticSC') format('svg'); /* Legacy iOS */ -} - -/* oswald-regular - latin-ext_latin */ -@font-face { - font-family: 'Oswald'; - font-style: normal; - font-weight: 400; - src: url('../fonts/oswald-v11-latin-ext_latin-regular.eot'); /* IE9 Compat Modes */ - src: local('Oswald Regular'), local('Oswald-Regular'), - url('../fonts/oswald-v11-latin-ext_latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ - url('../fonts/oswald-v11-latin-ext_latin-regular.woff2') format('woff2'), /* Super Modern Browsers */ - url('../fonts/oswald-v11-latin-ext_latin-regular.woff') format('woff'), /* Modern Browsers */ - url('../fonts/oswald-v11-latin-ext_latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */ - url('../fonts/oswald-v11-latin-ext_latin-regular.svg#Oswald') format('svg'); /* Legacy iOS */ -} - -/* oswald-300 - latin-ext_latin */ -@font-face { - font-family: 'Oswald'; - font-style: normal; - font-weight: 300; - src: url('../fonts/oswald-v11-latin-ext_latin-300.eot'); /* IE9 Compat Modes */ - src: local('Oswald Light'), local('Oswald-Light'), - url('../fonts/oswald-v11-latin-ext_latin-300.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ - url('../fonts/oswald-v11-latin-ext_latin-300.woff2') format('woff2'), /* Super Modern Browsers */ - url('../fonts/oswald-v11-latin-ext_latin-300.woff') format('woff'), /* Modern Browsers */ - url('../fonts/oswald-v11-latin-ext_latin-300.ttf') format('truetype'), /* Safari, Android, iOS */ - url('../fonts/oswald-v11-latin-ext_latin-300.svg#Oswald') format('svg'); /* Legacy iOS */ -} - -/* oswald-700 - latin-ext_latin */ -@font-face { - font-family: 'Oswald'; - font-style: normal; - font-weight: 700; - src: url('../fonts/oswald-v11-latin-ext_latin-700.eot'); /* IE9 Compat Modes */ - src: local('Oswald Bold'), local('Oswald-Bold'), - url('../fonts/oswald-v11-latin-ext_latin-700.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ - url('../fonts/oswald-v11-latin-ext_latin-700.woff2') format('woff2'), /* Super Modern Browsers */ - url('../fonts/oswald-v11-latin-ext_latin-700.woff') format('woff'), /* Modern Browsers */ - url('../fonts/oswald-v11-latin-ext_latin-700.ttf') format('truetype'), /* Safari, Android, iOS */ - url('../fonts/oswald-v11-latin-ext_latin-700.svg#Oswald') format('svg'); /* Legacy iOS */ -} - -html, body { - margin: 0; - padding: 0; - font-family: 'Oswald', sans-serif; - background-color: white; - color: #413F4A ; -} - -body { - display: flex; - min-height: 100vh; - flex-direction: column; - background-color: #eee; -} - -a, a:active, a:visited { - text-decoration: inherit; - color: inherit; -} - - -header, footer { - width: 100%; - display: table; -} - -header { - background-color: white; - height: 218px; - background: url('../img/at11_header_background_01.png') repeat-x; - padding: 0px; - margin-bottom: 30px; -} - -footer { - padding-top: 50px; - font-size: 0.9em; - text-align: center; - color: #FCB85F; - background-color: #E9843E; -} - -footer span { - margin-left: 10px; - margin-right: 10px; -} - -footer div { - display: inline-block; - padding: 0 12px 0 12px; - vertical-align: bottom; -} - -footer div a { - padding: 0px; - vertical-align: center; -} - -a.github { - float: none; -} - - #clock { - padding: 0px; - position: absolute; - left: 50%; - top: -15px; - margin-left: -115px; - z-index: 100; - } - -#main-logo { - padding: 0px; - width: 60px; - height: 76px; - background: url('../img/at11_logo_06.png') no-repeat center; - text-indent: -9999px; - float: left; -} - - h1, h2, h3 { - margin: 0px; - font-size: 2.5em; - /*margin: 0.5em 0; */ - text-align: right; - font-family: 'Amatic SC', Verdana, sans-serif; - color: #84C4D0 - } - - header h1 > span { - color: rgb(210,210,210); - white-space: nowrap; - } - -.first-row { - width: inherit; - float: right; - display: inline-block; - padding-left: 20px; - margin-top: 10px; - } - - div .title { - display:-inline-block; - font-size: 2.5em; - margin: 0.5em 0; - text-align: center; - font-family: 'Amatic SC', Verdana, sans-serif; - color: #84C4D0; - } - -.navbar { - position: relative; - padding: 7px 20px 12px 20px; - margin: auto; - background-color: none; - border-color: none; -} - -div#selection { - padding: 0 7px 0 7px; - } - -nav ul { - padding: 0; - margin: 0px; - list-style: none; - color: #E9843E; - } -nav li{ - display: inline-block; - position: relative; - line-height: 18px; - text-align: left; - color: #E9843E; - } - -nav li { - display: block; - color: #fff; - text-decoration: none; - /* background-color: #FCB85F; */ - } - -nav li.dropdown { - background-color: #FCB85F; - } - -nav a.checkbox { - display: block; - line-height: 23px; - padding-left: 30px; - text-indent: -23px - } - -nav ul.dropdown { - display: block; - color: #fff; - text-decoration: none; - background-color: #FCB85F; - } - -nav a { - display: block; - padding: 8px 20px 8px 20px; - text-decoration: none; - /* background-color: #FCB85F; */ - } - -a#dLabel { - margin-right: 5px; -} - - ul li a:hover{ - color: #fff; - background: #EE6B67; - } - - ul ul.dropdown{ - min-width: 131px; /* Set width of the dropdown */ - height: 46px; - background: #FCB85F; - display: none; - position: absolute; - z-index: 99; - left: 0; - } - -li.label { - padding: 0; - background-color: none; - font-size: 100%; - font-weight: 700; - color: #E9843E; -} - - ul li:hover ul.dropdown{ - display: block; /* Display the dropdown */ - } - ul li ul.dropdown li{ - display: block; - } - - li .dropdown { - padding: 0px; - } - -#selector-restaurant { - content: hidden; - background: url('../img/at11_icon_restaurant.png') no-repeat; -} - -main { - flex: 1; - -ms-flex-preferred-size: auto; -} - -section { - display: inline-block; - vertical-align: top; - width: 30em; - margin: 10px; - padding: 1em; - background: white; - text-align: left; -} - - section h2 { - font-size: 2.5em; - margin: 0.2em 0; - text-align: center; - font-family: 'Amatic SC', cursive; - color: #84C4D0; - } - - section h2 a:hover { - color: #EE6B67; - } - - section ul { - display: table; - width: 29.5em; - padding-left: 0.35em; - border-collapse: collapse; - } - - section ul li { - display: table-row; - font-size: 1em; - } - - section ul li > * { - display: table-cell; - } - - section ul li > *.price { - white-space: nowrap; - text-align: right; - padding-left: 0.5em; - color: #E9843E; - } - - section ul li:before { - content: ""; - display: table-cell; - background: url('../img/at11_dish_icon.png') no-repeat center 3px; - width: 1em; - } - section ul li.soup:before{ - background: url('../img/at11_soup_icon.png') no-repeat center 3px; - } - section ul li.error:before { - background-image: none; - color: lightgrey; - text-align: center; - } - - section ul li.soup { - font-weight: 300; - letter-spacing: 0.02em; - } - - section > span.timeago { - display: block; - font-size: 0.7em; - text-align: right; - margin-right: 0.5em; - color: #E9843E; - } - -main span { - padding-left: 6px; -} - -div#container { - margin: 10px 40px; - text-align: center; - max-width: 2100px; - margin-left: auto; - margin-right: auto; -} - -.clear-fix:before, -.clear-fix:after { - content: ""; - display: table; -} - -.clear-fix:after { - clear:both; -} - -.clear-fix { - zoom:1; -} - -.fa-lg { - vertical-align: -5%; -} - -/* ADAPTIVE */ -@media (max-width: 2100px) { - /* 3 columns */ - div#container { - max-width: 1600px ; - } - .navbar { - max-width: 1600px; - } -} - -@media (max-width: 1620px) { - /* 2 columns */ - div#container { - max-width: 1065px ; - } - .navbar { - max-width: 1065px; - } -} - -@media (max-width: 1080px) { - /* 1 column */ - div#container { - max-width: 532px; - } - div#denne-menu { - display: none; - } -} - -@media (max-width: 920px) { - ul#restauracie{ - float: left; - } -} - -@media (max-width: 620px) { -/* lower clock */ - #clock { - padding-top: 50px; - } - - header { - height: 240px; - background-color: #FCB85F; - } -} - -@media (max-width: 532px) { - /* mobile */ - section { - width: 100%; - padding: 0.5em; - } - - section ul { - width: 100%; - } - - ul#temy { - display: none; - } - - header { - height: 460px; - background-color: #FCB85F; - margin: 0px; - } - - div.clear-fix > div { - margin-top: 0px; - } - - .first-row { - font-size: 13px - } - - section h2 { - font-size: 2em; - margin: 0px; - } - - #date { - margin-top: 4px; - } - - div#selection { - margin-top: 225px; - } - - nav ul{ - width: 100%; - text-align: center; - } - nav a { - display: inline; - width: 100%; - padding: 8px 21px 8px 21px; - } - - nav a.checkbox { - display: inline; - padding: 10px; - line-height: 37px; - } - - ul li ul.dropdown li { - display: inline-block; - } - - ul ul.dropdown { - display: inline; - min-width: 100%; /* Set width of the dropdown */ - height: 46px; - background: #FCB85F; - position: absolute; - } - - #selectRestaurant { - display: none; - } -} - -@media (max-width: 320px) { - /* very old mobile */ - - .navbar { - padding: 4px 10px 12px 10px; - } - - header { - height: 533px; - } -} \ No newline at end of file diff --git a/static/img/favicon_at11.ico b/static/favicon.ico similarity index 100% rename from static/img/favicon_at11.ico rename to static/favicon.ico diff --git a/static/fonts/amatic-sc-v9-latin-ext_latin-700.eot b/static/fonts/amatic-sc-v9-latin-ext_latin-700.eot deleted file mode 100644 index 1e658394..00000000 Binary files a/static/fonts/amatic-sc-v9-latin-ext_latin-700.eot and /dev/null differ diff --git a/static/fonts/amatic-sc-v9-latin-ext_latin-700.svg b/static/fonts/amatic-sc-v9-latin-ext_latin-700.svg deleted file mode 100644 index a65b0808..00000000 --- a/static/fonts/amatic-sc-v9-latin-ext_latin-700.svg +++ /dev/null @@ -1,640 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/static/fonts/amatic-sc-v9-latin-ext_latin-regular.eot b/static/fonts/amatic-sc-v9-latin-ext_latin-regular.eot deleted file mode 100644 index 15ade806..00000000 Binary files a/static/fonts/amatic-sc-v9-latin-ext_latin-regular.eot and /dev/null differ diff --git a/static/fonts/amatic-sc-v9-latin-ext_latin-regular.svg b/static/fonts/amatic-sc-v9-latin-ext_latin-regular.svg deleted file mode 100644 index 9a0bbbd7..00000000 --- a/static/fonts/amatic-sc-v9-latin-ext_latin-regular.svg +++ /dev/null @@ -1,698 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/static/fonts/oswald-v11-latin-ext_latin-300.eot b/static/fonts/oswald-v11-latin-ext_latin-300.eot deleted file mode 100644 index 47c166e7..00000000 Binary files a/static/fonts/oswald-v11-latin-ext_latin-300.eot and /dev/null differ diff --git a/static/fonts/oswald-v11-latin-ext_latin-300.svg b/static/fonts/oswald-v11-latin-ext_latin-300.svg deleted file mode 100644 index 76ebcb60..00000000 --- a/static/fonts/oswald-v11-latin-ext_latin-300.svg +++ /dev/null @@ -1,335 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/static/fonts/oswald-v11-latin-ext_latin-700.eot b/static/fonts/oswald-v11-latin-ext_latin-700.eot deleted file mode 100644 index cc910b4b..00000000 Binary files a/static/fonts/oswald-v11-latin-ext_latin-700.eot and /dev/null differ diff --git a/static/fonts/oswald-v11-latin-ext_latin-700.svg b/static/fonts/oswald-v11-latin-ext_latin-700.svg deleted file mode 100644 index bbecefea..00000000 --- a/static/fonts/oswald-v11-latin-ext_latin-700.svg +++ /dev/null @@ -1,339 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/static/fonts/oswald-v11-latin-ext_latin-regular.eot b/static/fonts/oswald-v11-latin-ext_latin-regular.eot deleted file mode 100644 index 7084f3f8..00000000 Binary files a/static/fonts/oswald-v11-latin-ext_latin-regular.eot and /dev/null differ diff --git a/static/fonts/oswald-v11-latin-ext_latin-regular.svg b/static/fonts/oswald-v11-latin-ext_latin-regular.svg deleted file mode 100644 index 82fe3f97..00000000 --- a/static/fonts/oswald-v11-latin-ext_latin-regular.svg +++ /dev/null @@ -1,347 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/static/img/at11_logo_06.png b/static/img/at11_logo.png similarity index 100% rename from static/img/at11_logo_06.png rename to static/img/at11_logo.png diff --git a/static/img/at11_plate_03.png b/static/img/at11_plate_03.png deleted file mode 100644 index ec1a4bae..00000000 Binary files a/static/img/at11_plate_03.png and /dev/null differ diff --git a/static/img/erni_logo.png b/static/img/erni_logo.png new file mode 100644 index 00000000..14714aef Binary files /dev/null and b/static/img/erni_logo.png differ diff --git a/static/img/favicon.ico b/static/img/favicon.ico deleted file mode 100644 index 0e17572a..00000000 Binary files a/static/img/favicon.ico and /dev/null differ diff --git a/static/img/github.png b/static/img/github.png new file mode 100644 index 00000000..c71ec0a5 Binary files /dev/null and b/static/img/github.png differ diff --git a/static/js/script.js b/static/js/script.js deleted file mode 100644 index b9aadc6d..00000000 --- a/static/js/script.js +++ /dev/null @@ -1,62 +0,0 @@ -/* global writeCookie, readCookie, loadMenus */ - -$(document).ready(function() { - var container = $("#container"); - loadMenus(container); - initialHide(container); - container.masonry(); - - $('#restaurantSelector').on('click', 'li', function() { - var li = $(this); - var restaurantId = li.data('restaurantId'); - var checkBox = li.children('i').first(); - - var section; - if (checkBox.hasClass('fa-check-square-o'))//checked - { - checkBox.removeClass('fa-check-square-o').addClass('fa-square-o');//uncheck - section = $('section[data-restaurant-id=' + restaurantId + ']', container); - window.hiddenRestaurants[restaurantId.toString()] = section; - container.masonry('remove', section).masonry(); - } - else//unchecked - { - checkBox.removeClass('fa-square-o').addClass('fa-check-square-o');//check - section = window.hiddenRestaurants[restaurantId.toString()]; - delete window.hiddenRestaurants[restaurantId.toString()]; - container.append(section).masonry('appended', section).masonry(); - } - - var hiddenRestaurantsIds = []; - $.each(window.hiddenRestaurants, function(key) { - hiddenRestaurantsIds.push(key); - }); - writeCookie('hiddenRestaurants', hiddenRestaurantsIds.join(','), 10 * 365); - }); - - $('.hover').on('touchstart', function() { - $(this).toggleClass('hover-effect'); - }); -}); - -function initialHide(container) { - window.hiddenRestaurants = {}; - - var hidden = readCookie("hiddenRestaurants"); - if (!hidden) { - return; - } - hidden = hidden.split(","); - - $.each(hidden, function(index, value) { - var section = $('section[data-restaurant-id=' + value + ']', container); - if (section.length > 0)//found - { - window.hiddenRestaurants[value.toString()] = section; - section.remove(); - var checkBox = $('#restaurantSelector li[data-restaurant-id=' + value + '] > i'); - checkBox.removeClass('fa-check-square-o').addClass('fa-square-o');//uncheck - } - }); -} - diff --git a/static/js/script3.js b/static/js/script3.js deleted file mode 100644 index e1cf255f..00000000 --- a/static/js/script3.js +++ /dev/null @@ -1,69 +0,0 @@ -/* global writeCookie, readCookie, loadMenus */ - -$(document).ready(function() { - $('.navigation-info').remove(); - - var container = $("#container"); - loadMenus(container); - initialHide(container); - container.masonry(); - - $('#selectrestaurants').on('click', function(e) { - e.stopPropagation(); - - var $target = $(e.target); - var checkbox; - if($target.val() === '') { - checkbox = $target.children('input').length > 0 ? $target.children('input') : $target.siblings('input'); - checkbox.prop('checked', !checkbox.prop('checked')); - } - else { - checkbox = $target; - } - - var id = checkbox.val(); - var section; - if(checkbox.prop('checked'))//show - { - section = window.hiddenRestaurants[id.toString()]; - delete window.hiddenRestaurants[id.toString()]; - container.append(section).masonry('appended', section).masonry(); - } - else//hide - { - section = $('section[data-restaurant-id=' + id + ']', container); - window.hiddenRestaurants[id.toString()] = section; - container.masonry('remove', section).masonry(); - } - - var unChecked = []; - $('input[type="checkbox"]', this).each(function() { - if(!$(this).prop('checked')) { - unChecked.push($(this).val()); - } - }); - writeCookie('hiddenRestaurants', unChecked.join(','), 10 * 365); - }); -}); - -function initialHide(cont) { - window.hiddenRestaurants = {}; - - var hidden = readCookie("hiddenRestaurants"); - if(typeof hidden === "undefined") { - return; - } - - hidden = hidden.split(","); - - $("section", cont).each(function() { - var section = $(this); - var restaurantId = section.data("restaurantId"); - if(hidden.indexOf(restaurantId.toString()) > -1)//hide section - { - window.hiddenRestaurants[restaurantId.toString()] = section; - section.remove(); - $('input[type=checkbox][value=' + restaurantId + ']', '#selectrestaurants').prop('checked', false); - } - }); -} diff --git a/static/js/script5.js b/static/js/script5.js deleted file mode 100644 index c5b9aafc..00000000 --- a/static/js/script5.js +++ /dev/null @@ -1,19 +0,0 @@ -/* global loadMenus */ - -$(document).ready(function() { - var container = $("#container"); - loadMenus(container); - - container.carousel({ - interval: 4000, - pause: false - }); - - $(document).bind('keyup', function(e) { - if (e.which === 39) { - container.carousel('next'); - } else if (e.which === 37) { - container.carousel('prev'); - } - }); -}); diff --git a/static/js/utils.js b/static/js/utils.js deleted file mode 100644 index 7f4d7e7c..00000000 --- a/static/js/utils.js +++ /dev/null @@ -1,75 +0,0 @@ -/* exported writeCookie, readCookie, loadMenus */ - -function writeCookie(cookieName, cookieValue, nDays) { - var today = new Date(); - var expire = new Date(); - if(!nDays) { nDays = 1; } - expire.setTime(today.getTime() + 3600 * 1000 * 24 * nDays); - document.cookie = cookieName + "=" + escape(cookieValue) + ";expires=" + expire.toUTCString() + ";path=/"; -} - -function readCookie(name) { - var cookies = document.cookie.split(";"); - for(var i = 0; i < cookies.length; i++) { - var nameValue = cookies[i].split("="); - if(nameValue[0].trim() === name) { - return unescape(nameValue[1].trim()); - } - } -} - -function loadMenus(container) { - var dateCompound = getDateCompound(); - - $('#date').text(dateCompound.description); - var date = dateCompound.date; - $("section", container).each(function() { - var section = $(this); - var restaurantId = section.data("restaurantId"); - - var errElem = "
  • Nepodarilo sa načítať menu, skús pozrieť priamo na stránke reštaurácie
  • "; - var listElem = $("
      "); - var refreshElem = null; - $.ajax("/menu/" + restaurantId + "/" + date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate()) - .done(function(data) { - if (!data) { - listElem.append(errElem); - } - else { - data.menu.forEach(function(item) { - var li = $("
    • "); - if (item.isSoup) { - li.addClass("soup"); - } - li.append("" + item.text + ""); - if (item.price) { - li.append("" + item.price + ""); - } - listElem.append(li); - }); - refreshElem = " " + data.timeago + ""; - } - }) - .fail(function() { - listElem.append(errElem); - }) - .always(function() { - section.find(".fa-spinner").remove(); - section.append(listElem); - if(refreshElem){ - section.append(refreshElem); - } - container.masonry(); - }); - }); -} - -function getDateCompound() { - var date = new Date(); - var desc = "dnes"; - if(date.getHours() >= 15) { - date.setDate(date.getDate() + 1); - desc = "zajtra"; - } - return { date: date, description: desc + " " + date.toLocaleDateString() }; -} diff --git a/static/robots.txt b/static/robots.txt new file mode 100644 index 00000000..a82d96e8 --- /dev/null +++ b/static/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: diff --git a/static/script.js b/static/script.js new file mode 100644 index 00000000..14fc175e --- /dev/null +++ b/static/script.js @@ -0,0 +1,225 @@ +function writeCookie(cookieName, cookieValue, nDays) { + var today = new Date(); + var expire = new Date(); + if (!nDays) { + nDays = 1; + } + expire.setTime(today.getTime() + 3600 * 1000 * 24 * nDays); + document.cookie = + cookieName + + "=" + + escape(cookieValue) + + ";expires=" + + expire.toUTCString() + + ";path=/"; +} + +function readCookie(name) { + var cookies = document.cookie.split(";"); + for (var i = 0; i < cookies.length; i++) { + var nameValue = cookies[i].split("="); + if (nameValue[0].trim() === name) { + return unescape(nameValue[1].trim()); + } + } +} + +function loadMenus(container) { + var dateCompound = getDateCompound(); + + $("#date").text(dateCompound.description); + var date = dateCompound.date; + $("article", container).each(function () { + var article = $(this); + var restaurantId = article.data("restaurantId"); + var link = $("a", article).prop("href"); + + var errElem = + "
    • Nepodarilo sa načítať menu, skús pozrieť priamo na stránke reštaurácie
    • "; + var listElem = $("
        "); + var refreshElem = null; + fetch( + "/menu/" + + restaurantId + + "?date=" + + date.getFullYear() + + "-" + + (date.getMonth() + 1) + + "-" + + date.getDate(), + ) + .then((response) => { + if (!response.ok) { + return response.json().then( + function (errorData) { + return Promise.reject(errorData); + }, + function () { + return Promise.reject(null); + }, + ); + } + return response.json(); + }) + .then((data) => { + if (data.menu.length === 0) { + listElem.append(errElem); + } else { + data.menu.forEach((item) => { + var li = $("
      • "); + if (item.isSoup) { + li.addClass("soup"); + } + li.append("" + item.text + ""); + if (item.price) { + li.append( + "" + + item.price.toLocaleString("sk", { + style: "currency", + currency: "EUR", + }) + + "", + ); + } + listElem.append(li); + }); + } + refreshElem = "" + data.timeago + ""; + }) + .catch(function (errorData) { + listElem.append(errElem); + if (errorData?.timeago) { + refreshElem = + "" + errorData.timeago + ""; + } + }) + .finally(function () { + article.find(".loader").remove(); + article.append(listElem); + article.append(refreshElem); + container.masonry(); + }); + }); +} + +function initialHide(cont) { + window.hiddenRestaurants = {}; + var hidden = readCookie("hiddenRestaurants"); + if (typeof hidden === "undefined") { + return; + } + hidden = hidden.split(","); + + $("article", cont).each(function () { + var article = $(this); + var restaurantId = article.data("restaurantId"); + if (hidden.indexOf(restaurantId.toString()) > -1) { + // hide + window.hiddenRestaurants[restaurantId.toString()] = article; + article.remove(); + $( + "input[type=checkbox][value=" + restaurantId + "]", + "#selectrestaurants", + ).prop("checked", false); + } + }); +} + +function getDateCompound() { + var date = new Date(); + var desc = "dnes"; + if (date.getHours() >= 15) { + date.setDate(date.getDate() + 1); + desc = "zajtra"; + } + return { + date: date, + description: desc + " " + date.toLocaleDateString("sk"), + }; +} + +function startClock() { + // CSS3 Analog Clock- by JavaScript Kit (www.javascriptkit.com) + var $hands = $("#liveclock div.hand"); + window.requestAnimationFrame = + window.requestAnimationFrame || + window.mozRequestAnimationFrame || + window.webkitRequestAnimationFrame || + window.msRequestAnimationFrame || + function (f) { + setTimeout(f, 60); + }; + function updateclock() { + var curdate = new Date(); + var hour_as_degree = + ((curdate.getHours() + curdate.getMinutes() / 60) / 12) * 360; + var minute_as_degree = (curdate.getMinutes() / 60) * 360; + var second_as_degree = + ((curdate.getSeconds() + curdate.getMilliseconds() / 1000) / 60) * + 360; + $hands + .filter(".hour") + .css({ transform: "rotate(" + hour_as_degree + "deg)" }); + $hands + .filter(".minute") + .css({ transform: "rotate(" + minute_as_degree + "deg)" }); + $hands + .filter(".second") + .css({ transform: "rotate(" + second_as_degree + "deg)" }); + requestAnimationFrame(updateclock); + } + requestAnimationFrame(updateclock); +} + +startClock(); +var container = $("#container"); +loadMenus(container); +initialHide(container); +container.masonry({ + fitWidth: true, +}); + +$("#selectrestaurants").on("click", function (e) { + e.stopPropagation(); + + var $target = $(e.target); + var checkbox; + if ($target.val() === 0) { + checkbox = + $target.children("input").length > 0 + ? $target.children("input") + : $target.siblings("input"); + checkbox.prop("checked", !checkbox.prop("checked")); + } else { + checkbox = $target; + } + + var id = checkbox.val(); + var article; + if (checkbox.prop("checked")) { + //show + article = window.hiddenRestaurants[id.toString()]; + delete window.hiddenRestaurants[id.toString()]; + container.append(article).masonry("appended", article).masonry(); + } //hide + else { + article = $("article[data-restaurant-id=" + id + "]", container); + window.hiddenRestaurants[id.toString()] = article; + container.masonry("remove", article).masonry(); + } + + var unChecked = []; + $('input[type="checkbox"]', this).each(function () { + if (!$(this).prop("checked")) { + unChecked.push($(this).val()); + } + }); + writeCookie("hiddenRestaurants", unChecked.join(","), 10 * 365); +}); + +// run additional layout when page is fully loaded (including fonts, images etc..) +$(window).on("load", function () { + container.masonry(); +}); diff --git a/static/style.css b/static/style.css new file mode 100644 index 00000000..db90d21c --- /dev/null +++ b/static/style.css @@ -0,0 +1,309 @@ +/* clock styles */ +.outer_face { + position: relative; + width: 237px; + height: 237px; + background-image: url("../img/clock_canvas.png"); +} +.inner_face { + position: absolute; + width: 237px; + height: 237px; + border-radius: 1000px; + z-index: 1000; +} +.hand, +.hand.hour { + position: absolute; + width: 28.5px; + height: 125px; + left: 118.5px; + margin-left: -14.25px; + margin-top: -6.5px; + background-image: url("../img/at11_hand_hour.png"); + background-repeat: none; + background-position: center; + transform: rotate(0deg); + transform-origin: bottom; + z-index: 2; +} +.hand.minute { + height: 165px; + width: 43.7px; + margin-left: -21.85px; + margin-top: -47px; + background-image: url("../img/at11_hand_minute.png"); + background-repeat: none; + background-position: center; + z-index: 1; +} +.hand.second { + height: 80.5px; + width: 1px; + margin-left: -0.5px; + margin-top: 38px; + background: #dedcde; + z-index: -1; +} +/* page stylws */ +@font-face { + font-family: "Amatic SC"; + font-style: normal; + font-weight: 400; + src: + local("Amatic SC Regular"), + local("AmaticSC-Regular"), + url("../fonts/amatic-sc-v9-latin-ext_latin-regular.woff2") + format("woff2"), + url("../fonts/amatic-sc-v9-latin-ext_latin-regular.woff") format("woff"); +} +@font-face { + font-family: "Amatic SC"; + font-style: normal; + font-weight: 700; + src: + local("Amatic SC Bold"), + local("AmaticSC-Bold"), + url("../fonts/amatic-sc-v9-latin-ext_latin-700.woff2") format("woff2"), + url("../fonts/amatic-sc-v9-latin-ext_latin-700.woff") format("woff"); +} +@font-face { + font-family: "Oswald"; + font-style: normal; + font-weight: 400; + src: + local("Oswald Regular"), + local("Oswald-Regular"), + url("../fonts/oswald-v11-latin-ext_latin-regular.woff2") format("woff2"), + url("../fonts/oswald-v11-latin-ext_latin-regular.woff") format("woff"); +} +@font-face { + font-family: "Oswald"; + font-style: normal; + font-weight: 300; + src: + local("Oswald Light"), + local("Oswald-Light"), + url("../fonts/oswald-v11-latin-ext_latin-300.woff2") format("woff2"), + url("../fonts/oswald-v11-latin-ext_latin-300.woff") format("woff"); +} +@font-face { + font-family: "Oswald"; + font-style: normal; + font-weight: 700; + src: + local("Oswald Bold"), + local("Oswald-Bold"), + url("../fonts/oswald-v11-latin-ext_latin-700.woff2") format("woff2"), + url("../fonts/oswald-v11-latin-ext_latin-700.woff") format("woff"); +} + +html, +body { + margin: 0; + padding: 0; + width: 100%; + height: 100%; + font-family: "Oswald", sans-serif; + background-color: #eee; + color: #413f4a; + min-width: 600px; +} +body { + display: flex; + min-height: 100vh; + flex-direction: column; +} +h1, +h2 { + margin: 0; + font-family: "Amatic SC", Verdana, sans-serif; + color: #84c4d0; +} +a { + text-decoration: inherit; + color: inherit; +} + +header { + background-color: white; + height: 218px; + background: url("../img/at11_header_background_01.png") repeat-x; + padding: 0 5%; + flex: none; +} +main { + margin: 0 5%; + flex: 1; +} +main > div#container { + margin: 10px auto; +} +footer { + padding: 20px 5%; + font-size: 0.9em; + text-align: center; + color: #fcb85f; + background-color: #e9843e; + flex: none; +} + +header .logos { + margin-top: 20px; + float: left; +} +header .logos a { + margin: 0; + padding: 0; + display: inline; +} +header .logos img { + height: 50px; + margin-right: 10px; +} +header h1 { + margin-top: 20px; + font-size: 40px; + float: right; +} + +#clock { + position: absolute; + left: 50%; + top: 15px; + margin-left: -118.5px; + z-index: 1; +} + +header #picker { + cursor: pointer; + clear: both; + float: left; + width: 200px; + margin-top: 8px; + position: relative; + color: #e9843e; + font-weight: bold; + padding: 5px 10px; + height: 30px; +} +header #picker:hover { + color: #fff; + background: #ee6b67; +} +#picker:hover ul { + display: block; +} +#picker ul { + position: absolute; + top: 34px; + left: 0; + display: none; + padding: 0; + margin: 0; + list-style: none; + color: #e9843e; + z-index: 2; +} +#picker li { + width: 210px; + display: block; + line-height: 18px; + color: #fff; + background-color: #fcb85f; + padding: 5px 5px; +} +#picker li:hover { + background: #ee6b67; +} + +article { + width: 30em; + margin: 10px; + padding: 1.5em; + background: white; +} +article h2 { + font-size: 2.5em; + text-align: center; +} +article h2 a:hover { + color: #ee6b67; +} +article .loader { + margin: 10px auto; + border: 6px solid #eee; + border-top: 6px solid #e9843e; + border-radius: 50%; + width: 30px; + height: 30px; + animation: spin 2s linear infinite; +} +@keyframes spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} +article ul { + display: table; + width: 100%; + border-collapse: collapse; + margin: 10px 0; +} +article ul li { + display: table-row; + font-size: 1em; +} +article ul li > * { + display: table-cell; +} +article ul li > *.price { + white-space: nowrap; + text-align: right; + padding-left: 0.5em; + color: #e9843e; +} +article ul li:before { + content: ""; + display: table-cell; + background: url("../img/at11_dish_icon.png") no-repeat left 2px; + width: 1em; +} +article ul li.soup { + font-weight: 300; + letter-spacing: 0.02em; +} +article ul li.soup:before { + background-image: url("../img/at11_soup_icon.png"); +} +article ul li.error { + color: lightgrey; + text-align: center; +} +article ul li.error:before { + display: none; +} +article ul a { + color: #e9843e; +} +article > i.timeago { + display: block; + font-size: 0.7em; + text-align: right; + color: #ee6b67; +} + +footer .copyright { + float: left; +} +footer .github { + float: right; +} +footer p { + clear: both; + text-align: center; + margin: 0; +} diff --git a/test/cache.js b/test/cache.js deleted file mode 100644 index 175856e9..00000000 --- a/test/cache.js +++ /dev/null @@ -1,45 +0,0 @@ -var assert = require('assert'), - cache = require('../cache.js'); - -describe('cache', function() { - describe('set', function() { - - it("should exists", function() { - assert(cache.set); - }); - - it("should not throw exception", function() { - assert.doesNotThrow(function() { - cache.set('abc', {}); - }); - }); - }); - - describe('get', function() { - - it("should exists", function() { - assert(cache.get); - }); - - it("should not found what wasn't stored", function() { - assert(!(cache.get('xyz'))); - }); - - it("should found what was stored", function() { - var value = {prop: 'value'}; - cache.set("obj", value); - assert.strictEqual(cache.get("obj").value, value); - }); - - it("should expire", function(done) { - var config = require('../config'); - config.cacheExpiration = 1;//set expiraion time to 1ms - cache.set("obj", {}); - - setTimeout(function() { - assert(!(cache.get('obj'))); - done(); - }, 2); - }); - }); -}); \ No newline at end of file diff --git a/test/danovak.js b/test/danovak.js deleted file mode 100644 index c64d96df..00000000 --- a/test/danovak.js +++ /dev/null @@ -1,188 +0,0 @@ -var assert = require('assert'), - fs = require('fs'), - moment = require('moment-timezone'), - parser_zomato = require('../parsers/zomato'), - parser_danovak = require('../parsers/danovak'); -moment.locale('sk'); - -describe('danovak_zomato_parser', function () { - describe('parsing sample 2015-07-29', function () { - - var html = fs.readFileSync(__dirname + '/samples/Danovak.2015-07-29.html', { encoding: "utf-8" }); - var menu; - - before(function (done) { - parser_zomato.parse(html, moment("2015-07-29"), function (menuItems) { - menu = menuItems; - done(); - }); - }); - - it("should return 7 items", function () { - assert.equal(menu.length, 7); - }); - - - it("1st item correct", function () { - assert.equal(menu[0].isSoup, true); - assert.equal(menu[0].text.trim(), "Kurací vývar so zeleninou, rezance"); - assert(isNaN(menu[0].price)); - }); - - it("2nd item correct", function () { - assert.equal(menu[1].isSoup, true); - assert.equal(menu[1].text.trim(), "Šošovicová na kyslo"); - assert(isNaN(menu[1].price)); - }); - - it("3rd item correct", function () { - assert.equal(menu[2].isSoup, false); - assert.equal(menu[2].text.trim(), "Kuracie prsia na nivovje omáčke dusená ryža, šalát"); - assert.equal(menu[2].price, 3.80); - }); - - it("4th item correct", function () { - assert.equal(menu[3].isSoup, false); - assert.equal(menu[3].text.trim(), "Španielský vtáčik, tarhoňa, šalát"); - assert.equal(menu[3].price, 3.80); - }); - - it("5th item correct", function () { - assert.equal(menu[4].isSoup, false); - assert.equal(menu[4].text.trim(), "Bryndzové halušky s domácou slaninkou a pažítkou"); - assert.equal(menu[4].price, 3.80); - }); - - it("6th item correct", function () { - assert.equal(menu[5].isSoup, false); - assert.equal(menu[5].text.trim(), "Grilovaný Encián s brusnicovou omáčkou, hranolky, šalát"); - assert.equal(menu[5].price, 3.80); - }); - - it("7th item correct", function () { - assert.equal(menu[6].isSoup, false); - assert.equal(menu[6].text.trim(), "Daňovákov burger, hranolky, BBQ omáčka"); - assert.equal(menu[6].price, 5.50); - }); - }); - - describe('parsing sample 2015-08-03', function () { - - var html = fs.readFileSync(__dirname + '/samples/Danovak.2015-08-03.html', { encoding: "utf-8" }); - var menu; - - before(function (done) { - parser_zomato.parse(html, moment("2015-08-03"), function (menuItems) { - menu = menuItems; - done(); - }); - }); - - it("should return 7 items", function () { - assert.equal(menu.length, 7); - }); - - - it("1st item correct", function () { - assert.equal(menu[0].isSoup, true); - assert.equal(menu[0].text.trim(), "Maďarská gulášová"); - assert(isNaN(menu[0].price)); - }); - - it("2nd item correct", function () { - assert.equal(menu[1].isSoup, true); - assert.equal(menu[1].text.trim(), "Kuracia so zeleninou, rezance"); - assert(isNaN(menu[1].price)); - }); - - it("3rd item correct", function () { - assert.equal(menu[2].isSoup, false); - assert.equal(menu[2].text.trim(), "Kurací steak na grile s grilovanou zeleninou, ryža, šalát"); - assert.equal(menu[2].price, 3.80); - }); - - it("4th item correct", function () { - assert.equal(menu[3].isSoup, false); - assert.equal(menu[3].text.trim(), "Vyprážaný bravčový rezeň, slovenský šalát"); - assert.equal(menu[3].price, 3.80); - }); - - it("5th item correct", function () { - assert.equal(menu[4].isSoup, false); - assert.equal(menu[4].text.trim(), "Hubovo smotanové rizoto, rukola, parmezán, šalát"); - assert.equal(menu[4].price, 3.80); - }); - - it("6th item correct", function () { - assert.equal(menu[5].isSoup, false); - assert.equal(menu[5].text.trim(), "Moravský vrabec, dusená kapusta, parená knedľa"); - assert.equal(menu[5].price, 3.80); - }); - - it("7th item correct", function () { - assert.equal(menu[6].isSoup, false); - assert.equal(menu[6].text.trim(), "Pečené kura s domácou plnkou, dusená ryža, kompót"); - assert.equal(menu[6].price, 5.50); - }); - }); - - describe('parsing sample 2015-08-04', function () { - - var html = fs.readFileSync(__dirname + '/samples/Danovak.2015-08-04.html', { encoding: "utf-8" }); - var menu; - - before(function (done) { - parser_zomato.parse(html, moment("2015-08-04"), function (menuItems) { - menu = menuItems; - done(); - }); - }); - - it("should return 7 items", function () { - assert.equal(menu.length, 7); - }); - - - it("1st item correct", function () { - assert.equal(menu[0].isSoup, true); - assert.equal(menu[0].text.trim(), "Kapustová"); - assert(isNaN(menu[0].price)); - }); - - it("2nd item correct", function () { - assert.equal(menu[1].isSoup, true); - assert.equal(menu[1].text.trim(), "Hovädzi vývar so zeleninou, rezance"); - assert(isNaN(menu[1].price)); - }); - - it("3rd item correct", function () { - assert.equal(menu[2].isSoup, false); - assert.equal(menu[2].text.trim(), "Kuracie prsia plnené Camembertom a brusnicami, dusená ryža šakát"); - assert.equal(menu[2].price, 3.80); - }); - - it("4th item correct", function () { - assert.equal(menu[3].isSoup, false); - assert.equal(menu[3].text.trim(), "Bravčový černohor so syrom, opekané zemiaky, šalát"); - assert.equal(menu[3].price, 3.80); - }); - - it("5th item correct", function () { - assert.equal(menu[4].isSoup, false); - assert.equal(menu[4].text.trim(), "Zapekaná brokolica so syrom, varené zemiaky, šalát"); - assert.equal(menu[4].price, 3.80); - }); - - it("6th item correct", function () { - assert.equal(menu[5].isSoup, false); - assert.equal(menu[5].text.trim(), "Maďarský guláš, domáca žemľová knedľa"); - assert.equal(menu[5].price, 3.80); - }); - - it("7th item correct", function () { - assert.equal(menu[6].isSoup, false); - assert.equal(menu[6].text.trim(), "Grilovaný steak s bravčovej panenky na hubovej omáčke, pečené zemiaky, šalát"); - assert.equal(menu[6].price, 5.50); - }); - }); -}); \ No newline at end of file diff --git a/test/danovak2.js b/test/danovak2.js deleted file mode 100644 index e0e7e0a4..00000000 --- a/test/danovak2.js +++ /dev/null @@ -1,73 +0,0 @@ -var assert = require('assert'), - fs = require('fs'), - moment = require('moment-timezone'), - parser = require('../parsers/zomato'); - -moment.locale('sk'); - -describe('danovak2', function () { - describe('parsing sample 2015-07-29', function () { - - var html = fs.readFileSync(__dirname + '/samples/Danovak2.2015-07-29.html', { encoding: "utf-8" }); - var menu; - - before(function (done) { - parser.parse(html, moment("2015-07-29"), function (menuItems) { - menu = menuItems; - done(); - }); - }); - - it("should return 8 items", function () { - assert.equal(menu.length, 8); - }); - - it("1st item correct", function () { - assert.equal(menu[0].isSoup, true); - assert.equal(menu[0].text.trim(), "Špenátová krémová"); - assert(isNaN(menu[0].price)); - }); - - it("2nd item correct", function () { - assert.equal(menu[1].isSoup, true); - assert.equal(menu[1].text.trim(), "Hrášková s údeninou"); - assert(isNaN(menu[1].price)); - }); - - it("3rd item correct", function () { - assert.equal(menu[2].isSoup, true); - assert.equal(menu[2].text.trim(), "Domáci kurací vývar s niťovkami a zeleninou"); - assert(isNaN(menu[2].price)); - }); - - it("4th item correct", function () { - assert.equal(menu[3].isSoup, false); - assert.equal(menu[3].text.trim(), "Vyprážaný kurací Gordon Blue, zemiakové pyré, kyslá uhorka"); - assert.equal(menu[3].price, 3.80); - }); - - it("5th item correct", function () { - assert.equal(menu[4].isSoup, false); - assert.equal(menu[4].text.trim(), "Pečené bravčové karé s kosťou špikované slaninkou a cibuľkou, varené zemiaky, kyslá uhorka"); - assert.equal(menu[4].price, 3.80); - }); - - it("6th item correct", function () { - assert.equal(menu[5].isSoup, false); - assert.equal(menu[5].text.trim(), "Penne 4 druhy syra so šampiňónmi a kuracinkou"); - assert.equal(menu[5].price, 3.80); - }); - - it("7th item correct", function () { - assert.equal(menu[6].isSoup, false); - assert.equal(menu[6].text.trim(), "Vyprážané kuracie krídelka v pikant obale, dusená ryža, kyslá uhorka"); - assert.equal(menu[6].price, 3.80); - }); - - it("8th item correct", function () { - assert.equal(menu[7].isSoup, false); - assert.equal(menu[7].text.trim(), "Dusená panenka na nivovej omáčke, 1/2 dusená ryža, 1/2 hrnolky, šalát alebo koláčik, kávička"); - assert.equal(menu[7].price, 5.50); - }); - }); -}); diff --git a/test/itb.js b/test/itb.js deleted file mode 100644 index f6dddcbb..00000000 --- a/test/itb.js +++ /dev/null @@ -1,73 +0,0 @@ -var assert = require('assert'), - fs = require('fs'), - moment = require('moment-timezone'), - parser = require('../parsers/itb'); - -moment.locale('sk'); - -describe('itb', function() { - describe('parsing sample 2015-29-07', function () { - - var html = fs.readFileSync(__dirname + '/samples/ITB.2015-07-29.html', { encoding: "utf-8" }); - var menu; - - before(function (done) { - parser.parse(html, moment("2015-07-30"), function (menuItems) { - menu = menuItems; - done(); - }); - }); - - it("should return 8 items", function () { - assert.equal(menu.length, 8); - }); - - it("1st item correct", function () { - assert.equal(menu[0].isSoup, true); - assert.equal(menu[0].text, "Richtárska"); - assert.equal(menu[0].price, 1); - }); - - it("2nd item correct", function () { - assert.equal(menu[1].isSoup, true); - assert.equal(menu[1].text, "Hubová na kyslo"); - assert.equal(menu[1].price, 0.9); - }); - - it("3rd item correct", function () { - assert.equal(menu[2].isSoup, false); - assert.equal(menu[2].text, "Perkelt z hlivy ústricovej, halušky"); - assert.equal(menu[2].price, 3.2); - }); - - it("4th item correct", function () { - assert.equal(menu[3].isSoup, false); - assert.equal(menu[3].text, "Černohorský morčací rezeň, pečené zemiaky"); - assert.equal(menu[3].price, 3.2); - }); - - it("5th item correct", function () { - assert.equal(menu[4].isSoup, false); - assert.equal(menu[4].text, "Bravčové burritos v pšeničnej placke, mexická ryža"); - assert.equal(menu[4].price, 3.5); - }); - - it("6th item correct", function () { - assert.equal(menu[5].isSoup, false); - assert.equal(menu[5].text, "Grilovaný hejk, fazuľové lúsky s mrkvou"); - assert.equal(menu[5].price, 3.3); - }); - - it("7th item correct", function () { - assert.equal(menu[6].isSoup, false); - assert.equal(menu[6].text, "Maďarský hovädzí guláš, knedľa"); - assert.equal(menu[6].price, 3.5); - }); - - it("8th item correct", function () { - assert.equal(menu[7].isSoup, false); - assert.equal(menu[7].text, "Grilovaná panenka, višňová omáčka, nové zemiaky so zeleninou"); - assert.equal(menu[7].price, 4.2); - }); - }); -}); \ No newline at end of file diff --git a/test/kamenica.js b/test/kamenica.js deleted file mode 100644 index 170ab6e3..00000000 --- a/test/kamenica.js +++ /dev/null @@ -1,56 +0,0 @@ -var assert = require('assert'), - fs = require('fs'), - moment = require('moment-timezone'), - parser = require('../parsers/kamenica'); - -moment.locale('sk'); - -describe('kamenica', function() { - - describe('parsing sample 2015-07-29', function() { - - var html = fs.readFileSync(__dirname + '/samples/Kamenica.2015-07-29.html', { encoding: "utf-8" }); - var menu; - - before(function(done) { - parser.parse(html, moment("2015-07-29"), function(menuItems) { - menu = menuItems; - done(); - }); - }); - - it("should return 5 items", function() { - assert.equal(menu.length, 5); - }); - - it("1st item correct", function() { - assert.equal(menu[0].isSoup, true); - assert.equal(menu[0].text, "Cesnaková krémová"); - assert.equal(isNaN(menu[0].price), true); - }); - - it("2nd item correct", function() { - assert.equal(menu[1].isSoup, true); - assert.equal(menu[1].text.trim(), "Fazuľová s klobásou"); - assert.equal(isNaN(menu[1].price), true); - }); - - it("3rd item correct", function() { - assert.equal(menu[2].isSoup, false); - assert.equal(menu[2].text, "Kuracie prsia plnené so syrom a salámou, ryža"); - assert.equal(menu[2].price, 3.99); - }); - - it("4th item correct", function() { - assert.equal(menu[3].isSoup, false); - assert.equal(menu[3].text, "Francúzske zemiaky, kyslá uhorka"); - assert.equal(menu[3].price, 3.99); - }); - - it("5th item correct", function() { - assert.equal(menu[4].isSoup, false); - assert.equal(menu[4].text, "Vyprážaný karfiol, varené zemiaky, tatárska omáčka"); - assert.equal(menu[4].price, 3.99); - }); - }); -}); diff --git a/test/moment.js b/test/moment.js deleted file mode 100644 index d7f1f98f..00000000 --- a/test/moment.js +++ /dev/null @@ -1,12 +0,0 @@ -var assert = require('assert'), - moment = require('moment-timezone'); - -describe('Moment', function() { - describe('Should be the same day', function() { - var m = moment().tz("Europe/Bratislava"); - - it(m.toString(), function() { - assert.equal(m.format('dddd'), moment(Date.now()).tz("Europe/Bratislava").format('dddd')); - }); - }); -}); diff --git a/test/numerouno.js b/test/numerouno.js deleted file mode 100644 index bedf0451..00000000 --- a/test/numerouno.js +++ /dev/null @@ -1,43 +0,0 @@ -var assert = require('assert'), - fs = require('fs'), - moment = require('moment-timezone'), - parser = require('../parsers/numerouno'); - -moment.locale('sk'); - -describe('numerouno', function() { - describe('parsing sample 2015-07-29', function() { - - var html = fs.readFileSync(__dirname + '/samples/NumeroUno.2015-07-29.html', {encoding:"utf-8"}); - var menu; - - before(function(done) { - parser.parse(html, moment("2015-07-29"), function(menuItems) { - menu = menuItems; - done(); - }); - }); - - it("should return 3 items", function() { - assert.equal(menu.length, 3); - }); - - it("1st item correct", function() { - assert.equal(menu[0].isSoup, true); - assert.equal(menu[0].text, "Kelová polievka"); - assert.equal(isNaN(menu[0].price), true); - }); - - it("2nd item correct", function() { - assert.equal(menu[1].isSoup, false); - assert.equal(menu[1].text.trim(), "Kurací steak s bylinkovým maslom, zeleninová ryža, šalátik"); - assert.equal(menu[1].price, 4.50); - }); - - it("3rd item correct", function() { - assert.equal(menu[2].isSoup, false); - assert.equal(menu[2].text, "Slivkové gule so strúhankou preliatie horúcim maslom, cukor"); - assert.equal(menu[2].price, 4.00); - }); - }); -}); \ No newline at end of file diff --git a/test/parserUtil.js b/test/parserUtil.js deleted file mode 100644 index 1ab56341..00000000 --- a/test/parserUtil.js +++ /dev/null @@ -1,46 +0,0 @@ -var assert = require('assert'), - parserUtil = require('../parsers/parserUtil'); - -var parsePriceTests = [ - { input: "Hodnota stravy: 3,50 Eur", result: { price: 3.5, text: "Hodnota stravy: " } }, - { input: "text 3,50 € text", result: { price: 3.5, text: "text text" } }, - { input: "text text 3,50, Eur", result: { price: 3.5, text: "text text " } }, - { input: "text3.50 € text", result: { price: 3.5, text: "text text" } }, - { input: "text 3.50 Eur text", result: { price: 3.5, text: "text text" } }, - { input: "text 3.50EUR text", result: { price: 3.5, text: "text text" } }, - { input: "text3,50. € text", result: { price: 3.5, text: "text text" } }, - { input: "text 3.50 € text", result: { price: 3.5, text: "text text" } }, - { input: "text 123.45€ text", result: { price: 123.45, text: "text text" } }, - { input: "text 5€ text", result: { price: 5, text: "text text" } }, - { input: "text 5 Eur text", result: { price: 5, text: "text text" } }, - { input: "text 5. euR text", result: { price: 5, text: "text text" } }, - { input: "text 3.50 eur text", result: { price: 3.5, text: "text text" } }, - { input: "text 1eur3.50 text", result: { price: 1, text: "text 3.50 text" } } -]; - -var ocrCleanup = [ - { input: "texta' textl`", result: "textá textľ" }, - { input: "pri'prava môže trvat' 10 minu't", result: "príprava môže trvať 10 minút" }, - { input: "hlavne' jedlo", result: "hlavné jedlo" }, - { input: "duseny` po`r", result: "dusený pór" } -]; - -describe('Parser Utils', function() { - - describe('Parse price', function() { - parsePriceTests.forEach(function(item) { - it(item.input, function() { - var priced = parserUtil.parsePrice(item.input); - assert.deepEqual(priced, item.result); - }); - }); - }); - - describe('OCR cleanup', function() { - ocrCleanup.forEach(function(item) { - it(item.input, function() { - assert.equal(item.input.tidyAfterOCR(), item.result); - }); - }); - }); -}); \ No newline at end of file diff --git a/test/parserUtil.ts b/test/parserUtil.ts new file mode 100644 index 00000000..5a61e3fc --- /dev/null +++ b/test/parserUtil.ts @@ -0,0 +1,64 @@ +import assert from "assert"; +import { describe, it } from "mocha"; +import { parsePrice } from "../parsers/parserUtil.js"; + +const parsePriceTests = [ + { + input: "Hodnota stravy: 3,50 Eur", + result: { price: 3.5, text: "Hodnota stravy:" }, + }, + { input: "text 3,50 € text", result: { price: 3.5, text: "text text" } }, + { input: "text text 3,50, Eur", result: { price: 3.5, text: "text text" } }, + { input: "text3.50 € text", result: { price: 3.5, text: "text text" } }, + { input: "text 3.50 Eur text", result: { price: 3.5, text: "text text" } }, + { input: "text 3.50EUR text", result: { price: 3.5, text: "text text" } }, + { input: "text3,50. € text", result: { price: 3.5, text: "text text" } }, + { + input: "text 3.50 € text", + result: { price: 3.5, text: "text text" }, + }, + { + input: "text 123.45€ text", + result: { price: 123.45, text: "text text" }, + }, + { input: "text 5€ text", result: { price: 5, text: "text text" } }, + { input: "text 5 Eur text", result: { price: 5, text: "text text" } }, + { input: "text 5. euR text", result: { price: 5, text: "text text" } }, + { + input: "text 3.50 eur text", + result: { price: 3.5, text: "text text" }, + }, + { + input: "text 1eur3.50 text", + result: { price: 1, text: "text 3.50 text" }, + }, +]; + +const ocrCleanup = [ + { input: "texta' textl`", result: "textá textľ" }, + { + input: "pri'prava môže trvat' 10 minu't", + result: "príprava môže trvať 10 minút", + }, + { input: "hlavne' jedlo", result: "hlavné jedlo" }, + { input: "duseny` po`r", result: "dusený pór" }, +]; + +describe("Parser Utils", () => { + describe("Parse price", () => { + parsePriceTests.forEach((item) => { + it(item.input, () => { + const priced = parsePrice(item.input); + assert.deepEqual(priced, item.result); + }); + }); + }); + + describe("OCR cleanup", () => { + ocrCleanup.forEach((item) => { + it(item.input, () => { + assert.equal(item.input.tidyAfterOCR(), item.result); + }); + }); + }); +}); diff --git a/test/pizzapazza.js b/test/pizzapazza.js deleted file mode 100644 index cd3ab47f..00000000 --- a/test/pizzapazza.js +++ /dev/null @@ -1,43 +0,0 @@ -var assert = require('assert'), - fs = require('fs'), - moment = require('moment-timezone'), - parser = require('../parsers/pizzapazza'); - -moment.locale('sk'); - -describe('pizzapazza', function() { - describe('parsing sample 2015-08-01', function() { - - var html = fs.readFileSync(__dirname + '/samples/PizzaPazza.2015-08-01.html', { encoding: "utf-8" }); - var menu; - - before(function(done) { - parser.parse(html, moment("2015-08-03"), function(menuItems) { - menu = menuItems; - done(); - }); - }); - - it("should return 3 items", function() { - assert.equal(menu.length, 3); - }); - - it("1st item correct", function() { - assert.equal(menu[0].isSoup, true); - assert.equal(menu[0].text, "Talianska cícerová"); - assert.equal(isNaN(menu[0].price), true); - }); - - it("2nd item correct", function() { - assert.equal(menu[1].isSoup, false); - assert.equal(menu[1].text.trim(), "Penne Polo e Funghi - cestoviny so šampiňónmi, kuracím mäsom a parmezánom"); - assert.equal(menu[1].price, 4.00); - }); - - it("3rd item correct", function() { - assert.equal(menu[2].isSoup, false); - assert.equal(menu[2].text, "Obrátený bravčový rezeň, ryža"); - assert.equal(menu[2].price, 4.80); - }); - }); -}); \ No newline at end of file diff --git a/test/pomodoro-rosso.ts b/test/pomodoro-rosso.ts new file mode 100644 index 00000000..36531e93 --- /dev/null +++ b/test/pomodoro-rosso.ts @@ -0,0 +1,540 @@ +import assert from "assert"; +import fs from "fs"; +import { describe, it } from "mocha"; + +import { IMenuItem } from "../parsers/types.js"; +import { PomodoroRosso } from "../parsers/einpark/pomodoro-rosso.js"; + +describe("PomodoroRosso", () => { + const parser = new PomodoroRosso(); + + describe("URL factory", () => { + [ + "2025-03-17", + "2025-03-18", + "2025-03-19", + "2025-03-20", + "2025-03-21", + ].forEach((date) => { + it(`should return correct url for ${date}`, () => { + const url = parser.urlFactory(new Date(date)); + assert.equal( + url, + "https://www.pizzeriapomodororosso.sk/2025/03/16/denne-menu-17-3-2025-21-3-2025/", + ); + }); + }); + + [ + "2025-03-10", + "2025-03-11", + "2025-03-12", + "2025-03-13", + "2025-03-14", + ].forEach((date) => { + it(`should return correct url for ${date}`, () => { + const url = parser.urlFactory(new Date(date)); + assert.equal( + url, + "https://www.pizzeriapomodororosso.sk/2025/03/09/denne-menu-10-3-2025-14-3-2025/", + ); + }); + }); + }); + + describe("parsing sample 1", () => { + const html = fs.readFileSync("./test/samples/pomodoro-rosso1.html", { + encoding: "utf-8", + }); + + describe("menu for 'pondelok'", () => { + let menu: IMenuItem[]; + + before(() => { + return parser + .parse(html, new Date(2025, 2, 17)) + .then((menuItems) => { + menu = menuItems; + }); + }); + + it("should return correct number of items", () => { + assert.equal(menu.length, 4); + }); + + it("1st item correct", () => { + assert.equal(menu[0].isSoup, true); + assert.equal(menu[0].text, "Slepačí vývar s rezancami"); + assert.equal(isNaN(menu[0].price), true); + }); + + it("2nd item correct", () => { + assert.equal(menu[1].isSoup, false); + assert.equal( + menu[1].text, + "Kuracie prsia na prírodno, bylinková omáčka, ryža s kukuricou", + ); + assert.equal(menu[1].price, 7.9); + }); + + it("3rd item correct", () => { + assert.equal(menu[2].isSoup, false); + assert.equal( + menu[2].text, + "Zeleninové rizoto so syrom, mrkvový šalát", + ); + assert.equal(menu[2].price, 7.9); + }); + + it("4th item correct", () => { + assert.equal(menu[3].isSoup, false); + assert.equal( + menu[3].text, + "Poľovnícky guláš z daniela, domáca karlovarská knedľa", + ); + assert.equal(menu[3].price, 9.9); + }); + }); + + describe("menu for 'utorok'", () => { + let menu: IMenuItem[]; + + before(() => { + return parser + .parse(html, new Date(2025, 2, 18)) + .then((menuItems) => { + menu = menuItems; + }); + }); + + it("should return correct number of items", () => { + assert.equal(menu.length, 4); + }); + + it("1st item correct", () => { + assert.equal(menu[0].isSoup, true); + assert.equal(menu[0].text, "Zemiaková na kyslo"); + assert.equal(isNaN(menu[0].price), true); + }); + + it("2nd item correct", () => { + assert.equal(menu[1].isSoup, false); + assert.equal( + menu[1].text, + "Sviečková na smotane z bravčového karé, domáca knedľa", + ); + assert.equal(menu[1].price, 7.9); + }); + + it("3rd item correct", () => { + assert.equal(menu[2].isSoup, false); + assert.equal(menu[2].text, "Špenátové lasagne s mozzarellou"); + assert.equal(isNaN(menu[2].price), true); + }); + + it("4th item correct", () => { + assert.equal(menu[3].isSoup, false); + assert.equal( + menu[3].text, + "Poľovnícky guláš z daniela, domáca karlovarská knedľa", + ); + assert.equal(menu[3].price, 9.9); + }); + }); + + describe("menu for 'streda'", () => { + let menu: IMenuItem[]; + + before(() => { + return parser + .parse(html, new Date(2025, 2, 19)) + .then((menuItems) => { + menu = menuItems; + }); + }); + + it("should return correct number of items", () => { + assert.equal(menu.length, 4); + }); + + it("1st item correct", () => { + assert.equal(menu[0].isSoup, true); + assert.equal(menu[0].text, "Hŕstková"); + assert.equal(isNaN(menu[0].price), true); + }); + + it("2nd item correct", () => { + assert.equal(menu[1].isSoup, false); + assert.equal( + menu[1].text, + "Vyprážaný kurací rezeň, zemiaková kaša, miešaný šalát", + ); + assert.equal(menu[1].price, 7.9); + }); + + it("3rd item correct", () => { + assert.equal(menu[2].isSoup, false); + assert.equal( + menu[2].text, + "Zemiaková placka plnená bryndzou, smažená cibuľka", + ); + assert.equal(menu[2].price, 7.9); + }); + + it("4th item correct", () => { + assert.equal(menu[3].isSoup, false); + assert.equal( + menu[3].text, + "Poľovnícky guláš z daniela, domáca karlovarská knedľa", + ); + assert.equal(menu[3].price, 9.9); + }); + }); + + describe("menu for 'štvrtok'", () => { + let menu: IMenuItem[]; + + before(() => { + return parser + .parse(html, new Date(2025, 2, 20)) + .then((menuItems) => { + menu = menuItems; + }); + }); + + it("should return correct number of items", () => { + assert.equal(menu.length, 4); + }); + + it("1st item correct", () => { + assert.equal(menu[0].isSoup, true); + assert.equal(menu[0].text, "Šošovicová s párkom"); + assert.equal(isNaN(menu[0].price), true); + }); + + it("2nd item correct", () => { + assert.equal(menu[1].isSoup, false); + assert.equal( + menu[1].text, + "Bravčové ražniči, pečené zemiaky, čalamáda", + ); + assert.equal(menu[1].price, 7.9); + }); + + it("3rd item correct", () => { + assert.equal(menu[2].isSoup, false); + assert.equal( + menu[2].text, + "Lekvárové pirohy a šúľance s makom", + ); + assert.equal(menu[2].price, 7.9); + }); + + it("4th item correct", () => { + assert.equal(menu[3].isSoup, false); + assert.equal( + menu[3].text, + "Poľovnícky guláš z daniela, domáca karlovarská knedľa", + ); + assert.equal(menu[3].price, 9.9); + }); + }); + + describe("menu for 'piatok'", () => { + let menu: IMenuItem[]; + + before(() => { + return parser + .parse(html, new Date(2025, 2, 21)) + .then((menuItems) => { + menu = menuItems; + }); + }); + + it("should return correct number of items", () => { + assert.equal(menu.length, 4); + }); + + it("1st item correct", () => { + assert.equal(menu[0].isSoup, true); + assert.equal(menu[0].text, "Šampiňónová"); + assert.equal(isNaN(menu[0].price), true); + }); + + it("2nd item correct", () => { + assert.equal(menu[1].isSoup, false); + assert.equal(menu[1].text, "Kurací gyros s ryžou, tzatziki"); + assert.equal(menu[1].price, 7.9); + }); + + it("3rd item correct", () => { + assert.equal(menu[2].isSoup, false); + assert.equal( + menu[2].text, + "Hlivový perkelt, domáce maslové halušky", + ); + assert.equal(menu[2].price, 7.9); + }); + + it("4th item correct", () => { + assert.equal(menu[3].isSoup, false); + assert.equal( + menu[3].text, + "Poľovnícky guláš z daniela, domáca karlovarská knedľa", + ); + assert.equal(menu[3].price, 9.9); + }); + }); + }); + + describe("parsing sample 2", () => { + const html = fs.readFileSync("./test/samples/pomodoro-rosso2.html", { + encoding: "utf-8", + }); + + describe("menu for 'pondelok'", () => { + let menu: IMenuItem[]; + + before(() => { + return parser + .parse(html, new Date(2025, 2, 10)) + .then((menuItems) => { + menu = menuItems; + }); + }); + + it("should return correct number of items", () => { + assert.equal(menu.length, 4); + }); + + it("1st item correct", () => { + assert.equal(menu[0].isSoup, true); + assert.equal(menu[0].text, "Slepačí vývar s rezancami"); + assert.equal(isNaN(menu[0].price), true); + }); + + it("2nd item correct", () => { + assert.equal(menu[1].isSoup, false); + assert.equal( + menu[1].text, + "Kuracie rezance na čerstvej zelenine, jasmínová ryža", + ); + assert.equal(menu[1].price, 7.9); + }); + + it("3rd item correct", () => { + assert.equal(menu[2].isSoup, false); + assert.equal(menu[2].text, "Linguine Arabiatta"); + assert.equal(menu[2].price, 7.9); + }); + + it("4th item correct", () => { + assert.equal(menu[3].isSoup, false); + assert.equal( + menu[3].text, + "Filé z tresky v trojobale, zemiakový majonezový šalát", + ); + assert.equal(menu[3].price, 8.9); + }); + }); + + describe("menu for 'utorok'", () => { + let menu: IMenuItem[]; + + before(() => { + return parser + .parse(html, new Date(2025, 2, 11)) + .then((menuItems) => { + menu = menuItems; + }); + }); + + it("should return correct number of items", () => { + assert.equal(menu.length, 4); + }); + + it("1st item correct", () => { + assert.equal(menu[0].isSoup, true); + assert.equal(menu[0].text, "Šošovicová so zeleninou"); + assert.equal(isNaN(menu[0].price), true); + }); + + it("2nd item correct", () => { + assert.equal(menu[1].isSoup, false); + assert.equal( + menu[1].text, + "Rezníky z bravčovej panenky, zemiaková kaša, kyslá uhorka", + ); + assert.equal(menu[1].price, 7.9); + }); + + it("3rd item correct", () => { + assert.equal(menu[2].isSoup, false); + assert.equal( + menu[2].text, + "Domáce pečené buchty plnené slivkovým lekvárom a makom", + ); + assert.equal(menu[2].price, 7.9); + }); + + it("4th item correct", () => { + assert.equal(menu[3].isSoup, false); + assert.equal( + menu[3].text, + "Filé z tresky v trojobale, zemiakový majonezový šalát", + ); + assert.equal(menu[3].price, 8.9); + }); + }); + + describe("menu for 'streda'", () => { + let menu: IMenuItem[]; + + before(() => { + return parser + .parse(html, new Date(2025, 2, 12)) + .then((menuItems) => { + menu = menuItems; + }); + }); + + it("should return correct number of items", () => { + assert.equal(menu.length, 4); + }); + + it("1st item correct", () => { + assert.equal(menu[0].isSoup, true); + assert.equal( + menu[0].text, + "Zeleninová s krupicovými haluškami", + ); + assert.equal(isNaN(menu[0].price), true); + }); + + it("2nd item correct", () => { + assert.equal(menu[1].isSoup, false); + assert.equal( + menu[1].text, + "Zapečený kurací steak so sušenými paradajkami a mozzarellou, tarhoňa", + ); + assert.equal(menu[1].price, 7.9); + }); + + it("3rd item correct", () => { + assert.equal(menu[2].isSoup, false); + assert.equal( + menu[2].text, + "Vyprážané tofu v zemiakovom cestičku, zemiaková kaša, miešaný listový šalát", + ); + assert.equal(menu[2].price, 7.9); + }); + + it("4th item correct", () => { + assert.equal(menu[3].isSoup, false); + assert.equal( + menu[3].text, + "Filé z tresky v trojobale, zemiakový majonezový šalát", + ); + assert.equal(menu[3].price, 8.9); + }); + }); + + describe("menu for 'štvrtok'", () => { + let menu: IMenuItem[]; + + before(() => { + return parser + .parse(html, new Date(2025, 2, 13)) + .then((menuItems) => { + menu = menuItems; + }); + }); + + it("should return correct number of items", () => { + assert.equal(menu.length, 4); + }); + + it("1st item correct", () => { + assert.equal(menu[0].isSoup, true); + assert.equal(menu[0].text, "Brokolicý krém"); + assert.equal(isNaN(menu[0].price), true); + }); + + it("2nd item correct", () => { + assert.equal(menu[1].isSoup, false); + assert.equal( + menu[1].text, + "Pečená kuracia 1/4, ryža, cherry šalát", + ); + assert.equal(menu[1].price, 7.9); + }); + + it("3rd item correct", () => { + assert.equal(menu[2].isSoup, false); + assert.equal( + menu[2].text, + "Parmezánové krémové rizoto so špenátom", + ); + assert.equal(menu[2].price, 7.9); + }); + + it("4th item correct", () => { + assert.equal(menu[3].isSoup, false); + assert.equal( + menu[3].text, + "Filé z tresky v trojobale, zemiakový majonezový šalát", + ); + assert.equal(menu[3].price, 8.9); + }); + }); + + describe("menu for 'štvrtok'", () => { + let menu: IMenuItem[]; + + before(() => { + return parser + .parse(html, new Date(2025, 2, 14)) + .then((menuItems) => { + menu = menuItems; + }); + }); + + it("should return correct number of items", () => { + assert.equal(menu.length, 4); + }); + + it("1st item correct", () => { + assert.equal(menu[0].isSoup, true); + assert.equal(menu[0].text, "Držková s rozhlíkom"); + assert.equal(isNaN(menu[0].price), true); + }); + + it("2nd item correct", () => { + assert.equal(menu[1].isSoup, false); + assert.equal( + menu[1].text, + "Živánska v alobale, opekané zemiaky, kapustový šalát", + ); + assert.equal(menu[1].price, 7.9); + }); + + it("3rd item correct", () => { + assert.equal(menu[2].isSoup, false); + assert.equal( + menu[2].text, + "Vyprážaná cuketa v cestíčku, zemiaková kaša, bylinkový dressing", + ); + assert.equal(menu[2].price, 7.9); + }); + + it("4th item correct", () => { + assert.equal(menu[3].isSoup, false); + assert.equal( + menu[3].text, + "Filé z tresky v trojobale, zemiakový majonezový šalát", + ); + assert.equal(menu[3].price, 8.9); + }); + }); + }); +}); diff --git a/test/samples/Danovak.2015-07-29.html b/test/samples/Danovak.2015-07-29.html deleted file mode 100644 index ccfdd73f..00000000 --- a/test/samples/Danovak.2015-07-29.html +++ /dev/null @@ -1,1781 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - Reštaurácia u Daňováka Menu - Zomato Slovensko - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        - - -
        -
        -
        -
        - -
        -
        -
        - -
        - - - - -
        -
        - - - - -
        - -
        -
        -
        - -
        -
        -
        - -
        -
        -
        - - -
        -
        - - - -
        - -
        -
        -

        - - Reštaurácia u Daňováka - -

        - - - SMS - -
        -
        - -
        -
        -
        -
        -
        - 3.0
        -
        -
        - 10 hlasov
        -
        -
        -
        -
        -
        -
        -
        - -
        - -
        -
        - -
        - -
        - -
        - - - - - - - -
        - -
        -
        - -
        -
        -
        -
          -
        • -
          - - -
          - Zdieľaj na Twitteri -
        • -
        • -
          - - -
          - Zdieľaj na Facebooku -
        • -
        -
        - -
        -
        Tvoje hodnotenie
        -
        -
        -
        Hodnotenie: 3.0/5 (10 hlasy) -
        -
        - -
        - - -
        -
        -
        -
        -
        - -
        -
        -
        -
        -
        -
        - -
        -
        -
        - -
        -
        -
        -
        -
        -
        -
        -
        - - - - -
        -
        -
        -
        Telefónne číslo
        - - - +421 908980100
        - -
        -
        -
        -
        - -
        - -
        -
        -
        -
        - -
        -
        Lokalita
        - -
        - Reštaurácia u Daňováka Petržalka, Bratislava, Slovakia address -
        -
        - Ševčenkova 23, Petržalka, Bratislava V
        -
        -
        -
        - - - -
        -
        -
        -
        - - - - -
        -
        -
        -

        Foodies, ktorí pozerali na túto reštauráciu, sa pozreli aj na

        -
        - -
        - -
        -
        -
        - -
        - - -
        - -
        -
        -
        -
        -
        -
        - -
        - -
        -
        -
        - -
        - 3.0 -
        - -
        -
        -
        -
        -
        -
        - -
        - -
        -
        -
        - -
        - 2.3 -
        - -
        -
        -
        -
        -
        -
        - -
        - -
        -
        -
        - -
        - 3.2 -
        - -
        -
        -
        -
        -
        -
        -
        -

        Reštaurácie v okolí

        -
        - -
        - -
        -
        -
        - -
        - 3.3 -
        - -
        -
        -
        -
        -
        -
        - -
        - -
        -
        -
        - -
        - 3.2 -
        - -
        -
        -
        -
        -
        -
        - -
        - -
        -
        -
        - -
        - 3.2 -
        - -
        -
        -
        -
        -
        -
        - -
        - -
        -
        -
        - -
        - 4.0 -
        - -
        -
        -
        -
        -
        - - -
        -
        - -
        -
        -
        -
        -
        Stiahni si aplikáciu zadarmo
        -
        Stiahni si aplikáciu Zomato a objav skvelé reštaurácie priamo v tvojom okolí!
        -
        -
        - -
        - - -
        - -
        -
        -
        -
        -
        - Alebo vám pošleme sms stiahni link -
        - -
        -
        -
        -
        -
        - -
        -
        Zomato Spoonback
        - Click to add a blog post for Reštaurácia u Daňováka on Zomato -
        Pridaj príspevok › -
        -
        - - -
        - -
        - - - - - - - - - - - -
        - - -
        - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/samples/Danovak.2015-08-03.html b/test/samples/Danovak.2015-08-03.html deleted file mode 100644 index 686812a4..00000000 --- a/test/samples/Danovak.2015-08-03.html +++ /dev/null @@ -1,1632 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - Reštaurácia u Daňováka Menu - Zomato Slovensko - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        - - -
        -
        -
        -
        - -
        -
        -
        - -
        - - - - -
        -
        - - - - -
        - -
        -
        -
        - -
        -
        -
        - -
        -
        -
        - - -
        -
        - - - -
        - -
        -
        -

        - - Reštaurácia u Daňováka - -

        - - - SMS - -
        -
        - -
        -
        -
        -
        -
        - 3.0
        -
        -
        - 10 hlasov
        -
        -
        -
        -
        -
        -
        -
        - -
        - -
        -
        - -
        - -
        - -
        - - - - - - - -
        - -
        -
        - -
        -
        -
        -
          -
        • -
          - - -
          - Zdieľaj na Twitteri -
        • -
        • -
          - - -
          - Zdieľaj na Facebooku -
        • -
        -
        - -
        -
        Tvoje hodnotenie
        -
        -
        -
        Hodnotenie: 3.0/5 (10 hlasy) -
        -
        - -
        - - -
        -
        -
        -
        -
        - -
        -
        -
        -
        -
        -
        - -
        -
        -
        - -
        -
        -
        -
        -
        -
        -
        -
        - - - - -
        -
        -
        -
        Telefónne číslo
        - - - +421 908980100
        - -
        -
        -
        -
        - -
        - -
        -
        -
        -
        - -
        -
        Lokalita
        - -
        - Reštaurácia u Daňováka Petržalka, Bratislava, Slovakia address -
        -
        - Ševčenkova 23, Petržalka, Bratislava V
        -
        -
        -
        - - - -
        -
        -
        -
        - - - - -
        -
        -
        -

        Foodies, ktorí pozerali na túto reštauráciu, sa pozreli aj na

        -
        - -
        - -
        -
        -
        - -
        - - -
        - -
        -
        -
        -
        -
        -
        - -
        - -
        -
        -
        - -
        - 3.0 -
        - -
        -
        -
        -
        -
        -
        - -
        - -
        -
        -
        - -
        - 2.3 -
        - -
        -
        -
        -
        -
        -
        - -
        - -
        -
        -
        - -
        - 3.2 -
        - -
        -
        -
        -
        -
        -
        -
        -

        Reštaurácie v okolí

        -
        - -
        - -
        -
        -
        - -
        - 3.4 -
        - -
        -
        -
        -
        -
        -
        - -
        - -
        -
        -
        - -
        - 3.2 -
        - -
        -
        -
        -
        -
        -
        - -
        - -
        -
        -
        - -
        - 3.3 -
        - -
        -
        -
        -
        -
        -
        - -
        - -
        -
        -
        - -
        - 4.0 -
        - -
        -
        -
        -
        -
        - - -
        -
        - -
        -
        -
        -
        -
        Stiahni si aplikáciu zadarmo
        -
        Stiahni si aplikáciu Zomato a objav skvelé reštaurácie priamo v tvojom okolí!
        -
        -
        - -
        - - -
        - -
        -
        -
        -
        -
        - Alebo vám pošleme sms stiahni link -
        - -
        -
        -
        -
        -
        - -
        -
        Zomato Spoonback
        - Click to add a blog post for Reštaurácia u Daňováka on Zomato -
        Pridaj príspevok › -
        -
        - - -
        - -
        - - - - - - - - - - - -
        - - -
        - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/samples/Danovak.2015-08-04.html b/test/samples/Danovak.2015-08-04.html deleted file mode 100644 index 9c3b847d..00000000 --- a/test/samples/Danovak.2015-08-04.html +++ /dev/null @@ -1,1721 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - Reštaurácia u Daňováka Menu - Zomato Slovensko - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        - - -
        -
        -
        -
        - -
        -
        -
        - -
        - - - - -
        -
        - - - - -
        - -
        -
        -
        - -
        -
        -
        - -
        -
        -
        - - -
        -
        - - - -
        - -
        -
        -

        - - Reštaurácia u Daňováka - -

        - - - SMS - -
        -
        - -
        -
        -
        -
        -
        - 3.0
        -
        -
        - 10 hlasov
        -
        -
        -
        -
        -
        -
        -
        - -
        - -
        -
        - -
        - -
        - -
        - - - - - - - -
        - -
        -
        - -
        -
        -
        -
          -
        • -
          - - -
          - Zdieľaj na Twitteri -
        • -
        • -
          - - -
          - Zdieľaj na Facebooku -
        • -
        -
        - -
        -
        Tvoje hodnotenie
        -
        -
        -
        Hodnotenie: 3.0/5 (10 hlasy) -
        -
        - -
        - - -
        -
        -
        -
        -
        - -
        -
        -
        -
        -
        -
        - -
        -
        -
        - -
        -
        -
        -
        -
        -
        -
        -
        - - - - -
        -
        -
        -
        Telefónne číslo
        - - - +421 908980100
        - -
        -
        -
        -
        - -
        - -
        -
        -
        -
        - -
        -
        Lokalita
        - -
        - Reštaurácia u Daňováka Petržalka, Bratislava, Slovakia address -
        -
        - Ševčenkova 23, Petržalka, Bratislava V
        -
        -
        -
        - - - -
        -
        -
        -
        - - - - -
        -
        -
        -

        Foodies, ktorí pozerali na túto reštauráciu, sa pozreli aj na

        -
        - -
        - -
        -
        -
        - -
        - - -
        - -
        -
        -
        -
        -
        -
        - -
        - -
        -
        -
        - -
        - 3.0 -
        - -
        -
        -
        -
        -
        -
        - -
        - -
        -
        -
        - -
        - 2.3 -
        - -
        -
        -
        -
        -
        -
        - -
        - -
        -
        -
        - -
        - 3.2 -
        - -
        -
        -
        -
        -
        -
        -
        -

        Reštaurácie v okolí

        -
        - -
        - -
        -
        -
        - -
        - 3.4 -
        - -
        -
        -
        -
        -
        -
        - -
        - -
        -
        -
        - -
        - 3.2 -
        - -
        -
        -
        -
        -
        -
        - -
        - -
        -
        -
        - -
        - 3.3 -
        - -
        -
        -
        -
        -
        -
        - -
        - -
        -
        -
        - -
        - 4.0 -
        - -
        -
        -
        -
        -
        - - -
        -
        - -
        -
        -
        -
        -
        Stiahni si aplikáciu zadarmo
        -
        Stiahni si aplikáciu Zomato a objav skvelé reštaurácie priamo v tvojom okolí!
        -
        -
        - -
        - - -
        - -
        -
        -
        -
        -
        - Alebo vám pošleme sms stiahni link -
        - -
        -
        -
        -
        -
        - -
        -
        Zomato Spoonback
        - Click to add a blog post for Reštaurácia u Daňováka on Zomato -
        Pridaj príspevok › -
        -
        - - -
        - -
        - - - - - - - - - - - -
        - - -
        - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/samples/Danovak2.2015-07-29.html b/test/samples/Danovak2.2015-07-29.html deleted file mode 100644 index eba43d59..00000000 --- a/test/samples/Danovak2.2015-07-29.html +++ /dev/null @@ -1,2099 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - Jedáleň u Daňováka 2 Menu - Zomato Slovensko - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        - - -
        -
        -
        -
        - -
        -
        -
        - -
        - - - - -
        -
        - - - - -
        - -
        -
        -
        - -
        -
        -
        - -
        -
        -
        - - -
        -
        - - - -
        - -
        -
        -

        - - Jedáleň u Daňováka 2 - -

        - - - SMS - -
        -
        - -
        -
        -
        -
        -
        - -
        -
        -
        - Nedostatok hlasov
        -
        -
        -
        -
        -
        -
        -
        - -
        - -
        -
        - -
        - -
        - -
        - - - - - - - -
        - -
        -
        - -
        -
        -
        -
          -
        • -
          - - -
          - Zdieľaj na Twitteri -
        • -
        • -
          - - -
          - Zdieľaj na Facebooku -
        • -
        -
        - -
        -
        Tvoje hodnotenie
        -
        -
        -
        Nedostatok hlasov -
        -
        - -
        - - -
        -
        -
        -
        -
        - -
        -
        -
        -
        -
        -
        - -
        -
        -
        - -
        -
        -
        -
        -
        -
        -
        -
        - - - - -
        -
        -
        -
        Telefónne číslo
        - - - +421 917744497
        - -
        -
        -
        -
        - -
        - -
        -
        -
        -
        - -
        -
        Lokalita
        - -
        - Jedáleň u Daňováka 2 Petržalka, Bratislava, Slovakia address -
        -
        - Ševčenkova 34, Petržalka, Bratislava V
        -
        -
        -
        - - - -
        -
        -
        -
        - - - - -
        -
        -
        -

        Foodies, ktorí pozerali na túto reštauráciu, sa pozreli aj na

        -
        - -
        - -
        -
        -
        - -
        - 3.0 -
        - -
        -
        -
        -
        -
        -
        - -
        - -
        -
        -
        - -
        - 3.0 -
        - -
        -
        -
        -
        -
        -
        - -
        - -
        -
        -
        - -
        - 2.3 -
        - -
        -
        -
        -
        -
        -
        - -
        - -
        -
        -
        - -
        - 3.2 -
        - -
        -
        -
        -
        -
        -
        -
        -

        Reštaurácie v okolí

        -
        - -
        - -
        -
        -
        - -
        - 3.0 -
        - -
        -
        -
        -
        -
        -
        - -
        - -
        -
        -
        - -
        - 3.3 -
        - -
        -
        -
        -
        -
        -
        - -
        - -
        -
        -
        - -
        - 3.2 -
        - -
        -
        -
        -
        -
        -
        - -
        - -
        -
        -
        - -
        - 3.2 -
        - -
        -
        -
        -
        -
        - - -
        -
        - -
        -
        -
        -
        -
        Stiahni si aplikáciu zadarmo
        -
        Stiahni si aplikáciu Zomato a objav skvelé reštaurácie priamo v tvojom okolí!
        -
        -
        - -
        - - -
        - -
        -
        -
        -
        -
        - Alebo vám pošleme sms stiahni link -
        - -
        -
        -
        -
        -
        - -
        -
        Zomato Spoonback
        - Click to add a blog post for Jedáleň u Daňováka 2 on Zomato -
        Pridaj príspevok › -
        -
        - - -
        - -
        - - - - - - - - - - - -
        - - -
        - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/samples/ITB.2015-07-29.html b/test/samples/ITB.2015-07-29.html deleted file mode 100644 index ba1a552d..00000000 --- a/test/samples/ITB.2015-07-29.html +++ /dev/null @@ -1,732 +0,0 @@ - - - - - -CITY CANTINA - City Cantina Pluska - - - - - - -
        -
        -
          -
          -
          - - - - - - - - - - - - - - -
          -
          - Tlačiť menu - -
          -

          City Cantina Pluska - Pondelok (27.07.2015)

          - - - - - - - - -
          - - - - - -
          - - - - - - - -
          -


          City Cantina Pluska - Utorok (28.07.2015)

          - - - - - - - - -
          - - - - - -
          - - - - - - - -
          -


          City Cantina Pluska - Streda (29.07.2015)

          - - - - - - - - -
          - - - - - -
          - - - - - - - -
          -


          City Cantina Pluska - Štvrtok (30.07.2015)

          - - - - - - - - -
          - - - - - -
          - - - - - - - -
          -


          City Cantina Pluska - Piatok (31.07.2015)

          - - - - - - - - -
          - - - - - -
          - - - - - - - - -
          -
          - - - -
          - - - -
          - - - diff --git a/test/samples/Kamenica.2015-07-29.html b/test/samples/Kamenica.2015-07-29.html deleted file mode 100644 index 65567546..00000000 --- a/test/samples/Kamenica.2015-07-29.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - Obedové menu-Pizzeria Corleone - - - -
          -
          - -
          -
          - -
          -
          -
          - -
          -
          - Pizzeria Corloene- 5% zľava pri objednávke online - Pizzeria Corloene- Objednaj 2 pizze a tretiu máš za 0,70 € vrátane obalov - Pizzeria Corloene- Objednaj 2 XXL pizze a tretiu máš za 3,70 € vrátane obalov - Pizzeria Corloene- Petržalka, Staré Mesto, Nivy dovoz zdarma - Pizzeria Corloene- Akcie -
          -
          -

          OBEDOVÉ MENU

          -
          - Objednávajte telefonicky na: - 0910 628 108 -

          - Cena: 3,99 € (polievka + hlavné jedlo + obal) -
          - -
          -
          PONDELOK - 27.7
          - - - - -
          • Kelová 0,33l
          -• Špenátová 0,33l
          -• A. Zapekané kuracie prsia s broskyňou a syrom, ryža 300g
          -• B. Zapekané cestoviny so šunkou, mozzarelou a paradajkou 300g
          -• C. Vyprážaný syr, varené zemiaky, tatárska omáčka 300g
          -
          -
          -
          UTOROK - 28.7
          - - - - -
          • Gulášová 0,33l
          -• Slepačia 0,33l
          -• A. Kuracie prsia v parížskom cestíčku, zemiaková kaša, kapustový šalát 300g
          -• B. Mexické soté(klobása, fazuľa, cibuľa, hrášok), ryža 300g
          -• C. Šampiňónové rizoto so syrom 300g
          -
          -
          -
          STREDA - 29.7
          - - - - -
          • Cesnaková krémová 0,33l
          -Fazuľová s klobásou 0,33l
          -• A. Kuracie prsia plnené so syrom a salámou, ryža 300g
          -• B. Francúzske zemiaky, kyslá uhorka 300g
          -• C. Vyprážaný karfiol, varené zemiaky, tatárska omáčka 300g
          -
          -
          -
          ŠTVRTOK - 30.7
          - - - - -
          • Frankfurtská 0,33
          -• Čínska 0,33l
          -• A. Kurací rezeň, ryža s kukuricou, kapustový šalát 300g
          -• B. Bravčové na karotke, tarhoňa 300g
          -• C. Ratatouille (baklažán, cuketa, zemiak, paradajka, paprika), cesnakový dresing 300g
          -
          -
          -
          PIATOK - 31.7
          - - - - -
          • Tekvicová 0,33l
          -• Alpská 0,33l
          -• A. Kuracie stehienka barbecue, opekané zemiaky, dresing 300g
          -• B. Bravčová krkovička v horčicovej omáčke, ryža 300g
          -• C. Vyprážaný údený syr, varené zemiaky, tatárska omáčka 300g
          -
          -
          - Prajeme Vám dobrú chuť. -
          - Akcie a zľavy sa nevzťahujú na obedové menu. -
          - Váha jedál je v surovom stave. -
          -
          -
          - - -
          -
          -
          - - - - - - - - - - - - - - -
          - - Pizzeria Corleone- logo - - - Kontakt -

          - 0910 628 108 -
          0948 250 049 -
          - - Kamenica - pub & restaurant - - - -
          - Chilliweb.sk- tvorba web stránok -
          - - - -
          -
          -
          - - \ No newline at end of file diff --git a/test/samples/NumeroUno.2015-07-29.html b/test/samples/NumeroUno.2015-07-29.html deleted file mode 100644 index dae0238d..00000000 --- a/test/samples/NumeroUno.2015-07-29.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - Denné menu – NumeroUno - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          - - - - - -
          -
          - - -
          -

          Denné menu

          -
          -
          - Šalát týždňa
          - 300 g Veľký zeleninový šalát s vyprážanými syrovými nugetkami, dressing, toasty 4,00 € 1,3,7

          -

          Dezert týždňa
          - 50 g Domáci krémeš s lesným ovocím 1,10 € 1,7

          -

          Pondelok  Brokolicová letná polievka
          - 1. 350 g Kuracie Kung Pao s ryžou 4,50 €
          - 2. 350 g Vyprážané šampiňóny s varenými zemiakmi, tatárska omáčka 4,00 € 1,3,7
          - ————————————————————————————————-
          - Utorok   Kuracia polievka s domácimi maslovými haluškami 1
          - 1. 350 g Bravčový steak na horčicovej omáčke s volským okom, pečené zemiaky 4,50 € 3, 10
          - 2. 300 g Gnocchi Spinat Brokoli – zemiakové ňoky s krémovým špenátom a varenou brokolicou 4,00 € 1,7
          - ————————————————————————————————-
          - Streda  Kelová polievka
          - 1. 350 g  Kurací steak s bylinkovým maslom, zeleninová ryža, šalátik 4,50 € 7
          - 2. 300 g  Slivkové gule so strúhankou preliatie horúcim maslom, cukor  4,00 € 1,3, 7
          - ————————————————————————————————-
          - Štvrtok  Frankfurtská polievka
          - 1. 350 g Morčacie soté s tarhoňou 4,50 € 1
          - 2. 300 g Sphagetti Carbonara – špagety so šunkou a vajíčkom a la creme 4,00 € 1,7
          - ————————————————————————————————-
          - Piatok Zeleninová polievka
          - 1. 350 g Marinované kuracie stehno bez kosti s opekanými zemiakmi, barbeque dip   4,50 €
          - 2. 300 g Grilovaný/ vyprážaný encián s varenými zemiakmi, tatárska omáčka 4,00 € 1,7

          -
          -  
          -
          - Alergény sú uvedené na druhej strane
          -
          - 1. Obilniny obsahujúce lepok (t.j. pšenica, raž, jačmeň, ovos, špalda, kamut alebo ich hybridne odrody).
          -
          - 2. Kôrovce a výrobky z nich.
          -
          - 3. Vajcia a výrobky z nich.
          -
          - 4.  Ryby a výrobky z nich.
          -
          - 5.  Arašidy a výrobky z nich.
          -
          - 6.  Sójové zrná a výrobky z nich.
          -
          - 7.  Mlieko a výrobky z neho.
          -
          - 8.  Orechy, ktorými sú mandle, lieskové orechy, vlašské orechy, kešu, pekanové orechy, para orechy, pistácie, makadamové orechy a queenslandské orechy a výrobky z nich.
          -
          - 9.  Zeler a výrobky z neho.
          -
          - 10.  Horčica a výrobky z nej.
          -
          - 11.  Sezamové semená a výrobky z nich.
          -
          - 12.  Oxid siričitý a siričitany v koncentráciách vyšších ako 10 mg/kg alebo 10 mg/l.
          -
          - 13.  Vlčí bob a výrobky z neho.
          -
          - 14.  Mäkkýše a výrobky z nich.
          - - - -
          -
          - - -
          -
          - - - -
          - - - - - - - - \ No newline at end of file diff --git a/test/samples/NumeroUno.2015-08-03.html b/test/samples/NumeroUno.2015-08-03.html deleted file mode 100644 index 3eacf870..00000000 --- a/test/samples/NumeroUno.2015-08-03.html +++ /dev/null @@ -1,168 +0,0 @@ - - - - Denné menu – NumeroUno - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          - - - - - -
          -
          - - -
          -

          Denné menu

          -
          -
          - Šalát týždna 300 g 
          -
          - Zeleninový šalát s tuniakom, šalotka, vajíčko, toasty 4,00 € 1,3
          -
          -  
          -
          - Dezert týždna 100 g 
          -
          - Piškotový dezert s ovocím € 1,90 1,7 
          -
          - ——————————————–
          -

          - Pondelok Póórová polievka s vajíčkom 3

          -
          - 1. 350 g Kurací steak so slaninkou a šalviou, ryža 4,50 € 
          -
          - 2. 300 g Grilovaná zelenina s varenými zemiakmi, domáci dip 4,00 €
          -
          - 3. 300 g Sphagetti Scampi – špagety s grilovanymi krevetami, bylinky, cesnak 6,50 €

          -
          - ———————————————

          -
          - Utorok Brokolicová polievka
          -
          - 1. 350 g Domaca fašírka s paradajkovou omáčkou, zemiaková kaša 4,50 € 
          -
          - 2. 350 g Vypražaná zelenina Mix, varené zemiaky, tatárska omáčka 4,00 € 
          -
          - 3. 350 g Kurací burger s hranolkami, smotanovo-cesnakový dressing, hranolky   5,90 € 7
          -

          -
          - ———————————————-
          -
          - Streda Hovädzia polievka s haluškami 1
          -
          - 1. 350 g Morčacie rizoto so zeleninou, uhorka 4,50 €
          -
          - 2. 300 g Rizoto so zeleninou a si strúhaným syrom, uhorka 4,00 €
          -
          - 3. 300 g Parená buchta s grankom a cukrom, preliata horúcim maslom 4,00 €
          -
          - 4. 350 Bufallo Wrap – pšeničná placka s kúskami hovädzej sviečkovice, bufalo dressing, opekané zemiaky 6,50 € 
          -
          - ————————————————–
          -
          - Štvrtok Zemiaková polievka so špenátom 
          -
          - 1. 350 g Lesnícke bravčové soté so zeleninou a hríbami, maslové kolienka 4,50 € 1
          -
          - 2. 300 g Vypražaný syr s varenými zemiakmi, tatárska omáčka 4,00 € 1,3,7
          -
          - 3. 300 Risotto Prosciutto – delikátne talianske rizoto s prosciuttom, cukina, cherry paradajka, parmezán 5,50 € 7
          -
          - ————————————————–
          -
          - Piatok Cuketová polievka
          -
          - 1. 300 g Vypražaný filet z tresky v mandľovom župane, zemiaková kaša 4,50 € 1,3,4,7
          -
          - 2. 300 g Bryndzové halušky so smotanou a slaninkou 4,00 € 1,3,7
          -
          - 3. 300 g Grilovaná/Vypražaná kuracia kapsa plnená syrom, šunkou a kukuricou, s opekanými zemiakmi, tatárska omáčka 5,90 € 1,3,7
          -
          -  
          -
          - - - -
          -
          - - -
          -
          - - - -
          - - - - - - - - \ No newline at end of file diff --git a/test/samples/PizzaPazza.2015-08-01.html b/test/samples/PizzaPazza.2015-08-01.html deleted file mode 100644 index ba74e8da..00000000 --- a/test/samples/PizzaPazza.2015-08-01.html +++ /dev/null @@ -1,587 +0,0 @@ - - - - - - - - - Obedové menu | Pizzapazza - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          -
          - - - - - - - -
          - -
          - -

          -

          Denné menu

          -
          -
          -
          -
          -

          Vienna Gate

          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          -

          Týždenné menu

          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          - -
          - -
          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/test/samples/pomodoro-rosso1.html b/test/samples/pomodoro-rosso1.html new file mode 100644 index 00000000..b1fff258 --- /dev/null +++ b/test/samples/pomodoro-rosso1.html @@ -0,0 +1,447 @@ + + + + + + + + + + + + .Denné menu 17.3.2025 - 21.3.2025 - Pizzeria Pomodoro Rosso + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          +
          + +
          +
          + + Záporožská 9, Bratislava - Petržalka +
          + +
          + +
          +
          + +
          +
          + +
          +
          +
          +
          + +
          +
          +
          +

          .Denné menu 17.3.2025 – 21.3.2025

          + +
          + +
          +
          + + +

          Kuracie prsia s bylinkovou omáčkou, špenátové lasagne, bryndzová +plnená placka či poľovnícky guláš z daniela. Tento týždeň si pochutíte! +🍽️

          + + + + + + + +

          + + + +

          Pondelok 

          + + + +

          Polievka: Slepačí vývar s rezancami 

          + + + +

          1) Kuracie prsia na prírodno, bylinková omáčka, ryža s kukuricou //7,90€

          + + + +

          2) Zeleninové rizoto so syrom, mrkvový šalát //7,90€

          + + + +

          3) Poľovnícky guláš z daniela, domáca karlovarská knedľa //9,90€

          + + + +

          Utorok 

          + + + +

          Polievka: Zemiaková na kyslo 

          + + + +

          1) Sviečková na smotane z bravčového karé, domáca knedľa //7,90€

          + + + +

          2) Špenátové lasagne s mozzarellou 

          + + + +

          3) Poľovnícky guláš z daniela, domáca karlovarská knedľa //9,90€

          + + + +

          Streda 

          + + + +

          Polievka: Hŕstková

          + + + +

          1) Vyprážaný kurací rezeň, zemiaková kaša, miešaný šalát //7,90€

          + + + +

          2) Zemiaková placka plnená bryndzou, smažená cibuľka //7,90€

          + + + +

          3) Poľovnícky guláš z daniela, domáca karlovarská knedľa //9,90€

          + + + +

          Štvrtok 

          + + + +

          Polievka: Šošovicová s párkom 

          + + + +

          1) Bravčové ražniči, pečené zemiaky, čalamáda //7,90€

          + + + +

          2) Lekvárové pirohy a šúľance s makom //7,90€

          + + + +

          3) Poľovnícky guláš z daniela, domáca karlovarská knedľa //9,90€

          + + + +

          Piatok 

          + + + +

          Polievka: Šampiňónová

          + + + +

          1) Kurací gyros s ryžou, tzatziki //7,90€

          + + + +

          2) Hlivový perkelt, domáce maslové halušky //7,90€

          + + + +

          3) Poľovnícky guláš z daniela, domáca karlovarská knedľa //9,90€

          + + + +

          Cena denného menu je uvedená vrátane dennej polievky

          + + + +

          +
          + +
          +
          + + +
          +
          +
          +
          + +
          +
          + + +
          +
          + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/samples/pomodoro-rosso2.html b/test/samples/pomodoro-rosso2.html new file mode 100644 index 00000000..56b419a7 --- /dev/null +++ b/test/samples/pomodoro-rosso2.html @@ -0,0 +1,348 @@ + + + + + + + + + + + + Denné menu 10.3.2025 - 14.3.2025 - Pizzeria Pomodoro Rosso + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          +
          + +
          +
          + + Záporožská 9, Bratislava - Petržalka +
          + +
          + +
          +
          + +
          +
          + +
          +
          +
          +
          + +
          +
          +
          +

          Denné menu 10.3.2025 – 14.3.2025

          + +
          + +
          +
          + + + + + + +

          Pondelok
          Polievka: Slepačí vývar s rezancami
          1) Kuracie rezance na čerstvej zelenine, jasmínová ryža //7,90€
          2) Linguine Arabiatta //7,90€
          3) 150g. Filé z tresky v trojobale, zemiakový majonezový šalát //8,90€

          + + + +

          Utorok
          Polievka: Šošovicová so zeleninou
          1) Rezníky z bravčovej panenky, zemiaková kaša, kyslá uhorka //7,90€
          2) Domáce pečené buchty plnené slivkovým lekvárom a makom //7,90€
          3) 150g. Filé z tresky v trojobale, zemiakový majonezový šalát //8,90€

          + + + +

          Streda
          Polievka: Zeleninová s krupicovými haluškami
          1) Zapečený kurací steak so sušenými paradajkami a mozzarellou, tarhoňa //7,90€
          2) Vyprážané tofu v zemiakovom cestičku, zemiaková kaša, miešaný listový šalát //7,90€
          3) 150g. Filé z tresky v trojobale, zemiakový majonezový šalát //8,90€

          + + + +

          Štvrtok
          Polievka: Brokolicý krém
          1) Pečená kuracia 1/4, ryža, cherry šalát //7,90€
          2) Parmezánové krémové rizoto so špenátom //7,90€
          3) 150g. Filé z tresky v trojobale, zemiakový majonezový šalát //8,90€

          + + + +

          Piatok
          Polievka: Držková s rozhlíkom
          1) Živánska v alobale, opekané zemiaky, kapustový šalát //7,90€
          2) Vyprážaná cuketa v cestíčku, zemiaková kaša, bylinkový dressing //7,90€
          3) 150g. Filé z tresky v trojobale, zemiakový majonezový šalát //8,90€

          +
          + +
          +
          + + +
          +
          +
          +
          + +
          +
          + + +
          +
          + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/stringExtensions.js b/test/stringExtensions.js deleted file mode 100644 index bb009ebc..00000000 --- a/test/stringExtensions.js +++ /dev/null @@ -1,98 +0,0 @@ -var assert = require('assert'), - cache = require('../parsers/parserUtil'); - -var removeNumberingTests = [ - { input: "1.) Kurací steak s bylinkovou omáčkou, pečené zemiaky, obloha", result: "Kurací steak s bylinkovou omáčkou, pečené zemiaky, obloha" }, - { input: "Držková polievka, chlieb", result: "Držková polievka, chlieb" }, - { input: "3 .350g Zapekaná brokolica so syrom, varené zemiaky, šalát", result: "350g Zapekaná brokolica so syrom, varené zemiaky, šalát" }, - { input: " l. Sviečková na smotane", result: "Sviečková na smotane" }, - { input: "2.A 200 g Šošovicová omáčka s volským okom, chlieb € 3,50", result: "200 g Šošovicová omáčka s volským okom, chlieb € 3,50" }, - { input: "1, 150g Kuracie prsia na nivovje omáčke dusená ryža, šalát 3,80 €", result: "150g Kuracie prsia na nivovje omáčke dusená ryža, šalát 3,80 €"} - -]; - -var removeMetricsTests = [ - { input: "1. Znojemská hovädzia pečienka 64/150g, tarhoňa 190g", result: "1. Znojemská hovädzia pečienka , tarhoňa" }, - { input: "Sviečková na smotane 64/ 1 50g, knedľa 160g", result: "Sviečková na smotane , knedľa" }, - { input: "Držková polievka, chlieb", result: "Držková polievka, chlieb" }, - { input: "150g.GRILOVANÁ PANENKA, OMÁČKA Z LESNÝCH KURIATOK, PEČENÉ ZEMIAKY 4,20€", result: "GRILOVANÁ PANENKA, OMÁČKA Z LESNÝCH KURIATOK, PEČENÉ ZEMIAKY 4,20€" }, - { input: "1o0g bravčové pečené, kapusta, knedľa", result: "bravčové pečené, kapusta, knedľa" }, - { input: "1OOg bravčové pečené, kapusta, knedľa", result: "bravčové pečené, kapusta, knedľa" }, - { input: "10Og bravčové pečené, kapusta, knedľa", result: "bravčové pečené, kapusta, knedľa" }, - { input: "menu č.4 po vypredaní menu č. 1 a 2 do 13:00 h: 180 g Vyprážaný kurací rezeň s opekanými zemiakmi, tatárska omáčka", result: "menu č.4 po vypredaní menu č. 1 a 2 do 13:00 h: Vyprážaný kurací rezeň s opekanými zemiakmi, tatárska omáčka" } -]; - -var normalizeWhitespaceTests = [ - { input: "1. Znojemská hovädzia pečienka 64/150g, tarhoňa 190g", result: "1. Znojemská hovädzia pečienka 64/150g, tarhoňa 190g" }, - { input: "Držková polievka, chlieb", result: "Držková polievka, chlieb" } -]; - -var consistentWhitespaceTests = [ - { input: "text" + String.fromCharCode(160) + "text" + String.fromCharCode(160) + "text", result: "text text text" }, - { input: "text" + String.fromCharCode(160) + String.fromCharCode(32)+ "text", result: "text text" }, - { input: "text" + String.fromCharCode(32)+ "text" + String.fromCharCode(160) + "text", result: "text text text" }, - { input: String.fromCharCode(32)+ "text" + String.fromCharCode(160) , result: "text" } -]; - -var correctCommaSpacingTests = [ - { input: "Znojemská hovädzia pečienka , tarhoňa ", result: "Znojemská hovädzia pečienka, tarhoňa " }, - { input: "Držková polievka, chlieb", result: "Držková polievka, chlieb" }, - { input: "Držková polievka,chlieb", result: "Držková polievka, chlieb" }, - { input: "menu č.4 po vypredaní menu č. 1 a 2 do 13:00 h", result: "menu č. 4 po vypredaní menu č. 1 a 2 do 13:00 h" }, - { input: "text without comma", result: "text without comma"} -]; - -var capitalizeFirstLetter = [ - { input: "držková polievka, chlieb", result: "Držková polievka, chlieb" } -]; - -describe('Text extension methods', function() { - - describe('Remove item numbering', function() { - removeNumberingTests.forEach(function(item) { - it(item.input, function() { - assert.equal(item.input.removeItemNumbering(), item.result); - }); - }); - }); - - describe('Remove metrics', function() { - removeMetricsTests.forEach(function(item) { - it(item.input, function() { - assert.equal(item.input.removeMetrics(), item.result); - }); - }); - }); - - describe('Normalize whitespace', function() { - normalizeWhitespaceTests.forEach(function(item) { - it(item.input, function() { - assert.equal(item.input.normalizeWhitespace(), item.result); - }); - }); - }); - - describe('Consistent whitespace used', function() { - consistentWhitespaceTests.forEach(function(item) { - it(item.input, function() { - assert.equal(item.input.normalizeWhitespace(), item.result); - }); - }); - }); - - describe('Correct comma spacing', function() { - correctCommaSpacingTests.forEach(function(item) { - it(item.input, function() { - assert.equal(item.input.correctCommaSpacing(), item.result); - }); - }); - }); - - describe('Capitalize first letter', function() { - capitalizeFirstLetter.forEach(function(item) { - it(item.input, function() { - assert.equal(item.input.capitalizeFirstLetter(), item.result); - }); - }); - }); -}); diff --git a/test/stringExtensions.ts b/test/stringExtensions.ts new file mode 100644 index 00000000..fdfbde03 --- /dev/null +++ b/test/stringExtensions.ts @@ -0,0 +1,147 @@ +import assert from "assert"; +import { describe, it } from "mocha"; +import "../parsers/parserUtil.js"; + +const removeNumberingTests = [ + { + input: "1.) Kurací steak s bylinkovou omáčkou, pečené zemiaky, obloha", + result: "Kurací steak s bylinkovou omáčkou, pečené zemiaky, obloha", + }, + { input: "Držková polievka, chlieb", result: "Držková polievka, chlieb" }, + { + input: "3 .350g Zapekaná brokolica so syrom, varené zemiaky, šalát", + result: "350g Zapekaná brokolica so syrom, varené zemiaky, šalát", + }, + { + input: "2.A 200 g Šošovicová omáčka s volským okom, chlieb € 3,50", + result: "200 g Šošovicová omáčka s volským okom, chlieb € 3,50", + }, + { + input: "1, 150g Kuracie prsia na nivovje omáčke dusená ryža, šalát 3,80 €", + result: "150g Kuracie prsia na nivovje omáčke dusená ryža, šalát 3,80 €", + }, + { + input: "2 Viedensky rezeň, zemiaková kaša", + result: "Viedensky rezeň, zemiaková kaša", + }, + { input: "3.Bryndzova palacinka", result: "Bryndzova palacinka" }, +]; + +const removeMetricsTests = [ + { + input: "1. Znojemská hovädzia pečienka 64/150g, tarhoňa 190g", + result: "1. Znojemská hovädzia pečienka , tarhoňa", + }, + { + input: "Sviečková na smotane 64/ 1 50g, knedľa 160g", + result: "Sviečková na smotane , knedľa", + }, + { input: "Držková polievka, chlieb", result: "Držková polievka, chlieb" }, + { + input: "150g.GRILOVANÁ PANENKA, OMÁČKA Z LESNÝCH KURIATOK, PEČENÉ ZEMIAKY 4,20€", + result: "GRILOVANÁ PANENKA, OMÁČKA Z LESNÝCH KURIATOK, PEČENÉ ZEMIAKY 4,20€", + }, + { + input: "1o0g bravčové pečené, kapusta, knedľa", + result: "bravčové pečené, kapusta, knedľa", + }, + { + input: "1OOg bravčové pečené, kapusta, knedľa", + result: "bravčové pečené, kapusta, knedľa", + }, + { + input: "10Og bravčové pečené, kapusta, knedľa", + result: "bravčové pečené, kapusta, knedľa", + }, + { + input: "menu č.4 po vypredaní menu č. 1 a 2 do 13:00 h: 180 g Vyprážaný kurací rezeň s opekanými zemiakmi, tatárska omáčka", + result: "menu č.4 po vypredaní menu č. 1 a 2 do 13:00 h: Vyprážaný kurací rezeň s opekanými zemiakmi, tatárska omáčka", + }, +]; + +const normalizeWhitespaceTests = [ + { + input: "1. Znojemská hovädzia pečienka 64/150g, tarhoňa 190g", + result: "1. Znojemská hovädzia pečienka 64/150g, tarhoňa 190g", + }, + { input: "Držková polievka, chlieb", result: "Držková polievka, chlieb" }, +]; + +const consistentWhitespaceTests = [ + { + input: + "text" + + String.fromCharCode(160) + + "text" + + String.fromCharCode(160) + + "text", + result: "text text text", + }, + { + input: + "text" + + String.fromCharCode(160) + + String.fromCharCode(32) + + "text", + result: "text text", + }, + { + input: + "text" + + String.fromCharCode(32) + + "text" + + String.fromCharCode(160) + + "text", + result: "text text text", + }, + { + input: String.fromCharCode(32) + "text" + String.fromCharCode(160), + result: "text", + }, +]; + +const capitalizeFirstLetter = [ + { input: "držková polievka, chlieb", result: "Držková polievka, chlieb" }, +]; + +describe("Text extension methods", () => { + describe("Remove item numbering", () => { + removeNumberingTests.forEach((item) => { + it(item.input, () => { + assert.equal(item.input.removeItemNumbering(), item.result); + }); + }); + }); + + describe("Remove metrics", () => { + removeMetricsTests.forEach((item) => { + it(item.input, () => { + assert.equal(item.input.removeMetrics(), item.result); + }); + }); + }); + + describe("Normalize whitespace", () => { + normalizeWhitespaceTests.forEach((item) => { + it(item.input, () => { + assert.equal(item.input.normalizeWhitespace(), item.result); + }); + }); + }); + + describe("Consistent whitespace used", () => { + consistentWhitespaceTests.forEach((item) => { + it(item.input, () => { + assert.equal(item.input.normalizeWhitespace(), item.result); + }); + }); + }); + + describe("Capitalize first letter", () => { + capitalizeFirstLetter.forEach((item) => { + it(item.input, () => { + assert.equal(item.input.capitalizeFirstLetter(), item.result); + }); + }); + }); +}); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..26065deb --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "lib": [ + "es2024", + "ESNext.Array", + "ESNext.Collection", + "ESNext.Iterator" + ], + "module": "nodenext", + "target": "es2024", + "strict": true, + "skipLibCheck": true, + "moduleResolution": "node16", + "sourceMap": true, + "outDir": "dist" + } +} diff --git a/views/index.html b/views/index.html index 233a7059..d994ef13 100644 --- a/views/index.html +++ b/views/index.html @@ -1,61 +1,127 @@ - - - - - @11 - - - - - - - - - -
          -

          Denné menu

          -
          -
          -
          - Reštaurácie -
            - {{#each restaurants}}
          • - {{this.name}} -
          • {{/each}} -
          - Téma - -
          -
          -
          -
          - -
          - -
          - {{#each restaurants}} -
          -

          {{this.name}}

          - -
          - {{/each}} -
          - -
          - -
          - - © - ALL WRONGS RESERVED - - - GitHub - -
          - - - + + + + @11 + + + {{#if appInsightsConnectionString}} + + + {{/if}} + + + + + + + +
          +
          +
          +
          +
          +
          +
          +
          +
          +
          + + +
          + +
          +
          + {{#each restaurants}} + + {{/each}} +
          +
          + + + + diff --git a/views/index3.html b/views/index3.html deleted file mode 100644 index 0d792c9d..00000000 --- a/views/index3.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - @11 - - - - - - - - - - - - - -
          {{> header}}
          -
          - {{#each restaurants}} -
          -

          {{this.name}}

          -
          -
          - {{/each}} -
          -
          {{> footer}}
          - - - diff --git a/views/index4.html b/views/index4.html deleted file mode 100644 index 3dfdc6b8..00000000 --- a/views/index4.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - @11 - - - - - - - - - - - - - -
          {{> header}}
          -
          - {{#each restaurants}} -
          -

          {{this.name}}

          -
          -
          - {{/each}} -
          -
          {{> footer}}
          - - - diff --git a/views/index5.html b/views/index5.html deleted file mode 100644 index 8f3a5c9a..00000000 --- a/views/index5.html +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - @11 - - - - - - - - - - -
          - Denné menu - - - - - - -
          - -
          - -
          - -
          - -
          - -
          - - © - ALL WRONGS RESERVED - - - GitHub - -
          - - diff --git a/views/index6.html b/views/index6.html deleted file mode 100644 index 32942a6a..00000000 --- a/views/index6.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - @11 - - - - - - - - - - - - - -
          {{> header6}}
          - -
          -
          - {{#each restaurants}} -
          -

          {{this.name}}

          -
          -
          - {{/each}} -
          -
          - -
          {{> footer6}}
          - - - - diff --git a/views/partials/at11clock.html b/views/partials/at11clock.html deleted file mode 100644 index 8e011f63..00000000 --- a/views/partials/at11clock.html +++ /dev/null @@ -1,40 +0,0 @@ -
          -
          -
          -
          -
          -
          -
          - - - - \ No newline at end of file diff --git a/views/partials/footer.html b/views/partials/footer.html deleted file mode 100644 index e7e69ea2..00000000 --- a/views/partials/footer.html +++ /dev/null @@ -1,21 +0,0 @@ - - - diff --git a/views/partials/footer6.html b/views/partials/footer6.html deleted file mode 100644 index c1bcc839..00000000 --- a/views/partials/footer6.html +++ /dev/null @@ -1,24 +0,0 @@ - - - diff --git a/views/partials/header.html b/views/partials/header.html deleted file mode 100644 index 274bb0e0..00000000 --- a/views/partials/header.html +++ /dev/null @@ -1,31 +0,0 @@ - diff --git a/views/partials/header6.html b/views/partials/header6.html deleted file mode 100644 index 68adb791..00000000 --- a/views/partials/header6.html +++ /dev/null @@ -1,53 +0,0 @@ -
          - {{> at11clock}} -
          - - diff --git a/views/partials/selectrestaurants.html b/views/partials/selectrestaurants.html deleted file mode 100644 index e9f8795b..00000000 --- a/views/partials/selectrestaurants.html +++ /dev/null @@ -1,15 +0,0 @@ - diff --git a/views/partials/selectrestaurants6.html b/views/partials/selectrestaurants6.html deleted file mode 100644 index c60cbd3c..00000000 --- a/views/partials/selectrestaurants6.html +++ /dev/null @@ -1,14 +0,0 @@ -