@storybook/telemetry 6.5.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +5 -0
  3. package/dist/cjs/anonymous-id.js +49 -0
  4. package/dist/cjs/get-monorepo-type.js +55 -0
  5. package/dist/cjs/index.js +130 -0
  6. package/dist/cjs/notify.js +72 -0
  7. package/dist/cjs/one-way-hash.js +21 -0
  8. package/dist/cjs/package-versions.js +95 -0
  9. package/dist/cjs/sanitize.js +57 -0
  10. package/dist/cjs/storybook-metadata.js +346 -0
  11. package/dist/cjs/telemetry.js +150 -0
  12. package/dist/cjs/types.js +5 -0
  13. package/dist/esm/anonymous-id.js +29 -0
  14. package/dist/esm/get-monorepo-type.js +34 -0
  15. package/dist/esm/index.js +94 -0
  16. package/dist/esm/notify.js +54 -0
  17. package/dist/esm/one-way-hash.js +11 -0
  18. package/dist/esm/package-versions.js +72 -0
  19. package/dist/esm/sanitize.js +42 -0
  20. package/dist/esm/storybook-metadata.js +304 -0
  21. package/dist/esm/telemetry.js +127 -0
  22. package/dist/esm/types.js +1 -0
  23. package/dist/modern/anonymous-id.js +27 -0
  24. package/dist/modern/get-monorepo-type.js +30 -0
  25. package/dist/modern/index.js +39 -0
  26. package/dist/modern/notify.js +22 -0
  27. package/dist/modern/one-way-hash.js +11 -0
  28. package/dist/modern/package-versions.js +21 -0
  29. package/dist/modern/sanitize.js +32 -0
  30. package/dist/modern/storybook-metadata.js +188 -0
  31. package/dist/modern/telemetry.js +66 -0
  32. package/dist/modern/types.js +1 -0
  33. package/dist/ts3.4/anonymous-id.d.ts +1 -0
  34. package/dist/ts3.4/get-monorepo-type.d.ts +9 -0
  35. package/dist/ts3.4/index.d.ts +3 -0
  36. package/dist/ts3.4/notify.d.ts +1 -0
  37. package/dist/ts3.4/one-way-hash.d.ts +2 -0
  38. package/dist/ts3.4/package-versions.d.ts +9 -0
  39. package/dist/ts3.4/sanitize.d.ts +8 -0
  40. package/dist/ts3.4/storybook-metadata.d.ts +8 -0
  41. package/dist/ts3.4/telemetry.d.ts +2 -0
  42. package/dist/ts3.4/types.d.ts +56 -0
  43. package/dist/ts3.9/anonymous-id.d.ts +1 -0
  44. package/dist/ts3.9/get-monorepo-type.d.ts +9 -0
  45. package/dist/ts3.9/index.d.ts +3 -0
  46. package/dist/ts3.9/notify.d.ts +1 -0
  47. package/dist/ts3.9/one-way-hash.d.ts +2 -0
  48. package/dist/ts3.9/package-versions.d.ts +9 -0
  49. package/dist/ts3.9/sanitize.d.ts +8 -0
  50. package/dist/ts3.9/storybook-metadata.d.ts +8 -0
  51. package/dist/ts3.9/telemetry.d.ts +2 -0
  52. package/dist/ts3.9/types.d.ts +56 -0
  53. package/package.json +61 -0
