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

@app-studio/qa-studio

v0.6.0

Published

State Fixture data shared by component tests and Debug Studio, plus live browser adapters compiled from original App Studio feature specs.

Readme

@app-studio/qa-studio

Debug Studio and browser adapters for two explicit contracts.

State Fixture v3

A render-only component or screen state:

{
  "schemaVersion": 3,
  "kind": "state-fixture",
  "screen": "content/notes:NotesListPage",
  "outcome": "worst",
  "states": [{
    "id": "content/notes:empty",
    "summary": "A new workspace has no notes yet",
    "routes": [{ "match": "/notes", "method": "GET", "answer": { "items": [] } }],
    "persona": "connected",
    "viewport": { "preset": "desktop" }
  }]
}

The same fixture feeds component tests, Debug Studio, and qa state run --id. It contains no product actions and makes no end-to-end claim.

import { installState, statesFrom, type StateFixtureFile } from '@app-studio/qa-studio';

The React host supplies StateEntry[], renderState, persona setup, and optional store bootstrap. Deep links use ?state=<id> and the rendered boundary exposes data-state=<id>.

Browser adapters add qa-studio=agent by default. In that presentation, Debug Studio mounts only the selected application pane: no toolbar, state picker, catalog navigation, or human seed warning. Opening the Studio directly without that parameter keeps the full interactive shell. An application-owned adapter can opt back into it with studioPresentation: 'interactive'.

Original App Studio feature flows

The original specs/features/*.json files are executable. The core compiler joins feature.userExperience to optional specs/forms/*.json, separates each if condition from the nominal path, and materializes a portable flow for Playwright or wdio/Appium:

import { defineScenarioSuite } from '@app-studio/qa-studio/playwright';
defineScenarioSuite({
  test,
  expect,
  rootDir: process.cwd(),
  pattern: 'specs/features/*.json',
  forms: 'specs/forms/*.json',
  prepare: async ({ scenario }) => prepareFeatureWorld(scenario),
});

User actions operate the control named by the original eventId (or the form's exact data-testid). App actions assert routes, real requests and modal state. Explicit Scenario v3 files remain supported for non-generated repositories, but App Studio projects do not copy their flow into one.

QA_BROWSER_PROFILE=fast runs the same compiled feature flow and writes its machine-readable report without checkpoint media. The default proof profile keeps the strict visual evidence. Browser engine selection remains application-owned and is addressed through qa scenario run --engine ....

Targeted state browser adapter

defineStatesSuite({
  test,
  expect,
  rootDir: process.cwd(),
  pattern: 'src/features/**/states/*.state.json',
});

Lightpanda hosts should use @app-studio/qa-studio/puppeteer. Its runPuppeteerScenarioSuite and runPuppeteerStateSuite functions preserve the same JSON graph, request evidence and verdicts without Playwright Test's Chromium-only context emulation. The application still owns server startup, the CDP process, and its State Fixture preparation callback.

QA_STATE_ID narrows execution to one fixture. The CLI also sends QA_BROWSER_HEADLESS=true and QA_STUDIO_PRESENTATION=agent. The adapter waits for the real rendered boundary, checks non-empty DOM unless rendersNothing is declared, collects page errors, and reports fabricated API answers. It adds no dwell time, captions, or video requirement.