npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@orcestr/auth-forms

v0.5.1

Published

Ready authentication forms built with @orcestr/ui, without pages or routing ownership.

Readme

@orcestr/auth-forms

npm License: MPL 2.0

Готовые формы авторизации на @orcestr/ui. Пакет экспортирует формы, но не страницы, routes, metadata и product branding.

Установка

npm install @orcestr/auth-core @orcestr/auth-react @orcestr/auth-forms
npm install @orcestr/ui @tanstack/react-query react react-dom react-icons

Формы

  • LoginForm
  • RegisterForm
  • ForgotPasswordForm
  • ResetPasswordForm
  • VerifyEmailForm
  • ChangePasswordForm
  • OAuthButtons

Локализация

Полные английский и русский словари встроены в пакет. Приложение выбирает locale и может переопределять product wording без копирования форм:

import { AuthI18nProvider, LoginForm } from "@orcestr/auth-forms";

<AuthI18nProvider locale="ru">
  <LoginForm
    next="/dashboard"
    registerHref="/register?next=%2Fdashboard"
    onSuccess={(user) => router.replace("/dashboard")}
  />
</AuthI18nProvider>;

Сообщения выбираются по стабильным API error codes вроде invalid_credentials, а не по английскому fallback-тексту сервера. Поэтому смена locale применяется и к validation/request errors, и к подписям формы.

Формы принимают callbacks, ссылки, slots и product extensions, включая registration extraPayload и legalContent. Consumer собирает страницы из семантического HTML и существующих layout primitives @orcestr/ui; application routes и surface-aware navigation остаются локальными.

Компоненты OAuth-кнопок

По умолчанию OAuth-провайдеры отображаются стандартными полноразмерными кнопками. Продукт может одним компонентом заменить все кнопки, отдельно переопределить нужных провайдеров и выбрать компоновку группы, не копируя логику авторизации:

import { LoginForm, type OAuthProviderButtonProps } from "@orcestr/auth-forms";
import { IconButton, Tooltip } from "@orcestr/ui";
import { FcGoogle } from "react-icons/fc";

function GoogleButton({ label, onClick }: OAuthProviderButtonProps) {
  return (
    <Tooltip content={label}>
      <IconButton type="button" aria-label={label} onClick={onClick} round>
        <FcGoogle />
      </IconButton>
    </Tooltip>
  );
}

<LoginForm
  methods={methods}
  oauthButtons={{
    placement: "after-submit",
    direction: "row",
    justify: "center",
    buttonComponents: { google: GoogleButton },
  }}
/>;

Компонент получает провайдера, локализованную доступную подпись и готовое действие onClick. Client ID, PKCE, state, redirect URI и навигация остаются внутри библиотеки.

placement принимает before-fields, after-submit или after-links и одинаково работает в формах входа и регистрации.

Custom OAuth transport и provider hints

Web default по-прежнему собирает URL провайдера и присваивает его window.location.href. Desktop и другие hosted surfaces могут заменить только transport, сохранив те же кнопки и orchestration legal-действия:

<LoginForm
  methods={methods}
  oauthLegalConsent={false}
  oauthButtons={{
    autoAuthorizeProvider: providerHint,
    authorizeHandler: (provider, clientId, next, callbackPayload) =>
      nativeAuthorize({ provider, clientId, next, callbackPayload }),
  }}
/>

autoAuthorizeProvider запускается не более одного раза на mounted группу кнопок и только после того, как запрошенный provider одновременно появился в methods.allowed_oauth_providers и получил непустой client ID. Пока форма disabled, запуск ожидает. Так trusted provider hint не может начать авторизацию через недоступного провайдера.

По умолчанию OAuth использует gate legalConsent, как и раньше. Передавайте oauthLegalConsent={false} только когда внешний authorization flow показывает и сохраняет те же документы; password login продолжает использовать настроенный legal gate.

Версионированное принятие документов

LoginForm и RegisterForm могут защищать password- и OAuth-действия общей настраиваемой модалкой юридических документов. Сами документы принадлежат приложению и могут загружаться из БД; пакет отвечает за отображение, обязательные и необязательные галочки, продолжение действия и перенос payload через OAuth callback state.

<LoginForm
  legalConsent={{
    selectAllOnFirstDocumentCheck: true,
    storage: { key: "my-product:auth-legal-consent" },
    documents: legalDocuments.map((document) => ({
      id: document.slug,
      title: document.title,
      version: document.version,
      href: `/legal/${document.slug}`,
      required: document.required,
      acceptance: {
        document_slug: document.slug,
        version: document.version,
        language: document.language,
      },
    })),
  }}
/>

Для отключения gate используется enabled: false. Если backend ожидает другой контракт, можно задать payloadKey или buildPayload. Количество обязательных и необязательных документов не ограничено.

selectAllOnFirstDocumentCheck: true превращает первую галочку в компактное управление всем списком: при установке выбираются все документы, при снятии очищается весь выбор. Если каждое согласие должно устанавливаться независимо, параметр указывать не нужно.

Принятые пары id и version по умолчанию сохраняются в localStorage браузера. Если версии всех текущих обязательных документов уже сохранены, модальное окно не показывается, но актуальные документы всё равно добавляются в payload входа, регистрации или OAuth. Новый обязательный документ или новая версия обязательного документа снова откроют окно; ещё актуальные ранее выбранные пункты будут восстановлены. Изменение необязательного документа само по себе не требует повторного подтверждения.

Для разделения нескольких политик на одном origin задайте storage: { key: "your-product:legal-consent" }. storage: false полностью отключает сохранение. Ключ по умолчанию — @orcestr/auth-forms:legal-consent. Запись в браузере нужна только для удобства пользователя: она не является серверным аудитом или границей безопасности. Backend должен по-прежнему проверять и сохранять версии документов из отправленного payload.