From 9f6ed23c71bc887ec390017751929449f139743d Mon Sep 17 00:00:00 2001 From: Yann Braga Date: Thu, 4 Aug 2022 12:07:42 +0200 Subject: [PATCH] telemetry: improve addon extraction logic --- .../telemetry/src/storybook-metadata.test.ts | 60 +++++++++++++++++++ code/lib/telemetry/src/storybook-metadata.ts | 36 +++++++++-- 2 files changed, 91 insertions(+), 5 deletions(-) diff --git a/code/lib/telemetry/src/storybook-metadata.test.ts b/code/lib/telemetry/src/storybook-metadata.test.ts index d3366777160c..ac8836dde616 100644 --- a/code/lib/telemetry/src/storybook-metadata.test.ts +++ b/code/lib/telemetry/src/storybook-metadata.test.ts @@ -121,6 +121,66 @@ describe('await computeStorybookMetadata', () => { `); }); + test('should handle special addon names', async () => { + const result = await computeStorybookMetadata({ + packageJson: { + ...packageJsonMock, + devDependencies: { + '@storybook/preset-create-react-app': 'x.x.x', + '@storybook/addon-knobs': 'x.x.x', + '@storybook/addon-ends-with-js': 'x.x.x', + 'storybook-addon-deprecated': 'x.x.x', + 'storybook-addon-ends-with-js': 'x.x.x', + }, + }, + mainConfig: { + ...mainJsMock, + addons: [ + '@storybook/preset-create-react-app', + 'storybook-addon-deprecated/register', + 'storybook-addon-ends-with-js/register.js', + '@storybook/addon-knobs/preset', + '@storybook/addon-ends-with-js/preset.js', + '@storybook/addon-postcss/dist/index.js', + '../local-addon/register.js', + '../../', + 'C:\\Users\\foo\\bar\\register.js', + '/Users/foo/bar/register.js', + '\\Users/foo/bar/register.js', + ], + }, + }); + + expect(result.addons).toMatchInlineSnapshot(` + Object { + "@storybook/addon-ends-with-js": Object { + "options": undefined, + "version": "x.x.x", + }, + "@storybook/addon-knobs": Object { + "options": undefined, + "version": "x.x.x", + }, + "@storybook/addon-postcss": Object { + "options": undefined, + "version": "x.x.x", + }, + "@storybook/preset-create-react-app": Object { + "options": undefined, + "version": "x.x.x", + }, + "storybook-addon-deprecated": Object { + "options": undefined, + "version": "x.x.x", + }, + "storybook-addon-ends-with-js": Object { + "options": undefined, + "version": "x.x.x", + }, + } + `); + }); + test('should return user specified features', async () => { const features = { interactionsDebugger: true, diff --git a/code/lib/telemetry/src/storybook-metadata.ts b/code/lib/telemetry/src/storybook-metadata.ts index 99755f79a18c..3cfa211c0674 100644 --- a/code/lib/telemetry/src/storybook-metadata.ts +++ b/code/lib/telemetry/src/storybook-metadata.ts @@ -125,19 +125,45 @@ export const computeStorybookMetadata = async ({ metadata.features = mainConfig.features; } + const filterLocalAddons = (addon: string | { name: string }) => { + const isLocalAddon = (addon: string) => + addon.startsWith('.') || + addon.startsWith('/') || + addon.startsWith('C:') || + addon.startsWith('\\'); + if (typeof addon === 'string' && !isLocalAddon(addon)) { + return true; + } + if (typeof addon === 'object' && !isLocalAddon(addon.name)) { + return true; + } + + return false; + }; + + const sanitizeAddonName = (name: string) => { + return name + .replace(/\/dist\/.*/, '') + .replace(/\.[mc]?[tj]?s[x]?$/, '') + .replace(/\/register$/, '') + .replace(/\/manager$/, '') + .replace(/\/preset$/, ''); + }; + const addons: Record = {}; if (mainConfig.addons) { - mainConfig.addons.forEach((addon) => { - let result; + mainConfig.addons.filter(filterLocalAddons).forEach((addon) => { + let addonName; let options; + if (typeof addon === 'string') { - result = addon.replace('/register', '').replace('/preset', ''); + addonName = sanitizeAddonName(addon); } else { options = addon.options; - result = addon.name; + addonName = sanitizeAddonName(addon.name); } - addons[result] = { + addons[addonName] = { options, version: undefined, };