Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat/fix: full repo Biome linting and formatting, added tests for PR checking #139

Merged
merged 12 commits into from
Feb 6, 2025

Conversation

evgongora
Copy link
Collaborator

@evgongora evgongora commented Feb 5, 2025

Summary by CodeRabbit

  • New Features
    • Introduced a new GitHub Actions workflow to automate pull request checks for quality, security, and bundle analysis.
  • Chores
    • Removed outdated workflows to streamline CI/CD processes.
  • Refactor & Style
    • Enhanced code formatting and organization across various components for improved readability and maintainability.
    • Updated interfaces and prop types for better type safety and consistency throughout the application.
    • Improved accessibility features across multiple components.
    • Updated button styles for enhanced flexibility and visual design.
    • Refactored components to use consistent semicolon usage and formatting practices.
    • Added new configuration and environment variable files to support application settings and integrations.

Copy link
Contributor

coderabbitai bot commented Feb 5, 2025

Warning

Rate limit exceeded

@evgongora has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 12 minutes and 50 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between 1df0d36 and 5a44ab9.

📒 Files selected for processing (2)
  • .github/workflows/pr-check.yml (1 hunks)
  • frontend/src/app/api/confirm-payment/route.ts (1 hunks)

Walkthrough

This pull request introduces a new GitHub Actions workflow for pull request checks and removes an older workflow. It adds new configuration files such as biome.json and environment examples while updating the gitignore files. Numerous API endpoints have been updated with new interfaces, improved error handling, and refined type usage. Additionally, many frontend pages, UI components, hooks, libraries, and middleware files have been reformatted for consistency, enhanced readability, and better accessibility.

Changes

File(s) Change Summary
.github/workflows/pr-check.yml
.github/workflows/relyance-sci.yml
Added a new PR checking workflow (quality, security, bundle analysis) and removed an old scheduled workflow.
.gitignore
frontend/.gitignore
Updated ignore rules with new entries and explicit exception for environment files.
biome.json
frontend/.env.example
Introduced new configuration and environment example files with defined variables and schema settings.
frontend/next.config.mjs Integrated @next/bundle-analyzer with conditional bundle analysis setup.
frontend/src/app/api/**/* Numerous API endpoints updated: new interfaces added (e.g., AuthUser, SwaggerSpec, SiweResponse, PaymentResponse, etc.), improved error handling, and standardized JSON responses.
frontend/src/app/**/* Frontend pages updated for reordering imports, interface enhancements, layout adjustments, and minor control flow improvements.
frontend/src/components/ui/**/* UI components refactored: changed default exports to named exports, shifted from non-semantic to semantic HTML (e.g., div → button/article), improved formatting and accessibility.
frontend/src/hooks/**/* Hooks refactored for consistent import order, formatting, and structural improvements (e.g., updating useVerification and useAuth).
frontend/src/lib/**/*
frontend/src/middleware.ts
Library and middleware files updated for consistent type imports, function declarations, formatting, and error management.
frontend/src/providers/MiniKitProvider.tsx Refactored to use a new MiniKitProviderProps interface and updated export signature from default to named.

Sequence Diagram(s)

sequenceDiagram
    participant PR as "Pull Request"
    participant QA as "Quality Job"
    participant SA as "Security Job"
    participant BA as "Bundle Analysis Job"

    PR->>QA: Trigger workflow on PR (main, develop)
    QA->>Node: Checkout, setup Node.js & pnpm, install deps, run lint, tests, build
    PR->>SA: Trigger security job
    SA->>Node: Setup, install deps, run security audit & outdated check
    PR->>BA: Trigger bundle analysis job
    BA->>Node: Setup, install deps, build with bundle analysis enabled
    QA-->>PR: Return quality report
    SA-->>PR: Return security report
    BA-->>PR: Return bundle analysis report
Loading

Suggested reviewers

  • bitfalt

Poem

I'm a rabbit on a code trail,
Hopping through syntax with no fail.
New workflows and types lined in a row,
Interfaces and errors set for a smooth flow.
With every semicolon I proudly cheer,
CodeRabbit leaps with joy, my dear!
🐇💻 Hop along, let’s fix bugs with cheer!


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 18

🧹 Nitpick comments (68)
frontend/src/components/ui/ResultCard.tsx (1)

17-58: Enhance accessibility and performance.

Consider the following improvements:

  1. Add aria-expanded attribute to the button for better accessibility
  2. Consider memoizing the click handler with useCallback

Apply this diff to implement the suggestions:

