├── .gitignore ├── LICENSE.md ├── README.md ├── app.js ├── babel.config.js ├── lib └── react-engine.js ├── package-lock.json ├── package.json ├── public ├── htmx.js ├── logo.png └── main.css ├── register.js └── views ├── components ├── goal-form.js ├── goals.js ├── header.js └── layout.js └── goals.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | Copyright 2024 Academind GmbH 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # React / JSX Template Engine Demo 2 | 3 | This repository contains a simple demo of how to use React / JSX as a template engine with Node / Express. 4 | 5 | In addition, [HTMX](https://htmx.org/) is used to add client-side interactivity. 6 | 7 | I explain how this project & setup works in [this video](https://youtu.be/RUoZ2XBa_tw). -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | import express from 'express'; 2 | 3 | import { reactJsxEngine } from './lib/react-engine.js'; 4 | 5 | const GOALS = []; 6 | 7 | const app = express(); 8 | 9 | app.engine('js', reactJsxEngine); 10 | 11 | app.set('views', './views'); 12 | app.set('view engine', 'js'); 13 | 14 | app.use(express.urlencoded({ extended: false })); 15 | app.use(express.static('public')); 16 | 17 | app.get('/goals', (req, res) => { 18 | res.render('goals', { goals: GOALS }); 19 | }); 20 | 21 | app.post('/goals', (req, res) => { 22 | const { goal } = req.body; 23 | GOALS.push(goal); 24 | res.render('goals', { goals: GOALS }); // res.render() instead of res.redirect() because we're using HTMX 25 | }); 26 | 27 | app.get('/', (req, res) => { 28 | res.redirect('/goals'); 29 | }); 30 | 31 | app.listen(3000); 32 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | presets: [ 3 | [ 4 | '@babel/preset-react', 5 | { 6 | runtime: 'automatic', 7 | }, 8 | ], 9 | ], 10 | }; 11 | -------------------------------------------------------------------------------- /lib/react-engine.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { renderToStaticMarkup } from 'react-dom/server'; 3 | 4 | export const ViewDataContext = React.createContext(); 5 | 6 | export function reactJsxEngine(filePath, options, callback) { 7 | import(filePath) 8 | .then((m) => m.default) 9 | .then((Component) => { 10 | let html = renderToStaticMarkup( 11 | 12 | 13 | 14 | ); 15 | if (html.startsWith('${html}`; 17 | } 18 | callback(null, html); 19 | }); 20 | } 21 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-template-engine", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "react-template-engine", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "@babel/core": "^7.24.3", 13 | "@babel/preset-react": "^7.24.1", 14 | "@node-loader/babel": "^2.1.0", 15 | "express": "^4.19.2", 16 | "react": "^18.2.0", 17 | "react-dom": "^18.2.0" 18 | } 19 | }, 20 | "node_modules/@ampproject/remapping": { 21 | "version": "2.3.0", 22 | "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", 23 | "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", 24 | "dependencies": { 25 | "@jridgewell/gen-mapping": "^0.3.5", 26 | "@jridgewell/trace-mapping": "^0.3.24" 27 | }, 28 | "engines": { 29 | "node": ">=6.0.0" 30 | } 31 | }, 32 | "node_modules/@babel/code-frame": { 33 | "version": "7.24.2", 34 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", 35 | "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", 36 | "dependencies": { 37 | "@babel/highlight": "^7.24.2", 38 | "picocolors": "^1.0.0" 39 | }, 40 | "engines": { 41 | "node": ">=6.9.0" 42 | } 43 | }, 44 | "node_modules/@babel/compat-data": { 45 | "version": "7.24.1", 46 | "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz", 47 | "integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==", 48 | "engines": { 49 | "node": ">=6.9.0" 50 | } 51 | }, 52 | "node_modules/@babel/core": { 53 | "version": "7.24.3", 54 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz", 55 | "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==", 56 | "dependencies": { 57 | "@ampproject/remapping": "^2.2.0", 58 | "@babel/code-frame": "^7.24.2", 59 | "@babel/generator": "^7.24.1", 60 | "@babel/helper-compilation-targets": "^7.23.6", 61 | "@babel/helper-module-transforms": "^7.23.3", 62 | "@babel/helpers": "^7.24.1", 63 | "@babel/parser": "^7.24.1", 64 | "@babel/template": "^7.24.0", 65 | "@babel/traverse": "^7.24.1", 66 | "@babel/types": "^7.24.0", 67 | "convert-source-map": "^2.0.0", 68 | "debug": "^4.1.0", 69 | "gensync": "^1.0.0-beta.2", 70 | "json5": "^2.2.3", 71 | "semver": "^6.3.1" 72 | }, 73 | "engines": { 74 | "node": ">=6.9.0" 75 | }, 76 | "funding": { 77 | "type": "opencollective", 78 | "url": "https://opencollective.com/babel" 79 | } 80 | }, 81 | "node_modules/@babel/core/node_modules/debug": { 82 | "version": "4.3.4", 83 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 84 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 85 | "dependencies": { 86 | "ms": "2.1.2" 87 | }, 88 | "engines": { 89 | "node": ">=6.0" 90 | }, 91 | "peerDependenciesMeta": { 92 | "supports-color": { 93 | "optional": true 94 | } 95 | } 96 | }, 97 | "node_modules/@babel/core/node_modules/ms": { 98 | "version": "2.1.2", 99 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 100 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 101 | }, 102 | "node_modules/@babel/generator": { 103 | "version": "7.24.1", 104 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz", 105 | "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==", 106 | "dependencies": { 107 | "@babel/types": "^7.24.0", 108 | "@jridgewell/gen-mapping": "^0.3.5", 109 | "@jridgewell/trace-mapping": "^0.3.25", 110 | "jsesc": "^2.5.1" 111 | }, 112 | "engines": { 113 | "node": ">=6.9.0" 114 | } 115 | }, 116 | "node_modules/@babel/helper-annotate-as-pure": { 117 | "version": "7.22.5", 118 | "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", 119 | "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", 120 | "dependencies": { 121 | "@babel/types": "^7.22.5" 122 | }, 123 | "engines": { 124 | "node": ">=6.9.0" 125 | } 126 | }, 127 | "node_modules/@babel/helper-compilation-targets": { 128 | "version": "7.23.6", 129 | "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", 130 | "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", 131 | "dependencies": { 132 | "@babel/compat-data": "^7.23.5", 133 | "@babel/helper-validator-option": "^7.23.5", 134 | "browserslist": "^4.22.2", 135 | "lru-cache": "^5.1.1", 136 | "semver": "^6.3.1" 137 | }, 138 | "engines": { 139 | "node": ">=6.9.0" 140 | } 141 | }, 142 | "node_modules/@babel/helper-environment-visitor": { 143 | "version": "7.22.20", 144 | "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", 145 | "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", 146 | "engines": { 147 | "node": ">=6.9.0" 148 | } 149 | }, 150 | "node_modules/@babel/helper-function-name": { 151 | "version": "7.23.0", 152 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", 153 | "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", 154 | "dependencies": { 155 | "@babel/template": "^7.22.15", 156 | "@babel/types": "^7.23.0" 157 | }, 158 | "engines": { 159 | "node": ">=6.9.0" 160 | } 161 | }, 162 | "node_modules/@babel/helper-hoist-variables": { 163 | "version": "7.22.5", 164 | "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", 165 | "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", 166 | "dependencies": { 167 | "@babel/types": "^7.22.5" 168 | }, 169 | "engines": { 170 | "node": ">=6.9.0" 171 | } 172 | }, 173 | "node_modules/@babel/helper-module-imports": { 174 | "version": "7.24.3", 175 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", 176 | "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", 177 | "dependencies": { 178 | "@babel/types": "^7.24.0" 179 | }, 180 | "engines": { 181 | "node": ">=6.9.0" 182 | } 183 | }, 184 | "node_modules/@babel/helper-module-transforms": { 185 | "version": "7.23.3", 186 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", 187 | "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", 188 | "dependencies": { 189 | "@babel/helper-environment-visitor": "^7.22.20", 190 | "@babel/helper-module-imports": "^7.22.15", 191 | "@babel/helper-simple-access": "^7.22.5", 192 | "@babel/helper-split-export-declaration": "^7.22.6", 193 | "@babel/helper-validator-identifier": "^7.22.20" 194 | }, 195 | "engines": { 196 | "node": ">=6.9.0" 197 | }, 198 | "peerDependencies": { 199 | "@babel/core": "^7.0.0" 200 | } 201 | }, 202 | "node_modules/@babel/helper-plugin-utils": { 203 | "version": "7.24.0", 204 | "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", 205 | "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", 206 | "engines": { 207 | "node": ">=6.9.0" 208 | } 209 | }, 210 | "node_modules/@babel/helper-simple-access": { 211 | "version": "7.22.5", 212 | "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", 213 | "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", 214 | "dependencies": { 215 | "@babel/types": "^7.22.5" 216 | }, 217 | "engines": { 218 | "node": ">=6.9.0" 219 | } 220 | }, 221 | "node_modules/@babel/helper-split-export-declaration": { 222 | "version": "7.22.6", 223 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", 224 | "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", 225 | "dependencies": { 226 | "@babel/types": "^7.22.5" 227 | }, 228 | "engines": { 229 | "node": ">=6.9.0" 230 | } 231 | }, 232 | "node_modules/@babel/helper-string-parser": { 233 | "version": "7.24.1", 234 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", 235 | "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", 236 | "engines": { 237 | "node": ">=6.9.0" 238 | } 239 | }, 240 | "node_modules/@babel/helper-validator-identifier": { 241 | "version": "7.22.20", 242 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", 243 | "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", 244 | "engines": { 245 | "node": ">=6.9.0" 246 | } 247 | }, 248 | "node_modules/@babel/helper-validator-option": { 249 | "version": "7.23.5", 250 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", 251 | "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", 252 | "engines": { 253 | "node": ">=6.9.0" 254 | } 255 | }, 256 | "node_modules/@babel/helpers": { 257 | "version": "7.24.1", 258 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz", 259 | "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==", 260 | "dependencies": { 261 | "@babel/template": "^7.24.0", 262 | "@babel/traverse": "^7.24.1", 263 | "@babel/types": "^7.24.0" 264 | }, 265 | "engines": { 266 | "node": ">=6.9.0" 267 | } 268 | }, 269 | "node_modules/@babel/highlight": { 270 | "version": "7.24.2", 271 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", 272 | "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", 273 | "dependencies": { 274 | "@babel/helper-validator-identifier": "^7.22.20", 275 | "chalk": "^2.4.2", 276 | "js-tokens": "^4.0.0", 277 | "picocolors": "^1.0.0" 278 | }, 279 | "engines": { 280 | "node": ">=6.9.0" 281 | } 282 | }, 283 | "node_modules/@babel/parser": { 284 | "version": "7.24.1", 285 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", 286 | "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", 287 | "bin": { 288 | "parser": "bin/babel-parser.js" 289 | }, 290 | "engines": { 291 | "node": ">=6.0.0" 292 | } 293 | }, 294 | "node_modules/@babel/plugin-syntax-jsx": { 295 | "version": "7.24.1", 296 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", 297 | "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", 298 | "dependencies": { 299 | "@babel/helper-plugin-utils": "^7.24.0" 300 | }, 301 | "engines": { 302 | "node": ">=6.9.0" 303 | }, 304 | "peerDependencies": { 305 | "@babel/core": "^7.0.0-0" 306 | } 307 | }, 308 | "node_modules/@babel/plugin-transform-react-display-name": { 309 | "version": "7.24.1", 310 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz", 311 | "integrity": "sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==", 312 | "dependencies": { 313 | "@babel/helper-plugin-utils": "^7.24.0" 314 | }, 315 | "engines": { 316 | "node": ">=6.9.0" 317 | }, 318 | "peerDependencies": { 319 | "@babel/core": "^7.0.0-0" 320 | } 321 | }, 322 | "node_modules/@babel/plugin-transform-react-jsx": { 323 | "version": "7.23.4", 324 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", 325 | "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", 326 | "dependencies": { 327 | "@babel/helper-annotate-as-pure": "^7.22.5", 328 | "@babel/helper-module-imports": "^7.22.15", 329 | "@babel/helper-plugin-utils": "^7.22.5", 330 | "@babel/plugin-syntax-jsx": "^7.23.3", 331 | "@babel/types": "^7.23.4" 332 | }, 333 | "engines": { 334 | "node": ">=6.9.0" 335 | }, 336 | "peerDependencies": { 337 | "@babel/core": "^7.0.0-0" 338 | } 339 | }, 340 | "node_modules/@babel/plugin-transform-react-jsx-development": { 341 | "version": "7.22.5", 342 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", 343 | "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", 344 | "dependencies": { 345 | "@babel/plugin-transform-react-jsx": "^7.22.5" 346 | }, 347 | "engines": { 348 | "node": ">=6.9.0" 349 | }, 350 | "peerDependencies": { 351 | "@babel/core": "^7.0.0-0" 352 | } 353 | }, 354 | "node_modules/@babel/plugin-transform-react-pure-annotations": { 355 | "version": "7.24.1", 356 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz", 357 | "integrity": "sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA==", 358 | "dependencies": { 359 | "@babel/helper-annotate-as-pure": "^7.22.5", 360 | "@babel/helper-plugin-utils": "^7.24.0" 361 | }, 362 | "engines": { 363 | "node": ">=6.9.0" 364 | }, 365 | "peerDependencies": { 366 | "@babel/core": "^7.0.0-0" 367 | } 368 | }, 369 | "node_modules/@babel/preset-react": { 370 | "version": "7.24.1", 371 | "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.1.tgz", 372 | "integrity": "sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA==", 373 | "dependencies": { 374 | "@babel/helper-plugin-utils": "^7.24.0", 375 | "@babel/helper-validator-option": "^7.23.5", 376 | "@babel/plugin-transform-react-display-name": "^7.24.1", 377 | "@babel/plugin-transform-react-jsx": "^7.23.4", 378 | "@babel/plugin-transform-react-jsx-development": "^7.22.5", 379 | "@babel/plugin-transform-react-pure-annotations": "^7.24.1" 380 | }, 381 | "engines": { 382 | "node": ">=6.9.0" 383 | }, 384 | "peerDependencies": { 385 | "@babel/core": "^7.0.0-0" 386 | } 387 | }, 388 | "node_modules/@babel/template": { 389 | "version": "7.24.0", 390 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", 391 | "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", 392 | "dependencies": { 393 | "@babel/code-frame": "^7.23.5", 394 | "@babel/parser": "^7.24.0", 395 | "@babel/types": "^7.24.0" 396 | }, 397 | "engines": { 398 | "node": ">=6.9.0" 399 | } 400 | }, 401 | "node_modules/@babel/traverse": { 402 | "version": "7.24.1", 403 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", 404 | "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", 405 | "dependencies": { 406 | "@babel/code-frame": "^7.24.1", 407 | "@babel/generator": "^7.24.1", 408 | "@babel/helper-environment-visitor": "^7.22.20", 409 | "@babel/helper-function-name": "^7.23.0", 410 | "@babel/helper-hoist-variables": "^7.22.5", 411 | "@babel/helper-split-export-declaration": "^7.22.6", 412 | "@babel/parser": "^7.24.1", 413 | "@babel/types": "^7.24.0", 414 | "debug": "^4.3.1", 415 | "globals": "^11.1.0" 416 | }, 417 | "engines": { 418 | "node": ">=6.9.0" 419 | } 420 | }, 421 | "node_modules/@babel/traverse/node_modules/debug": { 422 | "version": "4.3.4", 423 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 424 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 425 | "dependencies": { 426 | "ms": "2.1.2" 427 | }, 428 | "engines": { 429 | "node": ">=6.0" 430 | }, 431 | "peerDependenciesMeta": { 432 | "supports-color": { 433 | "optional": true 434 | } 435 | } 436 | }, 437 | "node_modules/@babel/traverse/node_modules/ms": { 438 | "version": "2.1.2", 439 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 440 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 441 | }, 442 | "node_modules/@babel/types": { 443 | "version": "7.24.0", 444 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", 445 | "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", 446 | "dependencies": { 447 | "@babel/helper-string-parser": "^7.23.4", 448 | "@babel/helper-validator-identifier": "^7.22.20", 449 | "to-fast-properties": "^2.0.0" 450 | }, 451 | "engines": { 452 | "node": ">=6.9.0" 453 | } 454 | }, 455 | "node_modules/@jridgewell/gen-mapping": { 456 | "version": "0.3.5", 457 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", 458 | "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", 459 | "dependencies": { 460 | "@jridgewell/set-array": "^1.2.1", 461 | "@jridgewell/sourcemap-codec": "^1.4.10", 462 | "@jridgewell/trace-mapping": "^0.3.24" 463 | }, 464 | "engines": { 465 | "node": ">=6.0.0" 466 | } 467 | }, 468 | "node_modules/@jridgewell/resolve-uri": { 469 | "version": "3.1.2", 470 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 471 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 472 | "engines": { 473 | "node": ">=6.0.0" 474 | } 475 | }, 476 | "node_modules/@jridgewell/set-array": { 477 | "version": "1.2.1", 478 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", 479 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", 480 | "engines": { 481 | "node": ">=6.0.0" 482 | } 483 | }, 484 | "node_modules/@jridgewell/sourcemap-codec": { 485 | "version": "1.4.15", 486 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 487 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" 488 | }, 489 | "node_modules/@jridgewell/trace-mapping": { 490 | "version": "0.3.25", 491 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", 492 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 493 | "dependencies": { 494 | "@jridgewell/resolve-uri": "^3.1.0", 495 | "@jridgewell/sourcemap-codec": "^1.4.14" 496 | } 497 | }, 498 | "node_modules/@node-loader/babel": { 499 | "version": "2.1.0", 500 | "resolved": "https://registry.npmjs.org/@node-loader/babel/-/babel-2.1.0.tgz", 501 | "integrity": "sha512-I+73iuJ/OsXAho2FjrM6mnvs1Pb8NwTtDMXmxXOm8q3l2xi2/C4tTedcKkf2865118YEukrhF385/Fyn+2PZ0Q==" 502 | }, 503 | "node_modules/accepts": { 504 | "version": "1.3.8", 505 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 506 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 507 | "dependencies": { 508 | "mime-types": "~2.1.34", 509 | "negotiator": "0.6.3" 510 | }, 511 | "engines": { 512 | "node": ">= 0.6" 513 | } 514 | }, 515 | "node_modules/ansi-styles": { 516 | "version": "3.2.1", 517 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 518 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 519 | "dependencies": { 520 | "color-convert": "^1.9.0" 521 | }, 522 | "engines": { 523 | "node": ">=4" 524 | } 525 | }, 526 | "node_modules/array-flatten": { 527 | "version": "1.1.1", 528 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 529 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 530 | }, 531 | "node_modules/body-parser": { 532 | "version": "1.20.2", 533 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", 534 | "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", 535 | "dependencies": { 536 | "bytes": "3.1.2", 537 | "content-type": "~1.0.5", 538 | "debug": "2.6.9", 539 | "depd": "2.0.0", 540 | "destroy": "1.2.0", 541 | "http-errors": "2.0.0", 542 | "iconv-lite": "0.4.24", 543 | "on-finished": "2.4.1", 544 | "qs": "6.11.0", 545 | "raw-body": "2.5.2", 546 | "type-is": "~1.6.18", 547 | "unpipe": "1.0.0" 548 | }, 549 | "engines": { 550 | "node": ">= 0.8", 551 | "npm": "1.2.8000 || >= 1.4.16" 552 | } 553 | }, 554 | "node_modules/browserslist": { 555 | "version": "4.23.0", 556 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", 557 | "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", 558 | "funding": [ 559 | { 560 | "type": "opencollective", 561 | "url": "https://opencollective.com/browserslist" 562 | }, 563 | { 564 | "type": "tidelift", 565 | "url": "https://tidelift.com/funding/github/npm/browserslist" 566 | }, 567 | { 568 | "type": "github", 569 | "url": "https://github.com/sponsors/ai" 570 | } 571 | ], 572 | "dependencies": { 573 | "caniuse-lite": "^1.0.30001587", 574 | "electron-to-chromium": "^1.4.668", 575 | "node-releases": "^2.0.14", 576 | "update-browserslist-db": "^1.0.13" 577 | }, 578 | "bin": { 579 | "browserslist": "cli.js" 580 | }, 581 | "engines": { 582 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 583 | } 584 | }, 585 | "node_modules/bytes": { 586 | "version": "3.1.2", 587 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 588 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 589 | "engines": { 590 | "node": ">= 0.8" 591 | } 592 | }, 593 | "node_modules/call-bind": { 594 | "version": "1.0.7", 595 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", 596 | "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", 597 | "dependencies": { 598 | "es-define-property": "^1.0.0", 599 | "es-errors": "^1.3.0", 600 | "function-bind": "^1.1.2", 601 | "get-intrinsic": "^1.2.4", 602 | "set-function-length": "^1.2.1" 603 | }, 604 | "engines": { 605 | "node": ">= 0.4" 606 | }, 607 | "funding": { 608 | "url": "https://github.com/sponsors/ljharb" 609 | } 610 | }, 611 | "node_modules/caniuse-lite": { 612 | "version": "1.0.30001605", 613 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001605.tgz", 614 | "integrity": "sha512-nXwGlFWo34uliI9z3n6Qc0wZaf7zaZWA1CPZ169La5mV3I/gem7bst0vr5XQH5TJXZIMfDeZyOrZnSlVzKxxHQ==", 615 | "funding": [ 616 | { 617 | "type": "opencollective", 618 | "url": "https://opencollective.com/browserslist" 619 | }, 620 | { 621 | "type": "tidelift", 622 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 623 | }, 624 | { 625 | "type": "github", 626 | "url": "https://github.com/sponsors/ai" 627 | } 628 | ] 629 | }, 630 | "node_modules/chalk": { 631 | "version": "2.4.2", 632 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 633 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 634 | "dependencies": { 635 | "ansi-styles": "^3.2.1", 636 | "escape-string-regexp": "^1.0.5", 637 | "supports-color": "^5.3.0" 638 | }, 639 | "engines": { 640 | "node": ">=4" 641 | } 642 | }, 643 | "node_modules/color-convert": { 644 | "version": "1.9.3", 645 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 646 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 647 | "dependencies": { 648 | "color-name": "1.1.3" 649 | } 650 | }, 651 | "node_modules/color-name": { 652 | "version": "1.1.3", 653 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 654 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" 655 | }, 656 | "node_modules/content-disposition": { 657 | "version": "0.5.4", 658 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 659 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 660 | "dependencies": { 661 | "safe-buffer": "5.2.1" 662 | }, 663 | "engines": { 664 | "node": ">= 0.6" 665 | } 666 | }, 667 | "node_modules/content-type": { 668 | "version": "1.0.5", 669 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 670 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 671 | "engines": { 672 | "node": ">= 0.6" 673 | } 674 | }, 675 | "node_modules/convert-source-map": { 676 | "version": "2.0.0", 677 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", 678 | "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" 679 | }, 680 | "node_modules/cookie": { 681 | "version": "0.6.0", 682 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", 683 | "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", 684 | "engines": { 685 | "node": ">= 0.6" 686 | } 687 | }, 688 | "node_modules/cookie-signature": { 689 | "version": "1.0.6", 690 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 691 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 692 | }, 693 | "node_modules/debug": { 694 | "version": "2.6.9", 695 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 696 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 697 | "dependencies": { 698 | "ms": "2.0.0" 699 | } 700 | }, 701 | "node_modules/define-data-property": { 702 | "version": "1.1.4", 703 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", 704 | "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", 705 | "dependencies": { 706 | "es-define-property": "^1.0.0", 707 | "es-errors": "^1.3.0", 708 | "gopd": "^1.0.1" 709 | }, 710 | "engines": { 711 | "node": ">= 0.4" 712 | }, 713 | "funding": { 714 | "url": "https://github.com/sponsors/ljharb" 715 | } 716 | }, 717 | "node_modules/depd": { 718 | "version": "2.0.0", 719 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 720 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 721 | "engines": { 722 | "node": ">= 0.8" 723 | } 724 | }, 725 | "node_modules/destroy": { 726 | "version": "1.2.0", 727 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 728 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 729 | "engines": { 730 | "node": ">= 0.8", 731 | "npm": "1.2.8000 || >= 1.4.16" 732 | } 733 | }, 734 | "node_modules/ee-first": { 735 | "version": "1.1.1", 736 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 737 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 738 | }, 739 | "node_modules/electron-to-chromium": { 740 | "version": "1.4.723", 741 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.723.tgz", 742 | "integrity": "sha512-rxFVtrMGMFROr4qqU6n95rUi9IlfIm+lIAt+hOToy/9r6CDv0XiEcQdC3VP71y1pE5CFTzKV0RvxOGYCPWWHPw==" 743 | }, 744 | "node_modules/encodeurl": { 745 | "version": "1.0.2", 746 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 747 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 748 | "engines": { 749 | "node": ">= 0.8" 750 | } 751 | }, 752 | "node_modules/es-define-property": { 753 | "version": "1.0.0", 754 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", 755 | "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", 756 | "dependencies": { 757 | "get-intrinsic": "^1.2.4" 758 | }, 759 | "engines": { 760 | "node": ">= 0.4" 761 | } 762 | }, 763 | "node_modules/es-errors": { 764 | "version": "1.3.0", 765 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 766 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 767 | "engines": { 768 | "node": ">= 0.4" 769 | } 770 | }, 771 | "node_modules/escalade": { 772 | "version": "3.1.2", 773 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", 774 | "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", 775 | "engines": { 776 | "node": ">=6" 777 | } 778 | }, 779 | "node_modules/escape-html": { 780 | "version": "1.0.3", 781 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 782 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 783 | }, 784 | "node_modules/escape-string-regexp": { 785 | "version": "1.0.5", 786 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 787 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 788 | "engines": { 789 | "node": ">=0.8.0" 790 | } 791 | }, 792 | "node_modules/etag": { 793 | "version": "1.8.1", 794 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 795 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 796 | "engines": { 797 | "node": ">= 0.6" 798 | } 799 | }, 800 | "node_modules/express": { 801 | "version": "4.19.2", 802 | "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", 803 | "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", 804 | "dependencies": { 805 | "accepts": "~1.3.8", 806 | "array-flatten": "1.1.1", 807 | "body-parser": "1.20.2", 808 | "content-disposition": "0.5.4", 809 | "content-type": "~1.0.4", 810 | "cookie": "0.6.0", 811 | "cookie-signature": "1.0.6", 812 | "debug": "2.6.9", 813 | "depd": "2.0.0", 814 | "encodeurl": "~1.0.2", 815 | "escape-html": "~1.0.3", 816 | "etag": "~1.8.1", 817 | "finalhandler": "1.2.0", 818 | "fresh": "0.5.2", 819 | "http-errors": "2.0.0", 820 | "merge-descriptors": "1.0.1", 821 | "methods": "~1.1.2", 822 | "on-finished": "2.4.1", 823 | "parseurl": "~1.3.3", 824 | "path-to-regexp": "0.1.7", 825 | "proxy-addr": "~2.0.7", 826 | "qs": "6.11.0", 827 | "range-parser": "~1.2.1", 828 | "safe-buffer": "5.2.1", 829 | "send": "0.18.0", 830 | "serve-static": "1.15.0", 831 | "setprototypeof": "1.2.0", 832 | "statuses": "2.0.1", 833 | "type-is": "~1.6.18", 834 | "utils-merge": "1.0.1", 835 | "vary": "~1.1.2" 836 | }, 837 | "engines": { 838 | "node": ">= 0.10.0" 839 | } 840 | }, 841 | "node_modules/finalhandler": { 842 | "version": "1.2.0", 843 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 844 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 845 | "dependencies": { 846 | "debug": "2.6.9", 847 | "encodeurl": "~1.0.2", 848 | "escape-html": "~1.0.3", 849 | "on-finished": "2.4.1", 850 | "parseurl": "~1.3.3", 851 | "statuses": "2.0.1", 852 | "unpipe": "~1.0.0" 853 | }, 854 | "engines": { 855 | "node": ">= 0.8" 856 | } 857 | }, 858 | "node_modules/forwarded": { 859 | "version": "0.2.0", 860 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 861 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 862 | "engines": { 863 | "node": ">= 0.6" 864 | } 865 | }, 866 | "node_modules/fresh": { 867 | "version": "0.5.2", 868 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 869 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 870 | "engines": { 871 | "node": ">= 0.6" 872 | } 873 | }, 874 | "node_modules/function-bind": { 875 | "version": "1.1.2", 876 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 877 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 878 | "funding": { 879 | "url": "https://github.com/sponsors/ljharb" 880 | } 881 | }, 882 | "node_modules/gensync": { 883 | "version": "1.0.0-beta.2", 884 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 885 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 886 | "engines": { 887 | "node": ">=6.9.0" 888 | } 889 | }, 890 | "node_modules/get-intrinsic": { 891 | "version": "1.2.4", 892 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", 893 | "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", 894 | "dependencies": { 895 | "es-errors": "^1.3.0", 896 | "function-bind": "^1.1.2", 897 | "has-proto": "^1.0.1", 898 | "has-symbols": "^1.0.3", 899 | "hasown": "^2.0.0" 900 | }, 901 | "engines": { 902 | "node": ">= 0.4" 903 | }, 904 | "funding": { 905 | "url": "https://github.com/sponsors/ljharb" 906 | } 907 | }, 908 | "node_modules/globals": { 909 | "version": "11.12.0", 910 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 911 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 912 | "engines": { 913 | "node": ">=4" 914 | } 915 | }, 916 | "node_modules/gopd": { 917 | "version": "1.0.1", 918 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 919 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 920 | "dependencies": { 921 | "get-intrinsic": "^1.1.3" 922 | }, 923 | "funding": { 924 | "url": "https://github.com/sponsors/ljharb" 925 | } 926 | }, 927 | "node_modules/has-flag": { 928 | "version": "3.0.0", 929 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 930 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 931 | "engines": { 932 | "node": ">=4" 933 | } 934 | }, 935 | "node_modules/has-property-descriptors": { 936 | "version": "1.0.2", 937 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", 938 | "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", 939 | "dependencies": { 940 | "es-define-property": "^1.0.0" 941 | }, 942 | "funding": { 943 | "url": "https://github.com/sponsors/ljharb" 944 | } 945 | }, 946 | "node_modules/has-proto": { 947 | "version": "1.0.3", 948 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", 949 | "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", 950 | "engines": { 951 | "node": ">= 0.4" 952 | }, 953 | "funding": { 954 | "url": "https://github.com/sponsors/ljharb" 955 | } 956 | }, 957 | "node_modules/has-symbols": { 958 | "version": "1.0.3", 959 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 960 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 961 | "engines": { 962 | "node": ">= 0.4" 963 | }, 964 | "funding": { 965 | "url": "https://github.com/sponsors/ljharb" 966 | } 967 | }, 968 | "node_modules/hasown": { 969 | "version": "2.0.2", 970 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 971 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 972 | "dependencies": { 973 | "function-bind": "^1.1.2" 974 | }, 975 | "engines": { 976 | "node": ">= 0.4" 977 | } 978 | }, 979 | "node_modules/http-errors": { 980 | "version": "2.0.0", 981 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 982 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 983 | "dependencies": { 984 | "depd": "2.0.0", 985 | "inherits": "2.0.4", 986 | "setprototypeof": "1.2.0", 987 | "statuses": "2.0.1", 988 | "toidentifier": "1.0.1" 989 | }, 990 | "engines": { 991 | "node": ">= 0.8" 992 | } 993 | }, 994 | "node_modules/iconv-lite": { 995 | "version": "0.4.24", 996 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 997 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 998 | "dependencies": { 999 | "safer-buffer": ">= 2.1.2 < 3" 1000 | }, 1001 | "engines": { 1002 | "node": ">=0.10.0" 1003 | } 1004 | }, 1005 | "node_modules/inherits": { 1006 | "version": "2.0.4", 1007 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1008 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1009 | }, 1010 | "node_modules/ipaddr.js": { 1011 | "version": "1.9.1", 1012 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1013 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 1014 | "engines": { 1015 | "node": ">= 0.10" 1016 | } 1017 | }, 1018 | "node_modules/js-tokens": { 1019 | "version": "4.0.0", 1020 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1021 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 1022 | }, 1023 | "node_modules/jsesc": { 1024 | "version": "2.5.2", 1025 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 1026 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 1027 | "bin": { 1028 | "jsesc": "bin/jsesc" 1029 | }, 1030 | "engines": { 1031 | "node": ">=4" 1032 | } 1033 | }, 1034 | "node_modules/json5": { 1035 | "version": "2.2.3", 1036 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", 1037 | "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", 1038 | "bin": { 1039 | "json5": "lib/cli.js" 1040 | }, 1041 | "engines": { 1042 | "node": ">=6" 1043 | } 1044 | }, 1045 | "node_modules/loose-envify": { 1046 | "version": "1.4.0", 1047 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 1048 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 1049 | "dependencies": { 1050 | "js-tokens": "^3.0.0 || ^4.0.0" 1051 | }, 1052 | "bin": { 1053 | "loose-envify": "cli.js" 1054 | } 1055 | }, 1056 | "node_modules/lru-cache": { 1057 | "version": "5.1.1", 1058 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 1059 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 1060 | "dependencies": { 1061 | "yallist": "^3.0.2" 1062 | } 1063 | }, 1064 | "node_modules/media-typer": { 1065 | "version": "0.3.0", 1066 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1067 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 1068 | "engines": { 1069 | "node": ">= 0.6" 1070 | } 1071 | }, 1072 | "node_modules/merge-descriptors": { 1073 | "version": "1.0.1", 1074 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1075 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 1076 | }, 1077 | "node_modules/methods": { 1078 | "version": "1.1.2", 1079 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1080 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 1081 | "engines": { 1082 | "node": ">= 0.6" 1083 | } 1084 | }, 1085 | "node_modules/mime": { 1086 | "version": "1.6.0", 1087 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1088 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 1089 | "bin": { 1090 | "mime": "cli.js" 1091 | }, 1092 | "engines": { 1093 | "node": ">=4" 1094 | } 1095 | }, 1096 | "node_modules/mime-db": { 1097 | "version": "1.52.0", 1098 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1099 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 1100 | "engines": { 1101 | "node": ">= 0.6" 1102 | } 1103 | }, 1104 | "node_modules/mime-types": { 1105 | "version": "2.1.35", 1106 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1107 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1108 | "dependencies": { 1109 | "mime-db": "1.52.0" 1110 | }, 1111 | "engines": { 1112 | "node": ">= 0.6" 1113 | } 1114 | }, 1115 | "node_modules/ms": { 1116 | "version": "2.0.0", 1117 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1118 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 1119 | }, 1120 | "node_modules/negotiator": { 1121 | "version": "0.6.3", 1122 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1123 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 1124 | "engines": { 1125 | "node": ">= 0.6" 1126 | } 1127 | }, 1128 | "node_modules/node-releases": { 1129 | "version": "2.0.14", 1130 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", 1131 | "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" 1132 | }, 1133 | "node_modules/object-inspect": { 1134 | "version": "1.13.1", 1135 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", 1136 | "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", 1137 | "funding": { 1138 | "url": "https://github.com/sponsors/ljharb" 1139 | } 1140 | }, 1141 | "node_modules/on-finished": { 1142 | "version": "2.4.1", 1143 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 1144 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 1145 | "dependencies": { 1146 | "ee-first": "1.1.1" 1147 | }, 1148 | "engines": { 1149 | "node": ">= 0.8" 1150 | } 1151 | }, 1152 | "node_modules/parseurl": { 1153 | "version": "1.3.3", 1154 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1155 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 1156 | "engines": { 1157 | "node": ">= 0.8" 1158 | } 1159 | }, 1160 | "node_modules/path-to-regexp": { 1161 | "version": "0.1.7", 1162 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1163 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 1164 | }, 1165 | "node_modules/picocolors": { 1166 | "version": "1.0.0", 1167 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 1168 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 1169 | }, 1170 | "node_modules/proxy-addr": { 1171 | "version": "2.0.7", 1172 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1173 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1174 | "dependencies": { 1175 | "forwarded": "0.2.0", 1176 | "ipaddr.js": "1.9.1" 1177 | }, 1178 | "engines": { 1179 | "node": ">= 0.10" 1180 | } 1181 | }, 1182 | "node_modules/qs": { 1183 | "version": "6.11.0", 1184 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 1185 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 1186 | "dependencies": { 1187 | "side-channel": "^1.0.4" 1188 | }, 1189 | "engines": { 1190 | "node": ">=0.6" 1191 | }, 1192 | "funding": { 1193 | "url": "https://github.com/sponsors/ljharb" 1194 | } 1195 | }, 1196 | "node_modules/range-parser": { 1197 | "version": "1.2.1", 1198 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1199 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 1200 | "engines": { 1201 | "node": ">= 0.6" 1202 | } 1203 | }, 1204 | "node_modules/raw-body": { 1205 | "version": "2.5.2", 1206 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", 1207 | "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", 1208 | "dependencies": { 1209 | "bytes": "3.1.2", 1210 | "http-errors": "2.0.0", 1211 | "iconv-lite": "0.4.24", 1212 | "unpipe": "1.0.0" 1213 | }, 1214 | "engines": { 1215 | "node": ">= 0.8" 1216 | } 1217 | }, 1218 | "node_modules/react": { 1219 | "version": "18.2.0", 1220 | "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", 1221 | "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", 1222 | "dependencies": { 1223 | "loose-envify": "^1.1.0" 1224 | }, 1225 | "engines": { 1226 | "node": ">=0.10.0" 1227 | } 1228 | }, 1229 | "node_modules/react-dom": { 1230 | "version": "18.2.0", 1231 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", 1232 | "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", 1233 | "dependencies": { 1234 | "loose-envify": "^1.1.0", 1235 | "scheduler": "^0.23.0" 1236 | }, 1237 | "peerDependencies": { 1238 | "react": "^18.2.0" 1239 | } 1240 | }, 1241 | "node_modules/safe-buffer": { 1242 | "version": "5.2.1", 1243 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1244 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1245 | "funding": [ 1246 | { 1247 | "type": "github", 1248 | "url": "https://github.com/sponsors/feross" 1249 | }, 1250 | { 1251 | "type": "patreon", 1252 | "url": "https://www.patreon.com/feross" 1253 | }, 1254 | { 1255 | "type": "consulting", 1256 | "url": "https://feross.org/support" 1257 | } 1258 | ] 1259 | }, 1260 | "node_modules/safer-buffer": { 1261 | "version": "2.1.2", 1262 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1263 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1264 | }, 1265 | "node_modules/scheduler": { 1266 | "version": "0.23.0", 1267 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", 1268 | "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", 1269 | "dependencies": { 1270 | "loose-envify": "^1.1.0" 1271 | } 1272 | }, 1273 | "node_modules/semver": { 1274 | "version": "6.3.1", 1275 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 1276 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 1277 | "bin": { 1278 | "semver": "bin/semver.js" 1279 | } 1280 | }, 1281 | "node_modules/send": { 1282 | "version": "0.18.0", 1283 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 1284 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 1285 | "dependencies": { 1286 | "debug": "2.6.9", 1287 | "depd": "2.0.0", 1288 | "destroy": "1.2.0", 1289 | "encodeurl": "~1.0.2", 1290 | "escape-html": "~1.0.3", 1291 | "etag": "~1.8.1", 1292 | "fresh": "0.5.2", 1293 | "http-errors": "2.0.0", 1294 | "mime": "1.6.0", 1295 | "ms": "2.1.3", 1296 | "on-finished": "2.4.1", 1297 | "range-parser": "~1.2.1", 1298 | "statuses": "2.0.1" 1299 | }, 1300 | "engines": { 1301 | "node": ">= 0.8.0" 1302 | } 1303 | }, 1304 | "node_modules/send/node_modules/ms": { 1305 | "version": "2.1.3", 1306 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1307 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1308 | }, 1309 | "node_modules/serve-static": { 1310 | "version": "1.15.0", 1311 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 1312 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 1313 | "dependencies": { 1314 | "encodeurl": "~1.0.2", 1315 | "escape-html": "~1.0.3", 1316 | "parseurl": "~1.3.3", 1317 | "send": "0.18.0" 1318 | }, 1319 | "engines": { 1320 | "node": ">= 0.8.0" 1321 | } 1322 | }, 1323 | "node_modules/set-function-length": { 1324 | "version": "1.2.2", 1325 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", 1326 | "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", 1327 | "dependencies": { 1328 | "define-data-property": "^1.1.4", 1329 | "es-errors": "^1.3.0", 1330 | "function-bind": "^1.1.2", 1331 | "get-intrinsic": "^1.2.4", 1332 | "gopd": "^1.0.1", 1333 | "has-property-descriptors": "^1.0.2" 1334 | }, 1335 | "engines": { 1336 | "node": ">= 0.4" 1337 | } 1338 | }, 1339 | "node_modules/setprototypeof": { 1340 | "version": "1.2.0", 1341 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1342 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1343 | }, 1344 | "node_modules/side-channel": { 1345 | "version": "1.0.6", 1346 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", 1347 | "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", 1348 | "dependencies": { 1349 | "call-bind": "^1.0.7", 1350 | "es-errors": "^1.3.0", 1351 | "get-intrinsic": "^1.2.4", 1352 | "object-inspect": "^1.13.1" 1353 | }, 1354 | "engines": { 1355 | "node": ">= 0.4" 1356 | }, 1357 | "funding": { 1358 | "url": "https://github.com/sponsors/ljharb" 1359 | } 1360 | }, 1361 | "node_modules/statuses": { 1362 | "version": "2.0.1", 1363 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1364 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 1365 | "engines": { 1366 | "node": ">= 0.8" 1367 | } 1368 | }, 1369 | "node_modules/supports-color": { 1370 | "version": "5.5.0", 1371 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1372 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1373 | "dependencies": { 1374 | "has-flag": "^3.0.0" 1375 | }, 1376 | "engines": { 1377 | "node": ">=4" 1378 | } 1379 | }, 1380 | "node_modules/to-fast-properties": { 1381 | "version": "2.0.0", 1382 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 1383 | "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", 1384 | "engines": { 1385 | "node": ">=4" 1386 | } 1387 | }, 1388 | "node_modules/toidentifier": { 1389 | "version": "1.0.1", 1390 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1391 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 1392 | "engines": { 1393 | "node": ">=0.6" 1394 | } 1395 | }, 1396 | "node_modules/type-is": { 1397 | "version": "1.6.18", 1398 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1399 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1400 | "dependencies": { 1401 | "media-typer": "0.3.0", 1402 | "mime-types": "~2.1.24" 1403 | }, 1404 | "engines": { 1405 | "node": ">= 0.6" 1406 | } 1407 | }, 1408 | "node_modules/unpipe": { 1409 | "version": "1.0.0", 1410 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1411 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 1412 | "engines": { 1413 | "node": ">= 0.8" 1414 | } 1415 | }, 1416 | "node_modules/update-browserslist-db": { 1417 | "version": "1.0.13", 1418 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", 1419 | "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", 1420 | "funding": [ 1421 | { 1422 | "type": "opencollective", 1423 | "url": "https://opencollective.com/browserslist" 1424 | }, 1425 | { 1426 | "type": "tidelift", 1427 | "url": "https://tidelift.com/funding/github/npm/browserslist" 1428 | }, 1429 | { 1430 | "type": "github", 1431 | "url": "https://github.com/sponsors/ai" 1432 | } 1433 | ], 1434 | "dependencies": { 1435 | "escalade": "^3.1.1", 1436 | "picocolors": "^1.0.0" 1437 | }, 1438 | "bin": { 1439 | "update-browserslist-db": "cli.js" 1440 | }, 1441 | "peerDependencies": { 1442 | "browserslist": ">= 4.21.0" 1443 | } 1444 | }, 1445 | "node_modules/utils-merge": { 1446 | "version": "1.0.1", 1447 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1448 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 1449 | "engines": { 1450 | "node": ">= 0.4.0" 1451 | } 1452 | }, 1453 | "node_modules/vary": { 1454 | "version": "1.1.2", 1455 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1456 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 1457 | "engines": { 1458 | "node": ">= 0.8" 1459 | } 1460 | }, 1461 | "node_modules/yallist": { 1462 | "version": "3.1.1", 1463 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 1464 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" 1465 | } 1466 | } 1467 | } 1468 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-template-engine", 3 | "version": "1.0.0", 4 | "description": "", 5 | "type": "module", 6 | "main": "index.js", 7 | "scripts": { 8 | "start": "node --import ./register.js app.js", 9 | "dev": "node --watch --import ./register.js app.js" 10 | }, 11 | "keywords": [], 12 | "author": "", 13 | "license": "ISC", 14 | "dependencies": { 15 | "@babel/core": "^7.24.3", 16 | "@babel/preset-react": "^7.24.1", 17 | "@node-loader/babel": "^2.1.0", 18 | "express": "^4.19.2", 19 | "react": "^18.2.0", 20 | "react-dom": "^18.2.0" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /public/htmx.js: -------------------------------------------------------------------------------- 1 | (function(e,t){if(typeof define==="function"&&define.amd){define([],t)}else if(typeof module==="object"&&module.exports){module.exports=t()}else{e.htmx=e.htmx||t()}})(typeof self!=="undefined"?self:this,function(){return function(){"use strict";var Q={onLoad:F,process:zt,on:de,off:ge,trigger:ce,ajax:Nr,find:C,findAll:f,closest:v,values:function(e,t){var r=dr(e,t||"post");return r.values},remove:_,addClass:z,removeClass:n,toggleClass:$,takeClass:W,defineExtension:Ur,removeExtension:Br,logAll:V,logNone:j,logger:null,config:{historyEnabled:true,historyCacheSize:10,refreshOnHistoryMiss:false,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:true,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:true,allowScriptTags:true,inlineScriptNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:false,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",useTemplateFragments:false,scrollBehavior:"smooth",defaultFocusScroll:false,getCacheBusterParam:false,globalViewTransitions:false,methodsThatUseUrlParams:["get"],selfRequestsOnly:false,ignoreTitle:false,scrollIntoViewOnBoost:true,triggerSpecsCache:null},parseInterval:d,_:t,createEventSource:function(e){return new EventSource(e,{withCredentials:true})},createWebSocket:function(e){var t=new WebSocket(e,[]);t.binaryType=Q.config.wsBinaryType;return t},version:"1.9.10"};var r={addTriggerHandler:Lt,bodyContains:se,canAccessLocalStorage:U,findThisElement:xe,filterValues:yr,hasAttribute:o,getAttributeValue:te,getClosestAttributeValue:ne,getClosestMatch:c,getExpressionVars:Hr,getHeaders:xr,getInputValues:dr,getInternalData:ae,getSwapSpecification:wr,getTriggerSpecs:it,getTarget:ye,makeFragment:l,mergeObjects:le,makeSettleInfo:T,oobSwap:Ee,querySelectorExt:ue,selectAndSwap:je,settleImmediately:nr,shouldCancel:ut,triggerEvent:ce,triggerErrorEvent:fe,withExtensions:R};var w=["get","post","put","delete","patch"];var i=w.map(function(e){return"[hx-"+e+"], [data-hx-"+e+"]"}).join(", ");var S=e("head"),q=e("title"),H=e("svg",true);function e(e,t=false){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function d(e){if(e==undefined){return undefined}let t=NaN;if(e.slice(-2)=="ms"){t=parseFloat(e.slice(0,-2))}else if(e.slice(-1)=="s"){t=parseFloat(e.slice(0,-1))*1e3}else if(e.slice(-1)=="m"){t=parseFloat(e.slice(0,-1))*1e3*60}else{t=parseFloat(e)}return isNaN(t)?undefined:t}function ee(e,t){return e.getAttribute&&e.getAttribute(t)}function o(e,t){return e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function te(e,t){return ee(e,t)||ee(e,"data-"+t)}function u(e){return e.parentElement}function re(){return document}function c(e,t){while(e&&!t(e)){e=u(e)}return e?e:null}function L(e,t,r){var n=te(t,r);var i=te(t,"hx-disinherit");if(e!==t&&i&&(i==="*"||i.split(" ").indexOf(r)>=0)){return"unset"}else{return n}}function ne(t,r){var n=null;c(t,function(e){return n=L(t,e,r)});if(n!=="unset"){return n}}function h(e,t){var r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector;return r&&r.call(e,t)}function A(e){var t=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i;var r=t.exec(e);if(r){return r[1].toLowerCase()}else{return""}}function a(e,t){var r=new DOMParser;var n=r.parseFromString(e,"text/html");var i=n.body;while(t>0){t--;i=i.firstChild}if(i==null){i=re().createDocumentFragment()}return i}function N(e){return/",0);return i.querySelector("template").content}switch(r){case"thead":case"tbody":case"tfoot":case"colgroup":case"caption":return a(""+n+"
",1);case"col":return a(""+n+"
",2);case"tr":return a(""+n+"
",2);case"td":case"th":return a(""+n+"
",3);case"script":case"style":return a("
"+n+"
",1);default:return a(n,0)}}function ie(e){if(e){e()}}function I(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function k(e){return I(e,"Function")}function P(e){return I(e,"Object")}function ae(e){var t="htmx-internal-data";var r=e[t];if(!r){r=e[t]={}}return r}function M(e){var t=[];if(e){for(var r=0;r=0}function se(e){if(e.getRootNode&&e.getRootNode()instanceof window.ShadowRoot){return re().body.contains(e.getRootNode().host)}else{return re().body.contains(e)}}function D(e){return e.trim().split(/\s+/)}function le(e,t){for(var r in t){if(t.hasOwnProperty(r)){e[r]=t[r]}}return e}function E(e){try{return JSON.parse(e)}catch(e){b(e);return null}}function U(){var e="htmx:localStorageTest";try{localStorage.setItem(e,e);localStorage.removeItem(e);return true}catch(e){return false}}function B(t){try{var e=new URL(t);if(e){t=e.pathname+e.search}if(!/^\/$/.test(t)){t=t.replace(/\/+$/,"")}return t}catch(e){return t}}function t(e){return Tr(re().body,function(){return eval(e)})}function F(t){var e=Q.on("htmx:load",function(e){t(e.detail.elt)});return e}function V(){Q.logger=function(e,t,r){if(console){console.log(t,e,r)}}}function j(){Q.logger=null}function C(e,t){if(t){return e.querySelector(t)}else{return C(re(),e)}}function f(e,t){if(t){return e.querySelectorAll(t)}else{return f(re(),e)}}function _(e,t){e=g(e);if(t){setTimeout(function(){_(e);e=null},t)}else{e.parentElement.removeChild(e)}}function z(e,t,r){e=g(e);if(r){setTimeout(function(){z(e,t);e=null},r)}else{e.classList&&e.classList.add(t)}}function n(e,t,r){e=g(e);if(r){setTimeout(function(){n(e,t);e=null},r)}else{if(e.classList){e.classList.remove(t);if(e.classList.length===0){e.removeAttribute("class")}}}}function $(e,t){e=g(e);e.classList.toggle(t)}function W(e,t){e=g(e);oe(e.parentElement.children,function(e){n(e,t)});z(e,t)}function v(e,t){e=g(e);if(e.closest){return e.closest(t)}else{do{if(e==null||h(e,t)){return e}}while(e=e&&u(e));return null}}function s(e,t){return e.substring(0,t.length)===t}function G(e,t){return e.substring(e.length-t.length)===t}function J(e){var t=e.trim();if(s(t,"<")&&G(t,"/>")){return t.substring(1,t.length-2)}else{return t}}function Z(e,t){if(t.indexOf("closest ")===0){return[v(e,J(t.substr(8)))]}else if(t.indexOf("find ")===0){return[C(e,J(t.substr(5)))]}else if(t==="next"){return[e.nextElementSibling]}else if(t.indexOf("next ")===0){return[K(e,J(t.substr(5)))]}else if(t==="previous"){return[e.previousElementSibling]}else if(t.indexOf("previous ")===0){return[Y(e,J(t.substr(9)))]}else if(t==="document"){return[document]}else if(t==="window"){return[window]}else if(t==="body"){return[document.body]}else{return re().querySelectorAll(J(t))}}var K=function(e,t){var r=re().querySelectorAll(t);for(var n=0;n=0;n--){var i=r[n];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING){return i}}};function ue(e,t){if(t){return Z(e,t)[0]}else{return Z(re().body,e)[0]}}function g(e){if(I(e,"String")){return C(e)}else{return e}}function ve(e,t,r){if(k(t)){return{target:re().body,event:e,listener:t}}else{return{target:g(e),event:t,listener:r}}}function de(t,r,n){jr(function(){var e=ve(t,r,n);e.target.addEventListener(e.event,e.listener)});var e=k(r);return e?r:n}function ge(t,r,n){jr(function(){var e=ve(t,r,n);e.target.removeEventListener(e.event,e.listener)});return k(r)?r:n}var me=re().createElement("output");function pe(e,t){var r=ne(e,t);if(r){if(r==="this"){return[xe(e,t)]}else{var n=Z(e,r);if(n.length===0){b('The selector "'+r+'" on '+t+" returned no matches!");return[me]}else{return n}}}}function xe(e,t){return c(e,function(e){return te(e,t)!=null})}function ye(e){var t=ne(e,"hx-target");if(t){if(t==="this"){return xe(e,"hx-target")}else{return ue(e,t)}}else{var r=ae(e);if(r.boosted){return re().body}else{return e}}}function be(e){var t=Q.config.attributesToSettle;for(var r=0;r0){o=e.substr(0,e.indexOf(":"));t=e.substr(e.indexOf(":")+1,e.length)}else{o=e}var r=re().querySelectorAll(t);if(r){oe(r,function(e){var t;var r=i.cloneNode(true);t=re().createDocumentFragment();t.appendChild(r);if(!Se(o,e)){t=r}var n={shouldSwap:true,target:e,fragment:t};if(!ce(e,"htmx:oobBeforeSwap",n))return;e=n.target;if(n["shouldSwap"]){Fe(o,e,e,t,a)}oe(a.elts,function(e){ce(e,"htmx:oobAfterSwap",n)})});i.parentNode.removeChild(i)}else{i.parentNode.removeChild(i);fe(re().body,"htmx:oobErrorNoTarget",{content:i})}return e}function Ce(e,t,r){var n=ne(e,"hx-select-oob");if(n){var i=n.split(",");for(var a=0;a0){var r=t.replace("'","\\'");var n=e.tagName.replace(":","\\:");var i=o.querySelector(n+"[id='"+r+"']");if(i&&i!==o){var a=e.cloneNode();we(e,i);s.tasks.push(function(){we(e,a)})}}})}function Oe(e){return function(){n(e,Q.config.addedClass);zt(e);Nt(e);qe(e);ce(e,"htmx:load")}}function qe(e){var t="[autofocus]";var r=h(e,t)?e:e.querySelector(t);if(r!=null){r.focus()}}function m(e,t,r,n){Te(e,r,n);while(r.childNodes.length>0){var i=r.firstChild;z(i,Q.config.addedClass);e.insertBefore(i,t);if(i.nodeType!==Node.TEXT_NODE&&i.nodeType!==Node.COMMENT_NODE){n.tasks.push(Oe(i))}}}function He(e,t){var r=0;while(r-1){var t=e.replace(H,"");var r=t.match(q);if(r){return r[2]}}}function je(e,t,r,n,i,a){i.title=Ve(n);var o=l(n);if(o){Ce(r,o,i);o=Be(r,o,a);Re(o);return Fe(e,r,t,o,i)}}function _e(e,t,r){var n=e.getResponseHeader(t);if(n.indexOf("{")===0){var i=E(n);for(var a in i){if(i.hasOwnProperty(a)){var o=i[a];if(!P(o)){o={value:o}}ce(r,a,o)}}}else{var s=n.split(",");for(var l=0;l0){var o=t[0];if(o==="]"){n--;if(n===0){if(a===null){i=i+"true"}t.shift();i+=")})";try{var s=Tr(e,function(){return Function(i)()},function(){return true});s.source=i;return s}catch(e){fe(re().body,"htmx:syntax:error",{error:e,source:i});return null}}}else if(o==="["){n++}if(Qe(o,a,r)){i+="(("+r+"."+o+") ? ("+r+"."+o+") : (window."+o+"))"}else{i=i+o}a=t.shift()}}}function y(e,t){var r="";while(e.length>0&&!t.test(e[0])){r+=e.shift()}return r}function tt(e){var t;if(e.length>0&&Ze.test(e[0])){e.shift();t=y(e,Ke).trim();e.shift()}else{t=y(e,x)}return t}var rt="input, textarea, select";function nt(e,t,r){var n=[];var i=Ye(t);do{y(i,Je);var a=i.length;var o=y(i,/[,\[\s]/);if(o!==""){if(o==="every"){var s={trigger:"every"};y(i,Je);s.pollInterval=d(y(i,/[,\[\s]/));y(i,Je);var l=et(e,i,"event");if(l){s.eventFilter=l}n.push(s)}else if(o.indexOf("sse:")===0){n.push({trigger:"sse",sseEvent:o.substr(4)})}else{var u={trigger:o};var l=et(e,i,"event");if(l){u.eventFilter=l}while(i.length>0&&i[0]!==","){y(i,Je);var f=i.shift();if(f==="changed"){u.changed=true}else if(f==="once"){u.once=true}else if(f==="consume"){u.consume=true}else if(f==="delay"&&i[0]===":"){i.shift();u.delay=d(y(i,x))}else if(f==="from"&&i[0]===":"){i.shift();if(Ze.test(i[0])){var c=tt(i)}else{var c=y(i,x);if(c==="closest"||c==="find"||c==="next"||c==="previous"){i.shift();var h=tt(i);if(h.length>0){c+=" "+h}}}u.from=c}else if(f==="target"&&i[0]===":"){i.shift();u.target=tt(i)}else if(f==="throttle"&&i[0]===":"){i.shift();u.throttle=d(y(i,x))}else if(f==="queue"&&i[0]===":"){i.shift();u.queue=y(i,x)}else if(f==="root"&&i[0]===":"){i.shift();u[f]=tt(i)}else if(f==="threshold"&&i[0]===":"){i.shift();u[f]=y(i,x)}else{fe(e,"htmx:syntax:error",{token:i.shift()})}}n.push(u)}}if(i.length===a){fe(e,"htmx:syntax:error",{token:i.shift()})}y(i,Je)}while(i[0]===","&&i.shift());if(r){r[t]=n}return n}function it(e){var t=te(e,"hx-trigger");var r=[];if(t){var n=Q.config.triggerSpecsCache;r=n&&n[t]||nt(e,t,n)}if(r.length>0){return r}else if(h(e,"form")){return[{trigger:"submit"}]}else if(h(e,'input[type="button"], input[type="submit"]')){return[{trigger:"click"}]}else if(h(e,rt)){return[{trigger:"change"}]}else{return[{trigger:"click"}]}}function at(e){ae(e).cancelled=true}function ot(e,t,r){var n=ae(e);n.timeout=setTimeout(function(){if(se(e)&&n.cancelled!==true){if(!ct(r,e,Wt("hx:poll:trigger",{triggerSpec:r,target:e}))){t(e)}ot(e,t,r)}},r.pollInterval)}function st(e){return location.hostname===e.hostname&&ee(e,"href")&&ee(e,"href").indexOf("#")!==0}function lt(t,r,e){if(t.tagName==="A"&&st(t)&&(t.target===""||t.target==="_self")||t.tagName==="FORM"){r.boosted=true;var n,i;if(t.tagName==="A"){n="get";i=ee(t,"href")}else{var a=ee(t,"method");n=a?a.toLowerCase():"get";if(n==="get"){}i=ee(t,"action")}e.forEach(function(e){ht(t,function(e,t){if(v(e,Q.config.disableSelector)){p(e);return}he(n,i,e,t)},r,e,true)})}}function ut(e,t){if(e.type==="submit"||e.type==="click"){if(t.tagName==="FORM"){return true}if(h(t,'input[type="submit"], button')&&v(t,"form")!==null){return true}if(t.tagName==="A"&&t.href&&(t.getAttribute("href")==="#"||t.getAttribute("href").indexOf("#")!==0)){return true}}return false}function ft(e,t){return ae(e).boosted&&e.tagName==="A"&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function ct(e,t,r){var n=e.eventFilter;if(n){try{return n.call(t,r)!==true}catch(e){fe(re().body,"htmx:eventFilter:error",{error:e,source:n.source});return true}}return false}function ht(a,o,e,s,l){var u=ae(a);var t;if(s.from){t=Z(a,s.from)}else{t=[a]}if(s.changed){t.forEach(function(e){var t=ae(e);t.lastValue=e.value})}oe(t,function(n){var i=function(e){if(!se(a)){n.removeEventListener(s.trigger,i);return}if(ft(a,e)){return}if(l||ut(e,a)){e.preventDefault()}if(ct(s,a,e)){return}var t=ae(e);t.triggerSpec=s;if(t.handledFor==null){t.handledFor=[]}if(t.handledFor.indexOf(a)<0){t.handledFor.push(a);if(s.consume){e.stopPropagation()}if(s.target&&e.target){if(!h(e.target,s.target)){return}}if(s.once){if(u.triggeredOnce){return}else{u.triggeredOnce=true}}if(s.changed){var r=ae(n);if(r.lastValue===n.value){return}r.lastValue=n.value}if(u.delayed){clearTimeout(u.delayed)}if(u.throttle){return}if(s.throttle>0){if(!u.throttle){o(a,e);u.throttle=setTimeout(function(){u.throttle=null},s.throttle)}}else if(s.delay>0){u.delayed=setTimeout(function(){o(a,e)},s.delay)}else{ce(a,"htmx:trigger");o(a,e)}}};if(e.listenerInfos==null){e.listenerInfos=[]}e.listenerInfos.push({trigger:s.trigger,listener:i,on:n});n.addEventListener(s.trigger,i)})}var vt=false;var dt=null;function gt(){if(!dt){dt=function(){vt=true};window.addEventListener("scroll",dt);setInterval(function(){if(vt){vt=false;oe(re().querySelectorAll("[hx-trigger='revealed'],[data-hx-trigger='revealed']"),function(e){mt(e)})}},200)}}function mt(t){if(!o(t,"data-hx-revealed")&&X(t)){t.setAttribute("data-hx-revealed","true");var e=ae(t);if(e.initHash){ce(t,"revealed")}else{t.addEventListener("htmx:afterProcessNode",function(e){ce(t,"revealed")},{once:true})}}}function pt(e,t,r){var n=D(r);for(var i=0;i=0){var t=wt(n);setTimeout(function(){xt(s,r,n+1)},t)}};t.onopen=function(e){n=0};ae(s).webSocket=t;t.addEventListener("message",function(e){if(yt(s)){return}var t=e.data;R(s,function(e){t=e.transformResponse(t,null,s)});var r=T(s);var n=l(t);var i=M(n.children);for(var a=0;a0){ce(u,"htmx:validation:halted",i);return}t.send(JSON.stringify(l));if(ut(e,u)){e.preventDefault()}})}else{fe(u,"htmx:noWebSocketSourceError")}}function wt(e){var t=Q.config.wsReconnectDelay;if(typeof t==="function"){return t(e)}if(t==="full-jitter"){var r=Math.min(e,6);var n=1e3*Math.pow(2,r);return n*Math.random()}b('htmx.config.wsReconnectDelay must either be a function or the string "full-jitter"')}function St(e,t,r){var n=D(r);for(var i=0;i0){setTimeout(i,n)}else{i()}}function Ht(t,i,e){var a=false;oe(w,function(r){if(o(t,"hx-"+r)){var n=te(t,"hx-"+r);a=true;i.path=n;i.verb=r;e.forEach(function(e){Lt(t,e,i,function(e,t){if(v(e,Q.config.disableSelector)){p(e);return}he(r,n,e,t)})})}});return a}function Lt(n,e,t,r){if(e.sseEvent){Rt(n,r,e.sseEvent)}else if(e.trigger==="revealed"){gt();ht(n,r,t,e);mt(n)}else if(e.trigger==="intersect"){var i={};if(e.root){i.root=ue(n,e.root)}if(e.threshold){i.threshold=parseFloat(e.threshold)}var a=new IntersectionObserver(function(e){for(var t=0;t0){t.polling=true;ot(n,r,e)}else{ht(n,r,t,e)}}function At(e){if(Q.config.allowScriptTags&&(e.type==="text/javascript"||e.type==="module"||e.type==="")){var t=re().createElement("script");oe(e.attributes,function(e){t.setAttribute(e.name,e.value)});t.textContent=e.textContent;t.async=false;if(Q.config.inlineScriptNonce){t.nonce=Q.config.inlineScriptNonce}var r=e.parentElement;try{r.insertBefore(t,e)}catch(e){b(e)}finally{if(e.parentElement){e.parentElement.removeChild(e)}}}}function Nt(e){if(h(e,"script")){At(e)}oe(f(e,"script"),function(e){At(e)})}function It(e){var t=e.attributes;for(var r=0;r0){var o=n.shift();var s=o.match(/^\s*([a-zA-Z:\-\.]+:)(.*)/);if(a===0&&s){o.split(":");i=s[1].slice(0,-1);r[i]=s[2]}else{r[i]+=o}a+=Bt(o)}for(var l in r){Ft(e,l,r[l])}}}function jt(e){Ae(e);for(var t=0;tQ.config.historyCacheSize){i.shift()}while(i.length>0){try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(e){fe(re().body,"htmx:historyCacheError",{cause:e,cache:i});i.shift()}}}function Yt(e){if(!U()){return null}e=B(e);var t=E(localStorage.getItem("htmx-history-cache"))||[];for(var r=0;r=200&&this.status<400){ce(re().body,"htmx:historyCacheMissLoad",o);var e=l(this.response);e=e.querySelector("[hx-history-elt],[data-hx-history-elt]")||e;var t=Zt();var r=T(t);var n=Ve(this.response);if(n){var i=C("title");if(i){i.innerHTML=n}else{window.document.title=n}}Ue(t,e,r);nr(r.tasks);Jt=a;ce(re().body,"htmx:historyRestore",{path:a,cacheMiss:true,serverResponse:this.response})}else{fe(re().body,"htmx:historyCacheMissLoadError",o)}};e.send()}function ar(e){er();e=e||location.pathname+location.search;var t=Yt(e);if(t){var r=l(t.content);var n=Zt();var i=T(n);Ue(n,r,i);nr(i.tasks);document.title=t.title;setTimeout(function(){window.scrollTo(0,t.scroll)},0);Jt=e;ce(re().body,"htmx:historyRestore",{path:e,item:t})}else{if(Q.config.refreshOnHistoryMiss){window.location.reload(true)}else{ir(e)}}}function or(e){var t=pe(e,"hx-indicator");if(t==null){t=[e]}oe(t,function(e){var t=ae(e);t.requestCount=(t.requestCount||0)+1;e.classList["add"].call(e.classList,Q.config.requestClass)});return t}function sr(e){var t=pe(e,"hx-disabled-elt");if(t==null){t=[]}oe(t,function(e){var t=ae(e);t.requestCount=(t.requestCount||0)+1;e.setAttribute("disabled","")});return t}function lr(e,t){oe(e,function(e){var t=ae(e);t.requestCount=(t.requestCount||0)-1;if(t.requestCount===0){e.classList["remove"].call(e.classList,Q.config.requestClass)}});oe(t,function(e){var t=ae(e);t.requestCount=(t.requestCount||0)-1;if(t.requestCount===0){e.removeAttribute("disabled")}})}function ur(e,t){for(var r=0;r=0}function wr(e,t){var r=t?t:ne(e,"hx-swap");var n={swapStyle:ae(e).boosted?"innerHTML":Q.config.defaultSwapStyle,swapDelay:Q.config.defaultSwapDelay,settleDelay:Q.config.defaultSettleDelay};if(Q.config.scrollIntoViewOnBoost&&ae(e).boosted&&!br(e)){n["show"]="top"}if(r){var i=D(r);if(i.length>0){for(var a=0;a0?l.join(":"):null;n["scroll"]=u;n["scrollTarget"]=f}else if(o.indexOf("show:")===0){var c=o.substr(5);var l=c.split(":");var h=l.pop();var f=l.length>0?l.join(":"):null;n["show"]=h;n["showTarget"]=f}else if(o.indexOf("focus-scroll:")===0){var v=o.substr("focus-scroll:".length);n["focusScroll"]=v=="true"}else if(a==0){n["swapStyle"]=o}else{b("Unknown modifier in hx-swap: "+o)}}}}return n}function Sr(e){return ne(e,"hx-encoding")==="multipart/form-data"||h(e,"form")&&ee(e,"enctype")==="multipart/form-data"}function Er(t,r,n){var i=null;R(r,function(e){if(i==null){i=e.encodeParameters(t,n,r)}});if(i!=null){return i}else{if(Sr(r)){return pr(n)}else{return mr(n)}}}function T(e){return{tasks:[],elts:[e]}}function Cr(e,t){var r=e[0];var n=e[e.length-1];if(t.scroll){var i=null;if(t.scrollTarget){i=ue(r,t.scrollTarget)}if(t.scroll==="top"&&(r||i)){i=i||r;i.scrollTop=0}if(t.scroll==="bottom"&&(n||i)){i=i||n;i.scrollTop=i.scrollHeight}}if(t.show){var i=null;if(t.showTarget){var a=t.showTarget;if(t.showTarget==="window"){a="body"}i=ue(r,a)}if(t.show==="top"&&(r||i)){i=i||r;i.scrollIntoView({block:"start",behavior:Q.config.scrollBehavior})}if(t.show==="bottom"&&(n||i)){i=i||n;i.scrollIntoView({block:"end",behavior:Q.config.scrollBehavior})}}}function Rr(e,t,r,n){if(n==null){n={}}if(e==null){return n}var i=te(e,t);if(i){var a=i.trim();var o=r;if(a==="unset"){return null}if(a.indexOf("javascript:")===0){a=a.substr(11);o=true}else if(a.indexOf("js:")===0){a=a.substr(3);o=true}if(a.indexOf("{")!==0){a="{"+a+"}"}var s;if(o){s=Tr(e,function(){return Function("return ("+a+")")()},{})}else{s=E(a)}for(var l in s){if(s.hasOwnProperty(l)){if(n[l]==null){n[l]=s[l]}}}}return Rr(u(e),t,r,n)}function Tr(e,t,r){if(Q.config.allowEval){return t()}else{fe(e,"htmx:evalDisallowedError");return r}}function Or(e,t){return Rr(e,"hx-vars",true,t)}function qr(e,t){return Rr(e,"hx-vals",false,t)}function Hr(e){return le(Or(e),qr(e))}function Lr(t,r,n){if(n!==null){try{t.setRequestHeader(r,n)}catch(e){t.setRequestHeader(r,encodeURIComponent(n));t.setRequestHeader(r+"-URI-AutoEncoded","true")}}}function Ar(t){if(t.responseURL&&typeof URL!=="undefined"){try{var e=new URL(t.responseURL);return e.pathname+e.search}catch(e){fe(re().body,"htmx:badResponseUrl",{url:t.responseURL})}}}function O(e,t){return t.test(e.getAllResponseHeaders())}function Nr(e,t,r){e=e.toLowerCase();if(r){if(r instanceof Element||I(r,"String")){return he(e,t,null,null,{targetOverride:g(r),returnPromise:true})}else{return he(e,t,g(r.source),r.event,{handler:r.handler,headers:r.headers,values:r.values,targetOverride:g(r.target),swapOverride:r.swap,select:r.select,returnPromise:true})}}else{return he(e,t,null,null,{returnPromise:true})}}function Ir(e){var t=[];while(e){t.push(e);e=e.parentElement}return t}function kr(e,t,r){var n;var i;if(typeof URL==="function"){i=new URL(t,document.location.href);var a=document.location.origin;n=a===i.origin}else{i=t;n=s(t,document.location.origin)}if(Q.config.selfRequestsOnly){if(!n){return false}}return ce(e,"htmx:validateUrl",le({url:i,sameHost:n},r))}function he(t,r,n,i,a,e){var o=null;var s=null;a=a!=null?a:{};if(a.returnPromise&&typeof Promise!=="undefined"){var l=new Promise(function(e,t){o=e;s=t})}if(n==null){n=re().body}var M=a.handler||Mr;var X=a.select||null;if(!se(n)){ie(o);return l}var u=a.targetOverride||ye(n);if(u==null||u==me){fe(n,"htmx:targetError",{target:te(n,"hx-target")});ie(s);return l}var f=ae(n);var c=f.lastButtonClicked;if(c){var h=ee(c,"formaction");if(h!=null){r=h}var v=ee(c,"formmethod");if(v!=null){if(v.toLowerCase()!=="dialog"){t=v}}}var d=ne(n,"hx-confirm");if(e===undefined){var D=function(e){return he(t,r,n,i,a,!!e)};var U={target:u,elt:n,path:r,verb:t,triggeringEvent:i,etc:a,issueRequest:D,question:d};if(ce(n,"htmx:confirm",U)===false){ie(o);return l}}var g=n;var m=ne(n,"hx-sync");var p=null;var x=false;if(m){var B=m.split(":");var F=B[0].trim();if(F==="this"){g=xe(n,"hx-sync")}else{g=ue(n,F)}m=(B[1]||"drop").trim();f=ae(g);if(m==="drop"&&f.xhr&&f.abortable!==true){ie(o);return l}else if(m==="abort"){if(f.xhr){ie(o);return l}else{x=true}}else if(m==="replace"){ce(g,"htmx:abort")}else if(m.indexOf("queue")===0){var V=m.split(" ");p=(V[1]||"last").trim()}}if(f.xhr){if(f.abortable){ce(g,"htmx:abort")}else{if(p==null){if(i){var y=ae(i);if(y&&y.triggerSpec&&y.triggerSpec.queue){p=y.triggerSpec.queue}}if(p==null){p="last"}}if(f.queuedRequests==null){f.queuedRequests=[]}if(p==="first"&&f.queuedRequests.length===0){f.queuedRequests.push(function(){he(t,r,n,i,a)})}else if(p==="all"){f.queuedRequests.push(function(){he(t,r,n,i,a)})}else if(p==="last"){f.queuedRequests=[];f.queuedRequests.push(function(){he(t,r,n,i,a)})}ie(o);return l}}var b=new XMLHttpRequest;f.xhr=b;f.abortable=x;var w=function(){f.xhr=null;f.abortable=false;if(f.queuedRequests!=null&&f.queuedRequests.length>0){var e=f.queuedRequests.shift();e()}};var j=ne(n,"hx-prompt");if(j){var S=prompt(j);if(S===null||!ce(n,"htmx:prompt",{prompt:S,target:u})){ie(o);w();return l}}if(d&&!e){if(!confirm(d)){ie(o);w();return l}}var E=xr(n,u,S);if(t!=="get"&&!Sr(n)){E["Content-Type"]="application/x-www-form-urlencoded"}if(a.headers){E=le(E,a.headers)}var _=dr(n,t);var C=_.errors;var R=_.values;if(a.values){R=le(R,a.values)}var z=Hr(n);var $=le(R,z);var T=yr($,n);if(Q.config.getCacheBusterParam&&t==="get"){T["org.htmx.cache-buster"]=ee(u,"id")||"true"}if(r==null||r===""){r=re().location.href}var O=Rr(n,"hx-request");var W=ae(n).boosted;var q=Q.config.methodsThatUseUrlParams.indexOf(t)>=0;var H={boosted:W,useUrlParams:q,parameters:T,unfilteredParameters:$,headers:E,target:u,verb:t,errors:C,withCredentials:a.credentials||O.credentials||Q.config.withCredentials,timeout:a.timeout||O.timeout||Q.config.timeout,path:r,triggeringEvent:i};if(!ce(n,"htmx:configRequest",H)){ie(o);w();return l}r=H.path;t=H.verb;E=H.headers;T=H.parameters;C=H.errors;q=H.useUrlParams;if(C&&C.length>0){ce(n,"htmx:validation:halted",H);ie(o);w();return l}var G=r.split("#");var J=G[0];var L=G[1];var A=r;if(q){A=J;var Z=Object.keys(T).length!==0;if(Z){if(A.indexOf("?")<0){A+="?"}else{A+="&"}A+=mr(T);if(L){A+="#"+L}}}if(!kr(n,A,H)){fe(n,"htmx:invalidPath",H);ie(s);return l}b.open(t.toUpperCase(),A,true);b.overrideMimeType("text/html");b.withCredentials=H.withCredentials;b.timeout=H.timeout;if(O.noHeaders){}else{for(var N in E){if(E.hasOwnProperty(N)){var K=E[N];Lr(b,N,K)}}}var I={xhr:b,target:u,requestConfig:H,etc:a,boosted:W,select:X,pathInfo:{requestPath:r,finalRequestPath:A,anchor:L}};b.onload=function(){try{var e=Ir(n);I.pathInfo.responsePath=Ar(b);M(n,I);lr(k,P);ce(n,"htmx:afterRequest",I);ce(n,"htmx:afterOnLoad",I);if(!se(n)){var t=null;while(e.length>0&&t==null){var r=e.shift();if(se(r)){t=r}}if(t){ce(t,"htmx:afterRequest",I);ce(t,"htmx:afterOnLoad",I)}}ie(o);w()}catch(e){fe(n,"htmx:onLoadError",le({error:e},I));throw e}};b.onerror=function(){lr(k,P);fe(n,"htmx:afterRequest",I);fe(n,"htmx:sendError",I);ie(s);w()};b.onabort=function(){lr(k,P);fe(n,"htmx:afterRequest",I);fe(n,"htmx:sendAbort",I);ie(s);w()};b.ontimeout=function(){lr(k,P);fe(n,"htmx:afterRequest",I);fe(n,"htmx:timeout",I);ie(s);w()};if(!ce(n,"htmx:beforeRequest",I)){ie(o);w();return l}var k=or(n);var P=sr(n);oe(["loadstart","loadend","progress","abort"],function(t){oe([b,b.upload],function(e){e.addEventListener(t,function(e){ce(n,"htmx:xhr:"+t,{lengthComputable:e.lengthComputable,loaded:e.loaded,total:e.total})})})});ce(n,"htmx:beforeSend",I);var Y=q?null:Er(b,n,T);b.send(Y);return l}function Pr(e,t){var r=t.xhr;var n=null;var i=null;if(O(r,/HX-Push:/i)){n=r.getResponseHeader("HX-Push");i="push"}else if(O(r,/HX-Push-Url:/i)){n=r.getResponseHeader("HX-Push-Url");i="push"}else if(O(r,/HX-Replace-Url:/i)){n=r.getResponseHeader("HX-Replace-Url");i="replace"}if(n){if(n==="false"){return{}}else{return{type:i,path:n}}}var a=t.pathInfo.finalRequestPath;var o=t.pathInfo.responsePath;var s=ne(e,"hx-push-url");var l=ne(e,"hx-replace-url");var u=ae(e).boosted;var f=null;var c=null;if(s){f="push";c=s}else if(l){f="replace";c=l}else if(u){f="push";c=o||a}if(c){if(c==="false"){return{}}if(c==="true"){c=o||a}if(t.pathInfo.anchor&&c.indexOf("#")===-1){c=c+"#"+t.pathInfo.anchor}return{type:f,path:c}}else{return{}}}function Mr(l,u){var f=u.xhr;var c=u.target;var e=u.etc;var t=u.requestConfig;var h=u.select;if(!ce(l,"htmx:beforeOnLoad",u))return;if(O(f,/HX-Trigger:/i)){_e(f,"HX-Trigger",l)}if(O(f,/HX-Location:/i)){er();var r=f.getResponseHeader("HX-Location");var v;if(r.indexOf("{")===0){v=E(r);r=v["path"];delete v["path"]}Nr("GET",r,v).then(function(){tr(r)});return}var n=O(f,/HX-Refresh:/i)&&"true"===f.getResponseHeader("HX-Refresh");if(O(f,/HX-Redirect:/i)){location.href=f.getResponseHeader("HX-Redirect");n&&location.reload();return}if(n){location.reload();return}if(O(f,/HX-Retarget:/i)){if(f.getResponseHeader("HX-Retarget")==="this"){u.target=l}else{u.target=ue(l,f.getResponseHeader("HX-Retarget"))}}var d=Pr(l,u);var i=f.status>=200&&f.status<400&&f.status!==204;var g=f.response;var a=f.status>=400;var m=Q.config.ignoreTitle;var o=le({shouldSwap:i,serverResponse:g,isError:a,ignoreTitle:m},u);if(!ce(c,"htmx:beforeSwap",o))return;c=o.target;g=o.serverResponse;a=o.isError;m=o.ignoreTitle;u.target=c;u.failed=a;u.successful=!a;if(o.shouldSwap){if(f.status===286){at(l)}R(l,function(e){g=e.transformResponse(g,f,l)});if(d.type){er()}var s=e.swapOverride;if(O(f,/HX-Reswap:/i)){s=f.getResponseHeader("HX-Reswap")}var v=wr(l,s);if(v.hasOwnProperty("ignoreTitle")){m=v.ignoreTitle}c.classList.add(Q.config.swappingClass);var p=null;var x=null;var y=function(){try{var e=document.activeElement;var t={};try{t={elt:e,start:e?e.selectionStart:null,end:e?e.selectionEnd:null}}catch(e){}var r;if(h){r=h}if(O(f,/HX-Reselect:/i)){r=f.getResponseHeader("HX-Reselect")}if(d.type){ce(re().body,"htmx:beforeHistoryUpdate",le({history:d},u));if(d.type==="push"){tr(d.path);ce(re().body,"htmx:pushedIntoHistory",{path:d.path})}else{rr(d.path);ce(re().body,"htmx:replacedInHistory",{path:d.path})}}var n=T(c);je(v.swapStyle,c,l,g,n,r);if(t.elt&&!se(t.elt)&&ee(t.elt,"id")){var i=document.getElementById(ee(t.elt,"id"));var a={preventScroll:v.focusScroll!==undefined?!v.focusScroll:!Q.config.defaultFocusScroll};if(i){if(t.start&&i.setSelectionRange){try{i.setSelectionRange(t.start,t.end)}catch(e){}}i.focus(a)}}c.classList.remove(Q.config.swappingClass);oe(n.elts,function(e){if(e.classList){e.classList.add(Q.config.settlingClass)}ce(e,"htmx:afterSwap",u)});if(O(f,/HX-Trigger-After-Swap:/i)){var o=l;if(!se(l)){o=re().body}_e(f,"HX-Trigger-After-Swap",o)}var s=function(){oe(n.tasks,function(e){e.call()});oe(n.elts,function(e){if(e.classList){e.classList.remove(Q.config.settlingClass)}ce(e,"htmx:afterSettle",u)});if(u.pathInfo.anchor){var e=re().getElementById(u.pathInfo.anchor);if(e){e.scrollIntoView({block:"start",behavior:"auto"})}}if(n.title&&!m){var t=C("title");if(t){t.innerHTML=n.title}else{window.document.title=n.title}}Cr(n.elts,v);if(O(f,/HX-Trigger-After-Settle:/i)){var r=l;if(!se(l)){r=re().body}_e(f,"HX-Trigger-After-Settle",r)}ie(p)};if(v.settleDelay>0){setTimeout(s,v.settleDelay)}else{s()}}catch(e){fe(l,"htmx:swapError",u);ie(x);throw e}};var b=Q.config.globalViewTransitions;if(v.hasOwnProperty("transition")){b=v.transition}if(b&&ce(l,"htmx:beforeTransition",u)&&typeof Promise!=="undefined"&&document.startViewTransition){var w=new Promise(function(e,t){p=e;x=t});var S=y;y=function(){document.startViewTransition(function(){S();return w})}}if(v.swapDelay>0){setTimeout(y,v.swapDelay)}else{y()}}if(a){fe(l,"htmx:responseError",le({error:"Response Status Error Code "+f.status+" from "+u.pathInfo.requestPath},u))}}var Xr={};function Dr(){return{init:function(e){return null},onEvent:function(e,t){return true},transformResponse:function(e,t,r){return e},isInlineSwap:function(e){return false},handleSwap:function(e,t,r,n){return false},encodeParameters:function(e,t,r){return null}}}function Ur(e,t){if(t.init){t.init(r)}Xr[e]=le(Dr(),t)}function Br(e){delete Xr[e]}function Fr(e,r,n){if(e==undefined){return r}if(r==undefined){r=[]}if(n==undefined){n=[]}var t=te(e,"hx-ext");if(t){oe(t.split(","),function(e){e=e.replace(/ /g,"");if(e.slice(0,7)=="ignore:"){n.push(e.slice(7));return}if(n.indexOf(e)<0){var t=Xr[e];if(t&&r.indexOf(t)<0){r.push(t)}}})}return Fr(u(e),r,n)}var Vr=false;re().addEventListener("DOMContentLoaded",function(){Vr=true});function jr(e){if(Vr||re().readyState==="complete"){e()}else{re().addEventListener("DOMContentLoaded",e)}}function _r(){if(Q.config.includeIndicatorStyles!==false){re().head.insertAdjacentHTML("beforeend","")}}function zr(){var e=re().querySelector('meta[name="htmx-config"]');if(e){return E(e.content)}else{return null}}function $r(){var e=zr();if(e){Q.config=le(Q.config,e)}}jr(function(){$r();_r();var e=re().body;zt(e);var t=re().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(e){var t=e.target;var r=ae(t);if(r&&r.xhr){r.xhr.abort()}});const r=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(e){if(e.state&&e.state.htmx){ar();oe(t,function(e){ce(e,"htmx:restored",{document:re(),triggerEvent:ce})})}else{if(r){r(e)}}};setTimeout(function(){ce(e,"htmx:load",{});e=null},0)});return Q}()}); -------------------------------------------------------------------------------- /public/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/academind/react-jsx-template-engine/769f249b1ade525927cfadd6bcb6f5e0210a0cf3/public/logo.png -------------------------------------------------------------------------------- /public/main.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Inter:ital,wght@0,300;0,400;0,700;0,900;1,300;1,400;1,700;1,900&display=swap'); 2 | 3 | * { 4 | box-sizing: border-box; 5 | } 6 | 7 | html { 8 | font-family: 'Inter', serif; 9 | } 10 | 11 | body { 12 | margin: 0; 13 | background: linear-gradient(#231e21, #191416); 14 | color: #eee7ea; 15 | min-height: 100vh; 16 | } 17 | 18 | ul { 19 | list-style: none; 20 | padding: 0; 21 | margin: 0; 22 | } 23 | 24 | header { 25 | display: flex; 26 | gap: 1.5rem; 27 | align-items: center; 28 | max-width: 50rem; 29 | margin: 2rem auto; 30 | } 31 | 32 | header img { 33 | padding: 0.75rem; 34 | border-radius: 50%; 35 | background-color: rgb(206, 205, 205); 36 | width: 5rem; 37 | height: 5rem; 38 | object-fit: cover; 39 | } 40 | 41 | main { 42 | max-width: 50rem; 43 | margin: 3rem auto; 44 | padding: 2rem; 45 | border-radius: 6px; 46 | background-color: #7a7481; 47 | color: #191416; 48 | min-height: 85vh; 49 | box-shadow: 0 0 6px rgba(0, 0, 0, 0.5); 50 | } 51 | 52 | form { 53 | display: flex; 54 | gap: 1rem; 55 | align-items: flex-end; 56 | } 57 | 58 | form label { 59 | display: block; 60 | font-weight: bold; 61 | color: #e8e6ec; 62 | font-size: 0.9rem; 63 | margin-right: 0.25rem; 64 | margin-bottom: 0.25rem; 65 | } 66 | 67 | form input { 68 | font: inherit; 69 | border: none; 70 | background-color: #f4f2f7; 71 | color: #151416; 72 | padding: 0.5rem 0.25rem; 73 | width: 20rem; 74 | border-radius: 4px; 75 | } 76 | 77 | form button { 78 | font: inherit; 79 | padding: 0.5rem 1rem; 80 | border: none; 81 | background-color: #35056b; 82 | color: white; 83 | border-radius: 2px; 84 | } 85 | 86 | form button:hover, 87 | form button:active { 88 | background-color: #4c0899; 89 | } 90 | 91 | #goals { 92 | margin: 2rem 0; 93 | } 94 | 95 | #goals li { 96 | display: flex; 97 | justify-content: space-between; 98 | align-items: center; 99 | padding: 0.5rem 1rem; 100 | margin: 0.5rem 0; 101 | background-color: #272529; 102 | color: #e8e4ed; 103 | border-radius: 6px; 104 | box-shadow: 0 0 6px rgba(0, 0, 0, 0.3); 105 | } 106 | 107 | #goals li span { 108 | font-weight: bold; 109 | } 110 | 111 | #goals li button { 112 | font: inherit; 113 | padding: 0.5rem 1rem; 114 | border: none; 115 | background-color: #f667af; 116 | color: #141213; 117 | border-radius: 4px; 118 | } 119 | 120 | #goals li button:hover, 121 | #goals li button:active { 122 | background-color: #f6459d; 123 | } 124 | -------------------------------------------------------------------------------- /register.js: -------------------------------------------------------------------------------- 1 | import { register } from 'node:module'; 2 | import { pathToFileURL } from 'node:url'; 3 | 4 | register('@node-loader/babel', pathToFileURL('./')); 5 | -------------------------------------------------------------------------------- /views/components/goal-form.js: -------------------------------------------------------------------------------- 1 | export default function GoalForm() { 2 | return ( 3 |
8 |
9 | 10 | 11 |
12 | 13 |
14 | ); 15 | } 16 | -------------------------------------------------------------------------------- /views/components/goals.js: -------------------------------------------------------------------------------- 1 | import { useContext } from 'react'; 2 | 3 | import { ViewDataContext } from '../../lib/react-engine.js'; 4 | 5 | export default function Goals() { 6 | const ctx = useContext(ViewDataContext); 7 | console.log(ctx); 8 | return ( 9 |
    10 | {ctx.goals.map((goal) => ( 11 |
  • {goal}
  • 12 | ))} 13 |
14 | ); 15 | } 16 | -------------------------------------------------------------------------------- /views/components/header.js: -------------------------------------------------------------------------------- 1 | export default function Header() { 2 | return ( 3 |
4 | Todo list and pen on top of it 5 |

Manage your course goals

6 |
7 | ); 8 | } 9 | -------------------------------------------------------------------------------- /views/components/layout.js: -------------------------------------------------------------------------------- 1 | import Header from './header.js'; 2 | 3 | export default function Layout({ children, title = 'React Template Engine' }) { 4 | return ( 5 | 6 | 7 | 8 | 9 | {title} 10 | 11 | 12 | 13 | 14 |
15 |
{children}
16 | 17 | 18 | ); 19 | } 20 | -------------------------------------------------------------------------------- /views/goals.js: -------------------------------------------------------------------------------- 1 | import GoalForm from './components/goal-form.js'; 2 | import Goals from './components/goals.js'; 3 | import Layout from './components/layout.js'; 4 | 5 | export default function GoalsPage() { 6 | return ( 7 | 8 |
9 | 10 |
11 |
12 | 13 |
14 |
15 | ); 16 | } 17 | --------------------------------------------------------------------------------