diff --git a/.github/prompts/audit-docs.prompt.md b/.github/prompts/audit-docs.prompt.md index c6f7e76..a6f9c6a 100644 --- a/.github/prompts/audit-docs.prompt.md +++ b/.github/prompts/audit-docs.prompt.md @@ -236,10 +236,38 @@ Execute **all three phases** in order. - **Mandatory File Citations (The "Proof of Work" Rule):** - **Strict Requirement:** You are forbidden from describing technical logic without citing the source file. - - **Placement:** Do not break the reading flow with inline citations. Place links at the very end of the specific section or paragraph. - - **Format:** `Implementation: [filename](./path/to/file)` + - **Citation Hierarchy (Prefer Inline First):** + 1. **Inline (preferred):** Weave the link naturally into the prose so it reads as part of the sentence. This keeps the reading flow intact for human readers. + - ✅ Token validation is handled in [`auth.ts`](../src/auth.ts), which checks the Authorization header on every request. + - ✅ See [`CONTRIBUTING.md`](../CONTRIBUTING.md) for setup steps. + 2. **Footer fallback (`Implementation:`):** Use `Implementation: [filename](./path/to/file)` **only** when the context makes inline linking unnatural — for example, when the surrounding text is a bullet list or a table where no prose sentence exists to embed the link. + - ✅ Use footer when documenting a list of behaviors with no natural sentence to link from. + - **No Redundant Citations:** Never link the same file twice in rapid succession. If it is already linked inline, do not add a footer citation below it. + - ❌ WRONG: `See [CONTRIBUTING.md](../CONTRIBUTING.md). Implementation: [CONTRIBUTING.md](../CONTRIBUTING.md)` - **Enforcement:** If you cannot find the file to link, **do not write about that logic.** You may not document code you cannot link to. +- **File Reference Linking (STRICTLY ENFORCED - ZERO TOLERANCE):** + - **Absolute Rule:** EVERY file reference in documentation MUST be a clickable hyperlink to that file. + - **What Counts as a File Reference:** Any mention of a specific filename, regardless of context: + - Source code files (`.ts`, `.js`, `.go`, `.py`, etc.) + - Configuration files (`.json`, `.yaml`, `.env`, `.toml`, etc.) + - Documentation files (`.md`, `.txt`, `README`, etc.) + - Scripts (`.sh`, `.ps1`, etc.) + - Data files (`.csv`, `.xml`, `.sql`, etc.) + - Build files (`Dockerfile`, `Makefile`, `package.json`, etc.) + - **Required Format:** Use markdown link syntax: `[filename](relative/path/to/file)` + - **Examples of Violations:** + - ❌ WRONG: "The config.json file contains server settings" + - ✅ RIGHT: "The [`config.json`](../config.json) file contains server settings" + - ❌ WRONG: "See server.ts for the implementation" + - ✅ RIGHT: "See [`server.ts`](../src/server.ts) for the implementation" + - ❌ WRONG: "Authentication logic is in auth/middleware.ts" + - ✅ RIGHT: "Authentication logic is in [`auth/middleware.ts`](../auth/middleware.ts)" + - ❌ WRONG: "Set environment variables in .env" + - ✅ RIGHT: "Set environment variables in [`.env`](../.env)" + - **Non-Existent Files:** If you reference a file that doesn't exist in the repository, re-evaluate the statement that relies on that file. Ensure that it is still accurate and verifiable. If not, remove the statement or correct it to reflect the actual codebase. + - **Path Verification:** Before writing a file reference, verify the file exists and use the correct relative path from the documentation file's location. + - **High-Density, Low-Volume:** - Avoid "Wall of Text." Use bullet points and headers to break up density. - Do not narrate code line-by-line. Explain _why_ it exists (architecturally) and _how_ the system uses it. @@ -406,6 +434,9 @@ For any pre-existing content you modified: - _Did I inline a full struct or class definition? (If yes → Replace with link)._ - _Did I insert NEW subjective words? (If yes → Remove them. Preserved existing ones are OK)._ - _Did I cite the file for the logic I explained? (If no → Find file or remove text)._ +- _Did I link inline where the prose naturally allowed it, rather than defaulting to a footer `Implementation:` line?_ +- _Did I add a redundant `Implementation:` footer for a file already linked inline in the same paragraph? (If yes → Remove the footer.)_ +- _Did I reference ANY file (source, config, docs, scripts) without making it a clickable link? (If yes → SEVERE VIOLATION: Add the link immediately or delete the reference.)_ - _Did I create a Mermaid diagram where appropriate for complex systems?_ - _Did I exclude observability from Mermaid diagrams (unless documenting observability systems)?_ - _Did I choose the most appropriate Mermaid diagram type for the structure?_ @@ -415,6 +446,7 @@ If you find any: - **Hallucinations or unverified statements** → Delete immediately, no exceptions - **Statements without exact file citations** → Add citation or delete statement +- **Unlinked file references** (any filename mentioned without a hyperlink) → Add link immediately or delete the reference (ZERO TOLERANCE) - **Internal config variable names** → Trace to external source and correct, or delete - **Observability steps in non-observability docs** (logging, metrics, tracing, monitoring) → Delete - **Trivial validation/utility steps in flows** → Delete diff --git a/.github/prompts/audit-pr.prompt.md b/.github/prompts/audit-pr.prompt.md index 944778d..6bdc7a7 100644 --- a/.github/prompts/audit-pr.prompt.md +++ b/.github/prompts/audit-pr.prompt.md @@ -42,11 +42,13 @@ For **every finding**, output it in this exact format: [Explain clearly why this is a problem: what can go wrong, what rule/best practice it violates, what the risk is.] **Code (current):** + ```language // the problematic snippet ``` **Suggested Fix:** + ```language // the corrected snippet, or pseudocode if a full fix is complex ``` @@ -61,16 +63,16 @@ Before reviewing any code, answer these questions by reading `#activePullRequest - **PR Title & Description:** Does the title accurately describe the change? Is the description complete and clear? - **Linked Ticket (Jira / GitHub Issue):** If a ticket/issue is linked, does the code actually implement what the ticket describes? Call out any gaps, scope creep, or unfinished work. - - For **GitHub Issues**, use: - - `#issue_fetch` - - `#issue_read` - - For **Jira tickets**, use: - - `#getJiraIssue` - - `#getJiraIssueRemoteIssueLinks` - - `#getJiraIssueTypeMetaWithFields` - - `#getJiraProjectIssueTypesMetadata` - - `#searchJiraIssuesUsingJql` - - **Note:** These tools may not be available in all GitHub Copilot environments and may require further set-up. If you cannot access them, do not attempt to call them; instead, infer requirements from the PR title/description, visible ticket links, and any in-PR context. + - For **GitHub Issues**, use: + - `#issue_fetch` + - `#issue_read` + - For **Jira tickets**, use: + - `#getJiraIssue` + - `#getJiraIssueRemoteIssueLinks` + - `#getJiraIssueTypeMetaWithFields` + - `#getJiraProjectIssueTypesMetadata` + - `#searchJiraIssuesUsingJql` + - **Note:** These tools may not be available in all GitHub Copilot environments and may require further set-up. If you cannot access them, do not attempt to call them; instead, infer requirements from the PR title/description, visible ticket links, and any in-PR context. - **Diff Scope:** Are there any files changed that seem unrelated to the PR's stated purpose? - **Breaking Changes:** Does the PR introduce breaking changes without documenting them? - **PR Size:** Is the PR too large to review meaningfully? If so, note it. @@ -114,8 +116,8 @@ Review `#activePullRequest #changes` across all of the following categories. Ski - Is sensitive data encrypted at rest and in transit? - Is the minimum necessary data being collected (data minimization)? - Are there any new logging statements that could leak sensitive user data (emails, names, health data, IDs)? - - Risky: user inputs, API request/response bodies, database records - - Never log: passwords, tokens, API keys, session IDs + - Risky: user inputs, API request/response bodies, database records + - Never log: passwords, tokens, API keys, session IDs - Is role-based access control (RBAC) applied to sensitive data correctly? --- @@ -251,19 +253,24 @@ After all findings, output a structured summary: ## ✅ / 🟡 / 🔴 Overall Verdict: [APPROVED / APPROVED WITH SUGGESTIONS / CHANGES REQUESTED] ### Quick Stats + - **Files reviewed:** X - **Findings:** X Blocking · X Non-blocking · X Suggestions · X Positive callouts ### PR Alignment + [1–3 sentences on whether the code does what the PR/ticket says] ### Top Concerns + [Bullet list of the most critical issues — these are the ones that must be resolved before merge] ### What's Done Well + [Bullet list of genuinely good patterns, decisions, or improvements in this PR] ### Before Merging + - [ ] [Action item 1] - [ ] [Action item 2] - [ ] ... diff --git a/docs/architecture/configs.md b/docs/architecture/configs.md index 027cb7b..3fa5be6 100644 --- a/docs/architecture/configs.md +++ b/docs/architecture/configs.md @@ -2,8 +2,6 @@ This document describes configuration files and environment setup in AlexJSully's Portfolio project, their roles, technical details, and how to update or extend them. -Implementation: [firebase.ts](../../src/configs/firebase.ts), [next.config.js](../../next.config.js) - ## Purpose Configs manage environment variables, service integrations, and global settings for the app. They enable features like Firebase, Sentry error tracking, and custom runtime options. @@ -16,8 +14,8 @@ Configs manage environment variables, service integrations, and global settings - `firebase.test.ts`: Test configuration for Firebase - **Related config files:** - `.env`: Environment variables (API keys, secrets) - - `next.config.js`: Next.js build/runtime config - - `sentry.client.config.ts`, `sentry.server.config.ts`, `sentry.edge.config.ts`: Sentry error tracking + - [`next.config.js`](../../next.config.js): Next.js build/runtime config + - [`sentry.client.config.ts`](../../sentry.client.config.ts), [`sentry.server.config.ts`](../../sentry.server.config.ts), [`sentry.edge.config.ts`](../../sentry.edge.config.ts): Sentry error tracking ## Usage Examples diff --git a/docs/usage/setup.md b/docs/usage/setup.md index 041c130..f769718 100644 --- a/docs/usage/setup.md +++ b/docs/usage/setup.md @@ -45,10 +45,12 @@ This guide walks you through installing, configuring, and running the Alexander - `NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID` - `NEXT_PUBLIC_FIREBASE_APP_ID` - `NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID` - - `NEXT_PUBLIC_SENTRY_DSN` (if Sentry is used in your environment) - Place these keys in a local `.env` file during development. Do not commit `.env` to git. + - `NEXT_PUBLIC_SENTRY_DSN` (if Sentry is used in your environment). + + Set these keys as environment variables during development (commonly via a local untracked `.env` file). Do not commit real secrets to git. + - **Path Aliases:** - - Use TypeScript aliases (see `tsconfig.json`). The project exposes aliases like `@components`, `@data`, `@configs`, `@helpers`, and `@images` for cleaner imports. + - Use TypeScript aliases (see [`tsconfig.json`](../../tsconfig.json)). The project exposes aliases like `@components`, `@data`, `@configs`, `@helpers`, and `@images` for cleaner imports. ## 🧪 Testing & Validation @@ -72,7 +74,6 @@ npm run test:jest ## 📝 Troubleshooting -- See [Troubleshooting Guide](./troubleshooting.md) _(to be added)_ - For help, open an issue or see [README.md](../../README.md) --- diff --git a/package-lock.json b/package-lock.json index 12dae3d..101c94d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@mui/icons-material": "^7.3.8", "@mui/material": "^7.3.8", "@sentry/integrations": "^7.114.0", - "@sentry/nextjs": "^10.38.0", + "@sentry/nextjs": "^10.39.0", "@vercel/speed-insights": "^1.3.1", "firebase": "^12.9.0", "lodash": "^4.17.23", @@ -24,24 +24,24 @@ "webpack": "^5.105.2" }, "devDependencies": { - "@sentry/core": "^10.38.0", - "@sentry/types": "^10.38.0", + "@sentry/core": "^10.39.0", + "@sentry/types": "^10.39.0", "@svgr/webpack": "^8.1.0", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@trivago/prettier-plugin-sort-imports": "^6.0.2", "@types/jest": "^30.0.0", "@types/lodash": "^4.17.23", - "@types/node": "^25.2.3", + "@types/node": "^25.3.0", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", - "caniuse-lite": "^1.0.30001769", + "caniuse-lite": "^1.0.30001770", "concurrently": "^9.2.1", "cypress": "^15.10.0", "cypress-axe": "^1.7.0", "eslint": "^9.39.2", "eslint-config-prettier": "^10.1.8", - "eslint-plugin-cypress": "^5.3.0", + "eslint-plugin-cypress": "^6.0.0", "eslint-plugin-prettier": "^5.5.5", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^7.0.1", @@ -3225,9 +3225,9 @@ "license": "BSD-3-Clause" }, "node_modules/@hapi/tlds": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@hapi/tlds/-/tlds-1.1.5.tgz", - "integrity": "sha512-Vq/1gnIIsvFUpKlDdfrPd/ssHDpAyBP/baVukh3u2KSG2xoNjsnRNjQiPmuyPPGqsn1cqVWWhtZHfOBaLizFRQ==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@hapi/tlds/-/tlds-1.1.6.tgz", + "integrity": "sha512-xdi7A/4NZokvV0ewovme3aUO5kQhW9pQ2YD1hRqZGhhSi5rBv4usHYidVocXSi9eihYsznZxLtAiEYYUL6VBGw==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -6123,50 +6123,50 @@ ] }, "node_modules/@sentry-internal/browser-utils": { - "version": "10.38.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-10.38.0.tgz", - "integrity": "sha512-UOJtYmdcxHCcV0NPfXFff/a95iXl/E0EhuQ1y0uE0BuZDMupWSF5t2BgC4HaE5Aw3RTjDF3XkSHWoIF6ohy7eA==", + "version": "10.39.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-10.39.0.tgz", + "integrity": "sha512-W6WODonMGiI13Az5P7jd/m2lj/JpIyuVKg7wE4X+YdlMehLspAv6I7gRE4OBSumS14ZjdaYDpD/lwtnBwKAzcA==", "license": "MIT", "dependencies": { - "@sentry/core": "10.38.0" + "@sentry/core": "10.39.0" }, "engines": { "node": ">=18" } }, "node_modules/@sentry-internal/feedback": { - "version": "10.38.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-10.38.0.tgz", - "integrity": "sha512-JXneg9zRftyfy1Fyfc39bBlF/Qd8g4UDublFFkVvdc1S6JQPlK+P6q22DKz3Pc8w3ySby+xlIq/eTu9Pzqi4KA==", + "version": "10.39.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-10.39.0.tgz", + "integrity": "sha512-cRXmmDeOr5FzVsBNRLU4WDEuC3fhuD0XV362EWl4DI3XBGao8ukaueKcLIKic5WZx6uXimjWw/UJmDLgxeCqkg==", "license": "MIT", "dependencies": { - "@sentry/core": "10.38.0" + "@sentry/core": "10.39.0" }, "engines": { "node": ">=18" } }, "node_modules/@sentry-internal/replay": { - "version": "10.38.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-10.38.0.tgz", - "integrity": "sha512-YWIkL6/dnaiQyFiZXJ/nN+NXGv/15z45ia86bE/TMq01CubX/DUOilgsFz0pk2v/pg3tp/U2MskLO9Hz0cnqeg==", + "version": "10.39.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-10.39.0.tgz", + "integrity": "sha512-obZoYOrUfxIYBHkmtPpItRdE38VuzF1VIxSgZ8Mbtq/9UvCWh+eOaVWU2stN/cVu1KYuYX0nQwBvdN28L6y/JA==", "license": "MIT", "dependencies": { - "@sentry-internal/browser-utils": "10.38.0", - "@sentry/core": "10.38.0" + "@sentry-internal/browser-utils": "10.39.0", + "@sentry/core": "10.39.0" }, "engines": { "node": ">=18" } }, "node_modules/@sentry-internal/replay-canvas": { - "version": "10.38.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-10.38.0.tgz", - "integrity": "sha512-OXWM9jEqNYh4VTvrMu7v+z1anz+QKQ/fZXIZdsO7JTT2lGNZe58UUMeoq386M+Saxen8F9SUH7yTORy/8KI5qw==", + "version": "10.39.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-10.39.0.tgz", + "integrity": "sha512-TTiX0XWCcqTqFGJjEZYObk93j/sJmXcqPzcu0cN2mIkKnnaHDY3w74SHZCshKqIr0AOQdt1HDNa36s3TCdt0Jw==", "license": "MIT", "dependencies": { - "@sentry-internal/replay": "10.38.0", - "@sentry/core": "10.38.0" + "@sentry-internal/replay": "10.39.0", + "@sentry/core": "10.39.0" }, "engines": { "node": ">=18" @@ -6182,16 +6182,16 @@ } }, "node_modules/@sentry/browser": { - "version": "10.38.0", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-10.38.0.tgz", - "integrity": "sha512-3phzp1YX4wcQr9mocGWKbjv0jwtuoDBv7+Y6Yfrys/kwyaL84mDLjjQhRf4gL5SX7JdYkhBp4WaiNlR0UC4kTA==", + "version": "10.39.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-10.39.0.tgz", + "integrity": "sha512-I50W/1PDJWyqgNrGufGhBYCmmO3Bb159nx2Ut2bKoVveTfgH/hLEtDyW0kHo8Fu454mW+ukyXfU4L4s+kB9aaw==", "license": "MIT", "dependencies": { - "@sentry-internal/browser-utils": "10.38.0", - "@sentry-internal/feedback": "10.38.0", - "@sentry-internal/replay": "10.38.0", - "@sentry-internal/replay-canvas": "10.38.0", - "@sentry/core": "10.38.0" + "@sentry-internal/browser-utils": "10.39.0", + "@sentry-internal/feedback": "10.39.0", + "@sentry-internal/replay": "10.39.0", + "@sentry-internal/replay-canvas": "10.39.0", + "@sentry/core": "10.39.0" }, "engines": { "node": ">=18" @@ -6394,9 +6394,9 @@ } }, "node_modules/@sentry/core": { - "version": "10.38.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-10.38.0.tgz", - "integrity": "sha512-1pubWDZE5y5HZEPMAZERP4fVl2NH3Ihp1A+vMoVkb3Qc66Diqj1WierAnStlZP7tCx0TBa0dK85GTW/ZFYyB9g==", + "version": "10.39.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-10.39.0.tgz", + "integrity": "sha512-xCLip2mBwCdRrvXHtVEULX0NffUTYZZBhEUGht0WFL+GNdNQ7gmBOGOczhZlrf2hgFFtDO0fs1xiP9bqq5orEQ==", "license": "MIT", "engines": { "node": ">=18" @@ -6440,21 +6440,21 @@ } }, "node_modules/@sentry/nextjs": { - "version": "10.38.0", - "resolved": "https://registry.npmjs.org/@sentry/nextjs/-/nextjs-10.38.0.tgz", - "integrity": "sha512-MW2f6mK54jFyS/lmJxT7GWr5d12E+3qvIhR5EdjdyzMX8udSOCGyFJaFIwUfMyEMuggPEvNQVFFpjIrvWXCSGA==", + "version": "10.39.0", + "resolved": "https://registry.npmjs.org/@sentry/nextjs/-/nextjs-10.39.0.tgz", + "integrity": "sha512-u8Wp8V5zA2OTREmBXNm1UNtdQv3oJOH/ZC83tQH8wV8GCJfkSw7qDp89T1fbyMvYKOdQuhT4pxeriHCq8S5L0g==", "license": "MIT", "dependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/semantic-conventions": "^1.37.0", "@rollup/plugin-commonjs": "28.0.1", - "@sentry-internal/browser-utils": "10.38.0", - "@sentry/bundler-plugin-core": "^4.8.0", - "@sentry/core": "10.38.0", - "@sentry/node": "10.38.0", - "@sentry/opentelemetry": "10.38.0", - "@sentry/react": "10.38.0", - "@sentry/vercel-edge": "10.38.0", + "@sentry-internal/browser-utils": "10.39.0", + "@sentry/bundler-plugin-core": "^4.9.0", + "@sentry/core": "10.39.0", + "@sentry/node": "10.39.0", + "@sentry/opentelemetry": "10.39.0", + "@sentry/react": "10.39.0", + "@sentry/vercel-edge": "10.39.0", "@sentry/webpack-plugin": "^4.8.0", "rollup": "^4.35.0", "stacktrace-parser": "^0.1.10" @@ -6467,9 +6467,9 @@ } }, "node_modules/@sentry/node": { - "version": "10.38.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-10.38.0.tgz", - "integrity": "sha512-wriyDtWDAoatn8EhOj0U4PJR1WufiijTsCGALqakOHbFiadtBJANLe6aSkXoXT4tegw59cz1wY4NlzHjYksaPw==", + "version": "10.39.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-10.39.0.tgz", + "integrity": "sha512-dx66DtU/xkCTPEDsjU+mYSIEbzu06pzKNQcDA2wvx7wvwsUciZ5yA32Ce/o6p2uHHgy0/joJX9rP5J/BIijaOA==", "license": "MIT", "dependencies": { "@opentelemetry/api": "^1.9.0", @@ -6502,9 +6502,9 @@ "@opentelemetry/sdk-trace-base": "^2.5.0", "@opentelemetry/semantic-conventions": "^1.39.0", "@prisma/instrumentation": "7.2.0", - "@sentry/core": "10.38.0", - "@sentry/node-core": "10.38.0", - "@sentry/opentelemetry": "10.38.0", + "@sentry/core": "10.39.0", + "@sentry/node-core": "10.39.0", + "@sentry/opentelemetry": "10.39.0", "import-in-the-middle": "^2.0.6", "minimatch": "^9.0.0" }, @@ -6513,14 +6513,14 @@ } }, "node_modules/@sentry/node-core": { - "version": "10.38.0", - "resolved": "https://registry.npmjs.org/@sentry/node-core/-/node-core-10.38.0.tgz", - "integrity": "sha512-ErXtpedrY1HghgwM6AliilZPcUCoNNP1NThdO4YpeMq04wMX9/GMmFCu46TnCcg6b7IFIOSr2S4yD086PxLlHQ==", + "version": "10.39.0", + "resolved": "https://registry.npmjs.org/@sentry/node-core/-/node-core-10.39.0.tgz", + "integrity": "sha512-xdeBG00TmtAcGvXnZNbqOCvnZ5kY3s5aT/L8wUQ0w0TT2KmrC9XL/7UHUfJ45TLbjl10kZOtaMQXgUjpwSJW+g==", "license": "MIT", "dependencies": { "@apm-js-collab/tracing-hooks": "^0.3.1", - "@sentry/core": "10.38.0", - "@sentry/opentelemetry": "10.38.0", + "@sentry/core": "10.39.0", + "@sentry/opentelemetry": "10.39.0", "import-in-the-middle": "^2.0.6" }, "engines": { @@ -6534,15 +6534,38 @@ "@opentelemetry/resources": "^1.30.1 || ^2.1.0", "@opentelemetry/sdk-trace-base": "^1.30.1 || ^2.1.0", "@opentelemetry/semantic-conventions": "^1.39.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@opentelemetry/context-async-hooks": { + "optional": true + }, + "@opentelemetry/core": { + "optional": true + }, + "@opentelemetry/instrumentation": { + "optional": true + }, + "@opentelemetry/resources": { + "optional": true + }, + "@opentelemetry/sdk-trace-base": { + "optional": true + }, + "@opentelemetry/semantic-conventions": { + "optional": true + } } }, "node_modules/@sentry/opentelemetry": { - "version": "10.38.0", - "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-10.38.0.tgz", - "integrity": "sha512-YPVhWfYmC7nD3EJqEHGtjp4fp5LwtAbE5rt9egQ4hqJlYFvr8YEz9sdoqSZxO0cZzgs2v97HFl/nmWAXe52G2Q==", + "version": "10.39.0", + "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-10.39.0.tgz", + "integrity": "sha512-eU8t/pyxjy7xYt6PNCVxT+8SJw5E3pnupdcUNN4ClqG4O5lX4QCDLtId48ki7i30VqrLtR7vmCHMSvqXXdvXPA==", "license": "MIT", "dependencies": { - "@sentry/core": "10.38.0" + "@sentry/core": "10.39.0" }, "engines": { "node": ">=18" @@ -6556,13 +6579,13 @@ } }, "node_modules/@sentry/react": { - "version": "10.38.0", - "resolved": "https://registry.npmjs.org/@sentry/react/-/react-10.38.0.tgz", - "integrity": "sha512-3UiKo6QsqTyPGUt0XWRY9KLaxc/cs6Kz4vlldBSOXEL6qPDL/EfpwNJT61osRo81VFWu8pKu7ZY2bvLPryrnBQ==", + "version": "10.39.0", + "resolved": "https://registry.npmjs.org/@sentry/react/-/react-10.39.0.tgz", + "integrity": "sha512-qxReWHFhDcXNGEyAlYzhR7+K70es+vXaSknTZui1q7TfQwCT1rZlLKn/K8GDpNsb35RC5QhiIphU6pKbyYgZqw==", "license": "MIT", "dependencies": { - "@sentry/browser": "10.38.0", - "@sentry/core": "10.38.0" + "@sentry/browser": "10.39.0", + "@sentry/core": "10.39.0" }, "engines": { "node": ">=18" @@ -6572,13 +6595,13 @@ } }, "node_modules/@sentry/types": { - "version": "10.38.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-10.38.0.tgz", - "integrity": "sha512-DoeyTv/TvnoVDhHgdyv/wehieAKdyjLjEMtPOqqq/AjkP02BxeC0JYUrrWKOjV0wdLq5ZP8jKcCX8GN7awZonQ==", + "version": "10.39.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-10.39.0.tgz", + "integrity": "sha512-tRPFcjnBoljGYCNXql3aJBCLcHreoqXYv3SMr6bpFGY7JIP5HryXuESkEiDI8r3yggeb3TOCjqJ9GaixzEc71g==", "dev": true, "license": "MIT", "dependencies": { - "@sentry/core": "10.38.0" + "@sentry/core": "10.39.0" }, "engines": { "node": ">=18" @@ -6606,14 +6629,14 @@ } }, "node_modules/@sentry/vercel-edge": { - "version": "10.38.0", - "resolved": "https://registry.npmjs.org/@sentry/vercel-edge/-/vercel-edge-10.38.0.tgz", - "integrity": "sha512-lElDFktj/PyRC/LDHejPFhQmHVMCB9Celj+IHi36aw96a/LekqF6/7vmp26hDtH58QtuiPO3h5voqEAMUOkSlw==", + "version": "10.39.0", + "resolved": "https://registry.npmjs.org/@sentry/vercel-edge/-/vercel-edge-10.39.0.tgz", + "integrity": "sha512-73QxAyOSBUpmBc/A8AcJfom/sPN+0thGQRLHzH6uvRxbap2+a3qhKJzQsDkcEUkzY0ScTf2R3j/soYNn1pKlaQ==", "license": "MIT", "dependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/resources": "^2.5.0", - "@sentry/core": "10.38.0" + "@sentry/core": "10.39.0" }, "engines": { "node": ">=18" @@ -7308,12 +7331,12 @@ } }, "node_modules/@types/node": { - "version": "25.2.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.3.tgz", - "integrity": "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==", + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.0.tgz", + "integrity": "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==", "license": "MIT", "dependencies": { - "undici-types": "~7.16.0" + "undici-types": "~7.18.0" } }, "node_modules/@types/parse-json": { @@ -8027,9 +8050,9 @@ } }, "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -8884,9 +8907,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001769", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz", - "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==", + "version": "1.0.30001770", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001770.tgz", + "integrity": "sha512-x/2CLQ1jHENRbHg5PSId2sXq1CIO1CISvwWAj027ltMVG2UNgW+w9oH2+HzgEIRFembL8bUlXtfbBHR1fCg2xw==", "funding": [ { "type": "opencollective", @@ -10295,31 +10318,18 @@ } }, "node_modules/eslint-plugin-cypress": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-5.3.0.tgz", - "integrity": "sha512-qjHF2Sdi3VkXSMnfQeUqsbYnessgc6T2dus/Q1U+e5102GpPy9eLd8MWW2Xp2SS9bMpPNLnSHwktMhCKr0dIBg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-6.0.0.tgz", + "integrity": "sha512-J96t5BLt8lYSiQ5b4vZ2IpUcsAc3XOw9Esy5sFSvgbx4Od/MIwlbXM8QazrcbEKrKKsynOnyXzZwiAQTtGCEyA==", "dev": true, "license": "MIT", "dependencies": { - "globals": "^16.5.0" + "globals": "^17.3.0" }, "peerDependencies": { "eslint": ">=9" } }, - "node_modules/eslint-plugin-cypress/node_modules/globals": { - "version": "16.5.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", - "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint-plugin-prettier": { "version": "5.5.5", "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.5.tgz", @@ -10429,19 +10439,25 @@ } }, "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "version": "2.0.0-next.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.6.tgz", + "integrity": "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -11150,9 +11166,9 @@ } }, "node_modules/get-east-asian-width": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", - "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", + "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", "dev": true, "license": "MIT", "engines": { @@ -14169,25 +14185,12 @@ "node": ">=20" } }, - "node_modules/markdownlint-cli/node_modules/@isaacs/cliui": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-9.0.0.tgz", - "integrity": "sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, "node_modules/markdownlint-cli/node_modules/balanced-match": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.2.tgz", - "integrity": "sha512-x0K50QvKQ97fdEz2kPehIerj+YTeptKF9hyYkKf6egnwmMWAkADiO0QCzSp0R5xN8FTZgYaBfSaue46Ej62nMg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.3.tgz", + "integrity": "sha512-1pHv8LX9CpKut1Zp4EXey7Z8OfH11ONNH6Dhi2WDUt31VVZFXZzKwXcysBgqSumFCmR+0dqjMK5v5JiFHzi0+g==", "dev": true, "license": "MIT", - "dependencies": { - "jackspeak": "^4.2.3" - }, "engines": { "node": "20 || >=22" } @@ -14225,22 +14228,6 @@ "node": ">= 4" } }, - "node_modules/markdownlint-cli/node_modules/jackspeak": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.2.3.tgz", - "integrity": "sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^9.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/markdownlint-cli/node_modules/minimatch": { "version": "10.1.3", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.3.tgz", @@ -14963,10 +14950,10 @@ } }, "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } @@ -15101,6 +15088,25 @@ "license": "MIT", "optional": true }, + "node_modules/node-exports-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", + "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -16597,9 +16603,9 @@ } }, "node_modules/schema-utils/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -17479,9 +17485,9 @@ } }, "node_modules/systeminformation": { - "version": "5.30.8", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.30.8.tgz", - "integrity": "sha512-imB8LwJCc2DkufKlSRHfzbjhheGzpg1P31A4c55IKTq/ll6Agn1rhBOY+WmS/hyg5inGFp7AyZIK0gvq5rFO2Q==", + "version": "5.31.1", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.31.1.tgz", + "integrity": "sha512-6pRwxoGeV/roJYpsfcP6tN9mep6pPeCtXbUOCdVa0nme05Brwcwdge/fVNhIZn2wuUitAKZm4IYa7QjnRIa9zA==", "dev": true, "license": "MIT", "os": [ @@ -18060,9 +18066,9 @@ } }, "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -18447,9 +18453,9 @@ } }, "node_modules/webpack-sources": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", - "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.4.tgz", + "integrity": "sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==", "license": "MIT", "engines": { "node": ">=10.13.0" diff --git a/package.json b/package.json index 736007f..28293b9 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "@mui/icons-material": "^7.3.8", "@mui/material": "^7.3.8", "@sentry/integrations": "^7.114.0", - "@sentry/nextjs": "^10.38.0", + "@sentry/nextjs": "^10.39.0", "@vercel/speed-insights": "^1.3.1", "firebase": "^12.9.0", "lodash": "^4.17.23", @@ -48,24 +48,24 @@ "webpack": "^5.105.2" }, "devDependencies": { - "@sentry/core": "^10.38.0", - "@sentry/types": "^10.38.0", + "@sentry/core": "^10.39.0", + "@sentry/types": "^10.39.0", "@svgr/webpack": "^8.1.0", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@trivago/prettier-plugin-sort-imports": "^6.0.2", "@types/jest": "^30.0.0", "@types/lodash": "^4.17.23", - "@types/node": "^25.2.3", + "@types/node": "^25.3.0", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", - "caniuse-lite": "^1.0.30001769", + "caniuse-lite": "^1.0.30001770", "concurrently": "^9.2.1", "cypress": "^15.10.0", "cypress-axe": "^1.7.0", "eslint": "^9.39.2", "eslint-config-prettier": "^10.1.8", - "eslint-plugin-cypress": "^5.3.0", + "eslint-plugin-cypress": "^6.0.0", "eslint-plugin-prettier": "^5.5.5", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^7.0.1", diff --git a/src/helpers/aaaahhhh.ts b/src/helpers/aaaahhhh.ts index 128cb8b..aed45d6 100644 --- a/src/helpers/aaaahhhh.ts +++ b/src/helpers/aaaahhhh.ts @@ -1,10 +1,7 @@ export const aaaahhhhImage = '/images/aaaahhhh/aaaahhhh.webp'; -/** - * imageAAAAHHHH - */ -export function imageAAAAHHHH() { - /** Document's AAAAHHHH */ +/** imageAAAAHHHH */ +export function imageAAAAHHHH(): void { const docs = document.querySelectorAll('div[style]'); for (const doc of docs) { if (doc.style.backgroundImage) { @@ -12,7 +9,6 @@ export function imageAAAAHHHH() { } } - /** Document's AAAAHHHH part 2 */ const imgs = document.getElementsByTagName('img'); for (const img of imgs) { if (img.src) { @@ -28,9 +24,7 @@ export function imageAAAAHHHH() { const skyElement = document.getElementById('sky'); if (skyElement) { skyElement.style.backgroundImage = `url(${aaaahhhhImage})`; - // No repeat background image skyElement.style.backgroundRepeat = 'no-repeat'; - // Background image is centered and fills the entire element skyElement.style.backgroundSize = 'cover'; } } @@ -40,8 +34,7 @@ export function imageAAAAHHHH() { * @param {String} aaaahhhh AAAAHHHH STRING * @returns {String} aaaahhhh AAAAHHHH STRING */ -export function convertAAAAHH(aaaaahhhh: string) { - /** newAAAAHHHH */ +export function convertAAAAHH(aaaaahhhh: string): string { let newAAAAHHHH = ''; /** AAAAHHHHlength */ @@ -66,18 +59,15 @@ export function convertAAAAHH(aaaaahhhh: string) { } } - if (!newAAAAHHHH || newAAAAHHHH?.length === 0) { + if (!newAAAAHHHH || newAAAAHHHH.length === 0) { newAAAAHHHH = aaaaahhhh; } return newAAAAHHHH; } -/** - * textAAAAHHHH - */ -export function textAAAAHHHH() { - /** AAAAHHHH LIST OF DOCUMENT TAGS */ +/** textAAAAHHHH */ +export function textAAAAHHHH(): void { const docs = [ ...document.getElementsByTagName('span'), ...document.getElementsByTagName('p'), @@ -115,10 +105,8 @@ export function textAAAAHHHH() { } } -/** - * aaaahhhh - */ -export function aaaahhhh() { +/** aaaahhhh */ +export function aaaahhhh(): void { imageAAAAHHHH(); textAAAAHHHH();