diff --git a/Modules/HelloWorld/app/Http/Controllers/HelloWorldController.php b/Modules/HelloWorld/app/Http/Controllers/HelloWorldController.php new file mode 100644 index 00000000..f83a554e --- /dev/null +++ b/Modules/HelloWorld/app/Http/Controllers/HelloWorldController.php @@ -0,0 +1,56 @@ +> + */ + protected $listen = []; + + /** + * Indicates if events should be discovered. + * + * @var bool + */ + protected static $shouldDiscoverEvents = true; + + /** + * Configure the proper event listeners for email verification. + */ + protected function configureEmailVerification(): void {} +} diff --git a/Modules/HelloWorld/app/Providers/HelloWorldServiceProvider.php b/Modules/HelloWorld/app/Providers/HelloWorldServiceProvider.php new file mode 100644 index 00000000..d318ef84 --- /dev/null +++ b/Modules/HelloWorld/app/Providers/HelloWorldServiceProvider.php @@ -0,0 +1,122 @@ +name); + + // ---------------------------------------------------------------- + // Module script (Vue page registration) + // ---------------------------------------------------------------- + // Registers a compiled JS file that the host app injects as a + // diff --git a/Modules/HelloWorld/resources/js/vue-shim.js b/Modules/HelloWorld/resources/js/vue-shim.js new file mode 100644 index 00000000..e5fbabaa --- /dev/null +++ b/Modules/HelloWorld/resources/js/vue-shim.js @@ -0,0 +1,37 @@ +/** + * Vue runtime shim for InvoiceShelf modules. + * + * The host app exposes its Vue instance on window.__invoiceshelf_vue. + * This shim provides a Proxy-based default export that lazily resolves + * Vue APIs on first access — avoiding the crash that happens when the + * module script evaluates before the host has set the global. + * + * For named exports (used by SFC compiled templates), we use a Proxy + * as the module namespace. Vite's lib mode with a default export + * from a Proxy works because the compiled SFC template accesses + * the APIs at render time (long after the host has initialized), + * not at module evaluation time. + */ + +function getVue() { + const vue = window.__invoiceshelf_vue + if (!vue) { + throw new Error( + '[InvoiceShelf Module] Host Vue runtime not available. ' + + 'Ensure the module script loads after the host app.' + ) + } + return vue +} + +// Proxy that forwards all property access to the host's Vue at call time +const vueProxy = new Proxy({}, { + get(_, key) { + return getVue()[key] + }, + has(_, key) { + return key in getVue() + }, +}) + +export default vueProxy diff --git a/Modules/HelloWorld/resources/views/components/layouts/master.blade.php b/Modules/HelloWorld/resources/views/components/layouts/master.blade.php new file mode 100644 index 00000000..8f45477f --- /dev/null +++ b/Modules/HelloWorld/resources/views/components/layouts/master.blade.php @@ -0,0 +1,30 @@ + + + + + + + + + + HelloWorld Module - {{ config('app.name', 'Laravel') }} + + + + + + + + + + {{-- Vite CSS --}} + {{-- {{ module_vite('build-helloworld', 'resources/assets/sass/app.scss') }} --}} + + + + {{ $slot }} + + {{-- Vite JS --}} + {{-- {{ module_vite('build-helloworld', 'resources/assets/js/app.js') }} --}} + + diff --git a/Modules/HelloWorld/resources/views/index.blade.php b/Modules/HelloWorld/resources/views/index.blade.php new file mode 100644 index 00000000..6c350d07 --- /dev/null +++ b/Modules/HelloWorld/resources/views/index.blade.php @@ -0,0 +1,5 @@ + +

Hello World

+ +

Module: {!! config('helloworld.name') !!}

+
diff --git a/Modules/HelloWorld/routes/api.php b/Modules/HelloWorld/routes/api.php new file mode 100644 index 00000000..ad8f2410 --- /dev/null +++ b/Modules/HelloWorld/routes/api.php @@ -0,0 +1,8 @@ +prefix('v1')->group(function () { + Route::apiResource('helloworlds', HelloWorldController::class)->names('helloworld'); +}); diff --git a/Modules/HelloWorld/routes/web.php b/Modules/HelloWorld/routes/web.php new file mode 100644 index 00000000..208babb4 --- /dev/null +++ b/Modules/HelloWorld/routes/web.php @@ -0,0 +1,8 @@ +group(function () { + Route::resource('helloworlds', HelloWorldController::class)->names('helloworld'); +}); diff --git a/Modules/HelloWorld/vite.config.js b/Modules/HelloWorld/vite.config.js new file mode 100644 index 00000000..f1d593f0 --- /dev/null +++ b/Modules/HelloWorld/vite.config.js @@ -0,0 +1,69 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import { resolve } from 'path' + +/** + * Module build config. + * + * Produces a single `resources/dist/init.js` ES module that the host app + * loads via