From 8658a142004d77e49fec108993af0aca6bab3507 Mon Sep 17 00:00:00 2001 From: Eric Woodward Date: Tue, 12 May 2026 23:43:26 -0400 Subject: [PATCH] Move plugins to express-twtkpr-core-plugins package Add plugin structure Fix stale cache after posting Update to v0.9.0 --- .yarnrc.yml | 4 +- README.md | 49 +- dist/package.json | 33 +- dist/src/client/script.js | 261 ++-- dist/src/client/styles.css | 31 +- dist/src/expressPlugin.d.ts | 3 + dist/src/expressPlugin.js | 58 + dist/src/expressPlugin.js.map | 1 + dist/src/index.d.ts | 4 +- dist/src/index.js | 3 +- dist/src/index.js.map | 2 +- dist/src/lib/constants.d.ts | 5 +- dist/src/lib/constants.js | 5 +- dist/src/lib/constants.js.map | 2 +- dist/src/lib/env.d.ts | 1 + dist/src/lib/env.js | 4 +- dist/src/lib/env.js.map | 2 +- dist/src/lib/getConfiguration.js | 28 +- dist/src/lib/getConfiguration.js.map | 2 +- dist/src/lib/twtxtCache.d.ts | 3 +- dist/src/lib/twtxtCache.js | 23 +- dist/src/lib/twtxtCache.js.map | 2 +- dist/src/lib/utils.d.ts | 8 + dist/src/lib/utils.js | 41 + dist/src/lib/utils.js.map | 2 +- dist/src/middlewares/postHandler/index.d.ts | 3 +- dist/src/middlewares/postHandler/index.js | 3 +- dist/src/middlewares/postHandler/index.js.map | 2 +- .../middlewares/postHandler/memoryCache.d.ts | 3 +- .../middlewares/postHandler/memoryCache.js | 6 +- .../postHandler/memoryCache.js.map | 2 +- .../postHandler/pluginPostHandler.d.ts | 7 + .../postHandler/pluginPostHandler.js | 30 + .../postHandler/pluginPostHandler.js.map | 1 + .../middlewares/postHandler/postHandler.d.ts | 4 +- .../middlewares/postHandler/postHandler.js | 9 +- .../postHandler/postHandler.js.map | 2 +- dist/src/middlewares/postHandler/refresh.js | 19 +- .../middlewares/postHandler/refresh.js.map | 2 +- dist/src/middlewares/postHandler/twt.d.ts | 4 +- dist/src/middlewares/postHandler/twt.js | 16 +- dist/src/middlewares/postHandler/twt.js.map | 2 +- dist/src/middlewares/putHandler/index.d.ts | 3 +- dist/src/middlewares/putHandler/index.js | 3 +- dist/src/middlewares/putHandler/index.js.map | 2 +- .../putHandler/pluginPutHandler.d.ts | 8 + .../putHandler/pluginPutHandler.js | 31 + .../putHandler/pluginPutHandler.js.map | 1 + .../middlewares/putHandler/putHandler.d.ts | 4 +- dist/src/middlewares/putHandler/putHandler.js | 5 +- .../middlewares/putHandler/putHandler.js.map | 2 +- .../queryHandler/followingHandler.d.ts | 4 +- .../queryHandler/followingHandler.js | 4 +- .../queryHandler/followingHandler.js.map | 2 +- .../queryHandler/metadataHandler.d.ts | 5 +- .../queryHandler/metadataHandler.js | 3 +- .../queryHandler/metadataHandler.js.map | 2 +- .../queryHandler/queryHandler.d.ts | 5 +- .../middlewares/queryHandler/queryHandler.js | 76 +- .../queryHandler/queryHandler.js.map | 2 +- .../queryHandler/twtHandler.js.map | 2 +- dist/src/middlewares/renderApp/renderApp.d.ts | 2 +- dist/src/middlewares/renderApp/renderApp.js | 7 +- .../middlewares/renderApp/renderApp.js.map | 2 +- .../renderApp/renderUploadButton.d.ts | 8 - .../renderApp/renderUploadButton.js | 23 - .../renderApp/renderUploadButton.js.map | 1 - dist/src/middlewares/uploadHandler.d.ts | 9 - dist/src/middlewares/uploadHandler.js | 129 -- dist/src/middlewares/uploadHandler.js.map | 1 - dist/src/plugin.d.ts | 3 - dist/src/plugin.js | 40 - dist/src/plugin.js.map | 1 - dist/src/types.d.ts | 42 +- package.json | 33 +- src/client/script.js | 261 ++-- src/client/styles.css | 31 +- src/expressPlugin.ts | 92 ++ src/index.ts | 9 +- src/lib/constants.ts | 5 +- src/lib/env.ts | 4 + src/lib/getConfiguration.ts | 45 +- src/lib/twtxtCache.ts | 28 +- src/lib/utils.ts | 51 + src/middlewares/postHandler/index.ts | 3 +- src/middlewares/postHandler/memoryCache.ts | 5 +- .../postHandler/pluginPostHandler.ts | 50 + src/middlewares/postHandler/postHandler.ts | 14 +- src/middlewares/postHandler/refresh.ts | 20 +- src/middlewares/postHandler/twt.ts | 29 +- src/middlewares/putHandler/index.ts | 3 +- .../putHandler/pluginPutHandler.ts | 52 + src/middlewares/putHandler/putHandler.ts | 13 +- .../queryHandler/followingHandler.ts | 4 +- .../queryHandler/metadataHandler.ts | 8 +- src/middlewares/queryHandler/queryHandler.ts | 108 +- src/middlewares/queryHandler/twtHandler.ts | 3 +- src/middlewares/renderApp/renderApp.ts | 9 +- .../renderApp/renderUploadButton.ts | 29 - src/middlewares/uploadHandler.ts | 174 --- src/plugin.ts | 60 - src/types.ts | 60 +- yarn.lock | 1301 +++++++---------- 103 files changed, 1632 insertions(+), 1996 deletions(-) create mode 100644 dist/src/expressPlugin.d.ts create mode 100644 dist/src/expressPlugin.js create mode 100644 dist/src/expressPlugin.js.map create mode 100644 dist/src/middlewares/postHandler/pluginPostHandler.d.ts create mode 100644 dist/src/middlewares/postHandler/pluginPostHandler.js create mode 100644 dist/src/middlewares/postHandler/pluginPostHandler.js.map create mode 100644 dist/src/middlewares/putHandler/pluginPutHandler.d.ts create mode 100644 dist/src/middlewares/putHandler/pluginPutHandler.js create mode 100644 dist/src/middlewares/putHandler/pluginPutHandler.js.map delete mode 100644 dist/src/middlewares/renderApp/renderUploadButton.d.ts delete mode 100644 dist/src/middlewares/renderApp/renderUploadButton.js delete mode 100644 dist/src/middlewares/renderApp/renderUploadButton.js.map delete mode 100644 dist/src/middlewares/uploadHandler.d.ts delete mode 100644 dist/src/middlewares/uploadHandler.js delete mode 100644 dist/src/middlewares/uploadHandler.js.map delete mode 100644 dist/src/plugin.d.ts delete mode 100644 dist/src/plugin.js delete mode 100644 dist/src/plugin.js.map create mode 100644 src/expressPlugin.ts create mode 100644 src/middlewares/postHandler/pluginPostHandler.ts create mode 100644 src/middlewares/putHandler/pluginPutHandler.ts delete mode 100644 src/middlewares/renderApp/renderUploadButton.ts delete mode 100644 src/middlewares/uploadHandler.ts delete mode 100644 src/plugin.ts diff --git a/.yarnrc.yml b/.yarnrc.yml index 7f75bcd..a1a7972 100644 --- a/.yarnrc.yml +++ b/.yarnrc.yml @@ -1,3 +1,5 @@ nodeLinker: node-modules -yarnPath: .yarn/releases/yarn-4.13.0.cjs +npmMinimalAgeGate: 7d + +yarnPath: .yarn/releases/yarn-4.14.1.cjs diff --git a/README.md b/README.md index 4ebc573..0ab4f83 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,8 @@ An [ExpressJS](https://expressjs.com/) router for serving, sharing, and updating > [!WARNING] > **STILL IN ALPHA**: Although this is a fully-functional plugin which is actively deployed to at least one site (my -> own), it currently lacks documentation, examples, tests, installation flexibility, or polish. +> own), it currently lacks documentation, examples, tests, installation flexibility, or polish (and still has a couple +> of bugs that need to be fixed). > _USE AT YOUR OWN RISK_ ### Features @@ -17,10 +18,56 @@ An [ExpressJS](https://expressjs.com/) router for serving, sharing, and updating ## Installing +Add package: + ```sh yarn add express-twtkpr ``` +Generate hash: + +```sh +yarn run get:hash +``` + +Create username and password: + +```sh +yarn run set:user +``` + +## Using + +Use it in an express application: + +``` +import express, { Request, Response } from "express"; + +import twtkpr from "express-twtkpr"; + +// import other middleware + +const app = express(); + +// add other middleware + +app.use( + "/", + twtkpr( + { + // config options + }, + ), +); + +// add error handler + +export default app; + +``` + +Starting with v0.9.0, extra features (like files uploading) were moved to the [express-twtkpr-core-plugins](https://www.npmjs.com/package/express-twtkpr-core-plugins) package. + More to come! --- diff --git a/dist/package.json b/dist/package.json index 2b9e71a..d1ef317 100644 --- a/dist/package.json +++ b/dist/package.json @@ -1,6 +1,6 @@ { "name": "express-twtkpr", - "version": "0.8.2", + "version": "0.9.0", "description": "An express library for hosting and maintaining a twtxt.txt file.", "license": "MIT", "author": { @@ -26,18 +26,16 @@ "dist" ], "scripts": { - "start": "node --env-file=.env dist/index-app.js", - "build": "tsc && cp -r src/client dist/src", - "dev": "DEBUG='twtkpr:*' tsx watch --env-file=.env src/index-app.ts", + "build": "tsc && cp -r src/client dist/src && cp -r src/plugins dist/src", "get:hash": "tsx --env-file=.env src/cli.ts get-hash", - "lint": "eslint --fix src test", + "lint": "eslint --fix src", "prepublishOnly": "yarn build", "set:user": "tsx --env-file=.env src/cli.ts set-user", "test": "vitest", "typecheck": "tsc --noEmit" }, "dependencies": { - "@cacheable/node-cache": "^2.0.2", + "@cacheable/node-cache": "^3.0.0", "@exodus/blakejs": "^1.1.1-exodus.0", "base32.js": "^0.1.0", "bcryptjs": "^3.0.3", @@ -45,37 +43,36 @@ "dayjs": "^1.11.20", "debug": "^4.4.3", "express": "^5.2.1", - "express-rate-limit": "^8.3.1", + "express-rate-limit": "^8.5.0", "express-session": "^1.19.0", "express-slow-down": "^3.1.0", - "formidable": "^3.5.4", "jsonwebtoken": "^9.0.3", "link": "^2.1.2", "session-file-store": "^1.5.0", - "twtxt-lib": "^0.9.4", - "uuid": "^13.0.0", - "zod": "^4.3.6" + "twtxt-lib": "^0.10.1", + "uuid": "^14.0.0", + "zod": "^4.4.3" }, "devDependencies": { "@types/cookie-parser": "^1.4.10", "@types/cors": "^2.8.19", "@types/debug": "^4.1.13", "@types/express": "^5.0.6", - "@types/express-session": "^1.18.2", - "@types/formidable": "^3.5.0", + "@types/express-session": "^1.19.0", + "@types/formidable": "^3.5.1", "@types/jsonwebtoken": "^9.0.10", "@types/morgan": "^1.9.10", - "@types/node": "^25.5.0", + "@types/node": "^25.6.0", "@types/supertest": "^7.2.0", - "eslint": "^10.0.3", + "eslint": "^10.3.0", "eslint-config-prettier": "^10.1.8", "eslint-plugin-prettier": "^5.5.5", "eslint-plugin-security": "^4.0.0", - "prettier": "^3.8.1", + "prettier": "^3.8.3", "supertest": "^7.2.2", "tsx": "^4.21.0", "typescript": "^5.9.3", - "vitest": "^4.1.0" + "vitest": "^4.1.5" }, - "packageManager": "yarn@4.13.0" + "packageManager": "yarn@4.14.1" } diff --git a/dist/src/client/script.js b/dist/src/client/script.js index 7981616..5a85d78 100644 --- a/dist/src/client/script.js +++ b/dist/src/client/script.js @@ -1,3 +1,4 @@ +// @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT const DEBUG_ON = true; // served from same path as TWTXT file @@ -9,13 +10,67 @@ const debug = (...vals) => { if (DEBUG_ON) console.log(...vals); }; +window.token = undefined; + +window.setCookie = (name, value, expireDays) => { + const isSecure = window.location.protocol === 'https'; + const expireDate = new Date(); // current date + expireDate.setTime( + expireDate.getTime() + (expireDays ?? 0) * 24 * 60 * 60 * 1000 + ); + let expires = + expireDays !== undefined ? `expires=${expireDate.toUTCString()}; ` : ''; + document.cookie = `${name}=${encodeURIComponent(value)}; ${expires}${isSecure ? 'Secure; ' : ''}SameSite=Strict; Path=/`; +}; + +window.showToast = (message, type = 'success') => { + const toast = document.createElement('div'); + toast.classList.add('toast'); + if (type === 'error') toast.classList.add('error'); + + toast.textContent = message; + document.getElementById('toast-container').appendChild(toast); + + setTimeout(() => { + toast.style.animation = 'fadeOut 0.5s forwards'; + setTimeout(() => toast.remove(), 500); + }, 3000); +}; + +window.refreshToken = async (hideToast = false) => { + const rememberToggleVal = !!localStorage.getItem(REMEMBER_LOGIN_STORAGE_KEY); + + const res = await fetch(`${TWTXT_FILE_URL}`, { + method: 'POST', + body: new URLSearchParams({ + rememberToggle: rememberToggleVal, + type: 'refresh', + }), + credentials: 'include', // Include cookies + }); + + if (res.ok && res?.body) { + token = await new Response(res.body).text(); + if (rememberToggleVal) { + setCookie(ACCESS_TOKEN_COOKIE_KEY, token); + } + return; + } + + // Handle refresh failure + if (!hideToast) + showToast('Unable to refresh token, please try again later.', 'error'); + token = undefined; + document.body.classList.remove('js-authorized'); + throw new Error('Failed to refresh token'); +}; + export default (async () => { /* DOM Elements */ const twtForm = document.getElementById('twtForm'), loginForm = document.getElementById('loginControls-form'), fileBox = document.getElementById('fileBox'), fileContentsSection = document.getElementById('fileContentsSection'), - toastContainer = document.getElementById('toast-container'), twtControlsContentInput = document.getElementById( 'twtControlsContentInput' ), @@ -24,27 +79,12 @@ export default (async () => { twtFileEditButton = document.getElementById('twtControlsEditButton'), menuCheckbox = document.getElementById('hamburgerToggleCheckbox'), twtxtEditFormText = document.getElementById('twtxtEditFormText'), - uploadInputs = document.querySelectorAll('.twtControls-uploadInput'), rememberToggle = document.getElementById('loginControls-rememberToggle'); const lastModifiedDates = {}; let isEditing = false, cookie, - fileText, - token; - - const showToast = (message, type = 'success') => { - const toast = document.createElement('div'); - toast.classList.add('toast'); - if (type === 'error') toast.classList.add('error'); - toast.textContent = message; - - toastContainer.appendChild(toast); - setTimeout(() => { - toast.style.animation = 'fadeOut 0.5s forwards'; - setTimeout(() => toast.remove(), 500); - }, 3000); - }; + fileText; const beginEditMode = () => { isEditing = true; @@ -70,17 +110,6 @@ export default (async () => { return null; }; - const setCookie = (name, value, expireDays) => { - const isSecure = window.location.protocol === 'https'; - const expireDate = new Date(); // current date - expireDate.setTime( - expireDate.getTime() + (expireDays ?? 0) * 24 * 60 * 60 * 1000 - ); - let expires = - expireDays !== undefined ? `expires=${expireDate.toUTCString()}; ` : ''; - document.cookie = `${name}=${encodeURIComponent(value)}; ${expires}${isSecure ? 'Secure; ' : ''}SameSite=Strict; Path=/`; - }; - const loadTwtxtFile = async (filePath = TWTXT_FILE_URL) => { debug('loadTwtxtFile start'); let response; @@ -119,142 +148,8 @@ export default (async () => { debug('loadTwtxtFile end'); }; - const refreshToken = async (hideToast = false) => { - debug('refreshToken start', hideToast); - const rememberToggleVal = - localStorage.getItem(REMEMBER_LOGIN_STORAGE_KEY) === 'true'; - - const res = await fetch(`${TWTXT_FILE_URL}`, { - method: 'POST', - body: new URLSearchParams({ - rememberToggle: rememberToggleVal, - type: 'refresh', - }), - credentials: 'include', // Include cookies - }); - - if (res.ok && res?.body) { - token = await new Response(res.body).text(); - if (rememberToggleVal) { - debug('refreshToken set new accessToken cookie'); - setCookie(ACCESS_TOKEN_COOKIE_KEY, token); - } - debug('refreshToken end OK'); - return; - } - - // Handle refresh failure - if (!hideToast) - showToast('Unable to refresh token, please try again later.', 'error'); - token = undefined; - document.body.classList.remove('js-authorized'); - debug('refreshToken end error'); - throw new Error('Failed to refresh token'); - }; - - const uploadFiles = async (files, uploadRoute, secondAttempt = false) => { - if (!uploadRoute) return; - - debug('uploadFiles', token, files, uploadRoute, secondAttempt); - - const formData = new FormData(); - for (let i = 0; i < files.length; i++) { - formData.append('files', files[i]); - } - - try { - const res = await fetch(uploadRoute, { - method: 'POST', - body: formData, - headers: { - Authorization: `Bearer ${token}`, - }, - credentials: 'include', - }); - - if (res.ok) { - showToast(`File${files.length !== 1 ? 's' : ''} uploaded`); - - const filePath = await res.text(); - twtControlsContentInput.value += filePath - .split('\n') - .map((currFilePath) => - [ - ' ', - location.protocol, - '//', - location.hostname, - location.protocol !== 'https' && location.port !== 80 - ? ':' + location.port - : '', - currFilePath, - ].join('') - ) - .join(''); - - return; - } - - if (!secondAttempt) { - await refreshToken(); - return uploadFiles(files, uploadRoute, true); - } - - showToast( - `Unable to upload image${files.length !== 1 ? 's' : ''} refresh token, please try again later.`, - 'error' - ); - } catch (err) { - console.error(err); - } - }; - /* Handlers */ - const dragOverHandler = (ev) => { - const files = [...ev.dataTransfer.items].filter( - (item) => item.kind === 'file' - ); - - if (files.length > 0) { - ev.preventDefault(); - ev.dataTransfer.dropEffect = 'copy'; - } - }; - - const dragOverWindowHandler = (ev) => { - const files = [...ev.dataTransfer.items].filter( - (item) => item.kind === 'file' - ); - - if (files.length > 0) { - ev.preventDefault(); - - if (!twtControlsContentInput.contains(ev.target)) { - ev.dataTransfer.dropEffect = 'none'; - } - } - }; - - const dropHandler = (ev) => { - ev.preventDefault(); - - if (!uploadInputs.length) return; - - const files = [...ev.dataTransfer.items] - .map((item) => item.getAsFile()) - .filter((file) => file); - - debug('dropHandler', files); - uploadFiles(files, uploadInputs[0].getAttribute('data-route')); - }; - - const dropWindowHandler = (ev) => { - if ([...ev.dataTransfer.items].some((item) => item.kind === 'file')) { - ev.preventDefault(); - } - }; - const editClickHandler = () => { if (isEditing) return; @@ -384,7 +279,8 @@ export default (async () => { }; const rememberToggleHandler = (ev) => { - if (ev.target.checked) { + debug('toggle!', ev?.target?.checked); + if (ev?.target?.checked) { localStorage.setItem(REMEMBER_LOGIN_STORAGE_KEY, 'true'); return; } @@ -392,6 +288,14 @@ export default (async () => { localStorage.removeItem(REMEMBER_LOGIN_STORAGE_KEY); }; + const twtContentInputHandler = () => { + console.log('input!'); + const hasContent = + (twtControlsContentInput.value?.trim() ?? '').length !== 0; + if (twtSubmitButton && hasContent && !isEditing) + twtSubmitButton.removeAttribute('disabled'); + }; + const twtContentKeyupHandler = (ev) => { const hasContent = (twtControlsContentInput.value?.trim() ?? '').length !== 0; @@ -422,7 +326,7 @@ export default (async () => { debug('twtForm submit data', { twtData }); if (!twtContent) return; - twtData.set('content', twtContent.replaceAll('\n', '\u2028')); + twtData.set('content', twtContent.replace(/\n/g, ' \u2028')); const twtBody = new URLSearchParams(twtData); debug('twtForm submit body', { twtBody }); @@ -461,25 +365,15 @@ export default (async () => { return false; }; - const uploadChangeHandler = (ev) => { - uploadFiles(ev.target.files, ev.target.getAttribute('data-route')); - }; - /* Attach Handlers to Listeners */ - Array.from(uploadInputs).forEach((uploadInput) => { - uploadInput.addEventListener('change', uploadChangeHandler); - }); - loginForm.addEventListener('submit', loginFormSubmitHandler); twtForm.addEventListener('submit', twtFormSubmitHandler); twtForm.addEventListener('keyup', twtContentKeyupHandler); - twtControlsContentInput.addEventListener('drop', dropHandler); - - twtControlsContentInput.addEventListener('dragover', dragOverHandler); + twtForm.addEventListener('input', twtContentInputHandler); twtLogoutButton.addEventListener('click', logoutHandler); @@ -489,11 +383,19 @@ export default (async () => { twtxtEditForm.addEventListener('submit', editSubmitHandler); - window.addEventListener('dragover', dragOverWindowHandler); - - window.addEventListener('drop', dropWindowHandler); - rememberToggle.addEventListener('change', rememberToggleHandler); + rememberToggle.setAttribute( + 'checked', + !!localStorage.getItem(REMEMBER_LOGIN_STORAGE_KEY) + ); + + menuCheckbox.addEventListener('click', (evt) => { + evt.stopPropagation(); + }); + + window.addEventListener('click', () => { + menuCheckbox.checked = false; + }); /* Start App*/ @@ -504,3 +406,4 @@ export default (async () => { debug('client loaded'); })(); +// @license-end diff --git a/dist/src/client/styles.css b/dist/src/client/styles.css index 1a976e8..9aff9ab 100644 --- a/dist/src/client/styles.css +++ b/dist/src/client/styles.css @@ -77,7 +77,7 @@ } /** - * Local styles + * Begin TwtKpr Client CSS */ :root { /* #0a0a14 / Vulcan*/ @@ -483,33 +483,6 @@ input:disabled { display: none; } -.twtControls-uploadInputLabel { - align-items: center; - cursor: pointer; - display: flex; - justify-content: center; - max-width: 100%; - text-align: center; - transition: all 0.5s; -} - -.twtControls-uploadInputLabel-normal { - display: none; -} - -.twtControls-uploadInputLabel-small { - font-size: small; -} - -.twtControls-uploadInputLabel:hover { - background-color: var(--bg-hl); - color: var(--fg-hl); -} - -.twtControls-uploadInput { - display: none; -} - .twtControls-submitButton { background-color: var(--bg-hl); border: 1px solid var(--link); @@ -715,3 +688,5 @@ input:disabled { opacity: 0; } } + +/** End TwtKpr Client CSS */ diff --git a/dist/src/expressPlugin.d.ts b/dist/src/expressPlugin.d.ts new file mode 100644 index 0000000..3d8f6d8 --- /dev/null +++ b/dist/src/expressPlugin.d.ts @@ -0,0 +1,3 @@ +import { Router } from 'express'; +import { TwtKprPluginConfigurator, TwtKprConfiguration } from './types.js'; +export default function expressPlugin(initialConfig?: Partial, initialPlugins?: TwtKprPluginConfigurator[]): Router; diff --git a/dist/src/expressPlugin.js b/dist/src/expressPlugin.js new file mode 100644 index 0000000..2b0b3ab --- /dev/null +++ b/dist/src/expressPlugin.js @@ -0,0 +1,58 @@ +import cookieParser from 'cookie-parser'; +import Debug from 'debug'; +import express from 'express'; +import authCheck from './middlewares/authCheckJWT.js'; +import twtxtCache from './lib/twtxtCache.js'; +import getConfiguration from './lib/getConfiguration.js'; +import queryHandler from './middlewares/queryHandler/index.js'; +import postHandler, { pluginPostHandler, } from './middlewares/postHandler/index.js'; +import putHandler, { pluginPutHandler, } from './middlewares/putHandler/index.js'; +// import emojiPlugin from './plugins/emojiButton/index.js'; +// import uploadPlugin from './plugins/uploadButton/index.js'; +// import postToMastodon from './plugins/postToMastodon/index.js'; +export default function expressPlugin(initialConfig, initialPlugins = []) { + const debug = Debug('twtkpr:expressPlugin'); + const router = express.Router(); + const config = getConfiguration(initialConfig ?? {}); + const { mainRoute, publicDirectory, twtxtFilename } = config; + const verifyAuthRequest = (req) => authCheck(req, config); + const preparedPlugins = initialPlugins + // .concat([emojiPlugin, uploadPlugin, postToMastodon]) + .map((plugin) => plugin(config)); + debug('initializing cache'); + const { getFromCache, reloadCache } = twtxtCache({ + publicDirectory, + twtxtFilename, + }); + preparedPlugins.forEach((plugin) => { + if (plugin.useFirst) + router.use(plugin.useFirst); + }); + debug('adding URL encoder'); + router.use(express.urlencoded({ extended: true })); + debug('adding cookieParser'); + router.use(cookieParser()); + debug('adding queryRouter'); + router.use(mainRoute, queryHandler(config, getFromCache, verifyAuthRequest, preparedPlugins)); + debug('adding postHandler and putHandler'); + router.use(mainRoute, postHandler(config, preparedPlugins, reloadCache), putHandler(config, preparedPlugins, reloadCache)); + debug('adding postHandlers and putHandlers for plugins'); + router.use(config.pluginRoute, pluginPostHandler(preparedPlugins, verifyAuthRequest, reloadCache), pluginPutHandler(preparedPlugins, verifyAuthRequest, reloadCache)); + debug('adding use handlers for plugins'); + preparedPlugins.forEach((plugin) => { + if (plugin.use) + router.use(plugin.use); + }); + debug('adding static'); + router.use(express.static(config.publicDirectory)); + debug('adding default redirect'); + router.get('/', (_, res) => { + res.redirect(mainRoute); + }); + preparedPlugins.forEach((plugin) => { + if (plugin.useLast) + router.use(plugin.useLast); + }); + return router; +} +//# sourceMappingURL=expressPlugin.js.map \ No newline at end of file diff --git a/dist/src/expressPlugin.js.map b/dist/src/expressPlugin.js.map new file mode 100644 index 0000000..394cc72 --- /dev/null +++ b/dist/src/expressPlugin.js.map @@ -0,0 +1 @@ +{"version":3,"file":"expressPlugin.js","sourceRoot":"","sources":["../../src/expressPlugin.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/index.d.ts b/dist/src/index.d.ts index 036faae..b341e47 100644 --- a/dist/src/index.d.ts +++ b/dist/src/index.d.ts @@ -1 +1,3 @@ -export { default } from "./plugin.js"; +export { default } from './expressPlugin.js'; +export { combineStreams, getReadStream } from './lib/utils.js'; +export type { MimeOptions, TwtKprConfiguration, TwtKprPluginConfiguration, } from './types.js'; diff --git a/dist/src/index.js b/dist/src/index.js index 9fb2732..5a1f9cc 100644 --- a/dist/src/index.js +++ b/dist/src/index.js @@ -1,2 +1,3 @@ -export { default } from "./plugin.js"; +export { default } from './expressPlugin.js'; +export { combineStreams, getReadStream } from './lib/utils.js'; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/index.js.map b/dist/src/index.js.map index 8c8755f..ed0cd2e 100644 --- a/dist/src/index.js.map +++ b/dist/src/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"} \ No newline at end of file diff --git a/dist/src/lib/constants.d.ts b/dist/src/lib/constants.d.ts index cfa2d19..9e7ee52 100644 --- a/dist/src/lib/constants.d.ts +++ b/dist/src/lib/constants.d.ts @@ -1,7 +1,8 @@ -export declare const DEFAULT_PRIVATE_DIRECTORY = ".data"; -export declare const DEFAULT_PUBLIC_DIRECTORY = "public"; export declare const DEFAULT_TWTXT_FILENAME = "twtxt.txt"; export declare const DEFAULT_ROUTE = "/twtxt.txt"; +export declare const DEFAULT_PRIVATE_DIRECTORY = ".data"; +export declare const DEFAULT_PUBLIC_DIRECTORY = "public"; +export declare const DEFAULT_PLUGIN_ROUTE = "/"; export declare const DEFAULT_POST_LIMITER_ACTIVE = true; export declare const DEFAULT_QUERY_PARAMETER_APP = "app"; export declare const DEFAULT_QUERY_PARAMETER_CSS = "css"; diff --git a/dist/src/lib/constants.js b/dist/src/lib/constants.js index 6b88f5f..60ff8f3 100644 --- a/dist/src/lib/constants.js +++ b/dist/src/lib/constants.js @@ -1,9 +1,10 @@ import { dirname, resolve } from 'node:path'; import { fileURLToPath } from 'node:url'; -export const DEFAULT_PRIVATE_DIRECTORY = '.data'; -export const DEFAULT_PUBLIC_DIRECTORY = 'public'; export const DEFAULT_TWTXT_FILENAME = 'twtxt.txt'; export const DEFAULT_ROUTE = `/${DEFAULT_TWTXT_FILENAME}`; +export const DEFAULT_PRIVATE_DIRECTORY = '.data'; +export const DEFAULT_PUBLIC_DIRECTORY = 'public'; +export const DEFAULT_PLUGIN_ROUTE = '/'; export const DEFAULT_POST_LIMITER_ACTIVE = true; export const DEFAULT_QUERY_PARAMETER_APP = 'app'; export const DEFAULT_QUERY_PARAMETER_CSS = 'css'; diff --git a/dist/src/lib/constants.js.map b/dist/src/lib/constants.js.map index 58de6cd..2a0bdc8 100644 --- a/dist/src/lib/constants.js.map +++ b/dist/src/lib/constants.js.map @@ -1 +1 @@ -{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/lib/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,CAAC,MAAM,yBAAyB,GAAG,OAAO,CAAC;AACjD,MAAM,CAAC,MAAM,wBAAwB,GAAG,QAAQ,CAAC;AACjD,MAAM,CAAC,MAAM,sBAAsB,GAAG,WAAW,CAAC;AAClD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,sBAAsB,EAAE,CAAC;AAE1D,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,CAAC;AAEhD,MAAM,CAAC,MAAM,2BAA2B,GAAG,KAAK,CAAC;AACjD,MAAM,CAAC,MAAM,2BAA2B,GAAG,KAAK,CAAC;AACjD,MAAM,CAAC,MAAM,iCAAiC,GAAG,WAAW,CAAC;AAC7D,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,CAAC;AAC/C,MAAM,CAAC,MAAM,8BAA8B,GAAG,QAAQ,CAAC;AACvD,MAAM,CAAC,MAAM,gCAAgC,GAAG,UAAU,CAAC;AAC3D,MAAM,CAAC,MAAM,2BAA2B,GAAG,KAAK,CAAC;AACjD,MAAM,CAAC,MAAM,4BAA4B,GAAG,MAAM,CAAC;AAEnD,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAC1C,MAAM,CAAC,MAAM,iCAAiC,GAAG,EAAE,CAAC;AACpD,MAAM,CAAC,MAAM,oBAAoB,GAAG,OAAO,CAAC;AAC5C,MAAM,CAAC,MAAM,uBAAuB,GAAG,OAAO,CAAC;AAE/C,kBAAkB;AAClB,MAAM,CAAC,MAAM,6BAA6B,GAAG,QAAQ,CAAC;AACtD,MAAM,CAAC,MAAM,8BAA8B,GAAG,IAAI,CAAC;AAEnD,MAAM,CAAC,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC"} \ No newline at end of file +{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/lib/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,CAAC,MAAM,sBAAsB,GAAG,WAAW,CAAC;AAClD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,sBAAsB,EAAE,CAAC;AAC1D,MAAM,CAAC,MAAM,yBAAyB,GAAG,OAAO,CAAC;AACjD,MAAM,CAAC,MAAM,wBAAwB,GAAG,QAAQ,CAAC;AACjD,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,CAAC;AAExC,MAAM,CAAC,MAAM,2BAA2B,GAAG,IAAI,CAAC;AAEhD,MAAM,CAAC,MAAM,2BAA2B,GAAG,KAAK,CAAC;AACjD,MAAM,CAAC,MAAM,2BAA2B,GAAG,KAAK,CAAC;AACjD,MAAM,CAAC,MAAM,iCAAiC,GAAG,WAAW,CAAC;AAC7D,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,CAAC;AAC/C,MAAM,CAAC,MAAM,8BAA8B,GAAG,QAAQ,CAAC;AACvD,MAAM,CAAC,MAAM,gCAAgC,GAAG,UAAU,CAAC;AAC3D,MAAM,CAAC,MAAM,2BAA2B,GAAG,KAAK,CAAC;AACjD,MAAM,CAAC,MAAM,4BAA4B,GAAG,MAAM,CAAC;AAEnD,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAC1C,MAAM,CAAC,MAAM,iCAAiC,GAAG,EAAE,CAAC;AACpD,MAAM,CAAC,MAAM,oBAAoB,GAAG,OAAO,CAAC;AAC5C,MAAM,CAAC,MAAM,uBAAuB,GAAG,OAAO,CAAC;AAE/C,kBAAkB;AAClB,MAAM,CAAC,MAAM,6BAA6B,GAAG,QAAQ,CAAC;AACtD,MAAM,CAAC,MAAM,8BAA8B,GAAG,IAAI,CAAC;AAEnD,MAAM,CAAC,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC"} \ No newline at end of file diff --git a/dist/src/lib/env.d.ts b/dist/src/lib/env.d.ts index a1515b8..fdf9d77 100644 --- a/dist/src/lib/env.d.ts +++ b/dist/src/lib/env.d.ts @@ -4,6 +4,7 @@ export declare const env: { TWTKPR_REFRESH_SECRET: string; TWTKPR_ACCESS_SECRET: string; TWTKPR_DEFAULT_ROUTE: string; + TWTKPR_PLUGIN_ROUTE: string; TWTKPR_PRIVATE_DIRECTORY: string; TWTKPR_PUBLIC_DIRECTORY: string; TWTKPR_QUERY_PARAMETER_APP: string; diff --git a/dist/src/lib/env.js b/dist/src/lib/env.js index 070389a..0a93ee9 100644 --- a/dist/src/lib/env.js +++ b/dist/src/lib/env.js @@ -1,7 +1,7 @@ import { dirname, resolve } from 'node:path'; import { fileURLToPath } from 'node:url'; import { z } from 'zod/v4'; -import { DEFAULT_POST_LIMITER_ACTIVE, DEFAULT_PRIVATE_DIRECTORY, DEFAULT_PUBLIC_DIRECTORY, DEFAULT_QUERY_PARAMETER_APP, DEFAULT_QUERY_PARAMETER_CSS, DEFAULT_QUERY_PARAMETER_FOLLOWING, DEFAULT_QUERY_PARAMETER_JS, DEFAULT_QUERY_PARAMETER_LOGOUT, DEFAULT_QUERY_PARAMETER_METADATA, DEFAULT_QUERY_PARAMETER_TWT, DEFAULT_QUERY_PARAMETER_TWTS, DEFAULT_ROUTE, DEFAULT_TWTXT_FILENAME, DEFAULT_UPLOAD_ACTIVE, DEFAULT_UPLOAD_ALLOWED_MIME_TYPES, DEFAULT_UPLOAD_ENCODING, DEFAULT_UPLOAD_HASH_ALGORITHM, DEFAULT_UPLOAD_KEEP_EXTENSIONS, DEFAULT_UPLOAD_ROUTE, } from './constants.js'; +import { DEFAULT_PLUGIN_ROUTE, DEFAULT_POST_LIMITER_ACTIVE, DEFAULT_PRIVATE_DIRECTORY, DEFAULT_PUBLIC_DIRECTORY, DEFAULT_QUERY_PARAMETER_APP, DEFAULT_QUERY_PARAMETER_CSS, DEFAULT_QUERY_PARAMETER_FOLLOWING, DEFAULT_QUERY_PARAMETER_JS, DEFAULT_QUERY_PARAMETER_LOGOUT, DEFAULT_QUERY_PARAMETER_METADATA, DEFAULT_QUERY_PARAMETER_TWT, DEFAULT_QUERY_PARAMETER_TWTS, DEFAULT_ROUTE, DEFAULT_TWTXT_FILENAME, DEFAULT_UPLOAD_ACTIVE, DEFAULT_UPLOAD_ALLOWED_MIME_TYPES, DEFAULT_UPLOAD_ENCODING, DEFAULT_UPLOAD_HASH_ALGORITHM, DEFAULT_UPLOAD_KEEP_EXTENSIONS, DEFAULT_UPLOAD_ROUTE, } from './constants.js'; /* The following keys are expected to exist in `process.env`, either as listed, or without the `TWTKPR_` prefix @@ -18,6 +18,7 @@ const envSchema = z.object({ TWTKPR_ACCESS_SECRET: z.string().default(''), // vars with default values TWTKPR_DEFAULT_ROUTE: z.string().default(DEFAULT_ROUTE), + TWTKPR_PLUGIN_ROUTE: z.string().default(DEFAULT_PLUGIN_ROUTE), TWTKPR_PRIVATE_DIRECTORY: z.string().default(DEFAULT_PRIVATE_DIRECTORY), TWTKPR_PUBLIC_DIRECTORY: z.string().default(DEFAULT_PUBLIC_DIRECTORY), TWTKPR_QUERY_PARAMETER_APP: z.string().default(DEFAULT_QUERY_PARAMETER_APP), @@ -100,6 +101,7 @@ const parseEnv = () => { NODE_ENV: process.env.TWTKPR_NODE_ENV || process.env.NODE_ENV, TWTKPR_ACCESS_SECRET: process.env.TWTKPR_ACCESS_SECRET || process.env.ACCESS_SECRET, TWTKPR_DEFAULT_ROUTE: process.env.TWTKPR_DEFAULT_ROUTE || process.env.DEFAULT_ROUTE, + TWTKPR_PLUGIN_ROUTE: process.env.TWTKPR_PLUGIN_ROUTE || process.env.TWTKPR_PLUGIN_ROUTE, TWTKPR_PRIVATE_DIRECTORY: process.env.TWTKPR_PRIVATE_DIRECTORY || process.env.PRIVATE_DIRECTORY, TWTKPR_PUBLIC_DIRECTORY: process.env.TWTKPR_PUBLIC_DIRECTORY || process.env.PUBLIC_DIRECTORY, TWTKPR_REFRESH_SECRET: process.env.TWTKPR_REFRESH_SECRET || process.env.REFRESH_SECRET, diff --git a/dist/src/lib/env.js.map b/dist/src/lib/env.js.map index 49b2b80..4e92720 100644 --- a/dist/src/lib/env.js.map +++ b/dist/src/lib/env.js.map @@ -1 +1 @@ -{"version":3,"file":"env.js","sourceRoot":"","sources":["../../../src/lib/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAE3B,OAAO,EACN,2BAA2B,EAC3B,yBAAyB,EACzB,wBAAwB,EACxB,2BAA2B,EAC3B,2BAA2B,EAC3B,iCAAiC,EACjC,0BAA0B,EAC1B,8BAA8B,EAC9B,gCAAgC,EAChC,2BAA2B,EAC3B,4BAA4B,EAC5B,aAAa,EACb,sBAAsB,EACtB,qBAAqB,EACrB,iCAAiC,EACjC,uBAAuB,EACvB,6BAA6B,EAC7B,8BAA8B,EAC9B,oBAAoB,GACpB,MAAM,gBAAgB,CAAC;AAExB;;;;;;EAME;AACF,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,QAAQ,EAAE,CAAC;SACT,IAAI,CAAC,CAAC,aAAa,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;SAC3C,OAAO,CAAC,aAAa,CAAC;IAExB,yCAAyC;IACzC,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAC7C,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAE5C,2BAA2B;IAC3B,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC;IACvD,wBAAwB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,yBAAyB,CAAC;IACvE,uBAAuB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,wBAAwB,CAAC;IACrE,0BAA0B,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,2BAA2B,CAAC;IAC3E,0BAA0B,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,2BAA2B,CAAC;IAC3E,gCAAgC,EAAE,CAAC;SACjC,MAAM,EAAE;SACR,OAAO,CAAC,iCAAiC,CAAC;IAC5C,yBAAyB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,0BAA0B,CAAC;IACzE,6BAA6B,EAAE,CAAC;SAC9B,MAAM,EAAE;SACR,OAAO,CAAC,8BAA8B,CAAC;IACzC,+BAA+B,EAAE,CAAC;SAChC,MAAM,EAAE;SACR,OAAO,CAAC,gCAAgC,CAAC;IAC3C,0BAA0B,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,2BAA2B,CAAC;IAC3E,2BAA2B,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,4BAA4B,CAAC;IAC7E,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,sBAAsB,CAAC;IAEjE;;OAEG;IAEH,yBAAyB;IACzB,0BAA0B,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,2BAA2B,CAAC;IAE5E,gBAAgB;IAChB,6BAA6B,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACrD,yBAAyB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC1E,2BAA2B,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IAChD,+BAA+B,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACvD,2BAA2B,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACrD,kCAAkC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAC3D,oCAAoC,EAAE,CAAC,CAAC,QAAQ,CAC/C,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAClC;IACD,8BAA8B,EAAE,CAAC,CAAC,QAAQ,CACzC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CACnC;IACD,yBAAyB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IAC9C,uCAAuC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAChE,iCAAiC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC3D,+BAA+B,EAAE,CAAC,CAAC,QAAQ,CAC1C,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAChD;IACD,yCAAyC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACjE,wBAAwB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAClD,4CAA4C,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IACrE,wCAAwC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IACjE,0CAA0C,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACpE,4BAA4B,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAE5E;;OAEG;IAEH,2BAA2B;IAC3B,oBAAoB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,qBAAqB,CAAC;IAChE,gCAAgC,EAAE,CAAC;SACjC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;SACxC,OAAO,CAAC,iCAAiC,CAAC;IAC5C,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,oBAAoB,CAAC;IAE7D,gBAAgB;IAChB,+BAA+B,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IACxD,sCAAsC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAC/D,uBAAuB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC/C,sBAAsB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,uBAAuB,CAAC;IACnE,uCAAuC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACjE,sBAAsB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAChD,oBAAoB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC9C,4BAA4B,EAAE,CAAC;SAC7B,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;SAChC,OAAO,CAAC,6BAA6B,CAAC;IACxC,6BAA6B,EAAE,CAAC;SAC9B,OAAO,EAAE;SACT,OAAO,CAAC,8BAA8B,CAAC;IACzC,wBAAwB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAChD,6BAA6B,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACrD,2BAA2B,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACnD,uBAAuB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC/C,iCAAiC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACzD,2BAA2B,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;CACnD,CAAC,CAAC;AAEH,MAAM,QAAQ,GAAG,GAAG,EAAE;IACrB,IAAI,CAAC;QACJ;;;;WAIG;QACH,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC;YACjC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ;YAC7D,oBAAoB,EACnB,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa;YAC9D,oBAAoB,EACnB,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa;YAC9D,wBAAwB,EACvB,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB;YACtE,uBAAuB,EACtB,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB;YACpE,qBAAqB,EACpB,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc;YAChE,qBAAqB,EACpB,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc;YAEhE,0BAA0B,EACzB,OAAO,CAAC,GAAG,CAAC,0BAA0B;gBACtC,OAAO,CAAC,GAAG,CAAC,mBAAmB;YAChC,6BAA6B,EAC5B,OAAO,CAAC,GAAG,CAAC,6BAA6B;gBACzC,OAAO,CAAC,GAAG,CAAC,sBAAsB;YACnC,yBAAyB,EACxB,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB;YACxE,2BAA2B,EAC1B,OAAO,CAAC,GAAG,CAAC,2BAA2B;gBACvC,OAAO,CAAC,GAAG,CAAC,oBAAoB;YACjC,+BAA+B,EAC9B,OAAO,CAAC,GAAG,CAAC,+BAA+B;gBAC3C,OAAO,CAAC,GAAG,CAAC,wBAAwB;YACrC,2BAA2B,EAC1B,OAAO,CAAC,GAAG,CAAC,2BAA2B;gBACvC,OAAO,CAAC,GAAG,CAAC,oBAAoB;YACjC,kCAAkC,EACjC,OAAO,CAAC,GAAG,CAAC,kCAAkC;gBAC9C,OAAO,CAAC,GAAG,CAAC,2BAA2B;YACxC,oCAAoC,EACnC,OAAO,CAAC,GAAG,CAAC,oCAAoC;gBAChD,OAAO,CAAC,GAAG,CAAC,6BAA6B;YAC1C,8BAA8B,EAC7B,OAAO,CAAC,GAAG,CAAC,8BAA8B;gBAC1C,OAAO,CAAC,GAAG,CAAC,uBAAuB;YACpC,yBAAyB,EACxB,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB;YACxE,uCAAuC,EACtC,OAAO,CAAC,GAAG,CAAC,uCAAuC;gBACnD,OAAO,CAAC,GAAG,CAAC,gCAAgC;YAC7C,iCAAiC,EAChC,OAAO,CAAC,GAAG,CAAC,iCAAiC;gBAC7C,OAAO,CAAC,GAAG,CAAC,0BAA0B;YACvC,+BAA+B,EAC9B,OAAO,CAAC,GAAG,CAAC,+BAA+B;gBAC3C,OAAO,CAAC,GAAG,CAAC,wBAAwB;YACrC,yCAAyC,EACxC,OAAO,CAAC,GAAG,CAAC,yCAAyC;gBACrD,OAAO,CAAC,GAAG,CAAC,kCAAkC;YAC/C,wBAAwB,EACvB,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB;YACtE,4CAA4C,EAC3C,OAAO,CAAC,GAAG,CAAC,4CAA4C;gBACxD,OAAO,CAAC,GAAG,CAAC,qCAAqC;YAClD,wCAAwC,EACvC,OAAO,CAAC,GAAG,CAAC,wCAAwC;gBACpD,OAAO,CAAC,GAAG,CAAC,iCAAiC;YAC9C,0CAA0C,EACzC,OAAO,CAAC,GAAG,CAAC,0CAA0C;gBACtD,OAAO,CAAC,GAAG,CAAC,mCAAmC;YAChD,4BAA4B,EAC3B,OAAO,CAAC,GAAG,CAAC,4BAA4B;gBACxC,OAAO,CAAC,GAAG,CAAC,qBAAqB;YAElC,0BAA0B,EACzB,OAAO,CAAC,GAAG,CAAC,0BAA0B;gBACtC,OAAO,CAAC,GAAG,CAAC,mBAAmB;YAChC,0BAA0B,EACzB,OAAO,CAAC,GAAG,CAAC,0BAA0B;gBACtC,OAAO,CAAC,GAAG,CAAC,mBAAmB;YAChC,gCAAgC,EAC/B,OAAO,CAAC,GAAG,CAAC,gCAAgC;gBAC5C,OAAO,CAAC,GAAG,CAAC,yBAAyB;YACtC,yBAAyB,EACxB,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB;YACxE,6BAA6B,EAC5B,OAAO,CAAC,GAAG,CAAC,6BAA6B;gBACzC,OAAO,CAAC,GAAG,CAAC,sBAAsB;YACnC,+BAA+B,EAC9B,OAAO,CAAC,GAAG,CAAC,+BAA+B;gBAC3C,OAAO,CAAC,GAAG,CAAC,wBAAwB;YACrC,0BAA0B,EACzB,OAAO,CAAC,GAAG,CAAC,0BAA0B;gBACtC,OAAO,CAAC,GAAG,CAAC,mBAAmB;YAChC,2BAA2B,EAC1B,OAAO,CAAC,GAAG,CAAC,2BAA2B;gBACvC,OAAO,CAAC,GAAG,CAAC,oBAAoB;YAEjC,oBAAoB,EACnB,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa;YAC9D,+BAA+B,EAC9B,OAAO,CAAC,GAAG,CAAC,+BAA+B;gBAC3C,OAAO,CAAC,GAAG,CAAC,wBAAwB;YACrC,gCAAgC,EAC/B,OAAO,CAAC,GAAG,CAAC,gCAAgC;gBAC5C,OAAO,CAAC,GAAG,CAAC,yBAAyB;YACtC,sCAAsC,EACrC,OAAO,CAAC,GAAG,CAAC,sCAAsC;gBAClD,OAAO,CAAC,GAAG,CAAC,+BAA+B;YAC5C,uBAAuB,EACtB,OAAO,CAAC,GAAG,CAAC,uBAAuB;gBACnC,OAAO,CAAC,GAAG,CAAC,gBAAgB;gBAC5B,OAAO,CAAC,GAAG,CAAC,UAAU;YACvB,sBAAsB,EACrB,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe;YAClE,uCAAuC,EACtC,OAAO,CAAC,GAAG,CAAC,uCAAuC;gBACnD,OAAO,CAAC,GAAG,CAAC,gCAAgC;YAC7C,sBAAsB,EACrB,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe;YAClE,oBAAoB,EACnB,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa;YAC9D,4BAA4B,EAC3B,OAAO,CAAC,GAAG,CAAC,4BAA4B;gBACxC,OAAO,CAAC,GAAG,CAAC,qBAAqB;YAClC,6BAA6B,EAC5B,OAAO,CAAC,GAAG,CAAC,6BAA6B;gBACzC,OAAO,CAAC,GAAG,CAAC,sBAAsB;YACnC,wBAAwB,EACvB,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB;YACtE,6BAA6B,EAC5B,OAAO,CAAC,GAAG,CAAC,6BAA6B;gBACzC,OAAO,CAAC,GAAG,CAAC,sBAAsB;YACnC,2BAA2B,EAC1B,OAAO,CAAC,GAAG,CAAC,2BAA2B;gBACvC,OAAO,CAAC,GAAG,CAAC,oBAAoB;YACjC,uBAAuB,EACtB,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB;YACpE,iCAAiC,EAChC,OAAO,CAAC,GAAG,CAAC,iCAAiC;gBAC7C,OAAO,CAAC,GAAG,CAAC,0BAA0B;YACvC,2BAA2B,EAC1B,OAAO,CAAC,GAAG,CAAC,2BAA2B;gBACvC,OAAO,CAAC,GAAG,CAAC,oBAAoB;YACjC,mBAAmB,EAClB,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY;SAC5D,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,CAAC,oBAAoB;YAClC,MAAM,IAAI,KAAK,CACd,+DAA+D,CAC/D,CAAC;QAEH,IAAI,CAAC,SAAS,CAAC,qBAAqB;YACnC,MAAM,IAAI,KAAK,CACd,iEAAiE,CACjE,CAAC;QAEH,OAAO,SAAS,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,KAAK,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;YACjC,OAAO,CAAC,KAAK,CACZ,gCAAgC,EAChC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,cAAc,KAAK,CAAC,IAAI,EAAE,CAAC,CACxE,CAAC;QACH,CAAC;aAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;AACF,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;AAE9B,MAAM,CAAC,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC"} \ No newline at end of file +{"version":3,"file":"env.js","sourceRoot":"","sources":["../../../src/lib/env.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/lib/getConfiguration.js b/dist/src/lib/getConfiguration.js index 92d343f..b89722f 100644 --- a/dist/src/lib/getConfiguration.js +++ b/dist/src/lib/getConfiguration.js @@ -52,18 +52,23 @@ const getDestinationByMimeTypeConfiguration = (allowedMimeTypes) => { * @returns */ export default function getConfiguration(initialConfiguration) { - const { mainRoute = env.TWTKPR_DEFAULT_ROUTE, privateDirectory = env.TWTKPR_PRIVATE_DIRECTORY, publicDirectory = env.TWTKPR_PUBLIC_DIRECTORY, twtxtFilename = env.TWTKPR_TWTXT_FILENAME, postLimiterConfiguration, queryParameters, uploadConfiguration, } = initialConfiguration ?? {}; + const { mainRoute = env.TWTKPR_DEFAULT_ROUTE, pluginRoute = env.TWTKPR_PLUGIN_ROUTE, privateDirectory = env.TWTKPR_PRIVATE_DIRECTORY, publicDirectory = env.TWTKPR_PUBLIC_DIRECTORY, twtxtFilename = env.TWTKPR_TWTXT_FILENAME, postLimiterConfiguration, queryParameters, + // uploadConfiguration, + } = initialConfiguration ?? {}; const { active: postLimiterActive = env.TWTKPR_POST_LIMITER_ACTIVE, ...otherPostLimiterProps } = postLimiterConfiguration ?? {}; const { app = env.TWTKPR_QUERY_PARAMETER_APP, css = env.TWTKPR_QUERY_PARAMETER_CSS, following = env.TWTKPR_QUERY_PARAMETER_FOLLOWING, js = env.TWTKPR_QUERY_PARAMETER_JS, logout = env.TWTKPR_QUERY_PARAMETER_LOGOUT, metadata = env.TWTKPR_QUERY_PARAMETER_METADATA, twt = env.TWTKPR_QUERY_PARAMETER_TWT, twts = env.TWTKPR_QUERY_PARAMETER_TWTS, } = queryParameters ?? {}; - const { active: uploadActive = env.TWTKPR_UPLOAD_ACTIVE, allowEmptyFiles = env.TWTKPR_UPLOAD_ALLOW_EMPTY_FILES, allowedMimeTypes = env.TWTKPR_UPLOAD_ALLOWED_MIME_TYPES, createDirsFromUploads = env.TWTKPR_UPLOAD_CREATE_DIRS_FROM_UPLOADS, directory = env.TWTKPR_UPLOAD_DIRECTORY, encoding = env.TWTKPR_UPLOAD_ENCODING, fileWriteStreamHandler, filter = () => true, hashAlgorithm = env.TWTKPR_UPLOAD_HASH_ALGORITHM, keepExtensions = env.TWTKPR_UPLOAD_KEEP_EXTENSIONS, maxFields = env.TWTKPR_UPLOAD_MAX_FIELDS, maxFileSize = env.TWTKPR_UPLOAD_MAX_FIELDS_SIZE, maxFiles = env.TWTKPR_UPLOAD_MAX_FILES, maxTotalFileSize = env.TWTKPR_UPLOAD_MAX_TOTAL_FILE_SIZE, minFileSize = env.TWTKPR_UPLOAD_MIN_FILE_SIZE, route = env.TWTKPR_UPLOAD_ROUTE, } = uploadConfiguration ?? {}; return { // secrets cannot be provided through configuration file, must use ENV / .env accessSecret: env.TWTKPR_ACCESS_SECRET, refreshSecret: env.TWTKPR_REFRESH_SECRET, mainRoute, + pluginRoute, privateDirectory, publicDirectory, twtxtFilename, + plugins: { + ...(initialConfiguration?.plugins ?? {}), + }, postLimiterConfiguration: { active: postLimiterActive, ...(otherPostLimiterProps ?? {}), @@ -79,25 +84,6 @@ export default function getConfiguration(initialConfiguration) { twt, twts, }, - uploadConfiguration: { - ...uploadConfiguration, - active: uploadActive, - allowEmptyFiles, - allowedMimeTypes: getDestinationByMimeTypeConfiguration(allowedMimeTypes), - createDirsFromUploads, - directory, - encoding, - fileWriteStreamHandler, - filter, - hashAlgorithm: hashAlgorithm, - keepExtensions, - maxFields, - maxFileSize, - maxFiles, - maxTotalFileSize, - minFileSize, - route, - }, }; } //# sourceMappingURL=getConfiguration.js.map \ No newline at end of file diff --git a/dist/src/lib/getConfiguration.js.map b/dist/src/lib/getConfiguration.js.map index b8914df..4333a3e 100644 --- a/dist/src/lib/getConfiguration.js.map +++ b/dist/src/lib/getConfiguration.js.map @@ -1 +1 @@ -{"version":3,"file":"getConfiguration.js","sourceRoot":"","sources":["../../../src/lib/getConfiguration.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"getConfiguration.js","sourceRoot":"","sources":["../../../src/lib/getConfiguration.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/lib/twtxtCache.d.ts b/dist/src/lib/twtxtCache.d.ts index 90a2665..c1206d0 100644 --- a/dist/src/lib/twtxtCache.d.ts +++ b/dist/src/lib/twtxtCache.d.ts @@ -1,4 +1,3 @@ -import { NodeCache } from '@cacheable/node-cache'; import { TwtKprConfiguration } from '../types.js'; /** * @@ -6,6 +5,6 @@ import { TwtKprConfiguration } from '../types.js'; * @returns */ export default function twtxtCache({ publicDirectory, twtxtFilename, }: Pick): { - cache: NodeCache; + getFromCache: (key?: string) => Promise; reloadCache: () => Promise; }; diff --git a/dist/src/lib/twtxtCache.js b/dist/src/lib/twtxtCache.js index 541b6b2..a9c48f5 100644 --- a/dist/src/lib/twtxtCache.js +++ b/dist/src/lib/twtxtCache.js @@ -11,8 +11,20 @@ import { parseTwtxt } from 'twtxt-lib'; export default function twtxtCache({ publicDirectory, twtxtFilename, }) { let isLoaded = false; const debug = Debug('twtkpr:twtxtCache'); - const cache = new NodeCache(); - const reloadCache = async () => { + const defaultCacheOptions = { + stdTTL: 299, + checkperiod: 300, + }; + const cache = new NodeCache(defaultCacheOptions); + const getFromCache = async (key = '') => { + debug(`checking cache for key: ${key}`); + if (!key) + return undefined; + const value = cache.get(key); + if (value) + return value; + debug('Not found, reloading keys'); + cache.flushAll(); const fileText = await fsp.readFile(path.join(publicDirectory, twtxtFilename), 'utf8'); const parsedFile = parseTwtxt(fileText); Object.keys(parsedFile).forEach((key) => { @@ -21,10 +33,13 @@ export default function twtxtCache({ publicDirectory, twtxtFilename, }) { cache.set('source', fileText); debug(`cache ${isLoaded ? 're' : ''}loaded`); isLoaded = true; + return cache.get(key); + }; + const reloadCache = async () => { + cache.flushAll(); }; - reloadCache(); return { - cache, + getFromCache, reloadCache, }; } diff --git a/dist/src/lib/twtxtCache.js.map b/dist/src/lib/twtxtCache.js.map index 917b009..4eb6347 100644 --- a/dist/src/lib/twtxtCache.js.map +++ b/dist/src/lib/twtxtCache.js.map @@ -1 +1 @@ -{"version":3,"file":"twtxtCache.js","sourceRoot":"","sources":["../../../src/lib/twtxtCache.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,kBAAkB,CAAC;AACnC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGvC;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EAClC,eAAe,EACf,aAAa,GACmD;IAChE,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,MAAM,KAAK,GAAG,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAEzC,MAAM,KAAK,GAAG,IAAI,SAAS,EAAE,CAAC;IAE9B,MAAM,WAAW,GAAG,KAAK,IAAI,EAAE;QAC9B,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,QAAQ,CAClC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,EACzC,MAAM,CACN,CAAC;QAEF,MAAM,UAAU,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACvC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,GAA8B,CAAC,CAAC,CAAC,CAAC,aAAa;QAC1E,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC9B,KAAK,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAE7C,QAAQ,GAAG,IAAI,CAAC;IACjB,CAAC,CAAC;IAEF,WAAW,EAAE,CAAC;IAEd,OAAO;QACN,KAAK;QACL,WAAW;KACX,CAAC;AACH,CAAC"} \ No newline at end of file +{"version":3,"file":"twtxtCache.js","sourceRoot":"","sources":["../../../src/lib/twtxtCache.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,kBAAkB,CAAC;AACnC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,SAAS,EAAoB,MAAM,uBAAuB,CAAC;AACpE,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGvC;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EAClC,eAAe,EACf,aAAa,GACmD;IAChE,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,MAAM,KAAK,GAAG,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAEzC,MAAM,mBAAmB,GAAqB;QAC7C,MAAM,EAAE,GAAG;QACX,WAAW,EAAE,GAAG;KAChB,CAAC;IAEF,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,mBAAmB,CAAC,CAAC;IAEjD,MAAM,YAAY,GAAG,KAAK,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE;QACvC,KAAK,CAAC,2BAA2B,GAAG,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG;YAAE,OAAO,SAAS,CAAC;QAE3B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;QAExB,KAAK,CAAC,2BAA2B,CAAC,CAAC;QACnC,KAAK,CAAC,QAAQ,EAAE,CAAC;QAEjB,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,QAAQ,CAClC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,EACzC,MAAM,CACN,CAAC;QAEF,MAAM,UAAU,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACvC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,GAA8B,CAAC,CAAC,CAAC,CAAC,aAAa;QAC1E,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC9B,KAAK,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAE7C,QAAQ,GAAG,IAAI,CAAC;QAEhB,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,KAAK,IAAI,EAAE;QAC9B,KAAK,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO;QACN,YAAY;QACZ,WAAW;KACX,CAAC;AACH,CAAC"} \ No newline at end of file diff --git a/dist/src/lib/utils.d.ts b/dist/src/lib/utils.d.ts index e2d8814..c37dbd3 100644 --- a/dist/src/lib/utils.d.ts +++ b/dist/src/lib/utils.d.ts @@ -1,3 +1,5 @@ +import { PassThrough } from 'node:stream'; +export declare function combineStreams(streams: any[]): PassThrough; /** * * @param userId @@ -25,6 +27,12 @@ export declare const generateRefreshToken: (userId: string, secret?: string, ext * @returns */ export declare const getQueryParameterArray: (value?: unknown | unknown[]) => string[]; +/** + * + * @param pathToFile + * @returns + */ +export declare const getReadStream: (pathToFile: string) => import("node:fs").ReadStream; /** * * @param value diff --git a/dist/src/lib/utils.js b/dist/src/lib/utils.js index 6d5e7b3..33b4d91 100644 --- a/dist/src/lib/utils.js +++ b/dist/src/lib/utils.js @@ -1,7 +1,34 @@ import crypto from 'node:crypto'; +import { createReadStream } from 'node:fs'; import { readFile, writeFile } from 'node:fs/promises'; +import { PassThrough } from 'node:stream'; import jwt from 'jsonwebtoken'; import { v4 as uuidv4 } from 'uuid'; +async function combineWithPassthrough(sources, destination) { + for (const stream of sources) { + await new Promise((resolve, reject) => { + let s = stream; + if (typeof stream === 'function') { + s = stream(); + } + if (typeof s === 'string') { + destination.push(s); + destination.push(null); + resolve(true); + return; + } + s.pipe(destination, { end: false }); + s.on('end', resolve); + s.on('error', reject); + }); + } + destination.emit('end'); +} +export function combineStreams(streams) { + const stream = new PassThrough(); + combineWithPassthrough(streams, stream).catch((err) => stream.destroy(err)); + return stream; +} /** * * @param userId @@ -37,6 +64,20 @@ export const generateRefreshToken = (userId, secret = '', extendRefresh = false) export const getQueryParameterArray = (value = []) => Array.isArray(value) ? value.map((val) => `${val}`.trim()) : [`${value}`.trim()]; +/** + * + * @param pathToFile + * @returns + */ +export const getReadStream = (pathToFile) => { + const theStream = createReadStream(pathToFile); + theStream.on('error', (err) => { + console.error(err); + theStream.close(); + theStream.push(null); + }); + return theStream; +}; /** * * @param value diff --git a/dist/src/lib/utils.js.map b/dist/src/lib/utils.js.map index 86582bc..162ff7b 100644 --- a/dist/src/lib/utils.js.map +++ b/dist/src/lib/utils.js.map @@ -1 +1 @@ -{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,GAAG,MAAM,cAAc,CAAC;AAC/B,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAEpC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAAc,EAAE,MAAM,GAAG,EAAE,EAAE,EAAE,CAClE,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;AAExD;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAW,EAAE,EAAE,CAC3C,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAEvD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CACnC,MAAc,EACd,MAAM,GAAG,EAAE,EACX,aAAa,GAAG,KAAK,EACpB,EAAE;IACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,CAAC,kCAAkC;IAE5D,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE;QACvD,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;KACtC,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC;AACd,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,QAA6B,EAAE,EAAE,EAAE,CACzE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;IACnB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAExB;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAwB,EAAE,EAAE,CAChE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAEzD;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EAAE,QAAgB,EAAE,EAAE;IAC5D,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAChE,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AAC7B,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAC9B,QAAyB,EACzB,QAAgB,EACf,EAAE;IACH,MAAM,cAAc,GACnB,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAE7E,MAAM,SAAS,CAAC,QAAQ,EAAE,cAAc,EAAE;QACzC,QAAQ,EAAE,MAAM;QAChB,IAAI,EAAE,GAAG;KACT,CAAC,CAAC;AACJ,CAAC,CAAC"} \ No newline at end of file +{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/middlewares/postHandler/index.d.ts b/dist/src/middlewares/postHandler/index.d.ts index 401cc49..6c8743c 100644 --- a/dist/src/middlewares/postHandler/index.d.ts +++ b/dist/src/middlewares/postHandler/index.d.ts @@ -1 +1,2 @@ -export { default } from "./postHandler.js"; +export { default } from './postHandler.js'; +export { default as pluginPostHandler } from './pluginPostHandler.js'; diff --git a/dist/src/middlewares/postHandler/index.js b/dist/src/middlewares/postHandler/index.js index b29a439..d468144 100644 --- a/dist/src/middlewares/postHandler/index.js +++ b/dist/src/middlewares/postHandler/index.js @@ -1,2 +1,3 @@ -export { default } from "./postHandler.js"; +export { default } from './postHandler.js'; +export { default as pluginPostHandler } from './pluginPostHandler.js'; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/middlewares/postHandler/index.js.map b/dist/src/middlewares/postHandler/index.js.map index 4df61a0..61b2d65 100644 --- a/dist/src/middlewares/postHandler/index.js.map +++ b/dist/src/middlewares/postHandler/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/middlewares/postHandler/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/middlewares/postHandler/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,wBAAwB,CAAC"} \ No newline at end of file diff --git a/dist/src/middlewares/postHandler/memoryCache.d.ts b/dist/src/middlewares/postHandler/memoryCache.d.ts index 86edc7c..ba0a760 100644 --- a/dist/src/middlewares/postHandler/memoryCache.d.ts +++ b/dist/src/middlewares/postHandler/memoryCache.d.ts @@ -1,5 +1,4 @@ import type { NextFunction, Request, Response } from 'express'; -import NodeCache from '@cacheable/node-cache'; /** * * @param req @@ -9,4 +8,4 @@ import NodeCache from '@cacheable/node-cache'; * @param reloadCache * @returns */ -export default function memoryCache(req: Request, res: Response, next: NextFunction, cache: NodeCache, reloadCache: () => Promise): Promise; +export default function memoryCache(req: Request, res: Response, next: NextFunction, reloadCache: () => Promise): Promise; diff --git a/dist/src/middlewares/postHandler/memoryCache.js b/dist/src/middlewares/postHandler/memoryCache.js index a8ccafc..0b46aff 100644 --- a/dist/src/middlewares/postHandler/memoryCache.js +++ b/dist/src/middlewares/postHandler/memoryCache.js @@ -9,13 +9,15 @@ const debug = Debug('twtkpr:memoryCache'); * @param reloadCache * @returns */ -export default async function memoryCache(req, res, next, cache, reloadCache) { - if (cache.keys().length && !['DELETE', 'POST', 'PUT'].includes(req.method)) { +export default async function memoryCache(req, res, next, reloadCache) { + debug(req.method); + if (!['DELETE', 'POST', 'PUT'].includes(req.method)) { next(); return; } reloadCache() .then(() => { + debug('Cache reloaded'); next(); }) .catch((err) => { diff --git a/dist/src/middlewares/postHandler/memoryCache.js.map b/dist/src/middlewares/postHandler/memoryCache.js.map index 82373dc..0e7afbb 100644 --- a/dist/src/middlewares/postHandler/memoryCache.js.map +++ b/dist/src/middlewares/postHandler/memoryCache.js.map @@ -1 +1 @@ -{"version":3,"file":"memoryCache.js","sourceRoot":"","sources":["../../../../src/middlewares/postHandler/memoryCache.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,KAAK,GAAG,KAAK,CAAC,oBAAoB,CAAC,CAAC;AAE1C;;;;;;;;GAQG;AACH,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,WAAW,CACxC,GAAY,EACZ,GAAa,EACb,IAAkB,EAClB,KAAyB,EACzB,WAAgC;IAEhC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5E,IAAI,EAAE,CAAC;QACP,OAAO;IACR,CAAC;IAED,WAAW,EAAE;SACX,IAAI,CAAC,GAAG,EAAE;QACV,IAAI,EAAE,CAAC;IACR,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACd,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC"} \ No newline at end of file +{"version":3,"file":"memoryCache.js","sourceRoot":"","sources":["../../../../src/middlewares/postHandler/memoryCache.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,KAAK,GAAG,KAAK,CAAC,oBAAoB,CAAC,CAAC;AAE1C;;;;;;;;GAQG;AACH,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,WAAW,CACxC,GAAY,EACZ,GAAa,EACb,IAAkB,EAClB,WAAgC;IAEhC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAClB,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACrD,IAAI,EAAE,CAAC;QACP,OAAO;IACR,CAAC;IAED,WAAW,EAAE;SACX,IAAI,CAAC,GAAG,EAAE;QACV,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACxB,IAAI,EAAE,CAAC;IACR,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACd,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC"} \ No newline at end of file diff --git a/dist/src/middlewares/postHandler/pluginPostHandler.d.ts b/dist/src/middlewares/postHandler/pluginPostHandler.d.ts new file mode 100644 index 0000000..3eb5c52 --- /dev/null +++ b/dist/src/middlewares/postHandler/pluginPostHandler.d.ts @@ -0,0 +1,7 @@ +import { Request } from 'express'; +import { TwtKprPluginConfiguration } from '../../types.js'; +/** + * + * @param config * @returns + */ +export default function pluginPostHandler(plugins: TwtKprPluginConfiguration[] | undefined, verifyAuthRequest: (r: Request) => Promise, reloadCache?: () => Promise): import("express-serve-static-core").Router; diff --git a/dist/src/middlewares/postHandler/pluginPostHandler.js b/dist/src/middlewares/postHandler/pluginPostHandler.js new file mode 100644 index 0000000..17ceaf8 --- /dev/null +++ b/dist/src/middlewares/postHandler/pluginPostHandler.js @@ -0,0 +1,30 @@ +import Debug from 'debug'; +import express from 'express'; +const debug = Debug('twtkpr:postHandler'); +/** + * + * @param config * @returns + */ +export default function pluginPostHandler(plugins = [], verifyAuthRequest, reloadCache) { + const router = express.Router(); + const pluginRoutes = [].concat(...Object.keys(plugins) + .filter((key) => plugins[key] + ?.postRoutes?.length) + .map((key) => plugins[key] + .postRoutes)); + pluginRoutes.forEach(({ handler, path, requiresAuth }) => { + debug(`adding POST plugin router for ${path}`); + router.post(path, async (req, res, next) => { + debug(`handling POST plugin route to ${path}`); + if (requiresAuth && !(await verifyAuthRequest(req))) { + debug('auth check failed'); + next(); + return; + } + handler(req, res, next); + reloadCache?.(); + }); + }); + return router; +} +//# sourceMappingURL=pluginPostHandler.js.map \ No newline at end of file diff --git a/dist/src/middlewares/postHandler/pluginPostHandler.js.map b/dist/src/middlewares/postHandler/pluginPostHandler.js.map new file mode 100644 index 0000000..325212d --- /dev/null +++ b/dist/src/middlewares/postHandler/pluginPostHandler.js.map @@ -0,0 +1 @@ +{"version":3,"file":"pluginPostHandler.js","sourceRoot":"","sources":["../../../../src/middlewares/postHandler/pluginPostHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,OAA4C,MAAM,SAAS,CAAC;AAGnE,MAAM,KAAK,GAAG,KAAK,CAAC,oBAAoB,CAAC,CAAC;AAE1C;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,iBAAiB,CACxC,UAAuC,EAAE,EACzC,iBAAmD,EACnD,WAAiC;IAEjC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAEhC,MAAM,YAAY,GAAI,EAA0B,CAAC,MAAM,CACtD,GAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;SACtB,MAAM,CACN,CAAC,GAAG,EAAE,EAAE,CACN,OAAO,CAAC,GAA2B,CAA+B;QAClE,EAAE,UAAU,EAAE,MAAM,CACtB;SACA,GAAG,CACH,CAAC,GAAG,EAAE,EAAE,CACN,OAAO,CAAC,GAA2B,CAA+B;SACjE,UAAU,CACa,CAC5B,CAAC;IAEF,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE;QACxD,KAAK,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC;QAE/C,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YAC1C,KAAK,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC;YAE/C,IAAI,YAAY,IAAI,CAAC,CAAC,MAAM,iBAAiB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBACrD,KAAK,CAAC,mBAAmB,CAAC,CAAC;gBAC3B,IAAI,EAAE,CAAC;gBACP,OAAO;YACR,CAAC;YAED,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;YACxB,WAAW,EAAE,EAAE,CAAC;QACjB,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AACf,CAAC"} \ No newline at end of file diff --git a/dist/src/middlewares/postHandler/postHandler.d.ts b/dist/src/middlewares/postHandler/postHandler.d.ts index 9517e5a..5b75cc2 100644 --- a/dist/src/middlewares/postHandler/postHandler.d.ts +++ b/dist/src/middlewares/postHandler/postHandler.d.ts @@ -1,7 +1,7 @@ -import { TwtKprConfiguration } from '../../types.js'; +import { TwtKprConfiguration, TwtKprPluginConfiguration } from '../../types.js'; /** * * @param config * @returns */ -export default function postHandler(config: TwtKprConfiguration): import("express-serve-static-core").Router; +export default function postHandler(config: TwtKprConfiguration, plugins?: TwtKprPluginConfiguration[], reloadCache?: () => Promise): import("express-serve-static-core").Router; diff --git a/dist/src/middlewares/postHandler/postHandler.js b/dist/src/middlewares/postHandler/postHandler.js index d2b570d..9274418 100644 --- a/dist/src/middlewares/postHandler/postHandler.js +++ b/dist/src/middlewares/postHandler/postHandler.js @@ -13,7 +13,7 @@ const debug = Debug('twtkpr:postHandler'); * @param config * @returns */ -export default function postHandler(config) { +export default function postHandler(config, plugins = [], reloadCache) { const { postLimiterConfiguration } = config; const { active: isLimiterActive, ...otherLimiterProps } = postLimiterConfiguration ?? {}; const postLimiter = isLimiterActive @@ -49,8 +49,11 @@ export default function postHandler(config) { return; } debug('auth check succeeded'); - if (type === 'twt' || content) - return twt(req, res, config); + if (type === 'twt' || content) { + twt(req, res, config, plugins); + reloadCache?.(); + return; + } if (type === 'editFile') return editFile(req, res, config); next(); diff --git a/dist/src/middlewares/postHandler/postHandler.js.map b/dist/src/middlewares/postHandler/postHandler.js.map index a13f01c..5d016b1 100644 --- a/dist/src/middlewares/postHandler/postHandler.js.map +++ b/dist/src/middlewares/postHandler/postHandler.js.map @@ -1 +1 @@ -{"version":3,"file":"postHandler.js","sourceRoot":"","sources":["../../../../src/middlewares/postHandler/postHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,OAA4C,MAAM,SAAS,CAAC;AACnE,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAE3C,OAAO,SAAS,MAAM,mCAAmC,CAAC;AAE1D,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,QAAQ,MAAM,2BAA2B,CAAC;AAEjD,MAAM,KAAK,GAAG,KAAK,CAAC,oBAAoB,CAAC,CAAC;AAE1C;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,MAA2B;IAC9D,MAAM,EAAE,wBAAwB,EAAE,GAAG,MAAM,CAAC;IAC5C,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,iBAAiB,EAAE,GACtD,wBAAwB,IAAI,EAAE,CAAC;IAEhC,MAAM,WAAW,GAAG,eAAe;QAClC,CAAC,CAAC,SAAS,CAAC;YACV,GAAG,iBAAiB;SACpB,CAAC;QACH,CAAC,CAAC,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;YACpD,IAAI,EAAE,CAAC;QACR,CAAC,CAAC;IAEJ,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;IAE7B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAEhC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACtD,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QACzC,KAAK,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAExC,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvB,KAAK,CAAC,aAAa,CAAC,CAAC;YACrB,GAAG,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;YAChC,GAAG,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;YAC/B,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YACxB,OAAO;QACR,CAAC;QAED,IAAI,IAAI,KAAK,OAAO;YAAE,OAAO,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACrD,IAAI,IAAI,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACvD,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAEzD,KAAK,CAAC,eAAe,CAAC,CAAC;QACvB,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAChD,IAAI,CAAC,UAAU,EAAE,CAAC;YACjB,KAAK,CAAC,mBAAmB,CAAC,CAAC;YAC3B,IAAI,EAAE,CAAC;YACP,OAAO;QACR,CAAC;QACD,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAE9B,IAAI,IAAI,KAAK,KAAK,IAAI,OAAO;YAAE,OAAO,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAC5D,IAAI,IAAI,KAAK,UAAU;YAAE,OAAO,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAE3D,IAAI,EAAE,CAAC;IACR,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AACf,CAAC"} \ No newline at end of file +{"version":3,"file":"postHandler.js","sourceRoot":"","sources":["../../../../src/middlewares/postHandler/postHandler.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/middlewares/postHandler/refresh.js b/dist/src/middlewares/postHandler/refresh.js index fd2ad7a..e69955f 100644 --- a/dist/src/middlewares/postHandler/refresh.js +++ b/dist/src/middlewares/postHandler/refresh.js @@ -11,32 +11,33 @@ const debug = Debug('twtkpr:refresh'); * @param res */ export default async function refresh(req, res, config) { - const send401 = (message) => { + const sendError = (message, code = 401) => { debug(message); res .clearCookie('accessToken') .clearCookie('refreshToken') - .status(401) + .status(code) .send(message ?? 'Unauthorized'); return; }; try { const tokens = await refreshTokensDB(config.privateDirectory); const oldToken = req.cookies.refreshToken; - debug(oldToken); + debug(`Using old token: ${oldToken}`); if (!oldToken) - return send401('Unauthorized'); + return sendError('Unauthorized'); let decoded = { id: '' }; try { decoded = jwt.verify(oldToken, config.refreshSecret); - debug({ decoded }); + debug('Decoded token: ', { decoded }); } catch (err) { - return send401('Refresh token invalid'); + debug('Error decoding refresh token:', err); + return sendError('Refresh token invalid', 403); } const username = req.username ?? decoded.id; if (!username) - return send401('Missing username'); + return sendError('Missing username'); const currentTime = Math.floor(Date.now() / 1000); // cleanup tokens on load const validTokens = (tokens.get(decoded.id) ?? []).filter((token) => { @@ -46,11 +47,11 @@ export default async function refresh(req, res, config) { // If token is invalid or not the latest one if (!validTokens.includes(oldToken)) { debug('token missing from list'); - return send401('Invalid refresh token'); + return sendError('Invalid refresh token'); } debug('generating new tokens'); const newAccessToken = generateAccessToken(req.username || decoded.id, config.accessSecret); - const newRefreshToken = generateRefreshToken(req.username || decoded.id, config.refreshSecret); + const newRefreshToken = generateRefreshToken(req.username || decoded.id, config.refreshSecret, !!req.query.rememberToggle); debug('updating token list'); tokens.set(req.username || decoded.id, validTokens .filter((token) => token !== oldToken) diff --git a/dist/src/middlewares/postHandler/refresh.js.map b/dist/src/middlewares/postHandler/refresh.js.map index ae21e4f..7fd1126 100644 --- a/dist/src/middlewares/postHandler/refresh.js.map +++ b/dist/src/middlewares/postHandler/refresh.js.map @@ -1 +1 @@ -{"version":3,"file":"refresh.js","sourceRoot":"","sources":["../../../../src/middlewares/postHandler/refresh.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,cAAc,CAAC;AAE/B,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,eAAe,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EACN,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,GACpB,MAAM,oBAAoB,CAAC;AAG5B,MAAM,KAAK,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC;AAEtC;;;;;GAKG;AACH,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,OAAO,CACpC,GAAY,EACZ,GAAa,EACb,MAA2B;IAE3B,MAAM,OAAO,GAAG,CAAC,OAAe,EAAE,EAAE;QACnC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEf,GAAG;aACD,WAAW,CAAC,aAAa,CAAC;aAC1B,WAAW,CAAC,cAAc,CAAC;aAC3B,MAAM,CAAC,GAAG,CAAC;aACX,IAAI,CAAC,OAAO,IAAI,cAAc,CAAC,CAAC;QAElC,OAAO;IACR,CAAC,CAAC;IAEF,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC;QAE1C,KAAK,CAAC,QAAQ,CAAC,CAAC;QAEhB,IAAI,CAAC,QAAQ;YAAE,OAAO,OAAO,CAAC,cAAc,CAAC,CAAC;QAE9C,IAAI,OAAO,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;QAEzB,IAAI,CAAC;YACJ,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,aAAa,CAElD,CAAC;YAEF,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QACpB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,OAAO,OAAO,CAAC,uBAAuB,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,EAAE,CAAC;QAE5C,IAAI,CAAC,QAAQ;YAAE,OAAO,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAElD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAElD,yBAAyB;QACzB,MAAM,WAAW,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;YACnE,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9B,OAAO,GAAG,IAAI,CAAE,GAAsB,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,WAAW,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,4CAA4C;QAC5C,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrC,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACjC,OAAO,OAAO,CAAC,uBAAuB,CAAC,CAAC;QACzC,CAAC;QAED,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAE/B,MAAM,cAAc,GAAG,mBAAmB,CACzC,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,EAAE,EAC1B,MAAM,CAAC,YAAY,CACnB,CAAC;QAEF,MAAM,eAAe,GAAG,oBAAoB,CAC3C,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,EAAE,EAC1B,MAAM,CAAC,aAAa,CACpB,CAAC;QAEF,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAC7B,MAAM,CAAC,GAAG,CACT,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,EAAE,EAC1B,WAAW;aACT,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,QAAQ,CAAC;aACrC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAC3B,CAAC;QAEF,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACxD,GAAG,CAAC,MAAM,CAAC,cAAc,EAAE,eAAe,EAAE;YAC3C,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,GAAG,CAAC,QAAQ,KAAK,YAAY;YACrC,QAAQ,EAAE,QAAQ;YAClB,mBAAmB;YACnB,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;SAClE,CAAC,CAAC;QAEH,sCAAsC;QACtC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAC7B,GAAG;aACD,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,cAAc,CAAC,CAAC;aACzC,MAAM,CAAC,GAAG,CAAC;aACX,IAAI,CAAC,cAAc,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IACvB,CAAC;AACF,CAAC"} \ No newline at end of file +{"version":3,"file":"refresh.js","sourceRoot":"","sources":["../../../../src/middlewares/postHandler/refresh.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/middlewares/postHandler/twt.d.ts b/dist/src/middlewares/postHandler/twt.d.ts index ad7e342..4db0667 100644 --- a/dist/src/middlewares/postHandler/twt.d.ts +++ b/dist/src/middlewares/postHandler/twt.d.ts @@ -1,9 +1,9 @@ import type { Request, Response } from 'express'; -import { TwtKprConfiguration } from '../../types.js'; +import { TwtKprConfiguration, TwtKprPluginConfiguration } from '../../types.js'; /** * Creates a new twt, appending it to the bottom of the TWTXT file * * @param req * @param res */ -export default function twt(req: Request, res: Response, config: TwtKprConfiguration): void; +export default function twt(req: Request, res: Response, config: TwtKprConfiguration, plugins?: TwtKprPluginConfiguration[]): void; diff --git a/dist/src/middlewares/postHandler/twt.js b/dist/src/middlewares/postHandler/twt.js index b51bd50..6f888e8 100644 --- a/dist/src/middlewares/postHandler/twt.js +++ b/dist/src/middlewares/postHandler/twt.js @@ -1,21 +1,33 @@ -import dayjs from 'dayjs'; import fs from 'node:fs'; import { join } from 'node:path'; +import dayjs from 'dayjs'; +import Debug from 'debug'; +const debug = Debug('twtkpr:twt'); /** * Creates a new twt, appending it to the bottom of the TWTXT file * * @param req * @param res */ -export default function twt(req, res, config) { +export default function twt(req, res, config, plugins = []) { + debug('Beginning twt add'); const { content } = req.body ?? {}; const date = dayjs().format(); const twt = `${date}\t${content.trim()}\n`; + debug(`Formatted twt: ${twt}`); + debug('Beginning stream...'); const stream = fs.createWriteStream(join(config.publicDirectory, config.twtxtFilename), { flags: 'a', }); stream.write(twt); stream.end(); + debug('Streaming complete'); + plugins.forEach(async (plugin) => { + if (!plugin.onAfterTwt) + return; + debug(`Handling plugin onAfterTwt function${plugin.name ? ' from ' + plugin.name : ''}`); + plugin.onAfterTwt(twt); + }); res.status(200).send(twt); } //# sourceMappingURL=twt.js.map \ No newline at end of file diff --git a/dist/src/middlewares/postHandler/twt.js.map b/dist/src/middlewares/postHandler/twt.js.map index 22031d4..01c6f41 100644 --- a/dist/src/middlewares/postHandler/twt.js.map +++ b/dist/src/middlewares/postHandler/twt.js.map @@ -1 +1 @@ -{"version":3,"file":"twt.js","sourceRoot":"","sources":["../../../../src/middlewares/postHandler/twt.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,GAAG,CAC1B,GAAY,EACZ,GAAa,EACb,MAA2B;IAE3B,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;IAEnC,MAAM,IAAI,GAAG,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC;IAC9B,MAAM,GAAG,GAAG,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC;IAE3C,MAAM,MAAM,GAAG,EAAE,CAAC,iBAAiB,CAClC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,aAAa,CAAC,EAClD;QACC,KAAK,EAAE,GAAG;KACV,CACD,CAAC;IAEF,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,MAAM,CAAC,GAAG,EAAE,CAAC;IAEb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC"} \ No newline at end of file +{"version":3,"file":"twt.js","sourceRoot":"","sources":["../../../../src/middlewares/postHandler/twt.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC;AAElC;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,GAAG,CAC1B,GAAY,EACZ,GAAa,EACb,MAA2B,EAC3B,UAAuC,EAAE;IAEzC,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAE3B,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;IAEnC,MAAM,IAAI,GAAG,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC;IAC9B,MAAM,GAAG,GAAG,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC;IAE3C,KAAK,CAAC,kBAAkB,GAAG,EAAE,CAAC,CAAC;IAE/B,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,EAAE,CAAC,iBAAiB,CAClC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,aAAa,CAAC,EAClD;QACC,KAAK,EAAE,GAAG;KACV,CACD,CAAC;IAEF,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,MAAM,CAAC,GAAG,EAAE,CAAC;IAEb,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAE5B,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QAChC,IAAI,CAAC,MAAM,CAAC,UAAU;YAAE,OAAO;QAE/B,KAAK,CACJ,sCACC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EACxC,EAAE,CACF,CAAC;QAEF,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC"} \ No newline at end of file diff --git a/dist/src/middlewares/putHandler/index.d.ts b/dist/src/middlewares/putHandler/index.d.ts index 30a6615..e352d23 100644 --- a/dist/src/middlewares/putHandler/index.d.ts +++ b/dist/src/middlewares/putHandler/index.d.ts @@ -1 +1,2 @@ -export { default } from "./putHandler.js"; +export { default } from './putHandler.js'; +export { default as pluginPutHandler } from './pluginPutHandler.js'; diff --git a/dist/src/middlewares/putHandler/index.js b/dist/src/middlewares/putHandler/index.js index 4c74a05..bd388ca 100644 --- a/dist/src/middlewares/putHandler/index.js +++ b/dist/src/middlewares/putHandler/index.js @@ -1,2 +1,3 @@ -export { default } from "./putHandler.js"; +export { default } from './putHandler.js'; +export { default as pluginPutHandler } from './pluginPutHandler.js'; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/src/middlewares/putHandler/index.js.map b/dist/src/middlewares/putHandler/index.js.map index 4b6b302..126d5a5 100644 --- a/dist/src/middlewares/putHandler/index.js.map +++ b/dist/src/middlewares/putHandler/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/middlewares/putHandler/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/middlewares/putHandler/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"} \ No newline at end of file diff --git a/dist/src/middlewares/putHandler/pluginPutHandler.d.ts b/dist/src/middlewares/putHandler/pluginPutHandler.d.ts new file mode 100644 index 0000000..0b73e25 --- /dev/null +++ b/dist/src/middlewares/putHandler/pluginPutHandler.d.ts @@ -0,0 +1,8 @@ +import { Request } from 'express'; +import { TwtKprPluginConfiguration } from '../../types.js'; +/** + * + * @param plugins + * @returns + */ +export default function pluginPutHandler(plugins: TwtKprPluginConfiguration[] | undefined, verifyAuthRequest: (r: Request) => Promise, reloadCache?: () => Promise): import("express-serve-static-core").Router; diff --git a/dist/src/middlewares/putHandler/pluginPutHandler.js b/dist/src/middlewares/putHandler/pluginPutHandler.js new file mode 100644 index 0000000..2791c0c --- /dev/null +++ b/dist/src/middlewares/putHandler/pluginPutHandler.js @@ -0,0 +1,31 @@ +import Debug from 'debug'; +import express from 'express'; +const debug = Debug('twtkpr:postHandler'); +/** + * + * @param plugins + * @returns + */ +export default function pluginPutHandler(plugins = [], verifyAuthRequest, reloadCache) { + const router = express.Router(); + const pluginRoutes = [].concat(...Object.keys(plugins) + .filter((key) => plugins[key] + ?.putRoutes?.length) + .map((key) => plugins[key] + .putRoutes)); + pluginRoutes.forEach(({ handler, path, requiresAuth }) => { + debug(`adding PUT plugin router for ${path}`); + router.put(path, async (req, res, next) => { + debug(`handling PUT plugin route to ${path}`); + if (requiresAuth && !(await verifyAuthRequest(req))) { + debug('auth check failed'); + next(); + return; + } + handler(req, res, next); + reloadCache?.(); + }); + }); + return router; +} +//# sourceMappingURL=pluginPutHandler.js.map \ No newline at end of file diff --git a/dist/src/middlewares/putHandler/pluginPutHandler.js.map b/dist/src/middlewares/putHandler/pluginPutHandler.js.map new file mode 100644 index 0000000..13cb7ba --- /dev/null +++ b/dist/src/middlewares/putHandler/pluginPutHandler.js.map @@ -0,0 +1 @@ +{"version":3,"file":"pluginPutHandler.js","sourceRoot":"","sources":["../../../../src/middlewares/putHandler/pluginPutHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,OAA4C,MAAM,SAAS,CAAC;AAGnE,MAAM,KAAK,GAAG,KAAK,CAAC,oBAAoB,CAAC,CAAC;AAE1C;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,gBAAgB,CACvC,UAAuC,EAAE,EACzC,iBAAmD,EACnD,WAAiC;IAEjC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAEhC,MAAM,YAAY,GAAI,EAA0B,CAAC,MAAM,CACtD,GAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;SACtB,MAAM,CACN,CAAC,GAAG,EAAE,EAAE,CACN,OAAO,CAAC,GAA2B,CAA+B;QAClE,EAAE,SAAS,EAAE,MAAM,CACrB;SACA,GAAG,CACH,CAAC,GAAG,EAAE,EAAE,CACN,OAAO,CAAC,GAA2B,CAA+B;SACjE,SAAS,CACc,CAC5B,CAAC;IAEF,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE;QACxD,KAAK,CAAC,gCAAgC,IAAI,EAAE,CAAC,CAAC;QAE9C,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YACzC,KAAK,CAAC,gCAAgC,IAAI,EAAE,CAAC,CAAC;YAE9C,IAAI,YAAY,IAAI,CAAC,CAAC,MAAM,iBAAiB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBACrD,KAAK,CAAC,mBAAmB,CAAC,CAAC;gBAC3B,IAAI,EAAE,CAAC;gBACP,OAAO;YACR,CAAC;YAED,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;YAExB,WAAW,EAAE,EAAE,CAAC;QACjB,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AACf,CAAC"} \ No newline at end of file diff --git a/dist/src/middlewares/putHandler/putHandler.d.ts b/dist/src/middlewares/putHandler/putHandler.d.ts index 4ee6522..fd8728e 100644 --- a/dist/src/middlewares/putHandler/putHandler.d.ts +++ b/dist/src/middlewares/putHandler/putHandler.d.ts @@ -1,7 +1,7 @@ -import { TwtKprConfiguration } from '../../types.js'; +import { TwtKprConfiguration, TwtKprPluginConfiguration } from '../../types.js'; /** * * @param config * @returns */ -export default function putHandler(config: TwtKprConfiguration): import("express-serve-static-core").Router; +export default function putHandler(config: TwtKprConfiguration, plugins?: TwtKprPluginConfiguration[], reloadCache?: () => Promise): import("express-serve-static-core").Router; diff --git a/dist/src/middlewares/putHandler/putHandler.js b/dist/src/middlewares/putHandler/putHandler.js index 66a37a0..f8b3f16 100644 --- a/dist/src/middlewares/putHandler/putHandler.js +++ b/dist/src/middlewares/putHandler/putHandler.js @@ -8,7 +8,7 @@ const debug = Debug('twtkpr:putHandler'); * @param config * @returns */ -export default function putHandler(config) { +export default function putHandler(config, plugins = [], reloadCache) { const router = express.Router(); router.put('/', (req, res, next) => { debug('put', { path: req.path }); @@ -19,7 +19,8 @@ export default function putHandler(config) { return; } debug('auth check succeeded'); - return editFile(req, res, config); + editFile(req, res, config); + reloadCache?.(); }); return router; } diff --git a/dist/src/middlewares/putHandler/putHandler.js.map b/dist/src/middlewares/putHandler/putHandler.js.map index 1dcbf6b..5decf53 100644 --- a/dist/src/middlewares/putHandler/putHandler.js.map +++ b/dist/src/middlewares/putHandler/putHandler.js.map @@ -1 +1 @@ -{"version":3,"file":"putHandler.js","sourceRoot":"","sources":["../../../../src/middlewares/putHandler/putHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,SAAS,MAAM,mCAAmC,CAAC;AAE1D,OAAO,QAAQ,MAAM,eAAe,CAAC;AAErC,MAAM,KAAK,GAAG,KAAK,CAAC,mBAAmB,CAAC,CAAC;AAEzC;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,MAA2B;IAC7D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAEhC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAClC,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAEjC,KAAK,CAAC,eAAe,CAAC,CAAC;QAEvB,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC;YAC7B,KAAK,CAAC,mBAAmB,CAAC,CAAC;YAC3B,IAAI,EAAE,CAAC;YACP,OAAO;QACR,CAAC;QAED,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAE9B,OAAO,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AACf,CAAC"} \ No newline at end of file +{"version":3,"file":"putHandler.js","sourceRoot":"","sources":["../../../../src/middlewares/putHandler/putHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,SAAS,MAAM,mCAAmC,CAAC;AAE1D,OAAO,QAAQ,MAAM,eAAe,CAAC;AAErC,MAAM,KAAK,GAAG,KAAK,CAAC,mBAAmB,CAAC,CAAC;AAEzC;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,UAAU,CACjC,MAA2B,EAC3B,UAAuC,EAAE,EACzC,WAAiC;IAEjC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAEhC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAClC,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAEjC,KAAK,CAAC,eAAe,CAAC,CAAC;QAEvB,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC;YAC7B,KAAK,CAAC,mBAAmB,CAAC,CAAC;YAC3B,IAAI,EAAE,CAAC;YACP,OAAO;QACR,CAAC;QAED,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAE9B,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAE3B,WAAW,EAAE,EAAE,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AACf,CAAC"} \ No newline at end of file diff --git a/dist/src/middlewares/queryHandler/followingHandler.d.ts b/dist/src/middlewares/queryHandler/followingHandler.d.ts index 7c82529..64417c2 100644 --- a/dist/src/middlewares/queryHandler/followingHandler.d.ts +++ b/dist/src/middlewares/queryHandler/followingHandler.d.ts @@ -1,6 +1,6 @@ import type { Request, Response } from 'express'; +import type { Twttr } from 'twtxt-lib'; import { QueryParameters } from '../../types.js'; -import NodeCache from '@cacheable/node-cache'; /** * * @param req @@ -8,4 +8,4 @@ import NodeCache from '@cacheable/node-cache'; * @param cache * @param followingParameter */ -export default function followingHandler(req: Request, res: Response, cache: NodeCache, followingParameter: QueryParameters['following']): void; +export default function followingHandler(req: Request, res: Response, following: Twttr[], followingParameter: QueryParameters['following']): void; diff --git a/dist/src/middlewares/queryHandler/followingHandler.js b/dist/src/middlewares/queryHandler/followingHandler.js index 691c274..8de4944 100644 --- a/dist/src/middlewares/queryHandler/followingHandler.js +++ b/dist/src/middlewares/queryHandler/followingHandler.js @@ -6,7 +6,7 @@ import { generateEtag, getQueryParameterArray, getValueOrFirstEntry, } from '../ * @param cache * @param followingParameter */ -export default function followingHandler(req, res, cache, followingParameter) { +export default function followingHandler(req, res, following, followingParameter) { const followingsToMatch = getQueryParameterArray(req.query[followingParameter]); const nicksToMatch = getQueryParameterArray(req.query.nick); const urlsToMatch = getQueryParameterArray(req.query.url); @@ -20,7 +20,7 @@ export default function followingHandler(req, res, cache, followingParameter) { res.set('content-type', 'application/json'); else res.set('content-type', 'text/plain'); - const matchedFollowing = cache.get('following').filter(({ nick, url }) => (!followingsToMatch.length || + const matchedFollowing = following.filter(({ nick, url }) => (!followingsToMatch.length || (followingsToMatch.length === 1 && followingsToMatch[0] === '') || followingsToMatch.includes(nick) || followingsToMatch.includes(`@${nick}`) || diff --git a/dist/src/middlewares/queryHandler/followingHandler.js.map b/dist/src/middlewares/queryHandler/followingHandler.js.map index 82e0a16..8bb4dd1 100644 --- a/dist/src/middlewares/queryHandler/followingHandler.js.map +++ b/dist/src/middlewares/queryHandler/followingHandler.js.map @@ -1 +1 @@ -{"version":3,"file":"followingHandler.js","sourceRoot":"","sources":["../../../../src/middlewares/queryHandler/followingHandler.ts"],"names":[],"mappings":"AAGA,OAAO,EACN,YAAY,EACZ,sBAAsB,EACtB,oBAAoB,GACpB,MAAM,oBAAoB,CAAC;AAI5B;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,UAAU,gBAAgB,CACvC,GAAY,EACZ,GAAa,EACb,KAAyB,EACzB,kBAAgD;IAEhD,MAAM,iBAAiB,GAAG,sBAAsB,CAC/C,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAC7B,CAAC;IAEF,MAAM,YAAY,GAAG,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5D,MAAM,WAAW,GAAG,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE1D,MAAM,kBAAkB,GAAG;QAC1B,GAAG,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;QAC3C,GAAG,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;KACtC,CAAC;IAEF,MAAM,SAAS,GACd,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC;QACd,oBAAoB,CAAC,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,MAAM,CAAC;IAC3E,IAAI,SAAS;QAAE,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;;QACtD,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IAE3C,MAAM,gBAAgB,GAAI,KAAK,CAAC,GAAG,CAAC,WAAW,CAAa,CAAC,MAAM,CAClE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,CACjB,CAAC,CAAC,iBAAiB,CAAC,MAAM;QACzB,CAAC,iBAAiB,CAAC,MAAM,KAAK,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QAC/D,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC;QAChC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;QACtC,iBAAiB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC,CAAC,YAAY,CAAC,MAAM;YACpB,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC3B,YAAY,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACnC,CAAC,CAAC,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAClD,CAAC,CAAC,kBAAkB,CAAC,MAAM;YAC1B,kBAAkB,CAAC,IAAI,CACtB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CACnD,CAAC,CACJ,CAAC;IAEF,MAAM,MAAM,GAAG,SAAS;QACvB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC;QAClC,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEzE,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACpD,CAAC"} \ No newline at end of file +{"version":3,"file":"followingHandler.js","sourceRoot":"","sources":["../../../../src/middlewares/queryHandler/followingHandler.ts"],"names":[],"mappings":"AAGA,OAAO,EACN,YAAY,EACZ,sBAAsB,EACtB,oBAAoB,GACpB,MAAM,oBAAoB,CAAC;AAI5B;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,UAAU,gBAAgB,CACvC,GAAY,EACZ,GAAa,EACb,SAAkB,EAClB,kBAAgD;IAEhD,MAAM,iBAAiB,GAAG,sBAAsB,CAC/C,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAC7B,CAAC;IAEF,MAAM,YAAY,GAAG,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5D,MAAM,WAAW,GAAG,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE1D,MAAM,kBAAkB,GAAG;QAC1B,GAAG,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;QAC3C,GAAG,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;KACtC,CAAC;IAEF,MAAM,SAAS,GACd,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC;QACd,oBAAoB,CAAC,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,MAAM,CAAC;IAC3E,IAAI,SAAS;QAAE,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;;QACtD,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IAE3C,MAAM,gBAAgB,GAAG,SAAS,CAAC,MAAM,CACxC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,CACjB,CAAC,CAAC,iBAAiB,CAAC,MAAM;QACzB,CAAC,iBAAiB,CAAC,MAAM,KAAK,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QAC/D,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC;QAChC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;QACtC,iBAAiB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC,CAAC,YAAY,CAAC,MAAM;YACpB,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC3B,YAAY,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACnC,CAAC,CAAC,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAClD,CAAC,CAAC,kBAAkB,CAAC,MAAM;YAC1B,kBAAkB,CAAC,IAAI,CACtB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CACnD,CAAC,CACJ,CAAC;IAEF,MAAM,MAAM,GAAG,SAAS;QACvB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC;QAClC,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEzE,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACpD,CAAC"} \ No newline at end of file diff --git a/dist/src/middlewares/queryHandler/metadataHandler.d.ts b/dist/src/middlewares/queryHandler/metadataHandler.d.ts index 53a3eae..de2953b 100644 --- a/dist/src/middlewares/queryHandler/metadataHandler.d.ts +++ b/dist/src/middlewares/queryHandler/metadataHandler.d.ts @@ -1,5 +1,6 @@ import type { Request, Response } from 'express'; -import NodeCache from '@cacheable/node-cache'; +import type { Metadata } from 'twtxt-lib'; +import { NodeCache } from '@cacheable/node-cache'; import { QueryParameters } from '../../types.js'; export interface MetadataHandler { cache: NodeCache; @@ -14,4 +15,4 @@ export interface MetadataHandler { * @param cache * @param metadataParameter */ -export default function metadataHandler(req: Request, res: Response, cache: NodeCache, metadataParameter: QueryParameters['metadata']): void; +export default function metadataHandler(req: Request, res: Response, metadata: Metadata, metadataParameter: QueryParameters['metadata']): void; diff --git a/dist/src/middlewares/queryHandler/metadataHandler.js b/dist/src/middlewares/queryHandler/metadataHandler.js index 8d3348d..5b38b1e 100644 --- a/dist/src/middlewares/queryHandler/metadataHandler.js +++ b/dist/src/middlewares/queryHandler/metadataHandler.js @@ -6,13 +6,12 @@ import { generateEtag, getQueryParameterArray, getValueOrFirstEntry, } from '../ * @param cache * @param metadataParameter */ -export default function metadataHandler(req, res, cache, metadataParameter) { +export default function metadataHandler(req, res, metadata, metadataParameter) { const metadataToMatch = getQueryParameterArray(req.query[metadataParameter]); const searchTermsToMatch = [ ...getQueryParameterArray(req.query.search), ...getQueryParameterArray(req.query.s), ]; - const metadata = cache.get('metadata') ?? {}; const wantsJson = req.is('json') || getValueOrFirstEntry(getQueryParameterArray(req.query.format)) === 'json'; if (wantsJson) diff --git a/dist/src/middlewares/queryHandler/metadataHandler.js.map b/dist/src/middlewares/queryHandler/metadataHandler.js.map index 4d9f63c..eefd040 100644 --- a/dist/src/middlewares/queryHandler/metadataHandler.js.map +++ b/dist/src/middlewares/queryHandler/metadataHandler.js.map @@ -1 +1 @@ -{"version":3,"file":"metadataHandler.js","sourceRoot":"","sources":["../../../../src/middlewares/queryHandler/metadataHandler.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"metadataHandler.js","sourceRoot":"","sources":["../../../../src/middlewares/queryHandler/metadataHandler.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/middlewares/queryHandler/queryHandler.d.ts b/dist/src/middlewares/queryHandler/queryHandler.d.ts index 16d3a7f..8b358f3 100644 --- a/dist/src/middlewares/queryHandler/queryHandler.d.ts +++ b/dist/src/middlewares/queryHandler/queryHandler.d.ts @@ -1,6 +1,5 @@ -import NodeCache from '@cacheable/node-cache'; import type { NextFunction, Request, Response } from 'express'; -import { TwtKprConfiguration } from '../../types.js'; +import { TwtKprConfiguration, TwtKprPluginConfiguration } from '../../types.js'; /** * * @param config @@ -8,4 +7,4 @@ import { TwtKprConfiguration } from '../../types.js'; * @param verifyAuthRequest * @returns */ -export default function queryHandler(config: TwtKprConfiguration, cache: NodeCache, verifyAuthRequest: (r: Request) => Promise): (req: Request, res: Response, next: NextFunction) => Promise; +export default function queryHandler(config: TwtKprConfiguration, getFromCache: (key?: string) => Promise, verifyAuthRequest: (r: Request) => Promise, plugins?: TwtKprPluginConfiguration[]): (req: Request, res: Response, next: NextFunction) => Promise; diff --git a/dist/src/middlewares/queryHandler/queryHandler.js b/dist/src/middlewares/queryHandler/queryHandler.js index 4073aa6..9249446 100644 --- a/dist/src/middlewares/queryHandler/queryHandler.js +++ b/dist/src/middlewares/queryHandler/queryHandler.js @@ -1,7 +1,8 @@ +import fs from 'node:fs'; import path from 'node:path'; import Debug from 'debug'; import { __dirname } from '../../lib/constants.js'; -import { generateEtag } from '../../lib/utils.js'; +import { combineStreams, generateEtag } from '../../lib/utils.js'; import renderApp from '../renderApp/index.js'; import followingHandler from './followingHandler.js'; import metadataHandler from './metadataHandler.js'; @@ -14,44 +15,89 @@ const debug = Debug('twtkpr:queryHandler'); * @param verifyAuthRequest * @returns */ -export default function queryHandler(config, cache, verifyAuthRequest) { - const { mainRoute, queryParameters, uploadConfiguration } = config; +export default function queryHandler(config, getFromCache, verifyAuthRequest, plugins = []) { + const { mainRoute, queryParameters } = config; + const getPluginStreams = (type) => plugins.filter((plugin) => !!plugin[type]).map((plugin) => plugin[type]); return async (req, res, next) => { - debug({ query: JSON.stringify(req.query) }); + debug(`handling query`, JSON.stringify(req.query)); if (!Object.keys(req.query).length) { next(); return; } if (req.query[queryParameters.app] !== undefined) { - const appContent = renderApp({ mainRoute, uploadConfiguration }); + debug('rendering app'); + const appContent = renderApp({ mainRoute }); res.set('etag', generateEtag(appContent)).send(appContent); return; } if (req.query[queryParameters.css] !== undefined) { - res.sendFile('styles.css', { - root: path.resolve(__dirname, 'client'), + debug('rendering css'); + const mainStream = fs.createReadStream(path.join(__dirname, 'client', 'styles.css')); + const pluginStreams = getPluginStreams('clientCSS'); + const streams = [mainStream, ...pluginStreams]; + const combined = combineStreams(streams); + res.writeHead(200, { + 'Content-Type': 'text/css', + }); + combined.pipe(res); + combined.on('error', (error) => { + console.error('Error streaming file:', error); + res.end(); }); return; } if (req.query[queryParameters.js] !== undefined) { - res.sendFile('script.js', { - root: path.resolve(__dirname, 'client'), + debug('rendering js'); + const mainStream = fs.createReadStream(path.join(__dirname, 'client', 'script.js')); + const pluginStreams = getPluginStreams('clientJS'); + const streams = [mainStream, ...pluginStreams]; + const combined = combineStreams(streams); + res.writeHead(200, { + 'Content-Type': 'application/javascript', + }); + combined.pipe(res); + combined.on('error', (error) => { + console.error('Error streaming file:', error); + res.end(); }); return; } if (req.query[queryParameters.following] !== undefined && - cache.get('following')) { - return followingHandler(req, res, cache, queryParameters.following); + (await getFromCache('following'))) { + debug('rendering following'); + const following = await getFromCache('following'); + return followingHandler(req, res, following, queryParameters.following); } if (req.query[queryParameters.metadata] !== undefined && - cache.get('metadata')) { - return metadataHandler(req, res, cache, queryParameters.metadata); + (await getFromCache('metadata'))) { + debug('rendering metadata'); + const metadata = (await getFromCache('metadata')); + return metadataHandler(req, res, metadata, queryParameters.metadata); } if ((req.query[queryParameters.twt] !== undefined || req.query[queryParameters.twts] !== undefined) && - cache.get('twts')) { - return twtHandler(req, res, cache.get('twts'), queryParameters.twt, queryParameters.twts); + (await getFromCache('twts'))) { + debug('rendering twts'); + const twts = await getFromCache('twts'); + return twtHandler(req, res, twts, queryParameters.twt, queryParameters.twts); } + plugins.forEach((plugin) => { + if (!plugin?.queryRoutes?.length) + return; + plugin.queryRoutes.forEach(async (route) => { + // default to no auth + const { handler, queryParameter, requiresAuth = false } = route ?? {}; + if (queryParameter && req.query[queryParameter] !== undefined) { + debug(`rendering plugin queryParameter ${queryParameter}`); + if (requiresAuth && !(await verifyAuthRequest(req))) { + debug('auth check failed'); + next(); + return; + } + return handler(req, res, next); + } + }); + }); next(); }; } diff --git a/dist/src/middlewares/queryHandler/queryHandler.js.map b/dist/src/middlewares/queryHandler/queryHandler.js.map index 8499207..7994e1b 100644 --- a/dist/src/middlewares/queryHandler/queryHandler.js.map +++ b/dist/src/middlewares/queryHandler/queryHandler.js.map @@ -1 +1 @@ -{"version":3,"file":"queryHandler.js","sourceRoot":"","sources":["../../../../src/middlewares/queryHandler/queryHandler.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"queryHandler.js","sourceRoot":"","sources":["../../../../src/middlewares/queryHandler/queryHandler.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/middlewares/queryHandler/twtHandler.js.map b/dist/src/middlewares/queryHandler/twtHandler.js.map index a97a5c3..8076a8c 100644 --- a/dist/src/middlewares/queryHandler/twtHandler.js.map +++ b/dist/src/middlewares/queryHandler/twtHandler.js.map @@ -1 +1 @@ -{"version":3,"file":"twtHandler.js","sourceRoot":"","sources":["../../../../src/middlewares/queryHandler/twtHandler.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"twtHandler.js","sourceRoot":"","sources":["../../../../src/middlewares/queryHandler/twtHandler.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/middlewares/renderApp/renderApp.d.ts b/dist/src/middlewares/renderApp/renderApp.d.ts index 9b29ec0..682f73c 100644 --- a/dist/src/middlewares/renderApp/renderApp.d.ts +++ b/dist/src/middlewares/renderApp/renderApp.d.ts @@ -4,4 +4,4 @@ import { TwtKprConfiguration } from '../../types.js'; * @param param0 * @returns */ -export default function renderApp({ mainRoute, uploadConfiguration, }: Pick): string; +export default function renderApp({ mainRoute, }: Pick): string; diff --git a/dist/src/middlewares/renderApp/renderApp.js b/dist/src/middlewares/renderApp/renderApp.js index ce61094..6c0f577 100644 --- a/dist/src/middlewares/renderApp/renderApp.js +++ b/dist/src/middlewares/renderApp/renderApp.js @@ -1,11 +1,10 @@ import { version } from '../../packageInfo.js'; -import renderUploadButton from './renderUploadButton.js'; /** * * @param param0 * @returns */ -export default function renderApp({ mainRoute, uploadConfiguration, }) { +export default function renderApp({ mainRoute, }) { return ` @@ -85,9 +84,8 @@ export default function renderApp({ mainRoute, uploadConfiguration, }) { - ${renderUploadButton(uploadConfiguration)} @@ -101,7 +99,6 @@ export default function renderApp({ mainRoute, uploadConfiguration, }) {
TwtKpr v${version ?? 'Unknown'}
- ${renderUploadButton(uploadConfiguration, 'small')} diff --git a/dist/src/middlewares/renderApp/renderApp.js.map b/dist/src/middlewares/renderApp/renderApp.js.map index 8c667cd..2a1ea5a 100644 --- a/dist/src/middlewares/renderApp/renderApp.js.map +++ b/dist/src/middlewares/renderApp/renderApp.js.map @@ -1 +1 @@ -{"version":3,"file":"renderApp.js","sourceRoot":"","sources":["../../../../src/middlewares/renderApp/renderApp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAG/C,OAAO,kBAAkB,MAAM,yBAAyB,CAAC;AAEzD;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EACjC,SAAS,EACT,mBAAmB,GAC6C;IAChE,OAAO;;;;;;;;;;;;;;mCAc2B,SAAS;;;;;;;;8CAQE,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uEAyCgB,SAAS;;;;sCAI1C,OAAO,IAAI,SAAS;;;;;;;;;;;;0BAYhC,kBAAkB,CAAC,mBAAmB,CAAC;;;;;;;;;;;;;;8CAcnB,OAAO,IAAI,SAAS;;kCAEhC,kBAAkB,CAAC,mBAAmB,EAAE,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iCAiCjD,SAAS;;;;CAIzC,CAAC;AACF,CAAC"} \ No newline at end of file +{"version":3,"file":"renderApp.js","sourceRoot":"","sources":["../../../../src/middlewares/renderApp/renderApp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAG/C;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EACjC,SAAS,GAC+B;IACxC,OAAO;;;;;;;;;;;;;;mCAc2B,SAAS;;;;;;;;8CAQE,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uEAyCgB,SAAS;;;;sCAI1C,OAAO,IAAI,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;8CAyBZ,OAAO,IAAI,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iCAkCjC,SAAS;;;;CAIzC,CAAC;AACF,CAAC"} \ No newline at end of file diff --git a/dist/src/middlewares/renderApp/renderUploadButton.d.ts b/dist/src/middlewares/renderApp/renderUploadButton.d.ts deleted file mode 100644 index c92abbb..0000000 --- a/dist/src/middlewares/renderApp/renderUploadButton.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { TwtKprConfiguration } from '../../types.js'; -/** - * - * @param uploadConfiguration - * @param variant - * @returns - */ -export default function renderUploadButton(uploadConfiguration: TwtKprConfiguration['uploadConfiguration'], variant?: 'normal' | 'small'): string; diff --git a/dist/src/middlewares/renderApp/renderUploadButton.js b/dist/src/middlewares/renderApp/renderUploadButton.js deleted file mode 100644 index 7845039..0000000 --- a/dist/src/middlewares/renderApp/renderUploadButton.js +++ /dev/null @@ -1,23 +0,0 @@ -/** - * - * @param uploadConfiguration - * @param variant - * @returns - */ -export default function renderUploadButton(uploadConfiguration, variant = 'normal') { - const { active, allowedMimeTypes, route } = uploadConfiguration ?? {}; - if (!active) - return ''; - // determine accept from allowed mime types - may need to rebuild value based on fallback n getConfiguration, rather than at the end. - return ` - -`; -} -//# sourceMappingURL=renderUploadButton.js.map \ No newline at end of file diff --git a/dist/src/middlewares/renderApp/renderUploadButton.js.map b/dist/src/middlewares/renderApp/renderUploadButton.js.map deleted file mode 100644 index 6a4daa4..0000000 --- a/dist/src/middlewares/renderApp/renderUploadButton.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"renderUploadButton.js","sourceRoot":"","sources":["../../../../src/middlewares/renderApp/renderUploadButton.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,kBAAkB,CACzC,mBAA+D,EAC/D,UAA8B,QAAQ;IAEtC,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,GAAG,mBAAmB,IAAI,EAAE,CAAC;IAEtE,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAEvB,qIAAqI;IAErI,OAAO;yFACiF,OAAO;0CACtD,OAAO;;oBAE7B,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG;4EACmB,KAAK;6CACpC,OAAO;;;CAGnD,CAAC;AACF,CAAC"} \ No newline at end of file diff --git a/dist/src/middlewares/uploadHandler.d.ts b/dist/src/middlewares/uploadHandler.d.ts deleted file mode 100644 index b8c5e16..0000000 --- a/dist/src/middlewares/uploadHandler.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { NextFunction, Request, Response } from 'express'; -import { TwtKprConfiguration } from '../types.js'; -/** - * - * @param config - * @param verifyAuthRequest - * @returns - */ -export default function uploadHandler(config: TwtKprConfiguration, verifyAuthRequest: (r: Request) => Promise): (req: Request, res: Response, next: NextFunction) => Promise; diff --git a/dist/src/middlewares/uploadHandler.js b/dist/src/middlewares/uploadHandler.js deleted file mode 100644 index e3a21a3..0000000 --- a/dist/src/middlewares/uploadHandler.js +++ /dev/null @@ -1,129 +0,0 @@ -import fsp from 'node:fs/promises'; -import path from 'node:path'; -import formidable from 'formidable'; -import Debug from 'debug'; -const debug = Debug('twtkpr:uploadHandler'); -/** - * - * @param allowedMimeTypes - * @returns - */ -const getDestinationByMimeTypeConfiguration = (allowedMimeTypes) => { - const fallback = { - audio: 'audio', - image: 'images', - text: 'texts', - video: 'videos', - '*': 'files', - }; - const mimeTypeArrayReducer = (acc, curr) => { - if (fallback[curr]) - acc[curr] = fallback[curr]; - else - acc[curr] = `${curr}s`; - return acc; - }; - if (!allowedMimeTypes) - return fallback; - if (typeof allowedMimeTypes === 'string') - return allowedMimeTypes - .split(',') - .map((val) => val.trim()) - .reduce(mimeTypeArrayReducer, {}); - if (Array.isArray(allowedMimeTypes)) - return allowedMimeTypes.reduce(mimeTypeArrayReducer, {}); - if (typeof allowedMimeTypes === 'object') - return allowedMimeTypes; - return fallback; -}; -/** - * - * @param config - * @param verifyAuthRequest - * @returns - */ -export default function uploadHandler(config, verifyAuthRequest) { - return async (req, res, next) => { - debug('checking auth'); - if (!(await verifyAuthRequest(req))) { - debug('auth check failed'); - res.status(401).send('Unauthorized'); - return; - } - debug('auth check succeeded'); - const { active, allowedMimeTypes, directory, route, ...otherProps } = config.uploadConfiguration; - if (!active || - (Array.isArray(allowedMimeTypes) && !allowedMimeTypes.length)) { - next(); - return; - } - debug('using configuration: ', { - uploadConfiguration: config.uploadConfiguration, - }); - const form = formidable({ - uploadDir: directory, - ...otherProps, - }); - form.parse(req, async (err, fields, files) => { - if (err) { - next(err); - return; - } - const uploadsDir = (route ?? '').replaceAll('/', ''); - let hadFileError = false; - const processedFiles = []; - const destinationByMimeType = allowedMimeTypes; - debug(`processing ${(files?.files ?? []).length} files`); - for (const file of files?.files ?? []) { - const { filepath, hash, mimetype, newFilename, originalFilename } = file ?? {}; - if (!(filepath && newFilename && originalFilename)) - return; - console.log({ file }); - let ext = path.extname(originalFilename).toLocaleLowerCase(); - if (ext === '.jpeg') - ext = '.jpg'; - const finalFilename = (hash && (mimetype?.includes('image') || mimetype?.includes('video')) - ? `${hash}${ext}` - : originalFilename) - .replace(/\s+/g, '-') - .toLocaleLowerCase(); - let destinationDir = ''; - Object.keys(destinationByMimeType).forEach((mimeType) => { - if (file.mimetype?.split('/')?.[0] === mimeType.toLocaleLowerCase()) - destinationDir = - destinationByMimeType[mimeType].directory ?? ''; - }); - if (destinationDir === '') - destinationDir = - destinationByMimeType['*'].directory ?? uploadsDir; - const finalPath = path.join(process.cwd(), 'public', destinationDir); - debug(`creating '${finalPath}'`); - fsp.mkdir(finalPath, { recursive: true }); - debug(`copying '${filepath}' to '/${destinationDir}/${finalFilename}'`); - try { - await fsp.copyFile(filepath, path.join(finalPath, finalFilename)); - debug(`cleaning up '${filepath}'`); - await fsp.rm(filepath); - debug(`processed successfully`); - processedFiles.push(`/${destinationDir}/${finalFilename}`); - } - catch (err) { - debug(`error!`); - hadFileError = true; - console.error(err); - } - } - debug('generating reply...'); - if (hadFileError && processedFiles.length) { - res.type('text/plain').status(206).send(processedFiles.join('\n')); - return; - } - if (!processedFiles.length) { - res.type('text/plain').status(500).send('No files processed'); - return; - } - res.type('text/plain').status(201).send(processedFiles.join('\n')); - }); - }; -} -//# sourceMappingURL=uploadHandler.js.map \ No newline at end of file diff --git a/dist/src/middlewares/uploadHandler.js.map b/dist/src/middlewares/uploadHandler.js.map deleted file mode 100644 index f77f643..0000000 --- a/dist/src/middlewares/uploadHandler.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"uploadHandler.js","sourceRoot":"","sources":["../../../src/middlewares/uploadHandler.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/src/plugin.d.ts b/dist/src/plugin.d.ts deleted file mode 100644 index a039c16..0000000 --- a/dist/src/plugin.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { Router } from 'express'; -import { TwtKprPluginConfiguration } from './types.js'; -export default function plugin(initialConfig?: TwtKprPluginConfiguration): Router; diff --git a/dist/src/plugin.js b/dist/src/plugin.js deleted file mode 100644 index ab1e8c0..0000000 --- a/dist/src/plugin.js +++ /dev/null @@ -1,40 +0,0 @@ -import cookieParser from 'cookie-parser'; -import Debug from 'debug'; -import express from 'express'; -import authCheck from './middlewares/authCheckJWT.js'; -import twtxtCache from './lib/twtxtCache.js'; -import getConfiguration from './lib/getConfiguration.js'; -import queryHandler from './middlewares/queryHandler/index.js'; -import uploadHandler from './middlewares/uploadHandler.js'; -import postHandler from './middlewares/postHandler/index.js'; -import memoryCache from './middlewares/postHandler/memoryCache.js'; -import putHandler from './middlewares/putHandler/index.js'; -export default function plugin(initialConfig) { - const debug = Debug('twtkpr:plugin'); - const router = express.Router(); - const config = getConfiguration(initialConfig ?? {}); - const { publicDirectory, twtxtFilename } = config; - const verifyAuthRequest = (req) => authCheck(req, config); - debug('initializing cache'); - const { cache, reloadCache } = twtxtCache({ publicDirectory, twtxtFilename }); - debug('adding URL encoder'); - router.use(express.urlencoded({ extended: true })); - debug('adding cookieParser'); - router.use(cookieParser()); - debug('adding queryRouter'); - router.use(config.mainRoute, queryHandler(config, cache, verifyAuthRequest)); - debug(`adding uploadHandler at /${config.uploadConfiguration.route}`); - router.post(`/${config.uploadConfiguration.route}`, uploadHandler(config, verifyAuthRequest)); - debug('adding postHandler and putHandler'); - router.use(config.mainRoute, postHandler(config), putHandler(config)); - debug('adding static'); - router.use(express.static(config.publicDirectory)); - debug('adding default redirect'); - router.get('/', (_, res) => { - res.redirect(config.mainRoute); - }); - debug('adding memoryCache'); - router.use((req, res, next) => memoryCache(req, res, next, cache, reloadCache)); - return router; -} -//# sourceMappingURL=plugin.js.map \ No newline at end of file diff --git a/dist/src/plugin.js.map b/dist/src/plugin.js.map deleted file mode 100644 index 1a3bbfd..0000000 --- a/dist/src/plugin.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,OAA4B,MAAM,SAAS,CAAC;AAGnD,OAAO,SAAS,MAAM,+BAA+B,CAAC;AACtD,OAAO,UAAU,MAAM,qBAAqB,CAAC;AAC7C,OAAO,gBAAgB,MAAM,2BAA2B,CAAC;AACzD,OAAO,YAAY,MAAM,qCAAqC,CAAC;AAC/D,OAAO,aAAa,MAAM,gCAAgC,CAAC;AAC3D,OAAO,WAAW,MAAM,oCAAoC,CAAC;AAC7D,OAAO,WAAW,MAAM,0CAA0C,CAAC;AACnE,OAAO,UAAU,MAAM,mCAAmC,CAAC;AAE3D,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,aAAyC;IACvE,MAAM,KAAK,GAAG,KAAK,CAAC,eAAe,CAAC,CAAC;IAErC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAEhC,MAAM,MAAM,GAAG,gBAAgB,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;IACrD,MAAM,EAAE,eAAe,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC;IAElD,MAAM,iBAAiB,GAAG,CAAC,GAAY,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAEnE,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC5B,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,UAAU,CAAC,EAAE,eAAe,EAAE,aAAa,EAAE,CAAC,CAAC;IAE9E,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC5B,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAEnD,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAC7B,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;IAE3B,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC5B,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAE7E,KAAK,CAAC,4BAA4B,MAAM,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC,CAAC;IACtE,MAAM,CAAC,IAAI,CACV,IAAI,MAAM,CAAC,mBAAmB,CAAC,KAAK,EAAE,EACtC,aAAa,CAAC,MAAM,EAAE,iBAAiB,CAAC,CACxC,CAAC;IAEF,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAC3C,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAEtE,KAAK,CAAC,eAAe,CAAC,CAAC;IACvB,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC;IAEnD,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACjC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;QAC1B,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC5B,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAC7B,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,CAC/C,CAAC;IAEF,OAAO,MAAgB,CAAC;AACzB,CAAC"} \ No newline at end of file diff --git a/dist/src/types.d.ts b/dist/src/types.d.ts index 0cecdce..5f80bd2 100644 --- a/dist/src/types.d.ts +++ b/dist/src/types.d.ts @@ -1,20 +1,9 @@ +import { RequestHandler } from 'express'; import { Options } from 'express-rate-limit'; -import formidable from 'formidable'; export interface MimeOptions { directory?: string; rename?: boolean; } -export interface MimeImageOptions extends MimeOptions { - compression?: string; - maxHeight?: string; - maxWidth?: string; -} -export interface UploadConfiguration extends Partial> { - active: boolean; - directory: string; - allowedMimeTypes: string | string[] | Record; - route: string; -} export interface QueryParameters { app: string; css: string; @@ -31,16 +20,37 @@ export interface PostLimiterConfiguration extends Partial { export interface TwtKprConfiguration { accessSecret: string; mainRoute: string; + pluginRoute: string; + plugins?: Record>; + postLimiterConfiguration?: PostLimiterConfiguration; privateDirectory: string; publicDirectory: string; + queryParameters: QueryParameters; refreshSecret: string; twtxtFilename: string; - postLimiterConfiguration?: PostLimiterConfiguration; - queryParameters: QueryParameters; - uploadConfiguration: UploadConfiguration; +} +export interface TwtKprPluginQueryRoute extends Omit { + queryParameter: string; +} +export interface TwtKprPluginRoute { + path: string; + handler: RequestHandler; + requiresAuth?: boolean; +} +export type TwtKprPluginConfigurator = (config: TwtKprConfiguration) => TwtKprPluginConfiguration; +export interface TwtKprPluginConfiguration { + clientCSS?: string | NodeJS.ReadableStream | (() => string | NodeJS.ReadableStream); + clientJS?: string | NodeJS.ReadableStream | (() => string | NodeJS.ReadableStream); + name?: string; + onAfterTwt?: (twt: string) => void; + postRoutes?: TwtKprPluginRoute[]; + putRoutes?: TwtKprPluginRoute[]; + queryRoutes?: TwtKprPluginQueryRoute[]; + use?: RequestHandler; + useFirst?: RequestHandler; + useLast?: RequestHandler; } export interface TwtKprPluginConfiguration extends Omit, 'postLimiterConfiguration' | 'queryParameters' | 'uploadConfiguration'> { postLimiterConfiguration?: Partial; queryParameters?: Partial; - uploadConfiguration?: Partial; } diff --git a/package.json b/package.json index 94348ee..db9f539 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "express-twtkpr", - "version": "0.8.2", + "version": "0.9.0", "description": "An express library for hosting and maintaining a twtxt.txt file.", "license": "MIT", "author": { @@ -26,18 +26,16 @@ "dist" ], "scripts": { - "start": "node --env-file=.env dist/index-app.js", - "build": "tsc && cp -r src/client dist/src", - "dev": "DEBUG='twtkpr:*' tsx watch --env-file=.env src/index-app.ts", + "build": "tsc && cp -r src/client dist/src && cp -r src/plugins dist/src", "get:hash": "tsx --env-file=.env src/cli.ts get-hash", - "lint": "eslint --fix src test", + "lint": "eslint --fix src", "prepublishOnly": "yarn build", "set:user": "tsx --env-file=.env src/cli.ts set-user", "test": "vitest", "typecheck": "tsc --noEmit" }, "dependencies": { - "@cacheable/node-cache": "^2.0.2", + "@cacheable/node-cache": "^3.0.0", "@exodus/blakejs": "^1.1.1-exodus.0", "base32.js": "^0.1.0", "bcryptjs": "^3.0.3", @@ -45,37 +43,36 @@ "dayjs": "^1.11.20", "debug": "^4.4.3", "express": "^5.2.1", - "express-rate-limit": "^8.3.1", + "express-rate-limit": "^8.5.0", "express-session": "^1.19.0", "express-slow-down": "^3.1.0", - "formidable": "^3.5.4", "jsonwebtoken": "^9.0.3", "link": "^2.1.2", "session-file-store": "^1.5.0", - "twtxt-lib": "^0.9.4", - "uuid": "^13.0.0", - "zod": "^4.3.6" + "twtxt-lib": "^0.10.1", + "uuid": "^14.0.0", + "zod": "^4.4.3" }, "devDependencies": { "@types/cookie-parser": "^1.4.10", "@types/cors": "^2.8.19", "@types/debug": "^4.1.13", "@types/express": "^5.0.6", - "@types/express-session": "^1.18.2", - "@types/formidable": "^3.5.0", + "@types/express-session": "^1.19.0", + "@types/formidable": "^3.5.1", "@types/jsonwebtoken": "^9.0.10", "@types/morgan": "^1.9.10", - "@types/node": "^25.5.0", + "@types/node": "^25.6.0", "@types/supertest": "^7.2.0", - "eslint": "^10.0.3", + "eslint": "^10.3.0", "eslint-config-prettier": "^10.1.8", "eslint-plugin-prettier": "^5.5.5", "eslint-plugin-security": "^4.0.0", - "prettier": "^3.8.1", + "prettier": "^3.8.3", "supertest": "^7.2.2", "tsx": "^4.21.0", "typescript": "^5.9.3", - "vitest": "^4.1.0" + "vitest": "^4.1.5" }, - "packageManager": "yarn@4.13.0" + "packageManager": "yarn@4.14.1" } diff --git a/src/client/script.js b/src/client/script.js index 7981616..5a85d78 100644 --- a/src/client/script.js +++ b/src/client/script.js @@ -1,3 +1,4 @@ +// @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT const DEBUG_ON = true; // served from same path as TWTXT file @@ -9,13 +10,67 @@ const debug = (...vals) => { if (DEBUG_ON) console.log(...vals); }; +window.token = undefined; + +window.setCookie = (name, value, expireDays) => { + const isSecure = window.location.protocol === 'https'; + const expireDate = new Date(); // current date + expireDate.setTime( + expireDate.getTime() + (expireDays ?? 0) * 24 * 60 * 60 * 1000 + ); + let expires = + expireDays !== undefined ? `expires=${expireDate.toUTCString()}; ` : ''; + document.cookie = `${name}=${encodeURIComponent(value)}; ${expires}${isSecure ? 'Secure; ' : ''}SameSite=Strict; Path=/`; +}; + +window.showToast = (message, type = 'success') => { + const toast = document.createElement('div'); + toast.classList.add('toast'); + if (type === 'error') toast.classList.add('error'); + + toast.textContent = message; + document.getElementById('toast-container').appendChild(toast); + + setTimeout(() => { + toast.style.animation = 'fadeOut 0.5s forwards'; + setTimeout(() => toast.remove(), 500); + }, 3000); +}; + +window.refreshToken = async (hideToast = false) => { + const rememberToggleVal = !!localStorage.getItem(REMEMBER_LOGIN_STORAGE_KEY); + + const res = await fetch(`${TWTXT_FILE_URL}`, { + method: 'POST', + body: new URLSearchParams({ + rememberToggle: rememberToggleVal, + type: 'refresh', + }), + credentials: 'include', // Include cookies + }); + + if (res.ok && res?.body) { + token = await new Response(res.body).text(); + if (rememberToggleVal) { + setCookie(ACCESS_TOKEN_COOKIE_KEY, token); + } + return; + } + + // Handle refresh failure + if (!hideToast) + showToast('Unable to refresh token, please try again later.', 'error'); + token = undefined; + document.body.classList.remove('js-authorized'); + throw new Error('Failed to refresh token'); +}; + export default (async () => { /* DOM Elements */ const twtForm = document.getElementById('twtForm'), loginForm = document.getElementById('loginControls-form'), fileBox = document.getElementById('fileBox'), fileContentsSection = document.getElementById('fileContentsSection'), - toastContainer = document.getElementById('toast-container'), twtControlsContentInput = document.getElementById( 'twtControlsContentInput' ), @@ -24,27 +79,12 @@ export default (async () => { twtFileEditButton = document.getElementById('twtControlsEditButton'), menuCheckbox = document.getElementById('hamburgerToggleCheckbox'), twtxtEditFormText = document.getElementById('twtxtEditFormText'), - uploadInputs = document.querySelectorAll('.twtControls-uploadInput'), rememberToggle = document.getElementById('loginControls-rememberToggle'); const lastModifiedDates = {}; let isEditing = false, cookie, - fileText, - token; - - const showToast = (message, type = 'success') => { - const toast = document.createElement('div'); - toast.classList.add('toast'); - if (type === 'error') toast.classList.add('error'); - toast.textContent = message; - - toastContainer.appendChild(toast); - setTimeout(() => { - toast.style.animation = 'fadeOut 0.5s forwards'; - setTimeout(() => toast.remove(), 500); - }, 3000); - }; + fileText; const beginEditMode = () => { isEditing = true; @@ -70,17 +110,6 @@ export default (async () => { return null; }; - const setCookie = (name, value, expireDays) => { - const isSecure = window.location.protocol === 'https'; - const expireDate = new Date(); // current date - expireDate.setTime( - expireDate.getTime() + (expireDays ?? 0) * 24 * 60 * 60 * 1000 - ); - let expires = - expireDays !== undefined ? `expires=${expireDate.toUTCString()}; ` : ''; - document.cookie = `${name}=${encodeURIComponent(value)}; ${expires}${isSecure ? 'Secure; ' : ''}SameSite=Strict; Path=/`; - }; - const loadTwtxtFile = async (filePath = TWTXT_FILE_URL) => { debug('loadTwtxtFile start'); let response; @@ -119,142 +148,8 @@ export default (async () => { debug('loadTwtxtFile end'); }; - const refreshToken = async (hideToast = false) => { - debug('refreshToken start', hideToast); - const rememberToggleVal = - localStorage.getItem(REMEMBER_LOGIN_STORAGE_KEY) === 'true'; - - const res = await fetch(`${TWTXT_FILE_URL}`, { - method: 'POST', - body: new URLSearchParams({ - rememberToggle: rememberToggleVal, - type: 'refresh', - }), - credentials: 'include', // Include cookies - }); - - if (res.ok && res?.body) { - token = await new Response(res.body).text(); - if (rememberToggleVal) { - debug('refreshToken set new accessToken cookie'); - setCookie(ACCESS_TOKEN_COOKIE_KEY, token); - } - debug('refreshToken end OK'); - return; - } - - // Handle refresh failure - if (!hideToast) - showToast('Unable to refresh token, please try again later.', 'error'); - token = undefined; - document.body.classList.remove('js-authorized'); - debug('refreshToken end error'); - throw new Error('Failed to refresh token'); - }; - - const uploadFiles = async (files, uploadRoute, secondAttempt = false) => { - if (!uploadRoute) return; - - debug('uploadFiles', token, files, uploadRoute, secondAttempt); - - const formData = new FormData(); - for (let i = 0; i < files.length; i++) { - formData.append('files', files[i]); - } - - try { - const res = await fetch(uploadRoute, { - method: 'POST', - body: formData, - headers: { - Authorization: `Bearer ${token}`, - }, - credentials: 'include', - }); - - if (res.ok) { - showToast(`File${files.length !== 1 ? 's' : ''} uploaded`); - - const filePath = await res.text(); - twtControlsContentInput.value += filePath - .split('\n') - .map((currFilePath) => - [ - ' ', - location.protocol, - '//', - location.hostname, - location.protocol !== 'https' && location.port !== 80 - ? ':' + location.port - : '', - currFilePath, - ].join('') - ) - .join(''); - - return; - } - - if (!secondAttempt) { - await refreshToken(); - return uploadFiles(files, uploadRoute, true); - } - - showToast( - `Unable to upload image${files.length !== 1 ? 's' : ''} refresh token, please try again later.`, - 'error' - ); - } catch (err) { - console.error(err); - } - }; - /* Handlers */ - const dragOverHandler = (ev) => { - const files = [...ev.dataTransfer.items].filter( - (item) => item.kind === 'file' - ); - - if (files.length > 0) { - ev.preventDefault(); - ev.dataTransfer.dropEffect = 'copy'; - } - }; - - const dragOverWindowHandler = (ev) => { - const files = [...ev.dataTransfer.items].filter( - (item) => item.kind === 'file' - ); - - if (files.length > 0) { - ev.preventDefault(); - - if (!twtControlsContentInput.contains(ev.target)) { - ev.dataTransfer.dropEffect = 'none'; - } - } - }; - - const dropHandler = (ev) => { - ev.preventDefault(); - - if (!uploadInputs.length) return; - - const files = [...ev.dataTransfer.items] - .map((item) => item.getAsFile()) - .filter((file) => file); - - debug('dropHandler', files); - uploadFiles(files, uploadInputs[0].getAttribute('data-route')); - }; - - const dropWindowHandler = (ev) => { - if ([...ev.dataTransfer.items].some((item) => item.kind === 'file')) { - ev.preventDefault(); - } - }; - const editClickHandler = () => { if (isEditing) return; @@ -384,7 +279,8 @@ export default (async () => { }; const rememberToggleHandler = (ev) => { - if (ev.target.checked) { + debug('toggle!', ev?.target?.checked); + if (ev?.target?.checked) { localStorage.setItem(REMEMBER_LOGIN_STORAGE_KEY, 'true'); return; } @@ -392,6 +288,14 @@ export default (async () => { localStorage.removeItem(REMEMBER_LOGIN_STORAGE_KEY); }; + const twtContentInputHandler = () => { + console.log('input!'); + const hasContent = + (twtControlsContentInput.value?.trim() ?? '').length !== 0; + if (twtSubmitButton && hasContent && !isEditing) + twtSubmitButton.removeAttribute('disabled'); + }; + const twtContentKeyupHandler = (ev) => { const hasContent = (twtControlsContentInput.value?.trim() ?? '').length !== 0; @@ -422,7 +326,7 @@ export default (async () => { debug('twtForm submit data', { twtData }); if (!twtContent) return; - twtData.set('content', twtContent.replaceAll('\n', '\u2028')); + twtData.set('content', twtContent.replace(/\n/g, ' \u2028')); const twtBody = new URLSearchParams(twtData); debug('twtForm submit body', { twtBody }); @@ -461,25 +365,15 @@ export default (async () => { return false; }; - const uploadChangeHandler = (ev) => { - uploadFiles(ev.target.files, ev.target.getAttribute('data-route')); - }; - /* Attach Handlers to Listeners */ - Array.from(uploadInputs).forEach((uploadInput) => { - uploadInput.addEventListener('change', uploadChangeHandler); - }); - loginForm.addEventListener('submit', loginFormSubmitHandler); twtForm.addEventListener('submit', twtFormSubmitHandler); twtForm.addEventListener('keyup', twtContentKeyupHandler); - twtControlsContentInput.addEventListener('drop', dropHandler); - - twtControlsContentInput.addEventListener('dragover', dragOverHandler); + twtForm.addEventListener('input', twtContentInputHandler); twtLogoutButton.addEventListener('click', logoutHandler); @@ -489,11 +383,19 @@ export default (async () => { twtxtEditForm.addEventListener('submit', editSubmitHandler); - window.addEventListener('dragover', dragOverWindowHandler); - - window.addEventListener('drop', dropWindowHandler); - rememberToggle.addEventListener('change', rememberToggleHandler); + rememberToggle.setAttribute( + 'checked', + !!localStorage.getItem(REMEMBER_LOGIN_STORAGE_KEY) + ); + + menuCheckbox.addEventListener('click', (evt) => { + evt.stopPropagation(); + }); + + window.addEventListener('click', () => { + menuCheckbox.checked = false; + }); /* Start App*/ @@ -504,3 +406,4 @@ export default (async () => { debug('client loaded'); })(); +// @license-end diff --git a/src/client/styles.css b/src/client/styles.css index 1a976e8..9aff9ab 100644 --- a/src/client/styles.css +++ b/src/client/styles.css @@ -77,7 +77,7 @@ } /** - * Local styles + * Begin TwtKpr Client CSS */ :root { /* #0a0a14 / Vulcan*/ @@ -483,33 +483,6 @@ input:disabled { display: none; } -.twtControls-uploadInputLabel { - align-items: center; - cursor: pointer; - display: flex; - justify-content: center; - max-width: 100%; - text-align: center; - transition: all 0.5s; -} - -.twtControls-uploadInputLabel-normal { - display: none; -} - -.twtControls-uploadInputLabel-small { - font-size: small; -} - -.twtControls-uploadInputLabel:hover { - background-color: var(--bg-hl); - color: var(--fg-hl); -} - -.twtControls-uploadInput { - display: none; -} - .twtControls-submitButton { background-color: var(--bg-hl); border: 1px solid var(--link); @@ -715,3 +688,5 @@ input:disabled { opacity: 0; } } + +/** End TwtKpr Client CSS */ diff --git a/src/expressPlugin.ts b/src/expressPlugin.ts new file mode 100644 index 0000000..237801d --- /dev/null +++ b/src/expressPlugin.ts @@ -0,0 +1,92 @@ +import cookieParser from 'cookie-parser'; +import Debug from 'debug'; +import express, { Request, Router } from 'express'; +import { TwtKprPluginConfigurator, TwtKprConfiguration } from './types.js'; + +import authCheck from './middlewares/authCheckJWT.js'; +import twtxtCache from './lib/twtxtCache.js'; +import getConfiguration from './lib/getConfiguration.js'; +import queryHandler from './middlewares/queryHandler/index.js'; +import postHandler, { + pluginPostHandler, +} from './middlewares/postHandler/index.js'; +import putHandler, { + pluginPutHandler, +} from './middlewares/putHandler/index.js'; + +// import emojiPlugin from './plugins/emojiButton/index.js'; +// import uploadPlugin from './plugins/uploadButton/index.js'; +// import postToMastodon from './plugins/postToMastodon/index.js'; + +export default function expressPlugin( + initialConfig?: Partial, + initialPlugins: TwtKprPluginConfigurator[] = [] +) { + const debug = Debug('twtkpr:expressPlugin'); + + const router = express.Router(); + + const config = getConfiguration(initialConfig ?? {}); + const { mainRoute, publicDirectory, twtxtFilename } = config; + + const verifyAuthRequest = (req: Request) => authCheck(req, config); + + const preparedPlugins = initialPlugins + // .concat([emojiPlugin, uploadPlugin, postToMastodon]) + .map((plugin) => plugin(config)); + + debug('initializing cache'); + const { getFromCache, reloadCache } = twtxtCache({ + publicDirectory, + twtxtFilename, + }); + + preparedPlugins.forEach((plugin) => { + if (plugin.useFirst) router.use(plugin.useFirst); + }); + + debug('adding URL encoder'); + router.use(express.urlencoded({ extended: true })); + + debug('adding cookieParser'); + router.use(cookieParser()); + + debug('adding queryRouter'); + router.use( + mainRoute, + queryHandler(config, getFromCache, verifyAuthRequest, preparedPlugins) + ); + + debug('adding postHandler and putHandler'); + router.use( + mainRoute, + postHandler(config, preparedPlugins, reloadCache), + putHandler(config, preparedPlugins, reloadCache) + ); + + debug('adding postHandlers and putHandlers for plugins'); + router.use( + config.pluginRoute, + pluginPostHandler(preparedPlugins, verifyAuthRequest, reloadCache), + pluginPutHandler(preparedPlugins, verifyAuthRequest, reloadCache) + ); + + debug('adding use handlers for plugins'); + preparedPlugins.forEach((plugin) => { + if (plugin.use) router.use(plugin.use); + }); + + debug('adding static'); + router.use(express.static(config.publicDirectory)); + + debug('adding default redirect'); + router.get('/', (_, res) => { + res.redirect(mainRoute); + }); + + preparedPlugins.forEach((plugin) => { + if (plugin.useLast) router.use(plugin.useLast); + }); + + return router as Router; +} diff --git a/src/index.ts b/src/index.ts index 036faae..1efa136 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1 +1,8 @@ -export { default } from "./plugin.js"; +export { default } from './expressPlugin.js'; +export { combineStreams, getReadStream } from './lib/utils.js'; + +export type { + MimeOptions, + TwtKprConfiguration, + TwtKprPluginConfiguration, +} from './types.js'; diff --git a/src/lib/constants.ts b/src/lib/constants.ts index d4c856f..61f62c1 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -1,10 +1,11 @@ import { dirname, resolve } from 'node:path'; import { fileURLToPath } from 'node:url'; -export const DEFAULT_PRIVATE_DIRECTORY = '.data'; -export const DEFAULT_PUBLIC_DIRECTORY = 'public'; export const DEFAULT_TWTXT_FILENAME = 'twtxt.txt'; export const DEFAULT_ROUTE = `/${DEFAULT_TWTXT_FILENAME}`; +export const DEFAULT_PRIVATE_DIRECTORY = '.data'; +export const DEFAULT_PUBLIC_DIRECTORY = 'public'; +export const DEFAULT_PLUGIN_ROUTE = '/'; export const DEFAULT_POST_LIMITER_ACTIVE = true; diff --git a/src/lib/env.ts b/src/lib/env.ts index f969448..153014e 100644 --- a/src/lib/env.ts +++ b/src/lib/env.ts @@ -3,6 +3,7 @@ import { fileURLToPath } from 'node:url'; import { z } from 'zod/v4'; import { + DEFAULT_PLUGIN_ROUTE, DEFAULT_POST_LIMITER_ACTIVE, DEFAULT_PRIVATE_DIRECTORY, DEFAULT_PUBLIC_DIRECTORY, @@ -42,6 +43,7 @@ const envSchema = z.object({ // vars with default values TWTKPR_DEFAULT_ROUTE: z.string().default(DEFAULT_ROUTE), + TWTKPR_PLUGIN_ROUTE: z.string().default(DEFAULT_PLUGIN_ROUTE), TWTKPR_PRIVATE_DIRECTORY: z.string().default(DEFAULT_PRIVATE_DIRECTORY), TWTKPR_PUBLIC_DIRECTORY: z.string().default(DEFAULT_PUBLIC_DIRECTORY), TWTKPR_QUERY_PARAMETER_APP: z.string().default(DEFAULT_QUERY_PARAMETER_APP), @@ -139,6 +141,8 @@ const parseEnv = () => { process.env.TWTKPR_ACCESS_SECRET || process.env.ACCESS_SECRET, TWTKPR_DEFAULT_ROUTE: process.env.TWTKPR_DEFAULT_ROUTE || process.env.DEFAULT_ROUTE, + TWTKPR_PLUGIN_ROUTE: + process.env.TWTKPR_PLUGIN_ROUTE || process.env.TWTKPR_PLUGIN_ROUTE, TWTKPR_PRIVATE_DIRECTORY: process.env.TWTKPR_PRIVATE_DIRECTORY || process.env.PRIVATE_DIRECTORY, TWTKPR_PUBLIC_DIRECTORY: diff --git a/src/lib/getConfiguration.ts b/src/lib/getConfiguration.ts index eb0c1e1..a2095fd 100644 --- a/src/lib/getConfiguration.ts +++ b/src/lib/getConfiguration.ts @@ -72,12 +72,13 @@ export default function getConfiguration( ) { const { mainRoute = env.TWTKPR_DEFAULT_ROUTE, + pluginRoute = env.TWTKPR_PLUGIN_ROUTE, privateDirectory = env.TWTKPR_PRIVATE_DIRECTORY, publicDirectory = env.TWTKPR_PUBLIC_DIRECTORY, twtxtFilename = env.TWTKPR_TWTXT_FILENAME, postLimiterConfiguration, queryParameters, - uploadConfiguration, + // uploadConfiguration, } = initialConfiguration ?? {}; const { @@ -96,33 +97,18 @@ export default function getConfiguration( twts = env.TWTKPR_QUERY_PARAMETER_TWTS, } = queryParameters ?? {}; - const { - active: uploadActive = env.TWTKPR_UPLOAD_ACTIVE, - allowEmptyFiles = env.TWTKPR_UPLOAD_ALLOW_EMPTY_FILES, - allowedMimeTypes = env.TWTKPR_UPLOAD_ALLOWED_MIME_TYPES, - createDirsFromUploads = env.TWTKPR_UPLOAD_CREATE_DIRS_FROM_UPLOADS, - directory = env.TWTKPR_UPLOAD_DIRECTORY, - encoding = env.TWTKPR_UPLOAD_ENCODING, - fileWriteStreamHandler, - filter = () => true, - hashAlgorithm = env.TWTKPR_UPLOAD_HASH_ALGORITHM, - keepExtensions = env.TWTKPR_UPLOAD_KEEP_EXTENSIONS, - maxFields = env.TWTKPR_UPLOAD_MAX_FIELDS, - maxFileSize = env.TWTKPR_UPLOAD_MAX_FIELDS_SIZE, - maxFiles = env.TWTKPR_UPLOAD_MAX_FILES, - maxTotalFileSize = env.TWTKPR_UPLOAD_MAX_TOTAL_FILE_SIZE, - minFileSize = env.TWTKPR_UPLOAD_MIN_FILE_SIZE, - route = env.TWTKPR_UPLOAD_ROUTE, - } = uploadConfiguration ?? {}; - return { // secrets cannot be provided through configuration file, must use ENV / .env accessSecret: env.TWTKPR_ACCESS_SECRET, refreshSecret: env.TWTKPR_REFRESH_SECRET, mainRoute, + pluginRoute, privateDirectory, publicDirectory, twtxtFilename, + plugins: { + ...(initialConfiguration?.plugins ?? {}), + }, postLimiterConfiguration: { active: postLimiterActive, ...(otherPostLimiterProps ?? {}), @@ -138,24 +124,5 @@ export default function getConfiguration( twt, twts, }, - uploadConfiguration: { - ...uploadConfiguration, - active: uploadActive, - allowEmptyFiles, - allowedMimeTypes: getDestinationByMimeTypeConfiguration(allowedMimeTypes), - createDirsFromUploads, - directory, - encoding, - fileWriteStreamHandler, - filter, - hashAlgorithm: hashAlgorithm as string | false | undefined, - keepExtensions, - maxFields, - maxFileSize, - maxFiles, - maxTotalFileSize, - minFileSize, - route, - }, } as TwtKprConfiguration; } diff --git a/src/lib/twtxtCache.ts b/src/lib/twtxtCache.ts index ddb9ff9..e509553 100644 --- a/src/lib/twtxtCache.ts +++ b/src/lib/twtxtCache.ts @@ -1,7 +1,7 @@ import fsp from 'node:fs/promises'; import path from 'node:path'; -import { NodeCache } from '@cacheable/node-cache'; +import { NodeCache, NodeCacheOptions } from '@cacheable/node-cache'; import Debug from 'debug'; import { parseTwtxt } from 'twtxt-lib'; @@ -20,9 +20,23 @@ export default function twtxtCache({ const debug = Debug('twtkpr:twtxtCache'); - const cache = new NodeCache(); + const defaultCacheOptions: NodeCacheOptions = { + stdTTL: 299, + checkperiod: 300, + }; + + const cache = new NodeCache(defaultCacheOptions); + + const getFromCache = async (key = '') => { + debug(`checking cache for key: ${key}`); + if (!key) return undefined; + + const value = cache.get(key); + if (value) return value; + + debug('Not found, reloading keys'); + cache.flushAll(); - const reloadCache = async () => { const fileText = await fsp.readFile( path.join(publicDirectory, twtxtFilename), 'utf8' @@ -37,12 +51,16 @@ export default function twtxtCache({ debug(`cache ${isLoaded ? 're' : ''}loaded`); isLoaded = true; + + return cache.get(key); }; - reloadCache(); + const reloadCache = async () => { + cache.flushAll(); + }; return { - cache, + getFromCache, reloadCache, }; } diff --git a/src/lib/utils.ts b/src/lib/utils.ts index a8eca94..55f7dc2 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -1,8 +1,42 @@ import crypto from 'node:crypto'; +import { createReadStream } from 'node:fs'; import { readFile, writeFile } from 'node:fs/promises'; +import { PassThrough } from 'node:stream'; + import jwt from 'jsonwebtoken'; import { v4 as uuidv4 } from 'uuid'; +import { __dirname } from './constants.js'; + +async function combineWithPassthrough(sources: any[], destination: any) { + for (const stream of sources) { + await new Promise((resolve, reject) => { + let s = stream; + if (typeof stream === 'function') { + s = stream(); + } + + if (typeof s === 'string') { + destination.push(s); + destination.push(null); + resolve(true); + return; + } + + s.pipe(destination, { end: false }); + s.on('end', resolve); + s.on('error', reject); + }); + } + destination.emit('end'); +} + +export function combineStreams(streams: any[]) { + const stream = new PassThrough(); + combineWithPassthrough(streams, stream).catch((err) => stream.destroy(err)); + return stream; +} + /** * * @param userId @@ -51,6 +85,23 @@ export const getQueryParameterArray = (value: unknown | unknown[] = []) => ? value.map((val) => `${val}`.trim()) : [`${value}`.trim()]; +/** + * + * @param pathToFile + * @returns + */ +export const getReadStream = (pathToFile: string) => { + const theStream = createReadStream(pathToFile); + + theStream.on('error', (err) => { + console.error(err); + theStream.close(); + theStream.push(null); + }); + + return theStream; +}; + /** * * @param value diff --git a/src/middlewares/postHandler/index.ts b/src/middlewares/postHandler/index.ts index 401cc49..6c8743c 100644 --- a/src/middlewares/postHandler/index.ts +++ b/src/middlewares/postHandler/index.ts @@ -1 +1,2 @@ -export { default } from "./postHandler.js"; +export { default } from './postHandler.js'; +export { default as pluginPostHandler } from './pluginPostHandler.js'; diff --git a/src/middlewares/postHandler/memoryCache.ts b/src/middlewares/postHandler/memoryCache.ts index e28ae54..010b453 100644 --- a/src/middlewares/postHandler/memoryCache.ts +++ b/src/middlewares/postHandler/memoryCache.ts @@ -18,16 +18,17 @@ export default async function memoryCache( req: Request, res: Response, next: NextFunction, - cache: NodeCache, reloadCache: () => Promise ) { - if (cache.keys().length && !['DELETE', 'POST', 'PUT'].includes(req.method)) { + debug(req.method); + if (!['DELETE', 'POST', 'PUT'].includes(req.method)) { next(); return; } reloadCache() .then(() => { + debug('Cache reloaded'); next(); }) .catch((err) => { diff --git a/src/middlewares/postHandler/pluginPostHandler.ts b/src/middlewares/postHandler/pluginPostHandler.ts new file mode 100644 index 0000000..edfe7af --- /dev/null +++ b/src/middlewares/postHandler/pluginPostHandler.ts @@ -0,0 +1,50 @@ +import Debug from 'debug'; +import express, { NextFunction, Request, Response } from 'express'; +import { TwtKprPluginConfiguration, TwtKprPluginRoute } from '../../types.js'; + +const debug = Debug('twtkpr:postHandler'); + +/** + * + * @param config * @returns + */ +export default function pluginPostHandler( + plugins: TwtKprPluginConfiguration[] = [], + verifyAuthRequest: (r: Request) => Promise, + reloadCache?: () => Promise +) { + const router = express.Router(); + + const pluginRoutes = ([] as TwtKprPluginRoute[]).concat( + ...(Object.keys(plugins) + .filter( + (key) => + (plugins[key as keyof typeof plugins] as TwtKprPluginConfiguration) + ?.postRoutes?.length + ) + .map( + (key) => + (plugins[key as keyof typeof plugins] as TwtKprPluginConfiguration) + .postRoutes + ) as TwtKprPluginRoute[][]) + ); + + pluginRoutes.forEach(({ handler, path, requiresAuth }) => { + debug(`adding POST plugin router for ${path}`); + + router.post(path, async (req, res, next) => { + debug(`handling POST plugin route to ${path}`); + + if (requiresAuth && !(await verifyAuthRequest(req))) { + debug('auth check failed'); + next(); + return; + } + + handler(req, res, next); + reloadCache?.(); + }); + }); + + return router; +} diff --git a/src/middlewares/postHandler/postHandler.ts b/src/middlewares/postHandler/postHandler.ts index 3d37639..50e3559 100644 --- a/src/middlewares/postHandler/postHandler.ts +++ b/src/middlewares/postHandler/postHandler.ts @@ -3,7 +3,7 @@ import express, { NextFunction, Request, Response } from 'express'; import rateLimit from 'express-rate-limit'; import authCheck from '../../middlewares/authCheckJWT.js'; -import { TwtKprConfiguration } from '../../types.js'; +import { TwtKprConfiguration, TwtKprPluginConfiguration } from '../../types.js'; import login from './login.js'; import logout from './logout.js'; import refresh from './refresh.js'; @@ -17,7 +17,11 @@ const debug = Debug('twtkpr:postHandler'); * @param config * @returns */ -export default function postHandler(config: TwtKprConfiguration) { +export default function postHandler( + config: TwtKprConfiguration, + plugins: TwtKprPluginConfiguration[] = [], + reloadCache?: () => Promise +) { const { postLimiterConfiguration } = config; const { active: isLimiterActive, ...otherLimiterProps } = postLimiterConfiguration ?? {}; @@ -59,7 +63,11 @@ export default function postHandler(config: TwtKprConfiguration) { } debug('auth check succeeded'); - if (type === 'twt' || content) return twt(req, res, config); + if (type === 'twt' || content) { + twt(req, res, config, plugins); + reloadCache?.(); + return; + } if (type === 'editFile') return editFile(req, res, config); next(); diff --git a/src/middlewares/postHandler/refresh.ts b/src/middlewares/postHandler/refresh.ts index c3149e0..8e884a8 100644 --- a/src/middlewares/postHandler/refresh.ts +++ b/src/middlewares/postHandler/refresh.ts @@ -25,13 +25,13 @@ export default async function refresh( res: Response, config: TwtKprConfiguration ) { - const send401 = (message: string) => { + const sendError = (message: string, code = 401) => { debug(message); res .clearCookie('accessToken') .clearCookie('refreshToken') - .status(401) + .status(code) .send(message ?? 'Unauthorized'); return; @@ -41,9 +41,9 @@ export default async function refresh( const tokens = await refreshTokensDB(config.privateDirectory); const oldToken = req.cookies.refreshToken; - debug(oldToken); + debug(`Using old token: ${oldToken}`); - if (!oldToken) return send401('Unauthorized'); + if (!oldToken) return sendError('Unauthorized'); let decoded = { id: '' }; @@ -52,14 +52,15 @@ export default async function refresh( id: string; }; - debug({ decoded }); + debug('Decoded token: ', { decoded }); } catch (err) { - return send401('Refresh token invalid'); + debug('Error decoding refresh token:', err); + return sendError('Refresh token invalid', 403); } const username = req.username ?? decoded.id; - if (!username) return send401('Missing username'); + if (!username) return sendError('Missing username'); const currentTime = Math.floor(Date.now() / 1000); @@ -72,7 +73,7 @@ export default async function refresh( // If token is invalid or not the latest one if (!validTokens.includes(oldToken)) { debug('token missing from list'); - return send401('Invalid refresh token'); + return sendError('Invalid refresh token'); } debug('generating new tokens'); @@ -84,7 +85,8 @@ export default async function refresh( const newRefreshToken = generateRefreshToken( req.username || decoded.id, - config.refreshSecret + config.refreshSecret, + !!req.query.rememberToggle ); debug('updating token list'); diff --git a/src/middlewares/postHandler/twt.ts b/src/middlewares/postHandler/twt.ts index 542adc9..7807c9c 100644 --- a/src/middlewares/postHandler/twt.ts +++ b/src/middlewares/postHandler/twt.ts @@ -1,10 +1,13 @@ import type { Request, Response } from 'express'; -import dayjs from 'dayjs'; import fs from 'node:fs'; import { join } from 'node:path'; +import dayjs from 'dayjs'; +import Debug from 'debug'; -import { TwtKprConfiguration } from '../../types.js'; +import { TwtKprConfiguration, TwtKprPluginConfiguration } from '../../types.js'; + +const debug = Debug('twtkpr:twt'); /** * Creates a new twt, appending it to the bottom of the TWTXT file @@ -15,13 +18,19 @@ import { TwtKprConfiguration } from '../../types.js'; export default function twt( req: Request, res: Response, - config: TwtKprConfiguration + config: TwtKprConfiguration, + plugins: TwtKprPluginConfiguration[] = [] ) { + debug('Beginning twt add'); + const { content } = req.body ?? {}; const date = dayjs().format(); const twt = `${date}\t${content.trim()}\n`; + debug(`Formatted twt: ${twt}`); + + debug('Beginning stream...'); const stream = fs.createWriteStream( join(config.publicDirectory, config.twtxtFilename), { @@ -32,5 +41,19 @@ export default function twt( stream.write(twt); stream.end(); + debug('Streaming complete'); + + plugins.forEach(async (plugin) => { + if (!plugin.onAfterTwt) return; + + debug( + `Handling plugin onAfterTwt function${ + plugin.name ? ' from ' + plugin.name : '' + }` + ); + + plugin.onAfterTwt(twt); + }); + res.status(200).send(twt); } diff --git a/src/middlewares/putHandler/index.ts b/src/middlewares/putHandler/index.ts index 30a6615..e352d23 100644 --- a/src/middlewares/putHandler/index.ts +++ b/src/middlewares/putHandler/index.ts @@ -1 +1,2 @@ -export { default } from "./putHandler.js"; +export { default } from './putHandler.js'; +export { default as pluginPutHandler } from './pluginPutHandler.js'; diff --git a/src/middlewares/putHandler/pluginPutHandler.ts b/src/middlewares/putHandler/pluginPutHandler.ts new file mode 100644 index 0000000..8064fc9 --- /dev/null +++ b/src/middlewares/putHandler/pluginPutHandler.ts @@ -0,0 +1,52 @@ +import Debug from 'debug'; +import express, { NextFunction, Request, Response } from 'express'; +import { TwtKprPluginConfiguration, TwtKprPluginRoute } from '../../types.js'; + +const debug = Debug('twtkpr:postHandler'); + +/** + * + * @param plugins + * @returns + */ +export default function pluginPutHandler( + plugins: TwtKprPluginConfiguration[] = [], + verifyAuthRequest: (r: Request) => Promise, + reloadCache?: () => Promise +) { + const router = express.Router(); + + const pluginRoutes = ([] as TwtKprPluginRoute[]).concat( + ...(Object.keys(plugins) + .filter( + (key) => + (plugins[key as keyof typeof plugins] as TwtKprPluginConfiguration) + ?.putRoutes?.length + ) + .map( + (key) => + (plugins[key as keyof typeof plugins] as TwtKprPluginConfiguration) + .putRoutes + ) as TwtKprPluginRoute[][]) + ); + + pluginRoutes.forEach(({ handler, path, requiresAuth }) => { + debug(`adding PUT plugin router for ${path}`); + + router.put(path, async (req, res, next) => { + debug(`handling PUT plugin route to ${path}`); + + if (requiresAuth && !(await verifyAuthRequest(req))) { + debug('auth check failed'); + next(); + return; + } + + handler(req, res, next); + + reloadCache?.(); + }); + }); + + return router; +} diff --git a/src/middlewares/putHandler/putHandler.ts b/src/middlewares/putHandler/putHandler.ts index 7a56e1e..0095bea 100644 --- a/src/middlewares/putHandler/putHandler.ts +++ b/src/middlewares/putHandler/putHandler.ts @@ -2,7 +2,7 @@ import Debug from 'debug'; import express from 'express'; import authCheck from '../../middlewares/authCheckJWT.js'; -import { TwtKprConfiguration } from '../../types.js'; +import { TwtKprConfiguration, TwtKprPluginConfiguration } from '../../types.js'; import editFile from './editFile.js'; const debug = Debug('twtkpr:putHandler'); @@ -12,7 +12,11 @@ const debug = Debug('twtkpr:putHandler'); * @param config * @returns */ -export default function putHandler(config: TwtKprConfiguration) { +export default function putHandler( + config: TwtKprConfiguration, + plugins: TwtKprPluginConfiguration[] = [], + reloadCache?: () => Promise +) { const router = express.Router(); router.put('/', (req, res, next) => { @@ -28,7 +32,10 @@ export default function putHandler(config: TwtKprConfiguration) { debug('auth check succeeded'); - return editFile(req, res, config); + editFile(req, res, config); + + reloadCache?.(); }); + return router; } diff --git a/src/middlewares/queryHandler/followingHandler.ts b/src/middlewares/queryHandler/followingHandler.ts index b81a780..09bffe8 100644 --- a/src/middlewares/queryHandler/followingHandler.ts +++ b/src/middlewares/queryHandler/followingHandler.ts @@ -19,7 +19,7 @@ import NodeCache from '@cacheable/node-cache'; export default function followingHandler( req: Request, res: Response, - cache: NodeCache, + following: Twttr[], followingParameter: QueryParameters['following'] ) { const followingsToMatch = getQueryParameterArray( @@ -40,7 +40,7 @@ export default function followingHandler( if (wantsJson) res.set('content-type', 'application/json'); else res.set('content-type', 'text/plain'); - const matchedFollowing = (cache.get('following') as Twttr[]).filter( + const matchedFollowing = following.filter( ({ nick, url }) => (!followingsToMatch.length || (followingsToMatch.length === 1 && followingsToMatch[0] === '') || diff --git a/src/middlewares/queryHandler/metadataHandler.ts b/src/middlewares/queryHandler/metadataHandler.ts index f24e156..253e8b5 100644 --- a/src/middlewares/queryHandler/metadataHandler.ts +++ b/src/middlewares/queryHandler/metadataHandler.ts @@ -1,14 +1,12 @@ import type { Request, Response } from 'express'; import type { Metadata } from 'twtxt-lib'; -import { env } from '../../lib/env.js'; -import twtxtCache from '../../lib/twtxtCache.js'; import { generateEtag, getQueryParameterArray, getValueOrFirstEntry, } from '../../lib/utils.js'; -import NodeCache from '@cacheable/node-cache'; +import { NodeCache } from '@cacheable/node-cache'; import { QueryParameters } from '../../types.js'; export interface MetadataHandler { @@ -28,7 +26,7 @@ export interface MetadataHandler { export default function metadataHandler( req: Request, res: Response, - cache: NodeCache, + metadata: Metadata, metadataParameter: QueryParameters['metadata'] ) { const metadataToMatch = getQueryParameterArray(req.query[metadataParameter]); @@ -38,8 +36,6 @@ export default function metadataHandler( ...getQueryParameterArray(req.query.s), ]; - const metadata = (cache.get('metadata') as Metadata) ?? {}; - const wantsJson = req.is('json') || getValueOrFirstEntry(getQueryParameterArray(req.query.format)) === 'json'; diff --git a/src/middlewares/queryHandler/queryHandler.ts b/src/middlewares/queryHandler/queryHandler.ts index 4777290..d2614f9 100644 --- a/src/middlewares/queryHandler/queryHandler.ts +++ b/src/middlewares/queryHandler/queryHandler.ts @@ -1,15 +1,15 @@ +import fs from 'node:fs'; import path from 'node:path'; -import NodeCache from '@cacheable/node-cache'; import Debug from 'debug'; import type { NextFunction, Request, Response } from 'express'; import { __dirname } from '../../lib/constants.js'; -import { generateEtag } from '../../lib/utils.js'; -import { TwtKprConfiguration } from '../../types.js'; +import { combineStreams, generateEtag } from '../../lib/utils.js'; +import { TwtKprConfiguration, TwtKprPluginConfiguration } from '../../types.js'; import renderApp from '../renderApp/index.js'; import followingHandler from './followingHandler.js'; import metadataHandler from './metadataHandler.js'; import twtHandler from './twtHandler.js'; -import { Twt } from 'twtxt-lib'; +import { Metadata, Twt, Twttr } from 'twtxt-lib'; const debug = Debug('twtkpr:queryHandler'); @@ -22,13 +22,17 @@ const debug = Debug('twtkpr:queryHandler'); */ export default function queryHandler( config: TwtKprConfiguration, - cache: NodeCache, - verifyAuthRequest: (r: Request) => Promise + getFromCache: (key?: string) => Promise, + verifyAuthRequest: (r: Request) => Promise, + plugins: TwtKprPluginConfiguration[] = [] ) { - const { mainRoute, queryParameters, uploadConfiguration } = config; + const { mainRoute, queryParameters } = config; + + const getPluginStreams = (type: keyof TwtKprPluginConfiguration) => + plugins.filter((plugin) => !!plugin[type]).map((plugin) => plugin[type]); return async (req: Request, res: Response, next: NextFunction) => { - debug({ query: JSON.stringify(req.query) }); + debug(`handling query`, JSON.stringify(req.query)); if (!Object.keys(req.query).length) { next(); @@ -36,53 +40,119 @@ export default function queryHandler( } if (req.query[queryParameters.app] !== undefined) { - const appContent = renderApp({ mainRoute, uploadConfiguration }); + debug('rendering app'); + const appContent = renderApp({ mainRoute }); res.set('etag', generateEtag(appContent)).send(appContent); return; } if (req.query[queryParameters.css] !== undefined) { - res.sendFile('styles.css', { - root: path.resolve(__dirname, 'client'), + debug('rendering css'); + const mainStream = fs.createReadStream( + path.join(__dirname, 'client', 'styles.css') + ); + + const pluginStreams = getPluginStreams('clientCSS'); + + const streams = [mainStream, ...pluginStreams]; + + const combined = combineStreams(streams); + res.writeHead(200, { + 'Content-Type': 'text/css', }); + combined.pipe(res); + + combined.on('error', (error) => { + console.error('Error streaming file:', error); + res.end(); + }); + return; } if (req.query[queryParameters.js] !== undefined) { - res.sendFile('script.js', { - root: path.resolve(__dirname, 'client'), + debug('rendering js'); + const mainStream = fs.createReadStream( + path.join(__dirname, 'client', 'script.js') + ); + + const pluginStreams = getPluginStreams('clientJS'); + const streams = [mainStream, ...pluginStreams]; + + const combined = combineStreams(streams); + res.writeHead(200, { + 'Content-Type': 'application/javascript', }); + combined.pipe(res); + + combined.on('error', (error) => { + console.error('Error streaming file:', error); + res.end(); + }); + return; } if ( req.query[queryParameters.following] !== undefined && - cache.get('following') + (await getFromCache('following')) ) { - return followingHandler(req, res, cache, queryParameters.following); + debug('rendering following'); + const following = await getFromCache('following'); + return followingHandler( + req, + res, + following as Twttr[], + queryParameters.following + ); } if ( req.query[queryParameters.metadata] !== undefined && - cache.get('metadata') + (await getFromCache('metadata')) ) { - return metadataHandler(req, res, cache, queryParameters.metadata); + debug('rendering metadata'); + const metadata = (await getFromCache('metadata')) as Metadata; + return metadataHandler(req, res, metadata, queryParameters.metadata); } if ( (req.query[queryParameters.twt] !== undefined || req.query[queryParameters.twts] !== undefined) && - cache.get('twts') + (await getFromCache('twts')) ) { + debug('rendering twts'); + const twts = await getFromCache('twts'); return twtHandler( req, res, - cache.get('twts') as Twt[], + twts as Twt[], queryParameters.twt, queryParameters.twts ); } + (plugins as TwtKprPluginConfiguration[]).forEach((plugin) => { + if (!plugin?.queryRoutes?.length) return; + + plugin.queryRoutes.forEach(async (route) => { + // default to no auth + const { handler, queryParameter, requiresAuth = false } = route ?? {}; + + if (queryParameter && req.query[queryParameter] !== undefined) { + debug(`rendering plugin queryParameter ${queryParameter}`); + + if (requiresAuth && !(await verifyAuthRequest(req))) { + debug('auth check failed'); + next(); + return; + } + + return handler(req, res, next); + } + }); + }); + next(); }; } diff --git a/src/middlewares/queryHandler/twtHandler.ts b/src/middlewares/queryHandler/twtHandler.ts index b1de97e..cfdf92f 100644 --- a/src/middlewares/queryHandler/twtHandler.ts +++ b/src/middlewares/queryHandler/twtHandler.ts @@ -1,5 +1,5 @@ import type { Request, Response } from 'express'; -import type { Metadata, Twt } from 'twtxt-lib'; +import type { Twt } from 'twtxt-lib'; import { generateEtag, @@ -8,7 +8,6 @@ import { } from '../../lib/utils.js'; import dayjs from 'dayjs'; import utc from 'dayjs/plugin/utc.js'; -import NodeCache from '@cacheable/node-cache'; import { QueryParameters } from '../../types.js'; dayjs.extend(utc); diff --git a/src/middlewares/renderApp/renderApp.ts b/src/middlewares/renderApp/renderApp.ts index 083f152..7763e02 100644 --- a/src/middlewares/renderApp/renderApp.ts +++ b/src/middlewares/renderApp/renderApp.ts @@ -1,8 +1,6 @@ import { version } from '../../packageInfo.js'; import { TwtKprConfiguration } from '../../types.js'; -import renderUploadButton from './renderUploadButton.js'; - /** * * @param param0 @@ -10,8 +8,7 @@ import renderUploadButton from './renderUploadButton.js'; */ export default function renderApp({ mainRoute, - uploadConfiguration, -}: Pick) { +}: Pick) { return ` @@ -91,9 +88,8 @@ export default function renderApp({ - ${renderUploadButton(uploadConfiguration)} @@ -107,7 +103,6 @@ export default function renderApp({
TwtKpr v${version ?? 'Unknown'}
- ${renderUploadButton(uploadConfiguration, 'small')} diff --git a/src/middlewares/renderApp/renderUploadButton.ts b/src/middlewares/renderApp/renderUploadButton.ts deleted file mode 100644 index c51f210..0000000 --- a/src/middlewares/renderApp/renderUploadButton.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { TwtKprConfiguration } from '../../types.js'; - -/** - * - * @param uploadConfiguration - * @param variant - * @returns - */ -export default function renderUploadButton( - uploadConfiguration: TwtKprConfiguration['uploadConfiguration'], - variant: 'normal' | 'small' = 'normal' -) { - const { active, allowedMimeTypes, route } = uploadConfiguration ?? {}; - - if (!active) return ''; - - // determine accept from allowed mime types - may need to rebuild value based on fallback n getConfiguration, rather than at the end. - - return ` - -`; -} diff --git a/src/middlewares/uploadHandler.ts b/src/middlewares/uploadHandler.ts deleted file mode 100644 index 678bcc6..0000000 --- a/src/middlewares/uploadHandler.ts +++ /dev/null @@ -1,174 +0,0 @@ -import fsp from 'node:fs/promises'; -import path from 'node:path'; -import formidable from 'formidable'; -import type { NextFunction, Request, Response } from 'express'; -import Debug from 'debug'; - -import { __dirname } from '../lib/env.js'; -import { MimeOptions, TwtKprConfiguration } from '../types.js'; - -const debug = Debug('twtkpr:uploadHandler'); - -/** - * - * @param allowedMimeTypes - * @returns - */ -const getDestinationByMimeTypeConfiguration = ( - allowedMimeTypes?: string | string[] | Record -) => { - const fallback: Record = { - audio: 'audio', - image: 'images', - text: 'texts', - video: 'videos', - '*': 'files', - }; - - const mimeTypeArrayReducer = (acc: Record, curr: string) => { - if (fallback[curr]) acc[curr] = fallback[curr]; - else acc[curr] = `${curr}s`; - return acc; - }; - - if (!allowedMimeTypes) return fallback; - - if (typeof allowedMimeTypes === 'string') - return allowedMimeTypes - .split(',') - .map((val) => val.trim()) - .reduce(mimeTypeArrayReducer, {}); - - if (Array.isArray(allowedMimeTypes)) - return (allowedMimeTypes as string[]).reduce(mimeTypeArrayReducer, {}); - - if (typeof allowedMimeTypes === 'object') return allowedMimeTypes; - - return fallback; -}; - -/** - * - * @param config - * @param verifyAuthRequest - * @returns - */ -export default function uploadHandler( - config: TwtKprConfiguration, - verifyAuthRequest: (r: Request) => Promise -) { - return async (req: Request, res: Response, next: NextFunction) => { - debug('checking auth'); - if (!(await verifyAuthRequest(req))) { - debug('auth check failed'); - res.status(401).send('Unauthorized'); - return; - } - debug('auth check succeeded'); - - const { active, allowedMimeTypes, directory, route, ...otherProps } = - config.uploadConfiguration; - - if ( - !active || - (Array.isArray(allowedMimeTypes) && !allowedMimeTypes.length) - ) { - next(); - return; - } - - debug('using configuration: ', { - uploadConfiguration: config.uploadConfiguration, - }); - - const form = formidable({ - uploadDir: directory, - ...otherProps, - }); - - form.parse(req, async (err, fields, files) => { - if (err) { - next(err); - return; - } - const uploadsDir = (route ?? '').replaceAll('/', ''); - - let hadFileError = false; - const processedFiles: string[] = []; - const destinationByMimeType = allowedMimeTypes; - - debug(`processing ${(files?.files ?? []).length} files`); - - for (const file of files?.files ?? []) { - const { filepath, hash, mimetype, newFilename, originalFilename } = - file ?? {}; - if (!(filepath && newFilename && originalFilename)) return; - - console.log({ file }); - - let ext = path.extname(originalFilename).toLocaleLowerCase(); - if (ext === '.jpeg') ext = '.jpg'; - - const finalFilename = ( - hash && (mimetype?.includes('image') || mimetype?.includes('video')) - ? `${hash}${ext}` - : originalFilename - ) - .replace(/\s+/g, '-') - .toLocaleLowerCase(); - - let destinationDir = ''; - Object.keys(destinationByMimeType).forEach((mimeType) => { - if (file.mimetype?.split('/')?.[0] === mimeType.toLocaleLowerCase()) - destinationDir = - ( - destinationByMimeType[ - mimeType as keyof typeof destinationByMimeType - ] as MimeOptions - ).directory ?? ''; - }); - if (destinationDir === '') - destinationDir = - ( - destinationByMimeType[ - '*' as keyof typeof destinationByMimeType - ] as MimeOptions - ).directory ?? uploadsDir; - - const finalPath = path.join(process.cwd(), 'public', destinationDir); - - debug(`creating '${finalPath}'`); - fsp.mkdir(finalPath, { recursive: true }); - - debug(`copying '${filepath}' to '/${destinationDir}/${finalFilename}'`); - - try { - await fsp.copyFile(filepath, path.join(finalPath, finalFilename)); - - debug(`cleaning up '${filepath}'`); - await fsp.rm(filepath); - - debug(`processed successfully`); - processedFiles.push(`/${destinationDir}/${finalFilename}`); - } catch (err) { - debug(`error!`); - hadFileError = true; - console.error(err); - } - } - - debug('generating reply...'); - if (hadFileError && processedFiles.length) { - res.type('text/plain').status(206).send(processedFiles.join('\n')); - return; - } - - if (!processedFiles.length) { - res.type('text/plain').status(500).send('No files processed'); - return; - } - - res.type('text/plain').status(201).send(processedFiles.join('\n')); - }); - }; -} diff --git a/src/plugin.ts b/src/plugin.ts deleted file mode 100644 index 9464fc0..0000000 --- a/src/plugin.ts +++ /dev/null @@ -1,60 +0,0 @@ -import cookieParser from 'cookie-parser'; -import Debug from 'debug'; -import express, { Request, Router } from 'express'; -import { TwtKprPluginConfiguration } from './types.js'; - -import authCheck from './middlewares/authCheckJWT.js'; -import twtxtCache from './lib/twtxtCache.js'; -import getConfiguration from './lib/getConfiguration.js'; -import queryHandler from './middlewares/queryHandler/index.js'; -import uploadHandler from './middlewares/uploadHandler.js'; -import postHandler from './middlewares/postHandler/index.js'; -import memoryCache from './middlewares/postHandler/memoryCache.js'; -import putHandler from './middlewares/putHandler/index.js'; - -export default function plugin(initialConfig?: TwtKprPluginConfiguration) { - const debug = Debug('twtkpr:plugin'); - - const router = express.Router(); - - const config = getConfiguration(initialConfig ?? {}); - const { publicDirectory, twtxtFilename } = config; - - const verifyAuthRequest = (req: Request) => authCheck(req, config); - - debug('initializing cache'); - const { cache, reloadCache } = twtxtCache({ publicDirectory, twtxtFilename }); - - debug('adding URL encoder'); - router.use(express.urlencoded({ extended: true })); - - debug('adding cookieParser'); - router.use(cookieParser()); - - debug('adding queryRouter'); - router.use(config.mainRoute, queryHandler(config, cache, verifyAuthRequest)); - - debug(`adding uploadHandler at /${config.uploadConfiguration.route}`); - router.post( - `/${config.uploadConfiguration.route}`, - uploadHandler(config, verifyAuthRequest) - ); - - debug('adding postHandler and putHandler'); - router.use(config.mainRoute, postHandler(config), putHandler(config)); - - debug('adding static'); - router.use(express.static(config.publicDirectory)); - - debug('adding default redirect'); - router.get('/', (_, res) => { - res.redirect(config.mainRoute); - }); - - debug('adding memoryCache'); - router.use((req, res, next) => - memoryCache(req, res, next, cache, reloadCache) - ); - - return router as Router; -} diff --git a/src/types.ts b/src/types.ts index ae582cb..9068445 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,3 +1,4 @@ +import { NextFunction, RequestHandler, Router } from 'express'; import { Options } from 'express-rate-limit'; import formidable from 'formidable'; @@ -6,21 +7,6 @@ export interface MimeOptions { rename?: boolean; } -export interface MimeImageOptions extends MimeOptions { - compression?: string; - maxHeight?: string; - maxWidth?: string; -} - -export interface UploadConfiguration extends Partial< - Omit -> { - active: boolean; - directory: string; - allowedMimeTypes: string | string[] | Record; - route: string; -} - export interface QueryParameters { app: string; css: string; @@ -39,13 +25,50 @@ export interface PostLimiterConfiguration extends Partial { export interface TwtKprConfiguration { accessSecret: string; mainRoute: string; + pluginRoute: string; + plugins?: Record>; + postLimiterConfiguration?: PostLimiterConfiguration; privateDirectory: string; publicDirectory: string; + queryParameters: QueryParameters; refreshSecret: string; twtxtFilename: string; - postLimiterConfiguration?: PostLimiterConfiguration; - queryParameters: QueryParameters; - uploadConfiguration: UploadConfiguration; +} + +export interface TwtKprPluginQueryRoute extends Omit< + TwtKprPluginRoute, + 'path' +> { + queryParameter: string; +} + +export interface TwtKprPluginRoute { + path: string; + handler: RequestHandler; + requiresAuth?: boolean; +} + +export type TwtKprPluginConfigurator = ( + config: TwtKprConfiguration +) => TwtKprPluginConfiguration; + +export interface TwtKprPluginConfiguration { + clientCSS?: + | string + | NodeJS.ReadableStream + | (() => string | NodeJS.ReadableStream); + clientJS?: + | string + | NodeJS.ReadableStream + | (() => string | NodeJS.ReadableStream); + name?: string; + onAfterTwt?: (twt: string) => void; + postRoutes?: TwtKprPluginRoute[]; + putRoutes?: TwtKprPluginRoute[]; + queryRoutes?: TwtKprPluginQueryRoute[]; + use?: RequestHandler; + useFirst?: RequestHandler; + useLast?: RequestHandler; } export interface TwtKprPluginConfiguration extends Omit< @@ -54,5 +77,4 @@ export interface TwtKprPluginConfiguration extends Omit< > { postLimiterConfiguration?: Partial; queryParameters?: Partial; - uploadConfiguration?: Partial; } diff --git a/yarn.lock b/yarn.lock index 826415b..5da9742 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,236 +2,236 @@ # Manual changes might be lost - proceed with caution! __metadata: - version: 8 + version: 9 cacheKey: 10c0 -"@cacheable/node-cache@npm:^2.0.2": - version: 2.0.2 - resolution: "@cacheable/node-cache@npm:2.0.2" +"@cacheable/node-cache@npm:^3.0.0": + version: 3.0.0 + resolution: "@cacheable/node-cache@npm:3.0.0" dependencies: - "@cacheable/utils": "npm:^2.4.0" - hookified: "npm:^1.15.0" + "@cacheable/utils": "npm:^2.4.1" + hookified: "npm:^2.1.0" keyv: "npm:^5.6.0" - checksum: 10c0/bc8cbc06daee03e4da4be7985ed2ea068cbb14602304e251dcb67c71a48de964abfb8b130e11a5560116221aae368679b10944e4292f5df1bdd9ddef8f3d53ee + checksum: 10c0/4d64a069562e17d0ce743cf80d66bd727527af7eed5df99778e6f47eaf88221f0f993c9f161844c34759cf0b461c9cba5e61658599980ba1ffa1280af5b93616 languageName: node linkType: hard -"@cacheable/utils@npm:^2.4.0": - version: 2.4.0 - resolution: "@cacheable/utils@npm:2.4.0" +"@cacheable/utils@npm:^2.4.1": + version: 2.4.1 + resolution: "@cacheable/utils@npm:2.4.1" dependencies: - hashery: "npm:^1.5.0" + hashery: "npm:^1.5.1" keyv: "npm:^5.6.0" - checksum: 10c0/07803578b765a73e177f56086bc3b3cbeec6fcf5f2a1458b0469e63dc95c9afe1ba0a208110e6c7c59bfd8ca4c7ac84a5d8146c1799287bb716073ad8e054062 + checksum: 10c0/ca2af47636ed27ab26dfedf12add639f42b90c289ecd5d816fb7a299074d9df463751745a83abfb81f6236a70c8ea40f0902e984869638a5ca3a7274e203f987 languageName: node linkType: hard -"@emnapi/core@npm:^1.7.1": - version: 1.9.0 - resolution: "@emnapi/core@npm:1.9.0" +"@emnapi/core@npm:1.10.0": + version: 1.10.0 + resolution: "@emnapi/core@npm:1.10.0" dependencies: - "@emnapi/wasi-threads": "npm:1.2.0" + "@emnapi/wasi-threads": "npm:1.2.1" tslib: "npm:^2.4.0" - checksum: 10c0/defbfa5861aa5ff1346dbc6a19df50d727ae76ae276a31a97b178db8eecae0c5179976878087b43ac2441750e40e6c50e465280383256deb16dd2fb167dd515c + checksum: 10c0/f51d08227857b60632de7714d708124f0e100a1462dde6df8221760939aa3204a73193830371830fac0716f3ccd2129f2cac1b17cd7d7958bc4da9018a296edb languageName: node linkType: hard -"@emnapi/runtime@npm:^1.7.1": - version: 1.9.0 - resolution: "@emnapi/runtime@npm:1.9.0" +"@emnapi/runtime@npm:1.10.0": + version: 1.10.0 + resolution: "@emnapi/runtime@npm:1.10.0" dependencies: tslib: "npm:^2.4.0" - checksum: 10c0/f825e53b2d3f9d31fd880e669197d006bb5158c3a52ab25f0546f3d52ac58eb539a4bd1dcc378af6c10d202956fa064b28ab7b572a76de58972c0b8656a692ef + checksum: 10c0/953f14991d1aefb92ee6f8eb27dea725e484791a53a0cb5f47d9e0087b9a2c929ff2e92adf95af15d6ad456db6300c6b761ebf72b50a875b874a83520b3ba093 languageName: node linkType: hard -"@emnapi/wasi-threads@npm:1.2.0": - version: 1.2.0 - resolution: "@emnapi/wasi-threads@npm:1.2.0" +"@emnapi/wasi-threads@npm:1.2.1": + version: 1.2.1 + resolution: "@emnapi/wasi-threads@npm:1.2.1" dependencies: tslib: "npm:^2.4.0" - checksum: 10c0/1e3724b5814b06c14782fda87eee9b9aa68af01576c81ffeaefdf621ddb74386e419d5b3b1027b6a8172397729d95a92f814fc4b8d3c224376428faa07a6a01a + checksum: 10c0/32fcfa81ab396533b2ec1f4082b1ff779a05d9c836bbbd3f4398405b0e6814c0d9503b7993130e37bc6941dbc1ded49f55e9700ae9ca4e803bab2b5bc5deb331 languageName: node linkType: hard -"@esbuild/aix-ppc64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/aix-ppc64@npm:0.27.3" +"@esbuild/aix-ppc64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/aix-ppc64@npm:0.27.7" conditions: os=aix & cpu=ppc64 languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/android-arm64@npm:0.27.3" +"@esbuild/android-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/android-arm64@npm:0.27.7" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@esbuild/android-arm@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/android-arm@npm:0.27.3" +"@esbuild/android-arm@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/android-arm@npm:0.27.7" conditions: os=android & cpu=arm languageName: node linkType: hard -"@esbuild/android-x64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/android-x64@npm:0.27.3" +"@esbuild/android-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/android-x64@npm:0.27.7" conditions: os=android & cpu=x64 languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/darwin-arm64@npm:0.27.3" +"@esbuild/darwin-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/darwin-arm64@npm:0.27.7" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/darwin-x64@npm:0.27.3" +"@esbuild/darwin-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/darwin-x64@npm:0.27.7" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/freebsd-arm64@npm:0.27.3" +"@esbuild/freebsd-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/freebsd-arm64@npm:0.27.7" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/freebsd-x64@npm:0.27.3" +"@esbuild/freebsd-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/freebsd-x64@npm:0.27.7" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-arm64@npm:0.27.3" +"@esbuild/linux-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-arm64@npm:0.27.7" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-arm@npm:0.27.3" +"@esbuild/linux-arm@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-arm@npm:0.27.7" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-ia32@npm:0.27.3" +"@esbuild/linux-ia32@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-ia32@npm:0.27.7" conditions: os=linux & cpu=ia32 languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-loong64@npm:0.27.3" +"@esbuild/linux-loong64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-loong64@npm:0.27.7" conditions: os=linux & cpu=loong64 languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-mips64el@npm:0.27.3" +"@esbuild/linux-mips64el@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-mips64el@npm:0.27.7" conditions: os=linux & cpu=mips64el languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-ppc64@npm:0.27.3" +"@esbuild/linux-ppc64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-ppc64@npm:0.27.7" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-riscv64@npm:0.27.3" +"@esbuild/linux-riscv64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-riscv64@npm:0.27.7" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-s390x@npm:0.27.3" +"@esbuild/linux-s390x@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-s390x@npm:0.27.7" conditions: os=linux & cpu=s390x languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/linux-x64@npm:0.27.3" +"@esbuild/linux-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/linux-x64@npm:0.27.7" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@esbuild/netbsd-arm64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/netbsd-arm64@npm:0.27.3" +"@esbuild/netbsd-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/netbsd-arm64@npm:0.27.7" conditions: os=netbsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/netbsd-x64@npm:0.27.3" +"@esbuild/netbsd-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/netbsd-x64@npm:0.27.7" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/openbsd-arm64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/openbsd-arm64@npm:0.27.3" +"@esbuild/openbsd-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/openbsd-arm64@npm:0.27.7" conditions: os=openbsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/openbsd-x64@npm:0.27.3" +"@esbuild/openbsd-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/openbsd-x64@npm:0.27.7" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/openharmony-arm64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/openharmony-arm64@npm:0.27.3" +"@esbuild/openharmony-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/openharmony-arm64@npm:0.27.7" conditions: os=openharmony & cpu=arm64 languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/sunos-x64@npm:0.27.3" +"@esbuild/sunos-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/sunos-x64@npm:0.27.7" conditions: os=sunos & cpu=x64 languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/win32-arm64@npm:0.27.3" +"@esbuild/win32-arm64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/win32-arm64@npm:0.27.7" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/win32-ia32@npm:0.27.3" +"@esbuild/win32-ia32@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/win32-ia32@npm:0.27.7" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.27.3": - version: 0.27.3 - resolution: "@esbuild/win32-x64@npm:0.27.3" +"@esbuild/win32-x64@npm:0.27.7": + version: 0.27.7 + resolution: "@esbuild/win32-x64@npm:0.27.7" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -254,58 +254,49 @@ __metadata: languageName: node linkType: hard -"@eslint/config-array@npm:^0.23.3": - version: 0.23.3 - resolution: "@eslint/config-array@npm:0.23.3" +"@eslint/config-array@npm:^0.23.5": + version: 0.23.5 + resolution: "@eslint/config-array@npm:0.23.5" dependencies: - "@eslint/object-schema": "npm:^3.0.3" + "@eslint/object-schema": "npm:^3.0.5" debug: "npm:^4.3.1" minimatch: "npm:^10.2.4" - checksum: 10c0/7c19027acf9110cc542513ff9f3ca73a61d127e900c24f0e8e4d5e18aa22baf08d1d5bc386563d2f9311095f3b7898fe9b627b590fe9232b745ef60d4443cf9f + checksum: 10c0/b24833c4c76e78ee075d306cd3f095db46b2db0f90cc13a6ee6e4275f9889731c05bf5403ab5fefb79c756e07ac9184ed0e04570341382f9eccbccc80e6d1a0c languageName: node linkType: hard -"@eslint/config-helpers@npm:^0.5.2": - version: 0.5.2 - resolution: "@eslint/config-helpers@npm:0.5.2" +"@eslint/config-helpers@npm:^0.5.5": + version: 0.5.5 + resolution: "@eslint/config-helpers@npm:0.5.5" dependencies: - "@eslint/core": "npm:^1.1.0" - checksum: 10c0/0dc65bc5dd80441afbf5007cae702a5d9dd08893e95fed702a463366cf9ce2f4fd90adb09f9012cb4fcc9783d897ccb739067b1b8a5942f4c8288a6efb396d58 + "@eslint/core": "npm:^1.2.1" + checksum: 10c0/18889c062cd6bdbd4cd92fe57318c44465ea66184aa0ba204a4420712c66764c64093a7905b6c2ffde23e51b268ca2cec1a39c605d336bebf17ee1ba4f0fc0bb languageName: node linkType: hard -"@eslint/core@npm:^1.1.0": - version: 1.1.0 - resolution: "@eslint/core@npm:1.1.0" +"@eslint/core@npm:^1.2.1": + version: 1.2.1 + resolution: "@eslint/core@npm:1.2.1" dependencies: "@types/json-schema": "npm:^7.0.15" - checksum: 10c0/0f875d6f24fbf67cc796e01c2ca82884f755488052ed84183e56377c5b90fe10b491a26e600642db4daea1d5d8ab7906ec12f2bd5cbdb5004b0ef73c802bdb57 + checksum: 10c0/10979b40588ecfef771fcb5013a542a35fb30692cc95a65f3481b0b36fbd89f5679efeb30d57f4eed35203d859aabace2a620177d6c536f71b299a1af2f3398f languageName: node linkType: hard -"@eslint/core@npm:^1.1.1": - version: 1.1.1 - resolution: "@eslint/core@npm:1.1.1" +"@eslint/object-schema@npm:^3.0.5": + version: 3.0.5 + resolution: "@eslint/object-schema@npm:3.0.5" + checksum: 10c0/1db337431f520b99e9edda64ef5fafd7ec6a029843eeb608753025125b6649d861d843cffafafd3c4e37926d7d5f9ec0c6a8e3665c13c3da2144e8132892e92e + languageName: node + linkType: hard + +"@eslint/plugin-kit@npm:^0.7.1": + version: 0.7.1 + resolution: "@eslint/plugin-kit@npm:0.7.1" dependencies: - "@types/json-schema": "npm:^7.0.15" - checksum: 10c0/129c654c78afc1f6d61dccb0ce841be667f09f052f7d5642614b6ba5eeebd579ca6cc336d7b750d88625e61f7aad22fdd62bf83847fbfc10cc3e58cfe6c5072e - languageName: node - linkType: hard - -"@eslint/object-schema@npm:^3.0.3": - version: 3.0.3 - resolution: "@eslint/object-schema@npm:3.0.3" - checksum: 10c0/4abbb7cba5419dce46ae8aa8e979fa190f2e906a8e1b5a8e22e4489f62a68dea3967679f66acbc0c3ef89f33252a7460e39fc2d6f2b4f616a137f3514eda4784 - languageName: node - linkType: hard - -"@eslint/plugin-kit@npm:^0.6.1": - version: 0.6.1 - resolution: "@eslint/plugin-kit@npm:0.6.1" - dependencies: - "@eslint/core": "npm:^1.1.1" + "@eslint/core": "npm:^1.2.1" levn: "npm:^0.4.1" - checksum: 10c0/f8354a7b92cc41e7a55d51986d192134be84f9dc0c91b5e649d075d733b56981c4ca8bf4460d54120c4c87b47984167bad2cb9bceb303f11b0a3bad22b3ed06a + checksum: 10c0/335b0c1c46fd906cb50bd5ce442b9cee18dc44342ce35c718ba4a63d1aa51d2797f16a517b2f4fe371ccd777b6862fafb2dc8195e00e69197ef4cb17ab32c01b languageName: node linkType: hard @@ -316,20 +307,30 @@ __metadata: languageName: node linkType: hard -"@humanfs/core@npm:^0.19.1": - version: 0.19.1 - resolution: "@humanfs/core@npm:0.19.1" - checksum: 10c0/aa4e0152171c07879b458d0e8a704b8c3a89a8c0541726c6b65b81e84fd8b7564b5d6c633feadc6598307d34564bd53294b533491424e8e313d7ab6c7bc5dc67 +"@humanfs/core@npm:^0.19.2": + version: 0.19.2 + resolution: "@humanfs/core@npm:0.19.2" + dependencies: + "@humanfs/types": "npm:^0.15.0" + checksum: 10c0/d0a1d52d7b30c27d49475a53072d1510b81c5803e44b342fb8faf3887f1aa27593a1e6dc76a45268e7892d3f4e198146659281f6b6d55eacf3fd5a38bac30c5c languageName: node linkType: hard "@humanfs/node@npm:^0.16.6": - version: 0.16.7 - resolution: "@humanfs/node@npm:0.16.7" + version: 0.16.8 + resolution: "@humanfs/node@npm:0.16.8" dependencies: - "@humanfs/core": "npm:^0.19.1" + "@humanfs/core": "npm:^0.19.2" + "@humanfs/types": "npm:^0.15.0" "@humanwhocodes/retry": "npm:^0.4.0" - checksum: 10c0/9f83d3cf2cfa37383e01e3cdaead11cd426208e04c44adcdd291aa983aaf72d7d3598844d2fe9ce54896bb1bf8bd4b56883376611c8905a19c44684642823f30 + checksum: 10c0/56140579db811af4e160b195d45d0f29acf644d192c93fe24c9e594ebf06f19dfc157494a07c84540b8a071c0e4b37209c2362765d31734f4d0be869c2422e25 + languageName: node + linkType: hard + +"@humanfs/types@npm:^0.15.0": + version: 0.15.0 + resolution: "@humanfs/types@npm:0.15.0" + checksum: 10c0/fc26b9a024b0e55f7eaf64036df94345bf5d36d6a41ef80ef38e78f1f7430ce26cf435af736adae58913baae18eac3f38c18739054a3d379102015978eae862e languageName: node linkType: hard @@ -370,14 +371,15 @@ __metadata: languageName: node linkType: hard -"@napi-rs/wasm-runtime@npm:^1.1.1": - version: 1.1.1 - resolution: "@napi-rs/wasm-runtime@npm:1.1.1" +"@napi-rs/wasm-runtime@npm:^1.1.4": + version: 1.1.4 + resolution: "@napi-rs/wasm-runtime@npm:1.1.4" dependencies: - "@emnapi/core": "npm:^1.7.1" - "@emnapi/runtime": "npm:^1.7.1" "@tybys/wasm-util": "npm:^0.10.1" - checksum: 10c0/04d57b67e80736e41fe44674a011878db0a8ad893f4d44abb9d3608debb7c174224cba2796ed5b0c1d367368159f3ca6be45f1c59222f70e32ddc880f803d447 + peerDependencies: + "@emnapi/core": ^1.7.1 + "@emnapi/runtime": ^1.7.1 + checksum: 10c0/2e88e1955258949ccf2d18c79975821ad38071b465ef126a5e14110977b97868867b016c1ad046e963cccc42c0bd9db6c8ff5fd1ebb61b87bb3487f339041658 languageName: node linkType: hard @@ -388,39 +390,10 @@ __metadata: languageName: node linkType: hard -"@npmcli/agent@npm:^4.0.0": - version: 4.0.0 - resolution: "@npmcli/agent@npm:4.0.0" - dependencies: - agent-base: "npm:^7.1.0" - http-proxy-agent: "npm:^7.0.0" - https-proxy-agent: "npm:^7.0.1" - lru-cache: "npm:^11.2.1" - socks-proxy-agent: "npm:^8.0.3" - checksum: 10c0/f7b5ce0f3dd42c3f8c6546e8433573d8049f67ef11ec22aa4704bc41483122f68bf97752e06302c455ead667af5cb753e6a09bff06632bc465c1cfd4c4b75a53 - languageName: node - linkType: hard - -"@npmcli/fs@npm:^5.0.0": - version: 5.0.0 - resolution: "@npmcli/fs@npm:5.0.0" - dependencies: - semver: "npm:^7.3.5" - checksum: 10c0/26e376d780f60ff16e874a0ac9bc3399186846baae0b6e1352286385ac134d900cc5dafaded77f38d77f86898fc923ae1cee9d7399f0275b1aa24878915d722b - languageName: node - linkType: hard - -"@oxc-project/runtime@npm:0.115.0": - version: 0.115.0 - resolution: "@oxc-project/runtime@npm:0.115.0" - checksum: 10c0/88905181724fcad06d2852969e706a25a7b6c4fadac22dd6aece24b882a947eda7487451e0824781c9dc87b40b2c6ee582790e47fec5a9ba5d27c6e8c6c35bc1 - languageName: node - linkType: hard - -"@oxc-project/types@npm:=0.115.0": - version: 0.115.0 - resolution: "@oxc-project/types@npm:0.115.0" - checksum: 10c0/47fc31eb3fb3fcf4119955339f92ba2003f9b445834c1a28ed945cd6b9cd833c7ba66fca88aa5277336c2c55df300a593bc67970e544691eceaa486ebe12cb58 +"@oxc-project/types@npm:=0.127.0": + version: 0.127.0 + resolution: "@oxc-project/types@npm:0.127.0" + checksum: 10c0/52c0947ac64a9ca119fe971f947e784a35ecd14a072fa3f542a58a5f6c42010b53f2bf92731e39b9899b83c990a9517bbd29d1e5a5b7b489e52616685c6a9278 languageName: node linkType: hard @@ -440,117 +413,119 @@ __metadata: languageName: node linkType: hard -"@rolldown/binding-android-arm64@npm:1.0.0-rc.9": - version: 1.0.0-rc.9 - resolution: "@rolldown/binding-android-arm64@npm:1.0.0-rc.9" +"@rolldown/binding-android-arm64@npm:1.0.0-rc.17": + version: 1.0.0-rc.17 + resolution: "@rolldown/binding-android-arm64@npm:1.0.0-rc.17" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rolldown/binding-darwin-arm64@npm:1.0.0-rc.9": - version: 1.0.0-rc.9 - resolution: "@rolldown/binding-darwin-arm64@npm:1.0.0-rc.9" +"@rolldown/binding-darwin-arm64@npm:1.0.0-rc.17": + version: 1.0.0-rc.17 + resolution: "@rolldown/binding-darwin-arm64@npm:1.0.0-rc.17" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rolldown/binding-darwin-x64@npm:1.0.0-rc.9": - version: 1.0.0-rc.9 - resolution: "@rolldown/binding-darwin-x64@npm:1.0.0-rc.9" +"@rolldown/binding-darwin-x64@npm:1.0.0-rc.17": + version: 1.0.0-rc.17 + resolution: "@rolldown/binding-darwin-x64@npm:1.0.0-rc.17" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rolldown/binding-freebsd-x64@npm:1.0.0-rc.9": - version: 1.0.0-rc.9 - resolution: "@rolldown/binding-freebsd-x64@npm:1.0.0-rc.9" +"@rolldown/binding-freebsd-x64@npm:1.0.0-rc.17": + version: 1.0.0-rc.17 + resolution: "@rolldown/binding-freebsd-x64@npm:1.0.0-rc.17" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@rolldown/binding-linux-arm-gnueabihf@npm:1.0.0-rc.9": - version: 1.0.0-rc.9 - resolution: "@rolldown/binding-linux-arm-gnueabihf@npm:1.0.0-rc.9" +"@rolldown/binding-linux-arm-gnueabihf@npm:1.0.0-rc.17": + version: 1.0.0-rc.17 + resolution: "@rolldown/binding-linux-arm-gnueabihf@npm:1.0.0-rc.17" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@rolldown/binding-linux-arm64-gnu@npm:1.0.0-rc.9": - version: 1.0.0-rc.9 - resolution: "@rolldown/binding-linux-arm64-gnu@npm:1.0.0-rc.9" +"@rolldown/binding-linux-arm64-gnu@npm:1.0.0-rc.17": + version: 1.0.0-rc.17 + resolution: "@rolldown/binding-linux-arm64-gnu@npm:1.0.0-rc.17" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rolldown/binding-linux-arm64-musl@npm:1.0.0-rc.9": - version: 1.0.0-rc.9 - resolution: "@rolldown/binding-linux-arm64-musl@npm:1.0.0-rc.9" +"@rolldown/binding-linux-arm64-musl@npm:1.0.0-rc.17": + version: 1.0.0-rc.17 + resolution: "@rolldown/binding-linux-arm64-musl@npm:1.0.0-rc.17" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rolldown/binding-linux-ppc64-gnu@npm:1.0.0-rc.9": - version: 1.0.0-rc.9 - resolution: "@rolldown/binding-linux-ppc64-gnu@npm:1.0.0-rc.9" +"@rolldown/binding-linux-ppc64-gnu@npm:1.0.0-rc.17": + version: 1.0.0-rc.17 + resolution: "@rolldown/binding-linux-ppc64-gnu@npm:1.0.0-rc.17" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@rolldown/binding-linux-s390x-gnu@npm:1.0.0-rc.9": - version: 1.0.0-rc.9 - resolution: "@rolldown/binding-linux-s390x-gnu@npm:1.0.0-rc.9" +"@rolldown/binding-linux-s390x-gnu@npm:1.0.0-rc.17": + version: 1.0.0-rc.17 + resolution: "@rolldown/binding-linux-s390x-gnu@npm:1.0.0-rc.17" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@rolldown/binding-linux-x64-gnu@npm:1.0.0-rc.9": - version: 1.0.0-rc.9 - resolution: "@rolldown/binding-linux-x64-gnu@npm:1.0.0-rc.9" +"@rolldown/binding-linux-x64-gnu@npm:1.0.0-rc.17": + version: 1.0.0-rc.17 + resolution: "@rolldown/binding-linux-x64-gnu@npm:1.0.0-rc.17" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rolldown/binding-linux-x64-musl@npm:1.0.0-rc.9": - version: 1.0.0-rc.9 - resolution: "@rolldown/binding-linux-x64-musl@npm:1.0.0-rc.9" +"@rolldown/binding-linux-x64-musl@npm:1.0.0-rc.17": + version: 1.0.0-rc.17 + resolution: "@rolldown/binding-linux-x64-musl@npm:1.0.0-rc.17" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rolldown/binding-openharmony-arm64@npm:1.0.0-rc.9": - version: 1.0.0-rc.9 - resolution: "@rolldown/binding-openharmony-arm64@npm:1.0.0-rc.9" +"@rolldown/binding-openharmony-arm64@npm:1.0.0-rc.17": + version: 1.0.0-rc.17 + resolution: "@rolldown/binding-openharmony-arm64@npm:1.0.0-rc.17" conditions: os=openharmony & cpu=arm64 languageName: node linkType: hard -"@rolldown/binding-wasm32-wasi@npm:1.0.0-rc.9": - version: 1.0.0-rc.9 - resolution: "@rolldown/binding-wasm32-wasi@npm:1.0.0-rc.9" +"@rolldown/binding-wasm32-wasi@npm:1.0.0-rc.17": + version: 1.0.0-rc.17 + resolution: "@rolldown/binding-wasm32-wasi@npm:1.0.0-rc.17" dependencies: - "@napi-rs/wasm-runtime": "npm:^1.1.1" + "@emnapi/core": "npm:1.10.0" + "@emnapi/runtime": "npm:1.10.0" + "@napi-rs/wasm-runtime": "npm:^1.1.4" conditions: cpu=wasm32 languageName: node linkType: hard -"@rolldown/binding-win32-arm64-msvc@npm:1.0.0-rc.9": - version: 1.0.0-rc.9 - resolution: "@rolldown/binding-win32-arm64-msvc@npm:1.0.0-rc.9" +"@rolldown/binding-win32-arm64-msvc@npm:1.0.0-rc.17": + version: 1.0.0-rc.17 + resolution: "@rolldown/binding-win32-arm64-msvc@npm:1.0.0-rc.17" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rolldown/binding-win32-x64-msvc@npm:1.0.0-rc.9": - version: 1.0.0-rc.9 - resolution: "@rolldown/binding-win32-x64-msvc@npm:1.0.0-rc.9" +"@rolldown/binding-win32-x64-msvc@npm:1.0.0-rc.17": + version: 1.0.0-rc.17 + resolution: "@rolldown/binding-win32-x64-msvc@npm:1.0.0-rc.17" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@rolldown/pluginutils@npm:1.0.0-rc.9": - version: 1.0.0-rc.9 - resolution: "@rolldown/pluginutils@npm:1.0.0-rc.9" - checksum: 10c0/fca488fb96b134ccf95b42632b6112b4abb8b3a9688f166fbd627410def2538ee201953717d234ddecbff62dfe4edc4e72c657b01a9d0750134608d767eea5fd +"@rolldown/pluginutils@npm:1.0.0-rc.17": + version: 1.0.0-rc.17 + resolution: "@rolldown/pluginutils@npm:1.0.0-rc.17" + checksum: 10c0/5e840b20cc531910c093c1ca36e550952cf4936465a50d89f0a98fc9d0dfd7d319d06a10a5f4376209d89e9bf4d60af6cc8363ebf0dcc5e60842f7fef438b2f0 languageName: node linkType: hard @@ -562,11 +537,11 @@ __metadata: linkType: hard "@tybys/wasm-util@npm:^0.10.1": - version: 0.10.1 - resolution: "@tybys/wasm-util@npm:0.10.1" + version: 0.10.2 + resolution: "@tybys/wasm-util@npm:0.10.2" dependencies: tslib: "npm:^2.4.0" - checksum: 10c0/b255094f293794c6d2289300c5fbcafbb5532a3aed3a5ffd2f8dc1828e639b88d75f6a376dd8f94347a44813fd7a7149d8463477a9a49525c8b2dcaa38c2d1e8 + checksum: 10c0/26165bcd1fd7269f42d7fbe3de318f854a8968de8397e89fc9a423bb3e2da35a52150f382e6323b3367595beb16d9800a6f35971a5599daf76da1742ec3afc25 languageName: node linkType: hard @@ -666,12 +641,12 @@ __metadata: languageName: node linkType: hard -"@types/express-session@npm:^1.18.2": - version: 1.18.2 - resolution: "@types/express-session@npm:1.18.2" +"@types/express-session@npm:^1.19.0": + version: 1.19.0 + resolution: "@types/express-session@npm:1.19.0" dependencies: "@types/express": "npm:*" - checksum: 10c0/5d5aa134ce8990920b35f2dd0aa55168af44faaf14789b6921d361ce016c43bdc66feba287753981a2fee33fd95b8a829c4418c3ca480b03961724b8bc13e453 + checksum: 10c0/523035f476c84623d6ee4ec81452066d0112f66a41ba9488003c8898f26c85c46951e093bb1cb81447571a467b4a7bba87bd52c08e519a2af254c9de48a25d5f languageName: node linkType: hard @@ -686,12 +661,12 @@ __metadata: languageName: node linkType: hard -"@types/formidable@npm:^3.5.0": - version: 3.5.0 - resolution: "@types/formidable@npm:3.5.0" +"@types/formidable@npm:^3.5.1": + version: 3.5.1 + resolution: "@types/formidable@npm:3.5.1" dependencies: "@types/node": "npm:*" - checksum: 10c0/6e6b70a6f80f29f053a5e11a1277ce23c5491079897cb9b1c2c1cf403f6b0590ab1bd8f7fce45bddb14366414e3291c8b8ab1ccb688237448e350effb939c4f3 + checksum: 10c0/e942ce8ebd6e12f8751f5e138bdd5ad0efb921bf1aa48c66e8e25a548d28eb2102551a47c6b2d958bd4dc9e2f41927a201c03192c2b58f526c0fdae3b0c9589c languageName: node linkType: hard @@ -742,28 +717,19 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*": - version: 25.3.0 - resolution: "@types/node@npm:25.3.0" +"@types/node@npm:*, @types/node@npm:^25.6.0": + version: 25.6.0 + resolution: "@types/node@npm:25.6.0" dependencies: - undici-types: "npm:~7.18.0" - checksum: 10c0/7b2b18c9d68047157367fc2f786d4f166d22dc0ad9f82331ca02fb16f2f391854123dbe604dcb938cda119c87051e4bb71dcb9ece44a579f483a6f96d4bd41de - languageName: node - linkType: hard - -"@types/node@npm:^25.5.0": - version: 25.5.0 - resolution: "@types/node@npm:25.5.0" - dependencies: - undici-types: "npm:~7.18.0" - checksum: 10c0/70c508165b6758c4f88d4f91abca526c3985eee1985503d4c2bd994dbaf588e52ac57e571160f18f117d76e963570ac82bd20e743c18987e82564312b3b62119 + undici-types: "npm:~7.19.0" + checksum: 10c0/d2d2015630ff098a201407f55f5077a20270ae4f465c739b40865cd9933b91b9c5d2b85568eadaf3db0801b91e267333ca7eb39f007428b173d1cdab4b339ac5 languageName: node linkType: hard "@types/qs@npm:*": - version: 6.14.0 - resolution: "@types/qs@npm:6.14.0" - checksum: 10c0/5b3036df6e507483869cdb3858201b2e0b64b4793dc4974f188caa5b5732f2333ab9db45c08157975054d3b070788b35088b4bc60257ae263885016ee2131310 + version: 6.15.0 + resolution: "@types/qs@npm:6.15.0" + checksum: 10c0/1b104cac50e655fc41d7fc1de2c2aba2908c4cf833a555b6808fb4c96752662b439238f2392a15d2590a7a6ca75dbd40e42d9378ac2be0d548ee484954363688 languageName: node linkType: hard @@ -815,85 +781,85 @@ __metadata: languageName: node linkType: hard -"@vitest/expect@npm:4.1.0": - version: 4.1.0 - resolution: "@vitest/expect@npm:4.1.0" +"@vitest/expect@npm:4.1.5": + version: 4.1.5 + resolution: "@vitest/expect@npm:4.1.5" dependencies: "@standard-schema/spec": "npm:^1.1.0" "@types/chai": "npm:^5.2.2" - "@vitest/spy": "npm:4.1.0" - "@vitest/utils": "npm:4.1.0" + "@vitest/spy": "npm:4.1.5" + "@vitest/utils": "npm:4.1.5" chai: "npm:^6.2.2" - tinyrainbow: "npm:^3.0.3" - checksum: 10c0/91cd7bb036401df5dfd9204f3de9a0afdb21dea6ee154622e5ed849e87a0df68b74258d490559c7046d3c03bc7aa634e9b0c166942a21d5e475c86c971486091 + tinyrainbow: "npm:^3.1.0" + checksum: 10c0/5184682304db471aa20024c1154210ad3d6d590afb61646201ce1a15297259f9a35f92f8fad4435bc8a82135e307ddd27c8495f72417d72d9aa139eb281d9e06 languageName: node linkType: hard -"@vitest/mocker@npm:4.1.0": - version: 4.1.0 - resolution: "@vitest/mocker@npm:4.1.0" +"@vitest/mocker@npm:4.1.5": + version: 4.1.5 + resolution: "@vitest/mocker@npm:4.1.5" dependencies: - "@vitest/spy": "npm:4.1.0" + "@vitest/spy": "npm:4.1.5" estree-walker: "npm:^3.0.3" magic-string: "npm:^0.30.21" peerDependencies: msw: ^2.4.9 - vite: ^6.0.0 || ^7.0.0 || ^8.0.0-0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: msw: optional: true vite: optional: true - checksum: 10c0/f61d3df6461008eb1e62ba465172207b29bd0d9866ff6bc88cd40fc99cd5d215ad89e2894ba6de87068e33f75de903b28a65ccc6074edf3de1fbead6a4a369cc + checksum: 10c0/bcfe97700476130933c7ea33fa670c8d2768a81de5325ce407f901e55c2f66cabbb88a7b6cffb46ddf33dff7d8fc209d769fb298f568e310fbeead9b36f6fdb9 languageName: node linkType: hard -"@vitest/pretty-format@npm:4.1.0": - version: 4.1.0 - resolution: "@vitest/pretty-format@npm:4.1.0" +"@vitest/pretty-format@npm:4.1.5": + version: 4.1.5 + resolution: "@vitest/pretty-format@npm:4.1.5" dependencies: - tinyrainbow: "npm:^3.0.3" - checksum: 10c0/638077f53b5f24ff2d4bc062e69931fa718141db28ddafe435de98a402586b82e8c3cadfc580c0ad233d7f0203aa22d866ac2adca98b83038dbd5423c3d7fe27 + tinyrainbow: "npm:^3.1.0" + checksum: 10c0/42b5e9b75e87c0a884d36bee364e2d07ee45e96f413377737a74993e077d90c3a12aa36743855aee5e4e28b78fae20e3e6de5eef8d5344b9aba2bc1e1d5537a1 languageName: node linkType: hard -"@vitest/runner@npm:4.1.0": - version: 4.1.0 - resolution: "@vitest/runner@npm:4.1.0" +"@vitest/runner@npm:4.1.5": + version: 4.1.5 + resolution: "@vitest/runner@npm:4.1.5" dependencies: - "@vitest/utils": "npm:4.1.0" + "@vitest/utils": "npm:4.1.5" pathe: "npm:^2.0.3" - checksum: 10c0/9e09ca1b9070d3fe26c9bd48443d21b9fe2cb9abb2f694300bd9e5065f4e904f7322c07cd4bafadfed6fb11adfb50e4d1535f327ac6d24b6c373e92be90510bc + checksum: 10c0/6a03b313a121155f6dd9e32eeb103c0e12440f586bc4ba1f0d77444e44c6df4652a44443718552037463115635b8378e11f35902d90ce1326f77743219fca056 languageName: node linkType: hard -"@vitest/snapshot@npm:4.1.0": - version: 4.1.0 - resolution: "@vitest/snapshot@npm:4.1.0" +"@vitest/snapshot@npm:4.1.5": + version: 4.1.5 + resolution: "@vitest/snapshot@npm:4.1.5" dependencies: - "@vitest/pretty-format": "npm:4.1.0" - "@vitest/utils": "npm:4.1.0" + "@vitest/pretty-format": "npm:4.1.5" + "@vitest/utils": "npm:4.1.5" magic-string: "npm:^0.30.21" pathe: "npm:^2.0.3" - checksum: 10c0/582c22988c47a99d93dd17ef660427fefe101f67ae4394b64fe58ec103ddc55fc5993626b4a2b556e0a38d40552abaca78196907455e794805ba197b3d56860f + checksum: 10c0/e11bf50d06702331290750a40eaef86078c108df3cd9a52bb1be7b84250048790163f36827525be6a383a4bb1994fc35e6d0c24239a41688b0bb68a1d15d172f languageName: node linkType: hard -"@vitest/spy@npm:4.1.0": - version: 4.1.0 - resolution: "@vitest/spy@npm:4.1.0" - checksum: 10c0/363776bbffda45af76ff500deacb9b1a35ad8b889462c1be9ebe5f29578ce1dd2c4bd7858c8188614a7db9699a5c802b7beb72e5a18ab5130a70326817961446 +"@vitest/spy@npm:4.1.5": + version: 4.1.5 + resolution: "@vitest/spy@npm:4.1.5" + checksum: 10c0/fda6b1ee0a2fec1a152d8041aba7a79744c3876863b244d1ed406d02b36e8ccc997edb2e3963d1027d728d3dc5a33813e11bef53a0a14fc7de4de5e721d0f591 languageName: node linkType: hard -"@vitest/utils@npm:4.1.0": - version: 4.1.0 - resolution: "@vitest/utils@npm:4.1.0" +"@vitest/utils@npm:4.1.5": + version: 4.1.5 + resolution: "@vitest/utils@npm:4.1.5" dependencies: - "@vitest/pretty-format": "npm:4.1.0" + "@vitest/pretty-format": "npm:4.1.5" convert-source-map: "npm:^2.0.0" - tinyrainbow: "npm:^3.0.3" - checksum: 10c0/222afbdef4f680a554bb6c3d946a4a879a441ebfb8597295cb7554d295e0e2624f3d4c2920b5767bbb8961a9f8a16756270ffc84032f5ea432cdce080ccab050 + tinyrainbow: "npm:^3.1.0" + checksum: 10c0/72409717e68018e5fe42fa173cc4eff6def8c35bd52013f86ddb414cd28d73fcc425ac62968e01a52371b3fd5a7a775536283d2f1d64432753f628712a6a4908 languageName: node linkType: hard @@ -932,22 +898,15 @@ __metadata: languageName: node linkType: hard -"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": - version: 7.1.4 - resolution: "agent-base@npm:7.1.4" - checksum: 10c0/c2c9ab7599692d594b6a161559ada307b7a624fa4c7b03e3afdb5a5e31cd0e53269115b620fcab024c5ac6a6f37fa5eb2e004f076ad30f5f7e6b8b671f7b35fe - languageName: node - linkType: hard - "ajv@npm:^6.14.0": - version: 6.14.0 - resolution: "ajv@npm:6.14.0" + version: 6.15.0 + resolution: "ajv@npm:6.15.0" dependencies: fast-deep-equal: "npm:^3.1.1" fast-json-stable-stringify: "npm:^2.0.0" json-schema-traverse: "npm:^0.4.1" uri-js: "npm:^4.2.2" - checksum: 10c0/a2bc39b0555dc9802c899f86990eb8eed6e366cddbf65be43d5aa7e4f3c4e1a199d5460fd7ca4fb3d864000dbbc049253b72faa83b3b30e641ca52cb29a68c22 + checksum: 10c0/67966499dd272ecde1c2e467084411132891523d057487587879d39ac04207f4351b7b2324c83198013967fbfa632c1612adc960114a30770fbe07a0773b32c2 languageName: node linkType: hard @@ -1052,12 +1011,12 @@ __metadata: languageName: node linkType: hard -"brace-expansion@npm:^5.0.2": - version: 5.0.3 - resolution: "brace-expansion@npm:5.0.3" +"brace-expansion@npm:^5.0.5": + version: 5.0.5 + resolution: "brace-expansion@npm:5.0.5" dependencies: balanced-match: "npm:^4.0.2" - checksum: 10c0/e474d300e581ec56851b3863ff1cf18573170c6d06deb199ccbd03b2119c36975f6ce2abc7b770f5bebddc1ab022661a9fea9b4d56f33315d7bef54d8793869e + checksum: 10c0/4d238e14ed4f5cc9c07285550a41cef23121ca08ba99fa9eb5b55b580dcb6bf868b8210aa10526bdc9f8dc97f33ca2a7259039c4cc131a93042beddb424c48e3 languageName: node linkType: hard @@ -1075,25 +1034,6 @@ __metadata: languageName: node linkType: hard -"cacache@npm:^20.0.1": - version: 20.0.3 - resolution: "cacache@npm:20.0.3" - dependencies: - "@npmcli/fs": "npm:^5.0.0" - fs-minipass: "npm:^3.0.0" - glob: "npm:^13.0.0" - lru-cache: "npm:^11.1.0" - minipass: "npm:^7.0.3" - minipass-collect: "npm:^2.0.1" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - p-map: "npm:^7.0.2" - ssri: "npm:^13.0.0" - unique-filename: "npm:^5.0.0" - checksum: 10c0/c7da1ca694d20e8f8aedabd21dc11518f809a7d2b59aa76a1fc655db5a9e62379e465c157ddd2afe34b19230808882288effa6911b2de26a088a6d5645123462 - languageName: node - linkType: hard - "call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": version: 1.0.2 resolution: "call-bind-apply-helpers@npm:1.0.2" @@ -1145,9 +1085,9 @@ __metadata: linkType: hard "content-disposition@npm:^1.0.0": - version: 1.0.1 - resolution: "content-disposition@npm:1.0.1" - checksum: 10c0/bd7ff1fe8d2542d3a2b9a29428cc3591f6ac27bb5595bba2c69664408a68f9538b14cbd92479796ea835b317a09a527c8c7209c4200381dedb0c34d3b658849e + version: 1.1.0 + resolution: "content-disposition@npm:1.1.0" + checksum: 10c0/94e0aef65873e69330f5f187fbc44ebce593bdcb8013dd8a68b7d0f159ca089bd30db3f8095d829f81c341695b60a6085ee6e15e6d775c4a325b586cc8d91974 languageName: node linkType: hard @@ -1221,13 +1161,6 @@ __metadata: languageName: node linkType: hard -"dayjs@npm:^1.11.19": - version: 1.11.19 - resolution: "dayjs@npm:1.11.19" - checksum: 10c0/7d8a6074a343f821f81ea284d700bd34ea6c7abbe8d93bce7aba818948957c1b7f56131702e5e890a5622cdfc05dcebe8aed0b8313bdc6838a594d7846b0b000 - languageName: node - linkType: hard - "dayjs@npm:^1.11.20": version: 1.11.20 resolution: "dayjs@npm:1.11.20" @@ -1235,7 +1168,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.7, debug@npm:^4.4.0, debug@npm:^4.4.3": +"debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.7, debug@npm:^4.4.0, debug@npm:^4.4.3": version: 4.4.3 resolution: "debug@npm:4.4.3" dependencies: @@ -1328,15 +1261,6 @@ __metadata: languageName: node linkType: hard -"encoding@npm:^0.1.13": - version: 0.1.13 - resolution: "encoding@npm:0.1.13" - dependencies: - iconv-lite: "npm:^0.6.2" - checksum: 10c0/36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 - languageName: node - linkType: hard - "env-paths@npm:^2.2.0": version: 2.2.1 resolution: "env-paths@npm:2.2.1" @@ -1344,13 +1268,6 @@ __metadata: languageName: node linkType: hard -"err-code@npm:^2.0.2": - version: 2.0.3 - resolution: "err-code@npm:2.0.3" - checksum: 10c0/b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 - languageName: node - linkType: hard - "es-define-property@npm:^1.0.1": version: 1.0.1 resolution: "es-define-property@npm:1.0.1" @@ -1366,9 +1283,9 @@ __metadata: linkType: hard "es-module-lexer@npm:^2.0.0": - version: 2.0.0 - resolution: "es-module-lexer@npm:2.0.0" - checksum: 10c0/ae78dbbd43035a4b972c46cfb6877e374ea290adfc62bc2f5a083fea242c0b2baaab25c5886af86be55f092f4a326741cb94334cd3c478c383fdc8a9ec5ff817 + version: 2.1.0 + resolution: "es-module-lexer@npm:2.1.0" + checksum: 10c0/93bcf2454fa72d67fe3ccd0abef8ce7933f5840a319513418a643dd8e9c6aa8f49709cecfae02ded722805dd327232d30723a807cc52e6809d6ac697c62c29fb languageName: node linkType: hard @@ -1394,35 +1311,35 @@ __metadata: linkType: hard "esbuild@npm:~0.27.0": - version: 0.27.3 - resolution: "esbuild@npm:0.27.3" + version: 0.27.7 + resolution: "esbuild@npm:0.27.7" dependencies: - "@esbuild/aix-ppc64": "npm:0.27.3" - "@esbuild/android-arm": "npm:0.27.3" - "@esbuild/android-arm64": "npm:0.27.3" - "@esbuild/android-x64": "npm:0.27.3" - "@esbuild/darwin-arm64": "npm:0.27.3" - "@esbuild/darwin-x64": "npm:0.27.3" - "@esbuild/freebsd-arm64": "npm:0.27.3" - "@esbuild/freebsd-x64": "npm:0.27.3" - "@esbuild/linux-arm": "npm:0.27.3" - "@esbuild/linux-arm64": "npm:0.27.3" - "@esbuild/linux-ia32": "npm:0.27.3" - "@esbuild/linux-loong64": "npm:0.27.3" - "@esbuild/linux-mips64el": "npm:0.27.3" - "@esbuild/linux-ppc64": "npm:0.27.3" - "@esbuild/linux-riscv64": "npm:0.27.3" - "@esbuild/linux-s390x": "npm:0.27.3" - "@esbuild/linux-x64": "npm:0.27.3" - "@esbuild/netbsd-arm64": "npm:0.27.3" - "@esbuild/netbsd-x64": "npm:0.27.3" - "@esbuild/openbsd-arm64": "npm:0.27.3" - "@esbuild/openbsd-x64": "npm:0.27.3" - "@esbuild/openharmony-arm64": "npm:0.27.3" - "@esbuild/sunos-x64": "npm:0.27.3" - "@esbuild/win32-arm64": "npm:0.27.3" - "@esbuild/win32-ia32": "npm:0.27.3" - "@esbuild/win32-x64": "npm:0.27.3" + "@esbuild/aix-ppc64": "npm:0.27.7" + "@esbuild/android-arm": "npm:0.27.7" + "@esbuild/android-arm64": "npm:0.27.7" + "@esbuild/android-x64": "npm:0.27.7" + "@esbuild/darwin-arm64": "npm:0.27.7" + "@esbuild/darwin-x64": "npm:0.27.7" + "@esbuild/freebsd-arm64": "npm:0.27.7" + "@esbuild/freebsd-x64": "npm:0.27.7" + "@esbuild/linux-arm": "npm:0.27.7" + "@esbuild/linux-arm64": "npm:0.27.7" + "@esbuild/linux-ia32": "npm:0.27.7" + "@esbuild/linux-loong64": "npm:0.27.7" + "@esbuild/linux-mips64el": "npm:0.27.7" + "@esbuild/linux-ppc64": "npm:0.27.7" + "@esbuild/linux-riscv64": "npm:0.27.7" + "@esbuild/linux-s390x": "npm:0.27.7" + "@esbuild/linux-x64": "npm:0.27.7" + "@esbuild/netbsd-arm64": "npm:0.27.7" + "@esbuild/netbsd-x64": "npm:0.27.7" + "@esbuild/openbsd-arm64": "npm:0.27.7" + "@esbuild/openbsd-x64": "npm:0.27.7" + "@esbuild/openharmony-arm64": "npm:0.27.7" + "@esbuild/sunos-x64": "npm:0.27.7" + "@esbuild/win32-arm64": "npm:0.27.7" + "@esbuild/win32-ia32": "npm:0.27.7" + "@esbuild/win32-x64": "npm:0.27.7" dependenciesMeta: "@esbuild/aix-ppc64": optional: true @@ -1478,7 +1395,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 10c0/fdc3f87a3f08b3ef98362f37377136c389a0d180fda4b8d073b26ba930cf245521db0a368f119cc7624bc619248fff1439f5811f062d853576f8ffa3df8ee5f1 + checksum: 10c0/ccd51f0555708bc9ff4ec9dc3ac92d3daacd45ecaac949ca8645984c5c323bf8cefe98c2df307418685e0b4ce37f9a3bdbfe8e3651fe632a0059a436195a17d4 languageName: node linkType: hard @@ -1562,16 +1479,16 @@ __metadata: languageName: node linkType: hard -"eslint@npm:^10.0.3": - version: 10.0.3 - resolution: "eslint@npm:10.0.3" +"eslint@npm:^10.3.0": + version: 10.3.0 + resolution: "eslint@npm:10.3.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.8.0" "@eslint-community/regexpp": "npm:^4.12.2" - "@eslint/config-array": "npm:^0.23.3" - "@eslint/config-helpers": "npm:^0.5.2" - "@eslint/core": "npm:^1.1.1" - "@eslint/plugin-kit": "npm:^0.6.1" + "@eslint/config-array": "npm:^0.23.5" + "@eslint/config-helpers": "npm:^0.5.5" + "@eslint/core": "npm:^1.2.1" + "@eslint/plugin-kit": "npm:^0.7.1" "@humanfs/node": "npm:^0.16.6" "@humanwhocodes/module-importer": "npm:^1.0.1" "@humanwhocodes/retry": "npm:^0.4.2" @@ -1582,7 +1499,7 @@ __metadata: escape-string-regexp: "npm:^4.0.0" eslint-scope: "npm:^9.1.2" eslint-visitor-keys: "npm:^5.0.1" - espree: "npm:^11.1.1" + espree: "npm:^11.2.0" esquery: "npm:^1.7.0" esutils: "npm:^2.0.2" fast-deep-equal: "npm:^3.1.3" @@ -1603,18 +1520,18 @@ __metadata: optional: true bin: eslint: bin/eslint.js - checksum: 10c0/fbbb4d99cb6af5c30b163b7898241dbac1cd1cee0e6746d5732a95e3b1e68b5bea0bc27cb78e8440a39cf4cc98c7f52cf5ed8d7c2bbdf2232662476d113c41fc + checksum: 10c0/81e3ceba949f62d1b530660279db86cf814f5dc43d7cc3759a8008fe4fc679d46568279fe1cceb7ddbbc98ab57a96ae524f6e811ffc6897b49b90ea08aa785e5 languageName: node linkType: hard -"espree@npm:^11.1.1": - version: 11.1.1 - resolution: "espree@npm:11.1.1" +"espree@npm:^11.2.0": + version: 11.2.0 + resolution: "espree@npm:11.2.0" dependencies: acorn: "npm:^8.16.0" acorn-jsx: "npm:^5.3.2" eslint-visitor-keys: "npm:^5.0.1" - checksum: 10c0/2feae74efdfb037b9e9fcb30506799845cf20900de5e441ed03e5c51aaa249f85ea5818ff177682acc0c9bfb4ac97e1965c238ee44ac7c305aab8747177bab69 + checksum: 10c0/cf87e18ffd9dc113eb8d16588e7757701bc10c9934a71cce8b89c2611d51672681a918307bd6b19ac3ccd0e7ba1cbccc2f815b36b52fa7e73097b251014c3d81 languageName: node linkType: hard @@ -1680,25 +1597,14 @@ __metadata: languageName: node linkType: hard -"express-rate-limit@npm:8": - version: 8.2.1 - resolution: "express-rate-limit@npm:8.2.1" - dependencies: - ip-address: "npm:10.0.1" - peerDependencies: - express: ">= 4.11" - checksum: 10c0/54185f211c25655382436b8ad1a2136df0d5dc88f4d9d4438ca7cbc87cef0cd34cb01b8fc62d290445326aa6581470d2ff44502c3f1a34a5ed2c2ce56809fa01 - languageName: node - linkType: hard - -"express-rate-limit@npm:^8.3.1": - version: 8.3.1 - resolution: "express-rate-limit@npm:8.3.1" +"express-rate-limit@npm:8, express-rate-limit@npm:^8.5.0": + version: 8.5.0 + resolution: "express-rate-limit@npm:8.5.0" dependencies: ip-address: "npm:10.1.0" peerDependencies: express: ">= 4.11" - checksum: 10c0/e3229938457cec617460c54ef4e90c8c254facc884729325d20ea35e3838bd273e4c611fc1f4a76f6d14c411e30d31b15e88eb4be87408615ff0aacc142511a2 + checksum: 10c0/242ac614854493ef0ae0d32cf3951e06553cd2030bdd2517c89a7e77a48766efcbd6f6bdc2b02c3a5da45f8f988b7c9fd30b41d1d959732a230985fd96ad7485 languageName: node linkType: hard @@ -1733,43 +1639,42 @@ __metadata: version: 0.0.0-use.local resolution: "express-twtkpr@workspace:." dependencies: - "@cacheable/node-cache": "npm:^2.0.2" + "@cacheable/node-cache": "npm:^3.0.0" "@exodus/blakejs": "npm:^1.1.1-exodus.0" "@types/cookie-parser": "npm:^1.4.10" "@types/cors": "npm:^2.8.19" "@types/debug": "npm:^4.1.13" "@types/express": "npm:^5.0.6" - "@types/express-session": "npm:^1.18.2" - "@types/formidable": "npm:^3.5.0" + "@types/express-session": "npm:^1.19.0" + "@types/formidable": "npm:^3.5.1" "@types/jsonwebtoken": "npm:^9.0.10" "@types/morgan": "npm:^1.9.10" - "@types/node": "npm:^25.5.0" + "@types/node": "npm:^25.6.0" "@types/supertest": "npm:^7.2.0" base32.js: "npm:^0.1.0" bcryptjs: "npm:^3.0.3" cookie-parser: "npm:^1.4.7" dayjs: "npm:^1.11.20" debug: "npm:^4.4.3" - eslint: "npm:^10.0.3" + eslint: "npm:^10.3.0" eslint-config-prettier: "npm:^10.1.8" eslint-plugin-prettier: "npm:^5.5.5" eslint-plugin-security: "npm:^4.0.0" express: "npm:^5.2.1" - express-rate-limit: "npm:^8.3.1" + express-rate-limit: "npm:^8.5.0" express-session: "npm:^1.19.0" express-slow-down: "npm:^3.1.0" - formidable: "npm:^3.5.4" jsonwebtoken: "npm:^9.0.3" link: "npm:^2.1.2" - prettier: "npm:^3.8.1" + prettier: "npm:^3.8.3" session-file-store: "npm:^1.5.0" supertest: "npm:^7.2.2" tsx: "npm:^4.21.0" - twtxt-lib: "npm:^0.9.4" + twtxt-lib: "npm:^0.10.1" typescript: "npm:^5.9.3" - uuid: "npm:^13.0.0" - vitest: "npm:^4.1.0" - zod: "npm:^4.3.6" + uuid: "npm:^14.0.0" + vitest: "npm:^4.1.5" + zod: "npm:^4.4.3" languageName: unknown linkType: soft @@ -1900,9 +1805,9 @@ __metadata: linkType: hard "flatted@npm:^3.2.9": - version: 3.3.3 - resolution: "flatted@npm:3.3.3" - checksum: 10c0/e957a1c6b0254aa15b8cce8533e24165abd98fadc98575db082b786b5da1b7d72062b81bfdcd1da2f4d46b6ed93bec2434e62333e9b4261d79ef2e75a10dd538 + version: 3.4.2 + resolution: "flatted@npm:3.4.2" + checksum: 10c0/a65b67aae7172d6cdf63691be7de6c5cd5adbdfdfe2e9da1a09b617c9512ed794037741ee53d93114276bff3f93cd3b0d97d54f9b316e1e4885dde6e9ffdf7ed languageName: node linkType: hard @@ -1955,15 +1860,6 @@ __metadata: languageName: node linkType: hard -"fs-minipass@npm:^3.0.0": - version: 3.0.3 - resolution: "fs-minipass@npm:3.0.3" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 - languageName: node - linkType: hard - "fsevents@npm:~2.3.3": version: 2.3.3 resolution: "fsevents@npm:2.3.3" @@ -2029,11 +1925,11 @@ __metadata: linkType: hard "get-tsconfig@npm:^4.7.5": - version: 4.13.6 - resolution: "get-tsconfig@npm:4.13.6" + version: 4.14.0 + resolution: "get-tsconfig@npm:4.14.0" dependencies: resolve-pkg-maps: "npm:^1.0.0" - checksum: 10c0/bab6937302f542f97217cbe7cbbdfa7e85a56a377bc7a73e69224c1f0b7c9ae8365918e55752ae8648265903f506c1705f63c0de1d4bab1ec2830fef3e539a1a + checksum: 10c0/abc2b9275468eb589079a0b7a95eb5107c14fdd0ca6dda1bff116fe774ea1f79975421dcb22a0c86b4f820fcc69a7655dddf9b6d6a8a2c06fcb59e19794c0724 languageName: node linkType: hard @@ -2046,17 +1942,6 @@ __metadata: languageName: node linkType: hard -"glob@npm:^13.0.0": - version: 13.0.6 - resolution: "glob@npm:13.0.6" - dependencies: - minimatch: "npm:^10.2.2" - minipass: "npm:^7.1.3" - path-scurry: "npm:^2.0.2" - checksum: 10c0/269c236f11a9b50357fe7a8c6aadac667e01deb5242b19c84975628f05f4438d8ee1354bb62c5d6c10f37fd59911b54d7799730633a2786660d8c69f1d18120a - languageName: node - linkType: hard - "gopd@npm:^1.2.0": version: 1.2.0 resolution: "gopd@npm:1.2.0" @@ -2087,35 +1972,35 @@ __metadata: languageName: node linkType: hard -"hashery@npm:^1.5.0": - version: 1.5.0 - resolution: "hashery@npm:1.5.0" +"hashery@npm:^1.5.1": + version: 1.5.1 + resolution: "hashery@npm:1.5.1" dependencies: - hookified: "npm:^1.14.0" - checksum: 10c0/475ebc8edc238aa91a2a63400d4ad7b51f823f1920100053d8f6fa3f0d44bff47911185269069e22a3fdcbf68db405ad5bdc197c784f75f8923e689526843d3c + hookified: "npm:^1.15.0" + checksum: 10c0/ab4225b655a7b0d05df99b1a59d5b3a51fe433f82422ca25e6f3f4c4ddd30adb49ebd38e0047ef9bded93319c1e9fc857e16aa382e554929c871cb77d39fc463 languageName: node linkType: hard "hasown@npm:^2.0.2": - version: 2.0.2 - resolution: "hasown@npm:2.0.2" + version: 2.0.3 + resolution: "hasown@npm:2.0.3" dependencies: function-bind: "npm:^1.1.2" - checksum: 10c0/3769d434703b8ac66b209a4cca0737519925bbdb61dd887f93a16372b14694c63ff4e797686d87c90f08168e81082248b9b028bad60d4da9e0d1148766f56eb9 + checksum: 10c0/f5eb28c3fd0d3e4facd821c1eeee3836c37b70ab0b0fc532e8a39976e18fef43652415dadc52f8c7a5ff6d5ac93b7bef128789aa6f90f4e9b9a9083dce74ab38 languageName: node linkType: hard -"hookified@npm:^1.14.0, hookified@npm:^1.15.0": +"hookified@npm:^1.15.0": version: 1.15.1 resolution: "hookified@npm:1.15.1" checksum: 10c0/6b691374fa97ae57169fb29f90e723499fda5e85494654fbe55c4768b3ccbf3e14c0adc8d0f365f32c503b60d7c06f907781f5966c03d41c423575eb5e16860c languageName: node linkType: hard -"http-cache-semantics@npm:^4.1.1": - version: 4.2.0 - resolution: "http-cache-semantics@npm:4.2.0" - checksum: 10c0/45b66a945cf13ec2d1f29432277201313babf4a01d9e52f44b31ca923434083afeca03f18417f599c9ab3d0e7b618ceb21257542338b57c54b710463b4a53e37 +"hookified@npm:^2.1.0": + version: 2.2.0 + resolution: "hookified@npm:2.2.0" + checksum: 10c0/7017d2b66945490293a5aba239e7b39f39071dd940fa019348c7ffea92b91b8c267853c4c51680ed0f3687b33352582fa4d2cff6dd4c5a1c5c44b037276f07aa languageName: node linkType: hard @@ -2132,35 +2017,6 @@ __metadata: languageName: node linkType: hard -"http-proxy-agent@npm:^7.0.0": - version: 7.0.2 - resolution: "http-proxy-agent@npm:7.0.2" - dependencies: - agent-base: "npm:^7.1.0" - debug: "npm:^4.3.4" - checksum: 10c0/4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921 - languageName: node - linkType: hard - -"https-proxy-agent@npm:^7.0.1": - version: 7.0.6 - resolution: "https-proxy-agent@npm:7.0.6" - dependencies: - agent-base: "npm:^7.1.2" - debug: "npm:4" - checksum: 10c0/f729219bc735edb621fa30e6e84e60ee5d00802b8247aac0d7b79b0bd6d4b3294737a337b93b86a0bd9e68099d031858a39260c976dc14cdbba238ba1f8779ac - languageName: node - linkType: hard - -"iconv-lite@npm:^0.6.2": - version: 0.6.3 - resolution: "iconv-lite@npm:0.6.3" - dependencies: - safer-buffer: "npm:>= 2.1.2 < 3.0.0" - checksum: 10c0/98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 - languageName: node - linkType: hard - "iconv-lite@npm:^0.7.0, iconv-lite@npm:~0.7.0": version: 0.7.2 resolution: "iconv-lite@npm:0.7.2" @@ -2191,14 +2047,7 @@ __metadata: languageName: node linkType: hard -"ip-address@npm:10.0.1": - version: 10.0.1 - resolution: "ip-address@npm:10.0.1" - checksum: 10c0/1634d79dae18394004775cb6d699dc46b7c23df6d2083164025a2b15240c1164fccde53d0e08bd5ee4fc53913d033ab6b5e395a809ad4b956a940c446e948843 - languageName: node - linkType: hard - -"ip-address@npm:10.1.0, ip-address@npm:^10.0.1": +"ip-address@npm:10.1.0": version: 10.1.0 resolution: "ip-address@npm:10.1.0" checksum: 10c0/0103516cfa93f6433b3bd7333fa876eb21263912329bfa47010af5e16934eeeff86f3d2ae700a3744a137839ddfad62b900c7a445607884a49b5d1e32a3d7566 @@ -2552,13 +2401,6 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^11.0.0, lru-cache@npm:^11.1.0, lru-cache@npm:^11.2.1": - version: 11.2.6 - resolution: "lru-cache@npm:11.2.6" - checksum: 10c0/73bbffb298760e71b2bfe8ebc16a311c6a60ceddbba919cfedfd8635c2d125fbfb5a39b71818200e67973b11f8d59c5a9e31d6f90722e340e90393663a66e5cd - languageName: node - linkType: hard - "magic-string@npm:^0.30.21": version: 0.30.21 resolution: "magic-string@npm:0.30.21" @@ -2568,25 +2410,6 @@ __metadata: languageName: node linkType: hard -"make-fetch-happen@npm:^15.0.0": - version: 15.0.3 - resolution: "make-fetch-happen@npm:15.0.3" - dependencies: - "@npmcli/agent": "npm:^4.0.0" - cacache: "npm:^20.0.1" - http-cache-semantics: "npm:^4.1.1" - minipass: "npm:^7.0.2" - minipass-fetch: "npm:^5.0.0" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - negotiator: "npm:^1.0.0" - proc-log: "npm:^6.0.0" - promise-retry: "npm:^2.0.1" - ssri: "npm:^13.0.0" - checksum: 10c0/525f74915660be60b616bcbd267c4a5b59481b073ba125e45c9c3a041bb1a47a2bd0ae79d028eb6f5f95bf9851a4158423f5068539c3093621abb64027e8e461 - languageName: node - linkType: hard - "math-intrinsics@npm:^1.1.0": version: 1.1.0 resolution: "math-intrinsics@npm:1.1.0" @@ -2663,92 +2486,23 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^10.2.2": - version: 10.2.2 - resolution: "minimatch@npm:10.2.2" - dependencies: - brace-expansion: "npm:^5.0.2" - checksum: 10c0/098831f2f542cb802e1f249c809008a016e1fef6b3a9eda9cf9ecb2b3d7979083951bd47c0c82fcf34330bd3b36638a493d4fa8e24cce58caf5b481de0f4e238 - languageName: node - linkType: hard - "minimatch@npm:^10.2.4": - version: 10.2.4 - resolution: "minimatch@npm:10.2.4" + version: 10.2.5 + resolution: "minimatch@npm:10.2.5" dependencies: - brace-expansion: "npm:^5.0.2" - checksum: 10c0/35f3dfb7b99b51efd46afd378486889f590e7efb10e0f6a10ba6800428cf65c9a8dedb74427d0570b318d749b543dc4e85f06d46d2858bc8cac7e1eb49a95945 + brace-expansion: "npm:^5.0.5" + checksum: 10c0/6bb058bd6324104b9ec2f763476a35386d05079c1f5fe4fbf1f324a25237cd4534d6813ecd71f48208f4e635c1221899bef94c3c89f7df55698fe373aaae20fd languageName: node linkType: hard -"minipass-collect@npm:^2.0.1": - version: 2.0.1 - resolution: "minipass-collect@npm:2.0.1" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e - languageName: node - linkType: hard - -"minipass-fetch@npm:^5.0.0": - version: 5.0.1 - resolution: "minipass-fetch@npm:5.0.1" - dependencies: - encoding: "npm:^0.1.13" - minipass: "npm:^7.0.3" - minipass-sized: "npm:^2.0.0" - minizlib: "npm:^3.0.1" - dependenciesMeta: - encoding: - optional: true - checksum: 10c0/50bcf48c9841ebb25e29a2817468595219c72cfffc7c175a1d7327843c8bef9b72cb01778f46df7eca695dfe47ab98e6167af4cb026ddd80f660842919a5193c - languageName: node - linkType: hard - -"minipass-flush@npm:^1.0.5": - version: 1.0.5 - resolution: "minipass-flush@npm:1.0.5" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd - languageName: node - linkType: hard - -"minipass-pipeline@npm:^1.2.4": - version: 1.2.4 - resolution: "minipass-pipeline@npm:1.2.4" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 - languageName: node - linkType: hard - -"minipass-sized@npm:^2.0.0": - version: 2.0.0 - resolution: "minipass-sized@npm:2.0.0" - dependencies: - minipass: "npm:^7.1.2" - checksum: 10c0/f9201696a6f6d68610d04c9c83e3d2e5cb9c026aae1c8cbf7e17f386105cb79c1bb088dbc21bf0b1eb4f3fb5df384fd1e7aa3bf1f33868c416ae8c8a92679db8 - languageName: node - linkType: hard - -"minipass@npm:^3.0.0": - version: 3.3.6 - resolution: "minipass@npm:3.3.6" - dependencies: - yallist: "npm:^4.0.0" - checksum: 10c0/a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c - languageName: node - linkType: hard - -"minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2, minipass@npm:^7.1.3": +"minipass@npm:^7.0.4, minipass@npm:^7.1.2": version: 7.1.3 resolution: "minipass@npm:7.1.3" checksum: 10c0/539da88daca16533211ea5a9ee98dc62ff5742f531f54640dd34429e621955e91cc280a91a776026264b7f9f6735947629f920944e9c1558369e8bf22eb33fbb languageName: node linkType: hard -"minizlib@npm:^3.0.1, minizlib@npm:^3.1.0": +"minizlib@npm:^3.1.0": version: 3.1.0 resolution: "minizlib@npm:3.1.0" dependencies: @@ -2772,11 +2526,11 @@ __metadata: linkType: hard "nanoid@npm:^3.3.11": - version: 3.3.11 - resolution: "nanoid@npm:3.3.11" + version: 3.3.12 + resolution: "nanoid@npm:3.3.12" bin: nanoid: bin/nanoid.cjs - checksum: 10c0/40e7f70b3d15f725ca072dfc4f74e81fcf1fbb02e491cf58ac0c79093adc9b0a73b152bcde57df4b79cd097e13023d7504acb38404a4da7bc1cd8e887b82fe0b + checksum: 10c0/ba142b7b39e11e80c16dd74b0365d407880c87c1cf7e1480956981ae940ee36060fa5b6f092cd1e315184dd19244c657bd017d03327bd3c62247d691c5e8edfb languageName: node linkType: hard @@ -2795,22 +2549,22 @@ __metadata: linkType: hard "node-gyp@npm:latest": - version: 12.2.0 - resolution: "node-gyp@npm:12.2.0" + version: 12.3.0 + resolution: "node-gyp@npm:12.3.0" dependencies: env-paths: "npm:^2.2.0" exponential-backoff: "npm:^3.1.1" graceful-fs: "npm:^4.2.6" - make-fetch-happen: "npm:^15.0.0" nopt: "npm:^9.0.0" proc-log: "npm:^6.0.0" semver: "npm:^7.3.5" tar: "npm:^7.5.4" tinyglobby: "npm:^0.2.12" + undici: "npm:^6.25.0" which: "npm:^6.0.0" bin: node-gyp: bin/node-gyp.js - checksum: 10c0/3ed046746a5a7d90950cd8b0547332b06598443f31fe213ef4332a7174c7b7d259e1704835feda79b87d3f02e59d7791842aac60642ede4396ab25fdf0f8f759 + checksum: 10c0/9d9032b405cbe42f72a105259d9eb679376470c102df4a2dbaa51e07d59bf741dcffb85897087ea9d8318b9cabb824a8978af51508ae142f0239ae1e6a3c2329 languageName: node linkType: hard @@ -2832,7 +2586,7 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.13.3": +"object-inspect@npm:^1.13.3, object-inspect@npm:^1.13.4": version: 1.13.4 resolution: "object-inspect@npm:1.13.4" checksum: 10c0/d7f8711e803b96ea3191c745d6f8056ce1f2496e530e6a19a0e92d89b0fa3c76d910c31f0aa270432db6bd3b2f85500a376a83aaba849a8d518c8845b3211692 @@ -2903,13 +2657,6 @@ __metadata: languageName: node linkType: hard -"p-map@npm:^7.0.2": - version: 7.0.4 - resolution: "p-map@npm:7.0.4" - checksum: 10c0/a5030935d3cb2919d7e89454d1ce82141e6f9955413658b8c9403cfe379283770ed3048146b44cde168aa9e8c716505f196d5689db0ae3ce9a71521a2fef3abd - languageName: node - linkType: hard - "parseurl@npm:^1.3.3, parseurl@npm:~1.3.3": version: 1.3.3 resolution: "parseurl@npm:1.3.3" @@ -2931,20 +2678,10 @@ __metadata: languageName: node linkType: hard -"path-scurry@npm:^2.0.2": - version: 2.0.2 - resolution: "path-scurry@npm:2.0.2" - dependencies: - lru-cache: "npm:^11.0.0" - minipass: "npm:^7.1.2" - checksum: 10c0/b35ad37cf6557a87fd057121ce2be7695380c9138d93e87ae928609da259ea0a170fac6f3ef1eb3ece8a068e8b7f2f3adf5bb2374cf4d4a57fe484954fcc9482 - languageName: node - linkType: hard - "path-to-regexp@npm:^8.0.0": - version: 8.3.0 - resolution: "path-to-regexp@npm:8.3.0" - checksum: 10c0/ee1544a73a3f294a97a4c663b0ce71bbf1621d732d80c9c9ed201b3e911a86cb628ebad691b9d40f40a3742fe22011e5a059d8eed2cf63ec2cb94f6fb4efe67c + version: 8.4.2 + resolution: "path-to-regexp@npm:8.4.2" + checksum: 10c0/05b115c49b47ad252ce05faa32930f643f23769c68b8bcfe78ad833545140c48bbffb3266986d6c8d5db13a64cf12e07e0d72d9882cab830efeefa553533ebaf languageName: node linkType: hard @@ -2962,21 +2699,21 @@ __metadata: languageName: node linkType: hard -"picomatch@npm:^4.0.3": - version: 4.0.3 - resolution: "picomatch@npm:4.0.3" - checksum: 10c0/9582c951e95eebee5434f59e426cddd228a7b97a0161a375aed4be244bd3fe8e3a31b846808ea14ef2c8a2527a6eeab7b3946a67d5979e81694654f939473ae2 +"picomatch@npm:^4.0.3, picomatch@npm:^4.0.4": + version: 4.0.4 + resolution: "picomatch@npm:4.0.4" + checksum: 10c0/e2c6023372cc7b5764719a5ffb9da0f8e781212fa7ca4bd0562db929df8e117460f00dff3cb7509dacfc06b86de924b247f504d0ce1806a37fac4633081466b0 languageName: node linkType: hard -"postcss@npm:^8.5.8": - version: 8.5.8 - resolution: "postcss@npm:8.5.8" +"postcss@npm:^8.5.10": + version: 8.5.14 + resolution: "postcss@npm:8.5.14" dependencies: nanoid: "npm:^3.3.11" picocolors: "npm:^1.1.1" source-map-js: "npm:^1.2.1" - checksum: 10c0/dd918f7127ee7c60a0295bae2e72b3787892296e1d1c3c564d7a2a00c68d8df83cadc3178491259daa19ccc54804fb71ed8c937c6787e08d8bd4bedf8d17044c + checksum: 10c0/48138207cf5ef5581be1bfe2cb65ccfe0ac75e43888ba045afc8ed6043d7b56aeb3b9a9fe5b353ff554be943cd0cc15d826ccb991525159175971e5ee8ab0237 languageName: node linkType: hard @@ -2996,12 +2733,12 @@ __metadata: languageName: node linkType: hard -"prettier@npm:^3.8.1": - version: 3.8.1 - resolution: "prettier@npm:3.8.1" +"prettier@npm:^3.8.3": + version: 3.8.3 + resolution: "prettier@npm:3.8.3" bin: prettier: bin/prettier.cjs - checksum: 10c0/33169b594009e48f570471271be7eac7cdcf88a209eed39ac3b8d6d78984039bfa9132f82b7e6ba3b06711f3bfe0222a62a1bfb87c43f50c25a83df1b78a2c42 + checksum: 10c0/754816fd7593eb80f6376d7476d463e832c38a12f32775a82683adb6e35b772b1f484d65f19401507b983a8c8a7cd5a4a9f12006bd56491e8f35503473f77473 languageName: node linkType: hard @@ -3012,16 +2749,6 @@ __metadata: languageName: node linkType: hard -"promise-retry@npm:^2.0.1": - version: 2.0.1 - resolution: "promise-retry@npm:2.0.1" - dependencies: - err-code: "npm:^2.0.2" - retry: "npm:^0.12.0" - checksum: 10c0/9c7045a1a2928094b5b9b15336dcd2a7b1c052f674550df63cc3f36cd44028e5080448175b6f6ca32b642de81150f5e7b1a98b728f15cb069f2dd60ac2616b96 - languageName: node - linkType: hard - "proxy-addr@npm:^2.0.7": version: 2.0.7 resolution: "proxy-addr@npm:2.0.7" @@ -3040,11 +2767,11 @@ __metadata: linkType: hard "qs@npm:^6.14.0, qs@npm:^6.14.1": - version: 6.15.0 - resolution: "qs@npm:6.15.0" + version: 6.15.1 + resolution: "qs@npm:6.15.1" dependencies: side-channel: "npm:^1.1.0" - checksum: 10c0/ff341078a78a991d8a48b4524d52949211447b4b1ad907f489cac0770cbc346a28e47304455c0320e5fb000f8762d64b03331e3b71865f663bf351bcba8cdb4b + checksum: 10c0/19ee504f0ebff72598503e38cd6d9bd7b52a8ab62ae18b1e6bee3d4db58469bd65871ef1893a881bafb0f80ef2f9ab586e1f255cf25cc8d816c0f5a704721d97 languageName: node linkType: hard @@ -3097,27 +2824,27 @@ __metadata: languageName: node linkType: hard -"rolldown@npm:1.0.0-rc.9": - version: 1.0.0-rc.9 - resolution: "rolldown@npm:1.0.0-rc.9" +"rolldown@npm:1.0.0-rc.17": + version: 1.0.0-rc.17 + resolution: "rolldown@npm:1.0.0-rc.17" dependencies: - "@oxc-project/types": "npm:=0.115.0" - "@rolldown/binding-android-arm64": "npm:1.0.0-rc.9" - "@rolldown/binding-darwin-arm64": "npm:1.0.0-rc.9" - "@rolldown/binding-darwin-x64": "npm:1.0.0-rc.9" - "@rolldown/binding-freebsd-x64": "npm:1.0.0-rc.9" - "@rolldown/binding-linux-arm-gnueabihf": "npm:1.0.0-rc.9" - "@rolldown/binding-linux-arm64-gnu": "npm:1.0.0-rc.9" - "@rolldown/binding-linux-arm64-musl": "npm:1.0.0-rc.9" - "@rolldown/binding-linux-ppc64-gnu": "npm:1.0.0-rc.9" - "@rolldown/binding-linux-s390x-gnu": "npm:1.0.0-rc.9" - "@rolldown/binding-linux-x64-gnu": "npm:1.0.0-rc.9" - "@rolldown/binding-linux-x64-musl": "npm:1.0.0-rc.9" - "@rolldown/binding-openharmony-arm64": "npm:1.0.0-rc.9" - "@rolldown/binding-wasm32-wasi": "npm:1.0.0-rc.9" - "@rolldown/binding-win32-arm64-msvc": "npm:1.0.0-rc.9" - "@rolldown/binding-win32-x64-msvc": "npm:1.0.0-rc.9" - "@rolldown/pluginutils": "npm:1.0.0-rc.9" + "@oxc-project/types": "npm:=0.127.0" + "@rolldown/binding-android-arm64": "npm:1.0.0-rc.17" + "@rolldown/binding-darwin-arm64": "npm:1.0.0-rc.17" + "@rolldown/binding-darwin-x64": "npm:1.0.0-rc.17" + "@rolldown/binding-freebsd-x64": "npm:1.0.0-rc.17" + "@rolldown/binding-linux-arm-gnueabihf": "npm:1.0.0-rc.17" + "@rolldown/binding-linux-arm64-gnu": "npm:1.0.0-rc.17" + "@rolldown/binding-linux-arm64-musl": "npm:1.0.0-rc.17" + "@rolldown/binding-linux-ppc64-gnu": "npm:1.0.0-rc.17" + "@rolldown/binding-linux-s390x-gnu": "npm:1.0.0-rc.17" + "@rolldown/binding-linux-x64-gnu": "npm:1.0.0-rc.17" + "@rolldown/binding-linux-x64-musl": "npm:1.0.0-rc.17" + "@rolldown/binding-openharmony-arm64": "npm:1.0.0-rc.17" + "@rolldown/binding-wasm32-wasi": "npm:1.0.0-rc.17" + "@rolldown/binding-win32-arm64-msvc": "npm:1.0.0-rc.17" + "@rolldown/binding-win32-x64-msvc": "npm:1.0.0-rc.17" + "@rolldown/pluginutils": "npm:1.0.0-rc.17" dependenciesMeta: "@rolldown/binding-android-arm64": optional: true @@ -3151,7 +2878,7 @@ __metadata: optional: true bin: rolldown: bin/cli.mjs - checksum: 10c0/d19af14dccf569dc25c0c3c2f1142b7a6f7cec291d55bba80cea71099f89c6d634145bb1b6487626ddd41d578f183f7065ed68067e49d2b964ad6242693b0f79 + checksum: 10c0/bb99abc62ece4e34edd06d2b8eb9ffb7194dc2f0465a4329bb106cbde3006a10f1575e3580b198b793341109a2109581aed623c537c12b0c3a4ba0d72169b2fb languageName: node linkType: hard @@ -3269,12 +2996,12 @@ __metadata: linkType: hard "side-channel-list@npm:^1.0.0": - version: 1.0.0 - resolution: "side-channel-list@npm:1.0.0" + version: 1.0.1 + resolution: "side-channel-list@npm:1.0.1" dependencies: es-errors: "npm:^1.3.0" - object-inspect: "npm:^1.13.3" - checksum: 10c0/644f4ac893456c9490ff388bf78aea9d333d5e5bfc64cfb84be8f04bf31ddc111a8d4b83b85d7e7e8a7b845bc185a9ad02c052d20e086983cf59f0be517d9b3d + object-inspect: "npm:^1.13.4" + checksum: 10c0/d346c787fd2f9f1c2fdea14f00e8250118db0e7596d85a6cb9faa75f105d31a73a8f7a341c93d7df2a2429098c3d37a77bd3be9e88c37094b8c01807bc77c7a2 languageName: node linkType: hard @@ -3330,34 +3057,6 @@ __metadata: languageName: node linkType: hard -"smart-buffer@npm:^4.2.0": - version: 4.2.0 - resolution: "smart-buffer@npm:4.2.0" - checksum: 10c0/a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 - languageName: node - linkType: hard - -"socks-proxy-agent@npm:^8.0.3": - version: 8.0.5 - resolution: "socks-proxy-agent@npm:8.0.5" - dependencies: - agent-base: "npm:^7.1.2" - debug: "npm:^4.3.4" - socks: "npm:^2.8.3" - checksum: 10c0/5d2c6cecba6821389aabf18728325730504bf9bb1d9e342e7987a5d13badd7a98838cc9a55b8ed3cb866ad37cc23e1086f09c4d72d93105ce9dfe76330e9d2a6 - languageName: node - linkType: hard - -"socks@npm:^2.8.3": - version: 2.8.7 - resolution: "socks@npm:2.8.7" - dependencies: - ip-address: "npm:^10.0.1" - smart-buffer: "npm:^4.2.0" - checksum: 10c0/2805a43a1c4bcf9ebf6e018268d87b32b32b06fbbc1f9282573583acc155860dc361500f89c73bfbb157caa1b4ac78059eac0ef15d1811eb0ca75e0bdadbc9d2 - languageName: node - linkType: hard - "source-map-js@npm:^1.2.1": version: 1.2.1 resolution: "source-map-js@npm:1.2.1" @@ -3365,15 +3064,6 @@ __metadata: languageName: node linkType: hard -"ssri@npm:^13.0.0": - version: 13.0.1 - resolution: "ssri@npm:13.0.1" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/cf6408a18676c57ff2ed06b8a20dc64bb3e748e5c7e095332e6aecaa2b8422b1e94a739a8453bf65156a8a47afe23757ba4ab52d3ea3b62322dc40875763e17a - languageName: node - linkType: hard - "stackback@npm:0.0.2": version: 0.0.2 resolution: "stackback@npm:0.0.2" @@ -3389,9 +3079,9 @@ __metadata: linkType: hard "std-env@npm:^4.0.0-rc.1": - version: 4.0.0 - resolution: "std-env@npm:4.0.0" - checksum: 10c0/63b1716eae27947adde49e21b7225a0f75fb2c3d410273ae9de8333c07c7d5fc7a0628ae4c8af6b4b49b4274ed46c2bf118ed69b64f1261c9d8213d76ed1c16c + version: 4.1.0 + resolution: "std-env@npm:4.1.0" + checksum: 10c0/2e14b6b490db34cb969a48d9cf7c35bca4a47653914aac2814221baae7b867a5b15940d133625c391621971f98cd2266a5dc7036669960e883f1081db2a56558 languageName: node linkType: hard @@ -3433,15 +3123,15 @@ __metadata: linkType: hard "tar@npm:^7.5.4": - version: 7.5.9 - resolution: "tar@npm:7.5.9" + version: 7.5.13 + resolution: "tar@npm:7.5.13" dependencies: "@isaacs/fs-minipass": "npm:^4.0.0" chownr: "npm:^3.0.0" minipass: "npm:^7.1.2" minizlib: "npm:^3.1.0" yallist: "npm:^5.0.0" - checksum: 10c0/e870beb1b2477135ca2abe86b2d18f7b35d0a4e3a37bbc523d3b8f7adca268dfab543f26528a431d569897f8c53a7cac745cdfbc4411c2f89aeeacc652b81b0a + checksum: 10c0/5c65b8084799bde7a791593a1c1a45d3d6ee98182e3700b24c247b7b8f8654df4191642abbdb07ff25043d45dcff35620827c3997b88ae6c12040f64bed5076b languageName: node linkType: hard @@ -3453,26 +3143,26 @@ __metadata: linkType: hard "tinyexec@npm:^1.0.2": - version: 1.0.2 - resolution: "tinyexec@npm:1.0.2" - checksum: 10c0/1261a8e34c9b539a9aae3b7f0bb5372045ff28ee1eba035a2a059e532198fe1a182ec61ac60fa0b4a4129f0c4c4b1d2d57355b5cb9aa2d17ac9454ecace502ee + version: 1.1.2 + resolution: "tinyexec@npm:1.1.2" + checksum: 10c0/9e0ef6c001ce54688cf16833a02f70a339276219ca947b88930b124267de2cffc764ff44e87e7369384b1d75ab63491465412cbbdf06f2437956b9ab66ab4491 languageName: node linkType: hard -"tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.15": - version: 0.2.15 - resolution: "tinyglobby@npm:0.2.15" +"tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.15, tinyglobby@npm:^0.2.16": + version: 0.2.16 + resolution: "tinyglobby@npm:0.2.16" dependencies: fdir: "npm:^6.5.0" - picomatch: "npm:^4.0.3" - checksum: 10c0/869c31490d0d88eedb8305d178d4c75e7463e820df5a9b9d388291daf93e8b1eb5de1dad1c1e139767e4269fe75f3b10d5009b2cc14db96ff98986920a186844 + picomatch: "npm:^4.0.4" + checksum: 10c0/f2e09fd93dd95c41e522113b686ff6f7c13020962f8698a864a257f3d7737599afc47722b7ab726e12f8a813f779906187911ff8ee6701ede65072671a7e934b languageName: node linkType: hard -"tinyrainbow@npm:^3.0.3": - version: 3.0.3 - resolution: "tinyrainbow@npm:3.0.3" - checksum: 10c0/1e799d35cd23cabe02e22550985a3051dc88814a979be02dc632a159c393a998628eacfc558e4c746b3006606d54b00bcdea0c39301133956d10a27aa27e988c +"tinyrainbow@npm:^3.1.0": + version: 3.1.0 + resolution: "tinyrainbow@npm:3.1.0" + checksum: 10c0/f11cf387a26c5c9255bec141a90ac511b26172981b10c3e50053bc6700ea7d2336edcc4a3a21dbb8412fe7c013477d2ba4d7e4877800f3f8107be5105aad6511 languageName: node linkType: hard @@ -3506,14 +3196,14 @@ __metadata: languageName: node linkType: hard -"twtxt-lib@npm:^0.9.4": - version: 0.9.4 - resolution: "twtxt-lib@npm:0.9.4" +"twtxt-lib@npm:^0.10.1": + version: 0.10.1 + resolution: "twtxt-lib@npm:0.10.1" dependencies: "@exodus/blakejs": "npm:^1.1.1-exodus.0" base32.js: "npm:^0.1.0" - dayjs: "npm:^1.11.19" - checksum: 10c0/95c28d47a61f5ff9cef45a9d24109edfb57ceec2386db94cae7ead61d9c9ed142ffc83543e26df78979704cb90325d4cd83f0214ee026aed66a16e56d9395c6f + dayjs: "npm:^1.11.20" + checksum: 10c0/6892e2e320111e060ca24bb6f69b81c404aea81e96a73cdd4c91141502e3628aa67d10522bf9489090be119ffd17afaf028ab4b793381f27921f70f20ac4326c languageName: node linkType: hard @@ -3575,28 +3265,17 @@ __metadata: languageName: node linkType: hard -"undici-types@npm:~7.18.0": - version: 7.18.2 - resolution: "undici-types@npm:7.18.2" - checksum: 10c0/85a79189113a238959d7a647368e4f7c5559c3a404ebdb8fc4488145ce9426fcd82252a844a302798dfc0e37e6fb178ff481ed03bc4caf634c5757d9ef43521d +"undici-types@npm:~7.19.0": + version: 7.19.2 + resolution: "undici-types@npm:7.19.2" + checksum: 10c0/7159f10546f9f6c47d36776bb1bbf8671e87c1e587a6fee84ae1f111ae8de4f914efa8ca0dfcd224f4f4a9dfc3f6028f627ccb5ddaccf82d7fd54671b89fac3e languageName: node linkType: hard -"unique-filename@npm:^5.0.0": - version: 5.0.0 - resolution: "unique-filename@npm:5.0.0" - dependencies: - unique-slug: "npm:^6.0.0" - checksum: 10c0/afb897e9cf4c2fb622ea716f7c2bb462001928fc5f437972213afdf1cc32101a230c0f1e9d96fc91ee5185eca0f2feb34127145874975f347be52eb91d6ccc2c - languageName: node - linkType: hard - -"unique-slug@npm:^6.0.0": - version: 6.0.0 - resolution: "unique-slug@npm:6.0.0" - dependencies: - imurmurhash: "npm:^0.1.4" - checksum: 10c0/da7ade4cb04eb33ad0499861f82fe95ce9c7c878b7139dc54d140ecfb6a6541c18a5c8dac16188b8b379fe62c0c1f1b710814baac910cde5f4fec06212126c6a +"undici@npm:^6.25.0": + version: 6.25.0 + resolution: "undici@npm:6.25.0" + checksum: 10c0/2597cc6689bdb02c210c557b1f85febbfda65becae6e6fc1061508e2f33734d25207f81cd8af56ada9956329eb3a7bd7431e87dcfeceba20ee87059b57dcf985 languageName: node linkType: hard @@ -3623,12 +3302,12 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^13.0.0": - version: 13.0.0 - resolution: "uuid@npm:13.0.0" +"uuid@npm:^14.0.0": + version: 14.0.0 + resolution: "uuid@npm:14.0.0" bin: uuid: dist-node/bin/uuid - checksum: 10c0/950e4c18d57fef6c69675344f5700a08af21e26b9eff2bf2180427564297368c538ea11ac9fb2e6528b17fc3966a9fd2c5049361b0b63c7d654f3c550c9b3d67 + checksum: 10c0/a57ae7794c45005c1a9208989196c5baf79a7679c30f43c1bee9033a2c4d113a2cea216fa6fcc9663b08b0d55635df1a7c6eb7e7f3d21c3e50688c698fa39a50 languageName: node linkType: hard @@ -3639,21 +3318,20 @@ __metadata: languageName: node linkType: hard -"vite@npm:^6.0.0 || ^7.0.0 || ^8.0.0-0": - version: 8.0.0 - resolution: "vite@npm:8.0.0" +"vite@npm:^6.0.0 || ^7.0.0 || ^8.0.0": + version: 8.0.10 + resolution: "vite@npm:8.0.10" dependencies: - "@oxc-project/runtime": "npm:0.115.0" fsevents: "npm:~2.3.3" lightningcss: "npm:^1.32.0" - picomatch: "npm:^4.0.3" - postcss: "npm:^8.5.8" - rolldown: "npm:1.0.0-rc.9" - tinyglobby: "npm:^0.2.15" + picomatch: "npm:^4.0.4" + postcss: "npm:^8.5.10" + rolldown: "npm:1.0.0-rc.17" + tinyglobby: "npm:^0.2.16" peerDependencies: "@types/node": ^20.19.0 || >=22.12.0 - "@vitejs/devtools": ^0.0.0-alpha.31 - esbuild: ^0.27.0 + "@vitejs/devtools": ^0.1.0 + esbuild: ^0.27.0 || ^0.28.0 jiti: ">=1.21.0" less: ^4.0.0 sass: ^1.70.0 @@ -3693,21 +3371,21 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10c0/2246d3d54788dcd53c39da82da3f934a760756642ba9a575c84c5ef9f310bc47697f7f9fde6721fa566675e93e408736b4ac068008d2ddbd75b0ed99c7fd4c67 + checksum: 10c0/92188b82654f856dbe562a1b679de695bb6ca18c0f43c4c276f84a869fb78e22dedb7c2df83b5617d6afdca979c059d654b5f61a0936a45f49917f352b9325ca languageName: node linkType: hard -"vitest@npm:^4.1.0": - version: 4.1.0 - resolution: "vitest@npm:4.1.0" +"vitest@npm:^4.1.5": + version: 4.1.5 + resolution: "vitest@npm:4.1.5" dependencies: - "@vitest/expect": "npm:4.1.0" - "@vitest/mocker": "npm:4.1.0" - "@vitest/pretty-format": "npm:4.1.0" - "@vitest/runner": "npm:4.1.0" - "@vitest/snapshot": "npm:4.1.0" - "@vitest/spy": "npm:4.1.0" - "@vitest/utils": "npm:4.1.0" + "@vitest/expect": "npm:4.1.5" + "@vitest/mocker": "npm:4.1.5" + "@vitest/pretty-format": "npm:4.1.5" + "@vitest/runner": "npm:4.1.5" + "@vitest/snapshot": "npm:4.1.5" + "@vitest/spy": "npm:4.1.5" + "@vitest/utils": "npm:4.1.5" es-module-lexer: "npm:^2.0.0" expect-type: "npm:^1.3.0" magic-string: "npm:^0.30.21" @@ -3718,20 +3396,22 @@ __metadata: tinybench: "npm:^2.9.0" tinyexec: "npm:^1.0.2" tinyglobby: "npm:^0.2.15" - tinyrainbow: "npm:^3.0.3" - vite: "npm:^6.0.0 || ^7.0.0 || ^8.0.0-0" + tinyrainbow: "npm:^3.1.0" + vite: "npm:^6.0.0 || ^7.0.0 || ^8.0.0" why-is-node-running: "npm:^2.3.0" peerDependencies: "@edge-runtime/vm": "*" "@opentelemetry/api": ^1.9.0 "@types/node": ^20.0.0 || ^22.0.0 || >=24.0.0 - "@vitest/browser-playwright": 4.1.0 - "@vitest/browser-preview": 4.1.0 - "@vitest/browser-webdriverio": 4.1.0 - "@vitest/ui": 4.1.0 + "@vitest/browser-playwright": 4.1.5 + "@vitest/browser-preview": 4.1.5 + "@vitest/browser-webdriverio": 4.1.5 + "@vitest/coverage-istanbul": 4.1.5 + "@vitest/coverage-v8": 4.1.5 + "@vitest/ui": 4.1.5 happy-dom: "*" jsdom: "*" - vite: ^6.0.0 || ^7.0.0 || ^8.0.0-0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: "@edge-runtime/vm": optional: true @@ -3745,6 +3425,10 @@ __metadata: optional: true "@vitest/browser-webdriverio": optional: true + "@vitest/coverage-istanbul": + optional: true + "@vitest/coverage-v8": + optional: true "@vitest/ui": optional: true happy-dom: @@ -3755,7 +3439,7 @@ __metadata: optional: false bin: vitest: vitest.mjs - checksum: 10c0/48048e4391e4e8190aa12b1c868bef4ad8d346214631b4506e0dc1f3241ecb8bcb24f296c38a7d98eae712a042375ae209da4b35165db38f9a9bc79a3a9e2a04 + checksum: 10c0/196eaf5e95b45a3f6d3001a2408d7dc6f146c29c873ed4e42e1ad4c9327122934fb3793a12b6ce3b7c25d355e738b20123acc0894ce30358c3370b15f4bd0865 languageName: node linkType: hard @@ -3819,13 +3503,6 @@ __metadata: languageName: node linkType: hard -"yallist@npm:^4.0.0": - version: 4.0.0 - resolution: "yallist@npm:4.0.0" - checksum: 10c0/2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a - languageName: node - linkType: hard - "yallist@npm:^5.0.0": version: 5.0.0 resolution: "yallist@npm:5.0.0" @@ -3840,9 +3517,9 @@ __metadata: languageName: node linkType: hard -"zod@npm:^4.3.6": - version: 4.3.6 - resolution: "zod@npm:4.3.6" - checksum: 10c0/860d25a81ab41d33aa25f8d0d07b091a04acb426e605f396227a796e9e800c44723ed96d0f53a512b57be3d1520f45bf69c0cb3b378a232a00787a2609625307 +"zod@npm:^4.4.3": + version: 4.4.3 + resolution: "zod@npm:4.4.3" + checksum: 10c0/7ea31b558e88f9faf44f31dd185e2e1cbf51fed3081787fb96cc2534749b50c0acfc6da7f0922a7353ed092dd358c7d50c28ea96c94d04af64191bd33152eca3 languageName: node linkType: hard