From d6be6ba3720fcf11e801ebf55894d0253208647d Mon Sep 17 00:00:00 2001 From: j3rem1e Date: Thu, 31 Aug 2023 22:24:26 +0200 Subject: [PATCH] Fix generated properties on Svelte event handler --- .../svelte/src/docs/sourceDecorator.test.ts | 36 +++++++++++++++++++ .../svelte/src/docs/sourceDecorator.ts | 28 +++++++++++---- 2 files changed, 57 insertions(+), 7 deletions(-) diff --git a/code/renderers/svelte/src/docs/sourceDecorator.test.ts b/code/renderers/svelte/src/docs/sourceDecorator.test.ts index 86b30788f462..6123b45d8b94 100644 --- a/code/renderers/svelte/src/docs/sourceDecorator.test.ts +++ b/code/renderers/svelte/src/docs/sourceDecorator.test.ts @@ -7,6 +7,9 @@ expect.addSnapshotSerializer({ test: (val: unknown) => typeof val === 'string', }); +const loremIpsum = 'Lorem ipsum dolor sit amet'; +const lotOfProperties = { property1: loremIpsum, property2: loremIpsum, property3: loremIpsum }; + function generateForArgs(args: Args, slotProperty: string | null = null) { return generateSvelteSource({ name: 'Component' }, args, {}, slotProperty); } @@ -35,6 +38,14 @@ describe('generateSvelteSource', () => { test('multiple properties', () => { expect(generateForArgs({ a: 1, b: 2 })).toMatchInlineSnapshot(``); }); + test('lot of properties', () => { + expect(generateForArgs(lotOfProperties)).toMatchInlineSnapshot(` + + `); + }); test('slot property', () => { expect(generateForArgs({ content: 'xyz', myProp: 'abc' }, 'content')).toMatchInlineSnapshot(` @@ -42,7 +53,32 @@ describe('generateSvelteSource', () => { `); }); + test('slot property with lot of properties', () => { + expect(generateForArgs({ content: 'xyz', ...lotOfProperties }, 'content')) + .toMatchInlineSnapshot(` + + xyz + + `); + }); test('component is not set', () => { expect(generateSvelteSource(null, {}, {}, null)).toBeNull(); }); + test('Skip event property', () => { + expect( + generateSvelteSource( + { name: 'Component' }, + { event_click: () => {} }, + { event_click: { action: 'click' } } + ) + ).toMatchInlineSnapshot(``); + }); + test('Property value is a function', () => { + expect( + generateSvelteSource({ name: 'Component' }, { myHandler: () => {} }, {}) + ).toMatchInlineSnapshot(`}/>`); + }); }); diff --git a/code/renderers/svelte/src/docs/sourceDecorator.ts b/code/renderers/svelte/src/docs/sourceDecorator.ts index 9f16caf80162..7b61eea6a7e9 100644 --- a/code/renderers/svelte/src/docs/sourceDecorator.ts +++ b/code/renderers/svelte/src/docs/sourceDecorator.ts @@ -38,8 +38,15 @@ function toSvelteProperty(key: string, value: any, argTypes: ArgTypes): string | return null; } + const argType = argTypes[key]; + // default value ? - if (argTypes[key] && argTypes[key].defaultValue === value) { + if (argType && argType.defaultValue === value) { + return null; + } + + // event should be skipped + if (argType && argType.action) { return null; } @@ -51,6 +58,11 @@ function toSvelteProperty(key: string, value: any, argTypes: ArgTypes): string | return `${key}=${JSON.stringify(value)}`; } + // handle function + if (typeof value === 'function') { + return `${key}={}`; + } + return `${key}={${JSON.stringify(value)}}`; } @@ -98,19 +110,21 @@ export function generateSvelteSource( return null; } - const props = Object.entries(args) + const propsArray = Object.entries(args) .filter(([k]) => k !== slotProperty) .map(([k, v]) => toSvelteProperty(k, v, argTypes)) - .filter((p) => p) - .join(' '); + .filter((p) => p); + const props = propsArray.join(' '); + + const multiline = props.length > 50; const slotValue = slotProperty ? args[slotProperty] : null; + const srcStart = multiline ? `<${name}\n ${propsArray.join('\n ')}` : `<${name} ${props}`; if (slotValue) { - return `<${name} ${props}>\n ${slotValue}\n`; + return `${srcStart}>\n ${slotValue}\n`; } - - return `<${name} ${props}/>`; + return `${srcStart}/>`; } /**