diff --git a/package-lock.json b/package-lock.json index 769622b37..6687fc4b7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7046,7 +7046,7 @@ } }, "packages/alpinejs": { - "version": "3.11.1", + "version": "3.12.0", "license": "MIT", "dependencies": { "@vue/reactivity": "~3.1.1" @@ -7054,7 +7054,7 @@ }, "packages/collapse": { "name": "@alpinejs/collapse", - "version": "3.11.1", + "version": "3.12.0", "license": "MIT" }, "packages/csp": { @@ -7067,12 +7067,12 @@ }, "packages/docs": { "name": "@alpinejs/docs", - "version": "3.11.1-revision.1", + "version": "3.12.0-revision.1", "license": "MIT" }, "packages/focus": { "name": "@alpinejs/focus", - "version": "3.11.1", + "version": "3.12.0", "license": "MIT", "dependencies": { "focus-trap": "^6.6.1" @@ -7088,17 +7088,17 @@ }, "packages/intersect": { "name": "@alpinejs/intersect", - "version": "3.11.1", + "version": "3.12.0", "license": "MIT" }, "packages/mask": { "name": "@alpinejs/mask", - "version": "3.11.1", + "version": "3.12.0", "license": "MIT" }, "packages/morph": { "name": "@alpinejs/morph", - "version": "3.11.1", + "version": "3.12.0", "license": "MIT" }, "packages/navigate": { @@ -7108,12 +7108,12 @@ }, "packages/persist": { "name": "@alpinejs/persist", - "version": "3.11.1", + "version": "3.12.0", "license": "MIT" }, "packages/ui": { "name": "@alpinejs/ui", - "version": "3.10.5-beta.8", + "version": "3.12.0-beta.0", "license": "MIT" } }, diff --git a/packages/alpinejs/src/directives/x-for.js b/packages/alpinejs/src/directives/x-for.js index 052133696..278b55219 100644 --- a/packages/alpinejs/src/directives/x-for.js +++ b/packages/alpinejs/src/directives/x-for.js @@ -158,6 +158,9 @@ function loop(el, iteratorNames, evaluateItems, evaluateKey) { let marker = document.createElement('div') mutateDom(() => { + if (!elForSpot) { + throw new Error("AlpineJS x-for Error: ':key' is undefined or invalid. Please ensure you're providing a valid key attribute."); + } elForSpot.after(marker) elInSpot.after(elForSpot) elForSpot._x_currentIfEl && elForSpot.after(elForSpot._x_currentIfEl) diff --git a/tests/cypress/integration/directives/x-for.spec.js b/tests/cypress/integration/directives/x-for.spec.js index acd626556..0bd60cd9d 100644 --- a/tests/cypress/integration/directives/x-for.spec.js +++ b/tests/cypress/integration/directives/x-for.spec.js @@ -559,3 +559,29 @@ test('renders children using directives injected by x-html correctly', get('p:nth-of-type(2) span').should(haveText('bar')) } ) + +test('x-for throws descriptive error when key is undefined', + html` +
+ +
+ `, + ({ get }) => { + }, + true +)