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

vite-plugin-ferry

v1.9.2

Published

Ferries Laravel types to your TypeScript frontend

Readme

vite-plugin-ferry

Type-safe Inertia apps end to end: TypeScript for routes, enums, resources, page props, and form types, generated straight from your Laravel backend.

npm version npm downloads License

Ferry reads your Laravel app and generates TypeScript for the surface your Inertia frontend touches: named routes, PHP enums, JsonResource shapes, per-page Inertia props, and FormRequest data. Your frontend is typed from the backend that owns the data, so a change to a resource or a rule shows up as a type error where the frontend uses it. Nothing lands in your project tree: runtime code ships as Vite virtual modules, types as one generated ambient .d.ts, and everything regenerates on every run.

Install

npm install vite-plugin-ferry typescript@^5 --save-dev

Quick start

Add the plugin to vite.config.ts:

import { defineConfig } from 'vite';
import ferry from 'vite-plugin-ferry';

export default defineConfig({
  plugins: [ferry()],
});

That's it. No tsconfig changes, no generated files to gitignore. See Getting started for how generation runs and how the types load.

Ferry generates six virtual modules you import from directly:

import { OrderStatus } from '@ferry/enums';        // enum classes
import type { PostResource } from '@ferry/resources'; // resource shapes
import type { UsersShowProps } from '@ferry/pages';   // per-page Inertia props
import type { StoreUserRequest } from '@ferry/forms';  // form data shapes
// @ferry/route and @ferry/enum back route() and the Enum base class

The typed surface, in one page component:

import type { UsersShowProps } from '@ferry/pages';
import type { StoreUserRequest } from '@ferry/forms';

const page = usePage<UsersShowProps>();
page.props.user;             // UserResource

const href = route('users.show', { user: 1 }); // usable as a string AND as Inertia's { url, method }
route.is('users.*');                            // current-route check: name, wildcard, or an array of either

const form = useForm<StoreUserRequest>({ name: '', role: 'admin' });
form.data.role;              // 'admin' | 'editor' | 'viewer'
form.errors['profile.bio'];  // error keys derived from the shape

What it generates

  • Routes (@ferry/route): a typed route() helper that resolves named routes to their URL and method client-side, with zero route table shipped to the browser.
  • Enums (@ferry/enum, @ferry/enums): PHP enums become real JS classes with is/from/fromOrFail/values/keys/cases/options, plus a <Enum>Value backing-value union for serialized data.
  • Resources (@ferry/resources, @ferry/pagination): precise types for your JsonResource classes from static toArray() analysis plus real column and cast metadata, degrading gracefully instead of breaking your build. Resource::collection() over a paginator types as the real { data, links, meta } envelope.
  • Page props (@ferry/pages): the props each Inertia page receives, typed through usePage<T>(), with shared props typed through Inertia's own augmentation.
  • Form types (@ferry/forms): the data shape of your FormRequest classes, typed through useForm<T>() with form.errors keys derived for free.
  • Environment variables (import.meta.env): every VITE_-prefixed env var typed as string, merged into Vite's own ImportMetaEnv — keys only, no values, no import.

Any field ferry can't resolve statically degrades instead of breaking the build, and you can pin it precisely with a @ferry docblock tag.

Documentation

Contributing

Issues and pull requests are welcome. Run the test suite with npm test.

License

See LICENSE for details.