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

@texaryn/angular

v0.4.2

Published

Schema-driven forms and display documents for Angular, with signals, standalone components and default widgets

Readme

@texaryn/angular

Repository coverage, SonarQube Cloud

Angular signal bindings and default widgets for Texaryn.

The package renders the Texaryn runtime through standalone Angular components. It uses Angular signals to observe Texaryn stores. Schema projection, validation, and form commands stay in @texaryn/core and the selected schema adapter.

Install

pnpm add @texaryn/core @texaryn/schema-json @texaryn/angular

Angular 20 or later is required. The consuming application supplies Angular as a peer dependency.

Use

Create the schema adapter before the component is created. Call createForm from an Angular injection context, such as a component field initializer, so the runtime lifetime follows that component's DestroyRef.

import { Component } from '@angular/core'
import { createJsonSchemaAdapter } from '@texaryn/schema-json'
import { createDefaultRegistry, createForm, FormRoot } from '@texaryn/angular'

const adapter = await createJsonSchemaAdapter({
  type: 'object',
  properties: {
    name: { type: 'string', title: 'Name' },
    email: { type: 'string', format: 'email', title: 'Email' },
  },
  required: ['name'],
})

@Component({
  selector: 'app-profile-form',
  standalone: true,
  imports: [FormRoot],
  template: `
    <texaryn-form-root
      [form]="form"
      [registry]="registry"
      idPrefix="profile"
      [showErrorSummary]="true"
    />
  `,
})
export class ProfileForm {
  readonly form = createForm(adapter, { initialData: { name: '', email: '' } })
  readonly registry = createDefaultRegistry()
}

The idPrefix must be unique among Texaryn forms on the same page. This makes every label and error reference deterministic across server rendering and hydration.

FormRoot renders the field tree only. Wrap it in the application's native <form novalidate> and dispatch { type: 'Submit' } from the form submit handler when the user submits.

Custom widgets

Register standalone component classes that expose a required node input. Container components can inject FORM_CONTEXT through useFormContext() and render children with NodeRenderer.

import { ChangeDetectionStrategy, Component, input } from '@angular/core'
import type { UINode } from '@texaryn/core'
import type { AngularWidget } from '@texaryn/angular'

@Component({
  selector: 'app-custom-widget',
  standalone: true,
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `{{ node().annotations.title ?? node().id }}`,
})
export class CustomWidget implements AngularWidget {
  readonly node = input.required<UINode>()
}

Angular Forms

The binding keeps Texaryn's runtime as the source of form data and validation. It does not create a second FormGroup or mirror values into Angular Forms. Use Angular controls directly in a custom Texaryn widget when an application needs a specialized control.