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-app-boundaries

v0.1.0

Published

Enforce architectural boundaries between app folders in Vite

Readme

vite-plugin-app-boundaries

Enforce strict architectural boundaries between application folders in Vite.

This plugin prevents one app (e.g. Front) from importing code from another app (e.g. Pro) at build time and dev time, not just via linting.

If a boundary is violated, Vite errors immediately.


Why this exists

Lint rules are easy to bypass. Aliases hide real paths. Large multi-front apps rot over time.

This plugin makes architecture non-negotiable by enforcing rules directly in Vite's module resolution graph.


Features

  • ✅ Enforce boundaries between any number of apps
  • ✅ Errors in dev AND build
  • ✅ Alias-aware (uses Vite's resolver)
  • ✅ Configurable allowlists
  • ✅ Zero runtime cost
  • ✅ Works with Vite 5 / 6 / 7

Example use case

resources/js/Apps/
├── Front/
├── Pro/
└── Shared/

Rules:

  • Front cannot import from Pro
  • Pro cannot import from Front
  • ✅ Both can import from Shared

Installation

npm install -D vite-plugin-app-boundaries

or

pnpm add -D vite-plugin-app-boundaries

Basic usage

vite.config.ts

import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import { enforceAppBoundaries } from "vite-plugin-app-boundaries";

export default defineConfig({
  plugins: [
    enforceAppBoundaries({
      root: "resources/js/Apps",

      apps: {
        Front: {
          path: "Front",
          allowImportsFrom: ["Shared"],
        },

        Pro: {
          path: "Pro",
          allowImportsFrom: ["Shared"],
        },

        Shared: {
          path: "Shared",
        },
      },
    }),

    react(),
  ],
});

What happens on violation

// Apps/Front/pages/welcome.tsx
import Editor from "@/Apps/Pro/components/editorjs";

⬇️

🚫 App boundary violation

Importer:
.../Apps/Front/pages/welcome.tsx
(app: Front)

Imported:
.../Apps/Pro/components/editorjs.tsx
(app: Pro)

Allowed imports for Front:
Shared

Vite stops immediately.


Configuration reference

root

Root directory that contains all apps.

root: "resources/js/Apps"

apps

Each app has:

  • path: folder name under root
  • allowImportsFrom: optional list of app names it may import from
apps: {
  Front: {
    path: "Front",
    allowImportsFrom: ["Shared"],
  },

  Admin: {
    path: "Admin",
    allowImportsFrom: ["Shared", "Pro"],
  },
}

debug (optional)

Enable verbose logging to see exactly how Vite resolves imports.

enforceAppBoundaries({
  debug: true,
  ...
});

Useful when diagnosing aliases or unexpected resolution.


ESLint mirror rules (recommended)

This plugin enforces boundaries at build time.
For editor errors, mirror the rules using ESLint.

Install

npm install -D eslint-plugin-boundaries

Example .eslintrc.cjs

module.exports = {
  plugins: ["boundaries"],

  settings: {
    "boundaries/include": ["resources/js/**/*"],

    "boundaries/elements": [
      { type: "front", pattern: "resources/js/Apps/Front/**" },
      { type: "pro", pattern: "resources/js/Apps/Pro/**" },
      { type: "shared", pattern: "resources/js/Apps/Shared/**" },
    ],
  },

  rules: {
    "boundaries/element-types": [
      "error",
      {
        default: "disallow",
        rules: [
          { from: "front", allow: ["shared"] },
          { from: "pro", allow: ["shared"] },
          { from: "shared", allow: ["shared"] },
        ],
      },
    ],
  },
};

What this plugin does NOT do

  • ❌ It does not replace ESLint
  • ❌ It does not rewrite imports
  • ❌ It does not enforce runtime isolation

Recommended setup:

  • This plugin → build-time enforcement
  • ESLint boundaries rules → editor feedback

License

MIT