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

@madebyfabric/livewire-file-upload-tools

v0.2.2

Published

Composable file transformation tools for Livewire and Flux uploads

Readme

Livewire file upload tools

Reusable browser-side file transformation tools for Flux file uploads in Laravel Livewire applications.

Install

npm install @madebyfabric/livewire-file-upload-tools

The built-in image processors use cropperjs and compressorjs; they are installed as package dependencies. Import Cropper's stylesheet in the app when using the crop processor:

import "cropperjs/dist/cropper.css";

Quick start

Call the setup function once from the app's browser entry point. It installs the built-in plugins and the Flux adapter without changing the DOM during module import.

import { registerFileUploadTools } from "@madebyfabric/livewire-file-upload-tools";

registerFileUploadTools();

Opt out of a built-in plugin when a project does not need it:

registerFileUploadTools({ processors: ["compression"] });

The cleanup function is useful with Vite hot module replacement or when mounting and unmounting an app:

const cleanup = registerFileUploadTools();

import.meta.hot?.dispose(cleanup);

Marking an upload for transformation

Add the processor names to data-file-transform in the order they should run:

<ui-file-upload
    wire:model="photos"
    data-file-transform="image-compression image-crop"
    data-image-crop-modal="photo-crop"
></ui-file-upload>

The crop processor expects a Flux modal containing an element with data-image-crop-editor, data-image-crop-stage, data-image-crop-image, data-image-crop-confirm, and data-image-crop-cancel. Set data-image-crop-output-size on the editor to override the default 512px square output.

Compression accepts optional per-upload values through data-compress-max-dimension and data-compress-quality.

Plugins and custom processors

A plugin is the extension seam for adding future functionality. It has a name and a register function. Inside register, use the supplied API to add processors or adapters. The plugin can return a cleanup function.

import {
    registerFileUploadTools,
    registerFileUploadPlugin,
} from "@madebyfabric/livewire-file-upload-tools";

const pdfPlugin = {
    name: "pdf-preview",
    register({ registerProcessor }) {
        return registerProcessor("pdf-preview", async (files, context) => {
            // Transform files or coordinate with a project-specific editor.
            return files;
        });
    },
};

registerFileUploadTools({ plugins: ["compression", "crop", pdfPlugin] });

For a plugin that is installed independently, the lower-level installer is also available:

const cleanup = registerFileUploadPlugin(pdfPlugin);

Custom processors

Processors receive the current files and a context object. They may return a new array synchronously or asynchronously.

import { registerFileUploadProcessor } from "@madebyfabric/livewire-file-upload-tools";

registerFileUploadProcessor("add-prefix", (files, context) => {
    return files.map(
        (file) => new File([file], `upload-${file.name}`, {
            type: file.type,
            lastModified: file.lastModified,
        }),
    );
});
<ui-file-upload
    wire:model="document"
    data-file-transform="add-prefix"
    data-upload-purpose="invoice"
></ui-file-upload>

context contains source, fieldName, element, and plain data-* values under attributes. If a processor fails, the adapter sends the original files through so an optional transformation cannot make the upload unusable.

Lower-level exports

The package also exports processFileUpload, processFileUploadOrFallback, createFileUploadContext, registerFileUploadPlugin, registerFluxFileUploadAdapter, registerImageCropProcessor, registerImageCompressionProcessor, cropImageFiles, and transformImageFiles for applications that need custom setup.