From ea5717b4e609685a3ac8180d7ac46f4286370930 Mon Sep 17 00:00:00 2001 From: Tate McCauley Date: Tue, 10 Mar 2026 08:19:54 -0600 Subject: [PATCH] removed legacy code --- .DS_Store | Bin 8196 -> 8196 bytes Old Code/.gitignore | 24 - Old Code/README.md | 26 - Old Code/icons/icon128.png | Bin 1261 -> 0 bytes Old Code/icons/icon16.png | Bin 199 -> 0 bytes Old Code/icons/icon48.png | Bin 495 -> 0 bytes Old Code/manifest.json | 21 - Old Code/mockups/index.html | 14 - Old Code/mockups/src/main.jsx | 9 - Old Code/mockups/src/mockups/App.jsx | 127 -- Old Code/mockups/src/mockups/DesignA.jsx | 41 - Old Code/mockups/src/mockups/DesignB.jsx | 36 - Old Code/mockups/src/mockups/DesignC.jsx | 34 - Old Code/mockups/src/mockups/DesignD.jsx | 36 - Old Code/mockups/src/styles.css | 247 --- Old Code/package-lock.json | 1682 ----------------- Old Code/package.json | 23 - Old Code/src/api.js | 30 - Old Code/src/background.js | 1 - Old Code/src/content.js | 1 - Old Code/src/popup/App.jsx | 93 - Old Code/src/popup/components/InfoIcon.jsx | 69 - Old Code/src/popup/components/ProgressBar.jsx | 17 - Old Code/src/popup/components/RiskMeter.jsx | 9 - Old Code/src/popup/components/Switch.jsx | 9 - Old Code/src/popup/components/Tabs.jsx | 17 - Old Code/src/popup/index.html | 13 - Old Code/src/popup/main.jsx | 7 - Old Code/src/popup/sections/Build.jsx | 12 - Old Code/src/popup/sections/Details.jsx | 12 - Old Code/src/popup/sections/History.jsx | 12 - Old Code/src/popup/sections/Settings.jsx | 17 - Old Code/src/popup/sections/Summary.jsx | 78 - Old Code/src/popup/styles.css | 501 ----- Old Code/vite.config.js | 11 - Old Code/vite.mockups.config.js | 15 - test server/SERVER_MANAGEMENT.md | 152 -- test server/package-minimal.json | 16 - test server/server-improved.js | 351 ---- 39 files changed, 3763 deletions(-) delete mode 100644 Old Code/.gitignore delete mode 100644 Old Code/README.md delete mode 100644 Old Code/icons/icon128.png delete mode 100644 Old Code/icons/icon16.png delete mode 100644 Old Code/icons/icon48.png delete mode 100644 Old Code/manifest.json delete mode 100644 Old Code/mockups/index.html delete mode 100644 Old Code/mockups/src/main.jsx delete mode 100644 Old Code/mockups/src/mockups/App.jsx delete mode 100644 Old Code/mockups/src/mockups/DesignA.jsx delete mode 100644 Old Code/mockups/src/mockups/DesignB.jsx delete mode 100644 Old Code/mockups/src/mockups/DesignC.jsx delete mode 100644 Old Code/mockups/src/mockups/DesignD.jsx delete mode 100644 Old Code/mockups/src/styles.css delete mode 100644 Old Code/package-lock.json delete mode 100644 Old Code/package.json delete mode 100644 Old Code/src/api.js delete mode 100644 Old Code/src/background.js delete mode 100644 Old Code/src/content.js delete mode 100644 Old Code/src/popup/App.jsx delete mode 100644 Old Code/src/popup/components/InfoIcon.jsx delete mode 100644 Old Code/src/popup/components/ProgressBar.jsx delete mode 100644 Old Code/src/popup/components/RiskMeter.jsx delete mode 100644 Old Code/src/popup/components/Switch.jsx delete mode 100644 Old Code/src/popup/components/Tabs.jsx delete mode 100644 Old Code/src/popup/index.html delete mode 100644 Old Code/src/popup/main.jsx delete mode 100644 Old Code/src/popup/sections/Build.jsx delete mode 100644 Old Code/src/popup/sections/Details.jsx delete mode 100644 Old Code/src/popup/sections/History.jsx delete mode 100644 Old Code/src/popup/sections/Settings.jsx delete mode 100644 Old Code/src/popup/sections/Summary.jsx delete mode 100644 Old Code/src/popup/styles.css delete mode 100644 Old Code/vite.config.js delete mode 100644 Old Code/vite.mockups.config.js delete mode 100644 test server/SERVER_MANAGEMENT.md delete mode 100644 test server/package-minimal.json delete mode 100644 test server/server-improved.js diff --git a/.DS_Store b/.DS_Store index 9e8d709366134ee0d02f36fd4cba851029c0b0d8..3bd56c42659e8525f736df66cd08af96c855a552 100644 GIT binary patch delta 33 pcmZp1XmOa}&&ahgU^hP_*Jd7p0_MqUg!gZ@<~hT>nO)*9I{>?>3p)S+ delta 74 zcmZp1XmOa}&&a(oU^hP__hue}0%lzf27iVeh7<+`24{wRAf4)&lb@WFlb^)Ez#zcD Yz&Hs=>-`4<28PL%!iP3zi_GK(0NeH!Bme*a diff --git a/Old Code/.gitignore b/Old Code/.gitignore deleted file mode 100644 index a547bf3..0000000 --- a/Old Code/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/Old Code/README.md b/Old Code/README.md deleted file mode 100644 index 10290a8..0000000 --- a/Old Code/README.md +++ /dev/null @@ -1,26 +0,0 @@ - -# NetStarShield — React JS (no TypeScript) - -Converted from the original project to React (JSX) — no TypeScript. No files from the original `dist/` are used (you may use it to confirm behavior). - -## Build & load -1. `npm install` -2. `npm run build` -3. Go to `chrome://extensions` → **Load unpacked** → select the `dist` folder. - -## Files -- `public/manifest.json` — MV3 manifest, points popup to `src/popup/index.html`, and uses `src/background.js` + `src/content.js` directly. -- `src/background.js` — service worker (module). Keeps parity with your original background entry. -- `src/content.js` — content script placeholder (for SERP annotations/badges). -- `src/api.js` — `getSettings`, `saveSettings`, and `scanUrl` stub returning `{ overall, metrics, verdict }`. -- `src/popup/index.html` — popup HTML shell (loads React bundle). -- `src/popup/main.jsx` — React root. -- `src/popup/App.jsx` — the popup UI and logic (tabs, card, analysis, settings, scan button). -- `src/popup/styles.css` — Tailwind-free CSS matching your original look (tabs, yellow card, circular meter, progress bars, toggle). - -## How functionality maps -- React state replaces the original TSX component state: active tab, enabled toggle, and current scan result. -- `scanUrl(url)` shape matches what the popup expects (overall score + metrics + verdict), so you can replace the stub with your real API call without touching the UI. -- Settings persist in `chrome.storage.local` exactly as before (MV3-safe). -- The background script remains plain JS and can be expanded with alarms or message routing as needed. - diff --git a/Old Code/icons/icon128.png b/Old Code/icons/icon128.png deleted file mode 100644 index a71c925ff51d9e83ffc94809e977b3f99859d6ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1261 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA#9@`=LP+TpndY|RHPZv5k5 zYtDTj|97MPu?2rG%2#a{*|=%5tgK|$t&5(su2pWgf7Rb1IX}7X{pYWrt8D-M6ItJ_ z9{zD1L()d3mav&`8Iz_nDJ*9=p~+Ch)i8%%%&E8KHcb1p$;jr-%b)S~?j;2RojZ4y zMzNeJFJHWG)v6Wp#db4~T> zA6`T&BviNbTgp2uS;+YQ-M!rEwtP!@28J5J-bH(Q9xWE@eH5OWA1hlG6`gzjgK8H8 z!-Eu+rh=XM|F329`ZD-FG_cFd-)?)jJcEg$;odnvoAAg?pwR)W0peT_E7F(0mE7kf z3N-G@y}oC!vThsKH0w32N)VVYZ<7JE=>jVQgZuaQ?yslmZcG2cl*(|>fgycSAW&JO z5d%ZT@};c$=4Q9%CCcV9G@Luy(9HN}^M-^!-?qNJ{ZZ}b&Ko-!>O7Yk%sVNu-`>4W zuS~C@W?{p=iaS4Q!=0J$-QIlsu}SOCHq#Ri>q|aP!Ma>|M*lR@n6-#z*kLpHD{n8&vQpj7qt)%sBtpMJe&mzpKmC_G~R)-roIYF);Jg?JHznT>cIiOwzqpwR+3A7ceYX z-{E}G`|DSWM;~_1&|_fu@%NhUA5+`hKXnRHt|u-QZ=5~4u|CS;U}HJj&4?SKFNl~bz0i@OTm8O#iFed z0^@#707HMRwO!xKrK-1$z5Ez$woN(xute~AQn*Hg`X2+s#*;bMzV%EBV(>rl^z#e- zNB>24IWXEhy&l3VaB=8F~T-FqQ&p#Dd47FYefeYw?co*E6NGV*e5 zH)m!f2Qy@QoH_e&d&sG8Jm)nV(qHr+pLqH?Fo{oLs%T3w>y}?14@}j;j7O4q_Fp|I r^@Z2Lk8wgU!xIq(OIAvmJL?(!{GP>zlnEFEi!laIS3j3^P6VZ`fq5?O#yKB9D4bVn}IE_=Es46Ma$XC zSx>U*>?rMi`27BUo}0IBJ(2wI`F(ubxo&YuuP v&mJh8Z;-G5Z&VVuqrsn(`Ef>E0t187PBojQu`%^Pmoa#{`njxgN@xNAkkCwt diff --git a/Old Code/icons/icon48.png b/Old Code/icons/icon48.png deleted file mode 100644 index 02b6c6e53a93a028f9fb1ef9ec85df5075ca34dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 495 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezr3(FmCg7aSW-L^LD1a2UDQT@p?J+ zj)yyEuvn>xD{^s(FKn_Z7+Z5cg}wH_up&f-@UtQFP*ZPO~;VwHR~U7y#rDhXx373f#-88MEDNp zDkVzR=WS0kpFiI+{qEDI?J9Qa!`*M|{@q zEYYZD#;E#|#)~Cfn!e7j_fH5v)m|lgugZ4HJ#N7tMm!e3zjiosOaDK4TmmWdfZ_Io Z?aA7>BWKjA{{bVC!PC{xWt~$(697$I)_4E_ diff --git a/Old Code/manifest.json b/Old Code/manifest.json deleted file mode 100644 index 097438c..0000000 --- a/Old Code/manifest.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "manifest_version": 3, - "name": "NetStarShield", - "version": "1.2.0", - "action": { "default_popup": "src/popup/index.html" }, - "background": { "service_worker": "src/background.js", "type": "module" }, - "permissions": ["storage", "tabs"], - "host_permissions": [""], - "icons": { - "16": "icons/icon16.png", - "48": "icons/icon48.png", - "128": "icons/icon128.png" - }, - "content_scripts": [ - { - "matches": [""], - "js": ["src/content.js"], - "run_at": "document_end" - } - ] -} diff --git a/Old Code/mockups/index.html b/Old Code/mockups/index.html deleted file mode 100644 index b0708e0..0000000 --- a/Old Code/mockups/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - NetStarShield UI Mockups - - -
- - - - - diff --git a/Old Code/mockups/src/main.jsx b/Old Code/mockups/src/main.jsx deleted file mode 100644 index f43451a..0000000 --- a/Old Code/mockups/src/main.jsx +++ /dev/null @@ -1,9 +0,0 @@ -import React from 'react' -import { createRoot } from 'react-dom/client' -import { App } from './mockups/App' -import './styles.css' - -const root = createRoot(document.getElementById('root')) -root.render() - - diff --git a/Old Code/mockups/src/mockups/App.jsx b/Old Code/mockups/src/mockups/App.jsx deleted file mode 100644 index a189991..0000000 --- a/Old Code/mockups/src/mockups/App.jsx +++ /dev/null @@ -1,127 +0,0 @@ -import React, { useMemo, useState } from 'react' -import { DesignA } from './DesignA' -import { DesignB } from './DesignB' -import { DesignC } from './DesignC' -import { DesignD } from './DesignD' - -const SAMPLE = { - url: 'extensions', - verdict: 'Caution', - score: 50, - breakdown: [ - { label: 'Domain Reputation', value: 50 }, - { label: 'Domain Signals', value: 50 }, - { label: 'Certificate Trust', value: 50 }, - { label: 'Connection Security', value: 50 }, - { label: 'Credential Safety', value: 50 }, - { label: 'Page Content', value: 50 }, - ], - reasons: ['New domain', 'HTTPS', 'Ad trackers'], -} - -export function App() { - const [design, setDesign] = useState('A') - const [theme, setTheme] = useState('neutral') // neutral | vibrant | neon - const [mode, setMode] = useState('light') // light | dark - const [verdict, setVerdict] = useState('caution') // safe | caution | risky | dangerous - const [metrics, setMetrics] = useState(SAMPLE.breakdown.map(m => ({ ...m }))) - - const overall = Math.round(metrics.reduce((s, m) => s + (Number(m.value) || 0), 0) / metrics.length) - const computedData = { - ...SAMPLE, - score: overall, - breakdown: metrics, - verdict: ({ safe: 'Safe', caution: 'Caution', risky: 'Risky', dangerous: 'Dangerous' }[verdict]) || 'Caution', - } - - const updateMetric = (idx, value) => { - setMetrics(prev => prev.map((m, i) => i === idx ? { ...m, value: Number(value) } : m)) - } - - const View = useMemo(() => { - switch (design) { - case 'A': - return DesignA - case 'B': - return DesignB - case 'C': - return DesignC - case 'D': - return DesignD - default: - return DesignA - } - }, [design]) - - return ( -
-
-
NetStarShield – UI Mockups
-
All designs shown side-by-side in extension frames.
-
- {['neutral','vibrant','neon'].map(t => ( - - ))} -
-
- {['light','dark'].map(m => ( - - ))} -
-
- {['safe','caution','risky','dangerous'].map(v => ( - - ))} -
-
-
-
- {metrics.map((m, i) => ( -
- - updateMetric(i, e.target.value)} /> - updateMetric(i, e.target.value)} /> -
- ))} -
Overall Score: {overall}
-
-
-
-
Design A
-
-
-
-
Design B
-
-
-
-
Design C
-
-
-
-
Design D
-
-
-
-
-
Resize the window to see the frames respond. Theme affects all frames.
-
- ) -} - - diff --git a/Old Code/mockups/src/mockups/DesignA.jsx b/Old Code/mockups/src/mockups/DesignA.jsx deleted file mode 100644 index b868e92..0000000 --- a/Old Code/mockups/src/mockups/DesignA.jsx +++ /dev/null @@ -1,41 +0,0 @@ -import React from 'react' - -// Design A: Verdict-first, compact card with semicircle gauge and chips -export function DesignA({ data }) { - return ( -
-
-
-
{data.url}
-
{data.verdict}
-
Overall Security
-
- - -
-
-
-
-
{data.score}
-
-
-
- -
- {data.breakdown.map(item => ( -
-
{item.label}
-
- -
-
{item.value}
-
- ))} -
-
- ) -} - - diff --git a/Old Code/mockups/src/mockups/DesignB.jsx b/Old Code/mockups/src/mockups/DesignB.jsx deleted file mode 100644 index 9e9e906..0000000 --- a/Old Code/mockups/src/mockups/DesignB.jsx +++ /dev/null @@ -1,36 +0,0 @@ -import React from 'react' - -// Design B: Full-bleed hero verdict with vertical steps -export function DesignB({ data }) { - return ( -
-
-
-

