From 7ab62b8d138cf5f9101a9c89f0dd39e623dbe0e4 Mon Sep 17 00:00:00 2001 From: "theis.gaedigk" Date: Mon, 21 Jul 2025 20:42:11 +0200 Subject: [PATCH] Add circle-user-solid.svg icon from Font Awesome --- .gitignore | 3 +- client/src/layout/header.tsx => README.md | 0 backend/server.js | 6 +- client/index.html | 4 +- client/other/App.tsx | 30 + client/other/components/Header.tsx | 29 + client/other/components/LoginCard.tsx | 72 ++ client/package-lock.json | 1228 +++++++++++++++++++-- client/package.json | 9 +- client/public/vite.svg | 1 - client/src/App.css | 2 + client/src/assets/bicycle-solid.svg | 1 + client/src/assets/bikelane-icon.png | Bin 0 -> 25915 bytes client/src/assets/bikelane-icon.psd | Bin 0 -> 119985 bytes client/src/assets/circle-user-solid.svg | 1 + client/src/assets/react.svg | 1 - client/src/index.css | 2 + client/src/main.tsx | 14 +- client/tsconfig.app.json | 2 +- client/vite.config.ts | 5 +- docker-compose.yml | 10 +- node_modules/.package-lock.json | 38 - node_modules/cors/CONTRIBUTING.md | 33 - node_modules/cors/HISTORY.md | 58 - node_modules/cors/LICENSE | 22 - node_modules/cors/README.md | 243 ---- node_modules/cors/lib/index.js | 238 ---- node_modules/cors/package.json | 41 - node_modules/object-assign/index.js | 90 -- node_modules/object-assign/license | 21 - node_modules/object-assign/package.json | 42 - node_modules/object-assign/readme.md | 61 - node_modules/vary/HISTORY.md | 39 - node_modules/vary/LICENSE | 22 - node_modules/vary/README.md | 101 -- node_modules/vary/index.js | 149 --- node_modules/vary/package.json | 43 - 37 files changed, 1327 insertions(+), 1334 deletions(-) rename client/src/layout/header.tsx => README.md (100%) create mode 100644 client/other/App.tsx create mode 100644 client/other/components/Header.tsx create mode 100644 client/other/components/LoginCard.tsx delete mode 100644 client/public/vite.svg create mode 100644 client/src/assets/bicycle-solid.svg create mode 100644 client/src/assets/bikelane-icon.png create mode 100644 client/src/assets/bikelane-icon.psd create mode 100644 client/src/assets/circle-user-solid.svg delete mode 100644 client/src/assets/react.svg delete mode 100644 node_modules/.package-lock.json delete mode 100644 node_modules/cors/CONTRIBUTING.md delete mode 100644 node_modules/cors/HISTORY.md delete mode 100644 node_modules/cors/LICENSE delete mode 100644 node_modules/cors/README.md delete mode 100644 node_modules/cors/lib/index.js delete mode 100644 node_modules/cors/package.json delete mode 100644 node_modules/object-assign/index.js delete mode 100644 node_modules/object-assign/license delete mode 100644 node_modules/object-assign/package.json delete mode 100644 node_modules/object-assign/readme.md delete mode 100644 node_modules/vary/HISTORY.md delete mode 100644 node_modules/vary/LICENSE delete mode 100644 node_modules/vary/README.md delete mode 100644 node_modules/vary/index.js delete mode 100644 node_modules/vary/package.json diff --git a/.gitignore b/.gitignore index faa4023..b7f1eab 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .DS_Store -backend/node_modules/ \ No newline at end of file +backend/node_modules/ +client/node_modules/ \ No newline at end of file diff --git a/client/src/layout/header.tsx b/README.md similarity index 100% rename from client/src/layout/header.tsx rename to README.md diff --git a/backend/server.js b/backend/server.js index ad39d45..63dae8e 100644 --- a/backend/server.js +++ b/backend/server.js @@ -18,10 +18,6 @@ app.use(express.json()); app.use(cors()); -app.get("/", (req, res) => { - res.render("index.ejs"); -}); - app.post("/api/login", async (req, res) => { console.log(req.body); @@ -42,5 +38,5 @@ app.post("/api/login", async (req, res) => { }); app.listen(port, () => { - console.log(`Server is running at http://localhost:${port}`); + console.log(`Express backend server is running at http://localhost:${port}`); }); diff --git a/client/index.html b/client/index.html index e4b78ea..a6c12cc 100644 --- a/client/index.html +++ b/client/index.html @@ -2,9 +2,9 @@ - + - Vite + React + TS + Bikelane - Web
diff --git a/client/other/App.tsx b/client/other/App.tsx new file mode 100644 index 0000000..d1d4475 --- /dev/null +++ b/client/other/App.tsx @@ -0,0 +1,30 @@ +import React, { useState } from "react"; +import Header from "./components/Header"; +import LoginCard from "./components/LoginCard"; + +function App() { + const [showLogin, setShowLogin] = useState(false); + + const handleLoginClick = () => setShowLogin(true); + const handleCloseLogin = () => setShowLogin(false); + + const handleLoginSubmit = (username: string, password: string) => { + // Hier kannst du fetch einbauen + alert(`Login: ${username} / ${password}`); + setShowLogin(false); + }; + + return ( +
+
+
+ {/* Hier kommt später der Seiteninhalt */} + {showLogin && ( + + )} +
+
+ ); +} + +export default App; diff --git a/client/other/components/Header.tsx b/client/other/components/Header.tsx new file mode 100644 index 0000000..fa0fbb4 --- /dev/null +++ b/client/other/components/Header.tsx @@ -0,0 +1,29 @@ +import React from "react"; +import bike from "../../src/assets/bicycle-solid.svg"; +import user from "../../src/assets/circle-user-solid.svg"; + +type HeaderProps = { + onLoginClick: () => void; +}; + +const Header: React.FC = ({ onLoginClick }) => ( +
+
+ Bike Logo + + Bikelane Web + +
+
+ User Icon + +
+
+); + +export default Header; \ No newline at end of file diff --git a/client/other/components/LoginCard.tsx b/client/other/components/LoginCard.tsx new file mode 100644 index 0000000..a59bf63 --- /dev/null +++ b/client/other/components/LoginCard.tsx @@ -0,0 +1,72 @@ +import React, { useRef, useEffect } from "react"; + +type LoginCardProps = { + onClose: () => void; + onSubmit: (username: string, password: string) => void; +}; + +const LoginCard: React.FC = ({ onClose, onSubmit }) => { + const [username, setUsername] = React.useState(""); + const [password, setPassword] = React.useState(""); + const cardRef = useRef(null); + + useEffect(() => { + const handler = (e: MouseEvent) => { + if (cardRef.current && !cardRef.current.contains(e.target as Node)) { + onClose(); + } + }; + document.addEventListener("mousedown", handler); + return () => document.removeEventListener("mousedown", handler); + }, [onClose]); + + return ( +
+
+
+ Login +
+
{ + e.preventDefault(); + onSubmit(username, password); + }} + > + + + +
+
+
+ ); +}; + +export default LoginCard; diff --git a/client/package-lock.json b/client/package-lock.json index 5303557..1b7687b 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -8,6 +8,7 @@ "name": "client", "version": "0.0.0", "dependencies": { + "@tailwindcss/vite": "^4.1.11", "react": "^19.1.0", "react-dom": "^19.1.0" }, @@ -16,20 +17,23 @@ "@types/react": "^19.1.8", "@types/react-dom": "^19.1.6", "@vitejs/plugin-react": "^4.6.0", + "autoprefixer": "^10.4.21", "eslint": "^9.30.1", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.20", "globals": "^16.3.0", + "postcss": "^8.5.6", + "tailwindcss": "^4.1.11", "typescript": "~5.8.3", "typescript-eslint": "^8.35.1", - "vite": "^7.0.4" + "vite": "^7.0.4", + "vite-plugin-svgr": "^4.3.0" } }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -328,7 +332,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -345,7 +348,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -362,7 +364,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -379,7 +380,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -396,7 +396,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -413,7 +412,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -430,7 +428,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -447,7 +444,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -464,7 +460,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -481,7 +476,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -498,7 +492,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -515,7 +508,6 @@ "cpu": [ "loong64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -532,7 +524,6 @@ "cpu": [ "mips64el" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -549,7 +540,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -566,7 +556,6 @@ "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -583,7 +572,6 @@ "cpu": [ "s390x" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -600,7 +588,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -617,7 +604,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -634,7 +620,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -651,7 +636,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -668,7 +652,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -685,7 +668,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -702,7 +684,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -719,7 +700,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -736,7 +716,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -753,7 +732,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -983,11 +961,22 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.12", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", @@ -998,7 +987,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -1008,14 +996,12 @@ "version": "1.5.4", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", - "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.29", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -1067,6 +1053,42 @@ "dev": true, "license": "MIT" }, + "node_modules/@rollup/pluginutils": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.2.0.tgz", + "integrity": "sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.45.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.1.tgz", @@ -1074,7 +1096,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1088,7 +1109,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1102,7 +1122,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1116,7 +1135,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1130,7 +1148,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1144,7 +1161,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1158,7 +1174,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1172,7 +1187,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1186,7 +1200,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1200,7 +1213,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1214,7 +1226,6 @@ "cpu": [ "loong64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1228,7 +1239,6 @@ "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1242,7 +1252,6 @@ "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1256,7 +1265,6 @@ "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1270,7 +1278,6 @@ "cpu": [ "s390x" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1284,7 +1291,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1298,7 +1304,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1312,7 +1317,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1326,7 +1330,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1340,13 +1343,499 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ] }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.11.tgz", + "integrity": "sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "lightningcss": "1.30.1", + "magic-string": "^0.30.17", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.11" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.11.tgz", + "integrity": "sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.4", + "tar": "^7.4.3" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.11", + "@tailwindcss/oxide-darwin-arm64": "4.1.11", + "@tailwindcss/oxide-darwin-x64": "4.1.11", + "@tailwindcss/oxide-freebsd-x64": "4.1.11", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.11", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.11", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.11", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.11", + "@tailwindcss/oxide-linux-x64-musl": "4.1.11", + "@tailwindcss/oxide-wasm32-wasi": "4.1.11", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.11", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.11" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.11.tgz", + "integrity": "sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.11.tgz", + "integrity": "sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.11.tgz", + "integrity": "sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.11.tgz", + "integrity": "sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.11.tgz", + "integrity": "sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.11.tgz", + "integrity": "sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.11.tgz", + "integrity": "sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.11.tgz", + "integrity": "sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.11.tgz", + "integrity": "sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.11.tgz", + "integrity": "sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@emnapi/wasi-threads": "^1.0.2", + "@napi-rs/wasm-runtime": "^0.2.11", + "@tybys/wasm-util": "^0.9.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.11.tgz", + "integrity": "sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.11.tgz", + "integrity": "sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.11.tgz", + "integrity": "sha512-RHYhrR3hku0MJFRV+fN2gNbDNEh3dwKvY8XJvTxCSXeMOsCRSr+uKvDWQcbizrHgjML6ZmTE5OwMrl5wKcujCw==", + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.1.11", + "@tailwindcss/oxide": "4.1.11", + "tailwindcss": "4.1.11" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7" + } + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -1396,7 +1885,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, "license": "MIT" }, "node_modules/@types/json-schema": { @@ -1781,6 +2269,44 @@ "dev": true, "license": "Python-2.0" }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1855,6 +2381,19 @@ "node": ">=6" } }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001727", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz", @@ -1893,6 +2432,15 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1927,6 +2475,33 @@ "dev": true, "license": "MIT" }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -1974,6 +2549,26 @@ "dev": true, "license": "MIT" }, + "node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/electron-to-chromium": { "version": "1.5.187", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.187.tgz", @@ -1981,11 +2576,46 @@ "dev": true, "license": "ISC" }, + "node_modules/enhanced-resolve": { + "version": "5.18.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", + "integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/esbuild": { "version": "0.25.8", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.8.tgz", "integrity": "sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==", - "dev": true, "hasInstallScript": true, "license": "MIT", "bin": { @@ -2214,6 +2844,13 @@ "node": ">=4.0" } }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -2349,11 +2986,24 @@ "dev": true, "license": "ISC" }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -2400,6 +3050,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -2454,6 +3110,13 @@ "node": ">=0.8.19" } }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2494,6 +3157,15 @@ "dev": true, "license": "ISC" }, + "node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -2534,6 +3206,13 @@ "dev": true, "license": "MIT" }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -2585,6 +3264,241 @@ "node": ">= 0.8.0" } }, + "node_modules/lightningcss": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -2608,6 +3522,16 @@ "dev": true, "license": "MIT" }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -2618,6 +3542,15 @@ "yallist": "^3.0.2" } }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -2655,6 +3588,42 @@ "node": "*" } }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -2666,7 +3635,6 @@ "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, "funding": [ { "type": "github", @@ -2688,6 +3656,17 @@ "dev": true, "license": "MIT" }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, "node_modules/node-releases": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", @@ -2695,6 +3674,16 @@ "dev": true, "license": "MIT" }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -2758,6 +3747,25 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -2778,11 +3786,20 @@ "node": ">=8" } }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, "license": "ISC" }, "node_modules/picomatch": { @@ -2802,7 +3819,6 @@ "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, "funding": [ { "type": "opencollective", @@ -2827,6 +3843,13 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -2924,7 +3947,6 @@ "version": "4.45.1", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.45.1.tgz", "integrity": "sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==", - "dev": true, "license": "MIT", "dependencies": { "@types/estree": "1.0.8" @@ -3023,11 +4045,21 @@ "node": ">=8" } }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -3059,11 +4091,58 @@ "node": ">=8" } }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/tailwindcss": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.11.tgz", + "integrity": "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", + "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/tinyglobby": { "version": "0.2.14", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", - "dev": true, "license": "MIT", "dependencies": { "fdir": "^6.4.4", @@ -3080,7 +4159,6 @@ "version": "6.4.6", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", - "dev": true, "license": "MIT", "peerDependencies": { "picomatch": "^3 || ^4" @@ -3095,7 +4173,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -3130,6 +4207,13 @@ "typescript": ">=4.8.4" } }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "devOptional": true, + "license": "0BSD" + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -3226,7 +4310,6 @@ "version": "7.0.5", "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.5.tgz", "integrity": "sha512-1mncVwJxy2C9ThLwz0+2GKZyEXuC3MyWtAAlNftlZZXZDP3AJt5FmwcMit/IGGaNZ8ZOB2BNO/HFUB+CpN0NQw==", - "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.25.0", @@ -3297,11 +4380,25 @@ } } }, + "node_modules/vite-plugin-svgr": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/vite-plugin-svgr/-/vite-plugin-svgr-4.3.0.tgz", + "integrity": "sha512-Jy9qLB2/PyWklpYy0xk0UU3TlU0t2UMpJXZvf+hWII1lAmRHrOUKi11Uw8N3rxoNk7atZNYO3pR3vI1f7oi+6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.3", + "@svgr/core": "^8.1.0", + "@svgr/plugin-jsx": "^8.1.0" + }, + "peerDependencies": { + "vite": ">=2.6.0" + } + }, "node_modules/vite/node_modules/fdir": { "version": "6.4.6", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", - "dev": true, "license": "MIT", "peerDependencies": { "picomatch": "^3 || ^4" @@ -3316,7 +4413,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=12" diff --git a/client/package.json b/client/package.json index ff6505e..4998bc8 100644 --- a/client/package.json +++ b/client/package.json @@ -11,6 +11,7 @@ "preview": "vite preview" }, "dependencies": { + "@tailwindcss/vite": "^4.1.11", "react": "^19.1.0", "react-dom": "^19.1.0" }, @@ -19,12 +20,16 @@ "@types/react": "^19.1.8", "@types/react-dom": "^19.1.6", "@vitejs/plugin-react": "^4.6.0", + "autoprefixer": "^10.4.21", "eslint": "^9.30.1", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.20", "globals": "^16.3.0", + "postcss": "^8.5.6", + "tailwindcss": "^4.1.11", "typescript": "~5.8.3", "typescript-eslint": "^8.35.1", - "vite": "^7.0.4" + "vite": "^7.0.4", + "vite-plugin-svgr": "^4.3.0" } -} \ No newline at end of file +} diff --git a/client/public/vite.svg b/client/public/vite.svg deleted file mode 100644 index e7b8dfb..0000000 --- a/client/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/client/src/App.css b/client/src/App.css index b9d355d..b00042a 100644 --- a/client/src/App.css +++ b/client/src/App.css @@ -1,3 +1,5 @@ +@import "tailwindcss"; + #root { max-width: 1280px; margin: 0 auto; diff --git a/client/src/assets/bicycle-solid.svg b/client/src/assets/bicycle-solid.svg new file mode 100644 index 0000000..3cb81ae --- /dev/null +++ b/client/src/assets/bicycle-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/src/assets/bikelane-icon.png b/client/src/assets/bikelane-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b8416bd587fc119969c357e31581969a30a30624 GIT binary patch literal 25915 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 literal 0 HcmV?d00001 diff --git a/client/src/assets/bikelane-icon.psd b/client/src/assets/bikelane-icon.psd new file mode 100644 index 0000000000000000000000000000000000000000..7ac0944305ac9a9feed4f14fa84229d2bab5324c GIT binary patch literal 119985 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 Pw9;+xp!e#(@6Z1Ne+|(p literal 0 HcmV?d00001 diff --git a/client/src/assets/circle-user-solid.svg b/client/src/assets/circle-user-solid.svg new file mode 100644 index 0000000..0774f1c --- /dev/null +++ b/client/src/assets/circle-user-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/src/assets/react.svg b/client/src/assets/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/client/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/client/src/index.css b/client/src/index.css index 08a3ac9..444f889 100644 --- a/client/src/index.css +++ b/client/src/index.css @@ -1,3 +1,5 @@ +@import "tailwindcss"; + :root { font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; line-height: 1.5; diff --git a/client/src/main.tsx b/client/src/main.tsx index bef5202..12eb902 100644 --- a/client/src/main.tsx +++ b/client/src/main.tsx @@ -1,10 +1,10 @@ -import { StrictMode } from 'react' -import { createRoot } from 'react-dom/client' -import './index.css' -import App from './App.tsx' +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; +import "./index.css"; +import App from "../other/App.tsx"; -createRoot(document.getElementById('root')!).render( +createRoot(document.getElementById("root")!).render( - , -) + +); diff --git a/client/tsconfig.app.json b/client/tsconfig.app.json index 227a6c6..aee3cb4 100644 --- a/client/tsconfig.app.json +++ b/client/tsconfig.app.json @@ -23,5 +23,5 @@ "noFallthroughCasesInSwitch": true, "noUncheckedSideEffectImports": true }, - "include": ["src"] + "include": ["src", "other/components", "other/App.tsx"] } diff --git a/client/vite.config.ts b/client/vite.config.ts index a4a8961..7145de2 100644 --- a/client/vite.config.ts +++ b/client/vite.config.ts @@ -1,9 +1,10 @@ import { defineConfig } from "vite"; import react from "@vitejs/plugin-react"; +import svgr from "vite-plugin-svgr"; +import tailwindcss from "@tailwindcss/vite"; -// https://vite.dev/config/ export default defineConfig({ - plugins: [react()], + plugins: [react(), svgr(), tailwindcss()], server: { host: "0.0.0.0", port: 5001, diff --git a/docker-compose.yml b/docker-compose.yml index c73d8e1..ccdecfa 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,6 @@ services: - client: - container_name: react-client + react-frontend: + container_name: bikelane-frontend_react build: ./client ports: - "5001:5001" @@ -12,7 +12,7 @@ services: restart: unless-stopped bikelane-backend: - container_name: bikelane-backend + container_name: bikelane-backend_express build: ./backend ports: - "5002:5002" @@ -28,7 +28,7 @@ services: restart: unless-stopped mysql: - container_name: mysql-db + container_name: bikelane-mysql image: mysql:8.0 restart: unless-stopped environment: @@ -37,7 +37,7 @@ services: volumes: - mysql-data:/var/lib/mysql ports: - - "3306:3306" + - "3307:3306" volumes: mysql-data: diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json deleted file mode 100644 index e85b9c2..0000000 --- a/node_modules/.package-lock.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "bikelane", - "lockfileVersion": 3, - "requires": true, - "packages": { - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - } - } -} diff --git a/node_modules/cors/CONTRIBUTING.md b/node_modules/cors/CONTRIBUTING.md deleted file mode 100644 index 591b09a..0000000 --- a/node_modules/cors/CONTRIBUTING.md +++ /dev/null @@ -1,33 +0,0 @@ -# contributing to `cors` - -CORS is a node.js package for providing a [connect](http://www.senchalabs.org/connect/)/[express](http://expressjs.com/) middleware that can be used to enable [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing) with various options. Learn more about the project in [the README](README.md). - -## The CORS Spec - -[http://www.w3.org/TR/cors/](http://www.w3.org/TR/cors/) - -## Pull Requests Welcome - -* Include `'use strict';` in every javascript file. -* 2 space indentation. -* Please run the testing steps below before submitting. - -## Testing - -```bash -$ npm install -$ npm test -``` - -## Interactive Testing Harness - -[http://node-cors-client.herokuapp.com](http://node-cors-client.herokuapp.com) - -Related git repositories: - -* [https://github.com/TroyGoode/node-cors-server](https://github.com/TroyGoode/node-cors-server) -* [https://github.com/TroyGoode/node-cors-client](https://github.com/TroyGoode/node-cors-client) - -## License - -[MIT License](http://www.opensource.org/licenses/mit-license.php) diff --git a/node_modules/cors/HISTORY.md b/node_modules/cors/HISTORY.md deleted file mode 100644 index 5762bce..0000000 --- a/node_modules/cors/HISTORY.md +++ /dev/null @@ -1,58 +0,0 @@ -2.8.5 / 2018-11-04 -================== - - * Fix setting `maxAge` option to `0` - -2.8.4 / 2017-07-12 -================== - - * Work-around Safari bug in default pre-flight response - -2.8.3 / 2017-03-29 -================== - - * Fix error when options delegate missing `methods` option - -2.8.2 / 2017-03-28 -================== - - * Fix error when frozen options are passed - * Send "Vary: Origin" when using regular expressions - * Send "Vary: Access-Control-Request-Headers" when dynamic `allowedHeaders` - -2.8.1 / 2016-09-08 -================== - -This release only changed documentation. - -2.8.0 / 2016-08-23 -================== - - * Add `optionsSuccessStatus` option - -2.7.2 / 2016-08-23 -================== - - * Fix error when Node.js running in strict mode - -2.7.1 / 2015-05-28 -================== - - * Move module into expressjs organization - -2.7.0 / 2015-05-28 -================== - - * Allow array of matching condition as `origin` option - * Allow regular expression as `origin` option - -2.6.1 / 2015-05-28 -================== - - * Update `license` in package.json - -2.6.0 / 2015-04-27 -================== - - * Add `preflightContinue` option - * Fix "Vary: Origin" header added for "*" diff --git a/node_modules/cors/LICENSE b/node_modules/cors/LICENSE deleted file mode 100644 index fd10c84..0000000 --- a/node_modules/cors/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2013 Troy Goode - -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: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -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. diff --git a/node_modules/cors/README.md b/node_modules/cors/README.md deleted file mode 100644 index 732b847..0000000 --- a/node_modules/cors/README.md +++ /dev/null @@ -1,243 +0,0 @@ -# cors - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -CORS is a node.js package for providing a [Connect](http://www.senchalabs.org/connect/)/[Express](http://expressjs.com/) middleware that can be used to enable [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing) with various options. - -**[Follow me (@troygoode) on Twitter!](https://twitter.com/intent/user?screen_name=troygoode)** - -* [Installation](#installation) -* [Usage](#usage) - * [Simple Usage](#simple-usage-enable-all-cors-requests) - * [Enable CORS for a Single Route](#enable-cors-for-a-single-route) - * [Configuring CORS](#configuring-cors) - * [Configuring CORS Asynchronously](#configuring-cors-asynchronously) - * [Enabling CORS Pre-Flight](#enabling-cors-pre-flight) -* [Configuration Options](#configuration-options) -* [Demo](#demo) -* [License](#license) -* [Author](#author) - -## Installation - -This is a [Node.js](https://nodejs.org/en/) module available through the -[npm registry](https://www.npmjs.com/). Installation is done using the -[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): - -```sh -$ npm install cors -``` - -## Usage - -### Simple Usage (Enable *All* CORS Requests) - -```javascript -var express = require('express') -var cors = require('cors') -var app = express() - -app.use(cors()) - -app.get('/products/:id', function (req, res, next) { - res.json({msg: 'This is CORS-enabled for all origins!'}) -}) - -app.listen(80, function () { - console.log('CORS-enabled web server listening on port 80') -}) -``` - -### Enable CORS for a Single Route - -```javascript -var express = require('express') -var cors = require('cors') -var app = express() - -app.get('/products/:id', cors(), function (req, res, next) { - res.json({msg: 'This is CORS-enabled for a Single Route'}) -}) - -app.listen(80, function () { - console.log('CORS-enabled web server listening on port 80') -}) -``` - -### Configuring CORS - -```javascript -var express = require('express') -var cors = require('cors') -var app = express() - -var corsOptions = { - origin: 'http://example.com', - optionsSuccessStatus: 200 // some legacy browsers (IE11, various SmartTVs) choke on 204 -} - -app.get('/products/:id', cors(corsOptions), function (req, res, next) { - res.json({msg: 'This is CORS-enabled for only example.com.'}) -}) - -app.listen(80, function () { - console.log('CORS-enabled web server listening on port 80') -}) -``` - -### Configuring CORS w/ Dynamic Origin - -```javascript -var express = require('express') -var cors = require('cors') -var app = express() - -var whitelist = ['http://example1.com', 'http://example2.com'] -var corsOptions = { - origin: function (origin, callback) { - if (whitelist.indexOf(origin) !== -1) { - callback(null, true) - } else { - callback(new Error('Not allowed by CORS')) - } - } -} - -app.get('/products/:id', cors(corsOptions), function (req, res, next) { - res.json({msg: 'This is CORS-enabled for a whitelisted domain.'}) -}) - -app.listen(80, function () { - console.log('CORS-enabled web server listening on port 80') -}) -``` - -If you do not want to block REST tools or server-to-server requests, -add a `!origin` check in the origin function like so: - -```javascript -var corsOptions = { - origin: function (origin, callback) { - if (whitelist.indexOf(origin) !== -1 || !origin) { - callback(null, true) - } else { - callback(new Error('Not allowed by CORS')) - } - } -} -``` - -### Enabling CORS Pre-Flight - -Certain CORS requests are considered 'complex' and require an initial -`OPTIONS` request (called the "pre-flight request"). An example of a -'complex' CORS request is one that uses an HTTP verb other than -GET/HEAD/POST (such as DELETE) or that uses custom headers. To enable -pre-flighting, you must add a new OPTIONS handler for the route you want -to support: - -```javascript -var express = require('express') -var cors = require('cors') -var app = express() - -app.options('/products/:id', cors()) // enable pre-flight request for DELETE request -app.del('/products/:id', cors(), function (req, res, next) { - res.json({msg: 'This is CORS-enabled for all origins!'}) -}) - -app.listen(80, function () { - console.log('CORS-enabled web server listening on port 80') -}) -``` - -You can also enable pre-flight across-the-board like so: - -```javascript -app.options('*', cors()) // include before other routes -``` - -### Configuring CORS Asynchronously - -```javascript -var express = require('express') -var cors = require('cors') -var app = express() - -var whitelist = ['http://example1.com', 'http://example2.com'] -var corsOptionsDelegate = function (req, callback) { - var corsOptions; - if (whitelist.indexOf(req.header('Origin')) !== -1) { - corsOptions = { origin: true } // reflect (enable) the requested origin in the CORS response - } else { - corsOptions = { origin: false } // disable CORS for this request - } - callback(null, corsOptions) // callback expects two parameters: error and options -} - -app.get('/products/:id', cors(corsOptionsDelegate), function (req, res, next) { - res.json({msg: 'This is CORS-enabled for a whitelisted domain.'}) -}) - -app.listen(80, function () { - console.log('CORS-enabled web server listening on port 80') -}) -``` - -## Configuration Options - -* `origin`: Configures the **Access-Control-Allow-Origin** CORS header. Possible values: - - `Boolean` - set `origin` to `true` to reflect the [request origin](http://tools.ietf.org/html/draft-abarth-origin-09), as defined by `req.header('Origin')`, or set it to `false` to disable CORS. - - `String` - set `origin` to a specific origin. For example if you set it to `"http://example.com"` only requests from "http://example.com" will be allowed. - - `RegExp` - set `origin` to a regular expression pattern which will be used to test the request origin. If it's a match, the request origin will be reflected. For example the pattern `/example\.com$/` will reflect any request that is coming from an origin ending with "example.com". - - `Array` - set `origin` to an array of valid origins. Each origin can be a `String` or a `RegExp`. For example `["http://example1.com", /\.example2\.com$/]` will accept any request from "http://example1.com" or from a subdomain of "example2.com". - - `Function` - set `origin` to a function implementing some custom logic. The function takes the request origin as the first parameter and a callback (which expects the signature `err [object], allow [bool]`) as the second. -* `methods`: Configures the **Access-Control-Allow-Methods** CORS header. Expects a comma-delimited string (ex: 'GET,PUT,POST') or an array (ex: `['GET', 'PUT', 'POST']`). -* `allowedHeaders`: Configures the **Access-Control-Allow-Headers** CORS header. Expects a comma-delimited string (ex: 'Content-Type,Authorization') or an array (ex: `['Content-Type', 'Authorization']`). If not specified, defaults to reflecting the headers specified in the request's **Access-Control-Request-Headers** header. -* `exposedHeaders`: Configures the **Access-Control-Expose-Headers** CORS header. Expects a comma-delimited string (ex: 'Content-Range,X-Content-Range') or an array (ex: `['Content-Range', 'X-Content-Range']`). If not specified, no custom headers are exposed. -* `credentials`: Configures the **Access-Control-Allow-Credentials** CORS header. Set to `true` to pass the header, otherwise it is omitted. -* `maxAge`: Configures the **Access-Control-Max-Age** CORS header. Set to an integer to pass the header, otherwise it is omitted. -* `preflightContinue`: Pass the CORS preflight response to the next handler. -* `optionsSuccessStatus`: Provides a status code to use for successful `OPTIONS` requests, since some legacy browsers (IE11, various SmartTVs) choke on `204`. - -The default configuration is the equivalent of: - -```json -{ - "origin": "*", - "methods": "GET,HEAD,PUT,PATCH,POST,DELETE", - "preflightContinue": false, - "optionsSuccessStatus": 204 -} -``` - -For details on the effect of each CORS header, read [this](http://www.html5rocks.com/en/tutorials/cors/) article on HTML5 Rocks. - -## Demo - -A demo that illustrates CORS working (and not working) using jQuery is available here: [http://node-cors-client.herokuapp.com/](http://node-cors-client.herokuapp.com/) - -Code for that demo can be found here: - -* Client: [https://github.com/TroyGoode/node-cors-client](https://github.com/TroyGoode/node-cors-client) -* Server: [https://github.com/TroyGoode/node-cors-server](https://github.com/TroyGoode/node-cors-server) - -## License - -[MIT License](http://www.opensource.org/licenses/mit-license.php) - -## Author - -[Troy Goode](https://github.com/TroyGoode) ([troygoode@gmail.com](mailto:troygoode@gmail.com)) - -[coveralls-image]: https://img.shields.io/coveralls/expressjs/cors/master.svg -[coveralls-url]: https://coveralls.io/r/expressjs/cors?branch=master -[downloads-image]: https://img.shields.io/npm/dm/cors.svg -[downloads-url]: https://npmjs.org/package/cors -[npm-image]: https://img.shields.io/npm/v/cors.svg -[npm-url]: https://npmjs.org/package/cors -[travis-image]: https://img.shields.io/travis/expressjs/cors/master.svg -[travis-url]: https://travis-ci.org/expressjs/cors diff --git a/node_modules/cors/lib/index.js b/node_modules/cors/lib/index.js deleted file mode 100644 index 5475aec..0000000 --- a/node_modules/cors/lib/index.js +++ /dev/null @@ -1,238 +0,0 @@ -(function () { - - 'use strict'; - - var assign = require('object-assign'); - var vary = require('vary'); - - var defaults = { - origin: '*', - methods: 'GET,HEAD,PUT,PATCH,POST,DELETE', - preflightContinue: false, - optionsSuccessStatus: 204 - }; - - function isString(s) { - return typeof s === 'string' || s instanceof String; - } - - function isOriginAllowed(origin, allowedOrigin) { - if (Array.isArray(allowedOrigin)) { - for (var i = 0; i < allowedOrigin.length; ++i) { - if (isOriginAllowed(origin, allowedOrigin[i])) { - return true; - } - } - return false; - } else if (isString(allowedOrigin)) { - return origin === allowedOrigin; - } else if (allowedOrigin instanceof RegExp) { - return allowedOrigin.test(origin); - } else { - return !!allowedOrigin; - } - } - - function configureOrigin(options, req) { - var requestOrigin = req.headers.origin, - headers = [], - isAllowed; - - if (!options.origin || options.origin === '*') { - // allow any origin - headers.push([{ - key: 'Access-Control-Allow-Origin', - value: '*' - }]); - } else if (isString(options.origin)) { - // fixed origin - headers.push([{ - key: 'Access-Control-Allow-Origin', - value: options.origin - }]); - headers.push([{ - key: 'Vary', - value: 'Origin' - }]); - } else { - isAllowed = isOriginAllowed(requestOrigin, options.origin); - // reflect origin - headers.push([{ - key: 'Access-Control-Allow-Origin', - value: isAllowed ? requestOrigin : false - }]); - headers.push([{ - key: 'Vary', - value: 'Origin' - }]); - } - - return headers; - } - - function configureMethods(options) { - var methods = options.methods; - if (methods.join) { - methods = options.methods.join(','); // .methods is an array, so turn it into a string - } - return { - key: 'Access-Control-Allow-Methods', - value: methods - }; - } - - function configureCredentials(options) { - if (options.credentials === true) { - return { - key: 'Access-Control-Allow-Credentials', - value: 'true' - }; - } - return null; - } - - function configureAllowedHeaders(options, req) { - var allowedHeaders = options.allowedHeaders || options.headers; - var headers = []; - - if (!allowedHeaders) { - allowedHeaders = req.headers['access-control-request-headers']; // .headers wasn't specified, so reflect the request headers - headers.push([{ - key: 'Vary', - value: 'Access-Control-Request-Headers' - }]); - } else if (allowedHeaders.join) { - allowedHeaders = allowedHeaders.join(','); // .headers is an array, so turn it into a string - } - if (allowedHeaders && allowedHeaders.length) { - headers.push([{ - key: 'Access-Control-Allow-Headers', - value: allowedHeaders - }]); - } - - return headers; - } - - function configureExposedHeaders(options) { - var headers = options.exposedHeaders; - if (!headers) { - return null; - } else if (headers.join) { - headers = headers.join(','); // .headers is an array, so turn it into a string - } - if (headers && headers.length) { - return { - key: 'Access-Control-Expose-Headers', - value: headers - }; - } - return null; - } - - function configureMaxAge(options) { - var maxAge = (typeof options.maxAge === 'number' || options.maxAge) && options.maxAge.toString() - if (maxAge && maxAge.length) { - return { - key: 'Access-Control-Max-Age', - value: maxAge - }; - } - return null; - } - - function applyHeaders(headers, res) { - for (var i = 0, n = headers.length; i < n; i++) { - var header = headers[i]; - if (header) { - if (Array.isArray(header)) { - applyHeaders(header, res); - } else if (header.key === 'Vary' && header.value) { - vary(res, header.value); - } else if (header.value) { - res.setHeader(header.key, header.value); - } - } - } - } - - function cors(options, req, res, next) { - var headers = [], - method = req.method && req.method.toUpperCase && req.method.toUpperCase(); - - if (method === 'OPTIONS') { - // preflight - headers.push(configureOrigin(options, req)); - headers.push(configureCredentials(options, req)); - headers.push(configureMethods(options, req)); - headers.push(configureAllowedHeaders(options, req)); - headers.push(configureMaxAge(options, req)); - headers.push(configureExposedHeaders(options, req)); - applyHeaders(headers, res); - - if (options.preflightContinue) { - next(); - } else { - // Safari (and potentially other browsers) need content-length 0, - // for 204 or they just hang waiting for a body - res.statusCode = options.optionsSuccessStatus; - res.setHeader('Content-Length', '0'); - res.end(); - } - } else { - // actual response - headers.push(configureOrigin(options, req)); - headers.push(configureCredentials(options, req)); - headers.push(configureExposedHeaders(options, req)); - applyHeaders(headers, res); - next(); - } - } - - function middlewareWrapper(o) { - // if options are static (either via defaults or custom options passed in), wrap in a function - var optionsCallback = null; - if (typeof o === 'function') { - optionsCallback = o; - } else { - optionsCallback = function (req, cb) { - cb(null, o); - }; - } - - return function corsMiddleware(req, res, next) { - optionsCallback(req, function (err, options) { - if (err) { - next(err); - } else { - var corsOptions = assign({}, defaults, options); - var originCallback = null; - if (corsOptions.origin && typeof corsOptions.origin === 'function') { - originCallback = corsOptions.origin; - } else if (corsOptions.origin) { - originCallback = function (origin, cb) { - cb(null, corsOptions.origin); - }; - } - - if (originCallback) { - originCallback(req.headers.origin, function (err2, origin) { - if (err2 || !origin) { - next(err2); - } else { - corsOptions.origin = origin; - cors(corsOptions, req, res, next); - } - }); - } else { - next(); - } - } - }); - }; - } - - // can pass either an options hash, an options delegate, or nothing - module.exports = middlewareWrapper; - -}()); diff --git a/node_modules/cors/package.json b/node_modules/cors/package.json deleted file mode 100644 index ff37d98..0000000 --- a/node_modules/cors/package.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "cors", - "description": "Node.js CORS middleware", - "version": "2.8.5", - "author": "Troy Goode (https://github.com/troygoode/)", - "license": "MIT", - "keywords": [ - "cors", - "express", - "connect", - "middleware" - ], - "repository": "expressjs/cors", - "main": "./lib/index.js", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "devDependencies": { - "after": "0.8.2", - "eslint": "2.13.1", - "express": "4.16.3", - "mocha": "5.2.0", - "nyc": "13.1.0", - "supertest": "3.3.0" - }, - "files": [ - "lib/index.js", - "CONTRIBUTING.md", - "HISTORY.md", - "LICENSE", - "README.md" - ], - "engines": { - "node": ">= 0.10" - }, - "scripts": { - "test": "npm run lint && nyc --reporter=html --reporter=text mocha --require test/support/env", - "lint": "eslint lib test" - } -} diff --git a/node_modules/object-assign/index.js b/node_modules/object-assign/index.js deleted file mode 100644 index 0930cf8..0000000 --- a/node_modules/object-assign/index.js +++ /dev/null @@ -1,90 +0,0 @@ -/* -object-assign -(c) Sindre Sorhus -@license MIT -*/ - -'use strict'; -/* eslint-disable no-unused-vars */ -var getOwnPropertySymbols = Object.getOwnPropertySymbols; -var hasOwnProperty = Object.prototype.hasOwnProperty; -var propIsEnumerable = Object.prototype.propertyIsEnumerable; - -function toObject(val) { - if (val === null || val === undefined) { - throw new TypeError('Object.assign cannot be called with null or undefined'); - } - - return Object(val); -} - -function shouldUseNative() { - try { - if (!Object.assign) { - return false; - } - - // Detect buggy property enumeration order in older V8 versions. - - // https://bugs.chromium.org/p/v8/issues/detail?id=4118 - var test1 = new String('abc'); // eslint-disable-line no-new-wrappers - test1[5] = 'de'; - if (Object.getOwnPropertyNames(test1)[0] === '5') { - return false; - } - - // https://bugs.chromium.org/p/v8/issues/detail?id=3056 - var test2 = {}; - for (var i = 0; i < 10; i++) { - test2['_' + String.fromCharCode(i)] = i; - } - var order2 = Object.getOwnPropertyNames(test2).map(function (n) { - return test2[n]; - }); - if (order2.join('') !== '0123456789') { - return false; - } - - // https://bugs.chromium.org/p/v8/issues/detail?id=3056 - var test3 = {}; - 'abcdefghijklmnopqrst'.split('').forEach(function (letter) { - test3[letter] = letter; - }); - if (Object.keys(Object.assign({}, test3)).join('') !== - 'abcdefghijklmnopqrst') { - return false; - } - - return true; - } catch (err) { - // We don't expect any of the above to throw, but better to be safe. - return false; - } -} - -module.exports = shouldUseNative() ? Object.assign : function (target, source) { - var from; - var to = toObject(target); - var symbols; - - for (var s = 1; s < arguments.length; s++) { - from = Object(arguments[s]); - - for (var key in from) { - if (hasOwnProperty.call(from, key)) { - to[key] = from[key]; - } - } - - if (getOwnPropertySymbols) { - symbols = getOwnPropertySymbols(from); - for (var i = 0; i < symbols.length; i++) { - if (propIsEnumerable.call(from, symbols[i])) { - to[symbols[i]] = from[symbols[i]]; - } - } - } - } - - return to; -}; diff --git a/node_modules/object-assign/license b/node_modules/object-assign/license deleted file mode 100644 index 654d0bf..0000000 --- a/node_modules/object-assign/license +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.com) - -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: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -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. diff --git a/node_modules/object-assign/package.json b/node_modules/object-assign/package.json deleted file mode 100644 index 503eb1e..0000000 --- a/node_modules/object-assign/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "object-assign", - "version": "4.1.1", - "description": "ES2015 `Object.assign()` ponyfill", - "license": "MIT", - "repository": "sindresorhus/object-assign", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "engines": { - "node": ">=0.10.0" - }, - "scripts": { - "test": "xo && ava", - "bench": "matcha bench.js" - }, - "files": [ - "index.js" - ], - "keywords": [ - "object", - "assign", - "extend", - "properties", - "es2015", - "ecmascript", - "harmony", - "ponyfill", - "prollyfill", - "polyfill", - "shim", - "browser" - ], - "devDependencies": { - "ava": "^0.16.0", - "lodash": "^4.16.4", - "matcha": "^0.7.0", - "xo": "^0.16.0" - } -} diff --git a/node_modules/object-assign/readme.md b/node_modules/object-assign/readme.md deleted file mode 100644 index 1be09d3..0000000 --- a/node_modules/object-assign/readme.md +++ /dev/null @@ -1,61 +0,0 @@ -# object-assign [![Build Status](https://travis-ci.org/sindresorhus/object-assign.svg?branch=master)](https://travis-ci.org/sindresorhus/object-assign) - -> ES2015 [`Object.assign()`](http://www.2ality.com/2014/01/object-assign.html) [ponyfill](https://ponyfill.com) - - -## Use the built-in - -Node.js 4 and up, as well as every evergreen browser (Chrome, Edge, Firefox, Opera, Safari), -support `Object.assign()` :tada:. If you target only those environments, then by all -means, use `Object.assign()` instead of this package. - - -## Install - -``` -$ npm install --save object-assign -``` - - -## Usage - -```js -const objectAssign = require('object-assign'); - -objectAssign({foo: 0}, {bar: 1}); -//=> {foo: 0, bar: 1} - -// multiple sources -objectAssign({foo: 0}, {bar: 1}, {baz: 2}); -//=> {foo: 0, bar: 1, baz: 2} - -// overwrites equal keys -objectAssign({foo: 0}, {foo: 1}, {foo: 2}); -//=> {foo: 2} - -// ignores null and undefined sources -objectAssign({foo: 0}, null, {bar: 1}, undefined); -//=> {foo: 0, bar: 1} -``` - - -## API - -### objectAssign(target, [source, ...]) - -Assigns enumerable own properties of `source` objects to the `target` object and returns the `target` object. Additional `source` objects will overwrite previous ones. - - -## Resources - -- [ES2015 spec - Object.assign](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.assign) - - -## Related - -- [deep-assign](https://github.com/sindresorhus/deep-assign) - Recursive `Object.assign()` - - -## License - -MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/vary/HISTORY.md b/node_modules/vary/HISTORY.md deleted file mode 100644 index f6cbcf7..0000000 --- a/node_modules/vary/HISTORY.md +++ /dev/null @@ -1,39 +0,0 @@ -1.1.2 / 2017-09-23 -================== - - * perf: improve header token parsing speed - -1.1.1 / 2017-03-20 -================== - - * perf: hoist regular expression - -1.1.0 / 2015-09-29 -================== - - * Only accept valid field names in the `field` argument - - Ensures the resulting string is a valid HTTP header value - -1.0.1 / 2015-07-08 -================== - - * Fix setting empty header from empty `field` - * perf: enable strict mode - * perf: remove argument reassignments - -1.0.0 / 2014-08-10 -================== - - * Accept valid `Vary` header string as `field` - * Add `vary.append` for low-level string manipulation - * Move to `jshttp` orgainzation - -0.1.0 / 2014-06-05 -================== - - * Support array of fields to set - -0.0.0 / 2014-06-04 -================== - - * Initial release diff --git a/node_modules/vary/LICENSE b/node_modules/vary/LICENSE deleted file mode 100644 index 84441fb..0000000 --- a/node_modules/vary/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2014-2017 Douglas Christopher Wilson - -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: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -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. diff --git a/node_modules/vary/README.md b/node_modules/vary/README.md deleted file mode 100644 index cc000b3..0000000 --- a/node_modules/vary/README.md +++ /dev/null @@ -1,101 +0,0 @@ -# vary - -[![NPM Version][npm-image]][npm-url] -[![NPM Downloads][downloads-image]][downloads-url] -[![Node.js Version][node-version-image]][node-version-url] -[![Build Status][travis-image]][travis-url] -[![Test Coverage][coveralls-image]][coveralls-url] - -Manipulate the HTTP Vary header - -## Installation - -This is a [Node.js](https://nodejs.org/en/) module available through the -[npm registry](https://www.npmjs.com/). Installation is done using the -[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): - -```sh -$ npm install vary -``` - -## API - - - -```js -var vary = require('vary') -``` - -### vary(res, field) - -Adds the given header `field` to the `Vary` response header of `res`. -This can be a string of a single field, a string of a valid `Vary` -header, or an array of multiple fields. - -This will append the header if not already listed, otherwise leaves -it listed in the current location. - - - -```js -// Append "Origin" to the Vary header of the response -vary(res, 'Origin') -``` - -### vary.append(header, field) - -Adds the given header `field` to the `Vary` response header string `header`. -This can be a string of a single field, a string of a valid `Vary` header, -or an array of multiple fields. - -This will append the header if not already listed, otherwise leaves -it listed in the current location. The new header string is returned. - - - -```js -// Get header string appending "Origin" to "Accept, User-Agent" -vary.append('Accept, User-Agent', 'Origin') -``` - -## Examples - -### Updating the Vary header when content is based on it - -```js -var http = require('http') -var vary = require('vary') - -http.createServer(function onRequest (req, res) { - // about to user-agent sniff - vary(res, 'User-Agent') - - var ua = req.headers['user-agent'] || '' - var isMobile = /mobi|android|touch|mini/i.test(ua) - - // serve site, depending on isMobile - res.setHeader('Content-Type', 'text/html') - res.end('You are (probably) ' + (isMobile ? '' : 'not ') + 'a mobile user') -}) -``` - -## Testing - -```sh -$ npm test -``` - -## License - -[MIT](LICENSE) - -[npm-image]: https://img.shields.io/npm/v/vary.svg -[npm-url]: https://npmjs.org/package/vary -[node-version-image]: https://img.shields.io/node/v/vary.svg -[node-version-url]: https://nodejs.org/en/download -[travis-image]: https://img.shields.io/travis/jshttp/vary/master.svg -[travis-url]: https://travis-ci.org/jshttp/vary -[coveralls-image]: https://img.shields.io/coveralls/jshttp/vary/master.svg -[coveralls-url]: https://coveralls.io/r/jshttp/vary -[downloads-image]: https://img.shields.io/npm/dm/vary.svg -[downloads-url]: https://npmjs.org/package/vary diff --git a/node_modules/vary/index.js b/node_modules/vary/index.js deleted file mode 100644 index 5b5e741..0000000 --- a/node_modules/vary/index.js +++ /dev/null @@ -1,149 +0,0 @@ -/*! - * vary - * Copyright(c) 2014-2017 Douglas Christopher Wilson - * MIT Licensed - */ - -'use strict' - -/** - * Module exports. - */ - -module.exports = vary -module.exports.append = append - -/** - * RegExp to match field-name in RFC 7230 sec 3.2 - * - * field-name = token - * token = 1*tchar - * tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" - * / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" - * / DIGIT / ALPHA - * ; any VCHAR, except delimiters - */ - -var FIELD_NAME_REGEXP = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/ - -/** - * Append a field to a vary header. - * - * @param {String} header - * @param {String|Array} field - * @return {String} - * @public - */ - -function append (header, field) { - if (typeof header !== 'string') { - throw new TypeError('header argument is required') - } - - if (!field) { - throw new TypeError('field argument is required') - } - - // get fields array - var fields = !Array.isArray(field) - ? parse(String(field)) - : field - - // assert on invalid field names - for (var j = 0; j < fields.length; j++) { - if (!FIELD_NAME_REGEXP.test(fields[j])) { - throw new TypeError('field argument contains an invalid header name') - } - } - - // existing, unspecified vary - if (header === '*') { - return header - } - - // enumerate current values - var val = header - var vals = parse(header.toLowerCase()) - - // unspecified vary - if (fields.indexOf('*') !== -1 || vals.indexOf('*') !== -1) { - return '*' - } - - for (var i = 0; i < fields.length; i++) { - var fld = fields[i].toLowerCase() - - // append value (case-preserving) - if (vals.indexOf(fld) === -1) { - vals.push(fld) - val = val - ? val + ', ' + fields[i] - : fields[i] - } - } - - return val -} - -/** - * Parse a vary header into an array. - * - * @param {String} header - * @return {Array} - * @private - */ - -function parse (header) { - var end = 0 - var list = [] - var start = 0 - - // gather tokens - for (var i = 0, len = header.length; i < len; i++) { - switch (header.charCodeAt(i)) { - case 0x20: /* */ - if (start === end) { - start = end = i + 1 - } - break - case 0x2c: /* , */ - list.push(header.substring(start, end)) - start = end = i + 1 - break - default: - end = i + 1 - break - } - } - - // final token - list.push(header.substring(start, end)) - - return list -} - -/** - * Mark that a request is varied on a header field. - * - * @param {Object} res - * @param {String|Array} field - * @public - */ - -function vary (res, field) { - if (!res || !res.getHeader || !res.setHeader) { - // quack quack - throw new TypeError('res argument is required') - } - - // get existing header - var val = res.getHeader('Vary') || '' - var header = Array.isArray(val) - ? val.join(', ') - : String(val) - - // set new header - if ((val = append(header, field))) { - res.setHeader('Vary', val) - } -} diff --git a/node_modules/vary/package.json b/node_modules/vary/package.json deleted file mode 100644 index 028f72a..0000000 --- a/node_modules/vary/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "vary", - "description": "Manipulate the HTTP Vary header", - "version": "1.1.2", - "author": "Douglas Christopher Wilson ", - "license": "MIT", - "keywords": [ - "http", - "res", - "vary" - ], - "repository": "jshttp/vary", - "devDependencies": { - "beautify-benchmark": "0.2.4", - "benchmark": "2.1.4", - "eslint": "3.19.0", - "eslint-config-standard": "10.2.1", - "eslint-plugin-import": "2.7.0", - "eslint-plugin-markdown": "1.0.0-beta.6", - "eslint-plugin-node": "5.1.1", - "eslint-plugin-promise": "3.5.0", - "eslint-plugin-standard": "3.0.1", - "istanbul": "0.4.5", - "mocha": "2.5.3", - "supertest": "1.1.0" - }, - "files": [ - "HISTORY.md", - "LICENSE", - "README.md", - "index.js" - ], - "engines": { - "node": ">= 0.8" - }, - "scripts": { - "bench": "node benchmark/index.js", - "lint": "eslint --plugin markdown --ext js,md .", - "test": "mocha --reporter spec --bail --check-leaks test/", - "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/", - "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/" - } -}