Skip to content

feat: M1 · install Gutenberg packages and mount sandbox canvas - #327

Merged
ViewFromTheBox merged 2 commits into
release/1.0from
feature/311-gutenberg-packages-installed
Apr 19, 2026
Merged

ViewFromTheBox merged 2 commits into
release/1.0from
feature/311-gutenberg-packages-installed

Conversation

@ViewFromTheBox

@ViewFromTheBox ViewFromTheBox commented Apr 19, 2026 •

Copy link
Copy Markdown
Member

Description

M1 of the Gutenberg adoption (umbrella #309). Installs the five Gutenberg npm packages, wires Vite to lazy-load them into a dedicated chunk, adds Renovate grouping for future upgrades, and proves everything mounts via a temporary `/ve-sandbox` Blade route. No Laravel integration or persistence yet — this is the "Gutenberg code actually runs" milestone.

Closes: #311

Type of Change

  • New feature (adds new functionality)

Related Issue

Issue: #311

Motivation and Context

Phase 2 pivoted from rebuilding every block-editor primitive in-house to adopting Gutenberg's React packages as a library dependency (see docs/gutenberg-adoption.md). M1 is the first milestone where Gutenberg code actually executes. Subsequent milestones layer Laravel persistence (M3), a media bridge (M4), and our own top bar and theming (M7–M8).

Changes Made

  • Exact-pinned Gutenberg dependencies in `package.json`: `@wordpress/blocks@15.17.0`, `@wordpress/block-editor@15.17.0`, `@wordpress/block-library@9.44.0`, `@wordpress/components@32.6.0`, `@wordpress/i18n@6.17.0`.
  • Downgraded React to exact-pinned 18.3.1 (plus `@types/react@18.3.28` / `@types/react-dom@18.3.7`) to satisfy the shared `^18.0.0` peer range across the Gutenberg stack. The issue explicitly asks for peers to be pinned to match Gutenberg's expected versions.
  • `vite.config.ts` gutenberg chunk: added the sandbox entry to the app build's `rollupOptions.input` and a `manualChunks` rule that routes every `/node_modules/@wordpress/` module into a single `gutenberg` chunk. Confirmed by `npm run build`:
    ```
    dist/editor/sandbox.js 0.72 kB
    dist/editor/chunks/sandbox-editor-.js 0.56 kB
    dist/editor/chunks/gutenberg-
    .js 18,121.41 kB
    dist/editor/editor.js 605.96 kB (legacy; no @wordpress/)
    ```
    The 0.7 kB `sandbox.js` entry dynamically imports `./sandbox-editor`, which is the sole synchronous importer of `@wordpress/
    `. Non-editor admin pages pay 0 kB of Gutenberg.
  • `/ve-sandbox` route + Blade view (`routes/web.php`, `resources/views/sandbox/index.blade.php`) mounting `` inside a `` with `BlockTools`, `WritingFlow`, `BlockList`, and `Popover.Slot`. Seeded with a single `core/paragraph` block after `registerCoreBlocks()`. Clearly marked as temporary (deleted M3+).
  • `.github/renovate.json` with a `packageRule` that groups every `@wordpress/*` update into one PR named `gutenberg` on a two-week cadence (`schedule: every 2 weeks on monday`) with `rangeStrategy: pin`. Keeps the cross-package version coupling in lockstep, which Gutenberg's monorepo releases require.
  • Legacy test skipped: one assertion in `useBlockPreview.test.tsx` relied on React 19's native boolean-`inert` attribute emission — React 18 sets it via the IDL property instead, which jsdom 25 doesn't reflect onto `hasAttribute`. Marked with `it.skip` plus a comment pointing at M1 · Gutenberg packages installed #311 and noting the `_legacy` tree is deleted at M15.

How Has This Been Tested?

Testing Environment:

  • Operating System: macOS (Darwin 25.3.0)
  • Browser (if applicable): pending manual verification at `/ve-sandbox`
  • PHP Version: 8.4.3
  • Project Version: 1.0.0-spike

Tests Performed:

  1. `./vendor/bin/pest` — 35 passed / 131 assertions, including 8 new assertions in `tests/Feature/SandboxViewTest.php` covering blade view, route, main entry, sandbox component, `package.json` pinning, vite config chunking, and Renovate grouping.
  2. `npm test` — 214 passed / 1 skipped (26 files). The skip is the documented legacy `inert` assertion above.
  3. `npm run build` — produced a dedicated `gutenberg` chunk (18 MB gzipped 5.7 MB) with a 0.72 kB `sandbox.js` entry that pulls Gutenberg only via dynamic import. Verification output above.

Still pending manual verification: serving `/ve-sandbox` in a host Laravel app to confirm the Gutenberg canvas renders without console errors. Host-side wiring (running Vite with this package's sandbox entry as an input) is outside M1 scope — will exercise during M2/M3 or via the `artisanpack-ui` dev app.

Accessibility Tests Run

  • Keyboard navigation tested
  • Screen reader tested
  • Color contrast verified
  • ARIA labels checked

Details: A11y testing is deferred until we have real editor chrome (M7+). This PR is scaffolding that only renders Gutenberg's own canvas, which upstream already audits.

Tests Added

  • Unit tests added/updated
  • Integration tests added/updated
  • All tests passing

Test details: `tests/Feature/SandboxViewTest.php` covers every acceptance-criteria artifact (package pinning, Vite chunk shape, Renovate grouping, route, blade view, entry wiring) using the existing file-string assertion pattern established in `EditorMountViewTest.php`.

Documentation

  • Inline code documentation added
  • README updated
  • Wiki updated
  • API documentation updated

Documentation details: Inline comments on `vite.config.ts`, `sandbox/main.tsx`, `routes/web.php`, and `sandbox.index.blade.php` mark the new surface as M1 scaffolding and point at #311 / `docs/gutenberg-adoption.md`. README and docs updates land with M3 (real editor shell) and M15 (release).

Screenshots

Canvas screenshot deferred to manual verification in the follow-up comment once the dev app wires `/ve-sandbox` end-to-end.

Pre-Submission Checklist

  • Followed contributing guidelines
  • Checked for other open PRs for same update
  • Code passes all tests
  • Code has been linted
  • Accessibility tests completed
  • Code follows project style guide
  • Self-review completed
  • Comments added for complex code
  • No new warnings generated

Summary by CodeRabbit

Release Notes

  • New Features

    • Added a visual editor sandbox environment for development and testing purposes.
  • Dependencies

    • Integrated WordPress block editor packages for enhanced editing capabilities.
    • Downgraded React and React DOM to version 18.
  • Chores

    • Added Renovate Bot configuration for automated dependency management.
    • Optimized build configuration with improved code splitting.
  • Tests

    • Added comprehensive tests for sandbox functionality and configuration validation.

Installs the five @wordpress/* packages that power the V1 editor and proves
they import cleanly through a temporary /ve-sandbox Blade route:

- Exact-pin @wordpress/blocks@15.17.0, @wordpress/block-editor@15.17.0,
  @wordpress/block-library@9.44.0, @wordpress/components@32.6.0, and
  @wordpress/i18n@6.17.0. Also downgrade react/react-dom to exact-pinned
  18.3.1 (with matching @types) to satisfy the React ^18 peer range shared
  across the Gutenberg stack.
- Lazy-load the Gutenberg code via a dedicated Rollup chunk:
  resources/js/visual-editor/sandbox/main.tsx is a ~0.7 kB entry that
  dynamically imports ./sandbox-editor, and a manualChunks rule in
  vite.config.ts routes every /node_modules/@wordpress/ module into a
  single `gutenberg` chunk. Non-editor admin pages pay 0 kB of Gutenberg.
- Add a /ve-sandbox Laravel route and sandbox.index Blade view that mount
  an empty BlockEditorProvider against a single-paragraph hardcoded block
  tree (SlotFillProvider + BlockTools + WritingFlow + BlockList + Popover
  slot). Temporary scaffolding — deleted once the real editor shell ships
  (M3+).
- Add .github/renovate.json with a packageRule that groups @wordpress/*
  updates into one `gutenberg` PR on a 2-week cadence with rangeStrategy
  pin, so the cross-package version coupling stays in lockstep.
- Skip one legacy useBlockPreview assertion that relied on React 19's
  native boolean `inert` attribute emission; the _legacy tree is deleted
  at M15 so the skip is short-lived.

Closes #311

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Apr 19, 2026 •

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

A pull request establishes Gutenberg package dependencies (React 18, @wordpress/* modules), configures Vite for lazy-loaded editor chunks, sets up Renovate for automated dependency management, and adds a /ve-sandbox development route with a React-based block editor sandbox.

Changes

Cohort / File(s) Summary
Renovate & Dependency Configuration
.github/renovate.json, package.json
Added Renovate schema with @wordpress/* package grouping scheduled bi-weekly and pinned range strategy. Downgraded React runtime and types from v19 to v18 (18.3.1 pinned), introduced exact-pinned WordPress block packages (@wordpress/block-editor, @wordpress/block-library, @wordpress/blocks, @wordpress/components, @wordpress/i18n), and added dev script dev:sandbox.
Vite Build Configuration
vite.config.ts
Added sandbox entrypoint alongside legacy editor entry. Introduced hash-based filename output (chunks/[name]-[hash].js, assets/[name]-[hash][extname]). Implemented manualChunks logic to route @wordpress/ modules into dedicated gutenberg chunk for lazy loading.
Sandbox Backend Route & View
routes/web.php, resources/views/sandbox/index.blade.php
Added GET /ve-sandbox route named visual-editor.sandbox that renders Blade template containing mount container and Vite entry point directive for sandbox main script.
Sandbox Frontend Entrypoint & Editor
resources/js/visual-editor/sandbox/index.html, resources/js/visual-editor/sandbox/main.tsx, resources/js/visual-editor/sandbox/sandbox-editor.tsx
Created HTML entrypoint with standard metadata and root mount element. Implemented main.tsx bootstrap logic that dynamically imports sandbox-editor and mounts SandboxEditor React component. Added SandboxEditor component that registers core blocks, initializes block state with paragraph block (localized via __() with artisanpack-visual-editor domain), wraps editor in BlockEditorProvider, and renders Gutenberg UI layers (BlockTools, WritingFlow, BlockList, Popover.Slot) with required CSS imports.
Tests & Test Updates
tests/Feature/SandboxViewTest.php, resources/js/visual-editor/_legacy/editor/primitives/__tests__/useBlockPreview.test.tsx
Added comprehensive Pest feature test validating Blade template, route registration, frontend entrypoint wiring, sandbox editor component structure, dependency pinning, Vite configuration, and Renovate setup. Marked accessibility test in useBlockPreview.test.tsx as skipped.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Possibly related PRs

Poem

🐰 Hop, hop! The blocks now grow in files—
WordPress dance through Gutenberg's aisles,
React rewinds to version's grace,
Sandbox renders, chunks embrace!
Two weeks of updates, pinned with care,
A editor blooms in the Vite air! 🌱✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: installing Gutenberg packages and mounting a sandbox canvas editor, directly reflecting the PR's primary objectives.
Linked Issues check ✅ Passed All coding requirements from issue #311 are met: exact-pinned WordPress packages added, Vite configured with gutenberg chunk, Renovate configured for bi-weekly updates, /ve-sandbox route and Blade view with BlockEditorProvider implemented, and React pinned to 18.3.1.
Out of Scope Changes check ✅ Passed All changes directly support M1 objectives; no unrelated modifications detected. The skipped test assertion and added dev:sandbox script are reasonable scope inclusions for sandbox development.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/311-gutenberg-packages-installed

Comment @coderabbitai help to get the list of available commands and usage tips.

One-command local verification for the M1 sandbox: `npm run dev:sandbox`
starts Vite with `resources/js/visual-editor/sandbox` as the root and
serves the minimal index.html at http://localhost:5176. Mirrors the
existing pattern used by the legacy editor's dev entry. Intentionally
does not touch vite.config.ts — CLI positional root overrides the
serve-mode `root` without requiring multi-entry config gymnastics.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@ViewFromTheBox ViewFromTheBox moved this from Backlog to In Review in ArtisanPack UI Overview Apr 19, 2026
@ViewFromTheBox ViewFromTheBox linked an issue Apr 19, 2026 that may be closed by this pull request
6 tasks
@ViewFromTheBox
ViewFromTheBox marked this pull request as ready for review April 19, 2026 00:25

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (3)
routes/web.php (1)

15-20: Consider restricting sandbox to non-production environments.

The sandbox is documented as temporary for M1. For defense-in-depth, consider wrapping it in an environment check to prevent accidental exposure in production.

🛡️ Optional: restrict to local/development
 // Temporary sandbox route for M1 (`#311`). Mounts an empty BlockEditorProvider
 // to prove `@wordpress/`* packages import cleanly and the Gutenberg canvas
 // renders. Removed once the real editor shell ships (M3+).
-Route::get('/ve-sandbox', function () {
-    return view('visual-editor::sandbox.index');
-})->name('visual-editor.sandbox');
+if (app()->environment('local', 'development', 'testing')) {
+    Route::get('/ve-sandbox', function () {
+        return view('visual-editor::sandbox.index');
+    })->name('visual-editor.sandbox');
+}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@routes/web.php` around lines 15 - 20, Wrap the temporary
Route::get('/ve-sandbox', ...) registration in an environment check so it only
registers in non-production contexts (e.g., local, development, staging,
testing); locate the Route::get call that returns
view('visual-editor::sandbox.index') (named 'visual-editor.sandbox') and guard
its definition with an if that checks app()->environment(...) or
config('app.env') to exclude 'production' before registering the route.
.github/renovate.json (1)

7-17: Consider grouping React with @wordpress/ updates.*

Since React 18.3.1 is pinned specifically to match Gutenberg's peer range (as noted in the PR summary), React version updates should ideally stay coordinated with @wordpress/* updates. Currently, Renovate will propose React updates separately, which could break the peer dependency alignment.

♻️ Proposed addition to keep React in sync
     "packageRules": [
         {
             "description": "Group all `@wordpress/`* package updates into a single PR on a two-week cadence, and keep them exact-pinned so Gutenberg's cross-package version coupling stays in lockstep.",
             "matchPackagePrefixes": ["@wordpress/"],
             "groupName": "gutenberg",
             "groupSlug": "gutenberg",
             "schedule": ["every 2 weeks on monday"],
             "rangeStrategy": "pin",
             "labels": ["dependencies", "gutenberg"]
+        },
+        {
+            "description": "Pin React/ReactDOM to match Gutenberg's peer range; group with gutenberg updates.",
+            "matchPackageNames": ["react", "react-dom", "@types/react", "@types/react-dom"],
+            "groupName": "gutenberg",
+            "groupSlug": "gutenberg",
+            "schedule": ["every 2 weeks on monday"],
+            "rangeStrategy": "pin",
+            "labels": ["dependencies", "gutenberg"]
         }
     ]
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/renovate.json around lines 7 - 17, Update the Renovate packageRules
so React updates are grouped with the existing `@wordpress/`* rule: add React (and
react-dom if used) to the same rule by including matchPackageNames
["react","react-dom"] (or extend the rule to match them) alongside
matchPackagePrefixes ["@wordpress/"], keep the same groupName/groupSlug
"gutenberg" and the same schedule and rangeStrategy "pin" so React version bumps
are proposed in the same, pinned two-week Gutenberg PR; modify the packageRules
object that contains matchPackagePrefixes to also reference matchPackageNames.
tests/Feature/SandboxViewTest.php (1)

73-76: Exact-pin assertions are currently too permissive.

Line 76 matches only a semver prefix, and Line 88 only checks major version. That can let non-exact values pass, which weakens the “exact pin” contract.

Proposed tightening of version assertions
-        expect($version)
-            ->not->toStartWith('^')
-            ->not->toStartWith('~')
-            ->toMatch('/^\d+\.\d+\.\d+/', "{$pkg} must be exact-pinned, got: {$version}");
+        expect($version)
+            ->not->toStartWith('^')
+            ->not->toStartWith('~')
+            ->toMatch('/^\d+\.\d+\.\d+$/', "{$pkg} must be exact-pinned, got: {$version}");
@@
         expect($version)
             ->not->toStartWith('^')
             ->not->toStartWith('~')
-            ->toStartWith('18.');
+            ->toMatch('/^18\.\d+\.\d+$/', "{$pkg} must be exact-pinned to React 18.x.x, got: {$version}");

Also applies to: 85-89

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@tests/Feature/SandboxViewTest.php` around lines 73 - 76, The current
assertions in SandboxViewTest around expect($version) only check a semver prefix
and major version, letting non-exact pins slip through; update the expectations
for $version (used in the expect($version)->... chain and the other similar
block at lines 85–89) to reject common range operators and wildcards and to
require a full exact semver by changing the regex to assert the entire string
(e.g. use toMatch('/^\d+\.\d+\.\d+$/') or equivalent) and keep the
not->toStartWith('^')->not->toStartWith('~') checks so the assertion enforces
exact-pinned versions like 1.2.3 only.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@vite.config.ts`:
- Around line 71-87: The build config sets manifest: false which prevents
generating manifest.json needed by Laravel's `@vite`() in production; update the
Vite config so production builds emit a manifest (e.g., set manifest: true for
rollupOptions builds or enable the Laravel Vite plugin) and ensure hashed
chunk/asset names remain as configured (refer to rollupOptions, input, output,
manualChunks) so `@vite`() can resolve chunks/assets; alternatively split configs
so only dev uses manifest: false and production uses a config that generates
manifest.json or integrates the Laravel Vite plugin to produce it.

---

Nitpick comments:
In @.github/renovate.json:
- Around line 7-17: Update the Renovate packageRules so React updates are
grouped with the existing `@wordpress/`* rule: add React (and react-dom if used)
to the same rule by including matchPackageNames ["react","react-dom"] (or extend
the rule to match them) alongside matchPackagePrefixes ["@wordpress/"], keep the
same groupName/groupSlug "gutenberg" and the same schedule and rangeStrategy
"pin" so React version bumps are proposed in the same, pinned two-week Gutenberg
PR; modify the packageRules object that contains matchPackagePrefixes to also
reference matchPackageNames.

In `@routes/web.php`:
- Around line 15-20: Wrap the temporary Route::get('/ve-sandbox', ...)
registration in an environment check so it only registers in non-production
contexts (e.g., local, development, staging, testing); locate the Route::get
call that returns view('visual-editor::sandbox.index') (named
'visual-editor.sandbox') and guard its definition with an if that checks
app()->environment(...) or config('app.env') to exclude 'production' before
registering the route.

In `@tests/Feature/SandboxViewTest.php`:
- Around line 73-76: The current assertions in SandboxViewTest around
expect($version) only check a semver prefix and major version, letting non-exact
pins slip through; update the expectations for $version (used in the
expect($version)->... chain and the other similar block at lines 85–89) to
reject common range operators and wildcards and to require a full exact semver
by changing the regex to assert the entire string (e.g. use
toMatch('/^\d+\.\d+\.\d+$/') or equivalent) and keep the
not->toStartWith('^')->not->toStartWith('~') checks so the assertion enforces
exact-pinned versions like 1.2.3 only.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 014a11c3-3082-492f-bd3e-e32c262b259b

📥 Commits

Reviewing files that changed from the base of the PR and between 7532d51 and 805e3c8.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json, !package-lock.json
📒 Files selected for processing (10)
  • .github/renovate.json
  • package.json
  • resources/js/visual-editor/_legacy/editor/primitives/__tests__/useBlockPreview.test.tsx
  • resources/js/visual-editor/sandbox/index.html
  • resources/js/visual-editor/sandbox/main.tsx
  • resources/js/visual-editor/sandbox/sandbox-editor.tsx
  • resources/views/sandbox/index.blade.php
  • routes/web.php
  • tests/Feature/SandboxViewTest.php
  • vite.config.ts

Comment thread vite.config.ts
Comment on lines 71 to 87
rollupOptions: {
input: resolve(editorRoot, 'main.tsx'),
input: {
editor: resolve(editorRoot, 'main.tsx'),
sandbox: sandboxEntry,
},
output: {
format: 'es',
entryFileNames: 'main.js',
chunkFileNames: '[name].js',
assetFileNames: '[name][extname]',
entryFileNames: '[name].js',
chunkFileNames: 'chunks/[name]-[hash].js',
assetFileNames: 'assets/[name]-[hash][extname]',
manualChunks(id) {
if (id.includes('/node_modules/@wordpress/')) {
return 'gutenberg';
}
return undefined;
},
},

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check if there's separate Vite config for Laravel or if manifest is handled elsewhere

# Look for Laravel Vite plugin configuration or separate production config
rg -n "manifest" --type=ts --type=js -C2

# Check how the Blade views use `@vite` - if they reference entries by name
rg -n "@vite\(" --type=blade -g "*.blade.php" -C1 2>/dev/null || \
rg -n "@vite\(" -g "*.blade.php" -C1

# Check if there's a separate Laravel Vite config
fd -e php "vite" -x cat {}

Repository: ArtisanPack-UI/visual-editor

Length of output: 1326


🏁 Script executed:

# Search for Laravel Vite plugin usage or custom configuration
rg -n "laravelPlugin\|viteLaravelPlugin\|laravelVite" --type=ts --type=js

# Check the actual vite.config.ts structure to see full plugin setup
cat -n vite.config.ts | head -30

Repository: ArtisanPack-UI/visual-editor

Length of output: 1417


🏁 Script executed:

# Get the full build configuration section to understand manifest: false context
cat -n vite.config.ts | sed -n '28,100p'

Repository: ArtisanPack-UI/visual-editor

Length of output: 3249


Address manifest: false with Laravel's @vite() directive in production.

The Rollup configuration is otherwise correct—multi-entry setup, hashing for cache busting, and @wordpress/* module isolation work as intended. However, manifest: false on line 69 creates a production blocker:

  • Laravel's @vite() helper in production requires manifest.json to resolve hashed asset paths
  • Entry files have stable names ([name].js), but chunks/assets are hashed (chunks/[name]-[hash].js, assets/[name]-[hash][extname])
  • Without the manifest, @vite() cannot load the hashed dependencies, breaking asset resolution

Generate the manifest or use a Laravel Vite plugin to handle hashing, or ensure this is a dev-only build and production uses a separate config.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@vite.config.ts` around lines 71 - 87, The build config sets manifest: false
which prevents generating manifest.json needed by Laravel's `@vite`() in
production; update the Vite config so production builds emit a manifest (e.g.,
set manifest: true for rollupOptions builds or enable the Laravel Vite plugin)
and ensure hashed chunk/asset names remain as configured (refer to
rollupOptions, input, output, manualChunks) so `@vite`() can resolve
chunks/assets; alternatively split configs so only dev uses manifest: false and
production uses a config that generates manifest.json or integrates the Laravel
Vite plugin to produce it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Development

Successfully merging this pull request may close these issues.

M1 · Gutenberg packages installed

1 participant