{data.verdict}

-

{data.url}

-
{data.score}
-
- - -
-
-
-
- {data.breakdown.map(item => ( -
-
-
-
{item.label}
-
{item.value}
-
-
- -
-
- ))} -
-
- ) -} - - diff --git a/Old Code/mockups/src/mockups/DesignC.jsx b/Old Code/mockups/src/mockups/DesignC.jsx deleted file mode 100644 index 7f4d851..0000000 --- a/Old Code/mockups/src/mockups/DesignC.jsx +++ /dev/null @@ -1,34 +0,0 @@ -import React from 'react' - -// Design C: Two-column dashboard with cards and table-like analysis -export function DesignC({ data }) { - return ( -
-
-
Overview
-
{data.score}
-
- {data.verdict} -
-
- - -
-
-
-
Security Analysis
-
- {data.breakdown.map(item => ( -
-
{item.label}
-
-
{item.value}
-
- ))} -
-
-
- ) -} - - diff --git a/Old Code/mockups/src/mockups/DesignD.jsx b/Old Code/mockups/src/mockups/DesignD.jsx deleted file mode 100644 index 693c193..0000000 --- a/Old Code/mockups/src/mockups/DesignD.jsx +++ /dev/null @@ -1,36 +0,0 @@ -import React from 'react' - -// Design D: Minimal list-first with inline actions and toast-like verdict -export function DesignD({ data }) { - return ( -
-
-
{data.verdict}
-
{data.url} • Score {data.score}
-
- - -
-
-
    - {data.breakdown.map(item => ( -
  • -
    - {item.label} - {item.value} -
    -
    - -
    -
  • - ))} -
