npm package: @shardev/vite-plugin-modular
Description: Advanced Laravel Modules support for Vite (monorepo + namespace resolver)
Author: Elbert Tous
Latest version: 1.2.7

# @shardev/vite-plugin-modular

Vite plugin for modular Laravel applications.

This plugin allows you to:

-   Discover Vite modules inside `packages/`
-   Automatically merge aliases and rollup inputs
-   Enable per-module HMR
-   Watch either `srcDir` or `publishedDir`
-   Respect module enable/disable via `modules.json`
-   Keep modules fully isolated

Designed for large-scale Laravel + modular monorepo architectures.

------------------------------------------------------------------------

# Installation

``` bash
npm install @shardev/vite-plugin-modular --save-dev
```

------------------------------------------------------------------------

# Architecture Overview

The system is composed of two plugins:

1.  `laravelModule` -- Used inside each module.
2.  `laravelModules` -- Used at the root Vite config to auto-discover
    modules.

------------------------------------------------------------------------

# Module Structure Example

    packages/
     └── shardevcom/
          └── blog/
               ├── vite.config.ts
               └── resources/
                    └── react/
                         └── src/
                              └── main.ts

------------------------------------------------------------------------

# Module-Level Configuration

`packages/shardevcom/blog/vite.config.ts`

``` ts
import { defineConfig } from 'vite'
import { laravelModule } from '@shardev/vite-plugin-modular'

export default defineConfig({
    plugins: [
        laravelModule({
            name: 'blog',
            mode: 'integrated',
            srcDir: 'resources/react/src',
            input: {
                main: 'resources/react/src/main.ts'
            },
            buildDir: 'build/blog'
        })
    ]
})
```

------------------------------------------------------------------------

# Root Configuration

`vite.config.ts`

``` ts
import { defineConfig } from 'vite'
import { laravelModules } from '@shardev/vite-plugin-modular'

export default defineConfig({
    plugins: [
        laravelModules({
            modulesDir: 'packages',
            statusesFile: 'modules.json',
            debug: false,
            useMetaCache: true
        })
    ]
})
```

------------------------------------------------------------------------

# Module Enable / Disable

Create a `modules.json` file:

``` json
{
    "blog": true,
    "shop": false
}
```

If a module is set to `false`, it will not be loaded.

------------------------------------------------------------------------

# Watch Behavior

Each module registers a watcher based on:

    usePublished && publishedDir ? publishedDir : srcDir

This allows:

-   Developing directly from source
-   Or watching compiled/published output

------------------------------------------------------------------------

# HMR Behavior

When a file changes inside a module:

-   The module graph invalidates the affected module
-   A manual HMR update is triggered
-   Only the affected module is refreshed

This ensures isolation between modules.

------------------------------------------------------------------------

# Production Behavior

During `vite build`:

-   All module inputs are merged
-   Aliases are merged
-   Rollup handles all entries
-   Outputs remain isolated per module

------------------------------------------------------------------------

# License

MIT