react-server675fbba4
react-serverfilespackagesreact-serverlibutilsdirectives.mjs
packages/react-server/lib/utils/directives.mjsmjs1.0 KiB24a0ddfd
/**
 * Parse the directive prologue (the `directive` field of top-of-file
 * ExpressionStatement nodes) and detect a `"use client"` directive,
 * including modifier flags such as `; no-ssr`.
 *
 * The directive grammar is intentionally permissive: segments are
 * separated by `;` and individual whitespace is ignored, so all of
 *
 *   "use client"
 *   "use client; no-ssr"
 *   "use client;no-ssr"
 *   "use client ; no-ssr"
 *   "use client;   no-ssr"
 *
 * resolve to the same `{ isClient: true, isNoSSR: true|false }` shape.
 *
 * Returns `null` when no `"use client"` directive is found, so the
 * common idiom is `parseClientDirective(directives)?.isClient`.
 */
export function parseClientDirective(directives) {
  if (!directives) return null;
  for (const directive of directives) {
    if (typeof directive !== "string") continue;
    const parts = directive.split(";").map((p) => p.trim());
    if (parts[0] !== "use client") continue;
    return {
      isClient: true,
      isNoSSR: parts.slice(1).some((p) => p === "no-ssr"),
    };
  }
  return null;
}