-
- - -
-
- ) -} - - diff --git a/Old Code/mockups/src/styles.css b/Old Code/mockups/src/styles.css deleted file mode 100644 index 25b2f76..0000000 --- a/Old Code/mockups/src/styles.css +++ /dev/null @@ -1,247 +0,0 @@ -:root { - --bg: #0F172A0a; - --surface: #FFFFFF; - --text: #0F172A; - --muted: #64748B; - --border: #E6E8EB; - --accent: #D97706; /* default caution */ - --accentA: #60a5fa; /* themeable accent gradient A */ - --accentB: #a78bfa; /* themeable accent gradient B */ - --accentC: #22d3ee; /* themeable accent gradient C */ - --safe: #16A34A; - --caution: #D97706; - --risky: #DC2626; - --info: #2563EB; - --radius: 12px; -} - -/* Light/Dark modes */ -.mode-light { --surface: #FFFFFF; --text: #0F172A; --muted: #64748B; --border: #E6E8EB; background: #F8FAFC; } -.mode-dark { --surface: #0B0E14; --text: #F6F8FC; --muted: #B6C2D3; --border: #2A3446; background: #0A0E16; } - -* { box-sizing: border-box; } -html, body, #root { height: 100%; } -body { margin: 0; font-family: Inter, Segoe UI, system-ui, -apple-system, sans-serif; color: var(--text); background: #F8FAFC; } - -.container { max-width: 980px; margin: 0 auto; padding: 24px; } -.theme-vibrant { --text: #0B1220; --accent: #FF5A1F; --info: #7C3AED; --brand: #7C3AED; --brand-2: #0EA5E9; --accentA: #FF5A1F; --accentB: #F59E0B; --accentC: #22C55E; background: linear-gradient(135deg, #FEE2E2 0%, #FEF3C7 50%, #D1FAE5 100%); } -.theme-neon { --text: #E6E8EB; --surface: #0B0E14; --border: #23262B; --muted: #9AA4B2; --accent: #00F0FF; --info: #FFD166; --brand: #00F0FF; --brand-2: #7C3AED; --accentA: #00F0FF; --accentB: #7C3AED; --accentC: #22D3EE; background: radial-gradient(1000px 400px at 10% -10%, #1b2230, #0b0e14); } -.header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 16px; } -.brand { font-weight: 700; } -.switcher { display: inline-flex; gap: 6px; background: var(--surface); padding: 6px; border: 1px solid var(--border); border-radius: 10px; } -.seg { background: transparent; border: 0; padding: 6px 10px; border-radius: 8px; cursor: pointer; color: var(--muted); } -.seg.active { background: #EEF2FF; color: var(--text); } -.mode-dark .seg.active { background: #1a2334; color: #EAF2FF; } - -.stage { display: block; } -.grid-frames { display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; } -.frame { background: var(--surface); border: 1px solid var(--border); border-radius: 14px; overflow: hidden; box-shadow: 0 6px 18px rgba(0,0,0,0.06); } -.frame-title { padding: 8px 12px; font-weight: 700; border-bottom: 1px solid var(--border); background: color-mix(in oklab, var(--surface) 92%, #F8FAFC); color: var(--muted); } -.theme-neon .frame-title { background: #0E1420; } -.mode-dark .frame-title { color: #D7E2F2; background: #0E1420; border-color: #273040; } -.frame-body { padding: 8px; height: 520px; overflow: auto; } -.frame .design { max-width: 360px; margin: 0 auto; } -.footer { margin-top: 16px; color: var(--muted); font-size: 12px; } - -/* Controls panel for interactive scores */ -.controls-panel { margin-bottom: 16px; background: var(--surface); border: 1px solid var(--border); border-radius: 12px; padding: 12px; display: grid; grid-template-columns: 1fr 1fr; gap: 8px 12px; } -.ctrl-row { display: contents; } -.ctrl-label { align-self: center; color: var(--text); } -.ctrl-range { width: 100%; } -.ctrl-number { width: 72px; justify-self: end; padding: 6px 8px; border-radius: 8px; border: 1px solid var(--border); background: var(--surface); color: var(--text); } -.ctrl-overall { grid-column: 1 / -1; margin-top: 4px; color: var(--muted); } - -.card { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); padding: 16px; margin: 12px 0; } -.theme-vibrant .card { box-shadow: 0 8px 30px rgba(0,0,0,0.08); } -.theme-neon .card { background: #0F131B; border-color: #1D222B; box-shadow: 0 10px 30px rgba(0, 240, 255, 0.06); } -.title { font-weight: 600; margin-bottom: 8px; } -.badge { padding: 4px 8px; border-radius: 999px; font-weight: 600; font-size: 12px; width: fit-content; } -.badge.safe { background: color-mix(in oklab, var(--safe) 16%, white); color: var(--safe); } -.badge.caution { background: color-mix(in oklab, var(--caution) 16%, white); color: var(--caution); } -.badge.risky { background: color-mix(in oklab, var(--risky) 16%, white); color: var(--risky); } -.badge.safe::before { content: "✓ "; } -.badge.caution::before { content: "⚠ "; } -.badge.risky::before { content: "✖ "; } -.mode-dark .badge.safe { background: color-mix(in oklab, var(--safe) 26%, #0B0E14); color: #8ff2ac; } -.mode-dark .badge.caution { background: color-mix(in oklab, var(--caution) 26%, #0B0E14); color: #ffcf8a; } -.mode-dark .badge.risky { background: color-mix(in oklab, var(--risky) 26%, #0B0E14); color: #ff9a9a; } -.chip { display: inline-block; padding: 4px 8px; border: 1px solid var(--border); border-radius: 999px; margin-right: 6px; color: var(--muted); font-size: 12px; background: color-mix(in oklab, var(--surface) 96%, #ffffff); } -.mode-dark .chip { border-color: #2b3547; color: #C9D3E4; background: #101827; } -.primary { background: var(--text); color: white; border: 0; padding: 10px 14px; border-radius: 10px; cursor: pointer; transition: transform .08s ease; -} -.primary:active { transform: translateY(1px); } -.secondary { background: #EEF2FF; color: var(--text); border: 0; padding: 10px 14px; border-radius: 10px; cursor: pointer; } -.mode-dark .secondary { background: #1a2334; color: #EAF2FF; } -.ghost { background: transparent; color: var(--text); border: 1px solid var(--border); padding: 10px 14px; border-radius: 10px; cursor: pointer; } -.link { background: transparent; border: 0; color: var(--info); cursor: pointer; padding: 6px 8px; } -.mode-dark .link { color: #7dd3fc; } - -/* Design A */ -.design-a .verdict { position: relative; display: grid; grid-template-columns: 1fr 180px; gap: 12px; align-items: center; overflow: hidden; color: #D6E1FF; } -.design-a .verdict { background: radial-gradient(120% 120% at -10% -20%, #001029, #020617 40%, #0b1220); border: 1px solid #0f1b2e; } -.design-a .verdict::before, .design-a .verdict::after { content:""; position:absolute; filter: blur(40px); opacity:.5; } -.design-a .verdict::before { width: 260px; height: 260px; left: -80px; top: -80px; background: conic-gradient(from 120deg, #0ea5e9, #2563eb, #7c3aed, #0ea5e9); border-radius: 50%; } -.design-a .verdict::after { width: 320px; height: 320px; right: -120px; bottom: -120px; background: radial-gradient(circle at center, #1e3a8a, transparent 60%); } -.design-a .domain { font-weight: 700; color: #9db8ff; letter-spacing: .2px; } -.design-a .subtitle { color: #7c8cab; margin: 6px 0; } -.design-a .actions { margin-top: 10px; display: flex; gap: 8px; } -.design-a .primary { background: linear-gradient(135deg, #1e40af, #0ea5e9); box-shadow: 0 10px 30px rgba(14,165,233,.25); } -.design-a .ghost { border-color: #1f2a44; color: #9db8ff; } -.design-a .donut { width: 140px; height: 140px; border-radius: 50%; display: grid; place-items: center; animation: spin-in .6s ease both; box-shadow: inset 0 0 40px rgba(37,99,235,.35); } -.design-a .donut-hole { width: 92px; height: 92px; border-radius: 50%; background: #0b1220; display: grid; place-items: center; border: 1px solid #1f2a44; font-weight: 800; color: #E6E8EB; } -.design-a .breakdown { background: #0b1220; border-color: #151e33; } -.design-a .breakdown .row { display: grid; grid-template-columns: 200px 1fr 40px; gap: 10px; align-items: center; padding: 8px 0; color: #C7D2FE; } -.bar { height: 10px; background: #131b2d; border-radius: 999px; overflow: hidden; } -.bar span { display: block; height: 100%; background: linear-gradient(90deg, var(--accentA), var(--accentB)); } - -.verdict-safe { --accent: var(--safe); } -.verdict-caution { --accent: var(--caution); } -.verdict-risky { --accent: var(--risky); } -.verdict-dangerous { --accent: var(--risky); } - -/* Make the summary section react to verdict across designs */ -/* Design A: top verdict card colorize */ -.verdict-safe .design-a .verdict { background: radial-gradient(120% 120% at -10% -20%, #052e1a, #031a10 40%, #071910); border-color: color-mix(in oklab, var(--safe) 40%, #0f1b2e); } -.verdict-safe .design-a .verdict::before { background: conic-gradient(from 120deg, #16a34a, #22c55e, #86efac, #16a34a); } -.verdict-safe .design-a .verdict::after { background: radial-gradient(circle at 120% -40%, rgba(255,255,255,.35), transparent 60%), repeating-linear-gradient(45deg, rgba(255,255,255,.14) 0 4px, transparent 4px 8px); } -.verdict-caution .design-a .verdict { background: radial-gradient(120% 120% at -10% -20%, #2b1b03, #1f1402 40%, #1a1204); border-color: color-mix(in oklab, var(--caution) 40%, #0f1b2e); } -.verdict-caution .design-a .verdict::before { background: conic-gradient(from 120deg, #f59e0b, #fbbf24, #fde68a, #f59e0b); } -.verdict-caution .design-a .verdict::after { background: radial-gradient(circle at 120% -40%, rgba(255,255,255,.25), transparent 60%), radial-gradient(#ffffff33 1px, transparent 1px); background-size: auto, 10px 10px; } -.verdict-risky .design-a .verdict, .verdict-dangerous .design-a .verdict { background: radial-gradient(120% 120% at -10% -20%, #2b0b0b, #1a0808 40%, #1a0a0a); border-color: color-mix(in oklab, var(--risky) 40%, #0f1b2e); } -.verdict-risky .design-a .verdict::before, .verdict-dangerous .design-a .verdict::before { background: conic-gradient(from 120deg, #ef4444, #fb7185, #fecaca, #ef4444); } -.verdict-risky .design-a .verdict::after, .verdict-dangerous .design-a .verdict::after { background: radial-gradient(circle at 120% -40%, rgba(255,255,255,.28), transparent 60%), repeating-linear-gradient(45deg, rgba(255,255,255,.16) 0 3px, transparent 3px 7px), repeating-linear-gradient(-45deg, rgba(255,255,255,.16) 0 3px, transparent 3px 7px); } - -/* Design B: hero already colorizes via classes; boost caution/risky prominence */ -.design-b .hero.caution { box-shadow: 0 10px 30px rgba(245, 158, 11, 0.35); } -.design-b .hero.risky { box-shadow: 0 10px 34px rgba(239, 68, 68, 0.45); } -.design-b .hero.safe { box-shadow: 0 10px 24px rgba(34, 197, 94, 0.28); } - -/* Design C: Overview card (first card) reflects verdict */ -.verdict-safe .design-c .card:first-child { background: linear-gradient(180deg, color-mix(in oklab, var(--safe) 18%, #ffffff), #f6fff9); border-color: color-mix(in oklab, var(--safe) 40%, #E7ECF3); position: relative; } -.verdict-safe .design-c .card:first-child::after { content: ""; position: absolute; inset: 0; pointer-events: none; background-image: repeating-linear-gradient(45deg, #0f172a10 0 4px, transparent 4px 8px); } -.mode-dark.verdict-safe .design-c .card:first-child { background: linear-gradient(180deg, #0a1f14, #0f2419); border-color: color-mix(in oklab, var(--safe) 40%, #2A3446); } -.verdict-caution .design-c .card:first-child { background: linear-gradient(180deg, color-mix(in oklab, var(--caution) 18%, #ffffff), #fff9ef); border-color: color-mix(in oklab, var(--caution) 40%, #E7ECF3); position: relative; } -.verdict-caution .design-c .card:first-child::after { content: ""; position: absolute; inset: 0; pointer-events: none; background-image: radial-gradient(#0f172a14 1px, transparent 1px); background-size: 10px 10px; } -.mode-dark.verdict-caution .design-c .card:first-child { background: linear-gradient(180deg, #231807, #261a08); border-color: color-mix(in oklab, var(--caution) 40%, #2A3446); } -.verdict-risky .design-c .card:first-child, .verdict-dangerous .design-c .card:first-child { background: linear-gradient(180deg, color-mix(in oklab, var(--risky) 16%, #ffffff), #fff5f5); border-color: color-mix(in oklab, var(--risky) 40%, #E7ECF3); position: relative; } -.verdict-risky .design-c .card:first-child::after, .verdict-dangerous .design-c .card:first-child::after { content: ""; position: absolute; inset: 0; pointer-events: none; background-image: repeating-linear-gradient(45deg, #0f172a16 0 3px, transparent 3px 7px), repeating-linear-gradient(-45deg, #0f172a16 0 3px, transparent 3px 7px); } -.mode-dark.verdict-risky .design-c .card:first-child, .mode-dark.verdict-dangerous .design-c .card:first-child { background: linear-gradient(180deg, #2a0f11, #230b0d); border-color: color-mix(in oklab, var(--risky) 40%, #2A3446); } - -/* Design D: toast reflects verdict more clearly */ -.verdict-safe .design-d .toast { background: linear-gradient(180deg, #062515, #0c3b24); border-color: color-mix(in oklab, var(--safe) 50%, #1c2742); position: relative; } -.verdict-safe .design-d .toast::after { content: ""; position: absolute; inset: 0; pointer-events: none; opacity: .2; background-image: repeating-linear-gradient(45deg, #ffffff 0 4px, transparent 4px 8px); z-index: 0; } -.verdict-caution .design-d .toast { background: linear-gradient(180deg, #3a2606, #5a3b0a); border-color: color-mix(in oklab, var(--caution) 55%, #1c2742); position: relative; } -.verdict-caution .design-d .toast::after { content: ""; position: absolute; inset: 0; pointer-events: none; opacity: .22; background-image: radial-gradient(#ffffff 1px, transparent 1px); background-size: 10px 10px; z-index: 0; } -.verdict-risky .design-d .toast, .verdict-dangerous .design-d .toast { background: linear-gradient(180deg, #3a0e12, #5a141a); border-color: color-mix(in oklab, var(--risky) 55%, #1c2742); position: relative; } -.verdict-risky .design-d .toast::after, .verdict-dangerous .design-d .toast::after { content: ""; position: absolute; inset: 0; pointer-events: none; opacity: .22; background-image: repeating-linear-gradient(45deg, #ffffff 0 3px, transparent 3px 7px), repeating-linear-gradient(-45deg, #ffffff 0 3px, transparent 3px 7px); z-index: 0; } -/* Ensure text content stays above pattern overlays */ -.design-d .toast > * { position: relative; z-index: 1; } - -/* Make caution badge and warnings pop a bit more */ -.badge.caution { box-shadow: 0 0 0 1px color-mix(in oklab, var(--caution) 55%, white) inset; } -.mode-dark .badge.caution { box-shadow: 0 0 0 1px color-mix(in oklab, var(--caution) 55%, #0B0E14) inset; } - -/* Design B */ -.hero { border-radius: var(--radius); color: white; padding: 32px; background: var(--text); position: relative; overflow: hidden; } -.theme-vibrant .hero { box-shadow: 0 12px 50px rgba(0,0,0,0.12); } -.theme-neon .hero { box-shadow: inset 0 0 60px rgba(0, 240, 255, 0.08); } -.design-b { --brand: #2563EB; --brand-2: #0EA5E9; } -.design-b .hero { background: linear-gradient(180deg, white, white); color: #0F172A; border: 1px solid var(--border); position: relative; } -.design-b .hero::before { content: ""; position: absolute; inset: 0; pointer-events: none; opacity: .25; } -.verdict-safe .design-b .hero::before { background-image: repeating-linear-gradient(45deg, #0f172a18 0 4px, transparent 4px 8px); } -.verdict-caution .design-b .hero::before { background-image: radial-gradient(#0f172a1f 1px, transparent 1px); background-size: 12px 12px; } -.verdict-risky .design-b .hero::before, .verdict-dangerous .design-b .hero::before { background-image: repeating-linear-gradient(45deg, #0f172a22 0 3px, transparent 3px 7px), repeating-linear-gradient(-45deg, #0f172a22 0 3px, transparent 3px 7px); } -.mode-dark .design-b .hero { background: linear-gradient(180deg, #0f172a, #0b1220); color: #EAF2FF; border-color: #273040; } -.design-b .score { color: var(--brand); } -.design-b .primary { background: var(--brand); } -.design-b .secondary { background: color-mix(in oklab, var(--brand) 10%, white); } -.mode-dark .design-b .secondary { background: color-mix(in oklab, var(--brand) 20%, #0f172a); color: #EAF2FF; } -.design-b .steps .step { border-bottom-color: #E7ECF3; } -.mode-dark .design-b .steps .step { border-bottom-color: #253045; } -.design-b .progress { height: 8px; background: #EEF2F7; } -.mode-dark .design-b .progress { background: #1a2334; } -.design-b .progress span { background: linear-gradient(90deg, var(--brand), var(--brand-2)); opacity: 1; } -.design-b .step-dot { background: var(--brand); opacity: .16; } -.mode-dark .design-b .step-dot { opacity: .35; filter: saturate(1.2); } -/* Labels/values for metrics in Design B (e.g., Domain Reputation) */ -.design-b .label { color: color-mix(in oklab, var(--text) 92%, black); font-weight: 600; } -.design-b .value { color: color-mix(in oklab, var(--text) 80%, black); } -.hero.caution { background: linear-gradient(120deg, var(--caution), #f59e0b); } -.hero.safe { background: linear-gradient(120deg, var(--safe), #22c55e); } -.hero.risky { background: linear-gradient(120deg, var(--risky), #ef4444); } -.hero::after { content: ""; position: absolute; right: -20%; top: -40%; width: 60%; height: 200%; filter: blur(40px); opacity: .35; background: radial-gradient(circle at center, #fff, transparent 60%); } -.hero .domain { opacity: 0.9; } -.score { font-size: 56px; font-weight: 800; margin: 8px 0; } -.hero-actions { display: flex; gap: 8px; } -.steps .step { padding: 12px 0; border-bottom: 1px solid var(--border); } -.step-header { display: grid; grid-template-columns: 20px 1fr 40px; gap: 10px; align-items: center; } -.step-dot { width: 12px; height: 12px; background: var(--text); border-radius: 999px; opacity: 0.2; } -.progress { height: 6px; background: #ECEFF3; border-radius: 999px; overflow: hidden; margin-top: 8px; } -.progress span { display: block; height: 100%; background: var(--text); opacity: 0.6; } - -/* Design C */ -.grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; } -.design-c .card { background: linear-gradient(180deg, #ffffff, #f7fafc); } -.mode-dark .design-c .card { background: linear-gradient(180deg, #0e1526, #0a0f1b); border-color: #2A3446; } -.bigscore { font-size: 64px; font-weight: 800; } -.badge-row { display: flex; gap: 6px; align-items: center; margin: 8px 0; flex-wrap: wrap; } -.cta-row { display: flex; gap: 8px; } -.table .tr { display: grid; grid-template-columns: 1fr 1fr 60px; gap: 10px; padding: 10px 0; align-items: center; } -.design-c .badge { box-shadow: inset 0 0 0 1px #E7ECF3; } -.design-c .bar { height: 12px; background: #ECF1F7; border-radius: 999px; overflow: hidden; box-shadow: inset 0 0 8px rgba(0,0,0,0.05); } -.mode-dark .design-c .bar { background: #121b2e; box-shadow: inset 0 0 12px rgba(0,0,0,0.55); } -.design-c .bar span { background: linear-gradient(90deg, var(--accentA), var(--accentB), var(--accentC)); filter: saturate(1.2); } -.mode-dark .design-c .bar span { filter: saturate(1.5) brightness(1.1); } -/* Labels/values for metrics in Design C */ -.design-c .td.label { color: color-mix(in oklab, var(--text) 92%, black); font-weight: 600; } -.design-c .td.val { color: color-mix(in oklab, var(--text) 80%, black); } -.design-c .donut, .design-c .donut-hole { border-radius: 999px; } -.design-c .bigscore { background: radial-gradient(120px 120px at 50% 40%, #dbeafe, #f5f3ff 60%, transparent 61%); width: 140px; height: 140px; display:grid; place-items:center; border-radius: 999px; box-shadow: inset 0 12px 30px rgba(59,130,246,0.15); } - -/* Design D */ -.toast { padding: 12px 14px; border-radius: 12px; background: #F2F3F5; border: 1px solid var(--border); margin-bottom: 12px; } -.theme-neon .toast { background: #101622; } -.toast.safe { border-color: color-mix(in oklab, var(--safe) 40%, white); } -.toast.caution { border-color: color-mix(in oklab, var(--caution) 40%, white); } -.toast.risky { border-color: color-mix(in oklab, var(--risky) 40%, white); } -.toast-title { font-weight: 700; } -.toast-sub { color: var(--muted); font-size: 12px; } -.mode-dark .toast-sub { color: #BFC9DA; } -.toast-actions { margin-top: 6px; display: flex; gap: 8px; } -.list { list-style: none; padding: 0; margin: 0; } -.li { padding: 10px 0; border-bottom: 1px solid var(--border); } -.li-head { display: flex; justify-content: space-between; margin-bottom: 6px; } -.slim { height: 8px; background: #ECEFF3; border-radius: 999px; overflow: hidden; } -.mode-dark .slim { background: #1b2333; } -.slim span { display: block; height: 100%; background: linear-gradient(90deg, var(--accentA), var(--accentB)); } -/* Labels/values for metrics in Design D */ -.design-d .li-head .label { color: color-mix(in oklab, var(--text) 92%, black); font-weight: 600; } -.design-d .li-head .val { color: color-mix(in oklab, var(--text) 80%, black); } - -/* Improve section title readability for B–D (both modes) */ -.design-b .title, .design-c .title, .design-d .title { color: color-mix(in oklab, var(--text) 92%, black); } -.mode-dark .design-b .title, .mode-dark .design-c .title, .mode-dark .design-d .title { color: #EAF2FF; text-shadow: 0 0 10px rgba(0, 240, 255, 0.12); } -.design-d .toast { background: linear-gradient(180deg, #0b1220, #0f172a); color: #EAF2FF; border: 1px solid #1c2742; box-shadow: 0 10px 30px rgba(2,6,23,.45); } -.design-d .toast-title { color: #F6F8FC; } -.design-d .toast-sub { color: #D7E3FF; } -.design-d .toast-actions .link { color: #A8C7FF; } -.design-d .controls .primary { background: linear-gradient(135deg, #1e40af, #22c55e); } -.design-d .controls .secondary { background: linear-gradient(135deg, #f59e0b22, #22d3ee22); } - -/* Pop/glow for dark mode headings and big numbers */ -.mode-dark .brand, .mode-dark .title, .mode-dark .score, .mode-dark .frame-title { text-shadow: 0 0 14px rgba(59,130,246,0.25); } -.mode-dark .design-a .donut-hole, .mode-dark .bigscore { text-shadow: 0 0 10px rgba(37,99,235,0.35); } - -@media (max-width: 860px) { - .grid { grid-template-columns: 1fr; } - .grid-frames { grid-template-columns: 1fr; } - .design-a .verdict { grid-template-columns: 1fr; } -} - -/* Animations */ -@keyframes spin-in { - from { transform: rotate(-12deg) scale(.92); opacity: 0; } - to { transform: rotate(0) scale(1); opacity: 1; } -} - - diff --git a/Old Code/package-lock.json b/Old Code/package-lock.json deleted file mode 100644 index fdd96ba..0000000 --- a/Old Code/package-lock.json +++ /dev/null @@ -1,1682 +0,0 @@ -{ - "name": "netstarshield-react-js", - "version": "1.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "netstarshield-react-js", - "version": "1.1.0", - "dependencies": { - "react": "^18.3.1", - "react-dom": "^18.3.1" - }, - "devDependencies": { - "@crxjs/vite-plugin": "^2.2.0", - "vite": "^5.4.20" - } - }, - "node_modules/@crxjs/vite-plugin": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@crxjs/vite-plugin/-/vite-plugin-2.2.0.tgz", - "integrity": "sha512-HpT1GLbUQy42nlpN4sGzFgulacBraMM778s8Q+oPo4cb26DwO9tTwdndlvAS8fe6vEProFXvbdt37objp/0IQA==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^4.1.2", - "@webcomponents/custom-elements": "^1.5.0", - "acorn-walk": "^8.2.0", - "cheerio": "^1.0.0-rc.10", - "convert-source-map": "^1.7.0", - "debug": "^4.3.3", - "es-module-lexer": "^0.10.0", - "fast-glob": "^3.2.11", - "fs-extra": "^10.0.1", - "jsesc": "^3.0.2", - "magic-string": "^0.30.12", - "pathe": "^2.0.1", - "picocolors": "^1.1.1", - "react-refresh": "^0.13.0", - "rollup": "2.79.2", - "rxjs": "7.5.7" - } - }, - "node_modules/@crxjs/vite-plugin/node_modules/rollup": { - "version": "2.79.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", - "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@rollup/pluginutils": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", - "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", - "dev": true, - "dependencies": { - "estree-walker": "^2.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.3.tgz", - "integrity": "sha512-h6cqHGZ6VdnwliFG1NXvMPTy/9PS3h8oLh7ImwR+kl+oYnQizgjxsONmmPSb2C66RksfkfIxEVtDSEcJiO0tqw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.3.tgz", - "integrity": "sha512-wd+u7SLT/u6knklV/ifG7gr5Qy4GUbH2hMWcDauPFJzmCZUAJ8L2bTkVXC2niOIxp8lk3iH/QX8kSrUxVZrOVw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.3.tgz", - "integrity": "sha512-lj9ViATR1SsqycwFkJCtYfQTheBdvlWJqzqxwc9f2qrcVrQaF/gCuBRTiTolkRWS6KvNxSk4KHZWG7tDktLgjg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.3.tgz", - "integrity": "sha512-+Dyo7O1KUmIsbzx1l+4V4tvEVnVQqMOIYtrxK7ncLSknl1xnMHLgn7gddJVrYPNZfEB8CIi3hK8gq8bDhb3h5A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.3.tgz", - "integrity": "sha512-u9Xg2FavYbD30g3DSfNhxgNrxhi6xVG4Y6i9Ur1C7xUuGDW3banRbXj+qgnIrwRN4KeJ396jchwy9bCIzbyBEQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.3.tgz", - "integrity": "sha512-5M8kyi/OX96wtD5qJR89a/3x5x8x5inXBZO04JWhkQb2JWavOWfjgkdvUqibGJeNNaz1/Z1PPza5/tAPXICI6A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.3.tgz", - "integrity": "sha512-IoerZJ4l1wRMopEHRKOO16e04iXRDyZFZnNZKrWeNquh5d6bucjezgd+OxG03mOMTnS1x7hilzb3uURPkJ0OfA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.3.tgz", - "integrity": "sha512-ZYdtqgHTDfvrJHSh3W22TvjWxwOgc3ThK/XjgcNGP2DIwFIPeAPNsQxrJO5XqleSlgDux2VAoWQ5iJrtaC1TbA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.3.tgz", - "integrity": "sha512-NcViG7A0YtuFDA6xWSgmFb6iPFzHlf5vcqb2p0lGEbT+gjrEEz8nC/EeDHvx6mnGXnGCC1SeVV+8u+smj0CeGQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.3.tgz", - "integrity": "sha512-d3pY7LWno6SYNXRm6Ebsq0DJGoiLXTb83AIPCXl9fmtIQs/rXoS8SJxxUNtFbJ5MiOvs+7y34np77+9l4nfFMw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.3.tgz", - "integrity": "sha512-3y5GA0JkBuirLqmjwAKwB0keDlI6JfGYduMlJD/Rl7fvb4Ni8iKdQs1eiunMZJhwDWdCvrcqXRY++VEBbvk6Eg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.3.tgz", - "integrity": "sha512-AUUH65a0p3Q0Yfm5oD2KVgzTKgwPyp9DSXc3UA7DtxhEb/WSPfbG4wqXeSN62OG5gSo18em4xv6dbfcUGXcagw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.3.tgz", - "integrity": "sha512-1makPhFFVBqZE+XFg3Dkq+IkQ7JvmUrwwqaYBL2CE+ZpxPaqkGaiWFEWVGyvTwZace6WLJHwjVh/+CXbKDGPmg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.3.tgz", - "integrity": "sha512-OOFJa28dxfl8kLOPMUOQBCO6z3X2SAfzIE276fwT52uXDWUS178KWq0pL7d6p1kz7pkzA0yQwtqL0dEPoVcRWg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.3.tgz", - "integrity": "sha512-jMdsML2VI5l+V7cKfZx3ak+SLlJ8fKvLJ0Eoa4b9/vCUrzXKgoKxvHqvJ/mkWhFiyp88nCkM5S2v6nIwRtPcgg==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.3.tgz", - "integrity": "sha512-tPgGd6bY2M2LJTA1uGq8fkSPK8ZLYjDjY+ZLK9WHncCnfIz29LIXIqUgzCR0hIefzy6Hpbe8Th5WOSwTM8E7LA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.3.tgz", - "integrity": "sha512-BCFkJjgk+WFzP+tcSMXq77ymAPIxsX9lFJWs+2JzuZTLtksJ2o5hvgTdIcZ5+oKzUDMwI0PfWzRBYAydAHF2Mw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.3.tgz", - "integrity": "sha512-KTD/EqjZF3yvRaWUJdD1cW+IQBk4fbQaHYJUmP8N4XoKFZilVL8cobFSTDnjTtxWJQ3JYaMgF4nObY/+nYkumA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.3.tgz", - "integrity": "sha512-+zteHZdoUYLkyYKObGHieibUFLbttX2r+58l27XZauq0tcWYYuKUwY2wjeCN9oK1Um2YgH2ibd6cnX/wFD7DuA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.3.tgz", - "integrity": "sha512-of1iHkTQSo3kr6dTIRX6t81uj/c/b15HXVsPcEElN5sS859qHrOepM5p9G41Hah+CTqSh2r8Bm56dL2z9UQQ7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.3.tgz", - "integrity": "sha512-s0hybmlHb56mWVZQj8ra9048/WZTPLILKxcvcq+8awSZmyiSUZjjem1AhU3Tf4ZKpYhK4mg36HtHDOe8QJS5PQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.3.tgz", - "integrity": "sha512-zGIbEVVXVtauFgl3MRwGWEN36P5ZGenHRMgNw88X5wEhEBpq0XrMEZwOn07+ICrwM17XO5xfMZqh0OldCH5VTA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true - }, - "node_modules/@webcomponents/custom-elements": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@webcomponents/custom-elements/-/custom-elements-1.6.0.tgz", - "integrity": "sha512-CqTpxOlUCPWRNUPZDxT5v2NnHXA4oox612iUGnmTUGQFhZ1Gkj8kirtl/2wcF6MqX7+PqqicZzOCBKKfIn0dww==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cheerio": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.2.tgz", - "integrity": "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==", - "dev": true, - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.2", - "encoding-sniffer": "^0.2.1", - "htmlparser2": "^10.0.0", - "parse5": "^7.3.0", - "parse5-htmlparser2-tree-adapter": "^7.1.0", - "parse5-parser-stream": "^7.1.2", - "undici": "^7.12.0", - "whatwg-mimetype": "^4.0.0" - }, - "engines": { - "node": ">=20.18.1" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", - "dev": true, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "dev": true, - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/encoding-sniffer": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", - "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", - "dev": true, - "dependencies": { - "iconv-lite": "^0.6.3", - "whatwg-encoding": "^3.1.1" - }, - "funding": { - "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/es-module-lexer": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.10.5.tgz", - "integrity": "sha512-+7IwY/kiGAacQfY+YBhKMvEmyAJnw5grTUgjG85Pe7vcUI/6b7pZjZG8nQ7+48YhzEAEqrEgD2dCz/JIK+AYvw==", - "dev": true - }, - "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "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 - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "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, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "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==", - "dev": true - }, - "node_modules/htmlparser2": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", - "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.1", - "entities": "^6.0.0" - } - }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/magic-string": { - "version": "0.30.19", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", - "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/nanoid": { - "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", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "dev": true, - "dependencies": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", - "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", - "dev": true, - "dependencies": { - "domhandler": "^5.0.3", - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-parser-stream": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", - "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", - "dev": true, - "dependencies": { - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true - }, - "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 - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "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", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-refresh": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.13.0.tgz", - "integrity": "sha512-XP8A9BT0CpRBD+NYLLeIhld/RqG9+gktUjW1FkE+Vm7OCinbG1SshcK5tb9ls4kzvjZr9mOQc7HYgBngEyPAXg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rollup": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.3.tgz", - "integrity": "sha512-RIDh866U8agLgiIcdpB+COKnlCreHJLfIhWC3LVflku5YHfpnsIKigRZeFfMfCc4dVcqNVfQQ5gO/afOck064A==", - "dev": true, - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.52.3", - "@rollup/rollup-android-arm64": "4.52.3", - "@rollup/rollup-darwin-arm64": "4.52.3", - "@rollup/rollup-darwin-x64": "4.52.3", - "@rollup/rollup-freebsd-arm64": "4.52.3", - "@rollup/rollup-freebsd-x64": "4.52.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.52.3", - "@rollup/rollup-linux-arm-musleabihf": "4.52.3", - "@rollup/rollup-linux-arm64-gnu": "4.52.3", - "@rollup/rollup-linux-arm64-musl": "4.52.3", - "@rollup/rollup-linux-loong64-gnu": "4.52.3", - "@rollup/rollup-linux-ppc64-gnu": "4.52.3", - "@rollup/rollup-linux-riscv64-gnu": "4.52.3", - "@rollup/rollup-linux-riscv64-musl": "4.52.3", - "@rollup/rollup-linux-s390x-gnu": "4.52.3", - "@rollup/rollup-linux-x64-gnu": "4.52.3", - "@rollup/rollup-linux-x64-musl": "4.52.3", - "@rollup/rollup-openharmony-arm64": "4.52.3", - "@rollup/rollup-win32-arm64-msvc": "4.52.3", - "@rollup/rollup-win32-ia32-msvc": "4.52.3", - "@rollup/rollup-win32-x64-gnu": "4.52.3", - "@rollup/rollup-win32-x64-msvc": "4.52.3", - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", - "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "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==", - "dev": true - }, - "node_modules/undici": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.16.0.tgz", - "integrity": "sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==", - "dev": true, - "engines": { - "node": ">=20.18.1" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/vite": { - "version": "5.4.20", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.20.tgz", - "integrity": "sha512-j3lYzGC3P+B5Yfy/pfKNgVEg4+UtcIJcVRt2cDjIOmhLourAqPqf8P7acgxeiSgUB7E3p2P8/3gNIgDLpwzs4g==", - "dev": true, - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "dev": true, - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "dev": true, - "engines": { - "node": ">=18" - } - } - } -} diff --git a/Old Code/package.json b/Old Code/package.json deleted file mode 100644 index d1f380d..0000000 --- a/Old Code/package.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "netstarshield-react-js", - "version": "1.1.0", - "private": true, - "scripts": { - "dev": "vite", - "build": "vite build", - "preview": "vite preview", - "dev:ext": "vite", - "build:ext": "vite build", - "dev:mockups": "vite --config vite.mockups.config.js", - "build:mockups": "vite build --config vite.mockups.config.js", - "preview:mockups": "vite preview --config vite.mockups.config.js" - }, - "dependencies": { - "react": "^18.3.1", - "react-dom": "^18.3.1" - }, - "devDependencies": { - "vite": "^5.4.0", - "@crxjs/vite-plugin": "^2.0.0" - } -} diff --git a/Old Code/src/api.js b/Old Code/src/api.js deleted file mode 100644 index dcd2a2f..0000000 --- a/Old Code/src/api.js +++ /dev/null @@ -1,30 +0,0 @@ - -const KEY = 'nss:settings'; - -export async function getSettings() { - const s = (await chrome.storage.local.get(KEY))[KEY]; - return { enabled: true, blockHighRisk: false, ...s }; -} - -export async function saveSettings(patch) { - const current = await getSettings(); - const next = { ...current, ...patch }; - await chrome.storage.local.set({ [KEY]: next }); - return next; -} - -export async function scanUrl(url) { - return { - url, - overall: 50, - metrics: { - domainReputation: 50, - domainSignals: 50, - certificateTrust: 50, - connectionSecurity: 50, - credentialSafety: 50, - pageContent: 50 - }, - verdict: 'Caution' - }; -} diff --git a/Old Code/src/background.js b/Old Code/src/background.js deleted file mode 100644 index 1edbc82..0000000 --- a/Old Code/src/background.js +++ /dev/null @@ -1 +0,0 @@ -chrome.runtime.onInstalled.addListener(()=>console.log('[NSS] installed')); diff --git a/Old Code/src/content.js b/Old Code/src/content.js deleted file mode 100644 index 53355fc..0000000 --- a/Old Code/src/content.js +++ /dev/null @@ -1 +0,0 @@ -// Content script placeholder. diff --git a/Old Code/src/popup/App.jsx b/Old Code/src/popup/App.jsx deleted file mode 100644 index 29dd238..0000000 --- a/Old Code/src/popup/App.jsx +++ /dev/null @@ -1,93 +0,0 @@ -import React, { useEffect, useState } from 'react' -import { getSettings, saveSettings, scanUrl } from '../api' -import Switch from './components/Switch' -import Tabs from './components/Tabs' -import Summary from './sections/Summary' -import Details from './sections/Details' -import History from './sections/History' -import Settings from './sections/Settings' -import Build from './sections/Build' - -export default function App() { - const [settings, setSettings] = useState({ enabled: true, blockHighRisk: false }) - const [state, setState] = useState({ - domain: 'example.com', - overall: 50, - verdict: 'Caution', - metrics: { - domainReputation: 50, - domainSignals: 50, - certificateTrust: 50, - connectionSecurity: 50, - credentialSafety: 50, - pageContent: 50, - } - }) - const [activeTab, setActiveTab] = useState('Summary') - - const tabs = ['Summary', 'Details', 'Build', 'History', 'Settings'] - - useEffect(() => { - (async () => { - try { - const s = await getSettings() - setSettings(s) - const [tab] = await chrome.tabs.query({ active: true, currentWindow: true }) - const url = tab?.url || 'https://example.com' - const res = await scanUrl(url) - setState({ ...res, domain: new URL(url).hostname }) - } catch (e) { console.warn(e) } - })() - }, []) - - async function handleScan() { - try { - const [tab] = await chrome.tabs.query({ active: true, currentWindow: true }) - const url = tab?.url || 'https://example.com' - const res = await scanUrl(url) - setState({ ...res, domain: new URL(url).hostname }) - } catch (e) { alert('Scan failed: ' + e) } - } - - async function updateSettings(patch) { - const next = await saveSettings(patch) - setSettings(next) - } - - function renderContent() { - switch (activeTab) { - case 'Summary': return - case 'Details': return
- case 'Build': return - case 'History': return - case 'Settings': return - default: return - } - } - - return ( -
-
-
🛡️ NetStarShield
-
- - {settings.enabled ? 'On' : 'Off'} - - updateSettings({ enabled: v })} /> -
-
- - - -
- {renderContent()} -
- -
- - -
- ) -} \ No newline at end of file diff --git a/Old Code/src/popup/components/InfoIcon.jsx b/Old Code/src/popup/components/InfoIcon.jsx deleted file mode 100644 index 52b2056..0000000 --- a/Old Code/src/popup/components/InfoIcon.jsx +++ /dev/null @@ -1,69 +0,0 @@ -import React, { useState, useRef, useEffect } from 'react' - -export default function InfoIcon({ tooltip, position = 'top', children }) { - const [isVisible, setIsVisible] = useState(false) - const [actualPosition, setActualPosition] = useState(position) - const containerRef = useRef(null) - const tooltipRef = useRef(null) - - // Auto-adjust position if tooltip would go off-screen - useEffect(() => { - if (isVisible && tooltipRef.current && containerRef.current) { - const tooltip = tooltipRef.current - const container = containerRef.current - const rect = container.getBoundingClientRect() - const tooltipRect = tooltip.getBoundingClientRect() - - let newPosition = position - - // Check if tooltip goes off the right edge - if (rect.left + tooltipRect.width > window.innerWidth - 20) { - newPosition = position === 'top' || position === 'bottom' ? 'left' : 'top' - } - // Check if tooltip goes off the left edge - else if (rect.left < 20) { - newPosition = position === 'top' || position === 'bottom' ? 'right' : 'top' - } - // Check if tooltip goes off the top edge - else if (rect.top - tooltipRect.height < 20) { - newPosition = 'bottom' - } - // Check if tooltip goes off the bottom edge - else if (rect.top + tooltipRect.height > window.innerHeight - 20) { - newPosition = 'top' - } - - setActualPosition(newPosition) - } - }, [isVisible, position]) - - const handleMouseEnter = () => setIsVisible(true) - const handleMouseLeave = () => setIsVisible(false) - const handleFocus = () => setIsVisible(true) - const handleBlur = () => setIsVisible(false) - - return ( -
- {children ||
ℹ️
} - {isVisible && ( -
- {tooltip} -
- )} -
- ) -} diff --git a/Old Code/src/popup/components/ProgressBar.jsx b/Old Code/src/popup/components/ProgressBar.jsx deleted file mode 100644 index fc4fde8..0000000 --- a/Old Code/src/popup/components/ProgressBar.jsx +++ /dev/null @@ -1,17 +0,0 @@ -import React from 'react' -import InfoIcon from './InfoIcon' - -export default function ProgressBar({ label, value, tooltip }) { - return ( -
-
- {label} - {tooltip && } -
-
-
-
-
{value}
-
- ) -} diff --git a/Old Code/src/popup/components/RiskMeter.jsx b/Old Code/src/popup/components/RiskMeter.jsx deleted file mode 100644 index 6993530..0000000 --- a/Old Code/src/popup/components/RiskMeter.jsx +++ /dev/null @@ -1,9 +0,0 @@ -import React from 'react' - -export default function RiskMeter({ value }) { - return ( -
-
{value}
-
- ) -} diff --git a/Old Code/src/popup/components/Switch.jsx b/Old Code/src/popup/components/Switch.jsx deleted file mode 100644 index bb90216..0000000 --- a/Old Code/src/popup/components/Switch.jsx +++ /dev/null @@ -1,9 +0,0 @@ -import React from 'react' - -export default function Switch({ checked, onChange }) { - return ( -
onChange(!checked)}> -
-
- ) -} diff --git a/Old Code/src/popup/components/Tabs.jsx b/Old Code/src/popup/components/Tabs.jsx deleted file mode 100644 index 718ab18..0000000 --- a/Old Code/src/popup/components/Tabs.jsx +++ /dev/null @@ -1,17 +0,0 @@ -import React, { useState } from 'react' - -export default function Tabs({ tabs, activeTab, onTabChange }) { - return ( -
- {tabs.map(tab => ( - - ))} -
- ) -} diff --git a/Old Code/src/popup/index.html b/Old Code/src/popup/index.html deleted file mode 100644 index 807664d..0000000 --- a/Old Code/src/popup/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - NetStarShield - - - - -
- - - diff --git a/Old Code/src/popup/main.jsx b/Old Code/src/popup/main.jsx deleted file mode 100644 index 3df5bce..0000000 --- a/Old Code/src/popup/main.jsx +++ /dev/null @@ -1,7 +0,0 @@ - -import React from 'react' -import { createRoot } from 'react-dom/client' -import App from './App' -import './styles.css' - -createRoot(document.getElementById('root')).render() diff --git a/Old Code/src/popup/sections/Build.jsx b/Old Code/src/popup/sections/Build.jsx deleted file mode 100644 index 175e33b..0000000 --- a/Old Code/src/popup/sections/Build.jsx +++ /dev/null @@ -1,12 +0,0 @@ -import React from 'react' - -export default function Build() { - return ( -
-
Build
-
    -
  • Version info & changelog…
  • -
-
- ) -} diff --git a/Old Code/src/popup/sections/Details.jsx b/Old Code/src/popup/sections/Details.jsx deleted file mode 100644 index e941b73..0000000 --- a/Old Code/src/popup/sections/Details.jsx +++ /dev/null @@ -1,12 +0,0 @@ -import React from 'react' - -export default function Details() { - return ( -
-
Details
-
    -
  • Signals and evidence items here…
  • -
-
- ) -} diff --git a/Old Code/src/popup/sections/History.jsx b/Old Code/src/popup/sections/History.jsx deleted file mode 100644 index 6fa285c..0000000 --- a/Old Code/src/popup/sections/History.jsx +++ /dev/null @@ -1,12 +0,0 @@ -import React from 'react' - -export default function History() { - return ( -
-
History
-
    -
  • Recent scans…
  • -
-
- ) -} diff --git a/Old Code/src/popup/sections/Settings.jsx b/Old Code/src/popup/sections/Settings.jsx deleted file mode 100644 index f695668..0000000 --- a/Old Code/src/popup/sections/Settings.jsx +++ /dev/null @@ -1,17 +0,0 @@ -import React from 'react' -import Switch from '../components/Switch' - -export default function Settings({ settings, onUpdateSettings }) { - return ( -
-
Settings
-
- {settings.enabled ? 'On' : 'Off'} - onUpdateSettings({ enabled: v })} - /> -
-
- ) -} diff --git a/Old Code/src/popup/sections/Summary.jsx b/Old Code/src/popup/sections/Summary.jsx deleted file mode 100644 index 41785a8..0000000 --- a/Old Code/src/popup/sections/Summary.jsx +++ /dev/null @@ -1,78 +0,0 @@ -import React from "react"; -import RiskMeter from "../components/RiskMeter"; -import ProgressBar from "../components/ProgressBar"; - -export default function Summary({ state }) { - return ( -
-
-
-
-
{state.domain || "example.com"}
-
{state.verdict || "Caution"}
-
-
- -
-
-
-
Risk Score
-
- Overall Security -
-
-
- -
- - -
- -
-
- ); -} - -export function SecurityAnalysis({ metrics }) { - return ( -
-
Security Analysis
- - - - - - -
- ) -} - diff --git a/Old Code/src/popup/styles.css b/Old Code/src/popup/styles.css deleted file mode 100644 index 0933e0f..0000000 --- a/Old Code/src/popup/styles.css +++ /dev/null @@ -1,501 +0,0 @@ -/* ========================================================================== - NetSTAR Shield - Chrome Extension Styles - ========================================================================== */ - -/* CSS Custom Properties (Variables) for consistent theming */ -:root { - /* Colors */ - --color-primary: #1e40af; /* Blue - primary actions, active states */ - --color-primary-light: #e0ebff; /* Light blue - backgrounds */ - --color-primary-border: #c7d2fe; /* Blue border */ - --color-secondary: #475569; /* Gray - secondary text, labels */ - --color-success: #22c55e; /* Green - success states, enabled */ - --color-success-border: #16a34a; /* Dark green border */ - --color-warning: #b45309; /* Orange - warnings, caution */ - --color-warning-bg: #fffbeb; /* Light orange background */ - --color-warning-accent: #f59e0b; /* Orange accent - progress bars, risk meter */ - - /* Neutrals */ - --color-text: #0f172a; /* Dark text */ - --color-border: #e2e8f0; /* Light borders */ - --color-border-light: #cbd5e1; /* Lighter borders */ - --color-bg: #f8fafc; /* Light background */ - --color-bg-hover: #eef2f7; /* Hover background */ - --color-bg-disabled: #e5e7eb; /* Disabled/gray background */ - - /* Spacing */ - --spacing-xs: 4px; - --spacing-sm: 8px; - --spacing-md: 12px; - --spacing-lg: 14px; - --spacing-xl: 16px; - - /* Border radius */ - --radius-sm: 10px; - --radius-md: 12px; - --radius-lg: 24px; - --radius-full: 50%; - --radius-pill: 999px; - - /* Typography */ - --font-size-xs: 12px; - --font-size-sm: 14px; - --font-size-md: 18px; - --font-size-lg: 20px; - --font-weight-normal: 600; - --font-weight-bold: 700; -} - -/* ========================================================================== - Base Styles - ========================================================================== */ - -/* Reset default margins and padding */ -html, body { - margin: 0; - padding: 0; -} - -/* Main popup container - fixed width for Chrome extension */ -body { - width: 420px; /* Fixed width for extension popup */ - padding: var(--spacing-lg); /* Internal padding */ - font: var(--font-size-sm)/1.45 system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif; - color: var(--color-text); - background: white; -} - -/* ========================================================================== - Layout Components - ========================================================================== */ - -/* Header - contains title, version, and main toggle */ -.header { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: var(--spacing-sm); -} - -/* Flex row layout - used throughout for horizontal alignment */ -.row { - display: flex; - align-items: center; - gap: var(--spacing-md); -} - -/* Left side of row - takes available space */ -.left { - flex: 1 1 auto; -} - -/* Right side of row - fixed width */ -.right { - flex: 0 0 auto; -} - -/* Horizontal divider line */ -.hr { - height: 1px; - background: var(--color-border); - margin: var(--spacing-md) 0; -} - -/* Content panel with padding */ -.panel { - padding: var(--spacing-sm) 0; -} - -/* ========================================================================== - Typography - ========================================================================== */ - -/* Main title in header */ -.title { - font-size: var(--font-size-lg); - font-weight: var(--font-weight-bold); - letter-spacing: 0.2px; - margin: 0; -} - -/* Version text in header */ -.version { - color: var(--color-secondary); - font-size: var(--font-size-xs); - margin: 0; -} - -/* Small secondary text */ -.small { - color: var(--color-secondary); - font-size: var(--font-size-xs); -} - -/* Section headings */ -.section-title { - font-size: var(--font-size-md); - font-weight: var(--font-weight-bold); - margin: var(--spacing-xl) 0 var(--spacing-sm); - color: var(--color-text); -} - -/* Warning text styling */ -.warning { - color: var(--color-warning); - font-weight: var(--font-weight-bold); - display: flex; - gap: 6px; - align-items: center; -} - -/* ========================================================================== - Navigation - Tabs - ========================================================================== */ - -/* Tab container */ -.tabs { - display: flex; - gap: var(--spacing-sm); - border-bottom: 1px solid var(--color-border); - margin: 10px 0 var(--spacing-lg); -} - -/* Individual tab button */ -.tab { - padding: var(--spacing-sm) var(--spacing-md); - border-radius: var(--radius-sm) var(--radius-sm) 0 0; /* Rounded top corners only */ - border: 1px solid transparent; - background: transparent; - font-weight: var(--font-weight-normal); - color: var(--color-secondary); - cursor: pointer; - transition: all 0.2s ease; -} - -/* Active tab styling */ -.tab.active { - background: var(--color-primary-light); - border-color: var(--color-primary-border); - color: var(--color-primary); -} - -/* ========================================================================== - Cards and Containers - ========================================================================== */ - -/* Main content card with subtle styling */ -.card { - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - background: var(--color-warning-bg); /* Light orange background for security theme */ - padding: var(--spacing-lg); - box-shadow: 0 1px 0 rgba(0, 0, 0, 0.02); /* Subtle shadow */ -} - -/* ========================================================================== - Buttons - ========================================================================== */ - -/* Base button styling */ -.btn { - display: inline-flex; - align-items: center; - justify-content: center; - padding: var(--spacing-sm) var(--spacing-md); - border-radius: var(--radius-sm); - border: 1px solid var(--color-border-light); - background: var(--color-bg); - cursor: pointer; - font-weight: var(--font-weight-normal); - transition: background-color 0.2s ease; -} - -/* Button hover state */ -.btn:hover { - background: var(--color-bg-hover); -} - -/* Primary button variant */ -.btn.primary { - background: var(--color-primary-light); - border-color: var(--color-primary-border); - color: var(--color-primary); -} - -/* ========================================================================== - Interactive Elements - Toggle Switch - ========================================================================== */ - -/* Toggle container - holds label and switch */ -.toggle { - display: inline-flex; - align-items: center; - gap: var(--spacing-sm); -} - -/* Switch container - the track */ -.switch { - position: relative; - width: 42px; - height: 24px; - border-radius: var(--radius-lg); - background: var(--color-border); - border: 1px solid var(--color-border-light); - cursor: pointer; - transition: background-color 0.2s ease; -} - -/* Switch knob - the sliding part */ -.knob { - position: absolute; - top: 1px; - left: 1px; - width: 20px; - height: 20px; - background: white; - border: 1px solid var(--color-border-light); - border-radius: var(--radius-full); - transition: left 0.2s ease; /* Smooth sliding animation */ -} - -/* Switch when ON - green background */ -.switch.on { - background: var(--color-success); - border-color: var(--color-success-border); -} - -/* Switch knob when ON - moved to right */ -.switch.on .knob { - left: 21px; /* Moves knob to the right */ -} - -/* ========================================================================== - Custom Widgets - ========================================================================== */ - -/* Risk Meter - Circular progress indicator */ -.risk-meter { - --val: 50; /* CSS custom property for the value (0-100) */ - width: 72px; - height: 72px; - border-radius: var(--radius-full); - /* Conic gradient creates the circular progress effect */ - background: conic-gradient( - var(--color-warning-accent) calc(var(--val) * 1%), - var(--color-bg-disabled) 0 - ); - display: grid; - place-items: center; /* Centers the inner content */ -} - -/* Risk meter inner circle - shows the number */ -.risk-meter .inner { - width: 56px; - height: 56px; - border-radius: var(--radius-full); - background: white; - border: 1px solid var(--color-border); - display: grid; - place-items: center; - font-weight: var(--font-weight-bold); -} - -/* ========================================================================== - Progress Bars - ========================================================================== */ - -/* Progress bar row - contains label, bar, and value */ -.progress-row { - display: flex; - align-items: center; - gap: 10px; - margin: 6px 0; -} - -/* Progress bar label - fixed width for alignment */ -.progress-label { - width: 170px; - font-size: var(--font-size-xs); - color: var(--color-secondary); - display: flex; - align-items: center; - gap: var(--spacing-xs); -} - -/* Progress bar container */ -.progress { - position: relative; - flex: 1 1 auto; /* Takes remaining space */ - height: 8px; - border-radius: var(--radius-pill); - background: var(--color-bg-disabled); - overflow: hidden; /* Hides the bar when it's not full */ -} - -/* Progress bar fill - the actual progress */ -.bar { - position: absolute; - left: 0; - top: 0; - height: 100%; - background: var(--color-warning-accent); /* Orange progress */ - border-radius: var(--radius-pill); - transition: width 0.3s ease; /* Smooth width changes */ -} - -/* Progress bar value - shows percentage */ -.value { - width: 32px; - text-align: right; - color: var(--color-secondary); - font-weight: var(--font-weight-normal); - font-size: var(--font-size-xs); -} - -/* ========================================================================== - Lists - ========================================================================== */ - -/* Unstyled list container */ -.list { - margin: 0; - padding: 0; - list-style: none; -} - -/* List item with subtle border */ -.list li { - padding: 6px 0; - border-bottom: 1px solid var(--color-bg-disabled); -} - -/* Remove border from last list item */ -.list li:last-child { - border-bottom: none; -} - -/* ========================================================================== - Info Icon and Tooltip - ========================================================================== */ - -/* Info icon container - relative positioning for tooltip */ -.info-icon-container { - position: relative; - display: inline-block; -} - -/* Info icon - small circular icon */ -.info-icon { - display: inline-flex; - align-items: center; - justify-content: center; - width: 16px; - height: 16px; - font-size: 10px; - cursor: help; - opacity: 0.6; - transition: opacity 0.2s ease; -} - -/* Info icon hover state */ -.info-icon:hover { - opacity: 1; -} - -/* Tooltip - appears on hover */ -.info-tooltip { - position: absolute; - background: var(--color-text); - color: white; - padding: var(--spacing-sm) var(--spacing-md); - border-radius: var(--radius-sm); - font-size: var(--font-size-xs); - line-height: 1.4; - white-space: nowrap; - max-width: 200px; - white-space: normal; - z-index: 1000; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); - animation: tooltipFadeIn 0.2s ease; -} - -/* Tooltip positioning - top (default) */ -.info-tooltip-top { - bottom: calc(100% + 8px); - left: 50%; - transform: translateX(-50%); -} - -/* Tooltip positioning - bottom */ -.info-tooltip-bottom { - top: calc(100% + 8px); - left: 50%; - transform: translateX(-50%); -} - -/* Tooltip positioning - right */ -.info-tooltip-right { - left: calc(100% + 8px); - top: 50%; - transform: translateY(-50%); -} - -/* Tooltip positioning - left */ -.info-tooltip-left { - right: calc(100% + 8px); - top: 50%; - transform: translateY(-50%); -} - -/* Tooltip arrow - small triangle pointing to the icon */ -.info-tooltip::before { - content: ''; - position: absolute; - width: 0; - height: 0; - border: 4px solid transparent; -} - -/* Arrow for top tooltip */ -.info-tooltip-top::before { - top: 100%; - left: 50%; - transform: translateX(-50%); - border-top-color: var(--color-text); -} - -/* Arrow for bottom tooltip */ -.info-tooltip-bottom::before { - bottom: 100%; - left: 50%; - transform: translateX(-50%); - border-bottom-color: var(--color-text); -} - -/* Arrow for right tooltip */ -.info-tooltip-right::before { - right: 100%; - top: 50%; - transform: translateY(-50%); - border-right-color: var(--color-text); -} - -/* Arrow for left tooltip */ -.info-tooltip-left::before { - left: 100%; - top: 50%; - transform: translateY(-50%); - border-left-color: var(--color-text); -} - -/* Tooltip fade-in animation */ -@keyframes tooltipFadeIn { - from { - opacity: 0; - transform: translateX(-50%) translateY(-4px); - } - to { - opacity: 1; - transform: translateX(-50%) translateY(0); - } -} \ No newline at end of file diff --git a/Old Code/vite.config.js b/Old Code/vite.config.js deleted file mode 100644 index 2cdf683..0000000 --- a/Old Code/vite.config.js +++ /dev/null @@ -1,11 +0,0 @@ -import { defineConfig } from 'vite' -import { crx } from '@crxjs/vite-plugin' -import manifest from './manifest.json' assert { type: 'json' } - -export default defineConfig({ - plugins: [crx({ manifest })], - build: { - outDir: 'dist', - sourcemap: false - } -}) diff --git a/Old Code/vite.mockups.config.js b/Old Code/vite.mockups.config.js deleted file mode 100644 index b521eea..0000000 --- a/Old Code/vite.mockups.config.js +++ /dev/null @@ -1,15 +0,0 @@ -import { defineConfig } from 'vite' - -// Standalone Vite config for the mockups website (kept separate from the CRX build) -export default defineConfig({ - root: 'mockups', - build: { - outDir: '../dist-mockups', - emptyOutDir: true, - }, - server: { - port: 5174, - }, -}) - - diff --git a/test server/SERVER_MANAGEMENT.md b/test server/SERVER_MANAGEMENT.md deleted file mode 100644 index 66c41d7..0000000 --- a/test server/SERVER_MANAGEMENT.md +++ /dev/null @@ -1,152 +0,0 @@ -# Server Management Guide - -## Quick Health Check - -Test if your server is running by visiting these URLs in your browser or using curl: - -### From your local machine: -```bash -# Health check (should return {"status":"ok","timestamp":...}) -curl http://69.164.202.138/health - -# Root endpoint (should show API info) -curl http://69.164.202.138/ - -# Test scan endpoint -curl "http://69.164.202.138/scan?domain=example.com" -``` - -### From the remote server: -```bash -# Health check -curl http://localhost/health - -# Or if you need to specify port 80 explicitly -curl http://localhost:80/health -``` - -## How to Start the Server - -### Option 1: Direct Node.js (for testing) -```bash -cd /path/to/test\ server -node server-improved.js -``` - -### Option 2: Using npm start -```bash -cd /path/to/test\ server -npm start -``` - -### Option 3: Using PM2 (Recommended for production - keeps server running) - -**Install PM2 globally:** -```bash -npm install -g pm2 -``` - -**Start the server with PM2:** -```bash -cd /path/to/test\ server -pm2 start server-improved.js --name netstar-shield -``` - -**PM2 Useful Commands:** -```bash -# Check if server is running -pm2 list - -# View logs -pm2 logs netstar-shield - -# Restart server -pm2 restart netstar-shield - -# Stop server -pm2 stop netstar-shield - -# Make PM2 start on system reboot -pm2 startup -pm2 save -``` - -## Check if Server is Running - -### Method 1: Check if port 80 is listening -```bash -# On the remote server -sudo netstat -tulpn | grep :80 -# or -sudo lsof -i :80 -# or -sudo ss -tulpn | grep :80 -``` - -### Method 2: Check Node.js processes -```bash -# Check if node process is running -ps aux | grep node - -# Check if PM2 is managing it -pm2 list -``` - -### Method 3: Test the health endpoint -```bash -# From remote server -curl http://localhost/health - -# From your local machine -curl http://69.164.202.138/health -``` - -## Troubleshooting - -### Server not responding? -1. **Check if server process is running:** - ```bash - ps aux | grep "server-improved" - ``` - -2. **Check server logs:** - - If running with PM2: `pm2 logs netstar-shield` - - If running directly: Check the terminal where you started it - -3. **Check firewall:** - ```bash - # Check if port 80 is open - sudo ufw status - # or - sudo iptables -L - ``` - -4. **Check if port 80 requires sudo:** - - Port 80 requires root privileges - - You may need to run with `sudo` or use a process manager that handles permissions - -### Running on port 80 without sudo -If you can't use sudo, you can: -1. Change PORT to 3000 or another port in server-improved.js -2. Use a reverse proxy (nginx) to forward port 80 to your app port -3. Use `setcap` to allow Node.js to bind to port 80: - ```bash - sudo setcap 'cap_net_bind_service=+ep' $(which node) - ``` - -## Recommended Setup for Production - -1. **Use PM2 to keep server running:** - ```bash - npm install -g pm2 - pm2 start server-improved.js --name netstar-shield - pm2 startup - pm2 save - ``` - -2. **Set up nginx reverse proxy** (if needed for SSL/HTTPS later) - -3. **Monitor logs regularly:** - ```bash - pm2 logs netstar-shield --lines 100 - ``` diff --git a/test server/package-minimal.json b/test server/package-minimal.json deleted file mode 100644 index ac2d7ed..0000000 --- a/test server/package-minimal.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "netstar-shield-server", - "version": "1.0.0", - "description": "NetSTAR Shield Node.js API Server", - "main": "server-improved.js", - "scripts": { - "start": "node server-improved.js" - }, - "keywords": [], - "author": "", - "license": "ISC", - "type": "commonjs", - "dependencies": { - "express": "^5.1.0" - } -} diff --git a/test server/server-improved.js b/test server/server-improved.js deleted file mode 100644 index 9c7652e..0000000 --- a/test server/server-improved.js +++ /dev/null @@ -1,351 +0,0 @@ -const express = require("express"); -const { spawn } = require("child_process"); -const path = require("path"); -const app = express(); - -// Enable CORS for browser extension -app.use((req, res, next) => { - res.header("Access-Control-Allow-Origin", "*"); - res.header("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); - res.header("Access-Control-Allow-Headers", "Content-Type"); - if (req.method === "OPTIONS") { - return res.sendStatus(200); - } - next(); -}); - -// Mapping from scoring engine output to extension indicator IDs -const SCORE_TO_INDICATOR = { - 'Cert_Score': { id: 'cert', name: 'Certificate Health' }, - 'HVAL_Score': { id: 'connection', name: 'Connection Security' }, - 'DNS_Score': { id: 'dns', name: 'DNS Record Health' }, - 'Mail_Score': { id: 'credentials', name: 'Credential Safety' }, - 'Method_Score': { id: 'connection', name: 'Connection Security' }, // Could map differently - 'RDAP_Score': { id: 'domain', name: 'Domain Reputation' }, -}; - -function getStatusFromScore(score) { - if (score >= 75) return 'safe'; - if (score >= 60) return 'warning'; - return 'danger'; -} - -// Parse Python output to extract scores -// First tries to parse as JSON, then falls back to text parsing -function parsePythonOutput(output) { - // Try to parse as JSON first (preferred method) - try { - // Find JSON in output (might have debug text before/after) - const jsonMatch = output.match(/\{[\s\S]*\}/); - if (jsonMatch) { - const jsonData = JSON.parse(jsonMatch[0]); - const scores = {}; - - // Extract individual scores from JSON - if (jsonData.scores) { - for (const [key, value] of Object.entries(jsonData.scores)) { - scores[key] = parseFloat(value); - } - } - - const aggregatedScore = jsonData.Aggregated_Score ? parseFloat(jsonData.Aggregated_Score) : null; - - console.log(`[DEBUG] Successfully parsed JSON output`); - return { scores, aggregatedScore }; - } - } catch (jsonError) { - console.log(`[DEBUG] JSON parsing failed, falling back to text parsing:`, jsonError.message); - } - - // Fallback to text parsing (for backwards compatibility) - const lines = output.split('\n'); - const scores = {}; - let aggregatedScore = null; - - // Look for aggregated score - try multiple patterns - // Pattern 1: "AGGREGATED SECURITY SCORE: 95.5" - let aggMatch = output.match(/AGGREGATED\s+SECURITY\s+SCORE\s*:?\s*([\d.]+)/i); - if (!aggMatch) { - // Pattern 2: "Aggregated Score: 95.5" - aggMatch = output.match(/Aggregated\s+Score\s*:?\s*([\d.]+)/i); - } - if (!aggMatch) { - // Pattern 3: "Total Score: 95.5" or "Overall Score: 95.5" - aggMatch = output.match(/(?:Total|Overall)\s+Score\s*:?\s*([\d.]+)/i); - } - if (aggMatch) { - aggregatedScore = parseFloat(aggMatch[1]); - } - - // Parse individual scores - try multiple patterns - for (const line of lines) { - // Pattern 1: "Cert_Score : 95" or "Cert_Score: 95" - let match = line.match(/^(\w+_Score)\s*:?\s*([\d.]+)/); - if (!match) { - // Pattern 2: "Cert Score: 95" (with space instead of underscore) - match = line.match(/^(\w+)\s+Score\s*:?\s*([\d.]+)/i); - if (match) { - // Convert "Cert Score" to "Cert_Score" format - match[1] = match[1] + '_Score'; - } - } - if (!match) { - // Pattern 3: "Cert: 95" (just the name and score) - match = line.match(/^(Cert|HVAL|DNS|Mail|Method|RDAP)\s*:?\s*([\d.]+)/i); - if (match) { - match[1] = match[1] + '_Score'; - } - } - if (match) { - const scoreKey = match[1]; - const scoreValue = parseFloat(match[2]); - if (!isNaN(scoreValue)) { - scores[scoreKey] = scoreValue; - } - } - } - - return { scores, aggregatedScore }; -} - -// Convert scores to extension format -function formatForExtension(scores, aggregatedScore) { - const indicators = []; - const usedIds = new Set(); - - // Map scores to indicators - for (const [scoreKey, scoreValue] of Object.entries(scores)) { - const mapping = SCORE_TO_INDICATOR[scoreKey]; - if (mapping && !usedIds.has(mapping.id)) { - indicators.push({ - id: mapping.id, - name: mapping.name, - score: Math.round(scoreValue), - status: getStatusFromScore(scoreValue) - }); - usedIds.add(mapping.id); - } - } - - // Fill in missing indicators with default values if needed - const defaultIndicators = [ - { id: 'cert', name: 'Certificate Health', baseOffset: 0 }, - { id: 'connection', name: 'Connection Security', baseOffset: -2 }, - { id: 'domain', name: 'Domain Reputation', baseOffset: -1 }, - { id: 'credentials', name: 'Credential Safety', baseOffset: -3 }, - { id: 'ip', name: 'IP Reputation', baseOffset: 1 }, - { id: 'dns', name: 'DNS Record Health', baseOffset: -1 }, - { id: 'whois', name: 'WHOIS Pattern', baseOffset: 0 } - ]; - - for (const def of defaultIndicators) { - if (!usedIds.has(def.id)) { - // Use aggregated score as base, with small variation per indicator type - // This prevents all missing indicators from having identical scores - const baseScore = aggregatedScore || 75; - const variation = def.baseOffset || 0; - const fallbackScore = Math.max(0, Math.min(100, baseScore + variation)); - indicators.push({ - id: def.id, - name: def.name, - score: Math.round(fallbackScore), - status: getStatusFromScore(fallbackScore) - }); - } - } - - return { - safetyScore: Math.round(aggregatedScore || 75), - indicators, - timestamp: Date.now() - }; -} - -// Main scan endpoint -app.get("/scan", (req, res) => { - const domain = req.query.domain || req.query.url || "netstar.ai"; - - // Extract domain from URL if full URL provided - let targetDomain = domain; - try { - if (domain.includes('://')) { - const url = new URL(domain); - targetDomain = url.hostname; - } - } catch (e) { - // If URL parsing fails, use as-is - } - - console.log(`[${new Date().toISOString()}] Scanning: ${targetDomain}`); - - // Try scoring_main.py first, fallback to score_engine.py - // Look in Scoring Engine folder (parent directory) - const scoringEnginePath = path.join(__dirname, '..', 'Scoring Engine', 'scoring_main.py'); - const scriptPath = path.join(__dirname, 'scoring_main.py'); - const fallbackPath = path.join(__dirname, 'score_engine.py'); - - let pythonScript = scoringEnginePath; - const fs = require('fs'); - if (!fs.existsSync(scoringEnginePath)) { - // Try local directory - if (fs.existsSync(scriptPath)) { - pythonScript = scriptPath; - } else if (fs.existsSync(fallbackPath)) { - pythonScript = fallbackPath; - } else { - console.error(`[ERROR] Python script not found. Tried: ${scoringEnginePath}, ${scriptPath}, ${fallbackPath}`); - } - } - - // Use --json flag for reliable JSON output - const py = spawn("python3", [pythonScript, "-t", targetDomain, "--json"]); - - let output = ""; - let error = ""; - let hasError = false; - - py.stdout.on("data", (data) => { - output += data.toString(); - }); - - py.stderr.on("data", (data) => { - error += data.toString(); - console.error(`Python stderr: ${data}`); - }); - - py.on("close", (code) => { - // Log the raw output for debugging - console.log(`[DEBUG] Python script exit code: ${code}`); - console.log(`[DEBUG] Raw Python stdout (first 2000 chars):`, output.substring(0, 2000)); - if (error) { - console.log(`[DEBUG] Raw Python stderr:`, error); - } - - if (code !== 0 || error.includes("Error") || error.includes("Traceback")) { - console.error(`Python script failed with code ${code}`); - console.error(`Error output: ${error}`); - return res.status(500).json({ - error: true, - message: error || "Scoring engine failed", - safetyScore: 0, - indicators: [], - timestamp: Date.now() - }); - } - - try { - const { scores, aggregatedScore } = parsePythonOutput(output); - - // Debug logging - console.log(`[DEBUG] Parsed individual scores:`, scores); - console.log(`[DEBUG] Parsed aggregated score:`, aggregatedScore); - - if (!aggregatedScore && Object.keys(scores).length === 0) { - console.error(`[ERROR] Failed to parse any scores from Python output`); - console.error(`[ERROR] Full output:`, output); - throw new Error("Could not parse scores from Python output"); - } - - const response = formatForExtension(scores, aggregatedScore); - console.log(`[DEBUG] Final response - safetyScore: ${response.safetyScore}`); - console.log(`[DEBUG] Final indicators:`, response.indicators.map(i => `${i.id}: ${i.score}`).join(', ')); - res.json(response); - } catch (parseError) { - console.error("Parse error:", parseError); - console.error("Python output:", output); - res.status(500).json({ - error: true, - message: `Failed to parse scoring results: ${parseError.message}`, - safetyScore: 0, - indicators: [], - timestamp: Date.now() - }); - } - }); - - // Timeout after 60 seconds - const timeout = setTimeout(() => { - py.kill(); - res.status(504).json({ - error: true, - message: "Scan timeout - scoring engine took too long", - safetyScore: 0, - indicators: [], - timestamp: Date.now() - }); - }, 60000); - - py.on("close", () => { - clearTimeout(timeout); - }); -}); - -// Health check endpoint -app.get("/health", (req, res) => { - res.json({ status: "ok", timestamp: Date.now() }); -}); - -// Root endpoint -app.get("/", (req, res) => { - res.json({ - service: "NetSTAR Shield API", - version: "1.0.0", - endpoints: { - scan: "/scan?domain=example.com", - health: "/health" - } - }); -}); - -const PORT = process.env.PORT || 80; - -// Add error handling for server startup -const server = app.listen(PORT, "0.0.0.0", () => { - console.log(`NetSTAR Shield server running on port ${PORT}`); - console.log(`Health check: http://localhost:${PORT}/health`); - console.log(`Scan endpoint: http://localhost:${PORT}/scan?domain=example.com`); -}); - -// Handle server errors -server.on('error', (error) => { - if (error.code === 'EACCES') { - console.error(`ERROR: Permission denied. Port ${PORT} requires root privileges.`); - console.error(`Try running with: sudo node server-improved.js`); - console.error(`Or use a different port: PORT=3000 node server-improved.js`); - } else if (error.code === 'EADDRINUSE') { - console.error(`ERROR: Port ${PORT} is already in use.`); - console.error(`Check what's using it: sudo lsof -i :${PORT}`); - } else { - console.error(`Server error:`, error); - } - process.exit(1); -}); - -// Handle process termination -process.on('SIGTERM', () => { - console.log('SIGTERM received, shutting down gracefully'); - server.close(() => { - console.log('Server closed'); - process.exit(0); - }); -}); - -process.on('SIGINT', () => { - console.log('\nSIGINT received, shutting down gracefully'); - server.close(() => { - console.log('Server closed'); - process.exit(0); - }); -}); - -// Keep process alive -process.on('uncaughtException', (error) => { - console.error('Uncaught Exception:', error); - server.close(() => { - process.exit(1); - }); -}); - -process.on('unhandledRejection', (reason, promise) => { - console.error('Unhandled Rejection at:', promise, 'reason:', reason); -});