From 3840fb1eb247085faa605090b64f75c288eb132f Mon Sep 17 00:00:00 2001 From: Yann Braga Date: Thu, 4 Aug 2022 13:26:36 +0200 Subject: [PATCH] telemetry: improve addon extraction logic --- .../telemetry/src/storybook-metadata.test.ts | 62 +++++++++++++++++++ code/lib/telemetry/src/storybook-metadata.ts | 37 +++++++++-- 2 files changed, 94 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..48c417200237 100644 --- a/code/lib/telemetry/src/storybook-metadata.test.ts +++ b/code/lib/telemetry/src/storybook-metadata.test.ts @@ -121,6 +121,68 @@ 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', + 'F:\\Users\\foo\\bar\\register.js', + 'D:\\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..0a2e922f45c1 100644 --- a/code/lib/telemetry/src/storybook-metadata.ts +++ b/code/lib/telemetry/src/storybook-metadata.ts @@ -125,19 +125,46 @@ export const computeStorybookMetadata = async ({ metadata.features = mainConfig.features; } + const filterLocalAddons = (addon: string | { name: string }) => { + const isLocalAddon = (addon: string) => + addon.startsWith('.') || + addon.startsWith('/') || + // for local Windows files e.g. (C: F: D:) + /\w:.*/.test(addon) || + 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, };