diff --git a/README.md b/README.md index e49d4c1c72..57bbda2cc2 100644 --- a/README.md +++ b/README.md @@ -120,6 +120,7 @@ These GitHub repositories provide supplementary resources for Rush Stack: | [/rush-plugins/rush-redis-cobuild-plugin](./rush-plugins/rush-redis-cobuild-plugin/) | [![npm version](https://badge.fury.io/js/%40rushstack%2Frush-redis-cobuild-plugin.svg)](https://badge.fury.io/js/%40rushstack%2Frush-redis-cobuild-plugin) | | [@rushstack/rush-redis-cobuild-plugin](https://www.npmjs.com/package/@rushstack/rush-redis-cobuild-plugin) | | [/rush-plugins/rush-resolver-cache-plugin](./rush-plugins/rush-resolver-cache-plugin/) | [![npm version](https://badge.fury.io/js/%40rushstack%2Frush-resolver-cache-plugin.svg)](https://badge.fury.io/js/%40rushstack%2Frush-resolver-cache-plugin) | | [@rushstack/rush-resolver-cache-plugin](https://www.npmjs.com/package/@rushstack/rush-resolver-cache-plugin) | | [/rush-plugins/rush-serve-plugin](./rush-plugins/rush-serve-plugin/) | [![npm version](https://badge.fury.io/js/%40rushstack%2Frush-serve-plugin.svg)](https://badge.fury.io/js/%40rushstack%2Frush-serve-plugin) | | [@rushstack/rush-serve-plugin](https://www.npmjs.com/package/@rushstack/rush-serve-plugin) | +| [/storybook/telemetry-stub](./storybook/telemetry-stub/) | [![npm version](https://badge.fury.io/js/%40rushstack%2Fstorybook-telemetry-stub.svg)](https://badge.fury.io/js/%40rushstack%2Fstorybook-telemetry-stub) | [changelog](./storybook/telemetry-stub/CHANGELOG.md) | [@rushstack/storybook-telemetry-stub](https://www.npmjs.com/package/@rushstack/storybook-telemetry-stub) | | [/webpack/hashed-folder-copy-plugin](./webpack/hashed-folder-copy-plugin/) | [![npm version](https://badge.fury.io/js/%40rushstack%2Fhashed-folder-copy-plugin.svg)](https://badge.fury.io/js/%40rushstack%2Fhashed-folder-copy-plugin) | [changelog](./webpack/hashed-folder-copy-plugin/CHANGELOG.md) | [@rushstack/hashed-folder-copy-plugin](https://www.npmjs.com/package/@rushstack/hashed-folder-copy-plugin) | | [/webpack/loader-load-themed-styles](./webpack/loader-load-themed-styles/) | [![npm version](https://badge.fury.io/js/%40microsoft%2Floader-load-themed-styles.svg)](https://badge.fury.io/js/%40microsoft%2Floader-load-themed-styles) | [changelog](./webpack/loader-load-themed-styles/CHANGELOG.md) | [@microsoft/loader-load-themed-styles](https://www.npmjs.com/package/@microsoft/loader-load-themed-styles) | | [/webpack/loader-raw-script](./webpack/loader-raw-script/) | [![npm version](https://badge.fury.io/js/%40rushstack%2Floader-raw-script.svg)](https://badge.fury.io/js/%40rushstack%2Floader-raw-script) | [changelog](./webpack/loader-raw-script/CHANGELOG.md) | [@rushstack/loader-raw-script](https://www.npmjs.com/package/@rushstack/loader-raw-script) | diff --git a/common/changes/@rushstack/storybook-telemetry-stub/add-storybook-telemetry-stub-package_2026-03-11-21-38.json b/common/changes/@rushstack/storybook-telemetry-stub/add-storybook-telemetry-stub-package_2026-03-11-21-38.json new file mode 100644 index 0000000000..46003b91b3 --- /dev/null +++ b/common/changes/@rushstack/storybook-telemetry-stub/add-storybook-telemetry-stub-package_2026-03-11-21-38.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@rushstack/storybook-telemetry-stub", + "comment": "Initial package creation: stub replacement for @storybook/telemetry", + "type": "minor" + } + ], + "packageName": "@rushstack/storybook-telemetry-stub" +} diff --git a/common/config/rush/nonbrowser-approved-packages.json b/common/config/rush/nonbrowser-approved-packages.json index 4eb4bb89b8..2a7c3061e5 100644 --- a/common/config/rush/nonbrowser-approved-packages.json +++ b/common/config/rush/nonbrowser-approved-packages.json @@ -198,10 +198,6 @@ "name": "@rushstack/heft-dev-cert-plugin", "allowedCategories": [ "libraries", "tests" ] }, - { - "name": "@rushstack/heft-static-asset-typings-plugin", - "allowedCategories": [ "libraries", "tests" ] - }, { "name": "@rushstack/heft-isolated-typescript-transpile-plugin", "allowedCategories": [ "tests" ] @@ -242,6 +238,10 @@ "name": "@rushstack/heft-serverless-stack-plugin", "allowedCategories": [ "tests" ] }, + { + "name": "@rushstack/heft-static-asset-typings-plugin", + "allowedCategories": [ "libraries", "tests" ] + }, { "name": "@rushstack/heft-storybook-plugin", "allowedCategories": [ "tests" ] @@ -474,6 +474,10 @@ "name": "@storybook/react-webpack5", "allowedCategories": [ "libraries", "tests" ] }, + { + "name": "@storybook/telemetry-8", + "allowedCategories": [ "libraries" ] + }, { "name": "@storybook/theming", "allowedCategories": [ "tests" ] diff --git a/common/config/rush/pnpm-config.json b/common/config/rush/pnpm-config.json index acd69794ec..32b03920e5 100644 --- a/common/config/rush/pnpm-config.json +++ b/common/config/rush/pnpm-config.json @@ -271,7 +271,8 @@ // TODO: Remove once Heft is 1.0.0 "allowAny": ["@rushstack/heft"], "allowedVersions": { - "webpack": "^4 || ^5" + "webpack": "^4 || ^5", + "storybook": "*" } }, diff --git a/common/config/subspaces/default/pnpm-lock.yaml b/common/config/subspaces/default/pnpm-lock.yaml index dd1378b412..1a22cc6979 100644 --- a/common/config/subspaces/default/pnpm-lock.yaml +++ b/common/config/subspaces/default/pnpm-lock.yaml @@ -781,7 +781,7 @@ importers: version: 6.4.22(@types/react@17.0.74)(react-dom@17.0.2(react@17.0.2))(react@17.0.2) '@storybook/cli': specifier: ~6.4.18 - version: 6.4.22(eslint@9.37.0)(jest@29.3.1(@types/node@20.17.19))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.8.2) + version: 6.4.22(eslint@9.37.0)(jest@29.3.1(@types/node@20.17.19)(babel-plugin-macros@3.1.0))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.8.2) '@storybook/components': specifier: ~6.4.18 version: 6.4.22(@types/react@17.0.74)(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -817,7 +817,7 @@ importers: version: 5.2.7(webpack@4.47.0) jest: specifier: ~29.3.1 - version: 29.3.1(@types/node@20.17.19) + version: 29.3.1(@types/node@20.17.19)(babel-plugin-macros@3.1.0) react: specifier: ~17.0.2 version: 17.0.2 @@ -1003,7 +1003,7 @@ importers: version: 5.2.7(webpack@5.105.2) jest: specifier: ~29.3.1 - version: 29.3.1(@types/node@20.17.19) + version: 29.3.1(@types/node@20.17.19)(babel-plugin-macros@3.1.0) react: specifier: ~19.2.3 version: 19.2.4 @@ -5209,6 +5209,21 @@ importers: specifier: workspace:* version: link:../../rigs/local-node-rig + ../../../storybook/telemetry-stub: + devDependencies: + '@rushstack/heft': + specifier: workspace:* + version: link:../../apps/heft + '@storybook/telemetry-8': + specifier: npm:@storybook/telemetry@~8.6.0 + version: '@storybook/telemetry@8.6.14(storybook@9.1.17(@testing-library/dom@7.21.8)(prettier@3.8.1))' + eslint: + specifier: ~9.37.0 + version: 9.37.0 + local-node-rig: + specifier: workspace:* + version: link:../../rigs/local-node-rig + ../../../vscode-extensions/debug-certificate-manager-vscode-extension: dependencies: '@rushstack/debug-certificate-manager': @@ -9774,6 +9789,11 @@ packages: react: ^16.8.0 || ^17.0.0 react-dom: ^16.8.0 || ^17.0.0 + '@storybook/telemetry@8.6.14': + resolution: {integrity: sha512-QGQx1enBPUZfU5Gc1FXbBIBtn0GIwLjYVy1wHYr2g5jPaC+MZoSJAgGLGsq+wPq1l+M2cTEeteRXGSXxFagMrA==} + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + '@storybook/theming@6.4.22': resolution: {integrity: sha512-NVMKH/jxSPtnMTO4VCN1k47uztq+u9fWv4GSnzq/eezxdGg9ceGL4/lCrNGoNajht9xbrsZ4QvsJ/V2sVGM8wA==} peerDependencies: @@ -22426,7 +22446,7 @@ snapshots: - supports-color - ts-node - '@jest/core@29.7.0': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -22440,7 +22460,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@22.9.3) + jest-config: 29.7.0(@types/node@22.9.3)(babel-plugin-macros@3.1.0) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -25153,7 +25173,7 @@ snapshots: ts-dedent: 2.2.0 util-deprecate: 1.0.2 - '@storybook/cli@6.4.22(eslint@9.37.0)(jest@29.3.1(@types/node@20.17.19))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.8.2)': + '@storybook/cli@6.4.22(eslint@9.37.0)(jest@29.3.1(@types/node@20.17.19)(babel-plugin-macros@3.1.0))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.8.2)': dependencies: '@babel/core': 7.20.12 '@babel/preset-env': 7.28.6(@babel/core@7.20.12) @@ -25173,7 +25193,7 @@ snapshots: fs-extra: 9.1.0 get-port: 5.1.1 globby: 11.1.0 - jest: 29.3.1(@types/node@20.17.19) + jest: 29.3.1(@types/node@20.17.19)(babel-plugin-macros@3.1.0) jscodeshift: 0.13.1(@babel/preset-env@7.28.6(@babel/core@7.20.12)) json5: 2.2.3 leven: 3.1.0 @@ -25819,6 +25839,10 @@ snapshots: - '@types/react' - supports-color + '@storybook/telemetry@8.6.14(storybook@9.1.17(@testing-library/dom@7.21.8)(prettier@3.8.1))': + dependencies: + storybook: 9.1.17(@testing-library/dom@7.21.8)(prettier@3.8.1) + '@storybook/theming@6.4.22(@types/react@17.0.74)(react-dom@17.0.2(react@17.0.2))(react@17.0.2)': dependencies: '@emotion/core': 10.3.1(@types/react@17.0.74)(react@17.0.2) @@ -28766,13 +28790,13 @@ snapshots: safe-buffer: 5.2.1 sha.js: 2.4.12 - create-jest@29.7.0(@types/node@20.17.19): + create-jest@29.7.0(@types/node@20.17.19)(babel-plugin-macros@3.1.0): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.17.19) + jest-config: 29.7.0(@types/node@20.17.19)(babel-plugin-macros@3.1.0) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -32144,16 +32168,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@20.17.19): + jest-cli@29.7.0(@types/node@20.17.19)(babel-plugin-macros@3.1.0): dependencies: - '@jest/core': 29.7.0 + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0) '@jest/test-result': 29.7.0(@types/node@20.17.19) '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.17.19) + create-jest: 29.7.0(@types/node@20.17.19)(babel-plugin-macros@3.1.0) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.17.19) + jest-config: 29.7.0(@types/node@20.17.19)(babel-plugin-macros@3.1.0) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -32223,7 +32247,7 @@ snapshots: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.17.19): + jest-config@29.7.0(@types/node@20.17.19)(babel-plugin-macros@3.1.0): dependencies: '@babel/core': 7.20.12 '@jest/test-sequencer': 29.7.0(@types/node@20.17.19) @@ -32253,7 +32277,7 @@ snapshots: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@22.9.3): + jest-config@29.7.0(@types/node@22.9.3)(babel-plugin-macros@3.1.0): dependencies: '@babel/core': 7.20.12 '@jest/test-sequencer': 29.7.0(@types/node@22.9.3) @@ -32641,12 +32665,12 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.3.1(@types/node@20.17.19): + jest@29.3.1(@types/node@20.17.19)(babel-plugin-macros@3.1.0): dependencies: '@jest/core': 29.5.0(babel-plugin-macros@3.1.0) '@jest/types': 29.5.0 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.17.19) + jest-cli: 29.7.0(@types/node@20.17.19)(babel-plugin-macros@3.1.0) transitivePeerDependencies: - '@types/node' - babel-plugin-macros diff --git a/common/config/subspaces/default/repo-state.json b/common/config/subspaces/default/repo-state.json index 19c5e725c7..14482455ef 100644 --- a/common/config/subspaces/default/repo-state.json +++ b/common/config/subspaces/default/repo-state.json @@ -1,5 +1,5 @@ // DO NOT MODIFY THIS FILE MANUALLY BUT DO COMMIT IT. It is generated and used by Rush. { - "pnpmShrinkwrapHash": "8cea08431b1a848463c751666dcd35e9533ea73d", + "pnpmShrinkwrapHash": "fd55f1b42937aafab015d7ca41826e4e34b5ea85", "preferredVersionsHash": "029c99bd6e65c5e1f25e2848340509811ff9753c" } diff --git a/rush.json b/rush.json index 8ef9f2127e..f5d9d722a9 100644 --- a/rush.json +++ b/rush.json @@ -1605,6 +1605,14 @@ "projectFolder": "libraries/rush-pnpm-kit-v10", "reviewCategory": "libraries", "shouldPublish": true + }, + + // "storybook" folder (alphabetical order) + { + "packageName": "@rushstack/storybook-telemetry-stub", + "projectFolder": "storybook/telemetry-stub", + "reviewCategory": "libraries", + "shouldPublish": true } ] } diff --git a/storybook/telemetry-stub/.npmignore b/storybook/telemetry-stub/.npmignore new file mode 100644 index 0000000000..f7a40e1021 --- /dev/null +++ b/storybook/telemetry-stub/.npmignore @@ -0,0 +1,36 @@ +# THIS IS A STANDARD TEMPLATE FOR .npmignore FILES IN THIS REPO. + +# Ignore all files by default, to avoid accidentally publishing unintended files. +* + +# Use negative patterns to bring back the specific things we want to publish. +!/bin/** +!/lib/** +!/lib-*/** +!/dist/** +!/includes/** + +!CHANGELOG.md +!CHANGELOG.json +!heft-plugin.json +!rush-plugin-manifest.json +!ThirdPartyNotice.txt + +# Ignore certain patterns that should not get published. +/dist/*.stats.* +/lib/**/test/ +/lib-*/**/test/ +*.test.js +*.test.[cm]js +*.test.d.ts +*.test.d.[cm]ts + +# NOTE: These don't need to be specified, because NPM includes them automatically. +# +# package.json +# README.md +# LICENSE + +# --------------------------------------------------------------------------- +# DO NOT MODIFY ABOVE THIS LINE! Add any project-specific overrides below. +# --------------------------------------------------------------------------- diff --git a/storybook/telemetry-stub/LICENSE b/storybook/telemetry-stub/LICENSE new file mode 100644 index 0000000000..1ebfcdfad6 --- /dev/null +++ b/storybook/telemetry-stub/LICENSE @@ -0,0 +1,24 @@ +@rushstack/storybook-telemetry-stub + +Copyright (c) Microsoft Corporation. All rights reserved. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/storybook/telemetry-stub/README.md b/storybook/telemetry-stub/README.md new file mode 100644 index 0000000000..d0bc3eb08f --- /dev/null +++ b/storybook/telemetry-stub/README.md @@ -0,0 +1,14 @@ +# @rushstack/storybook-telemetry-stub + +A stub replacement of `@storybook/telemetry` for use in environments that absolutely forbid outbound +network connections and want to ensure that Storybook doesn't probe outside of its project folder, +e.g. for discovering what kind of package manager the repository uses. + +All exported names mirror those of the official `@storybook/telemetry` package, but every function +is a no-op and every object is an empty stand-in. + +## Links + +- [CHANGELOG.md](./CHANGELOG.md) - Find out what's new in the latest version + +`@rushstack/storybook-telemetry-stub` is part of the [Rush Stack](https://rushstack.io/) family of projects. diff --git a/storybook/telemetry-stub/config/jest.config.json b/storybook/telemetry-stub/config/jest.config.json new file mode 100644 index 0000000000..d1749681d9 --- /dev/null +++ b/storybook/telemetry-stub/config/jest.config.json @@ -0,0 +1,3 @@ +{ + "extends": "local-node-rig/profiles/default/config/jest.config.json" +} diff --git a/storybook/telemetry-stub/config/rig.json b/storybook/telemetry-stub/config/rig.json new file mode 100644 index 0000000000..e6a9ee7a06 --- /dev/null +++ b/storybook/telemetry-stub/config/rig.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json", + "rigPackageName": "local-node-rig" +} diff --git a/storybook/telemetry-stub/eslint.config.js b/storybook/telemetry-stub/eslint.config.js new file mode 100644 index 0000000000..c15e607731 --- /dev/null +++ b/storybook/telemetry-stub/eslint.config.js @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. +// See LICENSE in the project root for license information. + +const nodeTrustedToolProfile = require('local-node-rig/profiles/default/includes/eslint/flat/profile/node-trusted-tool'); +const friendlyLocalsMixin = require('local-node-rig/profiles/default/includes/eslint/flat/mixins/friendly-locals'); + +module.exports = [ + ...nodeTrustedToolProfile, + ...friendlyLocalsMixin, + { + files: ['**/*.ts', '**/*.tsx'], + languageOptions: { + parserOptions: { + tsconfigRootDir: __dirname + } + } + } +]; diff --git a/storybook/telemetry-stub/package.json b/storybook/telemetry-stub/package.json new file mode 100644 index 0000000000..5b943c63da --- /dev/null +++ b/storybook/telemetry-stub/package.json @@ -0,0 +1,32 @@ +{ + "name": "@rushstack/storybook-telemetry-stub", + "version": "0.0.0", + "description": "A stub replacement of @storybook/telemetry for environments that forbid outbound network connections", + "repository": { + "type": "git", + "url": "https://github.com/microsoft/rushstack.git", + "directory": "storybook/telemetry-stub" + }, + "license": "MIT", + "scripts": { + "build": "heft build --clean", + "start": "heft test --clean --watch", + "_phase:build": "heft run --only build -- --clean", + "_phase:test": "heft run --only test -- --clean" + }, + "dependencies": {}, + "devDependencies": { + "@storybook/telemetry-8": "npm:@storybook/telemetry@~8.6.0", + "@rushstack/heft": "workspace:*", + "eslint": "~9.37.0", + "local-node-rig": "workspace:*" + }, + "typesVersions": { + "*": { + "lib/*": [ + "lib-dts/*" + ] + } + }, + "sideEffects": false +} diff --git a/storybook/telemetry-stub/src/storybook-telemetry-stub.ts b/storybook/telemetry-stub/src/storybook-telemetry-stub.ts new file mode 100644 index 0000000000..75bd73974c --- /dev/null +++ b/storybook/telemetry-stub/src/storybook-telemetry-stub.ts @@ -0,0 +1,119 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. +// See LICENSE in the project root for license information. + +/** + * A stub replacement of `\@storybook/telemetry` for use in environments that absolutely + * forbid outbound network connections and want to ensure that Storybook doesn't probe + * outside of its project folder, e.g. for discovering what kind of package manager the + * repository uses. + * + * All exported names mirror those of the official `\@storybook/telemetry` package, but + * every function is a no-op and every object is an empty stand-in. + * + * @packageDocumentation + */ + +// ---- objects ---- + +/** + * No-op stub for `metaFrameworks`. + * @public + */ +export const metaFrameworks: Record = {}; + +// ---- functions (v6+) ---- + +/** + * No-op stub for `sanitizeAddonName`. + * @public + */ +export function sanitizeAddonName(): string { + return ''; +} + +/** + * No-op stub for `computeStorybookMetadata`. + * Returns a minimal object to satisfy callers that expect a non-null result. + * @public + */ +export async function computeStorybookMetadata(): Promise> { + return {}; +} + +/** + * No-op stub for `getStorybookMetadata`. + * Returns a minimal object to satisfy callers that expect a non-null result. + * @public + */ +export async function getStorybookMetadata(): Promise> { + return {}; +} + +/** + * No-op stub for `telemetry`. + * @public + */ +export async function telemetry(): Promise { + // no-op +} + +// ---- functions (v7+) ---- + +/** + * No-op stub for `addToGlobalContext`. + * @public + */ +export function addToGlobalContext(): void { + // no-op +} + +/** + * No-op stub for `getPrecedingUpgrade`. + * @public + */ +export async function getPrecedingUpgrade(): Promise { + return undefined; +} + +/** + * No-op stub for `oneWayHash`. + * @public + */ +export function oneWayHash(): string { + return ''; +} + +// ---- functions (v8+) ---- + +/** + * No-op stub for `cleanPaths`. + * @public + */ +export function cleanPaths(): string { + return ''; +} + +/** + * No-op stub for `isExampleStoryId`. + * @public + */ +export function isExampleStoryId(): boolean { + return false; +} + +/** + * No-op stub for `removeAnsiEscapeCodes`. + * @public + */ +export function removeAnsiEscapeCodes(): string { + return ''; +} + +/** + * No-op stub for `sanitizeError`. + * Sanitization doesn't matter if we aren't exporting the data. + * @public + */ +export function sanitizeError(obj: T): T { + return obj; +} diff --git a/storybook/telemetry-stub/src/test/telemetryStubV7.test.ts b/storybook/telemetry-stub/src/test/telemetryStubV7.test.ts new file mode 100644 index 0000000000..2c5422af83 --- /dev/null +++ b/storybook/telemetry-stub/src/test/telemetryStubV7.test.ts @@ -0,0 +1,46 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. +// See LICENSE in the project root for license information. + +import * as stub from '../storybook-telemetry-stub'; + +const stubRecord: Record = stub; + +// Storybook 7 is out of support; hardcode the expected exports from @storybook/telemetry@~7.6.0 +const OFFICIAL_V7_EXPORTS: Record = { + addToGlobalContext: 'function', + computeStorybookMetadata: 'function', + getPrecedingUpgrade: 'function', + getStorybookMetadata: 'function', + metaFrameworks: 'object', + oneWayHash: 'function', + sanitizeAddonName: 'function', + telemetry: 'function' +}; + +describe('storybook-telemetry-stub (v7 compatibility)', () => { + it('should export every name from @storybook/telemetry v7', () => { + for (const name of Object.keys(OFFICIAL_V7_EXPORTS)) { + expect(stub).toHaveProperty(name); + } + }); + + it('should match runtime types of the official v7 package', () => { + for (const [name, expectedType] of Object.entries(OFFICIAL_V7_EXPORTS)) { + expect(typeof stubRecord[name]).toBe(expectedType); + } + }); + + it('computeStorybookMetadata should return a non-null object', async () => { + const result = await stub.computeStorybookMetadata(); + expect(result).toBeDefined(); + expect(typeof result).toBe('object'); + expect(result).not.toBeNull(); + }); + + it('getStorybookMetadata should return a non-null object', async () => { + const result = await stub.getStorybookMetadata(); + expect(result).toBeDefined(); + expect(typeof result).toBe('object'); + expect(result).not.toBeNull(); + }); +}); diff --git a/storybook/telemetry-stub/src/test/telemetryStubV8.test.ts b/storybook/telemetry-stub/src/test/telemetryStubV8.test.ts new file mode 100644 index 0000000000..f2b7cb1544 --- /dev/null +++ b/storybook/telemetry-stub/src/test/telemetryStubV8.test.ts @@ -0,0 +1,38 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. +// See LICENSE in the project root for license information. + +import * as stub from '../storybook-telemetry-stub'; +import * as officialExports from '@storybook/telemetry-8'; + +const stubRecord: Record = stub; + +describe('storybook-telemetry-stub (v8 compatibility)', () => { + it('should export every name from @storybook/telemetry v8', () => { + const officialNames: readonly (keyof typeof stub)[] = Object.keys( + officialExports + ) as (keyof typeof stub)[]; + for (const name of officialNames) { + expect(stub).toHaveProperty(name); + } + }); + + it('should match runtime types of the official v8 package', () => { + for (const [name, value] of Object.entries(officialExports)) { + expect(typeof stubRecord[name]).toBe(typeof value); + } + }); + + it('computeStorybookMetadata should return a non-null object', async () => { + const result = await stub.computeStorybookMetadata(); + expect(result).toBeDefined(); + expect(typeof result).toBe('object'); + expect(result).not.toBeNull(); + }); + + it('getStorybookMetadata should return a non-null object', async () => { + const result = await stub.getStorybookMetadata(); + expect(result).toBeDefined(); + expect(typeof result).toBe('object'); + expect(result).not.toBeNull(); + }); +}); diff --git a/storybook/telemetry-stub/tsconfig.json b/storybook/telemetry-stub/tsconfig.json new file mode 100644 index 0000000000..54ea9a5d49 --- /dev/null +++ b/storybook/telemetry-stub/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "./node_modules/local-node-rig/profiles/default/tsconfig-base.json", + "compilerOptions": { + "skipLibCheck": true + } +}