diff --git a/src/utils.js b/src/utils.js index 0834f03..c637104 100644 --- a/src/utils.js +++ b/src/utils.js @@ -53,6 +53,20 @@ export function convertAttributeValue (value, name, { type } = {}) { } else if (isNumber(type)) { const parsed = parseFloat(value, 10) return isNaN(parsed) ? value : parsed + } else if (type.name == 'Array') { + try { + var parsed = JSON.parse(value); + return parsed && Array.isArray(parsed) ? parsed : []; + } catch (err) { + return []; + } + } else if (type.name == 'Object') { + try { + var parsed = JSON.parse(value); + return parsed && typeof parsed === 'object' ? parsed : {}; + } catch (err) { + return {}; + } } else { return value } diff --git a/test/fixtures/attributes.html b/test/fixtures/attributes.html index de789f4..b4edb48 100644 --- a/test/fixtures/attributes.html +++ b/test/fixtures/attributes.html @@ -13,6 +13,24 @@ }, someNumber: { type: Number + }, + aList: { + type: Array + }, + notAList: { + type: Array, + default: function(){ + return [1,2,3]; + } + }, + anObject: { + type: Object + }, + notAnObject: { + type: Object, + default: function(){ + return {'a':1, 'b':2}; + } } } })) @@ -20,4 +38,6 @@ window.el = document.querySelector('my-element') - + diff --git a/test/test.js b/test/test.js index 9423d7a..40211ca 100644 --- a/test/test.js +++ b/test/test.js @@ -16,9 +16,9 @@ test('properties', async () => { el.foo = 234 el.someProp = 'lol' }) - const newFoo = await page.evaluate(() => el.vueComponent.foo) + const newFoo = await page.evaluate(() => el.vueComponent.foo) expect(newFoo).toBe(234) - const newBar = await page.evaluate(() => el.vueComponent.someProp) + const newBar = await page.evaluate(() => el.vueComponent.someProp) expect(newBar).toBe('lol') }) @@ -37,17 +37,41 @@ test('attributes', async () => { const someNumber = await page.evaluate(() => el.someNumber) expect(someNumber).toBe(123) + // aList='[1,2,3]' + const aList = await page.evaluate(() => el.aList) + expect(aList).toEqual([1, 2, 3]) + + // notAList='[]' + const notAList = await page.evaluate(() => el.notAList) + expect(notAList).toEqual([]) + + // anObject='{"a": 1, "b": 2}' + const anObject = await page.evaluate(() => el.anObject) + expect(anObject).toEqual({ 'a': 1, 'b': 2 }) + + // notAnObject='{}' + const notAnObject = await page.evaluate(() => el.notAnObject) + expect(notAnObject).toEqual({}) + // set via attribute await page.evaluate(() => { el.setAttribute('foo', 'foo') el.setAttribute('bar', 'false') el.setAttribute('some-number', '234') + el.setAttribute('a-list', '[4,5,6]') + el.setAttribute('not-a-list', 'invalid JSON') + el.setAttribute('an-object', '{"c": 3, "d": 4}') + el.setAttribute('not-an-object', 'invalid JSON') }) // boolean="boolean" expect(await page.evaluate(() => el.foo)).toBe(true) expect(await page.evaluate(() => el.bar)).toBe(false) expect(await page.evaluate(() => el.someNumber)).toBe(234) + expect(await page.evaluate(() => el.aList)).toEqual([4, 5, 6]) + expect(await page.evaluate(() => el.notAList)).toEqual([]) + expect(await page.evaluate(() => el.anObject)).toEqual({ 'c': 3, 'd': 4 }) + expect(await page.evaluate(() => el.notAnObject)).toEqual({}) }) test('events', async () => {