Merge branch 'master' into coverageImprovement_helpers

This commit is contained in:
Trevor Buckner
2026-09-22 20:14:32 -04:00
committed by GitHub
7 changed files with 351 additions and 260 deletions
-1
View File
@@ -1,6 +1,5 @@
import 'core-js/es/string/to-well-formed.js'; // Polyfill for older browsers import 'core-js/es/string/to-well-formed.js'; // Polyfill for older browsers
import './homebrew.less'; import './homebrew.less';
import React from 'react';
import { BrowserRouter as Router, Routes, Route, useParams, useSearchParams } from 'react-router'; import { BrowserRouter as Router, Routes, Route, useParams, useSearchParams } from 'react-router';
import { updateLocalStorage } from './utils/updateLocalStorage/updateLocalStorageKeys.js'; import { updateLocalStorage } from './utils/updateLocalStorage/updateLocalStorageKeys.js';
+28 -14
View File
@@ -16,8 +16,9 @@ import { DEFAULT_BREW_LOAD } from '../../../../server/brewDefaults.js';
import { printCurrentBrew, fetchThemeBundle } from '@shared/helpers.js'; import { printCurrentBrew, fetchThemeBundle } from '@shared/helpers.js';
const SharePage = (props)=>{ const SharePage = (props)=>{
const { brew = DEFAULT_BREW_LOAD, disableMeta = false } = props; const { disableMeta = false } = props;
const [currentBrew, setCurrentBrew] = useState(props.brew || DEFAULT_BREW_LOAD);
const [themeBundle, setThemeBundle] = useState({}); const [themeBundle, setThemeBundle] = useState({});
const [currentBrewRendererPageNum, setCurrentBrewRendererPageNum] = useState(1); const [currentBrewRendererPageNum, setCurrentBrewRendererPageNum] = useState(1);
@@ -37,7 +38,20 @@ const SharePage = (props)=>{
useEffect(()=>{ useEffect(()=>{
document.addEventListener('keydown', handleControlKeys); document.addEventListener('keydown', handleControlKeys);
fetchThemeBundle(undefined, setThemeBundle, brew.renderer, brew.theme); fetchThemeBundle(undefined, setThemeBundle, currentBrew.renderer, currentBrew.theme);
// listen for changes in the brew version
const eventSource = new EventSource('/stream');
eventSource.addEventListener('message', (evt)=>{
const messageData = JSON.parse(evt.data);
if(messageData.eventType == 'brewUpdated'){
if(messageData.shareId == currentBrew.shareId && messageData.version != currentBrew.version) {
console.log(`brew has been updated, viewing ${currentBrew.version}, new version is ${messageData.version}`);
console.log('should fetch brew');
}
}
});
return ()=>{ return ()=>{
document.removeEventListener('keydown', handleControlKeys); document.removeEventListener('keydown', handleControlKeys);
@@ -45,13 +59,13 @@ const SharePage = (props)=>{
}, []); }, []);
const processShareId = ()=>{ const processShareId = ()=>{
return brew.googleId && !brew.stubbed ? brew.googleId + brew.shareId : brew.shareId; return currentBrew.googleId && !currentBrew.stubbed ? currentBrew.googleId + currentBrew.shareId : currentBrew.shareId;
}; };
const renderEditLink = ()=>{ const renderEditLink = ()=>{
if(!brew.editId) return null; if(!currentBrew.editId) return null;
const editLink = brew.googleId && ! brew.stubbed ? brew.googleId + brew.editId : brew.editId; const editLink = currentBrew.googleId && ! currentBrew.stubbed ? currentBrew.googleId + currentBrew.editId : currentBrew.editId;
return ( return (
<Nav.item color='orange' icon='fas fa-pencil-alt' href={`/edit/${editLink}`}> <Nav.item color='orange' icon='fas fa-pencil-alt' href={`/edit/${editLink}`}>
@@ -62,7 +76,7 @@ const SharePage = (props)=>{
const titleEl = ( const titleEl = (
<Nav.item className='brewTitle' style={disableMeta ? { cursor: 'default' } : {}}> <Nav.item className='brewTitle' style={disableMeta ? { cursor: 'default' } : {}}>
{brew.title} {currentBrew.title}
</Nav.item> </Nav.item>
); );
@@ -71,11 +85,11 @@ const SharePage = (props)=>{
<Meta name='robots' content='noindex, nofollow' /> <Meta name='robots' content='noindex, nofollow' />
<Navbar> <Navbar>
<Nav.section className='titleSection'> <Nav.section className='titleSection'>
{disableMeta ? titleEl : <MetadataNav brew={brew}>{titleEl}</MetadataNav>} {disableMeta ? titleEl : <MetadataNav brew={currentBrew}>{titleEl}</MetadataNav>}
</Nav.section> </Nav.section>
<Nav.section> <Nav.section>
{brew.shareId && ( {currentBrew.shareId && (
<> <>
<PrintNavItem /> <PrintNavItem />
<Nav.dropdown> <Nav.dropdown>
@@ -108,18 +122,18 @@ const SharePage = (props)=>{
</Nav.dropdown> </Nav.dropdown>
</> </>
)} )}
<RecentNavItem brew={brew} storageKey='view' /> <RecentNavItem brew={currentBrew} storageKey='view' />
<Account /> <Account />
</Nav.section> </Nav.section>
</Navbar> </Navbar>
<div className='content'> <div className='content'>
<BrewRenderer <BrewRenderer
text={brew.text} text={currentBrew.text}
style={brew.style} style={currentBrew.style}
lang={brew.lang} lang={currentBrew.lang}
renderer={brew.renderer} renderer={currentBrew.renderer}
theme={brew.theme} theme={currentBrew.theme}
themeBundle={themeBundle} themeBundle={themeBundle}
onPageChange={handleBrewRendererPageChange} onPageChange={handleBrewRendererPageChange}
currentBrewRendererPageNum={currentBrewRendererPageNum} currentBrewRendererPageNum={currentBrewRendererPageNum}
+265 -222
View File
@@ -10,13 +10,13 @@
"hasInstallScript": true, "hasInstallScript": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/core": "^8.0.1", "@babel/core": "^8.0.6",
"@babel/plugin-transform-runtime": "^8.0.1", "@babel/plugin-transform-runtime": "^8.0.6",
"@babel/preset-env": "^8.0.2", "@babel/preset-env": "^8.0.6",
"@babel/preset-react": "^8.0.1", "@babel/preset-react": "^8.0.1",
"@babel/runtime": "^8.0.0", "@babel/runtime": "^8.0.5",
"@codemirror/autocomplete": "^6.20.3", "@codemirror/autocomplete": "^6.20.3",
"@codemirror/commands": "^6.11.0", "@codemirror/commands": "^6.11.1",
"@codemirror/highlight": "^0.19.8", "@codemirror/highlight": "^0.19.8",
"@codemirror/lang-css": "^6.3.1", "@codemirror/lang-css": "^6.3.1",
"@codemirror/lang-javascript": "^6.2.5", "@codemirror/lang-javascript": "^6.2.5",
@@ -24,8 +24,8 @@
"@codemirror/language": "^6.12.2", "@codemirror/language": "^6.12.2",
"@codemirror/language-data": "^6.5.2", "@codemirror/language-data": "^6.5.2",
"@codemirror/search": "^6.6.0", "@codemirror/search": "^6.6.0",
"@codemirror/state": "^6.6.0", "@codemirror/state": "^6.7.5",
"@codemirror/view": "^6.43.9", "@codemirror/view": "^6.43.12",
"@dmsnell/diff-match-patch": "^1.1.0", "@dmsnell/diff-match-patch": "^1.1.0",
"@googleapis/drive": "^21.0.0", "@googleapis/drive": "^21.0.0",
"@lezer/highlight": "^1.2.3", "@lezer/highlight": "^1.2.3",
@@ -34,7 +34,7 @@
"@vitejs/plugin-react": "^6.0.5", "@vitejs/plugin-react": "^6.0.5",
"body-parser": "^2.3.0", "body-parser": "^2.3.0",
"classnames": "^2.5.1", "classnames": "^2.5.1",
"codemirror-5-themes": "^1.5.1", "codemirror-5-themes": "^1.5.3",
"cookie-parser": "^1.4.7", "cookie-parser": "^1.4.7",
"core-js": "^3.50.0", "core-js": "^3.50.0",
"cors": "^2.8.5", "cors": "^2.8.5",
@@ -42,15 +42,15 @@
"dedent": "^1.7.2", "dedent": "^1.7.2",
"express": "^5.1.0", "express": "^5.1.0",
"express-async-handler": "^1.2.0", "express-async-handler": "^1.2.0",
"express-static-gzip": "3.0.1", "express-static-gzip": "3.0.2",
"fflate": "^0.8.3", "fflate": "^0.8.3",
"fs-extra": "^11.3.5", "fs-extra": "^11.3.5",
"hash-wasm": "^4.12.0", "hash-wasm": "^4.12.0",
"hbmarkedwrapper": "^1.0.0", "hbmarkedwrapper": "^1.0.0",
"idb-keyval": "^6.2.5", "idb-keyval": "^6.2.5",
"js-yaml": "^5.3.0", "js-yaml": "^5.4.2",
"jwt-simple": "^0.5.6", "jwt-simple": "^0.5.6",
"less": "^4.8.1", "less": "^4.9.1",
"lodash": "^4.18.1", "lodash": "^4.18.1",
"marked": "15.0.12", "marked": "15.0.12",
"marked-alignment-paragraphs": "^1.0.0", "marked-alignment-paragraphs": "^1.0.0",
@@ -64,16 +64,16 @@
"marked-subsuper-text": "^1.0.4", "marked-subsuper-text": "^1.0.4",
"marked-variables": "^1.0.5", "marked-variables": "^1.0.5",
"markedLegacy": "npm:marked@^0.3.19", "markedLegacy": "npm:marked@^0.3.19",
"moment": "^2.30.1", "moment": "^2.31.0",
"mongoose": "^9.9.3", "mongoose": "^9.10.1",
"nanoid": "6.0.1", "nanoid": "6.0.1",
"nconf": "^0.13.0", "nconf": "^0.13.0",
"node": "^26.7.0", "node": "^26.9.0",
"prettier": "^3.8.1", "prettier": "^3.9.8",
"react": "^19.2.7", "react": "^19.3.0",
"react-dom": "^19.2.7", "react-dom": "^19.3.0",
"react-frame-component": "^5.3.2", "react-frame-component": "^5.3.2",
"react-router": "^8.3.0", "react-router": "^8.4.0",
"sanitize-filename": "1.6.4", "sanitize-filename": "1.6.4",
"superagent": "^10.2.1" "superagent": "^10.2.1"
}, },
@@ -135,12 +135,12 @@
} }
}, },
"node_modules/@babel/code-frame": { "node_modules/@babel/code-frame": {
"version": "8.0.0", "version": "8.0.6",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-8.0.0.tgz", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-8.0.6.tgz",
"integrity": "sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw==", "integrity": "sha512-uMHhvmDmwFiLuiozaoRYTZHqMFuu3fem/X9JY78lohAuLoh8LSGGC8JqUzo2cVuBsBxkjMZNk56CE7ock8Xxkw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/helper-validator-identifier": "^8.0.0", "@babel/helper-validator-identifier": "^8.0.6",
"js-tokens": "^10.0.0" "js-tokens": "^10.0.0"
}, },
"engines": { "engines": {
@@ -148,28 +148,28 @@
} }
}, },
"node_modules/@babel/compat-data": { "node_modules/@babel/compat-data": {
"version": "8.0.0", "version": "8.0.5",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-8.0.0.tgz", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-8.0.5.tgz",
"integrity": "sha512-DOjnob/cXOUgDOozCDeq/aK2p5y8dUIVdf6tNhEV1HQRd6I8aQ4f4fbtHRVEvb6lP3BGomrKHiS8ICAASSVQSw==", "integrity": "sha512-YLsYoQMvL8l8WrGpN3Zj7O1wK5LEBN+cQtux7BcuHyxIXve724XG+zuJ1n3U1cUweRtTzQOA4IHbuQw3N34SZw==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": "^22.18.0 || >=24.11.0" "node": "^22.18.0 || >=24.11.0"
} }
}, },
"node_modules/@babel/core": { "node_modules/@babel/core": {
"version": "8.0.1", "version": "8.0.6",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-8.0.1.tgz", "resolved": "https://registry.npmjs.org/@babel/core/-/core-8.0.6.tgz",
"integrity": "sha512-5FgxM4dLQpMJHSiVATk8foW263dVHQHBVpXYiimNECVWG01f4nFyEbQixeT6Mwvg7TayREJ2gpKl3o2RoMdnqw==", "integrity": "sha512-5zwYt1V4ji3mXKKRIAkohSJ29WepxNwxQi+7y7P5AcVPh1dcxnZBU2cfxHnPwS+u9+lZnXPsv30TQaF2xg+Tfg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/code-frame": "^8.0.0", "@babel/code-frame": "^8.0.6",
"@babel/generator": "^8.0.0", "@babel/generator": "^8.0.6",
"@babel/helper-compilation-targets": "^8.0.0", "@babel/helper-compilation-targets": "^8.0.6",
"@babel/helpers": "^8.0.0", "@babel/helpers": "^8.0.5",
"@babel/parser": "^8.0.0", "@babel/parser": "^8.0.6",
"@babel/template": "^8.0.0", "@babel/template": "^8.0.0",
"@babel/traverse": "^8.0.0", "@babel/traverse": "^8.0.6",
"@babel/types": "^8.0.0", "@babel/types": "^8.0.6",
"@types/gensync": "^1.0.5", "@types/gensync": "^1.0.5",
"convert-source-map": "^2.0.0", "convert-source-map": "^2.0.0",
"empathic": "^2.0.1", "empathic": "^2.0.1",
@@ -177,7 +177,7 @@
"import-meta-resolve": "^4.2.0", "import-meta-resolve": "^4.2.0",
"json5": "^2.2.3", "json5": "^2.2.3",
"obug": "^2.1.1", "obug": "^2.1.1",
"semver": "^7.7.3" "verkit": "^0.3.2"
}, },
"engines": { "engines": {
"node": "^22.18.0 || >=24.11.0" "node": "^22.18.0 || >=24.11.0"
@@ -188,15 +188,15 @@
} }
}, },
"node_modules/@babel/generator": { "node_modules/@babel/generator": {
"version": "8.0.0", "version": "8.0.6",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.0.tgz", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.6.tgz",
"integrity": "sha512-NT9NrVwJsbSV6Y2FSstWa71EETOnzrjkL5/wX3D2mYHtKM+qvqB1DvR4D0Setb/gDBsHzRICifwEWMO8CnTF6g==", "integrity": "sha512-/pcanjdRsonCexCuxgGD8fKnBLLzk2i9uM4kmcmGyyev2R5YDs+rafMYZ89RvaGY1mW8T7C5au0TyYaEeHBGng==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/parser": "^8.0.0", "@babel/parser": "^8.0.6",
"@babel/types": "^8.0.0", "@babel/types": "^8.0.6",
"@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/gen-mapping": "0.4.0-beta.0",
"@jridgewell/trace-mapping": "^0.3.28", "@jridgewell/trace-mapping": "^0.3.31",
"@types/jsesc": "^2.5.0", "@types/jsesc": "^2.5.0",
"jsesc": "^3.0.2" "jsesc": "^3.0.2"
}, },
@@ -204,6 +204,16 @@
"node": "^22.18.0 || >=24.11.0" "node": "^22.18.0 || >=24.11.0"
} }
}, },
"node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": {
"version": "0.4.0-beta.0",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.4.0-beta.0.tgz",
"integrity": "sha512-JdGNkbE4GlNPYQhM0L95fBQr7ctLZJ276QXQLTad4t1oSdnnCI3fDq9DW3BqYAWv8Wc3+HS+4Gsii1oPMCfz1w==",
"license": "MIT",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.6.0-beta.0",
"@jridgewell/trace-mapping": "^0.3.24"
}
},
"node_modules/@babel/helper-annotate-as-pure": { "node_modules/@babel/helper-annotate-as-pure": {
"version": "8.0.0", "version": "8.0.0",
"resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-8.0.0.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-8.0.0.tgz",
@@ -217,34 +227,34 @@
} }
}, },
"node_modules/@babel/helper-compilation-targets": { "node_modules/@babel/helper-compilation-targets": {
"version": "8.0.0", "version": "8.0.6",
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-8.0.0.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-8.0.6.tgz",
"integrity": "sha512-JwculLABZvyPvyLBpwU/E/IbH2uM3mnxNtIJpxnIfb24y1PrdVxK5Dqjle4DpgqpGRnwgC7G8IkzPdSXZrO1Ew==", "integrity": "sha512-HTrtZ4+iA0+kzdbCgvdSk1U4pEl3BvpGnlUbualCGNbrVhhQvhgBzurTUmqpWyvyHbWYWaIfdx2mOlL9LJjsew==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/compat-data": "^8.0.0", "@babel/compat-data": "^8.0.5",
"@babel/helper-validator-option": "^8.0.0", "@babel/helper-validator-option": "^8.0.0",
"browserslist": "^4.24.0", "browserslist": "^4.24.0",
"lru-cache": "^11.0.0", "flru": "1.0.2",
"semver": "^7.7.3" "verkit": "^0.3.2"
}, },
"engines": { "engines": {
"node": "^22.18.0 || >=24.11.0" "node": "^22.18.0 || >=24.11.0"
} }
}, },
"node_modules/@babel/helper-create-class-features-plugin": { "node_modules/@babel/helper-create-class-features-plugin": {
"version": "8.0.1", "version": "8.0.6",
"resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-8.0.1.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-8.0.6.tgz",
"integrity": "sha512-++t3ZktzlLmASAxIlxeXQK9Z2YwUafYGYcvGBFevqOqt16HozVHStUoQvWD09fzAZOb/uJGpUTBuGK41AJAuOA==", "integrity": "sha512-Hy7wG2Pk1LnAkFMq0CbBk789XMTYVzYGxR7tKgk+TOpZckQRME3Tdou4mMT/8DFjJFxFZ8R6UsS4DR/duBKlVA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/helper-annotate-as-pure": "^8.0.0", "@babel/helper-annotate-as-pure": "^8.0.0",
"@babel/helper-member-expression-to-functions": "^8.0.0", "@babel/helper-member-expression-to-functions": "^8.0.5",
"@babel/helper-optimise-call-expression": "^8.0.0", "@babel/helper-optimise-call-expression": "^8.0.0",
"@babel/helper-replace-supers": "^8.0.1", "@babel/helper-replace-supers": "^8.0.1",
"@babel/helper-skip-transparent-expression-wrappers": "^8.0.0", "@babel/helper-skip-transparent-expression-wrappers": "^8.0.0",
"@babel/traverse": "^8.0.0", "@babel/traverse": "^8.0.6",
"semver": "^7.7.3" "verkit": "^0.3.2"
}, },
"engines": { "engines": {
"node": "^22.18.0 || >=24.11.0" "node": "^22.18.0 || >=24.11.0"
@@ -288,22 +298,22 @@
} }
}, },
"node_modules/@babel/helper-globals": { "node_modules/@babel/helper-globals": {
"version": "8.0.0", "version": "8.0.6",
"resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-8.0.0.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-8.0.6.tgz",
"integrity": "sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw==", "integrity": "sha512-OdnA/N52LhzFpeUuVz5YGuSWjc7TPHiFmVYZbPlSgExocO2GwbxVpSni9MVs5wwW+wZ4kPuwBEBN9pIPDYz1mA==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": "^22.18.0 || >=24.11.0" "node": "^22.18.0 || >=24.11.0"
} }
}, },
"node_modules/@babel/helper-member-expression-to-functions": { "node_modules/@babel/helper-member-expression-to-functions": {
"version": "8.0.0", "version": "8.0.5",
"resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-8.0.0.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-8.0.5.tgz",
"integrity": "sha512-xkXrMbtk87Gk7+oKBVmBc6EORg/Qwx++AHESldmHkpvG8wgccdhJJFwrzqlF382Fk8wfXhJHWE/g/43QvEGNPQ==", "integrity": "sha512-GLe05QD98BkNFTkjaqeqF9QSRoHLKrrB4tpoplyQuuPrQJ72rtmkM4wvqJLX/sjZPqkbK5MUYSsuUTqdJoOVjA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/traverse": "^8.0.0", "@babel/traverse": "^8.0.5",
"@babel/types": "^8.0.0" "@babel/types": "^8.0.5"
}, },
"engines": { "engines": {
"node": "^22.18.0 || >=24.11.0" "node": "^22.18.0 || >=24.11.0"
@@ -411,18 +421,18 @@
} }
}, },
"node_modules/@babel/helper-string-parser": { "node_modules/@babel/helper-string-parser": {
"version": "8.0.0", "version": "8.0.6",
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.0.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.6.tgz",
"integrity": "sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==", "integrity": "sha512-+6HYEBnsDRZHJtUTAEfMQd0zMDqdFHS7C+5vAsEZqBUr3vEMWOWlHJ0Jz1gS8jJIlCvLsuA6ivmeoqzH936YcA==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": "^22.18.0 || >=24.11.0" "node": "^22.18.0 || >=24.11.0"
} }
}, },
"node_modules/@babel/helper-validator-identifier": { "node_modules/@babel/helper-validator-identifier": {
"version": "8.0.4", "version": "8.0.6",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.4.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.6.tgz",
"integrity": "sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg==", "integrity": "sha512-HYx0YmuchRxRSpnjvcNffnPS8DCauKNmnumIuHG3jnQAVewRA7kfJGwF13ayEpSZs7s4R/oBH4eppuXcAQd5JQ==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": "^22.18.0 || >=24.11.0" "node": "^22.18.0 || >=24.11.0"
@@ -452,25 +462,25 @@
} }
}, },
"node_modules/@babel/helpers": { "node_modules/@babel/helpers": {
"version": "8.0.0", "version": "8.0.5",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-8.0.0.tgz", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-8.0.5.tgz",
"integrity": "sha512-wfbi91pM3py96oIiJEz7qIpyXDytgr9zQC1HEWwlGNVRAEmItuU/0a41ZUKu1sJGyhhOIpc4t5vk4PYzt8wpsg==", "integrity": "sha512-fQtPOXjYOYv85PIdwotp2TJGVYOycX0PQq+l844fFAxOULtBy8BVF35GyeueX0r4KvDthqPH5xAI1clQPk/2uA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/template": "^8.0.0", "@babel/template": "^8.0.0",
"@babel/types": "^8.0.0" "@babel/types": "^8.0.5"
}, },
"engines": { "engines": {
"node": "^22.18.0 || >=24.11.0" "node": "^22.18.0 || >=24.11.0"
} }
}, },
"node_modules/@babel/parser": { "node_modules/@babel/parser": {
"version": "8.0.4", "version": "8.0.6",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.4.tgz", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.6.tgz",
"integrity": "sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g==", "integrity": "sha512-LpGDIYJAzc3Y3PT9x+FxBrGYu2PlWxLmyN7SwPTzaX0LSwEmFJBsRnPBqmaXF2r1v+Zhz6lNiEJ+7yKtM5+Ugg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/types": "^8.0.4" "@babel/types": "^8.0.6"
}, },
"bin": { "bin": {
"parser": "bin/babel-parser.js" "parser": "bin/babel-parser.js"
@@ -525,9 +535,9 @@
} }
}, },
"node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": { "node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": {
"version": "8.0.1", "version": "8.0.6",
"resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-8.0.1.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-8.0.6.tgz",
"integrity": "sha512-DmR/N+B9+4PbURFj4+zdnWj49/PFAnK2bn8+E4ZAmwn3J5QCxnbG7Ep6aRfz9M8Aw+rBro0kIJQycvzFpl4buQ==", "integrity": "sha512-vk9CzgaQGcTTBL8F0YNr7LBEka6pXP/I5KcMj0oicGXUquWSNqxiijHGQkHF+s8m910NbGMpn5mU2sFV7AQjBA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/helper-plugin-utils": "^8.0.1", "@babel/helper-plugin-utils": "^8.0.1",
@@ -603,14 +613,14 @@
} }
}, },
"node_modules/@babel/plugin-transform-async-generator-functions": { "node_modules/@babel/plugin-transform-async-generator-functions": {
"version": "8.0.1", "version": "8.0.6",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-8.0.1.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-8.0.6.tgz",
"integrity": "sha512-kqnSMF1YHBzuiQrl68675i5Ma1oljvo+SJsNEZFZVBu5BUrVIZm9KId3ui2PdtLK2sv2zM8sJnjPDfgLxQlEqQ==", "integrity": "sha512-4K13qZ2TVi9W/NHMg3y0Fguu63cPjGNZT5TpPctIUDdiuIpxo4jwvySGrPWlD6KD00exvpx6Y6l5foFEpnzDcg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/helper-plugin-utils": "^8.0.1", "@babel/helper-plugin-utils": "^8.0.1",
"@babel/helper-remap-async-to-generator": "^8.0.1", "@babel/helper-remap-async-to-generator": "^8.0.1",
"@babel/traverse": "^8.0.0" "@babel/traverse": "^8.0.6"
}, },
"engines": { "engines": {
"node": "^22.18.0 || >=24.11.0" "node": "^22.18.0 || >=24.11.0"
@@ -652,9 +662,9 @@
} }
}, },
"node_modules/@babel/plugin-transform-block-scoping": { "node_modules/@babel/plugin-transform-block-scoping": {
"version": "8.0.1", "version": "8.0.5",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-8.0.1.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-8.0.5.tgz",
"integrity": "sha512-HxiQvKsSCs2jOmMhjDrooHaZYOy6W8bqwXp/zjdgPjsNrda6tK9/CH3a/cVIeg6ge3hSS02ALqvqgIo4rTsuSg==", "integrity": "sha512-czkN3g76Ns2wMe1C0IuceKUCqCe/yJ1by0qz4h4znq74K/Ks7K2Fx6Dplq9ecS65Z3rJHxT9a/kDSF2LbEov8w==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/helper-plugin-utils": "^8.0.1" "@babel/helper-plugin-utils": "^8.0.1"
@@ -683,12 +693,12 @@
} }
}, },
"node_modules/@babel/plugin-transform-class-static-block": { "node_modules/@babel/plugin-transform-class-static-block": {
"version": "8.0.1", "version": "8.0.5",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-8.0.1.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-8.0.5.tgz",
"integrity": "sha512-NEVK+L0Le8h8tJ+IK0CGS5y9Yi1ZHxLj6M5PeanhMFuq9aSo0XI+Wtmbuyop6fTNukOm7ORNntf/kwid891vqQ==", "integrity": "sha512-hyqluKOSy6PVOoHDEb4xsjFbtOSy+FFNzHNCrAHS5T+LxS8BtZHBCIVYFAcWzhBf/wRYsYu2uEpUvRmHYeOf8A==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/helper-create-class-features-plugin": "^8.0.1", "@babel/helper-create-class-features-plugin": "^8.0.5",
"@babel/helper-plugin-utils": "^8.0.1" "@babel/helper-plugin-utils": "^8.0.1"
}, },
"engines": { "engines": {
@@ -699,17 +709,17 @@
} }
}, },
"node_modules/@babel/plugin-transform-classes": { "node_modules/@babel/plugin-transform-classes": {
"version": "8.0.1", "version": "8.0.5",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-8.0.1.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-8.0.5.tgz",
"integrity": "sha512-phwyCES8kIMAdVOFw25ztmgAvkl2G+TvUv7azUYyrlR1Qoo3eLJC/MU3MGUKFZ4BWtsJ1NTJM1lKRLzKbswg7w==", "integrity": "sha512-GKFgovQQzZfEDFxclYFDOiw/Pszxa1epcs7RasL7yyeqi6rxL61Vbqt0uSDPc2M7XXCmNZnQZaK19333v6rabA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/helper-annotate-as-pure": "^8.0.0", "@babel/helper-annotate-as-pure": "^8.0.0",
"@babel/helper-compilation-targets": "^8.0.0", "@babel/helper-compilation-targets": "^8.0.5",
"@babel/helper-globals": "^8.0.0", "@babel/helper-globals": "^8.0.0",
"@babel/helper-plugin-utils": "^8.0.1", "@babel/helper-plugin-utils": "^8.0.1",
"@babel/helper-replace-supers": "^8.0.1", "@babel/helper-replace-supers": "^8.0.1",
"@babel/traverse": "^8.0.0" "@babel/traverse": "^8.0.5"
}, },
"engines": { "engines": {
"node": "^22.18.0 || >=24.11.0" "node": "^22.18.0 || >=24.11.0"
@@ -734,9 +744,9 @@
} }
}, },
"node_modules/@babel/plugin-transform-destructuring": { "node_modules/@babel/plugin-transform-destructuring": {
"version": "8.0.1", "version": "8.0.5",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-8.0.1.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-8.0.5.tgz",
"integrity": "sha512-RtR8uLDl0QcCmqMNIkM8gmDeYZ3rS0ZH+sa+I6sfc09yFoqfp9AEPgBstq9KyfVb0lFCVSRFfJXCI70FIl5ccw==", "integrity": "sha512-evjxc5fGvpXG2WMGSalpX8IJZVumLIDgk5r5eRhvXRDqFX/GPWq1BeRfJalPCcwJfrR5A/wvegUhx9W5Nr7/mg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/helper-plugin-utils": "^8.0.1" "@babel/helper-plugin-utils": "^8.0.1"
@@ -811,13 +821,13 @@
} }
}, },
"node_modules/@babel/plugin-transform-explicit-resource-management": { "node_modules/@babel/plugin-transform-explicit-resource-management": {
"version": "8.0.1", "version": "8.0.5",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-8.0.1.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-8.0.5.tgz",
"integrity": "sha512-VzDIYwBlLCpV6mJfloRdJm8HmYnMqs7O+bGha8yfg2kP7jAdxeCw6yZBVBeaKKQUThtSU52iy+3lB7DhYsbOBA==", "integrity": "sha512-Vr20jk/ZxRGu30o0jYvcKl2Pf0tiyr8H9q2ZGxYD6yjOpv9DdP6//I85q0cSOdADZhsu/ZZoApjGVCfl4xnVJw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/helper-plugin-utils": "^8.0.1", "@babel/helper-plugin-utils": "^8.0.1",
"@babel/plugin-transform-destructuring": "^8.0.1" "@babel/plugin-transform-destructuring": "^8.0.5"
}, },
"engines": { "engines": {
"node": "^22.18.0 || >=24.11.0" "node": "^22.18.0 || >=24.11.0"
@@ -1124,9 +1134,9 @@
} }
}, },
"node_modules/@babel/plugin-transform-optional-chaining": { "node_modules/@babel/plugin-transform-optional-chaining": {
"version": "8.0.1", "version": "8.0.5",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-8.0.1.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-8.0.5.tgz",
"integrity": "sha512-WtRS1c94lZGpGHxYLXMEWeoMVcuv8nkiyr8BTs6OYZv7N3Y9xVE8nbdFIl4lDJH6aH8/pLhqAQOL69d/WI9WdA==", "integrity": "sha512-w8ouIDKdmUc2oyvBx4S/WtiQM7bMww5LGjB2A4L1+sDWZGw37XxzqOqfgHnPm+2ldINmAqrf2ekzpeJ/sS9poQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/helper-plugin-utils": "^8.0.1", "@babel/helper-plugin-utils": "^8.0.1",
@@ -1140,9 +1150,9 @@
} }
}, },
"node_modules/@babel/plugin-transform-parameters": { "node_modules/@babel/plugin-transform-parameters": {
"version": "8.0.1", "version": "8.0.5",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-8.0.1.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-8.0.5.tgz",
"integrity": "sha512-IIwRqroW0CYQwR6+3pnmu27z+H98poScWdnov8z6osumMeEsFxAFBBsDS2CFk2jFpPlGqVr89jK/HXO6i5DzxQ==", "integrity": "sha512-oXsstDkzuE+gOqBz2+e1VFqDew0KlGgd9GT4MGptmcIq3uDbxcowHRSaqMCvp3nbiZws4wTm8Phuk9ZJO3NtTg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/helper-plugin-utils": "^8.0.1" "@babel/helper-plugin-utils": "^8.0.1"
@@ -1171,13 +1181,13 @@
} }
}, },
"node_modules/@babel/plugin-transform-private-property-in-object": { "node_modules/@babel/plugin-transform-private-property-in-object": {
"version": "8.0.1", "version": "8.0.5",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-8.0.1.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-8.0.5.tgz",
"integrity": "sha512-e+yfOqSYBZaf3PARpiQkjZrpWYgmcFLhK+1tevh2CpHR1O9/36IdyPnAZusESX5nzVV/XZTDAtQBRLa8HPT5Dw==", "integrity": "sha512-OilYoElZMdD/My3fJTh0jLOPy8Y9Jfpcb9nPXG0Bpy4oRbZeeVX39P1cXKsPwnXTBZg7qEKk8TQ0lzpJvdK3yw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/helper-annotate-as-pure": "^8.0.0", "@babel/helper-annotate-as-pure": "^8.0.0",
"@babel/helper-create-class-features-plugin": "^8.0.1", "@babel/helper-create-class-features-plugin": "^8.0.5",
"@babel/helper-plugin-utils": "^8.0.1" "@babel/helper-plugin-utils": "^8.0.1"
}, },
"engines": { "engines": {
@@ -1268,9 +1278,9 @@
} }
}, },
"node_modules/@babel/plugin-transform-regenerator": { "node_modules/@babel/plugin-transform-regenerator": {
"version": "8.0.2", "version": "8.0.6",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-8.0.2.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-8.0.6.tgz",
"integrity": "sha512-aFfsjCRYducRV4dPnpsBbdRkLjboca9FVDg6HZCgy0Ahvk2ZQ/2exmCRC5qS9P6rsWwrmIheNaIM6A1j2F8KMA==", "integrity": "sha512-ky/yW+PcQfHyOhbQFNkcHOCIHXaEANYaXCucZ1MY1PdSJRjaf3AX/TMKS6nCij73YtU1bVNy7Zx5NWAJy42TQA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/helper-plugin-utils": "^8.0.1" "@babel/helper-plugin-utils": "^8.0.1"
@@ -1314,9 +1324,9 @@
} }
}, },
"node_modules/@babel/plugin-transform-runtime": { "node_modules/@babel/plugin-transform-runtime": {
"version": "8.0.1", "version": "8.0.6",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-8.0.1.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-8.0.6.tgz",
"integrity": "sha512-MPDpKBrxn+thQay3eJmUiSeHswiT7MkINb48hHkX6OzodB149PKq1kred+lpMebrDzHA+G1ekCQnlYSkyEqAOw==", "integrity": "sha512-2djup+i7z4taCN9VCJsmPNC0GT5A0FhI+S0tZwK+FRDZdaEOQUYVmfKOg/hIKhMBXjOFxEsBHvGE0Thqj71edA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/helper-module-imports": "^8.0.0", "@babel/helper-module-imports": "^8.0.0",
@@ -1345,9 +1355,9 @@
} }
}, },
"node_modules/@babel/plugin-transform-spread": { "node_modules/@babel/plugin-transform-spread": {
"version": "8.0.1", "version": "8.0.5",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-8.0.1.tgz", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-8.0.5.tgz",
"integrity": "sha512-O9Bw9FyxlSw1SlMg3S82/GKNZ0x77RPbHezotEy1JTlIM/vk6WO8jW1iF+iTiKLOXNvi+b+LZ9t77Gi+Q0FhGg==", "integrity": "sha512-thqaGFTViCmJxUPJ3IivfaGHz8eodOL7UbsZ2gMOybSi8uQFXFEoabnnILMl4ZCok0vVrKD4HKq9MJWSj5qqxw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/helper-plugin-utils": "^8.0.1", "@babel/helper-plugin-utils": "^8.0.1",
@@ -1469,36 +1479,36 @@
} }
}, },
"node_modules/@babel/preset-env": { "node_modules/@babel/preset-env": {
"version": "8.0.2", "version": "8.0.6",
"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-8.0.2.tgz", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-8.0.6.tgz",
"integrity": "sha512-CUGLn9hNBCF/eXnwdFAWERbniCcXCRvnKwLV9fegeUEIqv7YlU2MepsWMMM54GcILx5XYMnRh+JAL+K5G+mK6g==", "integrity": "sha512-Ekl110OgRBQtibBTXrXyuxhy2p7QxpzWT45cFOZCBFKBan3o8vN54sQ26GtqyTyORSNWKx0GOmIdLTTu/Y+prA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/compat-data": "^8.0.0", "@babel/compat-data": "^8.0.5",
"@babel/helper-compilation-targets": "^8.0.0", "@babel/helper-compilation-targets": "^8.0.6",
"@babel/helper-plugin-utils": "^8.0.1", "@babel/helper-plugin-utils": "^8.0.1",
"@babel/helper-validator-option": "^8.0.0", "@babel/helper-validator-option": "^8.0.0",
"@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^8.0.1", "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^8.0.1",
"@babel/plugin-bugfix-safari-class-field-initializer-scope": "^8.0.1", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^8.0.1",
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^8.0.1", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^8.0.1",
"@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": "^8.0.1", "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": "^8.0.6",
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^8.0.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^8.0.1",
"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^8.0.1", "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^8.0.1",
"@babel/plugin-transform-arrow-functions": "^8.0.1", "@babel/plugin-transform-arrow-functions": "^8.0.1",
"@babel/plugin-transform-async-generator-functions": "^8.0.1", "@babel/plugin-transform-async-generator-functions": "^8.0.6",
"@babel/plugin-transform-async-to-generator": "^8.0.1", "@babel/plugin-transform-async-to-generator": "^8.0.1",
"@babel/plugin-transform-block-scoped-functions": "^8.0.1", "@babel/plugin-transform-block-scoped-functions": "^8.0.1",
"@babel/plugin-transform-block-scoping": "^8.0.1", "@babel/plugin-transform-block-scoping": "^8.0.5",
"@babel/plugin-transform-class-properties": "^8.0.1", "@babel/plugin-transform-class-properties": "^8.0.1",
"@babel/plugin-transform-class-static-block": "^8.0.1", "@babel/plugin-transform-class-static-block": "^8.0.5",
"@babel/plugin-transform-classes": "^8.0.1", "@babel/plugin-transform-classes": "^8.0.5",
"@babel/plugin-transform-computed-properties": "^8.0.1", "@babel/plugin-transform-computed-properties": "^8.0.1",
"@babel/plugin-transform-destructuring": "^8.0.1", "@babel/plugin-transform-destructuring": "^8.0.5",
"@babel/plugin-transform-dotall-regex": "^8.0.1", "@babel/plugin-transform-dotall-regex": "^8.0.1",
"@babel/plugin-transform-duplicate-keys": "^8.0.1", "@babel/plugin-transform-duplicate-keys": "^8.0.1",
"@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^8.0.1", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^8.0.1",
"@babel/plugin-transform-dynamic-import": "^8.0.1", "@babel/plugin-transform-dynamic-import": "^8.0.1",
"@babel/plugin-transform-explicit-resource-management": "^8.0.1", "@babel/plugin-transform-explicit-resource-management": "^8.0.5",
"@babel/plugin-transform-exponentiation-operator": "^8.0.1", "@babel/plugin-transform-exponentiation-operator": "^8.0.1",
"@babel/plugin-transform-export-namespace-from": "^8.0.1", "@babel/plugin-transform-export-namespace-from": "^8.0.1",
"@babel/plugin-transform-for-of": "^8.0.1", "@babel/plugin-transform-for-of": "^8.0.1",
@@ -1518,16 +1528,16 @@
"@babel/plugin-transform-object-rest-spread": "^8.0.1", "@babel/plugin-transform-object-rest-spread": "^8.0.1",
"@babel/plugin-transform-object-super": "^8.0.1", "@babel/plugin-transform-object-super": "^8.0.1",
"@babel/plugin-transform-optional-catch-binding": "^8.0.1", "@babel/plugin-transform-optional-catch-binding": "^8.0.1",
"@babel/plugin-transform-optional-chaining": "^8.0.1", "@babel/plugin-transform-optional-chaining": "^8.0.5",
"@babel/plugin-transform-parameters": "^8.0.1", "@babel/plugin-transform-parameters": "^8.0.5",
"@babel/plugin-transform-private-methods": "^8.0.1", "@babel/plugin-transform-private-methods": "^8.0.1",
"@babel/plugin-transform-private-property-in-object": "^8.0.1", "@babel/plugin-transform-private-property-in-object": "^8.0.5",
"@babel/plugin-transform-property-literals": "^8.0.1", "@babel/plugin-transform-property-literals": "^8.0.1",
"@babel/plugin-transform-regenerator": "^8.0.2", "@babel/plugin-transform-regenerator": "^8.0.6",
"@babel/plugin-transform-regexp-modifiers": "^8.0.1", "@babel/plugin-transform-regexp-modifiers": "^8.0.1",
"@babel/plugin-transform-reserved-words": "^8.0.1", "@babel/plugin-transform-reserved-words": "^8.0.1",
"@babel/plugin-transform-shorthand-properties": "^8.0.1", "@babel/plugin-transform-shorthand-properties": "^8.0.1",
"@babel/plugin-transform-spread": "^8.0.1", "@babel/plugin-transform-spread": "^8.0.5",
"@babel/plugin-transform-sticky-regex": "^8.0.1", "@babel/plugin-transform-sticky-regex": "^8.0.1",
"@babel/plugin-transform-template-literals": "^8.0.1", "@babel/plugin-transform-template-literals": "^8.0.1",
"@babel/plugin-transform-typeof-symbol": "^8.0.1", "@babel/plugin-transform-typeof-symbol": "^8.0.1",
@@ -1538,7 +1548,7 @@
"@babel/preset-modules": "^0.2.0", "@babel/preset-modules": "^0.2.0",
"babel-plugin-polyfill-corejs3": "^1.0.0", "babel-plugin-polyfill-corejs3": "^1.0.0",
"core-js-compat": "^3.48.0", "core-js-compat": "^3.48.0",
"semver": "^7.7.3" "verkit": "^0.3.2"
}, },
"engines": { "engines": {
"node": "^22.18.0 || >=24.11.0" "node": "^22.18.0 || >=24.11.0"
@@ -1584,9 +1594,9 @@
} }
}, },
"node_modules/@babel/runtime": { "node_modules/@babel/runtime": {
"version": "8.0.0", "version": "8.0.5",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-8.0.0.tgz", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-8.0.5.tgz",
"integrity": "sha512-sL6cvO2IfkSu/iU+zs2S/w01B7A8V7suXSIKEN4hPFFdZoiPGxrj5pAG0lCaqLWiEIrjKzdznIWuaLcxPR53qw==", "integrity": "sha512-7NK+Lz3spQ52XsUGTxIEVU4jYN2/dIaX8sTxRFAUtYmttYZnVh3aehiihv+/Gb7+duMNHl2OrFcBQRyOHScxpg==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/@babel/template": { "node_modules/@babel/template": {
@@ -1604,17 +1614,17 @@
} }
}, },
"node_modules/@babel/traverse": { "node_modules/@babel/traverse": {
"version": "8.0.4", "version": "8.0.6",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.4.tgz", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.6.tgz",
"integrity": "sha512-bZnmqzGG8UZneG1lLxBoWIH0G6Gr1D846Yu4/3XnY6FhCndMR49u26nTY08u/dAxWmLWF9vGQOuC+84FfIUoeg==", "integrity": "sha512-ilYV+qLStGzSKLipJlETdvdtpK3rAuwfCmCoGKv15MU4EoeIuLkespSNoNLFGOPSciEHx9TLWtN5mv0fz5w5mQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/code-frame": "^8.0.0", "@babel/code-frame": "^8.0.6",
"@babel/generator": "^8.0.0", "@babel/generator": "^8.0.6",
"@babel/helper-globals": "^8.0.0", "@babel/helper-globals": "^8.0.6",
"@babel/parser": "^8.0.4", "@babel/parser": "^8.0.6",
"@babel/template": "^8.0.0", "@babel/template": "^8.0.0",
"@babel/types": "^8.0.4", "@babel/types": "^8.0.6",
"obug": "^2.1.1" "obug": "^2.1.1"
}, },
"engines": { "engines": {
@@ -1622,13 +1632,13 @@
} }
}, },
"node_modules/@babel/types": { "node_modules/@babel/types": {
"version": "8.0.4", "version": "8.0.6",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.4.tgz", "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.6.tgz",
"integrity": "sha512-eY+Yn3dCqTGmyiq2QRU66lA5FL8lqqqvecHt0fF3uHONIa7ToYsaCiWV8lOKqAs0Rb2SjixiKFROngnulPtt2g==", "integrity": "sha512-c+xgSWboV2pdwXP67BUWDVRHi2BO5Q3KwxyFVs7taVTY+fsK47/L51ZXQoV9rozHJDNHvJ4v4WEsI/IlxV2l2A==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/helper-string-parser": "^8.0.0", "@babel/helper-string-parser": "^8.0.6",
"@babel/helper-validator-identifier": "^8.0.4" "@babel/helper-validator-identifier": "^8.0.6"
}, },
"engines": { "engines": {
"node": "^22.18.0 || >=24.11.0" "node": "^22.18.0 || >=24.11.0"
@@ -1728,9 +1738,9 @@
} }
}, },
"node_modules/@codemirror/commands": { "node_modules/@codemirror/commands": {
"version": "6.11.0", "version": "6.11.1",
"resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.11.0.tgz", "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.11.1.tgz",
"integrity": "sha512-/K4Rl5BN0OtTiPWmJCdqODu38XnDMsDxKY5rgrPnCkutPTJf2wVbkoixLfealF5Kwse/s8P8M5jAiURiwSwnFA==", "integrity": "sha512-O/4hG3SC1YwcmQ0d2UVNDs+AsaNWd1iHVxbTeEBuqH+6bExAiPK3iS/BvpY6rZGURALv4ZD3sIgcCmRvw3ehBg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@codemirror/language": "^6.0.0", "@codemirror/language": "^6.0.0",
@@ -2180,9 +2190,9 @@
} }
}, },
"node_modules/@codemirror/state": { "node_modules/@codemirror/state": {
"version": "6.7.2", "version": "6.7.5",
"resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.7.2.tgz", "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.7.5.tgz",
"integrity": "sha512-U3RiPX62Wl/Gx4ftQ7UxLlloSfsFTQqKa+7vFBYteZGCzkp6oBqcsD7iSwniWRGobCAmDcwZSY+Six3+3ztdfg==", "integrity": "sha512-QjLbZmY1Au3JiRrDVYFLRD0BZ3SOKS9pR3yjIkd7u27YY8TFD9/Q9fhPnLV5l1mHFSo3hHU/N31vpwEJOx4owQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@marijn/find-cluster-break": "^1.0.0" "@marijn/find-cluster-break": "^1.0.0"
@@ -2196,9 +2206,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@codemirror/view": { "node_modules/@codemirror/view": {
"version": "6.43.10", "version": "6.43.12",
"resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.10.tgz", "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.12.tgz",
"integrity": "sha512-vVWLvd4fKWYN/pMcwUrg6dWeublxmSz+V+52ZjW3h64IVN9cRUYLk5Km4JDT9vifxAFfDtNOIFxKYENthcolJQ==", "integrity": "sha512-Nv0vxQ19NAqvB/c2pFzjIzFlzzJl7jmdtNkwOwGbn0Ks9mFAzibvumz7cQem5cRsFA2cEw2fg+uHZGbcHupLQQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@codemirror/state": "^6.7.0", "@codemirror/state": "^6.7.0",
@@ -3453,6 +3463,7 @@
"version": "0.3.13", "version": "0.3.13",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
"integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/sourcemap-codec": "^1.5.0",
@@ -3686,9 +3697,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@mongodb-js/saslprep": { "node_modules/@mongodb-js/saslprep": {
"version": "1.5.0", "version": "1.5.4",
"resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.5.0.tgz", "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.5.4.tgz",
"integrity": "sha512-Hk1SKJCMcCos38+vqDnZzlIo4XRj9yCGzYkjB4LcqpeXRIYfia1UWTz+VrueLxoU+uSRJzgkufxoRZg8gi52YA==", "integrity": "sha512-05UC0jQsjKAOuXQ0H9Ud9vUTJpZIg+n/FinpR30tI5I8pY2inTfPOZ5OF/cg3Ce/N9MoD1xhRCeOsJtuTbFYlw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"sparse-bitfield": "^3.0.3" "sparse-bitfield": "^3.0.3"
@@ -4124,6 +4135,12 @@
"url": "https://opencollective.com/pkgr" "url": "https://opencollective.com/pkgr"
} }
}, },
"node_modules/@remix-run/route-pattern": {
"version": "0.22.1",
"resolved": "https://registry.npmjs.org/@remix-run/route-pattern/-/route-pattern-0.22.1.tgz",
"integrity": "sha512-czdGJWh09Lapvcqt7Vb09KlrU2PhRJ8xQaI+AItTuD9aDJ5MAgxnS38lnys6Ll+6RJEqPiaUqTwIQhVLwFvv+w==",
"license": "MIT"
},
"node_modules/@rolldown/binding-android-arm-eabi": { "node_modules/@rolldown/binding-android-arm-eabi": {
"version": "1.2.6", "version": "1.2.6",
"resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.6.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.6.tgz",
@@ -6184,9 +6201,9 @@
} }
}, },
"node_modules/bson": { "node_modules/bson": {
"version": "7.3.2", "version": "7.3.3",
"resolved": "https://registry.npmjs.org/bson/-/bson-7.3.2.tgz", "resolved": "https://registry.npmjs.org/bson/-/bson-7.3.3.tgz",
"integrity": "sha512-1w0ra+ho1cuE+w8jzwgzTFIimFtCfZeCoOsvIPQg6uyFCsp8M29U7bNNf5GrFh88TXbYg1g3TyKUGpd6O7q6zA==", "integrity": "sha512-oz3LwE3qGEhTCSyhzQRLY3Bj1NLOsjFMf6tcmY5J8M+3R7EVcmoBfSHWvjUK3yXCLDUsGpIuB3aQL4nDZ1EV/g==",
"license": "Apache-2.0", "license": "Apache-2.0",
"engines": { "engines": {
"node": ">=20.19.0" "node": ">=20.19.0"
@@ -6417,11 +6434,14 @@
} }
}, },
"node_modules/codemirror-5-themes": { "node_modules/codemirror-5-themes": {
"version": "1.5.2", "version": "1.5.3",
"resolved": "https://registry.npmjs.org/codemirror-5-themes/-/codemirror-5-themes-1.5.2.tgz", "resolved": "https://registry.npmjs.org/codemirror-5-themes/-/codemirror-5-themes-1.5.3.tgz",
"integrity": "sha512-4kxGXgmGRqlwNlM+Lpq+/qWgrfkx11PmDO4tUZKoEy6RB8+xVjSeHi+YbTl2Prl7Yru6Znezs9w9GhbouXoFvQ==", "integrity": "sha512-42ng/QTsLVEpsEva5ABQaNVVm/wKoJh8dHCaEYsMJbj/JjP+iPMrGnGLjpjuvliGbhk14rnMgTPO9/GnYvutCA==",
"dependencies": { "dependencies": {
"@codemirror/view": "^6.41.1" "postcss": "^8.5.28"
},
"peerDependencies": {
"@codemirror/view": "^6.0.0"
} }
}, },
"node_modules/collect-v8-coverage": { "node_modules/collect-v8-coverage": {
@@ -7730,9 +7750,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/express-static-gzip": { "node_modules/express-static-gzip": {
"version": "3.0.1", "version": "3.0.2",
"resolved": "https://registry.npmjs.org/express-static-gzip/-/express-static-gzip-3.0.1.tgz", "resolved": "https://registry.npmjs.org/express-static-gzip/-/express-static-gzip-3.0.2.tgz",
"integrity": "sha512-LMeU/3YjFlFUa4vrPX+RoMMRW5mIpF4Iysgs6gX7A59WCY4BzyF3O28mBr4eMlWuW4DU9wVAVuVcfx29ln1N6g==", "integrity": "sha512-BCKm+rzHrIaSa0CoDs6kZqyd7zfyDPrZdY7bhTgE8YAXUp+BSrvIm1XiFGJOpSP7rApl0yyVZWn2gLZeyeAOog==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"mime-types": "^3.0.1", "mime-types": "^3.0.1",
@@ -7996,6 +8016,15 @@
"dev": true, "dev": true,
"license": "ISC" "license": "ISC"
}, },
"node_modules/flru": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/flru/-/flru-1.0.2.tgz",
"integrity": "sha512-kWyh8ADvHBFz6ua5xYOPnUroZTT/bwWfrCeL0Wj1dzG4/YOmOcfJ99W8dOVyyynJN35rZ9aCOtHChqQovV7yog==",
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/for-each": { "node_modules/for-each": {
"version": "0.3.5", "version": "0.3.5",
"resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
@@ -11060,9 +11089,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/js-yaml": { "node_modules/js-yaml": {
"version": "5.4.1", "version": "5.4.2",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-5.4.1.tgz", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-5.4.2.tgz",
"integrity": "sha512-28R/k+NAjeuf7+CKlTxWZVExJGwVVLwY06DgEnOMz2gEpfNkDcD7QvyiVPT0xy0XXhU8vHsd4Ot42OOPdJG7dQ==", "integrity": "sha512-m+aqu+LwO1O6sIopafj8HUVl5aawITwZQe/yHpMCKjaWBaA/d07B/QdMb3529REftiU+RMMHL3Vlsw3hON7vWg==",
"funding": [ "funding": [
{ {
"type": "github", "type": "github",
@@ -11252,9 +11281,9 @@
} }
}, },
"node_modules/kareem": { "node_modules/kareem": {
"version": "3.3.0", "version": "3.4.0",
"resolved": "https://registry.npmjs.org/kareem/-/kareem-3.3.0.tgz", "resolved": "https://registry.npmjs.org/kareem/-/kareem-3.4.0.tgz",
"integrity": "sha512-kpSuLD3/7RenBnjnJdOHXCKC8dTd1JzeOiJhN0necWWci6cC+qX+VuwPnMVgb+a4+KNJSfgqahpnfWaeDXCimw==", "integrity": "sha512-JAKhnR4S027v/8949QXNInRskgETCg9rFUMi1VjhGbjX+XltCAAEFcXykkSocNkom1kc66EMJfjWvhj87BDQKg==",
"license": "Apache-2.0", "license": "Apache-2.0",
"engines": { "engines": {
"node": ">=18.0.0" "node": ">=18.0.0"
@@ -11281,9 +11310,9 @@
} }
}, },
"node_modules/less": { "node_modules/less": {
"version": "4.9.0", "version": "4.9.1",
"resolved": "https://registry.npmjs.org/less/-/less-4.9.0.tgz", "resolved": "https://registry.npmjs.org/less/-/less-4.9.1.tgz",
"integrity": "sha512-umRhrCH7fCi8Uj2RcwKjJdvUORTjeWqkdKx0LbcZvjIwsAVsnIAGcxHaqowPeBFBjQuWOeC/bve0AlpFzF/+SQ==", "integrity": "sha512-orp15PfJvvNDIqJdVWzMI9Sjpjp3VTiw3sfvbB+67LlISTEn8uVT2EdYSuyl02BLvaftv6sdk9Umnxmm5rckmg==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"copy-anything": "^3.0.5", "copy-anything": "^3.0.5",
@@ -11671,6 +11700,7 @@
"version": "11.5.2", "version": "11.5.2",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz",
"integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==",
"dev": true,
"license": "BlueOak-1.0.0", "license": "BlueOak-1.0.0",
"engines": { "engines": {
"node": "20 || >=22" "node": "20 || >=22"
@@ -12008,9 +12038,9 @@
} }
}, },
"node_modules/moment": { "node_modules/moment": {
"version": "2.30.1", "version": "2.31.0",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", "resolved": "https://registry.npmjs.org/moment/-/moment-2.31.0.tgz",
"integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", "integrity": "sha512-0acOTfMiWOheYS4eoWb80yYMb/JLvVv9SHbs2PehaDzfUG0Bw855SKyk0IKTnPGa5+U2bmi3W68l1+sGLX/pvw==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": "*" "node": "*"
@@ -12064,14 +12094,14 @@
} }
}, },
"node_modules/mongoose": { "node_modules/mongoose": {
"version": "9.9.4", "version": "9.10.1",
"resolved": "https://registry.npmjs.org/mongoose/-/mongoose-9.9.4.tgz", "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-9.10.1.tgz",
"integrity": "sha512-Gc7buf0ExrOZ3t8MD8tVzTek7Qr5d+tEwj4GRFmHCtTZvpaDb38EVsXgCkYacPL9ICAftgS+FGe+dQHLRLHhcw==", "integrity": "sha512-rRIEGbM3rUgXAY554CEsgp+IxImo6D3ILUr3SJDnC2PLPNTcNe2xxYvazSLtvvTjv3A4MgqvsxCj3ViF4mHUUQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@standard-schema/spec": "^1.1.0", "@standard-schema/spec": "^1.1.0",
"kareem": "3.3.0", "kareem": "3.4.0",
"mongodb": "~7.5", "mongodb": "~7.6",
"mpath": "0.9.0", "mpath": "0.9.0",
"mquery": "6.0.0", "mquery": "6.0.0",
"ms": "2.1.3", "ms": "2.1.3",
@@ -12086,9 +12116,9 @@
} }
}, },
"node_modules/mongoose/node_modules/mongodb": { "node_modules/mongoose/node_modules/mongodb": {
"version": "7.5.0", "version": "7.6.0",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-7.5.0.tgz", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-7.6.0.tgz",
"integrity": "sha512-5FnrEDLnvp6ycUOGLNLLU33BfCx2qmp2mJjGPDwKLruYsVzXVSK5fsGpoDXvsXJwBfBsD7ebMRdawbDxC2814g==", "integrity": "sha512-WbZ6OCjYw2c53LOjfkQa+reXr7kIiOVpXXglnASFuiMtif0BvsMwHe3ClJHLm1/r7wJFwaasfFtD6iYIktB01g==",
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"@mongodb-js/saslprep": "^1.4.11", "@mongodb-js/saslprep": "^1.4.11",
@@ -12310,9 +12340,9 @@
} }
}, },
"node_modules/node": { "node_modules/node": {
"version": "26.8.1", "version": "26.9.0",
"resolved": "https://registry.npmjs.org/node/-/node-26.8.1.tgz", "resolved": "https://registry.npmjs.org/node/-/node-26.9.0.tgz",
"integrity": "sha512-nmHy6P+rwsyfiijgUmrTn6QAGCWe0YBFNDD0WdYqw64MHDzaN5MV+iW4vMV1OaUQZKpbK9OIW8mt26HkA90pMw==", "integrity": "sha512-1EXZOs7Z3pEOFcj8NuuBDRxp3jy/pOU9C9jH3q/VAgREunNMJ0t5jZedhNVernLOsj6Jf+uJLURdgNjdQRvW/Q==",
"hasInstallScript": true, "hasInstallScript": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@@ -12898,9 +12928,9 @@
} }
}, },
"node_modules/postcss": { "node_modules/postcss": {
"version": "8.5.26", "version": "8.5.28",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz",
"integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==",
"funding": [ "funding": [
{ {
"type": "opencollective", "type": "opencollective",
@@ -12917,7 +12947,7 @@
], ],
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"nanoid": "^3.3.17", "nanoid": "^3.3.18",
"picocolors": "^1.1.1", "picocolors": "^1.1.1",
"source-map-js": "^1.2.1" "source-map-js": "^1.2.1"
}, },
@@ -13026,9 +13056,9 @@
} }
}, },
"node_modules/prettier": { "node_modules/prettier": {
"version": "3.9.6", "version": "3.9.8",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.8.tgz",
"integrity": "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==", "integrity": "sha512-WRFq3Wn3WId7LLROfMLdH7xaFr2jR62wU8nLO6rQUOLOxNZUviyJQs1M0iIhLexSFy+L+w0ch66wtoO2jRjG0A==",
"license": "MIT", "license": "MIT",
"bin": { "bin": {
"prettier": "bin/prettier.cjs" "prettier": "bin/prettier.cjs"
@@ -13275,24 +13305,24 @@
} }
}, },
"node_modules/react": { "node_modules/react": {
"version": "19.2.8", "version": "19.3.0",
"resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", "resolved": "https://registry.npmjs.org/react/-/react-19.3.0.tgz",
"integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", "integrity": "sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/react-dom": { "node_modules/react-dom": {
"version": "19.2.8", "version": "19.3.0",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.3.0.tgz",
"integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", "integrity": "sha512-JDk8dgif51OjFoDE70+OT9ICyYr+69HlmihNwp1+Nsfbna3t5sIiCa9ZJktDmQ4/1b/rn26hIAR2uYXDMr5r0Q==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"scheduler": "^0.27.0" "scheduler": "^0.28.0"
}, },
"peerDependencies": { "peerDependencies": {
"react": "^19.2.8" "react": "^19.3.0"
} }
}, },
"node_modules/react-frame-component": { "node_modules/react-frame-component": {
@@ -13313,11 +13343,12 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/react-router": { "node_modules/react-router": {
"version": "8.3.1", "version": "8.4.0",
"resolved": "https://registry.npmjs.org/react-router/-/react-router-8.3.1.tgz", "resolved": "https://registry.npmjs.org/react-router/-/react-router-8.4.0.tgz",
"integrity": "sha512-TEOpiO2g0TJHEOJeRVv4amUFun9v1npCKszvcquNvzETUtJ8udV86ah5eFoHT7g26bsBvT6EiIhqulR8eDF++A==", "integrity": "sha512-JtydAkBvU9UTEe5qNC+POhu+ZBNM7rlKY2IegwXc7Idj7xfRG16x5RZrw3mju+XlqBxfvb2ky9P3jUp9WyWC1g==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@remix-run/route-pattern": "^0.22.1",
"cookie-es": "^3.1.1" "cookie-es": "^3.1.1"
}, },
"engines": { "engines": {
@@ -13782,9 +13813,9 @@
} }
}, },
"node_modules/scheduler": { "node_modules/scheduler": {
"version": "0.27.0", "version": "0.28.0",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.28.0.tgz",
"integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", "integrity": "sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/secure-keys": { "node_modules/secure-keys": {
@@ -15401,6 +15432,18 @@
"node": ">= 0.8" "node": ">= 0.8"
} }
}, },
"node_modules/verkit": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/verkit/-/verkit-0.3.2.tgz",
"integrity": "sha512-zj/ob3UsvJGN0whEAKFp53REA5X66hvffVqoCtVQAakJKnKlH+/PcOfMoFwIG/o4rElqLv/ycAFlx8ZlXUorCg==",
"license": "MIT",
"engines": {
"node": ">=18.12.0"
},
"funding": {
"url": "https://github.com/sponsors/sxzz"
}
},
"node_modules/vite": { "node_modules/vite": {
"version": "8.2.2", "version": "8.2.2",
"resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz", "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz",
+18 -18
View File
@@ -87,13 +87,13 @@
] ]
}, },
"dependencies": { "dependencies": {
"@babel/core": "^8.0.1", "@babel/core": "^8.0.6",
"@babel/plugin-transform-runtime": "^8.0.1", "@babel/plugin-transform-runtime": "^8.0.6",
"@babel/preset-env": "^8.0.2", "@babel/preset-env": "^8.0.6",
"@babel/preset-react": "^8.0.1", "@babel/preset-react": "^8.0.1",
"@babel/runtime": "^8.0.0", "@babel/runtime": "^8.0.5",
"@codemirror/autocomplete": "^6.20.3", "@codemirror/autocomplete": "^6.20.3",
"@codemirror/commands": "^6.11.0", "@codemirror/commands": "^6.11.1",
"@codemirror/highlight": "^0.19.8", "@codemirror/highlight": "^0.19.8",
"@codemirror/lang-css": "^6.3.1", "@codemirror/lang-css": "^6.3.1",
"@codemirror/lang-javascript": "^6.2.5", "@codemirror/lang-javascript": "^6.2.5",
@@ -101,8 +101,8 @@
"@codemirror/language": "^6.12.2", "@codemirror/language": "^6.12.2",
"@codemirror/language-data": "^6.5.2", "@codemirror/language-data": "^6.5.2",
"@codemirror/search": "^6.6.0", "@codemirror/search": "^6.6.0",
"@codemirror/state": "^6.6.0", "@codemirror/state": "^6.7.5",
"@codemirror/view": "^6.43.9", "@codemirror/view": "^6.43.12",
"@dmsnell/diff-match-patch": "^1.1.0", "@dmsnell/diff-match-patch": "^1.1.0",
"@googleapis/drive": "^21.0.0", "@googleapis/drive": "^21.0.0",
"@lezer/highlight": "^1.2.3", "@lezer/highlight": "^1.2.3",
@@ -111,7 +111,7 @@
"@vitejs/plugin-react": "^6.0.5", "@vitejs/plugin-react": "^6.0.5",
"body-parser": "^2.3.0", "body-parser": "^2.3.0",
"classnames": "^2.5.1", "classnames": "^2.5.1",
"codemirror-5-themes": "^1.5.1", "codemirror-5-themes": "^1.5.3",
"cookie-parser": "^1.4.7", "cookie-parser": "^1.4.7",
"core-js": "^3.50.0", "core-js": "^3.50.0",
"cors": "^2.8.5", "cors": "^2.8.5",
@@ -119,15 +119,15 @@
"dedent": "^1.7.2", "dedent": "^1.7.2",
"express": "^5.1.0", "express": "^5.1.0",
"express-async-handler": "^1.2.0", "express-async-handler": "^1.2.0",
"express-static-gzip": "3.0.1", "express-static-gzip": "3.0.2",
"fflate": "^0.8.3", "fflate": "^0.8.3",
"fs-extra": "^11.3.5", "fs-extra": "^11.3.5",
"hash-wasm": "^4.12.0", "hash-wasm": "^4.12.0",
"hbmarkedwrapper": "^1.0.0", "hbmarkedwrapper": "^1.0.0",
"idb-keyval": "^6.2.5", "idb-keyval": "^6.2.5",
"js-yaml": "^5.3.0", "js-yaml": "^5.4.2",
"jwt-simple": "^0.5.6", "jwt-simple": "^0.5.6",
"less": "^4.8.1", "less": "^4.9.1",
"lodash": "^4.18.1", "lodash": "^4.18.1",
"marked": "15.0.12", "marked": "15.0.12",
"marked-alignment-paragraphs": "^1.0.0", "marked-alignment-paragraphs": "^1.0.0",
@@ -141,16 +141,16 @@
"marked-subsuper-text": "^1.0.4", "marked-subsuper-text": "^1.0.4",
"marked-variables": "^1.0.5", "marked-variables": "^1.0.5",
"markedLegacy": "npm:marked@^0.3.19", "markedLegacy": "npm:marked@^0.3.19",
"moment": "^2.30.1", "moment": "^2.31.0",
"mongoose": "^9.9.3", "mongoose": "^9.10.1",
"nanoid": "6.0.1", "nanoid": "6.0.1",
"nconf": "^0.13.0", "nconf": "^0.13.0",
"node": "^26.7.0", "node": "^26.9.0",
"prettier": "^3.8.1", "prettier": "^3.9.8",
"react": "^19.2.7", "react": "^19.3.0",
"react-dom": "^19.2.7", "react-dom": "^19.3.0",
"react-frame-component": "^5.3.2", "react-frame-component": "^5.3.2",
"react-router": "^8.3.0", "react-router": "^8.4.0",
"sanitize-filename": "1.6.4", "sanitize-filename": "1.6.4",
"superagent": "^10.2.1" "superagent": "^10.2.1"
}, },
+26 -3
View File
@@ -1,4 +1,4 @@
/*eslint max-lines: ["warn", {"max": 500, "skipBlankLines": true, "skipComments": true}]*/ /*eslint max-lines: ["warn", {"max": 400, "skipBlankLines": true, "skipComments": true}]*/
// Set working directory to project root // Set working directory to project root
import { dirname } from 'path'; import { dirname } from 'path';
import { fileURLToPath } from 'url'; import { fileURLToPath } from 'url';
@@ -30,6 +30,8 @@ import contentNegotiation from './middleware/content-negotiation.js';
import bodyParser from 'body-parser'; import bodyParser from 'body-parser';
import cookieParser from 'cookie-parser'; import cookieParser from 'cookie-parser';
import forceSSL from './forcessl.mw.js'; import forceSSL from './forcessl.mw.js';
import Stream from './eventStreamSource.js';
import dbCheck from './middleware/dbCheck.js'; import dbCheck from './middleware/dbCheck.js';
import cors from 'cors'; import cors from 'cors';
@@ -124,10 +126,10 @@ export default async function createApp(vite) {
}; };
app.use(pageRoutes({ app.use(pageRoutes({
defaultMetaTags, defaultMetaTags,
HomebrewModel, HomebrewModel,
sanitizeBrew, sanitizeBrew,
})); }));
//Robots.txt //Robots.txt
app.get('/robots.txt', (req, res)=>{ app.get('/robots.txt', (req, res)=>{
@@ -182,6 +184,27 @@ export default async function createApp(vite) {
} }
}); });
// Create Event Stream source for pages to listen to
app.get('/stream', (req, res)=>{
res.writeHead(200, {
'Content-Type' : 'text/event-stream',
'Cache-Control' : 'no-cache',
'Connection' : 'keep-alive',
'Content-Encoding' : 'none'
});
Stream.on('sendUpdate', (event, data)=>{
console.log('Event:', event, '\nData:', data);
res.write(`data: ${JSON.stringify({ ...data, eventType: event })}\n\n`);
});
});
// After Stream starts, send initStream event
setTimeout(()=>{
Stream.emit('sendUpdate', 'initStream', { time: new Date });
}, 1000);
// Local only // Local only
if(isLocalEnvironment){ if(isLocalEnvironment){
// Login // Login
+9
View File
@@ -0,0 +1,9 @@
import { EventEmitter } from 'events';
const Stream = new EventEmitter;
export default {
emit : function(event) {return Stream.emit(event, ...([...arguments].slice(1)));}, // Arguments doesn't work for arrow functions
on : (event, listener)=>{return Stream.on(event, listener);},
off : (event, listener)=>{return Stream.off(event, listener);}
};
+5 -2
View File
@@ -21,6 +21,8 @@ const router = express.Router();
import { DEFAULT_BREW, DEFAULT_BREW_LOAD } from './brewDefaults.js'; import { DEFAULT_BREW, DEFAULT_BREW_LOAD } from './brewDefaults.js';
import Themes from '../themes/themes.json' with { type: 'json' }; import Themes from '../themes/themes.json' with { type: 'json' };
import Stream from './eventStreamSource.js';
const isStaticTheme = (renderer, themeName)=>{ const isStaticTheme = (renderer, themeName)=>{
return Themes[renderer]?.[themeName] !== undefined; return Themes[renderer]?.[themeName] !== undefined;
}; };
@@ -168,8 +170,7 @@ const api = {
const googleBrew = await GoogleActions.getGoogleBrew(oAuth2Client, googleId, id, accessType) const googleBrew = await GoogleActions.getGoogleBrew(oAuth2Client, googleId, id, accessType)
.catch((googleError)=>{ .catch((googleError)=>{
const reason = googleError.errors?.[0].reason; if(googleError.code === 404 || googleError.status === 404)
if(reason == 'notFound')
throw { ...googleError, HBErrorCode: '02', authors: stub?.authors, account: req.account?.username }; throw { ...googleError, HBErrorCode: '02', authors: stub?.authors, account: req.account?.username };
else else
throw { ...googleError, HBErrorCode: '01' }; throw { ...googleError, HBErrorCode: '01' };
@@ -501,6 +502,8 @@ const api = {
saved.textBin = undefined; // Remove textBin from the saved object to save bandwidth saved.textBin = undefined; // Remove textBin from the saved object to save bandwidth
Stream.emit('sendUpdate', 'brewUpdated', { time: new Date, shareId: brew.shareId, version: brew.version });
res.status(200).send(saved); res.status(200).send(saved);
}, },
deleteGoogleBrew : async (account, id, editId, res)=>{ deleteGoogleBrew : async (account, id, editId, res)=>{