+import { useCallback } from "react";

 export function ResultCard({
   equalityPercentage,
   className = "",
 }: ResultCardProps) {
   const [showDetails, setShowDetails] = useState(false);
+  const handleClick = useCallback(() => setShowDetails(prev => !prev), []);

   return (
     <button
       type="button"
+      aria-expanded={showDetails}
       className={cn(
         "w-full max-w-sm bg-gradient-to-br from-[#387478] to-[#2C5154] text-white rounded-3xl overflow-hidden shadow-lg",
         className,
       )}
-      onClick={() => setShowDetails(!showDetails)}
+      onClick={handleClick}
     >
frontend/src/components/ui/WorldIDButton.tsx (2)

1-12: LGTM! Consider grouping imports by type.

The imports and type declarations are well-structured. The "use client" directive is correctly placed, and the interface is properly typed.

Consider grouping imports in this order:

  1. React and types
  2. External libraries
  3. Internal utilities
  4. Components
  5. Styles (if any)
"use client";

-import { cn } from "@/lib/utils";
-import Image from "next/image";
import type * as React from "react";
import { useState } from "react";
+import Image from "next/image";
+import { cn } from "@/lib/utils";
import { FilledButton } from "./FilledButton";

17-24: Consider enhancing error handling.

While the try/finally block ensures the loading state is reset, adding error handling would improve user experience.

Consider adding error handling:

 const handleClick = async () => {
   setIsLoading(true);
   try {
     await onClick();
+  } catch (error) {
+    console.error('World ID authentication failed:', error);
+    // Consider showing a user-friendly error message
   } finally {
     setIsLoading(false);
   }
 };
frontend/src/app/ideology-test/page.tsx (3)

24-30: Consider enhancing error handling UX.

While the error handling is functional, consider providing more user-friendly error messages and retry mechanisms.

-				console.error("Error loading progress:", error);
+				const errorMessage = error instanceof Error ? error.message : "Failed to load progress";
+				console.error(errorMessage, error);
+				// Show a toast or notification to the user
+				// Add a retry button

Also applies to: 35-78


80-154: Consider memoizing score calculations.

The score calculations in handleEndTest could be memoized to improve performance, especially for tests with many questions.

+	const maxScores = useMemo(() => ({
+		econ: questions.reduce((sum, q) => sum + Math.abs(q.effect.econ), 0),
+		dipl: questions.reduce((sum, q) => sum + Math.abs(q.effect.dipl), 0),
+		govt: questions.reduce((sum, q) => sum + Math.abs(q.effect.govt), 0),
+		scty: questions.reduce((sum, q) => sum + Math.abs(q.effect.scty), 0),
+	}), [questions]);

156-261: Extract common API call logic.

The progress update API calls are duplicated across multiple handlers. Consider extracting this into a reusable function.

+	const updateProgress = async (currentQuestionId: number, updatedScores = scores, answer?: number) => {
+		const response = await fetch(`/api/tests/${testId}/progress`, {
+			method: "POST",
+			headers: {
+				"Content-Type": "application/json",
+			},
+			body: JSON.stringify({
+				currentQuestion: currentQuestionId,
+				scores: updatedScores,
+				...(answer !== undefined && { answer }),
+			}),
+		});
+		if (!response.ok) {
+			throw new Error("Failed to save progress");
+		}
+	};
frontend/src/components/ui/InsightResultCard.tsx (2)

53-60: Remove unnecessary tabIndex from progress bar.

The progress bar already has proper ARIA attributes for accessibility. Adding tabIndex={0} makes it focusable without providing additional value, as it's not an interactive element.

Apply this diff:

<div
	className="h-3 overflow-hidden rounded-full bg-neutral-bg/90 backdrop-blur-sm"
	role="progressbar"
	aria-valuenow={percentage}
	aria-valuemin={0}
	aria-valuemax={100}
-	tabIndex={0}
>

67-69: Move text transformation to CSS.

Instead of using JavaScript for text capitalization, consider using CSS text-transform: capitalize. This approach is more performant and maintainable.

Apply these changes:

-<div className="inline-flex rounded-full bg-emerald-400 px-4 py-1.5 text-sm font-bold text-emerald-950 shadow-md transition-shadow duration-300 hover:shadow-lg sm:text-base">
+<div className="inline-flex rounded-full bg-emerald-400 px-4 py-1.5 text-sm font-bold text-emerald-950 shadow-md transition-shadow duration-300 hover:shadow-lg capitalize sm:text-base">
-	{description.charAt(0).toUpperCase() + description.slice(1)}
+	{description}
</div>
frontend/src/components/ui/ProfileCard.tsx (4)

10-31: Maintain consistent property naming convention.

The User interface mixes naming conventions:

  • Snake case: level_points, last_name
  • Camel case: maxPoints

Consider using consistent camelCase for all properties to align with JavaScript/TypeScript conventions.

interface User {
	name: string;
-	last_name: string;
+	lastName: string;
	level: string;
-	level_points: number;
+	levelPoints: number;
	maxPoints: number;
}

33-45: Enhance accessibility and code organization.

Consider these improvements:

  1. Add aria-label for better screen reader support
  2. Extract size classes into a constant for better maintainability
+const AVATAR_SIZE_CLASSES = "h-16 w-16 sm:h-20 sm:w-20";

function ProfileAvatar({ name, lastName }: ProfileAvatarProps) {
	const initials = useMemo(() => {
		return `${name[0]}${lastName[0]}`.toUpperCase();
	}, [name, lastName]);

	return (
-		<Avatar className="h-16 w-16 border-2 border-white shadow-lg sm:h-20 sm:w-20">
+		<Avatar 
+			className={`${AVATAR_SIZE_CLASSES} border-2 border-white shadow-lg`}
+			aria-label={`Avatar for ${name} ${lastName}`}
+		>
			<AvatarFallback className="bg-white text-lg font-bold text-brand-secondary sm:text-xl">
				{initials}
			</AvatarFallback>
		</Avatar>
	);
}

47-63: Enhance progress bar accessibility.

The progress bar should use proper ARIA roles and attributes for better screen reader support.

function LevelProgress({ points, maxPoints }: LevelProgressProps) {
	const progress = (points / maxPoints) * 100;

	return (
		<div className="w-full max-w-[250px]" aria-label="Level progress">
-			<div className="relative h-2 rounded-full bg-white/30">
+			<div 
+				role="progressbar"
+				aria-valuenow={points}
+				aria-valuemin={0}
+				aria-valuemax={maxPoints}
+				className="relative h-2 rounded-full bg-white/30"
+			>
				<div
					className="absolute left-0 top-0 h-full rounded-full bg-[#E36C59] transition-all duration-300"
					style={{ width: `${progress}%` }}
				/>
			</div>
			<p className="mt-1 text-center font-spaceGrotesk text-xs font-medium text-white">
				{points}/{maxPoints} points to level up
			</p>
		</div>
	);
}

65-107: Extract complex class combinations into constants.

Consider extracting the gradient and shadow classes into named constants for better maintainability.

+const CARD_GRADIENT_CLASSES = "bg-gradient-to-br from-[#387478] to-[#2C5154]";
+const CARD_SHADOW_CLASSES = "shadow-[0_10px_20px_rgba(0,0,0,0.2),_0_6px_6px_rgba(0,0,0,0.25)]";
+const CARD_HOVER_CLASSES = "hover:shadow-[0_14px_28px_rgba(0,0,0,0.25),_0_10px_10px_rgba(0,0,0,0.22)]";
+const CARD_TRANSFORM_CLASSES = "transform hover:scale-105 hover:-translate-y-1 hover:rotate-1";

return (
	<div
		className={cn(
			"w-full max-w-[365px] rounded-[20px]",
+			CARD_GRADIENT_CLASSES,
+			CARD_SHADOW_CLASSES,
+			CARD_HOVER_CLASSES,
+			CARD_TRANSFORM_CLASSES,
-			"bg-gradient-to-br from-[#387478] to-[#2C5154] shadow-lg",
-			"transform hover:scale-105 hover:-translate-y-1 hover:rotate-1",
-			"shadow-[0_10px_20px_rgba(0,0,0,0.2),_0_6px_6px_rgba(0,0,0,0.25)]",
-			"hover:shadow-[0_14px_28px_rgba(0,0,0,0.25),_0_10px_10px_rgba(0,0,0,0.22)]",
			"transition-all duration-300",
			className,
		)}
	>
frontend/next.config.mjs (1)

1-5: LGTM! Consider adding documentation for bundle analysis.

The bundle analyzer integration looks good. Consider adding documentation in the README about:

  • How to enable bundle analysis using the ANALYZE env var
  • How to interpret the bundle analysis results

Also applies to: 30-30

frontend/src/providers/MiniKitProvider.tsx (2)

15-15: Consider adding more context to the error message.

The error message could be more descriptive to help developers understand the impact.

-        throw new Error("NEXT_PUBLIC_WLD_APP_ID is not defined");
+        throw new Error("NEXT_PUBLIC_WLD_APP_ID is not defined. MiniKit functionality will be unavailable.");

24-24: Document the purpose of isolation.

Consider adding a comment explaining why the isolation class is needed.

-  return <div className="relative isolate">{children}</div>;
+  // Use isolation to prevent z-index stacking context issues with MiniKit UI
+  return <div className="relative isolate">{children}</div>;
frontend/src/components/ui/InsightResultTag.tsx (1)

25-30: Consider using an object map for ideology ranges.

The current implementation works but could be more maintainable using an object map.

Consider this alternative implementation:

-  const getIdeology = (scale: number) => {
-    if (scale >= 45 && scale <= 55) return "centrist";
-    if (scale >= 35 && scale < 45) return "moderate";
-    if (scale >= 25 && scale < 35) return "balanced";
-    return "neutral";
-  };
+  const IDEOLOGY_RANGES = {
+    centrist: { min: 45, max: 55 },
+    moderate: { min: 35, max: 44 },
+    balanced: { min: 25, max: 34 },
+  } as const;
+
+  const getIdeology = (scale: number) => {
+    for (const [ideology, range] of Object.entries(IDEOLOGY_RANGES)) {
+      if (scale >= range.min && scale <= range.max) return ideology;
+    }
+    return "neutral";
+  };
frontend/src/app/api/fetch-pay-amount/route.ts (1)

41-44: Consider adding error codes for better error handling.

While the error handling is good, consider adding error codes to help frontend distinguish between different error cases.

 interface PriceResponse {
 	amount?: number;
 	error?: string;
+	code?: 'PRICE_NOT_FOUND' | 'FETCH_ERROR';
 }

 if (!priceRecord) {
-	const response: PriceResponse = { error: "Price not found" };
+	const response: PriceResponse = { 
+		error: "Price not found",
+		code: 'PRICE_NOT_FOUND'
+	};
 	return NextResponse.json(response, { status: 404 });
 }

 catch (error) {
 	console.error("Error fetching subscription price:", error);
 	const response: PriceResponse = {
 		error: "Failed to fetch subscription price",
+		code: 'FETCH_ERROR'
 	};
 	return NextResponse.json(response, { status: 500 });
 }

Also applies to: 52-57

frontend/src/components/BottomNav.tsx (1)

32-60: Consider enhancing accessibility.

While aria-hidden is good for icons, consider adding ARIA labels for navigation links.

 <Link
   key={href}
   href={href}
+  aria-label={href === "/" ? "Home" : href.slice(1).replace("-", " ")}
   className={`flex h-12 w-12 items-center justify-center ${
     active === index ? "text-accent-red" : "text-gray-100"
   }`}
 >
frontend/src/components/ui/QuizCard.tsx (1)

36-43: Add aria-label for better accessibility.

The button could benefit from a more descriptive ARIA label.

 <FilledButton
   variant="default"
   size="sm"
   icon={ArrowRight}
+  aria-label="Start daily questionnaire"
   className="h-8 w-full transform text-xs transition-all duration-300 hover:scale-105"
 >
   Start Quiz
 </FilledButton>
frontend/src/app/api/tests/[testId]/questions/route.ts (1)

32-35: Consider adding error handling for database operations.

While the query structure is good, consider wrapping the database operations in a try-catch block to handle potential database errors separately from other errors.

-		const questions = await xata.db.Questions.filter({ "test.test_id": testId }) // Filter by the test ID
-			.select(["question_id", "question", "effect", "sort_order"]) // Select necessary fields
-			.sort("sort_order", "asc") // Sort by sort_order
-			.getAll();
+		try {
+			const questions = await xata.db.Questions.filter({ "test.test_id": testId })
+				.select(["question_id", "question", "effect", "sort_order"])
+				.sort("sort_order", "asc")
+				.getAll();
+		} catch (dbError) {
+			console.error("Database error:", dbError);
+			const response: QuestionResponse = { error: "Database operation failed" };
+			return NextResponse.json(response, { status: 500 });
+		}
frontend/src/app/api/complete-siwe/route.ts (1)

25-29: Good debugging support with detailed logging!

The extensive logging will help in troubleshooting SIWE verification issues. However, consider redacting sensitive data in production logs.

-		console.log("SIWE verification request:", {
-			payload,
-			nonce,
-			storedNonce,
-		});
+		console.log("SIWE verification request:", {
+			hasPayload: !!payload,
+			hasNonce: !!nonce,
+			hasStoredNonce: !!storedNonce,
+		});

Also applies to: 32-37

frontend/src/app/api/home/route.ts (1)

63-64: Consider making the level string configurable.

The hardcoded string "- Coming Soon" should be moved to a configuration or constants file.

+const LEVEL_SUFFIX = "- Coming Soon";
+
 const response: UserResponse = {
   user: {
     name: user.name,
     last_name: user.last_name,
     verified: user.verified,
-    level: `${user.level} - Coming Soon`,
+    level: `${user.level} ${LEVEL_SUFFIX}`,
     points: user.level_points,
     maxPoints: 100,
   },
 };
frontend/src/app/api/tests/[testId]/instructions/route.ts (1)

73-79: Consider adding error details for debugging.

While the error handling is good, consider including more details in the error logging for better debugging.

-console.error("Error fetching test instructions:", error);
+console.error("Error fetching test instructions:", {
+  error,
+  testId: params.testId,
+  stack: error instanceof Error ? error.stack : undefined
+});
frontend/src/components/ui/SearchBar.tsx (1)

52-55: Consider debouncing the search.

The search might trigger too frequently. Consider adding debounce to improve performance.

+import { useCallback } from "react";
+import debounce from "lodash/debounce";

 const handleClear = () => {
   setSearchQuery("");
   onSearch("");
 };

+const debouncedSearch = useCallback(
+  debounce((query: string) => {
+    onSearch(query);
+  }, 300),
+  [onSearch]
+);
frontend/src/app/api/user/subscription/route.ts (2)

44-47: Consider moving environment validation.

Consider moving the environment variable validation to a separate initialization file to fail fast during startup.

+// src/lib/config.ts
+export const config = {
+  JWT_SECRET: process.env.JWT_SECRET || (() => {
+    throw new Error("JWT_SECRET environment variable is required")
+  })()
+};

-const JWT_SECRET = process.env.JWT_SECRET;
-if (!JWT_SECRET) {
-  throw new Error("JWT_SECRET environment variable is required");
-}
+import { config } from "@/lib/config";
+const secret = new TextEncoder().encode(config.JWT_SECRET);

96-100: Consider using a date formatting library.

For consistent date formatting across the application, consider using a library like date-fns.

+import { format } from "date-fns";

-const nextPaymentDate = user.subscription_expires
-  .toISOString()
-  .split("T")[0];
+const nextPaymentDate = format(user.subscription_expires, "yyyy-MM-dd");
frontend/src/app/not-found.tsx (1)

64-66: Consider using Next.js router.

Instead of directly manipulating window.location, consider using Next.js's useRouter for better integration with the framework.

+import { useRouter } from "next/navigation";

 export default function NotFound() {
+  const router = useRouter();
   return (
     // ...
     <button
       onClick={() => {
-        window.location.href = "/";
+        router.push("/");
       }}
     >
frontend/src/middleware.ts (3)

27-31: Consider adding JSDoc comments for the JWTPayload interface.

Adding documentation for the interface would improve code maintainability and help other developers understand the expected structure of the JWT payload.

+/**
+ * Interface representing the structure of a JWT payload
+ * @property {string} [walletAddress] - The wallet address of the user
+ * @property {string} [sub] - The subject identifier
+ * @property {number} [exp] - The expiration timestamp
+ */
 interface JWTPayload {
   walletAddress?: string;
   sub?: string;
   exp?: number;
 }

34-59: Consider enhancing token verification with additional security checks.

The token verification could be strengthened by:

  1. Validating the expiration timestamp
  2. Adding audience validation if applicable
  3. Implementing token revocation check
 async function verifyToken(token: string) {
   try {
     if (!token || typeof token !== "string") {
       return null;
     }

     const verified = await jwtVerify(token, secret, {
       algorithms: ["HS256"],
     });

     // Validate payload structure
     const payload = verified.payload as JWTPayload;
     if (!payload || typeof payload !== "object") {
       return null;
     }

     // Ensure required fields exist
     if (!payload.walletAddress || !payload.sub) {
       return null;
     }

+    // Validate expiration
+    if (payload.exp && Date.now() >= payload.exp * 1000) {
+      return null;
+    }
+
+    // Add audience validation if applicable
+    // if (!payload.aud || payload.aud !== expectedAudience) {
+    //   return null;
+    // }
+
+    // Implement token revocation check if needed
+    // const isRevoked = await checkTokenRevocation(token);
+    // if (isRevoked) {
+    //   return null;
+    // }

     return payload;
   } catch {
     return null;
   }
 }

98-108: Consider adding type safety for request headers.

The current implementation could benefit from type-safe header names to prevent typos and ensure consistency.

+const HEADER_USER_ID = "x-user-id";
+const HEADER_WALLET_ADDRESS = "x-wallet-address";

 if (pathname.startsWith("/api/")) {
   const requestHeaders = new Headers(request.headers);
-  requestHeaders.set("x-user-id", decoded.sub as string);
-  requestHeaders.set("x-wallet-address", decoded.walletAddress as string);
+  requestHeaders.set(HEADER_USER_ID, decoded.sub as string);
+  requestHeaders.set(HEADER_WALLET_ADDRESS, decoded.walletAddress as string);

   return NextResponse.next({
     request: {
       headers: requestHeaders,
     },
   });
 }
frontend/src/app/api/insights/route.ts (2)

7-19: Consider adding validation constraints to interfaces.

The interfaces could benefit from additional validation constraints using JSDoc or TypeScript features.

 interface TokenPayload extends JWTPayload {
+  /** Ethereum wallet address in the format 0x... */
   address?: string;
 }

 interface Test {
+  /** Unique identifier for the test */
   test_id: number;
+  /** Optional name of the test */
   test_name?: string;
 }

 interface InsightResponse {
+  /** Array of tests with insights. Empty array if no insights are found. */
   tests?: Test[];
+  /** Error message if the request fails */
   error?: string;
 }

94-104: Consider using a Set for better performance.

Since you're only interested in unique test IDs, using a Set might be more efficient than a Map.

-// Create a map to store unique tests
-const uniqueTests = new Map<number, Test>();
+// Create a set to store unique tests
+const uniqueTests = new Set<Test>();

 for (const insight of testsWithInsights) {
   if (insight.test?.test_id) {
-    uniqueTests.set(insight.test.test_id, {
+    uniqueTests.add({
       test_id: insight.test.test_id,
       test_name: insight.test.test_name,
     });
   }
 }

 const response: InsightResponse = {
-  tests: Array.from(uniqueTests.values()),
+  tests: Array.from(uniqueTests),
 };
frontend/src/app/api/initiate-payment/route.ts (1)

99-107: Consider adding SameSite and Domain attributes to the cookie.

The cookie configuration could be enhanced with additional security attributes.

 cookies().set({
   name: "payment-nonce",
   value: uuid,
   httpOnly: true,
   secure: true,
   sameSite: "strict",
   path: "/",
   maxAge: 3600, // 1 hour expiry
+  // Consider adding these attributes based on your deployment environment
+  // domain: process.env.COOKIE_DOMAIN,
+  // partitioned: true, // For cross-site isolation
 });
frontend/src/components/LayoutContent.tsx (2)

32-44: Consider extracting page state logic into a custom hook.

The page state logic could be moved to a custom hook for better reusability and separation of concerns.

+// In a new file: hooks/usePageState.ts
+export function usePageState() {
+  const pathname = usePathname();
+
+  return useMemo(
+    () => ({
+      isSignInPage: pathname === "/sign-in",
+      isRegisterPage: pathname === "/register",
+      isWelcomePage: pathname === "/welcome",
+      isTestInstructions: pathname === "/tests/instructions",
+      isIdeologyTest: pathname.includes("/ideology-test"),
+      isHomePage: pathname === "/",
+      isSettingsPage: pathname === "/settings",
+      isResultsPage: pathname === "/results",
+    }),
+    [pathname],
+  );
+}

// In LayoutContent.tsx
-const pageStates = useMemo(
-  () => ({
-    isSignInPage: pathname === "/sign-in",
-    isRegisterPage: pathname === "/register",
-    isWelcomePage: pathname === "/welcome",
-    isTestInstructions: pathname === "/tests/instructions",
-    isIdeologyTest: pathname.includes("/ideology-test"),
-    isHomePage: pathname === "/",
-    isSettingsPage: pathname === "/settings",
-    isResultsPage: pathname === "/results",
-  }),
-  [pathname],
-);
+const pageStates = usePageState();

68-77: Consider using a lookup object for background variants.

The background variant logic could be simplified using a lookup object.

+const BACKGROUND_VARIANTS: Record<string, BackgroundVariant> = {
+  "/sign-in": "signin",
+  "/": "home",
+  "/settings": "settings",
+  "/results": "results",
+};

 const getBackgroundVariant = (): BackgroundVariant => {
-  const { isSignInPage, isHomePage, isSettingsPage, isResultsPage } =
-    pageStates;
-
-  if (isSignInPage) return "signin";
-  if (isHomePage) return "home";
-  if (isSettingsPage) return "settings";
-  if (isResultsPage) return "results";
-  return "default";
+  return BACKGROUND_VARIANTS[pathname] || "default";
 };
frontend/src/app/api/confirm-payment/route.ts (1)

21-23: Consider extending TokenPayload interface

The TokenPayload interface could be more comprehensive by including other potential JWT fields.

 interface TokenPayload extends JWTPayload {
   address?: string;
+  exp?: number;
+  iat?: number;
+  sub?: string;
 }
frontend/src/app/results/page.tsx (2)

37-44: Move data transformation logic to a separate function.

The data transformation logic inside useEffect is complex and should be extracted for better maintainability and testability.

+const transformTestData = (test: Test) => ({
+  title: test.testName || "Political Values Test",
+  backgroundColor: "#387478",
+  iconBgColor: "#2C5154",
+  Icon: Globe,
+  isEnabled: true,
+  testId: test.testId,
+});

 useEffect(() => {
   const fetchResults = async () => {
     try {
       const response = await fetch("/api/tests");
       const data = await response.json();
-      const transformedResults = data.tests.map((test: Test) => ({
-        title: test.testName || "Political Values Test",
-        backgroundColor: "#387478",
-        iconBgColor: "#2C5154",
-        Icon: Globe,
-        isEnabled: true,
-        testId: test.testId,
-      }));
+      const transformedResults = data.tests.map(transformTestData);

119-146: Optimize animation performance.

Multiple motion.div components with individual animations could impact performance. Consider using AnimatePresence for list animations and reducing individual animations.

frontend/src/app/api/insights/[testId]/route.ts (1)

71-76: Consider moving JWT secret initialization to a shared utility.

Since JWT secret initialization is common across multiple API routes, consider extracting it to a shared utility to maintain DRY principles.

frontend/src/app/api/tests/[testId]/progress/route.ts (2)

34-97: Consider adding rate limiting.

The GET endpoint might benefit from rate limiting to prevent abuse, especially since it's fetching user progress data.


99-187: Validate request body schema.

While the endpoint handles various error cases well, consider adding explicit validation for the request body schema to catch malformed requests early.

 const body = await request.json();
+const requiredFields = ['questionId', 'answer', 'currentQuestion', 'scores'];
+const missingFields = requiredFields.filter(field => !(field in body));
+if (missingFields.length > 0) {
+  const response: ProgressResponse = { 
+    error: `Missing required fields: ${missingFields.join(', ')}` 
+  };
+  return NextResponse.json(response, { status: 400 });
+}
 const { questionId, answer, currentQuestion, scores } = body;
frontend/src/app/(home)/page.tsx (3)

16-29: Consider using zod for runtime type validation.

Since the User interface contains critical fields, consider using zod to validate the shape of the data at runtime.


31-85: Add error boundary for better error handling.

Consider wrapping the component with an error boundary to gracefully handle runtime errors.

+import { ErrorBoundary } from '@/components/ErrorBoundary';

 export default function Home() {
+  return (
+    <ErrorBoundary fallback={<div>Something went wrong</div>}>
+      <HomeContent />
+    </ErrorBoundary>
+  );
+}

+function HomeContent() {
   const router = useRouter();
   // ... rest of the component

87-192: Consider extracting animation variants.

The framer-motion animation configurations are repeated. Consider extracting them into reusable variants.

+const fadeInUp = {
+  initial: { y: 20, opacity: 0 },
+  animate: { y: 0, opacity: 1 },
+  transition: { duration: 0.5 }
+};

+const scaleIn = {
+  initial: { scale: 0.95, opacity: 0 },
+  animate: { scale: 1, opacity: 1 },
+  transition: { duration: 0.3 }
+};

 <motion.div
-  initial={{ y: 20, opacity: 0 }}
-  animate={{ y: 0, opacity: 1 }}
-  transition={{ duration: 0.5 }}
+  {...fadeInUp}
 >
frontend/src/app/api/verify/route.ts (2)

153-162: Consider moving app_id validation to startup.

The app_id validation could be moved to application startup to fail fast if misconfigured.


163-214: Add logging for successful verifications.

Consider adding structured logging for successful verifications to help with monitoring and analytics.

 await xata.db.Users.update(user.xata_id, {
   verified: true,
   updated_at: new Date().toISOString(),
 });

+console.log(JSON.stringify({
+  event: 'user_verified',
+  user_id: user.xata_id,
+  verification_level: payload.verification_level
+}));

 const response: VerifyResponse = {
frontend/src/app/api/tests/[testId]/results/route.ts (2)

167-169: Consider adding range validation for test scores.

The code assumes scores are valid but doesn't validate their ranges. Consider adding validation to ensure scores are within expected bounds.

 // Round all scores to integers
 for (const cs of categoryScores) {
+  if (cs.score < 0 || cs.score > 100) {
+    const response: ResultResponse = { error: "Invalid score range" };
+    return NextResponse.json(response, { status: 400 });
+  }
   cs.score = Math.round(cs.score);
 }

193-201: Consider using an enum for range descriptions.

The range descriptions could be defined as an enum to ensure consistency and prevent typos.

+enum ScoreRange {
+  Neutral = "neutral",
+  Centrist = "centrist",
+  Moderate = "moderate",
+  Balanced = "balanced",
+}

 // Get range description based on score
-let range = "neutral";
+let range = ScoreRange.Neutral;
 if (categoryScore.score >= 45 && categoryScore.score <= 55) {
-  range = "centrist";
+  range = ScoreRange.Centrist;
 } else if (categoryScore.score >= 35 && categoryScore.score < 45) {
-  range = "moderate";
+  range = ScoreRange.Moderate;
 } else if (categoryScore.score >= 25 && categoryScore.score < 35) {
-  range = "balanced";
+  range = ScoreRange.Balanced;
 }
frontend/src/app/api/tests/route.ts (1)

211-213: Consider using a type guard for answers validation.

The type assertion for answers could be replaced with a type guard for better type safety.

+function isAnswersRecord(answers: unknown): answers is Record<string, unknown> {
+  return typeof answers === 'object' && answers !== null;
+}

 const answeredQuestions = userProgress?.answers
-  ? Object.keys(userProgress.answers as Record<string, unknown>).length
+  ? Object.keys(isAnswersRecord(userProgress.answers) ? userProgress.answers : {}).length
   : 0;
frontend/src/app/api/ideology/route.ts (2)

35-48: Consider memoizing the similarity calculation function.

The calculateSimilarity function could be memoized to avoid recalculating the same values multiple times.

+const memoizedCalculateSimilarity = (() => {
+  const cache = new Map<string, number>();
+  return (userScores: UserScores, ideologyScores: UserScores): number => {
+    const key = JSON.stringify({ userScores, ideologyScores });
+    if (cache.has(key)) {
+      return cache.get(key)!;
+    }
+    const result = calculateSimilarity(userScores, ideologyScores);
+    cache.set(key, result);
+    return result;
+  };
+})();

150-152: Consider validating score ranges.

The score validation could be more comprehensive by checking if the scores are numbers and within valid ranges.

-scores.some(
-  (score) => score < 0 || score > 100 || !Number.isFinite(score),
-)
+scores.some((score) => {
+  if (typeof score !== 'number') return true;
+  if (!Number.isFinite(score)) return true;
+  if (score < 0 || score > 100) return true;
+  return false;
+})
frontend/src/app/settings/page.tsx (3)

72-74: Consider providing more specific error feedback.

Instead of silently handling errors, consider showing a user-friendly error message.

-// Error handling is done via the UI loading state
+setError("Failed to load subscription data. Please try again later.");

79-93: Consider debouncing the visibility change handler.

The visibility change handler could trigger multiple rapid fetches. Consider debouncing it.

+import { debounce } from 'lodash';

-const handleVisibilityChange = () => {
+const handleVisibilityChange = debounce(() => {
   if (document.visibilityState === "visible") {
     void fetchSettings();
   }
-};
+}, 1000);

210-226: Consider extracting settings configuration to a separate file.

The settings array could be moved to a configuration file for better maintainability.

+// settings.config.ts
+export const settingsConfig: SettingItem[] = [
+  {
+    Icon: Bell,
+    label: "Notifications",
+    element: <NotificationsToggle />,
+  },
+  // ... other settings
+];

-{(
-  [
-    {
-      Icon: Bell,
-      label: "Notifications",
-      element: <NotificationsToggle />,
-    },
-    // ... other settings
-  ] as SettingItem[]
-).map((setting, index) => (
+{settingsConfig.map((setting, index) => (
frontend/src/app/awaken-pro/page.tsx (2)

16-105: Consider extracting payment logic into a custom hook.

The payment processing logic could be moved to a custom hook (e.g., useProUpgrade) to improve reusability and maintainability.

This would:

  • Separate business logic from UI
  • Make the component more focused
  • Enable reuse in other components

253-256: Enhance loading state feedback.

The current loading state only shows "Processing..." which could be more informative.

Consider adding step indicators:

-<span>Processing</span>
+<span>
+  {isProcessing && finalPayload ? "Confirming Payment" : "Initiating Payment"}
+</span>
frontend/src/app/api/user/route.ts (3)

89-95: Replace type assertion with type guard.

Using type assertion (as TokenPayload) is less safe than using a type guard.

Consider using a type guard:

-const typedPayload = payload as TokenPayload;
+function isTokenPayload(payload: unknown): payload is TokenPayload {
+  return typeof payload === 'object' && payload !== null && 'address' in payload;
+}
+
+if (!isTokenPayload(payload)) {
+  const response: UserResponse = { error: "Invalid token payload" };
+  return NextResponse.json(response, { status: 401 });
+}

307-313: Enhance error logging and response consistency.

Error logging could be more detailed and error responses more consistent.

Consider adding:

  • Error codes
  • More detailed logging
  • Consistent error structure
-console.error("Error creating user:", error);
+const errorDetails = error instanceof Error ? error.message : "Unknown error";
+console.error("Error creating user:", {
+  error: errorDetails,
+  userId: nextUserId,
+  walletAddress: data.wallet_address
+});
+
-return new NextResponse(
-  JSON.stringify({ error: "Failed to create user profile" }),
-  { status: 500 },
-);
+return new NextResponse(
+  JSON.stringify({
+    error: "Failed to create user profile",
+    code: "USER_CREATION_ERROR",
+    details: process.env.NODE_ENV === "development" ? errorDetails : undefined
+  }),
+  { status: 500 },
+);

28-35: Enhance input validation robustness.

The validation functions could be more robust and maintainable.

Consider:

  • Moving regex patterns to constants
  • Adding more comprehensive validation
+const VALIDATION_PATTERNS = {
+  EMAIL: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
+  WALLET_ADDRESS: /^0x[a-fA-F0-9]{40}$/,
+  USERNAME: /^[a-zA-Z0-9_-]{3,30}$/
+} as const;

const validateEmail = (email: string): boolean =>
-  /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
+  VALIDATION_PATTERNS.EMAIL.test(email.trim());

const validateWalletAddress = (address: string): boolean =>
-  /^0x[a-fA-F0-9]{40}$/.test(address);
+  VALIDATION_PATTERNS.WALLET_ADDRESS.test(address.toLowerCase());
biome.json (2)

3-7: Consider enabling VCS integration.

The VCS integration is currently disabled. Enabling it would allow Biome to respect .gitignore patterns automatically.

  "vcs": {
-   "enabled": false,
+   "enabled": true,
    "clientKind": "git",
-   "useIgnoreFile": false
+   "useIgnoreFile": true
  }

40-60: Consider additional linting rules for React best practices.

The current linting rules are good but could be enhanced with React-specific rules:

  • react-hooks/*: Enforce Rules of Hooks
  • jsx-a11y/*: Ensure accessibility
  "linter": {
    "rules": {
      "recommended": true,
+     "react": {
+       "useHookAtTopLevel": "error",
+       "noUnusedStyles": "error"
+     },
+     "a11y": {
+       "useKeyWithClickEvents": "error",
+       "useAltText": "error"
+     },
      // ... existing rules
    }
  }
.github/workflows/pr-check.yml (1)

89-117: Enhance bundle analysis job.

The bundle analysis job could be improved:

  1. Add artifact upload for the bundle report
  2. Consider adding size limits
      - name: Build and analyze bundle
        working-directory: frontend
        run: pnpm build
        env:
          ANALYZE: true
          BUNDLE_ANALYZE_MODE: 'static'
          BUNDLE_ANALYZE_REPORT: 'bundle-analysis.html'
+
+     - name: Upload bundle analysis
+       uses: actions/upload-artifact@v4
+       with:
+         name: bundle-analysis
+         path: frontend/bundle-analysis.html
+
+     - name: Check bundle size limits
+       run: |
+         if [ $(stat -f%z frontend/.next/static/chunks/*.js | sort -n | tail -n1) -gt 500000 ]; then
+           echo "Bundle size exceeds 500KB limit"
+           exit 1
+         fi
🧰 Tools
🪛 YAMLlint (1.35.1)

[error] 92-92: trailing spaces

(trailing-spaces)


[error] 95-95: trailing spaces

(trailing-spaces)


[error] 100-100: trailing spaces

(trailing-spaces)


[error] 106-106: trailing spaces

(trailing-spaces)


[error] 109-109: trailing spaces

(trailing-spaces)


[error] 117-117: no new line character at the end of file

(new-line-at-end-of-file)


[error] 117-117: trailing spaces

(trailing-spaces)

frontend/src/app/sign-in/page.tsx (2)

31-36: Improve cookie clearing logic.

The current cookie clearing approach could be more robust.

-    for (const c of document.cookie.split(";")) {
-      document.cookie = `${c.replace(/^ +/, "").replace(/=.*/, "=;expires=")}${new Date().toUTCString()};path=/`;
-    }
+    document.cookie.split(";").forEach((c) => {
+      const [name] = c.split("=");
+      document.cookie = `${name.trim()}=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/`;
+      document.cookie = `${name.trim()}=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/;domain=${window.location.hostname}`;
+    });

209-241: Enhance error handling specificity.

The error handling could be more specific to help users understand and resolve issues.

      if (
        error instanceof Error &&
-       error.message === "Authentication cancelled"
+       error.message.toLowerCase().includes("cancelled") ||
+       error.message.toLowerCase().includes("rejected")
      ) {
-       setError("Authentication was cancelled");
+       setError("Authentication was cancelled. Please try again.");
        return;
      }

      console.error("WorldID auth failed:", {
        error,
        message: error instanceof Error ? error.message : "Unknown error",
        stack: error instanceof Error ? error.stack : undefined,
        type: error?.constructor?.name,
        code: error instanceof DOMException ? error.code : undefined,
        name: error instanceof DOMException ? error.name : undefined,
      });

-     let errorMessage = "Authentication failed";
+     let errorMessage = "Authentication failed. ";
      if (error instanceof Error) {
        if (error.message === "Invalid SIWE message format") {
-         errorMessage =
-           "Failed to create authentication message. Please try again.";
+         errorMessage = "Invalid authentication format. Please update your World ID app and try again.";
        } else {
          errorMessage = error.message;
        }
      }
frontend/src/app/insights/page.tsx (2)

38-106: Enhance error handling and loading state management.

The fetchInsights function makes multiple API calls but could benefit from more robust error handling:

  1. Consider using a custom error type instead of generic Error
  2. Add retry logic for transient failures
  3. Implement proper error boundaries
 useEffect(() => {
+  const MAX_RETRIES = 3;
+  const RETRY_DELAY = 1000;
+
   async function fetchInsights() {
+    let retries = 0;
     try {
-      // Check user's pro status
-      const userResponse = await fetch("/api/user/subscription");
+      const fetchWithRetry = async (url: string, options?: RequestInit) => {
+        while (retries < MAX_RETRIES) {
+          try {
+            const response = await fetch(url, options);
+            if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
+            return response;
+          } catch (error) {
+            retries++;
+            if (retries === MAX_RETRIES) throw error;
+            await new Promise(resolve => setTimeout(resolve, RETRY_DELAY * retries));
+          }
+        }
+      };
+
+      const userResponse = await fetchWithRetry("/api/user/subscription");

112-114: Add loading states for better UX.

Consider showing loading states for individual sections instead of a single global loading spinner.

-if (loading) {
-  return <LoadingSpinner />;
-}
+const LoadingSection = () => (
+  <div className="animate-pulse space-y-4">
+    <div className="h-8 bg-gray-200 rounded w-3/4"></div>
+    <div className="h-4 bg-gray-200 rounded w-1/2"></div>
+  </div>
+);
+
+return (
+  <div className="min-h-screen bg-neutral-bg">
+    {loading ? (
+      <LoadingSection />
+    ) : (
+      // ... rest of the component
+    )}
+  </div>
+);
frontend/src/app/register/page.tsx (2)

91-102: Enhance type safety for user data.

Consider creating a dedicated type for the user data structure and using zod for runtime validation.

+import { z } from 'zod';
+
+const UserDataSchema = z.object({
+  name: z.string().min(2).max(50),
+  last_name: z.string().min(2).max(50),
+  email: z.string().email(),
+  age: z.number().min(18).max(120),
+  subscription: z.boolean(),
+  wallet_address: z.string().regex(/^0x[a-fA-F0-9]{40}$/),
+  username: z.string().optional(),
+  country: z.string()
+});
+
+type UserData = z.infer<typeof UserDataSchema>;

-const userData = {
+const userData: UserData = {
   name: formData.name,
   last_name: formData.lastName,
   email: formData.email,
   age: Number.parseInt(formData.age),
   subscription: false,
   wallet_address: walletAddress,
   username,
   country:
     COUNTRIES.find((c) => c.countryCode === formData.country)?.country ||
     "Costa Rica",
 };

279-298: Add proper form validation feedback.

The age select input should provide immediate feedback on invalid selections.

 <select
   id="age"
   name="age"
   required
   value={formData.age}
+  aria-invalid={formData.age !== "" && (parseInt(formData.age) < 18 || parseInt(formData.age) > 120)}
+  aria-describedby="age-error"
   onChange={(e) =>
     setFormData({ ...formData, age: e.target.value })
   }
   className="h-[30px] bg-[#d9d9d9] rounded-[20px] border-0 px-3 w-full text-black"
 >
   <option value="" className="text-gray-500">
     Select age
   </option>
   {Array.from({ length: 113 }, (_, i) => i + 18).map((age) => (
     <option key={age} value={age} className="text-black">
       {age}
     </option>
   ))}
 </select>
+{formData.age !== "" && (parseInt(formData.age) < 18 || parseInt(formData.age) > 120) && (
+  <span id="age-error" className="text-red-500 text-sm">
+    Age must be between 18 and 120
+  </span>
+)}
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5697889 and cf1fafc.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (82)
  • .github/workflows/pr-check.yml (1 hunks)
  • .github/workflows/relyance-sci.yml (0 hunks)
  • .gitignore (1 hunks)
  • biome.json (1 hunks)
  • frontend/.env.example (1 hunks)
  • frontend/.gitignore (1 hunks)
  • frontend/next.config.mjs (2 hunks)
  • frontend/src/app/(home)/page.tsx (2 hunks)
  • frontend/src/app/achievements/page.tsx (1 hunks)
  • frontend/src/app/api-docs/page.tsx (1 hunks)
  • frontend/src/app/api/auth/[...nextauth]/route.ts (1 hunks)
  • frontend/src/app/api/auth/logout/route.ts (1 hunks)
  • frontend/src/app/api/auth/session/route.ts (1 hunks)
  • frontend/src/app/api/complete-siwe/route.ts (1 hunks)
  • frontend/src/app/api/confirm-payment/route.ts (1 hunks)
  • frontend/src/app/api/deepseek/route.ts (2 hunks)
  • frontend/src/app/api/docs/route.ts (1 hunks)
  • frontend/src/app/api/fetch-pay-amount/route.ts (2 hunks)
  • frontend/src/app/api/home/route.ts (1 hunks)
  • frontend/src/app/api/ideology/route.ts (4 hunks)
  • frontend/src/app/api/initiate-payment/route.ts (2 hunks)
  • frontend/src/app/api/insights/[testId]/route.ts (2 hunks)
  • frontend/src/app/api/insights/route.ts (2 hunks)
  • frontend/src/app/api/nonce/route.ts (1 hunks)
  • frontend/src/app/api/tests/[testId]/instructions/route.ts (2 hunks)
  • frontend/src/app/api/tests/[testId]/progress/route.ts (1 hunks)
  • frontend/src/app/api/tests/[testId]/questions/route.ts (1 hunks)
  • frontend/src/app/api/tests/[testId]/results/route.ts (2 hunks)
  • frontend/src/app/api/tests/route.ts (3 hunks)
  • frontend/src/app/api/user/check/route.ts (1 hunks)
  • frontend/src/app/api/user/me/route.ts (1 hunks)
  • frontend/src/app/api/user/route.ts (3 hunks)
  • frontend/src/app/api/user/subscription/route.ts (2 hunks)
  • frontend/src/app/api/verify/route.ts (2 hunks)
  • frontend/src/app/api/wallet/route.ts (1 hunks)
  • frontend/src/app/awaken-pro/page.tsx (1 hunks)
  • frontend/src/app/ideology-test/page.tsx (1 hunks)
  • frontend/src/app/insights/page.tsx (1 hunks)
  • frontend/src/app/layout.tsx (1 hunks)
  • frontend/src/app/leaderboard/page.tsx (1 hunks)
  • frontend/src/app/not-found.tsx (1 hunks)
  • frontend/src/app/register/page.tsx (9 hunks)
  • frontend/src/app/results/page.tsx (1 hunks)
  • frontend/src/app/settings/page.tsx (4 hunks)
  • frontend/src/app/sign-in/page.tsx (8 hunks)
  • frontend/src/app/test-selection/page.tsx (2 hunks)
  • frontend/src/app/tests/instructions/page.tsx (1 hunks)
  • frontend/src/app/welcome/page.tsx (1 hunks)
  • frontend/src/components/BottomNav.tsx (1 hunks)
  • frontend/src/components/LayoutContent.tsx (1 hunks)
  • frontend/src/components/ui/AchievementButton.tsx (1 hunks)
  • frontend/src/components/ui/AchievementCard.tsx (1 hunks)
  • frontend/src/components/ui/ActionCard.tsx (1 hunks)
  • frontend/src/components/ui/FilledButton.tsx (1 hunks)
  • frontend/src/components/ui/InsightResultCard.tsx (1 hunks)
  • frontend/src/components/ui/InsightResultTag.tsx (3 hunks)
  • frontend/src/components/ui/LeaderboardButton.tsx (1 hunks)
  • frontend/src/components/ui/LoadingOverlay.tsx (1 hunks)
  • frontend/src/components/ui/LoadingSpinner.tsx (1 hunks)
  • frontend/src/components/ui/MembershipCard.tsx (1 hunks)
  • frontend/src/components/ui/NotificationError.tsx (1 hunks)
  • frontend/src/components/ui/NotificationsToggle.tsx (1 hunks)
  • frontend/src/components/ui/OutlinedButton.tsx (1 hunks)
  • frontend/src/components/ui/ProfileCard.tsx (1 hunks)
  • frontend/src/components/ui/ProgressBar.tsx (1 hunks)
  • frontend/src/components/ui/QuizCard.tsx (1 hunks)
  • frontend/src/components/ui/ResultCard.tsx (2 hunks)
  • frontend/src/components/ui/SearchBar.tsx (1 hunks)
  • frontend/src/components/ui/SettingsCard.tsx (1 hunks)
  • frontend/src/components/ui/TestCard.tsx (1 hunks)
  • frontend/src/components/ui/ToggleSwitch.tsx (1 hunks)
  • frontend/src/components/ui/VerifyModal.tsx (4 hunks)
  • frontend/src/components/ui/WorldIDButton.tsx (1 hunks)
  • frontend/src/components/ui/skeleton.tsx (2 hunks)
  • frontend/src/hooks/useAuth.ts (6 hunks)
  • frontend/src/hooks/useVerification.ts (2 hunks)
  • frontend/src/lib/auth.ts (1 hunks)
  • frontend/src/lib/crypto.ts (1 hunks)
  • frontend/src/lib/swagger.ts (1 hunks)
  • frontend/src/lib/utils.ts (1 hunks)
  • frontend/src/middleware.ts (1 hunks)
  • frontend/src/providers/MiniKitProvider.tsx (1 hunks)
⛔ Files not processed due to max files limit (5)
  • frontend/src/providers/NotificationsProvider.tsx
  • frontend/src/providers/ThemeProvider.tsx
  • frontend/src/providers/eruda-provider.tsx
  • frontend/src/providers/index.tsx
  • package.json
💤 Files with no reviewable changes (1)
  • .github/workflows/relyance-sci.yml
✅ Files skipped from review due to trivial changes (16)
  • frontend/src/components/ui/LoadingOverlay.tsx
  • frontend/src/components/ui/skeleton.tsx
  • frontend/src/lib/crypto.ts
  • .gitignore
  • frontend/src/components/ui/LoadingSpinner.tsx
  • frontend/src/components/ui/VerifyModal.tsx
  • frontend/src/components/ui/NotificationsToggle.tsx
  • frontend/.env.example
  • frontend/src/app/leaderboard/page.tsx
  • frontend/src/hooks/useVerification.ts
  • frontend/src/hooks/useAuth.ts
  • frontend/src/components/ui/MembershipCard.tsx
  • frontend/src/app/api/auth/session/route.ts
  • frontend/src/lib/auth.ts
  • frontend/src/components/ui/ProgressBar.tsx
  • frontend/src/app/tests/instructions/page.tsx
🧰 Additional context used
📓 Learnings (1)
frontend/src/app/api/confirm-payment/route.ts (1)
Learnt from: bitfalt
PR: MindVault-Inc/miniapp-monorepo#51
File: frontend/src/app/api/confirm-payment/route.ts:13-14
Timestamp: 2025-01-09T20:53:55.415Z
Learning: The payment confirmation endpoint in `frontend/src/app/api/confirm-payment/route.ts` is boilerplate code that serves as an example implementation and is not intended to be used as-is in production.
🪛 actionlint (1.7.4)
.github/workflows/pr-check.yml

32-32: the runner of "actions/cache@v3" action is too old to run on GitHub Actions. update the action's version to fix this issue

(action)

🪛 YAMLlint (1.35.1)
.github/workflows/pr-check.yml

[error] 11-11: trailing spaces

(trailing-spaces)


[error] 14-14: trailing spaces

(trailing-spaces)


[error] 19-19: trailing spaces

(trailing-spaces)


[error] 38-38: trailing spaces

(trailing-spaces)


[error] 41-41: trailing spaces

(trailing-spaces)


[error] 65-65: trailing spaces

(trailing-spaces)


[error] 68-68: trailing spaces

(trailing-spaces)


[error] 73-73: trailing spaces

(trailing-spaces)


[error] 79-79: trailing spaces

(trailing-spaces)


[error] 82-82: trailing spaces

(trailing-spaces)


[error] 92-92: trailing spaces

(trailing-spaces)


[error] 95-95: trailing spaces

(trailing-spaces)


[error] 100-100: trailing spaces

(trailing-spaces)


[error] 106-106: trailing spaces

(trailing-spaces)


[error] 109-109: trailing spaces

(trailing-spaces)


[error] 117-117: no new line character at the end of file

(new-line-at-end-of-file)


[error] 117-117: trailing spaces

(trailing-spaces)

🔇 Additional comments (84)
frontend/src/components/ui/ResultCard.tsx (2)

1-11: LGTM! Well-organized imports and type declarations.

The imports are properly organized with type imports separated from value imports, and the props interface is well-defined.


13-16: LGTM! Good use of named exports and props destructuring.

The switch to named exports and the use of props destructuring with default values follows React best practices.

frontend/src/components/ui/WorldIDButton.tsx (2)

14-15: LGTM! Clean component implementation.

The component follows React best practices with proper TypeScript typing and state management.


26-61: LGTM! Well-structured UI with proper accessibility.

The UI implementation is excellent with:

  • Proper loading states and transitions
  • Accessible image with alt text
  • Responsive design
  • Clean class organization using the cn utility
frontend/src/app/ideology-test/page.tsx (2)

3-9: LGTM! Well-organized imports and constants.

The imports are logically grouped and the answerOptions array is consistently formatted.

Also applies to: 11-17


263-362: LGTM! Well-structured UI with proper loading and error states.

The component handles loading and error states appropriately, and the UI is well-organized with consistent styling and proper accessibility considerations.

frontend/src/components/ui/InsightResultCard.tsx (2)

19-26: LGTM!

The function signature is well-structured with proper TypeScript types and prop destructuring.


28-73: Great implementation with attention to accessibility and user experience!

The component demonstrates excellent practices:

  • Semantic HTML with <article> and proper heading structure
  • Complete ARIA attributes for accessibility
  • Smooth transitions and proper spacing
  • Good color contrast for readability
frontend/src/components/ui/ProfileCard.tsx (2)

1-9: LGTM! Well-organized imports.

The imports are properly organized with type imports separated from regular imports, following React best practices.


77-96: LGTM! Well-implemented quote update logic.

The quote update logic is well-implemented with:

  • Proper interval cleanup in useEffect
  • Prevention of duplicate quotes
  • Good separation of concerns with getRandomQuote function
frontend/src/lib/swagger.ts (1)

1-17: LGTM! Clean and consistent code formatting.

The changes improve code consistency by:

  • Using standard function declaration
  • Standardizing string literals to double quotes
  • Removing commented-out code
frontend/src/app/api/docs/route.ts (1)

4-12: LGTM! Robust error handling implementation.

The changes improve error handling by:

  • Adding try-catch block
  • Including detailed error messages
  • Using appropriate HTTP status codes
  • Adding error logging
frontend/src/providers/MiniKitProvider.tsx (1)

18-21: Verify the silent failure approach.

While the comments explain the rationale, consider logging a warning to help with debugging in development environments.

     } catch {
-      // Silently fail if MiniKit initialization fails
-      // The app will handle missing MiniKit functionality gracefully
+      if (process.env.NODE_ENV === 'development') {
+        console.warn('MiniKit initialization failed. Some functionality may be unavailable.');
+      }
✅ Verification successful

Error: No shell scripts or web queries found


Enhance failure logging in development
The silent failure approach works as intended in production, but it makes troubleshooting more challenging during development. Adding a conditional warning (as suggested) using console.warn when process.env.NODE_ENV === 'development' will provide the necessary visibility without affecting production behavior. This change is a valuable improvement for debugging purposes.

frontend/src/lib/utils.ts (2)

5-7: LGTM!

The function correctly merges Tailwind CSS classes using twMerge and clsx.


11-29: LGTM!

The function has been refactored from an arrow function to a standard function declaration while maintaining the correct singleton pattern implementation and proper environment variable validation.

frontend/src/app/api/wallet/route.ts (1)

12-27: LGTM!

The function correctly handles wallet address retrieval with proper session token validation and error handling.

frontend/src/components/ui/ToggleSwitch.tsx (1)

7-31: LGTM!

The component correctly implements a theme toggle switch with proper accessibility attributes and theme toggle functionality.

frontend/src/app/api/nonce/route.ts (1)

10-31: LGTM!

The function correctly implements nonce generation and storage with proper error handling and type safety using the new NonceResponse interface.

frontend/src/components/ui/AchievementButton.tsx (4)

1-8: LGTM! Clean type definitions and imports.

The interface and imports are well-structured, with proper type imports and clear prop definitions.


10-12: LGTM! Well-typed function signature.

The function signature is properly typed with the interface and includes an appropriate default value.


14-22: LGTM! Accessible button with well-organized styles.

The button element correctly includes the type attribute and uses the cn utility for class organization.


23-31: LGTM! Clean conditional rendering.

The button content is well-structured with proper conditional rendering and styling.

frontend/src/app/api/auth/logout/route.ts (3)

4-11: LGTM! Well-defined constants for cookie management.

The constants improve maintainability and type safety with as const.


14-20: LGTM! Efficient cookie clearing logic.

The loop efficiently clears all session-related cookies with proper error handling.


22-42: LGTM! Comprehensive response handling.

The response handling includes proper cookie expiration and error handling with appropriate status codes.

frontend/src/components/ui/SettingsCard.tsx (3)

1-12: LGTM! Clean type definitions and imports.

The interface and imports are well-structured with proper type imports.


14-19: LGTM! Well-typed function signature.

The function signature is properly typed with clean props destructuring.


21-37: LGTM! Accessible button with proper attributes.

The button element includes proper accessibility attributes and well-organized styles.

frontend/src/components/ui/InsightResultTag.tsx (3)

1-8: LGTM! Clean imports and interface.

The imports and interface are well-structured.


10-14: LGTM! Clear validation logic.

The validation function includes proper error handling with a clear error message.


38-44: LGTM! Clean render logic.

The render logic includes proper string manipulation and styling.

frontend/src/app/api/user/check/route.ts (4)

5-9: LGTM! Well-structured response interface.

The CheckUserResponse interface provides a clear contract for the API response with appropriate optional fields.


16-22: LGTM! Improved error handling with structured response.

The error handling for missing wallet address is well-implemented with a proper HTTP 400 status code and typed response.


24-34: LGTM! Robust user existence check.

Good practices observed:

  • Wallet address is normalized to lowercase
  • Temporary users are filtered out
  • Response is properly typed

35-42: LGTM! Comprehensive error handling.

The catch block properly logs errors and returns a structured 500 response.

frontend/src/components/ui/AchievementCard.tsx (2)

11-15: LGTM! Improved component declaration.

Good improvements:

  • Named export instead of default export
  • Default values for props
  • Proper TypeScript types

17-18: LGTM! Enhanced accessibility.

Good accessibility improvements:

  • Using semantic article tag
  • Added aria-hidden to decorative div
frontend/src/components/ui/FilledButton.tsx (2)

1-10: LGTM! Improved type imports.

Good type safety improvements:

  • Using import type for type-only imports
  • Clear separation of types and values

34-56: LGTM! Well-implemented button component.

Good practices:

  • Explicit button type attribute
  • Proper icon size scaling
  • Consistent class naming with cn utility
frontend/src/components/ui/OutlinedButton.tsx (2)

1-10: LGTM! Proper setup for client component.

Good practices:

  • "use client" directive for client-side rendering
  • Type-only imports
  • Clear organization of imports

34-56: LGTM! Consistent button implementation.

Implementation matches FilledButton's good practices:

  • Explicit button type
  • Consistent class naming
  • Proper icon handling
frontend/src/app/api/auth/[...nextauth]/route.ts (2)

4-11: LGTM! Well-structured interface definition.

The AuthUser interface provides clear type safety for user data.


29-54: LGTM! Improved error handling and response structure.

The changes enhance error handling with try-catch and standardize response format using NextResponse.json.

frontend/src/components/ui/ActionCard.tsx (2)

25-34: LGTM! Well-implemented keyboard interaction handler.

The handleKeyDown function properly handles both Enter and Space key events, following accessibility best practices.


37-57: LGTM! Excellent accessibility improvements.

Converting from div to button with proper:

  • type="button" attribute
  • disabled state handling
  • keyboard interaction
  • ARIA-compliant structure
frontend/src/app/api-docs/page.tsx (3)

8-21: LGTM! Well-defined Swagger specification interface.

The SwaggerSpec interface provides comprehensive type safety for the OpenAPI specification.


24-42: LGTM! Robust error handling implementation.

Good use of:

  • Typed state management
  • Async/await with proper error handling
  • Error message extraction from Error instances

44-58: LGTM! Clear error and loading states.

Good user experience with:

  • Descriptive error messages
  • Loading spinner component
  • Proper conditional rendering
frontend/src/app/layout.tsx (2)

34-36: LGTM! Clear props interface definition.

Good separation of concerns by extracting RootLayoutProps interface.


38-56: LGTM! Well-structured layout component.

Good implementation with:

  • Type-safe props
  • Proper HTML semantics
  • Clear component hierarchy
frontend/src/app/api/fetch-pay-amount/route.ts (1)

4-7: LGTM! Well-structured interface definition.

The PriceResponse interface aligns perfectly with the Swagger schema and provides good type safety.

frontend/src/app/api/user/me/route.ts (1)

40-51: 🛠️ Refactor suggestion

Add input validation for type conversions.

The .toString() calls might throw if the values are null. Consider using nullish coalescing or optional chaining.

 const response: UserResponse = {
-	name: user.name?.toString(),
-	lastName: user.last_name?.toString(),
-	email: user.email?.toString(),
+	name: user.name?.toString() ?? undefined,
+	lastName: user.last_name?.toString() ?? undefined,
+	email: user.email?.toString() ?? undefined,
 	age: user.age,
-	country: user.country?.toString(),
-	walletAddress: user.wallet_address?.toString(),
+	country: user.country?.toString() ?? undefined,
+	walletAddress: user.wallet_address?.toString() ?? undefined,
 	subscription: user.subscription,
 	verified: user.verified,
 	createdAt: user.created_at,
 	updatedAt: user.updated_at,
 };

Likely invalid or redundant comment.

frontend/src/components/BottomNav.tsx (1)

9-15: LGTM! Type-safe navigation items.

Using as const ensures type safety for the navigation items array.

frontend/src/components/ui/QuizCard.tsx (1)

10-18: LGTM! Well-structured class names.

Using cn utility for class names provides good organization and maintainability.

frontend/src/app/api/tests/[testId]/questions/route.ts (2)

5-14: Well-structured interfaces with good type safety!

The addition of Question and QuestionResponse interfaces improves type safety and provides clear contract for the API responses.


20-27: Good error handling for invalid test IDs!

The validation of testId is thorough with proper type conversion and range checking. Using Number.parseInt with explicit radix is a good practice.

frontend/src/app/api/complete-siwe/route.ts (2)

13-18: Well-defined response interface with clear status types!

The SiweResponse interface provides a clear contract with discriminated union type for status.


56-57: Security best practice: clearing sensitive data!

Good practice to clear the nonce cookie after successful verification.

frontend/src/components/ui/LeaderboardButton.tsx (2)

9-13: Good accessibility and type safety improvements!

Added type="button" attribute and proper className structure. The hover effects provide good user feedback.


16-23: Excellent accessibility for SVG elements!

Added aria-hidden="true" to decorative SVGs, improving screen reader experience.

Also applies to: 61-68

frontend/src/app/api/home/route.ts (2)

7-21: Well-structured interfaces with good type inheritance!

The TokenPayload extending JWTPayload and UserResponse with optional fields provide good type safety.


40-47: Good JWT verification with proper type casting!

The JWT verification is well-structured with proper error handling and type casting of the payload.

frontend/src/app/api/tests/[testId]/instructions/route.ts (2)

5-9: Well-structured response interface!

Good addition of the InstructionResponse interface. This ensures consistent response structure and improves type safety.


49-56: Improved error handling with proper validation!

Good improvements:

  • Using Number.parseInt with radix for safe parsing
  • Proper validation of testId
  • Consistent error response structure
frontend/src/components/ui/SearchBar.tsx (2)

10-12: Good type safety improvement!

Explicit interface extension from InputHTMLAttributes improves type safety and documentation.


67-73: Great accessibility improvements!

Good additions:

  • Explicit type="button" prevents form submission
  • Clear button with icon improves UX
frontend/src/app/api/user/subscription/route.ts (1)

7-16: Well-structured interfaces!

Good additions:

  • TokenPayload extends JWTPayload for type safety
  • SubscriptionResponse ensures consistent response structure
frontend/src/app/not-found.tsx (1)

10-11: Great accessibility improvements!

Good addition of ARIA labels for better screen reader support.

Also applies to: 69-70

frontend/src/components/ui/TestCard.tsx (2)

29-33: Great accessibility improvements!

Converting the wrapper to a button element with proper type attribute and keyboard interaction support enhances accessibility. The cursor styles and transition effects provide good visual feedback.


46-49: Excellent use of ARIA attributes!

The progress bar and achievement elements now have proper aria-labels, making them screen-reader friendly.

Also applies to: 88-90

frontend/src/app/api/confirm-payment/route.ts (1)

13-19: Good type safety improvement with PaymentResponse interface!

The interface properly defines the structure of the response, making it more maintainable and type-safe.

frontend/src/app/api/deepseek/route.ts (1)

4-18: Good type definitions for request/response!

The interfaces properly define the structure of the ideology scores and API responses.

frontend/src/components/ui/NotificationError.tsx (2)

18-22: Good switch to named export!

This change improves consistency with other components in the codebase.


82-90: Excellent button accessibility!

All buttons now have proper type attributes and clear, descriptive text.

Also applies to: 106-119

frontend/src/app/api/insights/[testId]/route.ts (2)

8-24: LGTM! Well-structured interfaces.

The interfaces are well-defined with clear types and optional properties, enhancing type safety.


78-168: Verify error handling for edge cases.

While the error handling is comprehensive, there are a few edge cases to consider:

  1. What happens if testId is a floating-point number?
  2. What if the insights contain null values?
frontend/src/app/api/tests/[testId]/progress/route.ts (1)

8-25: LGTM! Well-defined interfaces.

The interfaces are clear and properly typed, especially the Score interface which ensures all required fields are present.

frontend/src/app/api/verify/route.ts (1)

10-25: LGTM! Well-documented interfaces.

The interfaces are well-defined and match the swagger documentation.

frontend/src/app/api/tests/[testId]/results/route.ts (2)

8-10: LGTM! Well-structured interfaces for type safety.

The interfaces TokenPayload and ResultResponse are well-defined and enhance type safety across the codebase.

Also applies to: 24-27


71-74: LGTM! Proper environment variable validation.

Good practice to validate required environment variables at startup.

frontend/src/app/api/tests/route.ts (1)

7-31: LGTM! Well-structured interfaces for type safety.

The interfaces are well-defined and provide good type safety for the API responses.

frontend/src/app/api/ideology/route.ts (1)

8-10: LGTM! Well-structured interfaces for type safety.

The interfaces TokenPayload and IdeologyResponse are well-defined and enhance type safety.

Also applies to: 19-22

frontend/src/app/settings/page.tsx (1)

26-31: LGTM! Well-structured interface for subscription data.

The SubscriptionData interface is well-defined and enhances type safety.

frontend/.gitignore (1)

33-36: LGTM! Clear and secure environment file handling.

The updated patterns provide better clarity and security for environment files while ensuring example files are tracked.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

♻️ Duplicate comments (1)
.github/workflows/pr-check.yml (1)

32-32: ⚠️ Potential issue

Update Cache Action Version.

The static analysis indicates that using actions/cache@v3 is outdated and may not run reliably on GitHub Actions. Please update it to actions/cache@v4 to ensure compatibility with the latest runners and avoid potential issues.

-        uses: actions/cache@v3
+        uses: actions/cache@v4
🧰 Tools
🪛 actionlint (1.7.4)

32-32: the runner of "actions/cache@v3" action is too old to run on GitHub Actions. update the action's version to fix this issue

(action)

🧹 Nitpick comments (2)
.github/workflows/pr-check.yml (2)

11-11: Remove Trailing Whitespace and Ensure Newline at EOF.

Multiple lines in this file have trailing whitespace (as identified on lines 11, 14, 19, 38, 68, 71, 76, 82, 87, 99, 102, 107, 113, 118, and 125). Please remove these extra spaces to maintain clean formatting per YAML lint standards. Additionally, ensure the file ends with a newline.

Also applies to: 14-14, 19-19, 38-38, 68-68, 71-71, 76-76, 82-82, 87-87, 99-99, 102-102, 107-107, 113-113, 118-118, 125-125

🧰 Tools
🪛 YAMLlint (1.35.1)

[error] 11-11: trailing spaces

(trailing-spaces)


39-44: Review Dependency Installation Step.

The step installing dependencies in the quality job includes:

pnpm add -D @biomejs/biome

While this ensures that Biome is available for linting, it is generally preferable to add such dev dependencies directly to your package.json so that dependency management remains consistent across environments. Consider moving @biomejs/biome to your devDependencies in package.json.

-          pnpm add -D @biomejs/biome
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between cf1fafc and dd73382.

📒 Files selected for processing (1)
  • .github/workflows/pr-check.yml (1 hunks)
🧰 Additional context used
🪛 actionlint (1.7.4)
.github/workflows/pr-check.yml

32-32: the runner of "actions/cache@v3" action is too old to run on GitHub Actions. update the action's version to fix this issue

(action)

🪛 YAMLlint (1.35.1)
.github/workflows/pr-check.yml

[error] 11-11: trailing spaces

(trailing-spaces)


[error] 14-14: trailing spaces

(trailing-spaces)


[error] 19-19: trailing spaces

(trailing-spaces)


[error] 38-38: trailing spaces

(trailing-spaces)


[error] 68-68: trailing spaces

(trailing-spaces)


[error] 71-71: trailing spaces

(trailing-spaces)


[error] 76-76: trailing spaces

(trailing-spaces)


[error] 82-82: trailing spaces

(trailing-spaces)


[error] 87-87: trailing spaces

(trailing-spaces)


[error] 99-99: trailing spaces

(trailing-spaces)


[error] 102-102: trailing spaces

(trailing-spaces)


[error] 107-107: trailing spaces

(trailing-spaces)


[error] 113-113: trailing spaces

(trailing-spaces)


[error] 118-118: trailing spaces

(trailing-spaces)


[error] 125-125: no new line character at the end of file

(new-line-at-end-of-file)


[error] 125-125: trailing spaces

(trailing-spaces)

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (5)
.github/workflows/pr-check.yml (5)

8-11: Remove Trailing Spaces in Quality Job Header
There is a trailing whitespace issue reported (e.g., on line 11). Please remove the extra spaces to adhere to YAML formatting standards.

🧰 Tools
🪛 YAMLlint (1.35.1)

[error] 11-11: trailing spaces

(trailing-spaces)


12-14: Checkout Step – Remove Trailing Spaces
The checkout step using actions/checkout@v4 is correctly implemented. However, trailing spaces (e.g., on line 14) should be removed for cleaner formatting.

🧰 Tools
🪛 YAMLlint (1.35.1)

[error] 14-14: trailing spaces

(trailing-spaces)


15-19: Setup Node.js – Fix Trailing Spaces
The Node.js setup step is correctly configured with actions/setup-node@v4. Make sure to remove trailing spaces (notably on line 19) to comply with best practices.

🧰 Tools
🪛 YAMLlint (1.35.1)

[error] 19-19: trailing spaces

(trailing-spaces)


65-95: Security Job Configuration and Trailing Spaces Cleanup
The security job is well-structured with steps for checking out the repository, setting up Node.js, installing pnpm, installing dependencies, running a security audit, and checking for outdated dependencies. However, static analysis has flagged multiple trailing spaces in this section (e.g., lines 68, 71, 76, 82, and 87). Please remove these extraneous spaces to improve readability and adhere to YAML best practices.

🧰 Tools
🪛 YAMLlint (1.35.1)

[error] 68-68: trailing spaces

(trailing-spaces)


[error] 71-71: trailing spaces

(trailing-spaces)


[error] 76-76: trailing spaces

(trailing-spaces)


[error] 82-82: trailing spaces

(trailing-spaces)


[error] 87-87: trailing spaces

(trailing-spaces)


96-132: Bundle Analysis Job – Trailing Spaces and Newline at EOF
The bundle analysis job is correctly configured to build the application, perform bundle analysis, and upload the artifact. However, several trailing spaces have been reported (e.g., lines 99, 102, 107, 113, 118, and 132), and there is a missing newline at the end of the file. Please clean up these formatting issues.

🧰 Tools
🪛 YAMLlint (1.35.1)

[error] 99-99: trailing spaces

(trailing-spaces)


[error] 102-102: trailing spaces

(trailing-spaces)


[error] 107-107: trailing spaces

(trailing-spaces)


[error] 113-113: trailing spaces

(trailing-spaces)


[error] 118-118: trailing spaces

(trailing-spaces)


[error] 132-132: no new line character at the end of file

(new-line-at-end-of-file)


[error] 132-132: trailing spaces

(trailing-spaces)

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between dd73382 and 03914db.

📒 Files selected for processing (1)
  • .github/workflows/pr-check.yml (1 hunks)
🧰 Additional context used
🪛 actionlint (1.7.4)
.github/workflows/pr-check.yml

32-32: the runner of "actions/cache@v3" action is too old to run on GitHub Actions. update the action's version to fix this issue

(action)

🪛 YAMLlint (1.35.1)
.github/workflows/pr-check.yml

[error] 11-11: trailing spaces

(trailing-spaces)


[error] 14-14: trailing spaces

(trailing-spaces)


[error] 19-19: trailing spaces

(trailing-spaces)


[error] 38-38: trailing spaces

(trailing-spaces)


[error] 68-68: trailing spaces

(trailing-spaces)


[error] 71-71: trailing spaces

(trailing-spaces)


[error] 76-76: trailing spaces

(trailing-spaces)


[error] 82-82: trailing spaces

(trailing-spaces)


[error] 87-87: trailing spaces

(trailing-spaces)


[error] 99-99: trailing spaces

(trailing-spaces)


[error] 102-102: trailing spaces

(trailing-spaces)


[error] 107-107: trailing spaces

(trailing-spaces)


[error] 113-113: trailing spaces

(trailing-spaces)


[error] 118-118: trailing spaces

(trailing-spaces)


[error] 132-132: no new line character at the end of file

(new-line-at-end-of-file)


[error] 132-132: trailing spaces

(trailing-spaces)

🔇 Additional comments (11)
.github/workflows/pr-check.yml (11)

1-2: Workflow Name is Descriptive
The workflow name "PR Check" is clear and appropriately reflects its purpose.


3-6: Pull Request Trigger Configuration
The trigger is correctly set to run on pull requests targeting the "main" and "develop" branches.


20-24: Install pnpm Configuration Looks Good
The configuration for installing pnpm using pnpm/action-setup@v2 (with version 8 and run_install: false) is correctly set up.


26-30: Get pnpm Store Directory Step is Fine
The command that sets the STORE_PATH environment variable via a bash shell is implemented correctly.


39-44: Install Dependencies Step is Correct
The step that changes to the "frontend" directory and installs dependencies (including adding the @biomejs/biome dev dependency) is properly implemented.


45-48: Biome Lint Step is Configured Correctly
The command to run Biome lint in the frontend directory on the ./src path is clear and correctly set up.


49-52: Biome Format Check Step is Configured Correctly
The Biome format (ci) check is properly configured and ensures formatting consistency.


53-56: Type Check Step Looks Good
The type checking command within the frontend directory is correctly specified.


57-60: Tests Execution Step is Properly Set Up
Running tests in the frontend directory is appropriately configured.


61-64: Build Application Step is Correctly Configured
The step that builds the application by executing pnpm build in the frontend directory is implemented correctly.


31-38: 🛠️ Refactor suggestion

⚠️ Potential issue

Update Cache Action Version and Remove Trailing Spaces
The workflow currently uses actions/cache@v3, which is outdated based on our static analysis feedback. Please update it to actions/cache@v4. Also, remove any trailing spaces (e.g., on line 38).

-      - name: Setup pnpm cache
-        uses: actions/cache@v3
+      - name: Setup pnpm cache
+        uses: actions/cache@v4

Likely invalid or redundant comment.

🧰 Tools
🪛 actionlint (1.7.4)

32-32: the runner of "actions/cache@v3" action is too old to run on GitHub Actions. update the action's version to fix this issue

(action)

🪛 YAMLlint (1.35.1)

[error] 38-38: trailing spaces

(trailing-spaces)

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

♻️ Duplicate comments (3)
biome.json (1)

10-26: ⚠️ Potential issue

Include missing critical paths in file patterns.

The following critical paths are not covered in the include patterns:

  • API routes under frontend/src/app/api
  • Utility functions under frontend/src/utils

Add these paths to the include array:

  "include": [
+   "frontend/src/app/api/**/*.ts",
+   "frontend/src/utils/**/*.ts",
    // existing paths...
  ],
.github/workflows/pr-check.yml (2)

31-38: ⚠️ Potential issue

Update cache action version.

The cache action version is outdated.

-     uses: actions/cache@v3
+     uses: actions/cache@v4
🧰 Tools
🪛 actionlint (1.7.4)

32-32: the runner of "actions/cache@v3" action is too old to run on GitHub Actions. update the action's version to fix this issue

(action)

🪛 YAMLlint (1.35.1)

[error] 38-38: trailing spaces

(trailing-spaces)


8-64: 🛠️ Refactor suggestion

Enhance job reliability and dependencies.

The quality job could be improved with:

  1. Failure handling for tests
  2. Next.js build cache
  3. Telemetry disabled
  quality:
    name: Code Quality & Build
    runs-on: ubuntu-latest
+   env:
+     NEXT_TELEMETRY_DISABLED: 1
    
    steps:
      # ... existing steps ...
      
      - name: Run tests
        working-directory: frontend
        run: pnpm test
+       continue-on-error: true
      
+     - name: Cache Next.js build
+       uses: actions/cache@v4
+       with:
+         path: frontend/.next/cache
+         key: ${{ runner.os }}-nextjs-${{ hashFiles('frontend/**/*.{js,jsx,ts,tsx}') }}
🧰 Tools
🪛 actionlint (1.7.4)

32-32: the runner of "actions/cache@v3" action is too old to run on GitHub Actions. update the action's version to fix this issue

(action)

🪛 YAMLlint (1.35.1)

[error] 11-11: trailing spaces

(trailing-spaces)


[error] 14-14: trailing spaces

(trailing-spaces)


[error] 19-19: trailing spaces

(trailing-spaces)


[error] 38-38: trailing spaces

(trailing-spaces)

🧹 Nitpick comments (1)
.github/workflows/pr-check.yml (1)

126-133: Add compression format for artifacts.

When uploading artifacts, specify the compression format for better performance.

      - name: Upload bundle analysis
        uses: actions/upload-artifact@v4
        with:
          name: bundle-analysis
          path: |
            frontend/.next/analyze/*.html
          compression-level: 9
+         format: zip
          retention-days: 14
🧰 Tools
🪛 YAMLlint (1.35.1)

[error] 133-133: no new line character at the end of file

(new-line-at-end-of-file)


[error] 133-133: trailing spaces

(trailing-spaces)

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 03914db and 6836d8c.

📒 Files selected for processing (4)
  • .github/workflows/pr-check.yml (1 hunks)
  • biome.json (1 hunks)
  • frontend/next.config.mjs (2 hunks)
  • frontend/src/components/ui/styles/outlinedButtonStyles.ts (1 hunks)
🧰 Additional context used
🪛 actionlint (1.7.4)
.github/workflows/pr-check.yml

32-32: the runner of "actions/cache@v3" action is too old to run on GitHub Actions. update the action's version to fix this issue

(action)

🪛 YAMLlint (1.35.1)
.github/workflows/pr-check.yml

[error] 11-11: trailing spaces

(trailing-spaces)


[error] 14-14: trailing spaces

(trailing-spaces)


[error] 19-19: trailing spaces

(trailing-spaces)


[error] 38-38: trailing spaces

(trailing-spaces)


[error] 68-68: trailing spaces

(trailing-spaces)


[error] 71-71: trailing spaces

(trailing-spaces)


[error] 76-76: trailing spaces

(trailing-spaces)


[error] 82-82: trailing spaces

(trailing-spaces)


[error] 87-87: trailing spaces

(trailing-spaces)


[error] 99-99: trailing spaces

(trailing-spaces)


[error] 102-102: trailing spaces

(trailing-spaces)


[error] 107-107: trailing spaces

(trailing-spaces)


[error] 113-113: trailing spaces

(trailing-spaces)


[error] 119-119: trailing spaces

(trailing-spaces)


[error] 133-133: no new line character at the end of file

(new-line-at-end-of-file)


[error] 133-133: trailing spaces

(trailing-spaces)

🔇 Additional comments (2)
frontend/next.config.mjs (1)

1-5: LGTM! Bundle analyzer integration looks good.

The bundle analyzer is properly configured with environment variable toggle and correctly wraps the Next.js config.

Also applies to: 29-29

frontend/src/components/ui/styles/outlinedButtonStyles.ts (1)

4-6: LGTM! Button styles follow best practices.

The button styles are well-structured with:

  • Consistent padding scales
  • Clear hover states
  • Proper type exports

Also applies to: 10-16, 19-20

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

♻️ Duplicate comments (1)
.github/workflows/pr-check.yml (1)

26-38: 🛠️ Refactor suggestion

⚠️ Potential issue

PNPM Cache Setup: Outdated Action Version.

The cache setup step uses actions/cache@v3, which is flagged as outdated by static analysis and previous review comments. It is recommended to update the cache action to v4 as shown below:

-        uses: actions/cache@v3
+        uses: actions/cache@v4

Additionally, ensure that any trailing whitespace (notably on line 38) is removed.

🧰 Tools
🪛 actionlint (1.7.4)

32-32: the runner of "actions/cache@v3" action is too old to run on GitHub Actions. update the action's version to fix this issue

(action)

🪛 YAMLlint (1.35.1)

[error] 38-38: trailing spaces

(trailing-spaces)

🧹 Nitpick comments (8)
.github/workflows/pr-check.yml (8)

7-11: Quality Job Header and Runner Setup.

The "Code Quality & Build" job is set up correctly with runs-on: ubuntu-latest. However, line 11 appears to have trailing whitespace. Please remove any extraneous spaces to comply with YAML linting standards.

🧰 Tools
🪛 YAMLlint (1.35.1)

[error] 11-11: trailing spaces

(trailing-spaces)


12-25: Quality Job Initial Steps.

The steps for checking out the repository, setting up Node.js (v20), and installing pnpm (v2 with version: 8 and run_install: false) are implemented correctly. There are minor trailing whitespace issues (e.g., on line 14 and line 19) that should be cleaned up for consistency.

🧰 Tools
🪛 YAMLlint (1.35.1)

[error] 14-14: trailing spaces

(trailing-spaces)


[error] 19-19: trailing spaces

(trailing-spaces)


65-68: Security Job Header & Runner.

The "Security Scan" job is configured correctly with runs-on: ubuntu-latest. Note that line 68 has trailing spaces that should be removed to comply with YAML linting.

🧰 Tools
🪛 YAMLlint (1.35.1)

[error] 68-68: trailing spaces

(trailing-spaces)


69-82: Security Job Initial Steps.

The steps for checking out the repository, setting up Node.js (v20), and installing pnpm are similar to the Quality job and are correctly implemented. Please remove any trailing spaces on lines 71, 76, and 82 for consistency.

🧰 Tools
🪛 YAMLlint (1.35.1)

[error] 71-71: trailing spaces

(trailing-spaces)


[error] 76-76: trailing spaces

(trailing-spaces)


[error] 82-82: trailing spaces

(trailing-spaces)


96-99: Bundle Analysis Job Header.

The Bundle Analysis job is correctly configured with the appropriate name and runner. There is trailing whitespace on line 99; please remove it.

🧰 Tools
🪛 YAMLlint (1.35.1)

[error] 99-99: trailing spaces

(trailing-spaces)


100-113: Bundle Analysis Setup Steps.

The initial setup for the Bundle Analysis job—checking out the repo, setting up Node.js, and installing pnpm—is consistent with previous jobs. Please ensure that trailing spaces on lines 107 and 113 are removed.

🧰 Tools
🪛 YAMLlint (1.35.1)

[error] 102-102: trailing spaces

(trailing-spaces)


[error] 107-107: trailing spaces

(trailing-spaces)


[error] 113-113: trailing spaces

(trailing-spaces)


114-119: Install Dependencies for Bundle Analysis.

The step to install dependencies and add the bundle analyzer is correctly implemented. Verify and remove any trailing whitespace on line 119.

🧰 Tools
🪛 YAMLlint (1.35.1)

[error] 119-119: trailing spaces

(trailing-spaces)


126-133: Upload Bundle Analysis Artifact.

The artifact upload step is well-defined, using actions/upload-artifact@v4 to capture the HTML analysis outputs. However, ensure that there is a newline at the end of the file and remove any trailing spaces on line 133.

🧰 Tools
🪛 YAMLlint (1.35.1)

[error] 133-133: no new line character at the end of file

(new-line-at-end-of-file)


[error] 133-133: trailing spaces

(trailing-spaces)

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 6836d8c and af14e5a.

📒 Files selected for processing (1)
  • .github/workflows/pr-check.yml (1 hunks)
🧰 Additional context used
🪛 actionlint (1.7.4)
.github/workflows/pr-check.yml

32-32: the runner of "actions/cache@v3" action is too old to run on GitHub Actions. update the action's version to fix this issue

(action)

🪛 YAMLlint (1.35.1)
.github/workflows/pr-check.yml

[error] 11-11: trailing spaces

(trailing-spaces)


[error] 14-14: trailing spaces

(trailing-spaces)


[error] 19-19: trailing spaces

(trailing-spaces)


[error] 38-38: trailing spaces

(trailing-spaces)


[error] 68-68: trailing spaces

(trailing-spaces)


[error] 71-71: trailing spaces

(trailing-spaces)


[error] 76-76: trailing spaces

(trailing-spaces)


[error] 82-82: trailing spaces

(trailing-spaces)


[error] 87-87: trailing spaces

(trailing-spaces)


[error] 99-99: trailing spaces

(trailing-spaces)


[error] 102-102: trailing spaces

(trailing-spaces)


[error] 107-107: trailing spaces

(trailing-spaces)


[error] 113-113: trailing spaces

(trailing-spaces)


[error] 119-119: trailing spaces

(trailing-spaces)


[error] 133-133: no new line character at the end of file

(new-line-at-end-of-file)


[error] 133-133: trailing spaces

(trailing-spaces)

🔇 Additional comments (11)
.github/workflows/pr-check.yml (11)

1-2: Workflow Name Defined Correctly.

The workflow is named "PR Check", which aligns well with the PR objectives.


3-6: Pull Request Trigger Configuration.

The workflow is configured to trigger on pull requests to the main and develop branches. This meets the intended CI/CD automation requirements.


39-44: Install Dependencies Step.

Switching to the frontend directory and installing dependencies—including adding development tools like @biomejs/biome and @next/bundle-analyzer—is scripted properly.


45-48: Run Biome Lint Step.

The command for executing Biome lint in the frontend directory is correct.


49-52: Run Biome Format Check Step.

The Biome format check command (pnpm exec biome ci .) is properly configured and runs in the frontend directory as required.


53-56: Type Check Step.

The type-check step using pnpm type-check in the frontend directory is correctly implemented.


57-60: Test Execution Step.

The step to run tests in the frontend directory with pnpm test is correctly set up.


61-64: Build Application Step.

The build step, which triggers pnpm build after changing into the frontend directory, is properly defined.


83-91: Security Audit Steps.

The steps to install dependencies and run a security audit (pnpm audit) are well configured, ensuring that security checks are enforced.

🧰 Tools
🪛 YAMLlint (1.35.1)

[error] 87-87: trailing spaces

(trailing-spaces)


92-95: Outdated Dependencies Check.

The pnpm outdated command is correctly used to check for outdated dependencies in the frontend directory.


120-125: Build and Analyze Bundle Step.

The command to build the application while enabling bundle analysis (using the ANALYZE: 'true' environment variable) is properly set up.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

♻️ Duplicate comments (1)
.github/workflows/pr-check.yml (1)

31-38: ⚠️ Potential issue

Update Cache Action Version

The cache action uses an outdated version (actions/cache@v3). Please update this to actions/cache@v4 to avoid compatibility issues with GitHub Actions.

-        - name: Setup pnpm cache
-          uses: actions/cache@v3
+        - name: Setup pnpm cache
+          uses: actions/cache@v4
🧰 Tools
🪛 actionlint (1.7.4)

32-32: the runner of "actions/cache@v3" action is too old to run on GitHub Actions. update the action's version to fix this issue

(action)

🪛 YAMLlint (1.35.1)

[error] 38-38: trailing spaces

(trailing-spaces)

🧹 Nitpick comments (2)
.github/workflows/pr-check.yml (2)

11-11: Remove Trailing Spaces

YAMLlint has flagged multiple instances of trailing whitespace across the file (e.g., lines 11, 14, 19, 38, 69, 72, 77, 83, 88, 100, 103, 108, 114, 120, and 134). Please remove these trailing spaces to improve file cleanliness and avoid linter errors.

Also applies to: 14-14, 19-19, 38-38, 69-69, 72-72, 77-77, 83-83, 88-88, 100-100, 103-103, 108-108, 114-114, 120-120, 134-134

🧰 Tools
🪛 YAMLlint (1.35.1)

[error] 11-11: trailing spaces

(trailing-spaces)


134-134: Add Newline at End-of-File

The file is missing a newline at the end, which is causing a YAMLlint error. Please insert a newline at the end of the file.

-             retention-days: 14 
+             retention-days: 14
+
🧰 Tools
🪛 YAMLlint (1.35.1)

[error] 134-134: no new line character at the end of file

(new-line-at-end-of-file)


[error] 134-134: trailing spaces

(trailing-spaces)

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between af14e5a and 0115bec.

📒 Files selected for processing (1)
  • .github/workflows/pr-check.yml (1 hunks)
🧰 Additional context used
🪛 actionlint (1.7.4)
.github/workflows/pr-check.yml

32-32: the runner of "actions/cache@v3" action is too old to run on GitHub Actions. update the action's version to fix this issue

(action)

🪛 YAMLlint (1.35.1)
.github/workflows/pr-check.yml

[error] 11-11: trailing spaces

(trailing-spaces)


[error] 14-14: trailing spaces

(trailing-spaces)


[error] 19-19: trailing spaces

(trailing-spaces)


[error] 38-38: trailing spaces

(trailing-spaces)


[error] 69-69: trailing spaces

(trailing-spaces)


[error] 72-72: trailing spaces

(trailing-spaces)


[error] 77-77: trailing spaces

(trailing-spaces)


[error] 83-83: trailing spaces

(trailing-spaces)


[error] 88-88: trailing spaces

(trailing-spaces)


[error] 100-100: trailing spaces

(trailing-spaces)


[error] 103-103: trailing spaces

(trailing-spaces)


[error] 108-108: trailing spaces

(trailing-spaces)


[error] 114-114: trailing spaces

(trailing-spaces)


[error] 120-120: trailing spaces

(trailing-spaces)


[error] 134-134: no new line character at the end of file

(new-line-at-end-of-file)


[error] 134-134: trailing spaces

(trailing-spaces)

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

♻️ Duplicate comments (1)
biome.json (1)

10-19: ⚠️ Potential issue

Update file patterns to match repository structure.

The current patterns assume source files are in a top-level src directory, but they are actually in frontend/src.

 "include": [
-  "src/**/*.{ts,tsx}",
-  "src/**/*.{js,jsx}",
-  "src/**/*.json",
+  "frontend/src/**/*.{ts,tsx}",
+  "frontend/src/**/*.{js,jsx}",
+  "frontend/src/**/*.json",
+  "types/**/*.d.ts",
   "*.config.{ts,js,mjs}",
-  "*.d.ts",
   "eslint.config.mjs",
   "next.config.mjs",
   "tailwind.config.ts",
   "postcss.config.js"
 ]
🧹 Nitpick comments (9)
frontend/src/app/api/deepseek/route.ts (1)

47-85: Consider extracting the prompt template.

The prompt template is quite long and could be moved to a separate configuration file for better maintainability.

Create a new file src/config/prompts.ts:

export const POLITICAL_ANALYSIS_PROMPT = `[ROLE] Act as a senior political scientist...`;

Then import and use it:

-    const prompt = `[ROLE] Act as a senior political scientist...`;
+    const prompt = POLITICAL_ANALYSIS_PROMPT;
frontend/src/app/api/tests/[testId]/progress/route.ts (1)

169-172: Consider using spread operator for type safety.

The spread operator with type assertion provides better type safety than direct assignment.

-        answers: {
-          ...(progress.answers as Record<string, unknown>),
-          [questionId]: answer,
-        },
+        answers: {
+          ...progress.answers,
+          [questionId]: answer,
+        } as Record<string, unknown>,
frontend/src/app/api/verify/route.ts (1)

153-159: Consider using zod for environment variable validation.

The environment variable validation could be more robust using zod schema validation.

import { z } from 'zod';

const envSchema = z.object({
  NEXT_PUBLIC_WLD_APP_ID: z.string().startsWith('app_'),
});

const env = envSchema.safeParse({
  NEXT_PUBLIC_WLD_APP_ID: process.env.NEXT_PUBLIC_WLD_APP_ID,
});

if (!env.success) {
  const response: VerifyResponse = {
    success: false,
    error: 'Invalid environment configuration',
    details: env.error.flatten(),
  };
  return NextResponse.json(response, { status: 400 });
}

const app_id = env.data.NEXT_PUBLIC_WLD_APP_ID;
frontend/src/app/api/tests/[testId]/results/route.ts (4)

71-77: Enhance error handling for JWT operations.

Consider wrapping the JWT secret encoding in a try-catch block to handle potential encoding errors.

-const secret = new TextEncoder().encode(JWT_SECRET);
+let secret;
+try {
+  secret = new TextEncoder().encode(JWT_SECRET);
+} catch (error) {
+  console.error("Failed to encode JWT secret:", error);
+  throw new Error("Failed to initialize JWT secret");
+}

109-123: Add validation for test score format.

While the code checks for the presence of scores, it doesn't validate their format. Consider adding type validation for the score object.

+interface TestScore {
+  econ: number;
+  govt: number;
+  dipl: number;
+  scty: number;
+}

 if (!progress.score) {
   const response: ResultResponse = { error: "Test not completed" };
   return NextResponse.json(response, { status: 400 });
 }
+
+// Validate score format
+const score = progress.score as TestScore;
+if (
+  typeof score.econ !== "number" ||
+  typeof score.govt !== "number" ||
+  typeof score.dipl !== "number" ||
+  typeof score.scty !== "number"
+) {
+  const response: ResultResponse = { error: "Invalid score format" };
+  return NextResponse.json(response, { status: 400 });
+}

129-153: Optimize category mapping for better performance.

The current implementation repeatedly searches through categories array. Consider creating a lookup map for better performance.

+// Create category lookup map
+const categoryMap = new Map(
+  categories.map(c => [c.category_name, c.xata_id])
+);

 const categoryScores: CategoryScore[] = [
   {
     category_xata_id:
-      categories.find((c) => c.category_name === "Economic")?.xata_id || "",
+      categoryMap.get("Economic") || "",
     score: progress.score.econ,
   },
   {
     category_xata_id:
-      categories.find((c) => c.category_name === "Civil")?.xata_id || "",
+      categoryMap.get("Civil") || "",
     score: progress.score.govt,
   },
   // ... similar changes for other categories
 ].filter((cs) => cs.category_xata_id !== "");

193-201: Extract range description logic to a separate function.

The range description logic could be more maintainable if extracted to a dedicated function with clear boundaries.

+function getScoreRange(score: number): string {
+  if (score >= 45 && score <= 55) return "centrist";
+  if (score >= 35 && score < 45) return "moderate";
+  if (score >= 25 && score < 35) return "balanced";
+  return "neutral";
+}

-let range = "neutral";
-if (categoryScore.score >= 45 && categoryScore.score <= 55) {
-  range = "centrist";
-} else if (categoryScore.score >= 35 && categoryScore.score < 45) {
-  range = "moderate";
-} else if (categoryScore.score >= 25 && categoryScore.score < 35) {
-  range = "balanced";
-}
+const range = getScoreRange(categoryScore.score);
frontend/src/app/api/ideology/route.ts (1)

35-48: Improve similarity calculation with weighted scores.

The current implementation treats all scores equally. Consider adding weights to different aspects of the ideology calculation.

+interface ScoreWeights {
+  dipl: number;
+  econ: number;
+  govt: number;
+  scty: number;
+}
+
+const DEFAULT_WEIGHTS: ScoreWeights = {
+  dipl: 1,
+  econ: 1,
+  govt: 1,
+  scty: 1,
+};
+
 function calculateSimilarity(
   userScores: UserScores,
   ideologyScores: UserScores,
+  weights: ScoreWeights = DEFAULT_WEIGHTS,
 ): number {
   const diff = {
-    dipl: Math.abs(userScores.dipl - ideologyScores.dipl),
-    econ: Math.abs(userScores.econ - ideologyScores.econ),
-    govt: Math.abs(userScores.govt - ideologyScores.govt),
-    scty: Math.abs(userScores.scty - ideologyScores.scty),
+    dipl: Math.abs(userScores.dipl - ideologyScores.dipl) * weights.dipl,
+    econ: Math.abs(userScores.econ - ideologyScores.econ) * weights.econ,
+    govt: Math.abs(userScores.govt - ideologyScores.govt) * weights.govt,
+    scty: Math.abs(userScores.scty - ideologyScores.scty) * weights.scty,
   };

-  return (diff.dipl + diff.econ + diff.govt + diff.scty) / 4;
+  const totalWeight = Object.values(weights).reduce((a, b) => a + b, 0);
+  return (diff.dipl + diff.econ + diff.govt + diff.scty) / totalWeight;
 }
.github/workflows/pr-check.yml (1)

11-11: Remove Trailing Spaces
YAMLlint has flagged multiple trailing spaces (e.g., on lines 11, 14, 19, 38, 76, 79, 84, 90, 95, 109, 112, 117, 123, 129, and 143). Please remove these to ensure consistent file formatting and avoid linting warnings.

Also applies to: 14-14, 19-19, 38-38, 76-76, 79-79, 84-84, 90-90, 95-95, 109-109, 112-112, 117-117, 123-123, 129-129, 143-143

🧰 Tools
🪛 YAMLlint (1.35.1)

[error] 11-11: trailing spaces

(trailing-spaces)

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 0115bec and f296042.

⛔ Files ignored due to path filters (1)
  • frontend/pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (44)
  • .github/workflows/pr-check.yml (1 hunks)
  • biome.json (1 hunks)
  • frontend/biome.json (1 hunks)
  • frontend/eslint.config.mjs (1 hunks)
  • frontend/next.config.mjs (1 hunks)
  • frontend/package.json (1 hunks)
  • frontend/postcss.config.js (1 hunks)
  • frontend/src/app/achievements/page.tsx (3 hunks)
  • frontend/src/app/api/auth/[...nextauth]/route.ts (2 hunks)
  • frontend/src/app/api/auth/logout/route.ts (1 hunks)
  • frontend/src/app/api/auth/session/route.ts (6 hunks)
  • frontend/src/app/api/complete-siwe/route.ts (1 hunks)
  • frontend/src/app/api/confirm-payment/route.ts (1 hunks)
  • frontend/src/app/api/deepseek/route.ts (2 hunks)
  • frontend/src/app/api/docs/route.ts (1 hunks)
  • frontend/src/app/api/fetch-pay-amount/route.ts (2 hunks)
  • frontend/src/app/api/home/route.ts (1 hunks)
  • frontend/src/app/api/ideology/route.ts (5 hunks)
  • frontend/src/app/api/initiate-payment/route.ts (2 hunks)
  • frontend/src/app/api/insights/[testId]/route.ts (2 hunks)
  • frontend/src/app/api/insights/route.ts (2 hunks)
  • frontend/src/app/api/nonce/route.ts (1 hunks)
  • frontend/src/app/api/tests/[testId]/instructions/route.ts (2 hunks)
  • frontend/src/app/api/tests/[testId]/progress/route.ts (3 hunks)
  • frontend/src/app/api/tests/[testId]/questions/route.ts (2 hunks)
  • frontend/src/app/api/tests/[testId]/results/route.ts (2 hunks)
  • frontend/src/app/api/tests/route.ts (3 hunks)
  • frontend/src/app/api/user/check/route.ts (1 hunks)
  • frontend/src/app/api/user/me/route.ts (1 hunks)
  • frontend/src/app/api/user/route.ts (5 hunks)
  • frontend/src/app/api/user/subscription/route.ts (2 hunks)
  • frontend/src/app/api/verify/route.ts (2 hunks)
  • frontend/src/app/api/wallet/route.ts (1 hunks)
  • frontend/src/app/awaken-pro/page.tsx (8 hunks)
  • frontend/src/app/ideology-test/page.tsx (11 hunks)
  • frontend/src/app/insights/page.tsx (8 hunks)
  • frontend/src/app/layout.tsx (1 hunks)
  • frontend/src/app/leaderboard/page.tsx (7 hunks)
  • frontend/src/app/not-found.tsx (2 hunks)
  • frontend/src/app/results/page.tsx (3 hunks)
  • frontend/src/app/tests/instructions/page.tsx (3 hunks)
  • frontend/src/app/types.ts (1 hunks)
  • frontend/src/app/welcome/page.tsx (2 hunks)
  • frontend/tailwind.config.ts (1 hunks)
✅ Files skipped from review due to trivial changes (3)
  • frontend/postcss.config.js
  • frontend/eslint.config.mjs
  • frontend/tailwind.config.ts
🚧 Files skipped from review as they are similar to previous changes (22)
  • frontend/src/app/api/fetch-pay-amount/route.ts
  • frontend/src/app/api/auth/session/route.ts
  • frontend/src/app/api/tests/[testId]/instructions/route.ts
  • frontend/src/app/api/tests/[testId]/questions/route.ts
  • frontend/src/app/layout.tsx
  • frontend/src/app/tests/instructions/page.tsx
  • frontend/src/app/welcome/page.tsx
  • frontend/src/app/api/user/me/route.ts
  • frontend/src/app/awaken-pro/page.tsx
  • frontend/src/app/api/auth/[...nextauth]/route.ts
  • frontend/src/app/api/user/check/route.ts
  • frontend/src/app/not-found.tsx
  • frontend/src/app/leaderboard/page.tsx
  • frontend/src/app/insights/page.tsx
  • frontend/src/app/achievements/page.tsx
  • frontend/src/app/ideology-test/page.tsx
  • frontend/src/app/api/user/route.ts
  • frontend/src/app/results/page.tsx
  • frontend/src/app/api/nonce/route.ts
  • frontend/next.config.mjs
  • frontend/src/app/api/wallet/route.ts
  • frontend/src/app/api/auth/logout/route.ts
🧰 Additional context used
📓 Learnings (1)
frontend/src/app/api/confirm-payment/route.ts (1)
Learnt from: bitfalt
PR: MindVault-Inc/miniapp-monorepo#51
File: frontend/src/app/api/confirm-payment/route.ts:13-14
Timestamp: 2025-01-09T20:53:55.415Z
Learning: The payment confirmation endpoint in `frontend/src/app/api/confirm-payment/route.ts` is boilerplate code that serves as an example implementation and is not intended to be used as-is in production.
🪛 GitHub Actions: PR Check
frontend/src/app/api/confirm-payment/route.ts

[error] 1-1: Type error: Route does not match the required types of a Next.js Route. 'secret' is not a valid Route export field.

🪛 actionlint (1.7.4)
.github/workflows/pr-check.yml

32-32: the runner of "actions/cache@v3" action is too old to run on GitHub Actions. update the action's version to fix this issue

(action)

🪛 YAMLlint (1.35.1)
.github/workflows/pr-check.yml

[error] 11-11: trailing spaces

(trailing-spaces)


[error] 14-14: trailing spaces

(trailing-spaces)


[error] 19-19: trailing spaces

(trailing-spaces)


[error] 38-38: trailing spaces

(trailing-spaces)


[error] 76-76: trailing spaces

(trailing-spaces)


[error] 79-79: trailing spaces

(trailing-spaces)


[error] 84-84: trailing spaces

(trailing-spaces)


[error] 90-90: trailing spaces

(trailing-spaces)


[error] 95-95: trailing spaces

(trailing-spaces)


[error] 109-109: trailing spaces

(trailing-spaces)


[error] 112-112: trailing spaces

(trailing-spaces)


[error] 117-117: trailing spaces

(trailing-spaces)


[error] 123-123: trailing spaces

(trailing-spaces)


[error] 129-129: trailing spaces

(trailing-spaces)


[error] 143-143: no new line character at the end of file

(new-line-at-end-of-file)


[error] 143-143: trailing spaces

(trailing-spaces)

🔇 Additional comments (32)
frontend/src/app/api/docs/route.ts (1)

4-13: LGTM! Improved error handling.

The added error handling is comprehensive and follows best practices:

  • Proper error logging with context
  • Extracts error message safely
  • Returns consistent JSON response format with appropriate status code
frontend/src/app/types.ts (1)

1-34: LGTM! Well-structured interfaces.

The interfaces are well-designed with clear relationships:

  • Question's effect property structure matches TestResult interface
  • TestProgress provides comprehensive test status tracking
  • Achievement interface is simple and clear
frontend/src/app/api/complete-siwe/route.ts (4)

13-18: LGTM! Well-defined response interface.

The SiweResponse interface provides a consistent structure for both success and error cases.


25-40: LGTM! Thorough nonce validation.

The nonce validation includes:

  • Detailed error logging for debugging
  • Consistent response format using SiweResponse

41-56: LGTM! Proper SIWE verification and cleanup.

The code:

  • Validates SIWE message and address
  • Cleans up nonce cookie after successful verification
  • Returns consistent response format

57-68: LGTM! Comprehensive error handling.

The error handling:

  • Logs errors with context
  • Safely extracts error message
  • Returns consistent error response
frontend/src/app/api/home/route.ts (3)

7-21: LGTM! Well-defined interfaces.

The interfaces provide strong type safety:

  • TokenPayload extends JWTPayload with optional address
  • UserResponse covers both success and error cases

23-28: LGTM! Proper environment validation.

Early validation of JWT_SECRET environment variable prevents runtime issues.


30-78: LGTM! Comprehensive error handling and user retrieval.

The implementation:

  • Validates token presence and structure
  • Safely extracts and verifies user data
  • Returns consistent response format with appropriate status codes
  • Includes proper error logging
frontend/src/app/api/user/subscription/route.ts (2)

7-16: LGTM! Well-structured interfaces for improved type safety.

The addition of TokenPayload and SubscriptionResponse interfaces enhances type safety and provides clear response structures.


51-121: LGTM! Improved error handling with consistent response structures.

The refactored GET function now:

  • Uses typed responses consistently
  • Handles errors gracefully
  • Provides clear status codes
frontend/src/app/api/insights/route.ts (2)

11-19: LGTM! Well-defined interfaces for type safety.

The addition of Test and InsightResponse interfaces provides clear type definitions.


94-104: LGTM! Efficient handling of unique tests.

Using a Map to store unique tests is an efficient approach to remove duplicates.

frontend/src/app/api/initiate-payment/route.ts (2)

84-89: Consider using a database transaction for payment ID generation.

The current implementation might lead to race conditions when multiple payments are initiated simultaneously.


99-107: LGTM! Secure cookie configuration.

The payment nonce cookie is properly configured with security options:

  • httpOnly
  • secure
  • strict sameSite
  • appropriate maxAge
frontend/src/app/api/confirm-payment/route.ts (2)

13-24: LGTM! Enhanced type safety with well-structured interfaces.

The addition of PaymentResponse and TokenPayload interfaces improves type safety and response consistency.


73-94: LGTM! Clear subscription extension logic.

The code clearly handles the case of extending an existing subscription:

  • Checks for active subscription
  • Extends by 30 days
  • Returns appropriate response
frontend/src/app/api/deepseek/route.ts (1)

87-94: Consider environment-based API URL configuration.

The DeepSeek API URL should be configurable via environment variables for different environments.

-      "https://api.deepseek.com/v1/analyze",
+      process.env.DEEPSEEK_API_URL ?? "https://api.deepseek.com/v1/analyze",
frontend/src/app/api/verify/route.ts (1)

207-207: Use Date.prototype.toISOString() for consistency.

Good use of toISOString() for consistent date formatting.

frontend/src/app/api/tests/route.ts (1)

192-204: 🛠️ Refactor suggestion

Consider using a transaction for atomic operations.

The creation of a new ideology user ID and the subsequent record creation should be atomic to prevent race conditions.

+// Start a transaction
+await xata.db.transaction(async (tx) => {
   // Get latest ideology_user_id
-  const latestIdeology = await xata.db.IdeologyPerUser.sort(
+  const latestIdeology = await tx.db.IdeologyPerUser.sort(
     "ideology_user_id",
     "desc",
   ).getFirst();
   const nextIdeologyId = (latestIdeology?.ideology_user_id || 0) + 1;

   // Update or create IdeologyPerUser record
-  await xata.db.IdeologyPerUser.create({
+  await tx.db.IdeologyPerUser.create({
     user: user.xata_id,
     ideology: bestMatch.xata_id,
     ideology_user_id: nextIdeologyId,
   });
+});

Likely invalid or redundant comment.

frontend/package.json (1)

37-37: New Development Dependency Added
The addition of "@biomejs/biome": "^1.9.4" to devDependencies is appropriate for integrating Biome linting and formatting features with the new biome.json configuration.

frontend/biome.json (6)

1-7: VCS Configuration Review
The VCS block is set up to use Git with ignore file support; note that "enabled" is false. Confirm this is intentional—if VCS integration with Biome is desired, consider enabling it.


8-43: File Inclusion and Ignore Patterns
The inclusion and ignore patterns are comprehensive and well thought out. They cover most common directories and file types that require linting/formatting while omitting build and test artifacts.


44-50: Formatter Settings Validation
The formatter is configured with a 2-space indent and an 80-character line width, which aligns with standard style practices.


51-53: Organize Imports Enabled
Enabling the organizeImports setting helps maintain consistent import order. This setting is correctly applied.


54-71: Linter Configuration Review
The linter rules are robust and enforce recommended, style, correctness, and suspicious code checks. This will help catch common pitfalls and maintain code quality.


72-81: JavaScript Formatter Settings
The JavaScript-specific formatter options (double quotes, semicolon enforcement) are clearly defined and support consistent code style.

.github/workflows/pr-check.yml (5)

1-6: Workflow Metadata Confirmation
The workflow name ("PR Check") and the pull_request trigger on branches [main, develop] are clearly defined and meet the intended CI/CD objectives.


31-38: Update Cache Action Version
The "Setup pnpm cache" step currently uses actions/cache@v3, which is outdated. It is recommended to update to actions/cache@v4 for improved reliability.
Suggested change:

-        uses: actions/cache@v3
+        uses: actions/cache@v4
🧰 Tools
🪛 actionlint (1.7.4)

32-32: the runner of "actions/cache@v3" action is too old to run on GitHub Actions. update the action's version to fix this issue

(action)

🪛 YAMLlint (1.35.1)

[error] 38-38: trailing spaces

(trailing-spaces)


39-45: Assess Copy Operation for Biome Configuration
In the "Install dependencies" step, the command cp ../biome.json . copies the biome.json file from the parent directory into the frontend folder. Since a biome.json file now exists under frontend, please verify whether this copy operation is intentional or if the path should be adjusted.


73-105: Security Scan Job Review
The security job configuration, including the continue-on-error flag, is acceptable if the intention is to allow the job to complete without blocking the PR on non-critical security scan failures. Confirm this aligns with your project’s risk tolerance.

🧰 Tools
🪛 YAMLlint (1.35.1)

[error] 76-76: trailing spaces

(trailing-spaces)


[error] 79-79: trailing spaces

(trailing-spaces)


[error] 84-84: trailing spaces

(trailing-spaces)


[error] 90-90: trailing spaces

(trailing-spaces)


[error] 95-95: trailing spaces

(trailing-spaces)


106-143: Bundle Analysis Job Validation
The bundle analysis job is set up correctly, with steps for building the application and uploading the analysis results. The configuration appears sound, aside from the noted trailing space issues.

🧰 Tools
🪛 YAMLlint (1.35.1)

[error] 109-109: trailing spaces

(trailing-spaces)


[error] 112-112: trailing spaces

(trailing-spaces)


[error] 117-117: trailing spaces

(trailing-spaces)


[error] 123-123: trailing spaces

(trailing-spaces)


[error] 129-129: trailing spaces

(trailing-spaces)


[error] 143-143: no new line character at the end of file

(new-line-at-end-of-file)


[error] 143-143: trailing spaces

(trailing-spaces)

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

♻️ Duplicate comments (2)
.github/workflows/pr-check.yml (2)

31-38: ⚠️ Potential issue

Update Cache Action Version
The cache step is still using the outdated “actions/cache@v3”. Please update it to “actions/cache@v4” as recommended by both static analysis and previous reviews to avoid potential runner issues.

Proposed change:

-      - name: Setup pnpm cache
-        uses: actions/cache@v3
+      - name: Setup pnpm cache
+        uses: actions/cache@v4
🧰 Tools
🪛 actionlint (1.7.4)

32-32: the runner of "actions/cache@v3" action is too old to run on GitHub Actions. update the action's version to fix this issue

(action)

🪛 YAMLlint (1.35.1)

[error] 38-38: trailing spaces

(trailing-spaces)


64-67: ⚠️ Potential issue

Ensure Test Failures Propagate
The “Run tests” step uses a fallback with “|| echo 'No tests found'” that can mask test failures. Removing the fallback ensures that failing tests correctly break the workflow.

Proposed change:

-      - name: Run tests
-        working-directory: frontend
-        run: pnpm test || echo "No tests found"
+      - name: Run tests
+        working-directory: frontend
+        run: pnpm test
🧹 Nitpick comments (1)
.github/workflows/pr-check.yml (1)

11-11: Remove Trailing Whitespace and Ensure Newline at EOF
Several lines have trailing spaces (lines 11, 14, 19, 38, 78, 81, 86, 92, 97, 111, 114, 119, 125, 131, 139, and 150). Additionally, line 150 is missing a terminating newline character. Removing these extraneous spaces and adding a new line at the end of the file will satisfy YAMLlint and improve file cleanliness.

A sample diff for one affected line (apply similarly across the file):

-    runs-on: ubuntu-latest␣␣
+    runs-on: ubuntu-latest

Ensure you remove trailing spaces on all the specified lines and add a newline after line 150.

Also applies to: 14-14, 19-19, 38-38, 78-78, 81-81, 86-86, 92-92, 97-97, 111-111, 114-114, 119-119, 125-125, 131-131, 139-139, 150-150

🧰 Tools
🪛 YAMLlint (1.35.1)

[error] 11-11: trailing spaces

(trailing-spaces)

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f296042 and 1df0d36.

📒 Files selected for processing (2)
  • .github/workflows/pr-check.yml (1 hunks)
  • frontend/src/app/api/confirm-payment/route.ts (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • frontend/src/app/api/confirm-payment/route.ts
🧰 Additional context used
🪛 actionlint (1.7.4)
.github/workflows/pr-check.yml

32-32: the runner of "actions/cache@v3" action is too old to run on GitHub Actions. update the action's version to fix this issue

(action)

🪛 YAMLlint (1.35.1)
.github/workflows/pr-check.yml

[error] 11-11: trailing spaces

(trailing-spaces)


[error] 14-14: trailing spaces

(trailing-spaces)


[error] 19-19: trailing spaces

(trailing-spaces)


[error] 38-38: trailing spaces

(trailing-spaces)


[error] 78-78: trailing spaces

(trailing-spaces)


[error] 81-81: trailing spaces

(trailing-spaces)


[error] 86-86: trailing spaces

(trailing-spaces)


[error] 92-92: trailing spaces

(trailing-spaces)


[error] 97-97: trailing spaces

(trailing-spaces)


[error] 111-111: trailing spaces

(trailing-spaces)


[error] 114-114: trailing spaces

(trailing-spaces)


[error] 119-119: trailing spaces

(trailing-spaces)


[error] 125-125: trailing spaces

(trailing-spaces)


[error] 131-131: trailing spaces

(trailing-spaces)


[error] 139-139: trailing spaces

(trailing-spaces)


[error] 150-150: no new line character at the end of file

(new-line-at-end-of-file)


[error] 150-150: trailing spaces

(trailing-spaces)

@evgongora evgongora merged commit 2ef70b9 into MindVault-Inc:main Feb 6, 2025
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant