diff --git a/packages/runtime-core/__tests__/helpers/renderList.spec.ts b/packages/runtime-core/__tests__/helpers/renderList.spec.ts index 6e766f1a1..3f04c625b 100644 --- a/packages/runtime-core/__tests__/helpers/renderList.spec.ts +++ b/packages/runtime-core/__tests__/helpers/renderList.spec.ts @@ -33,10 +33,26 @@ describe('renderList', () => { renderList(3.1, () => {}) } catch (e) {} expect( - `The v-for range expect an integer value but got 3.1.`, + `The v-for range expects a positive integer value but got 3.1.`, ).toHaveBeenWarned() }) + it('should warn when given a negative N', () => { + try { + renderList(-1, () => {}) + } catch (e) {} + expect( + `The v-for range expects a positive integer value but got -1.`, + ).toHaveBeenWarned() + }) + + it('should NOT warn when given 0', () => { + renderList(0, () => {}) + expect( + `The v-for range expects a positive integer value but got 0.`, + ).not.toHaveBeenWarned() + }) + it('should render properties in an object', () => { expect( renderList( @@ -58,6 +74,12 @@ describe('renderList', () => { ).toEqual(['node 0: 1', 'node 1: 2', 'node 2: 3']) }) + it('should return empty array when source is 0', () => { + expect( + renderList(0, (item, index) => `node ${index}: ${item}`), + ).toEqual([]) + }) + it('should return empty array when source is undefined', () => { expect( renderList(undefined, (item, index) => `node ${index}: ${item}`), diff --git a/packages/runtime-core/src/helpers/renderList.ts b/packages/runtime-core/src/helpers/renderList.ts index 8ffe29edf..761b2230f 100644 --- a/packages/runtime-core/src/helpers/renderList.ts +++ b/packages/runtime-core/src/helpers/renderList.ts @@ -91,8 +91,10 @@ export function renderList( ) } } else if (typeof source === 'number') { - if (__DEV__ && !Number.isInteger(source)) { - warn(`The v-for range expect an integer value but got ${source}.`) + if (__DEV__ && (!Number.isInteger(source) || source < 0)) { + warn( + `The v-for range expects a positive integer value but got ${source}.`, + ) } ret = new Array(source) for (let i = 0; i < source; i++) { diff --git a/packages/server-renderer/__tests__/ssrRenderList.spec.ts b/packages/server-renderer/__tests__/ssrRenderList.spec.ts index f8dcb2930..bab07808b 100644 --- a/packages/server-renderer/__tests__/ssrRenderList.spec.ts +++ b/packages/server-renderer/__tests__/ssrRenderList.spec.ts @@ -27,10 +27,24 @@ describe('ssr: renderList', () => { it('should warn when given a non-integer N', () => { ssrRenderList(3.1, () => {}) expect( - `The v-for range expect an integer value but got 3.1.`, + `The v-for range expects a positive integer value but got 3.1.`, ).toHaveBeenWarned() }) + it('should warn when given a negative N', () => { + ssrRenderList(-1, () => {}) + expect( + `The v-for range expects a positive integer value but got -1.`, + ).toHaveBeenWarned() + }) + + it('should NOT warn when given 0', () => { + ssrRenderList(0, () => {}) + expect( + `The v-for range expects a positive integer value but got 0.`, + ).not.toHaveBeenWarned() + }) + it('should render properties in an object', () => { ssrRenderList({ a: 1, b: 2, c: 3 }, (item, key, index) => stack.push(`node ${index}/${key}: ${item}`), @@ -51,6 +65,13 @@ describe('ssr: renderList', () => { expect(stack).toEqual(['node 0: 1', 'node 1: 2', 'node 2: 3']) }) + it('should not render items when source is 0', () => { + ssrRenderList(0, (item, index) => + stack.push(`node ${index}: ${item}`), + ) + expect(stack).toEqual([]) + }) + it('should not render items when source is undefined', () => { ssrRenderList(undefined, (item, index) => stack.push(`node ${index}: ${item}`), diff --git a/packages/server-renderer/src/helpers/ssrRenderList.ts b/packages/server-renderer/src/helpers/ssrRenderList.ts index 7553c8bfe..93bb89847 100644 --- a/packages/server-renderer/src/helpers/ssrRenderList.ts +++ b/packages/server-renderer/src/helpers/ssrRenderList.ts @@ -10,8 +10,10 @@ export function ssrRenderList( renderItem(source[i], i) } } else if (typeof source === 'number') { - if (__DEV__ && !Number.isInteger(source)) { - warn(`The v-for range expect an integer value but got ${source}.`) + if (__DEV__ && (!Number.isInteger(source) || source < 0)) { + warn( + `The v-for range expects a positive integer value but got ${source}.`, + ) return } for (let i = 0; i < source; i++) {