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 🙏

© 2025 – Pkg Stats / Ryan Hefner

nuxt-uploads

v0.1.1

Published

Simple file uploads for Nuxt with Nitro Storage

Downloads

188

Readme


Features

  • Zero Config - Just set a path, the module handles the rest
  • Nitro Storage - Automatic storage configuration
  • Auto Validation - File size and type validation out of the box
  • Serve Route - Optional automatic route to serve uploaded files
  • Type Safe - Full TypeScript support

Quick Setup

Install the module:

npx nuxi module add nuxt-uploads

Add configuration to your nuxt.config.ts:

export default defineNuxtConfig({
  modules: ['nuxt-uploads'],
  uploads: {
    basePath: './uploads',
  },
})

That's it! You can now use useUploads() in your server routes.

Usage

Basic Upload

// server/api/upload.post.ts
export default defineEventHandler(async (event) => {
  return await useUploads().save(event)
})

This returns:

[
  {
    "key": "1702847123456-abc123.jpg",
    "originalName": "photo.jpg",
    "size": 45000,
    "type": "image/jpeg"
  }
]

Serve Uploaded Files

Enable the serve route in your config:

export default defineNuxtConfig({
  uploads: {
    basePath: './uploads',
    serve: '/uploads', // Files accessible at /uploads/:key
  },
})

Now files are available at http://localhost:3000/uploads/1702847123456-abc123.jpg

Full API

const uploads = useUploads()

// Save files from form data
const saved = await uploads.save(event)

// Save with custom options
const saved = await uploads.save(event, {
  key: 'custom-name.jpg',        // Custom key instead of UUID
  maxSize: 5 * 1024 * 1024,      // Override max size
  allowedTypes: ['image/png'],   // Override allowed types
})

// Get file data
const buffer = await uploads.get('file-key.jpg')

// Delete a file
await uploads.remove('file-key.jpg')

// List all files
const keys = await uploads.list()

// Check if file exists
const exists = await uploads.exists('file-key.jpg')

// Access raw storage (for advanced use)
uploads.storage

Configuration

export default defineNuxtConfig({
  uploads: {
    // Base path for file storage (required)
    basePath: './uploads',

    // Maximum file size in bytes (default: 10MB)
    maxSize: 10 * 1024 * 1024,

    // Allowed MIME types (default: ['*'] = all)
    // Supports wildcards like 'image/*'
    allowedTypes: ['image/*', 'application/pdf'],

    // Serve route path (default: false = disabled)
    serve: '/uploads',

    // Custom MIME type mappings (extends defaults)
    mimeTypes: {
      avif: 'image/avif',
      heic: 'image/heic',
    },
  },
})

Client-Side Upload Example

<script setup>
async function upload(event) {
  const file = event.target.files[0]
  const formData = new FormData()
  formData.append('file', file)

  const result = await $fetch('/api/upload', {
    method: 'POST',
    body: formData,
  })

  console.log('Uploaded:', result)
}
</script>

<template>
  <input type="file" @change="upload">
</template>

Contribution

# Install dependencies
pnpm install

# Generate type stubs
pnpm dev:prepare

# Develop with the playground
pnpm dev

# Build the playground
pnpm dev:build

# Run ESLint
pnpm lint

# Run Vitest
pnpm test
pnpm test:watch

# Release new version
pnpm release

License

MIT License