Home / File/ utils.ts — ui Source File

utils.ts — ui Source File

Architecture documentation for utils.ts, a typescript file in the ui codebase. 3 imports, 1 dependents.

File typescript FrameworkTooling SchemaValidation 3 imports 1 dependents 6 functions

Entity Profile

Dependency Diagram

graph LR
  7d2e02dc_279c_932c_e7c4_5c1f3787e593["utils.ts"]
  b969017e_0ead_3c70_277e_2e4416d7a8ed["react"]
  7d2e02dc_279c_932c_e7c4_5c1f3787e593 --> b969017e_0ead_3c70_277e_2e4416d7a8ed
  1d141819_425e_b5fd_4c8e_32f7c6a42cf2["react"]
  7d2e02dc_279c_932c_e7c4_5c1f3787e593 --> 1d141819_425e_b5fd_4c8e_32f7c6a42cf2
  052778fd_1a4c_7f8d_8295_ec523652ac24["user.server"]
  7d2e02dc_279c_932c_e7c4_5c1f3787e593 --> 052778fd_1a4c_7f8d_8295_ec523652ac24
  afdca75e_cdc4_c379_56c7_a08d256702f5["utils.test.ts"]
  afdca75e_cdc4_c379_56c7_a08d256702f5 --> 7d2e02dc_279c_932c_e7c4_5c1f3787e593
  style 7d2e02dc_279c_932c_e7c4_5c1f3787e593 fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

import { useMatches } from "@remix-run/react";
import { useMemo } from "react";

import type { User } from "~/models/user.server";

const DEFAULT_REDIRECT = "/";

/**
 * This should be used any time the redirect path is user-provided
 * (Like the query string on our login/signup pages). This avoids
 * open-redirect vulnerabilities.
 * @param {string} to The redirect destination
 * @param {string} defaultRedirect The redirect to use if the to is unsafe.
 */
export function safeRedirect(
  to: FormDataEntryValue | string | null | undefined,
  defaultRedirect: string = DEFAULT_REDIRECT,
) {
  if (!to || typeof to !== "string") {
    return defaultRedirect;
  }

  if (!to.startsWith("/") || to.startsWith("//")) {
    return defaultRedirect;
  }

  return to;
}

/**
 * This base hook is used in other hooks to quickly search for specific data
 * across all loader data using useMatches.
 * @param {string} id The route id
 * @returns {JSON|undefined} The router data or undefined if not found
 */
export function useMatchesData(
  id: string,
): Record<string, unknown> | undefined {
  const matchingRoutes = useMatches();
  const route = useMemo(
    () => matchingRoutes.find((route) => route.id === id),
    [matchingRoutes, id],
  );
  return route?.data as Record<string, unknown>;
}

function isUser(user: unknown): user is User {
  return (
    user != null &&
    typeof user === "object" &&
    "email" in user &&
    typeof user.email === "string"
  );
}

export function useOptionalUser(): User | undefined {
  const data = useMatchesData("root");
  if (!data || !isUser(data.user)) {
    return undefined;
  }
  return data.user;
}

export function useUser(): User {
  const maybeUser = useOptionalUser();
  if (!maybeUser) {
    throw new Error(
      "No user found in root loader, but user is required by useUser. If user is optional, try useOptionalUser instead.",
    );
  }
  return maybeUser;
}

export function validateEmail(email: unknown): email is string {
  return typeof email === "string" && email.length > 3 && email.includes("@");
}

Subdomains

Dependencies

  • react
  • react
  • user.server

Frequently Asked Questions

What does utils.ts do?
utils.ts is a source file in the ui codebase, written in typescript. It belongs to the FrameworkTooling domain, SchemaValidation subdomain.
What functions are defined in utils.ts?
utils.ts defines 6 function(s): isUser, safeRedirect, useMatchesData, useOptionalUser, useUser, validateEmail.
What does utils.ts depend on?
utils.ts imports 3 module(s): react, react, user.server.
What files import utils.ts?
utils.ts is imported by 1 file(s): utils.test.ts.
Where is utils.ts in the architecture?
utils.ts is located at packages/shadcn/test/fixtures/frameworks/remix-indie-stack/app/utils.ts (domain: FrameworkTooling, subdomain: SchemaValidation, directory: packages/shadcn/test/fixtures/frameworks/remix-indie-stack/app).

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free