@@ -0,0 +1,39 @@
1
+ import { logger } from '@storybook/client-logger';
2
+ import { getStorybookMetadata } from './storybook-metadata';
3
+ import { sendTelemetry } from './telemetry';
4
+ import { notify } from './notify';
5
+ import { sanitizeError } from './sanitize';
6
+ export * from './storybook-metadata';
7
+ export const telemetry = async (eventType, payload = {}, options) => {
8
+ await notify();
9
+ const telemetryData = {
10
+ eventType,
11
+ payload
12
+ };
13
+
14
+ try {
15
+ telemetryData.metadata = await getStorybookMetadata(options.configDir);
16
+ } catch (error) {
17
+ if (!telemetryData.payload.error) telemetryData.payload.error = error;
18
+ } finally {
19
+ const {
20
+ error
21
+ } = telemetryData.payload;
22
+
23
+ if (error) {
24
+ // make sure to anonymise possible paths from error messages
25
+ telemetryData.payload.error = sanitizeError(error);
26
+ }
27
+
28
+ if (!telemetryData.payload.error || options.enableCrashReports) {
29
+ var _process$env;
30
+
31
+ if ((_process$env = process.env) !== null && _process$env !== void 0 && _process$env.STORYBOOK_DEBUG_TELEMETRY) {
32
+ logger.info('\n[telemetry]');
33
+ logger.info(JSON.stringify(telemetryData, null, 2));
34
+ } else {
35
+ await sendTelemetry(telemetryData, options);
36
+ }
37
+ }
38
+ }
39
+ };
@@ -0,0 +1,22 @@
1
+ import chalk from 'chalk';
2
+ import { cache } from '@storybook/core-common';
3
+ const TELEMETRY_KEY_NOTIFY_DATE = 'telemetry-notification-date';
4
+ const logger = console;
5
+ export const notify = async () => {
6
+ const telemetryNotifyDate = await cache.get(TELEMETRY_KEY_NOTIFY_DATE, null); // The end-user has already been notified about our telemetry integration. We
7
+ // don't need to constantly annoy them about it.
8
+ // We will re-inform users about the telemetry if significant changes are
9
+ // ever made.
10
+
11
+ if (telemetryNotifyDate) {
12
+ return;
13
+ }
14
+
15
+ cache.set(TELEMETRY_KEY_NOTIFY_DATE, Date.now());
16
+ logger.log();
17
+ logger.log(`${chalk.magenta.bold('attention')} => Storybook now collects completely anonymous telemetry regarding usage.`);
18
+ logger.log(`This information is used to shape Storybook's roadmap and prioritize features.`);
19
+ logger.log(`You can learn more, including how to opt-out if you'd not like to participate in this anonymous program, by visiting the following URL:`);
20
+ logger.log(chalk.cyan('https://storybook.js.org/telemetry'));
21
+ logger.log();
22
+ };
@@ -0,0 +1,11 @@
1
+ import { createHash } from 'crypto';
2
+ export const oneWayHash = payload => {
3
+ const hash = createHash('sha256'); // Always prepend the payload value with salt. This ensures the hash is truly
4
+ // one-way.
5
+
6
+ hash.update('storybook-telemetry-salt'); // Update is an append operation, not a replacement. The salt from the prior
7
+ // update is still present!
8
+
9
+ hash.update(payload);
10
+ return hash.digest('hex');
11
+ };
@@ -0,0 +1,21 @@
1
+ import path from 'path';
2
+ export const getActualPackageVersions = async packages => {
3
+ const packageNames = Object.keys(packages);
4
+ return Promise.all(packageNames.map(getActualPackageVersion));
5
+ };
6
+ export const getActualPackageVersion = async packageName => {
7
+ try {
8
+ // eslint-disable-next-line import/no-dynamic-require,global-require
9
+ const packageJson = require(path.join(packageName, 'package.json'));
10
+
11
+ return {
12
+ name: packageName,
13
+ version: packageJson.version
14
+ };
15
+ } catch (err) {
16
+ return {
17
+ name: packageName,
18
+ version: null
19
+ };
20
+ }
21
+ };
@@ -0,0 +1,32 @@
1
+ /* eslint-disable no-param-reassign */
2
+ import { sep } from 'path';
3
+
4
+ // Removes all user paths
5
+ function regexpEscape(str) {
6
+ return str.replace(/[-[/{}()*+?.\\^$|]/g, `\\$&`);
7
+ }
8
+
9
+ export function cleanPaths(str, separator = sep) {
10
+ if (!str) return str;
11
+ const stack = process.cwd().split(separator);
12
+
13
+ while (stack.length > 1) {
14
+ const currentPath = stack.join(separator);
15
+ const currentRegex = new RegExp(regexpEscape(currentPath), `g`);
16
+ str = str.replace(currentRegex, `$SNIP`);
17
+ const currentPath2 = stack.join(separator + separator);
18
+ const currentRegex2 = new RegExp(regexpEscape(currentPath2), `g`);
19
+ str = str.replace(currentRegex2, `$SNIP`);
20
+ stack.pop();
21
+ }
22
+
23
+ return str;
24
+ } // Takes an Error and returns a sanitized JSON String
25
+
26
+ export function sanitizeError(error, pathSeparator = sep) {
27
+ // Hack because Node
28
+ error = JSON.parse(JSON.stringify(error, Object.getOwnPropertyNames(error))); // Removes all user paths
29
+
30
+ const errorString = cleanPaths(JSON.stringify(error), pathSeparator);
31
+ return JSON.parse(errorString);
32
+ }
@@ -0,0 +1,188 @@
1
+ import "core-js/modules/es.array.reduce.js";
2
+ import readPkgUp from 'read-pkg-up';
3
+ import { detect, getNpmVersion } from 'detect-package-manager';
4
+ import { loadMainConfig, getStorybookInfo, getStorybookConfiguration, getProjectRoot } from '@storybook/core-common';
5
+ import { getActualPackageVersion, getActualPackageVersions } from './package-versions';
6
+ import { getMonorepoType } from './get-monorepo-type';
7
+ let cachedMetadata;
8
+ export const getStorybookMetadata = async _configDir => {
9
+ var _ref;
10
+
11
+ if (cachedMetadata) {
12
+ return cachedMetadata;
13
+ }
14
+
15
+ const packageJson = readPkgUp.sync({
16
+ cwd: process.cwd()
17
+ }).packageJson;
18
+ const configDir = (_ref = _configDir || getStorybookConfiguration(packageJson.scripts.storybook, '-c', '--config-dir')) !== null && _ref !== void 0 ? _ref : '.storybook';
19
+ const mainConfig = loadMainConfig({
20
+ configDir
21
+ });
22
+ cachedMetadata = await computeStorybookMetadata({
23
+ mainConfig,
24
+ packageJson
25
+ });
26
+ return cachedMetadata;
27
+ };
28
+ export const metaFrameworks = {
29
+ next: 'Next',
30
+ 'react-scripts': 'CRA',
31
+ gatsby: 'Gatsby',
32
+ '@nuxtjs/storybook': 'nuxt',
33
+ '@nrwl/storybook': 'nx',
34
+ '@vue/cli-service': 'vue-cli',
35
+ '@sveltejs/kit': 'svelte-kit'
36
+ }; // @TODO: This should be removed in 7.0 as the framework.options field in main.js will replace this
37
+
38
+ const getFrameworkOptions = mainConfig => {
39
+ const possibleOptions = ['angular', 'ember', 'html', 'preact', 'react', 'server', 'svelte', 'vue', 'vue3', 'webComponents'].map(opt => `${opt}Options`); // eslint-disable-next-line no-restricted-syntax
40
+
41
+ for (const opt of possibleOptions) {
42
+ if (opt in mainConfig) {
43
+ return mainConfig[opt];
44
+ }
45
+ }
46
+
47
+ return undefined;
48
+ }; // Analyze a combination of information from main.js and package.json
49
+ // to provide telemetry over a Storybook project
50
+
51
+
52
+ export const computeStorybookMetadata = async ({
53
+ packageJson,
54
+ mainConfig
55
+ }) => {
56
+ var _mainConfig$core;
57
+
58
+ const metadata = {
59
+ generatedAt: new Date().getTime(),
60
+ builder: {
61
+ name: 'webpack4'
62
+ },
63
+ hasCustomBabel: false,
64
+ hasCustomWebpack: false,
65
+ hasStaticDirs: false,
66
+ hasStorybookEslint: false,
67
+ refCount: 0
68
+ };
69
+ const allDependencies = Object.assign({}, packageJson === null || packageJson === void 0 ? void 0 : packageJson.dependencies, packageJson === null || packageJson === void 0 ? void 0 : packageJson.devDependencies, packageJson === null || packageJson === void 0 ? void 0 : packageJson.peerDependencies);
70
+ const metaFramework = Object.keys(allDependencies).find(dep => !!metaFrameworks[dep]);
71
+
72
+ if (metaFramework) {
73
+ const {
74
+ version
75
+ } = await getActualPackageVersion(metaFramework);
76
+ metadata.metaFramework = {
77
+ name: metaFrameworks[metaFramework],
78
+ packageName: metaFramework,
79
+ version
80
+ };
81
+ }
82
+
83
+ const monorepoType = getMonorepoType();
84
+
85
+ if (monorepoType) {
86
+ metadata.monorepo = monorepoType;
87
+ }
88
+
89
+ try {
90
+ const packageManagerType = await detect({
91
+ cwd: getProjectRoot()
92
+ });
93
+ const packageManagerVerson = await getNpmVersion(packageManagerType);
94
+ metadata.packageManager = {
95
+ type: packageManagerType,
96
+ version: packageManagerVerson
97
+ }; // Better be safe than sorry, some codebases/paths might end up breaking with something like "spawn pnpm ENOENT"
98
+ // so we just set the package manager if the detection is successful
99
+ // eslint-disable-next-line no-empty
100
+ } catch (err) {}
101
+
102
+ metadata.hasCustomBabel = !!mainConfig.babel;
103
+ metadata.hasCustomWebpack = !!mainConfig.webpackFinal;
104
+ metadata.hasStaticDirs = !!mainConfig.staticDirs;
105
+
106
+ if (mainConfig.typescript) {
107
+ metadata.typescriptOptions = mainConfig.typescript;
108
+ }
109
+
110
+ if ((_mainConfig$core = mainConfig.core) !== null && _mainConfig$core !== void 0 && _mainConfig$core.builder) {
111
+ var _builder$options;
112
+
113
+ const {
114
+ builder
115
+ } = mainConfig.core;
116
+ metadata.builder = {
117
+ name: typeof builder === 'string' ? builder : builder.name,
118
+ options: typeof builder === 'string' ? undefined : (_builder$options = builder === null || builder === void 0 ? void 0 : builder.options) !== null && _builder$options !== void 0 ? _builder$options : undefined
119
+ };
120
+ }
121
+
122
+ if (mainConfig.refs) {
123
+ metadata.refCount = Object.keys(mainConfig.refs).length;
124
+ }
125
+
126
+ if (mainConfig.features) {
127
+ metadata.features = mainConfig.features;
128
+ }
129
+
130
+ const addons = {};
131
+
132
+ if (mainConfig.addons) {
133
+ mainConfig.addons.forEach(addon => {
134
+ let result;
135
+ let options;
136
+
137
+ if (typeof addon === 'string') {
138
+ result = addon.replace('/register', '');
139
+ } else {
140
+ options = addon.options;
141
+ result = addon.name;
142
+ }
143
+
144
+ addons[result] = {
145
+ options,
146
+ version: undefined
147
+ };
148
+ });
149
+ }
150
+
151
+ const addonVersions = await getActualPackageVersions(addons);
152
+ addonVersions.forEach(({
153
+ name,
154
+ version
155
+ }) => {
156
+ addons[name].version = version;
157
+ });
158
+ const addonNames = Object.keys(addons); // all Storybook deps minus the addons
159
+
160
+ const storybookPackages = Object.keys(allDependencies).filter(dep => dep.includes('storybook') && !addonNames.includes(dep)).reduce((acc, dep) => {
161
+ return Object.assign({}, acc, {
162
+ [dep]: {
163
+ version: undefined
164
+ }
165
+ });
166
+ }, {});
167
+ const storybookPackageVersions = await getActualPackageVersions(storybookPackages);
168
+ storybookPackageVersions.forEach(({
169
+ name,
170
+ version
171
+ }) => {
172
+ storybookPackages[name].version = version;
173
+ });
174
+ const language = allDependencies.typescript ? 'typescript' : 'javascript';
175
+ const hasStorybookEslint = !!allDependencies['eslint-plugin-storybook'];
176
+ const storybookInfo = getStorybookInfo(packageJson);
177
+ return Object.assign({}, metadata, {
178
+ storybookVersion: storybookInfo.version,
179
+ language,
180
+ storybookPackages,
181
+ framework: {
182
+ name: storybookInfo.framework,
183
+ options: getFrameworkOptions(mainConfig)
184
+ },
185
+ addons,
186
+ hasStorybookEslint
187
+ });
188
+ };
@@ -0,0 +1,66 @@
1
+ const _excluded = ["payload", "metadata"];
2
+
3
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
4
+
5
+ import originalFetch from 'isomorphic-unfetch';
6
+ import retry from 'fetch-retry';
7
+ import { nanoid } from 'nanoid';
8
+ import { getAnonymousProjectId } from './anonymous-id';
9
+ const URL = 'https://storybook.js.org/event-log';
10
+ const fetch = retry(originalFetch);
11
+ let tasks = []; // getStorybookMetadata -> packagejson + Main.js
12
+ // event specific data: sessionId, ip, etc..
13
+ // send telemetry
14
+
15
+ const sessionId = nanoid();
16
+ export async function sendTelemetry(data, options = {
17
+ retryDelay: 1000,
18
+ immediate: false
19
+ }) {
20
+ // We use this id so we can de-dupe events that arrive at the index multiple times due to the
21
+ // use of retries. There are situations in which the request "5xx"s (or times-out), but
22
+ // the server actually gets the request and stores it anyway.
23
+ // flatten the data before we send it
24
+ const {
25
+ payload,
26
+ metadata
27
+ } = data,
28
+ rest = _objectWithoutPropertiesLoose(data, _excluded);
29
+
30
+ const context = {
31
+ anonymousId: getAnonymousProjectId(),
32
+ inCI: process.env.CI === 'true'
33
+ };
34
+ const eventId = nanoid();
35
+ const body = Object.assign({}, rest, {
36
+ eventId,
37
+ sessionId,
38
+ metadata,
39
+ payload,
40
+ context
41
+ });
42
+ let request;
43
+
44
+ try {
45
+ request = fetch(URL, {
46
+ method: 'POST',
47
+ body: JSON.stringify(body),
48
+ headers: {
49
+ 'Content-Type': 'application/json'
50
+ },
51
+ retries: 3,
52
+ retryOn: [503, 504],
53
+ retryDelay: attempt => 2 ** attempt * options.retryDelay
54
+ });
55
+ tasks.push(request);
56
+
57
+ if (options.immediate) {
58
+ await Promise.all(tasks);
59
+ } else {
60
+ await request;
61
+ }
62
+ } catch (err) {//
63
+ } finally {
64
+ tasks = tasks.filter(task => task !== request);
65
+ }
66
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export declare const getAnonymousProjectId: () => string;
@@ -0,0 +1,9 @@
1
+ export declare const monorepoConfigs: {
2
+ readonly Nx: "nx.json";
3
+ readonly Turborepo: "turbo.json";
4
+ readonly Lerna: "lerna.json";
5
+ readonly Rush: "rush.json";
6
+ readonly Lage: "lage.config.json";
7
+ };
8
+ export declare type MonorepoType = keyof typeof monorepoConfigs | 'Workspaces' | undefined;
9
+ export declare const getMonorepoType: () => MonorepoType;
@@ -0,0 +1,3 @@
1
+ import { EventType, Payload, Options } from './types';
2
+ export * from './storybook-metadata';
3
+ export declare const telemetry: (eventType: EventType, payload?: Payload, options?: Partial<Options>) => Promise<void>;
@@ -0,0 +1 @@
1
+ export declare const notify: () => Promise<void>;
@@ -0,0 +1,2 @@
1
+ import { BinaryLike } from 'crypto';
2
+ export declare const oneWayHash: (payload: BinaryLike) => string;
@@ -0,0 +1,9 @@
1
+ import { Dependency } from './types';
2
+ export declare const getActualPackageVersions: (packages: Record<string, Partial<Dependency>>) => Promise<{
3
+ name: string;
4
+ version: any;
5
+ }[]>;
6
+ export declare const getActualPackageVersion: (packageName: string) => Promise<{
7
+ name: string;
8
+ version: any;
9
+ }>;
@@ -0,0 +1,8 @@
1
+ /// <reference types="node" />
2
+ export interface IErrorWithStdErrAndStdOut {
3
+ stderr?: Buffer | string;
4
+ stdout?: Buffer | string;
5
+ [key: string]: unknown;
6
+ }
7
+ export declare function cleanPaths(str: string, separator?: string): string;
8
+ export declare function sanitizeError(error: Error, pathSeparator?: string): string;
@@ -0,0 +1,8 @@
1
+ import { StorybookConfig, PackageJson } from '@storybook/core-common';
2
+ import { StorybookMetadata } from './types';
3
+ export declare const getStorybookMetadata: (_configDir: string) => Promise<StorybookMetadata>;
4
+ export declare const metaFrameworks: Record<string, string>;
5
+ export declare const computeStorybookMetadata: ({ packageJson, mainConfig, }: {
6
+ packageJson: PackageJson;
7
+ mainConfig: StorybookConfig & Record<string, any>;
8
+ }) => Promise<StorybookMetadata>;
@@ -0,0 +1,2 @@
1
+ import { Options, TelemetryData } from './types';
2
+ export declare function sendTelemetry(data: TelemetryData, options?: Partial<Options>): Promise<void>;
@@ -0,0 +1,56 @@
1
+ import { StorybookConfig, TypescriptOptions } from '@storybook/core-common';
2
+ import { PM } from 'detect-package-manager';
3
+ import { MonorepoType } from './get-monorepo-type';
4
+ export declare type EventType = 'start' | 'build' | 'upgrade' | 'init' | 'error-build' | 'error-dev' | 'error-metadata';
5
+ export interface Dependency {
6
+ version: string;
7
+ }
8
+ export interface StorybookAddon extends Dependency {
9
+ options: any;
10
+ }
11
+ export declare type StorybookMetadata = {
12
+ storybookVersion: string;
13
+ generatedAt?: number;
14
+ language: 'typescript' | 'javascript';
15
+ framework: {
16
+ name: string;
17
+ options?: any;
18
+ };
19
+ builder?: {
20
+ name: string;
21
+ options?: Record<string, any>;
22
+ };
23
+ monorepo?: MonorepoType;
24
+ packageManager?: {
25
+ type: PM;
26
+ version: string;
27
+ };
28
+ typescriptOptions?: Partial<TypescriptOptions>;
29
+ addons?: Record<string, StorybookAddon>;
30
+ storybookPackages?: Record<string, Dependency>;
31
+ metaFramework?: {
32
+ name: string;
33
+ packageName: string;
34
+ version: string;
35
+ };
36
+ hasStorybookEslint?: boolean;
37
+ hasStaticDirs?: boolean;
38
+ hasCustomWebpack?: boolean;
39
+ hasCustomBabel?: boolean;
40
+ features?: StorybookConfig['features'];
41
+ refCount?: number;
42
+ };
43
+ export interface Payload {
44
+ [key: string]: any;
45
+ }
46
+ export interface Options {
47
+ retryDelay: number;
48
+ immediate: boolean;
49
+ configDir?: string;
50
+ enableCrashReports?: boolean;
51
+ }
52
+ export interface TelemetryData {
53
+ eventType: EventType;
54
+ payload: Payload;
55
+ metadata?: StorybookMetadata;
56
+ }
@@ -0,0 +1 @@
1
+ export declare const getAnonymousProjectId: () => string;
@@ -0,0 +1,9 @@
1
+ export declare const monorepoConfigs: {
2
+ readonly Nx: "nx.json";
3
+ readonly Turborepo: "turbo.json";
4
+ readonly Lerna: "lerna.json";
5
+ readonly Rush: "rush.json";
6
+ readonly Lage: "lage.config.json";
7
+ };
8
+ export declare type MonorepoType = keyof typeof monorepoConfigs | 'Workspaces' | undefined;
9
+ export declare const getMonorepoType: () => MonorepoType;
@@ -0,0 +1,3 @@
1
+ import type { EventType, Payload, Options } from './types';
2
+ export * from './storybook-metadata';
3
+ export declare const telemetry: (eventType: EventType, payload?: Payload, options?: Partial<Options>) => Promise<void>;
@@ -0,0 +1 @@
1
+ export declare const notify: () => Promise<void>;
@@ -0,0 +1,2 @@
1
+ import { BinaryLike } from 'crypto';
2
+ export declare const oneWayHash: (payload: BinaryLike) => string;
@@ -0,0 +1,9 @@
1
+ import { Dependency } from './types';
2
+ export declare const getActualPackageVersions: (packages: Record<string, Partial<Dependency>>) => Promise<{
3
+ name: string;
4
+ version: any;
5
+ }[]>;
6
+ export declare const getActualPackageVersion: (packageName: string) => Promise<{
7
+ name: string;
8
+ version: any;
9
+ }>;
@@ -0,0 +1,8 @@
1
+ /// <reference types="node" />
2
+ export interface IErrorWithStdErrAndStdOut {
3
+ stderr?: Buffer | string;
4
+ stdout?: Buffer | string;
5
+ [key: string]: unknown;
6
+ }
7
+ export declare function cleanPaths(str: string, separator?: string): string;
8
+ export declare function sanitizeError(error: Error, pathSeparator?: string): string;
@@ -0,0 +1,8 @@
1
+ import type { StorybookConfig, PackageJson } from '@storybook/core-common';
2
+ import type { StorybookMetadata } from './types';
3
+ export declare const getStorybookMetadata: (_configDir: string) => Promise<StorybookMetadata>;
4
+ export declare const metaFrameworks: Record<string, string>;
5
+ export declare const computeStorybookMetadata: ({ packageJson, mainConfig, }: {
6
+ packageJson: PackageJson;
7
+ mainConfig: StorybookConfig & Record<string, any>;
8
+ }) => Promise<StorybookMetadata>;
@@ -0,0 +1,2 @@
1
+ import { Options, TelemetryData } from './types';
2
+ export declare function sendTelemetry(data: TelemetryData, options?: Partial<Options>): Promise<void>;
@@ -0,0 +1,56 @@
1
+ import type { StorybookConfig, TypescriptOptions } from '@storybook/core-common';
2
+ import type { PM } from 'detect-package-manager';
3
+ import type { MonorepoType } from './get-monorepo-type';
4
+ export declare type EventType = 'start' | 'build' | 'upgrade' | 'init' | 'error-build' | 'error-dev' | 'error-metadata';
5
+ export interface Dependency {
6
+ version: string;
7
+ }
8
+ export interface StorybookAddon extends Dependency {
9
+ options: any;
10
+ }
11
+ export declare type StorybookMetadata = {
12
+ storybookVersion: string;
13
+ generatedAt?: number;
14
+ language: 'typescript' | 'javascript';
15
+ framework: {
16
+ name: string;
17
+ options?: any;
18
+ };
19
+ builder?: {
20
+ name: string;
21
+ options?: Record<string, any>;
22
+ };
23
+ monorepo?: MonorepoType;
24
+ packageManager?: {
25
+ type: PM;
26
+ version: string;
27
+ };
28
+ typescriptOptions?: Partial<TypescriptOptions>;
29
+ addons?: Record<string, StorybookAddon>;
30
+ storybookPackages?: Record<string, Dependency>;
31
+ metaFramework?: {
32
+ name: string;
33
+ packageName: string;
34
+ version: string;
35
+ };
36
+ hasStorybookEslint?: boolean;
37
+ hasStaticDirs?: boolean;
38
+ hasCustomWebpack?: boolean;
39
+ hasCustomBabel?: boolean;
40
+ features?: StorybookConfig['features'];
41
+ refCount?: number;
42
+ };
43
+ export interface Payload {
44
+ [key: string]: any;
45
+ }
46
+ export interface Options {
47
+ retryDelay: number;
48
+ immediate: boolean;
49
+ configDir?: string;
50
+ enableCrashReports?: boolean;
51
+ }
52
+ export interface TelemetryData {
53
+ eventType: EventType;
54
+ payload: Payload;
55
+ metadata?: StorybookMetadata;
56
+ }