@storybook/telemetry 7.0.0-beta.8 → 7.0.0-rc.0

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.
package/dist/index.d.ts CHANGED
@@ -2,6 +2,7 @@ import { FileSystemCache } from 'file-system-cache';
2
2
  import { TransformOptions } from '@babel/core';
3
3
  import { Server } from 'http';
4
4
  import { PM } from 'detect-package-manager';
5
+ import { BinaryLike } from 'crypto';
5
6
 
6
7
  /**
7
8
  Matches any [primitive value](https://developer.mozilla.org/en-US/docs/Glossary/Primitive).
@@ -718,7 +719,7 @@ PackageJson$1.NonStandardEntryPoints &
718
719
  PackageJson$1.TypeScriptConfiguration &
719
720
  PackageJson$1.YarnConfiguration &
720
721
  PackageJson$1.JSPMConfiguration;
721
- declare type Tag = string;
722
+ type Tag = string;
722
723
  interface Parameters {
723
724
  [name: string]: any;
724
725
  }
@@ -874,20 +875,18 @@ interface CLIOptions {
874
875
  quiet?: boolean;
875
876
  versionUpdates?: boolean;
876
877
  releaseNotes?: boolean;
877
- dll?: boolean;
878
878
  docs?: boolean;
879
- docsDll?: boolean;
880
- uiDll?: boolean;
881
879
  debugWebpack?: boolean;
882
880
  webpackStatsJson?: string | boolean;
883
881
  outputDir?: string;
884
882
  }
885
883
  interface BuilderOptions {
886
884
  configType?: 'DEVELOPMENT' | 'PRODUCTION';
887
- ignorePreview: boolean;
888
- cache: FileSystemCache;
885
+ ignorePreview?: boolean;
886
+ cache?: FileSystemCache;
889
887
  configDir: string;
890
- docsMode: boolean;
888
+ docsMode?: boolean;
889
+ env?: (envs: Record<string, string>) => Record<string, string>;
891
890
  features?: StorybookConfig['features'];
892
891
  versionCheck?: VersionCheck;
893
892
  releaseNotesData?: ReleaseNotesData;
@@ -932,19 +931,16 @@ type CoreCommon_StorybookRefs = Record<string, {
932
931
  disable: boolean;
933
932
  }>;
934
933
  type DocsOptions = {
935
- /**
936
- * Should we generate docs entries at all under any circumstances? (i.e. can they be rendered)
937
- */
938
- enabled?: boolean;
939
934
  /**
940
935
  * What should we call the generated docs entries?
941
936
  */
942
937
  defaultName?: string;
943
938
  /**
944
- * Should we generate a docs entry per CSF file with the `docsPage` tag?
945
- * Set to 'automatic' to generate an entry irrespective of tag.
939
+ * Should we generate a docs entry per CSF file?
940
+ * Set to 'tag' (the default) to generate an entry for every CSF file with the
941
+ * 'autodocs' tag.
946
942
  */
947
- docsPage?: boolean | 'automatic';
943
+ autodocs?: boolean | 'tag';
948
944
  /**
949
945
  * Only show doc entries in the side bar (usually set with the `--docs` CLI flag)
950
946
  */
@@ -984,13 +980,14 @@ interface StorybookConfig {
984
980
  */
985
981
  storyStoreV7?: boolean;
986
982
  /**
987
- * Enable a set of planned breaking changes for SB7.0
983
+ * Do not throw errors if using `.mdx` files in SSv7
984
+ * (for internal use in sandboxes)
988
985
  */
989
- breakingChangesV7?: boolean;
986
+ storyStoreV7MdxErrors?: boolean;
990
987
  /**
991
- * Enable the step debugger functionality in Addon-interactions.
988
+ * Enable a set of planned breaking changes for SB7.0
992
989
  */
993
- interactionsDebugger?: boolean;
990
+ breakingChangesV7?: boolean;
994
991
  /**
995
992
  * Filter args with a "target" on the type from the render function (EXPERIMENTAL)
996
993
  */
@@ -1000,6 +997,14 @@ interface StorybookConfig {
1000
997
  * Will be removed in 7.0.
1001
998
  */
1002
999
  warnOnLegacyHierarchySeparator?: boolean;
1000
+ /**
1001
+ * Use legacy MDX1, to help smooth migration to 7.0
1002
+ */
1003
+ legacyMdx1?: boolean;
1004
+ /**
1005
+ * Apply decorators from preview.js before decorators from addons or frameworks
1006
+ */
1007
+ legacyDecoratorFileOrder?: boolean;
1003
1008
  };
1004
1009
  /**
1005
1010
  * Tells Storybook where to find stories.
@@ -1008,7 +1013,7 @@ interface StorybookConfig {
1008
1013
  */
1009
1014
  stories: StoriesEntry[];
1010
1015
  /**
1011
- * Framework, e.g. '@storybook/react', required in v7
1016
+ * Framework, e.g. '@storybook/react-vite', required in v7
1012
1017
  */
1013
1018
  framework?: Preset;
1014
1019
  /**
@@ -1119,6 +1124,8 @@ interface TelemetryData {
1119
1124
  metadata?: StorybookMetadata;
1120
1125
  }
1121
1126
 
1127
+ declare const oneWayHash: (payload: BinaryLike) => string;
1128
+
1122
1129
  declare const metaFrameworks: Record<string, string>;
1123
1130
  declare const sanitizeAddonName: (name: string) => string;
1124
1131
  declare const computeStorybookMetadata: ({ packageJson, mainConfig, }: {
@@ -1139,4 +1146,4 @@ declare const getPrecedingUpgrade: (events?: any) => Promise<UpgradeSummary | un
1139
1146
 
1140
1147
  declare const telemetry: (eventType: EventType, payload?: Payload, options?: Partial<Options>) => Promise<void>;
1141
1148
 
1142
- export { Dependency, EventType, Options, Payload, StorybookAddon, StorybookMetadata, TelemetryData, computeStorybookMetadata, getPrecedingUpgrade, getStorybookCoreVersion, getStorybookMetadata, metaFrameworks, sanitizeAddonName, telemetry };
1149
+ export { Dependency, EventType, Options, Payload, StorybookAddon, StorybookMetadata, TelemetryData, computeStorybookMetadata, getPrecedingUpgrade, getStorybookCoreVersion, getStorybookMetadata, metaFrameworks, oneWayHash, sanitizeAddonName, telemetry };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var he=Object.create;var k=Object.defineProperty;var be=Object.getOwnPropertyDescriptor;var ve=Object.getOwnPropertyNames;var we=Object.getPrototypeOf,Pe=Object.prototype.hasOwnProperty;var Se=(t,e)=>{for(var r in e)k(t,r,{get:e[r],enumerable:!0})},L=(t,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of ve(e))!Pe.call(t,n)&&n!==r&&k(t,n,{get:()=>e[n],enumerable:!(o=be(e,n))||o.enumerable});return t};var m=(t,e,r)=>(r=t!=null?he(we(t)):{},L(e||!t||!t.__esModule?k(r,"default",{value:t,enumerable:!0}):r,t)),xe=t=>L(k({},"__esModule",{value:!0}),t);var Ae={};Se(Ae,{computeStorybookMetadata:()=>ee,getPrecedingUpgrade:()=>pe,getStorybookCoreVersion:()=>z,getStorybookMetadata:()=>N,metaFrameworks:()=>I,sanitizeAddonName:()=>M,telemetry:()=>Ce});module.exports=xe(Ae);var B=require("@storybook/client-logger");var Z=m(require("read-pkg-up")),S=require("detect-package-manager"),y=require("@storybook/core-common");var _=require("fs-extra"),Y=m(require("path")),j=async t=>{let e=Object.keys(t);return Promise.all(e.map(h))},h=async t=>{try{let e=await D(t);return{name:t,version:e.version}}catch{return{name:t,version:null}}},D=async t=>{let e=require.resolve(Y.default.join(t,"package.json"),{paths:[process.cwd()]});return await(0,_.readJson)(e)},z=async()=>{var e;return(e=(await Promise.all(["@storybook/core-common","@storybook/core-server"].map(h))).find(r=>r.version))==null?void 0:e.version};var b=m(require("fs-extra")),v=m(require("path")),G=require("@storybook/core-common"),H={Nx:"nx.json",Turborepo:"turbo.json",Lerna:"lerna.json",Rush:"rush.json",Lage:"lage.config.json"},K=()=>{let t=(0,G.getProjectRoot)();if(!t)return;let r=Object.keys(H).find(n=>{let s=v.default.join(t,H[n]);return b.default.existsSync(s)});if(r)return r;if(!b.default.existsSync(v.default.join(t,"package.json")))return;let o=b.default.readJsonSync(v.default.join(t,"package.json"));if(o!=null&&o.workspaces)return"Workspaces"};var O=require("path");function q(t){return t.replace(/[-[/{}()*+?.\\^$|]/g,"\\$&")}function R(t,e=O.sep){if(!t)return t;let r=process.cwd().split(e);for(;r.length>1;){let o=r.join(e),n=new RegExp(q(o),"g");t=t.replace(n,"$SNIP");let s=r.join(e+e),f=new RegExp(q(s),"g");t=t.replace(f,"$SNIP"),r.pop()}return t}function w(t,e=O.sep){t=JSON.parse(JSON.stringify(t,Object.getOwnPropertyNames(t)));let r=R(JSON.stringify(t),e);return JSON.parse(r)}var Te=["html","react","svelte","vue3","preact","server","vue","web-components","angular","ember"],Ee=["builder-webpack5","builder-vite"];function J(t,e){let{name:r="",version:o,dependencies:n,devDependencies:s,peerDependencies:f}=t,c={[r]:o,...n,...s,...f};return e.map(p=>`@storybook/${p}`).find(p=>c[p])}async function Q(t){let{framework:e}=t;if(!e)return{};let r=typeof e=="string"?{name:e}:e,o=await D(r.name),n=J(o,Ee),s=J(o,Te);return{framework:r,builder:n,renderer:s}}function X(t){var r,o,n;let e=((r=t.dependencies)==null?void 0:r.chromatic)||((o=t.devDependencies)==null?void 0:o.chromatic)||((n=t.peerDependencies)==null?void 0:n.chromatic);return e||(t.scripts&&Object.values(t.scripts).find(s=>s==null?void 0:s.match(/chromatic/))?"latest":void 0)}var I={next:"Next","react-scripts":"CRA",gatsby:"Gatsby","@nuxtjs/storybook":"nuxt","@nrwl/storybook":"nx","@vue/cli-service":"vue-cli","@sveltejs/kit":"sveltekit"},M=t=>R(t).replace(/\/dist\/.*/,"").replace(/\.[mc]?[tj]?s[x]?$/,"").replace(/\/register$/,"").replace(/\/manager$/,"").replace(/\/preset$/,""),ee=async({packageJson:t,mainConfig:e})=>{var $;let r={generatedAt:new Date().getTime(),hasCustomBabel:!1,hasCustomWebpack:!1,hasStaticDirs:!1,hasStorybookEslint:!1,refCount:0},o={...t==null?void 0:t.dependencies,...t==null?void 0:t.devDependencies,...t==null?void 0:t.peerDependencies},n=Object.keys(o).find(a=>!!I[a]);if(n){let{version:a}=await h(n);r.metaFramework={name:I[n],packageName:n,version:a}}let s=K();s&&(r.monorepo=s);try{let a=await(0,S.detect)({cwd:(0,y.getProjectRoot)()}),i=await(0,S.getNpmVersion)(a);r.packageManager={type:a,version:i}}catch{}r.hasCustomBabel=!!e.babel,r.hasCustomWebpack=!!e.webpackFinal,r.hasStaticDirs=!!e.staticDirs,e.typescript&&(r.typescriptOptions=e.typescript);let f=await Q(e);e.refs&&(r.refCount=Object.keys(e.refs).length),e.features&&(r.features=e.features);let c={};e.addons&&e.addons.forEach(a=>{let i,F;typeof a=="string"?i=M(a):(F=a.options,i=M(a.name)),c[i]={options:F,version:void 0}});let p=X(t);p&&(c.chromatic={version:void 0,versionSpecifier:p,options:void 0}),(await j(c)).forEach(({name:a,version:i})=>{c[a].version=i});let l=Object.keys(c),g=Object.keys(o).filter(a=>a.includes("storybook")&&!l.includes(a)).reduce((a,i)=>({...a,[i]:{version:void 0}}),{});(await j(g)).forEach(({name:a,version:i})=>{g[a].version=i});let ue=o.typescript?"typescript":"javascript",ge=!!o["eslint-plugin-storybook"],W=(0,y.getStorybookInfo)(t),ke=($=g[W.frameworkPackage])==null?void 0:$.version;return{...r,...f,storybookVersion:ke,storybookVersionSpecifier:W.version,language:ue,storybookPackages:g,addons:c,hasStorybookEslint:ge}},P,N=async t=>{var n;if(P)return P;let{packageJson:e={}}=Z.default.sync({cwd:process.cwd(),normalize:!1})||{},r=(t||(0,y.getStorybookConfiguration)(((n=e==null?void 0:e.scripts)==null?void 0:n.storybook)||"","-c","--config-dir"))??".storybook",o=(0,y.loadMainConfig)({configDir:r});return P=await ee({mainConfig:o,packageJson:e}),P};var me=m(require("isomorphic-unfetch")),ye=m(require("fetch-retry")),C=require("nanoid");var oe=m(require("path")),ne=require("child_process"),se=require("@storybook/core-common");var te=require("crypto"),re=t=>{let e=(0,te.createHash)("sha256");return e.update("storybook-telemetry-salt"),e.update(t),e.digest("hex")};function je(t){return t.replace(/#.*$/,"").replace(/^.*@/,"").replace(/^.*\/\//,"").replace(":","/")}var x,ae=()=>{if(x)return x;let t;try{let e=(0,se.getProjectRoot)(),r=oe.default.relative(e,process.cwd()),o=(0,ne.execSync)("git config --local --get remote.origin.url",{timeout:1e3,stdio:"pipe"});t=`${je(String(o))}${r}`,x=re(t)}catch{}return x};var T=require("@storybook/core-common"),V=Promise.resolve(),De=async(t,e)=>{let r=await T.cache.get("lastEvents")||{};r[t]={body:e,timestamp:Date.now()},await T.cache.set("lastEvents",r)},ce=async(t,e)=>(await V,V=De(t,e),V);var Oe=t=>{let{body:e,timestamp:r}=t;return{timestamp:r,eventType:e==null?void 0:e.eventType,eventId:e==null?void 0:e.eventId,sessionId:e==null?void 0:e.sessionId}},Re=["init","upgrade"],Ie=["build","dev","error"],ie=(t,e)=>{let r=e.map(o=>t==null?void 0:t[o]).filter(Boolean).sort((o,n)=>n.timestamp-o.timestamp);return r.length>0?r[0]:void 0},pe=async(t=void 0)=>{let e=t||await T.cache.get("lastEvents")||{},r=ie(e,Re),o=ie(e,Ie);if(!!r)return!(o!=null&&o.timestamp)||r.timestamp>o.timestamp?Oe(r):void 0};var Me=process.env.STORYBOOK_TELEMETRY_URL||"https://storybook.js.org/event-log",Ne=(0,ye.default)(me.default),E=[],Ve=(0,C.nanoid)();async function fe(t,e={retryDelay:1e3,immediate:!1}){let{eventType:r,payload:o,metadata:n,...s}=t,f=e.stripMetadata?{}:{anonymousId:ae(),inCI:Boolean(process.env.CI)},c=(0,C.nanoid)(),p={...s,eventType:r,eventId:c,sessionId:Ve,metadata:n,payload:o,context:f},u;try{u=Ne(Me,{method:"POST",body:JSON.stringify(p),headers:{"Content-Type":"application/json"},retries:3,retryOn:[503,504],retryDelay:l=>2**l*(typeof(e==null?void 0:e.retryDelay)=="number"&&!Number.isNaN(e==null?void 0:e.retryDelay)?e.retryDelay:1e3)}),E.push(u),e.immediate?await Promise.all(E):await u,await ce(r,p)}catch{}finally{E=E.filter(l=>l!==u)}}var A=m(require("chalk")),U=require("@storybook/core-common"),le="telemetry-notification-date",d=console,de=async()=>{await U.cache.get(le,null)||(U.cache.set(le,Date.now()),d.log(),d.log(`${A.default.magenta.bold("attention")} => Storybook now collects completely anonymous telemetry regarding usage.`),d.log("This information is used to shape Storybook's roadmap and prioritize features."),d.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:"),d.log(A.default.cyan("https://storybook.js.org/telemetry")),d.log())};var Ce=async(t,e={},r={})=>{var n;t!=="boot"&&await de();let o={eventType:t,payload:e};try{r!=null&&r.stripMetadata||(o.metadata=await N(r==null?void 0:r.configDir))}catch(s){o.payload.metadataErrorMessage=w(s).message,r!=null&&r.enableCrashReports&&(o.payload.metadataError=w(s))}finally{let{error:s}=o.payload;s&&(o.payload.error=w(s)),(!o.payload.error||(r==null?void 0:r.enableCrashReports))&&((n=process.env)!=null&&n.STORYBOOK_TELEMETRY_DEBUG&&(B.logger.info(`
2
- [telemetry]`),B.logger.info(JSON.stringify(o,null,2))),await fe(o,r))}};0&&(module.exports={computeStorybookMetadata,getPrecedingUpgrade,getStorybookCoreVersion,getStorybookMetadata,metaFrameworks,sanitizeAddonName,telemetry});
1
+ "use strict";var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty;var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:!0}):target,mod)),__toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod);var src_exports={};__export(src_exports,{computeStorybookMetadata:()=>computeStorybookMetadata,getPrecedingUpgrade:()=>getPrecedingUpgrade,getStorybookCoreVersion:()=>getStorybookCoreVersion,getStorybookMetadata:()=>getStorybookMetadata,metaFrameworks:()=>metaFrameworks,oneWayHash:()=>oneWayHash,sanitizeAddonName:()=>sanitizeAddonName,telemetry:()=>telemetry});module.exports=__toCommonJS(src_exports);var import_client_logger=require("@storybook/client-logger");var import_read_pkg_up=__toESM(require("read-pkg-up")),import_detect_package_manager=require("detect-package-manager"),import_core_common2=require("@storybook/core-common");var fs=__toESM(require("fs-extra")),import_path=__toESM(require("path")),getActualPackageVersions=async packages=>{let packageNames=Object.keys(packages);return Promise.all(packageNames.map(getActualPackageVersion))},getActualPackageVersion=async packageName=>{try{let packageJson=await getActualPackageJson(packageName);return{name:packageName,version:packageJson.version}}catch{return{name:packageName,version:null}}},getActualPackageJson=async packageName=>{let resolvedPackageJson=require.resolve(import_path.default.join(packageName,"package.json"),{paths:[process.cwd()]});return await fs.readJson(resolvedPackageJson)},getStorybookCoreVersion=async()=>{var _a;return(_a=(await Promise.all(["@storybook/core-common","@storybook/core-server"].map(getActualPackageVersion))).find(v=>v.version))==null?void 0:_a.version};var import_fs_extra=__toESM(require("fs-extra")),import_path2=__toESM(require("path")),import_core_common=require("@storybook/core-common"),monorepoConfigs={Nx:"nx.json",Turborepo:"turbo.json",Lerna:"lerna.json",Rush:"rush.json",Lage:"lage.config.json"},getMonorepoType=()=>{let projectRootPath=(0,import_core_common.getProjectRoot)();if(!projectRootPath)return;let monorepoType=Object.keys(monorepoConfigs).find(monorepo=>{let configFile=import_path2.default.join(projectRootPath,monorepoConfigs[monorepo]);return import_fs_extra.default.existsSync(configFile)});if(monorepoType)return monorepoType;if(!import_fs_extra.default.existsSync(import_path2.default.join(projectRootPath,"package.json")))return;let packageJson=import_fs_extra.default.readJsonSync(import_path2.default.join(projectRootPath,"package.json"));if(packageJson!=null&&packageJson.workspaces)return"Workspaces"};var import_path3=require("path");function regexpEscape(str){return str.replace(/[-[/{}()*+?.\\^$|]/g,"\\$&")}function cleanPaths(str,separator=import_path3.sep){if(!str)return str;let stack=process.cwd().split(separator);for(;stack.length>1;){let currentPath=stack.join(separator),currentRegex=new RegExp(regexpEscape(currentPath),"g");str=str.replace(currentRegex,"$SNIP");let currentPath2=stack.join(separator+separator),currentRegex2=new RegExp(regexpEscape(currentPath2),"g");str=str.replace(currentRegex2,"$SNIP"),stack.pop()}return str}function sanitizeError(error,pathSeparator=import_path3.sep){try{error=JSON.parse(JSON.stringify(error,Object.getOwnPropertyNames(error)));let errorString=cleanPaths(JSON.stringify(error),pathSeparator);return JSON.parse(errorString)}catch(err){return`Sanitization error: ${err==null?void 0:err.message}`}}var knownRenderers=["html","react","svelte","vue3","preact","server","vue","web-components","angular","ember"],knownBuilders=["builder-webpack5","builder-vite"];function findMatchingPackage(packageJson,suffixes){let{name="",version,dependencies,devDependencies,peerDependencies}=packageJson,allDependencies={[name]:version,...dependencies,...devDependencies,...peerDependencies};return suffixes.map(suffix=>`@storybook/${suffix}`).find(pkg=>allDependencies[pkg])}async function getFrameworkInfo(mainConfig){let{framework:frameworkInput}=mainConfig;if(!frameworkInput)return{};let framework=typeof frameworkInput=="string"?{name:frameworkInput}:frameworkInput,frameworkPackageJson=await getActualPackageJson(framework.name),builder=findMatchingPackage(frameworkPackageJson,knownBuilders),renderer=findMatchingPackage(frameworkPackageJson,knownRenderers);return{framework,builder,renderer}}function getChromaticVersionSpecifier(packageJson){var _a,_b,_c;let dependency=((_a=packageJson.dependencies)==null?void 0:_a.chromatic)||((_b=packageJson.devDependencies)==null?void 0:_b.chromatic)||((_c=packageJson.peerDependencies)==null?void 0:_c.chromatic);return dependency||(packageJson.scripts&&Object.values(packageJson.scripts).find(s=>s==null?void 0:s.match(/chromatic/))?"latest":void 0)}var metaFrameworks={next:"Next","react-scripts":"CRA",gatsby:"Gatsby","@nuxtjs/storybook":"nuxt","@nrwl/storybook":"nx","@vue/cli-service":"vue-cli","@sveltejs/kit":"sveltekit"},sanitizeAddonName=name=>cleanPaths(name).replace(/\/dist\/.*/,"").replace(/\.[mc]?[tj]?s[x]?$/,"").replace(/\/register$/,"").replace(/\/manager$/,"").replace(/\/preset$/,""),computeStorybookMetadata=async({packageJson,mainConfig})=>{var _a;let metadata={generatedAt:new Date().getTime(),hasCustomBabel:!1,hasCustomWebpack:!1,hasStaticDirs:!1,hasStorybookEslint:!1,refCount:0},allDependencies={...packageJson==null?void 0:packageJson.dependencies,...packageJson==null?void 0:packageJson.devDependencies,...packageJson==null?void 0:packageJson.peerDependencies},metaFramework=Object.keys(allDependencies).find(dep=>!!metaFrameworks[dep]);if(metaFramework){let{version}=await getActualPackageVersion(metaFramework);metadata.metaFramework={name:metaFrameworks[metaFramework],packageName:metaFramework,version}}let monorepoType=getMonorepoType();monorepoType&&(metadata.monorepo=monorepoType);try{let packageManagerType=await(0,import_detect_package_manager.detect)({cwd:(0,import_core_common2.getProjectRoot)()}),packageManagerVerson=await(0,import_detect_package_manager.getNpmVersion)(packageManagerType);metadata.packageManager={type:packageManagerType,version:packageManagerVerson}}catch{}metadata.hasCustomBabel=!!mainConfig.babel,metadata.hasCustomWebpack=!!mainConfig.webpackFinal,metadata.hasStaticDirs=!!mainConfig.staticDirs,mainConfig.typescript&&(metadata.typescriptOptions=mainConfig.typescript);let frameworkInfo=await getFrameworkInfo(mainConfig);mainConfig.refs&&(metadata.refCount=Object.keys(mainConfig.refs).length),mainConfig.features&&(metadata.features=mainConfig.features);let addons={};mainConfig.addons&&mainConfig.addons.forEach(addon=>{let addonName,options;typeof addon=="string"?addonName=sanitizeAddonName(addon):(options=addon.options,addonName=sanitizeAddonName(addon.name)),addons[addonName]={options,version:void 0}});let chromaticVersionSpecifier=getChromaticVersionSpecifier(packageJson);chromaticVersionSpecifier&&(addons.chromatic={version:void 0,versionSpecifier:chromaticVersionSpecifier,options:void 0}),(await getActualPackageVersions(addons)).forEach(({name,version})=>{addons[name].version=version});let addonNames=Object.keys(addons),storybookPackages=Object.keys(allDependencies).filter(dep=>dep.includes("storybook")&&!addonNames.includes(dep)).reduce((acc,dep)=>({...acc,[dep]:{version:void 0}}),{});(await getActualPackageVersions(storybookPackages)).forEach(({name,version})=>{storybookPackages[name].version=version});let language=allDependencies.typescript?"typescript":"javascript",hasStorybookEslint=!!allDependencies["eslint-plugin-storybook"],storybookInfo=(0,import_core_common2.getStorybookInfo)(packageJson),storybookVersion=(_a=storybookPackages[storybookInfo.frameworkPackage])==null?void 0:_a.version;return{...metadata,...frameworkInfo,storybookVersion,storybookVersionSpecifier:storybookInfo.version,language,storybookPackages,addons,hasStorybookEslint}},cachedMetadata,getStorybookMetadata=async _configDir=>{var _a;if(cachedMetadata)return cachedMetadata;let{packageJson={}}=import_read_pkg_up.default.sync({cwd:process.cwd(),normalize:!1})||{},configDir=(_configDir||(0,import_core_common2.getStorybookConfiguration)(((_a=packageJson==null?void 0:packageJson.scripts)==null?void 0:_a.storybook)||"","-c","--config-dir"))??".storybook",mainConfig=await(0,import_core_common2.loadMainConfig)({configDir});return cachedMetadata=await computeStorybookMetadata({mainConfig,packageJson}),cachedMetadata};var import_node_fetch=__toESM(require("node-fetch")),import_fetch_retry=__toESM(require("fetch-retry")),import_nanoid=require("nanoid");var import_path4=__toESM(require("path")),import_child_process=require("child_process"),import_core_common3=require("@storybook/core-common");var import_crypto=require("crypto"),oneWayHash=payload=>{let hash=(0,import_crypto.createHash)("sha256");return hash.update("storybook-telemetry-salt"),hash.update(payload),hash.digest("hex")};function normalizeGitUrl(rawUrl){return rawUrl.trim().replace(/#.*$/,"").replace(/^.*@/,"").replace(/^.*\/\//,"").replace(":","/")}var anonymousProjectId,getAnonymousProjectId=()=>{if(anonymousProjectId)return anonymousProjectId;let unhashedProjectId;try{let projectRoot=(0,import_core_common3.getProjectRoot)(),projectRootPath=import_path4.default.relative(projectRoot,process.cwd()),originBuffer=(0,import_child_process.execSync)("git config --local --get remote.origin.url",{timeout:1e3,stdio:"pipe"});unhashedProjectId=`${normalizeGitUrl(String(originBuffer))}${projectRootPath}`,anonymousProjectId=oneWayHash(unhashedProjectId)}catch{}return anonymousProjectId};var import_core_common4=require("@storybook/core-common"),operation=Promise.resolve(),setHelper=async(eventType,body)=>{let lastEvents=await import_core_common4.cache.get("lastEvents")||{};lastEvents[eventType]={body,timestamp:Date.now()},await import_core_common4.cache.set("lastEvents",lastEvents)},set=async(eventType,body)=>(await operation,operation=setHelper(eventType,body),operation);var upgradeFields=event=>{let{body,timestamp}=event;return{timestamp,eventType:body==null?void 0:body.eventType,eventId:body==null?void 0:body.eventId,sessionId:body==null?void 0:body.sessionId}},UPGRADE_EVENTS=["init","upgrade"],RUN_EVENTS=["build","dev","error"],lastEvent=(lastEvents,eventTypes)=>{let descendingEvents=eventTypes.map(eventType=>lastEvents==null?void 0:lastEvents[eventType]).filter(Boolean).sort((a,b)=>b.timestamp-a.timestamp);return descendingEvents.length>0?descendingEvents[0]:void 0},getPrecedingUpgrade=async(events=void 0)=>{let lastEvents=events||await import_core_common4.cache.get("lastEvents")||{},lastUpgradeEvent=lastEvent(lastEvents,UPGRADE_EVENTS),lastRunEvent=lastEvent(lastEvents,RUN_EVENTS);if(lastUpgradeEvent)return!(lastRunEvent!=null&&lastRunEvent.timestamp)||lastUpgradeEvent.timestamp>lastRunEvent.timestamp?upgradeFields(lastUpgradeEvent):void 0};var URL=process.env.STORYBOOK_TELEMETRY_URL||"https://storybook.js.org/event-log",fetch=(0,import_fetch_retry.default)(import_node_fetch.default),tasks=[],sessionId=(0,import_nanoid.nanoid)();async function sendTelemetry(data,options={retryDelay:1e3,immediate:!1}){let{eventType,payload,metadata,...rest}=data,context=options.stripMetadata?{}:{anonymousId:getAnonymousProjectId(),inCI:Boolean(process.env.CI),isTTY:process.stdout.isTTY},eventId=(0,import_nanoid.nanoid)(),body={...rest,eventType,eventId,sessionId,metadata,payload,context},request;try{request=fetch(URL,{method:"POST",body:JSON.stringify(body),headers:{"Content-Type":"application/json"},retries:3,retryOn:[503,504],retryDelay:attempt=>2**attempt*(typeof(options==null?void 0:options.retryDelay)=="number"&&!Number.isNaN(options==null?void 0:options.retryDelay)?options.retryDelay:1e3)}),tasks.push(request),options.immediate?await Promise.all(tasks):await request,await set(eventType,body)}catch{}finally{tasks=tasks.filter(task=>task!==request)}}var import_chalk=__toESM(require("chalk")),import_core_common5=require("@storybook/core-common"),TELEMETRY_KEY_NOTIFY_DATE="telemetry-notification-date",logger=console,notify=async()=>{await import_core_common5.cache.get(TELEMETRY_KEY_NOTIFY_DATE,null)||(import_core_common5.cache.set(TELEMETRY_KEY_NOTIFY_DATE,Date.now()),logger.log(),logger.log(`${import_chalk.default.magenta.bold("attention")} => Storybook now collects completely anonymous telemetry regarding usage.`),logger.log("This information is used to shape Storybook's roadmap and prioritize features."),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:"),logger.log(import_chalk.default.cyan("https://storybook.js.org/telemetry")),logger.log())};var telemetry=async(eventType,payload={},options={})=>{var _a;eventType!=="boot"&&await notify();let telemetryData={eventType,payload};try{options!=null&&options.stripMetadata||(telemetryData.metadata=await getStorybookMetadata(options==null?void 0:options.configDir))}catch(error){telemetryData.payload.metadataErrorMessage=sanitizeError(error).message,options!=null&&options.enableCrashReports&&(telemetryData.payload.metadataError=sanitizeError(error))}finally{let{error}=telemetryData.payload;error&&(telemetryData.payload.error=sanitizeError(error)),(!telemetryData.payload.error||options!=null&&options.enableCrashReports)&&((_a=process.env)!=null&&_a.STORYBOOK_TELEMETRY_DEBUG&&(import_client_logger.logger.info(`
2
+ [telemetry]`),import_client_logger.logger.info(JSON.stringify(telemetryData,null,2))),await sendTelemetry(telemetryData,options))}};0&&(module.exports={computeStorybookMetadata,getPrecedingUpgrade,getStorybookCoreVersion,getStorybookMetadata,metaFrameworks,oneWayHash,sanitizeAddonName,telemetry});
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- var __require=(x=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(x,{get:(a,b)=>(typeof require<"u"?require:a)[b]}):x)(function(x){if(typeof require<"u")return require.apply(this,arguments);throw new Error('Dynamic require of "'+x+'" is not supported')});import{logger as logger2}from"@storybook/client-logger";import readPkgUp from"read-pkg-up";import{detect,getNpmVersion}from"detect-package-manager";import{loadMainConfig,getStorybookInfo,getStorybookConfiguration,getProjectRoot as getProjectRoot2}from"@storybook/core-common";import{readJson}from"fs-extra";import path from"path";var getActualPackageVersions=async packages=>{let packageNames=Object.keys(packages);return Promise.all(packageNames.map(getActualPackageVersion))},getActualPackageVersion=async packageName=>{try{let packageJson=await getActualPackageJson(packageName);return{name:packageName,version:packageJson.version}}catch{return{name:packageName,version:null}}},getActualPackageJson=async packageName=>{let resolvedPackageJson=__require.resolve(path.join(packageName,"package.json"),{paths:[process.cwd()]});return await readJson(resolvedPackageJson)},getStorybookCoreVersion=async()=>(await Promise.all(["@storybook/core-common","@storybook/core-server"].map(getActualPackageVersion))).find(v=>v.version)?.version;import fs from"fs-extra";import path2 from"path";import{getProjectRoot}from"@storybook/core-common";var monorepoConfigs={Nx:"nx.json",Turborepo:"turbo.json",Lerna:"lerna.json",Rush:"rush.json",Lage:"lage.config.json"},getMonorepoType=()=>{let projectRootPath=getProjectRoot();if(!projectRootPath)return;let monorepoType=Object.keys(monorepoConfigs).find(monorepo=>{let configFile=path2.join(projectRootPath,monorepoConfigs[monorepo]);return fs.existsSync(configFile)});if(monorepoType)return monorepoType;if(!fs.existsSync(path2.join(projectRootPath,"package.json")))return;if(fs.readJsonSync(path2.join(projectRootPath,"package.json"))?.workspaces)return"Workspaces"};import{sep}from"path";function regexpEscape(str){return str.replace(/[-[/{}()*+?.\\^$|]/g,"\\$&")}function cleanPaths(str,separator=sep){if(!str)return str;let stack=process.cwd().split(separator);for(;stack.length>1;){let currentPath=stack.join(separator),currentRegex=new RegExp(regexpEscape(currentPath),"g");str=str.replace(currentRegex,"$SNIP");let currentPath2=stack.join(separator+separator),currentRegex2=new RegExp(regexpEscape(currentPath2),"g");str=str.replace(currentRegex2,"$SNIP"),stack.pop()}return str}function sanitizeError(error,pathSeparator=sep){error=JSON.parse(JSON.stringify(error,Object.getOwnPropertyNames(error)));let errorString=cleanPaths(JSON.stringify(error),pathSeparator);return JSON.parse(errorString)}var knownRenderers=["html","react","svelte","vue3","preact","server","vue","web-components","angular","ember"],knownBuilders=["builder-webpack5","builder-vite"];function findMatchingPackage(packageJson,suffixes){let{name="",version,dependencies,devDependencies,peerDependencies}=packageJson,allDependencies={[name]:version,...dependencies,...devDependencies,...peerDependencies};return suffixes.map(suffix=>`@storybook/${suffix}`).find(pkg=>allDependencies[pkg])}async function getFrameworkInfo(mainConfig){let{framework:frameworkInput}=mainConfig;if(!frameworkInput)return{};let framework=typeof frameworkInput=="string"?{name:frameworkInput}:frameworkInput,frameworkPackageJson=await getActualPackageJson(framework.name),builder=findMatchingPackage(frameworkPackageJson,knownBuilders),renderer=findMatchingPackage(frameworkPackageJson,knownRenderers);return{framework,builder,renderer}}function getChromaticVersionSpecifier(packageJson){let dependency=packageJson.dependencies?.chromatic||packageJson.devDependencies?.chromatic||packageJson.peerDependencies?.chromatic;return dependency||(packageJson.scripts&&Object.values(packageJson.scripts).find(s=>s?.match(/chromatic/))?"latest":void 0)}var metaFrameworks={next:"Next","react-scripts":"CRA",gatsby:"Gatsby","@nuxtjs/storybook":"nuxt","@nrwl/storybook":"nx","@vue/cli-service":"vue-cli","@sveltejs/kit":"sveltekit"},sanitizeAddonName=name=>cleanPaths(name).replace(/\/dist\/.*/,"").replace(/\.[mc]?[tj]?s[x]?$/,"").replace(/\/register$/,"").replace(/\/manager$/,"").replace(/\/preset$/,""),computeStorybookMetadata=async({packageJson,mainConfig})=>{let metadata={generatedAt:new Date().getTime(),hasCustomBabel:!1,hasCustomWebpack:!1,hasStaticDirs:!1,hasStorybookEslint:!1,refCount:0},allDependencies={...packageJson?.dependencies,...packageJson?.devDependencies,...packageJson?.peerDependencies},metaFramework=Object.keys(allDependencies).find(dep=>!!metaFrameworks[dep]);if(metaFramework){let{version}=await getActualPackageVersion(metaFramework);metadata.metaFramework={name:metaFrameworks[metaFramework],packageName:metaFramework,version}}let monorepoType=getMonorepoType();monorepoType&&(metadata.monorepo=monorepoType);try{let packageManagerType=await detect({cwd:getProjectRoot2()}),packageManagerVerson=await getNpmVersion(packageManagerType);metadata.packageManager={type:packageManagerType,version:packageManagerVerson}}catch{}metadata.hasCustomBabel=!!mainConfig.babel,metadata.hasCustomWebpack=!!mainConfig.webpackFinal,metadata.hasStaticDirs=!!mainConfig.staticDirs,mainConfig.typescript&&(metadata.typescriptOptions=mainConfig.typescript);let frameworkInfo=await getFrameworkInfo(mainConfig);mainConfig.refs&&(metadata.refCount=Object.keys(mainConfig.refs).length),mainConfig.features&&(metadata.features=mainConfig.features);let addons={};mainConfig.addons&&mainConfig.addons.forEach(addon=>{let addonName,options;typeof addon=="string"?addonName=sanitizeAddonName(addon):(options=addon.options,addonName=sanitizeAddonName(addon.name)),addons[addonName]={options,version:void 0}});let chromaticVersionSpecifier=getChromaticVersionSpecifier(packageJson);chromaticVersionSpecifier&&(addons.chromatic={version:void 0,versionSpecifier:chromaticVersionSpecifier,options:void 0}),(await getActualPackageVersions(addons)).forEach(({name,version})=>{addons[name].version=version});let addonNames=Object.keys(addons),storybookPackages=Object.keys(allDependencies).filter(dep=>dep.includes("storybook")&&!addonNames.includes(dep)).reduce((acc,dep)=>({...acc,[dep]:{version:void 0}}),{});(await getActualPackageVersions(storybookPackages)).forEach(({name,version})=>{storybookPackages[name].version=version});let language=allDependencies.typescript?"typescript":"javascript",hasStorybookEslint=!!allDependencies["eslint-plugin-storybook"],storybookInfo=getStorybookInfo(packageJson),storybookVersion=storybookPackages[storybookInfo.frameworkPackage]?.version;return{...metadata,...frameworkInfo,storybookVersion,storybookVersionSpecifier:storybookInfo.version,language,storybookPackages,addons,hasStorybookEslint}},cachedMetadata,getStorybookMetadata=async _configDir=>{if(cachedMetadata)return cachedMetadata;let{packageJson={}}=readPkgUp.sync({cwd:process.cwd(),normalize:!1})||{},configDir=(_configDir||getStorybookConfiguration(packageJson?.scripts?.storybook||"","-c","--config-dir"))??".storybook",mainConfig=loadMainConfig({configDir});return cachedMetadata=await computeStorybookMetadata({mainConfig,packageJson}),cachedMetadata};import originalFetch from"isomorphic-unfetch";import retry from"fetch-retry";import{nanoid}from"nanoid";import path3 from"path";import{execSync}from"child_process";import{getProjectRoot as getProjectRoot3}from"@storybook/core-common";import{createHash}from"crypto";var oneWayHash=payload=>{let hash=createHash("sha256");return hash.update("storybook-telemetry-salt"),hash.update(payload),hash.digest("hex")};function normalizeGitUrl(rawUrl){return rawUrl.replace(/#.*$/,"").replace(/^.*@/,"").replace(/^.*\/\//,"").replace(":","/")}var anonymousProjectId,getAnonymousProjectId=()=>{if(anonymousProjectId)return anonymousProjectId;let unhashedProjectId;try{let projectRoot=getProjectRoot3(),projectRootPath=path3.relative(projectRoot,process.cwd()),originBuffer=execSync("git config --local --get remote.origin.url",{timeout:1e3,stdio:"pipe"});unhashedProjectId=`${normalizeGitUrl(String(originBuffer))}${projectRootPath}`,anonymousProjectId=oneWayHash(unhashedProjectId)}catch{}return anonymousProjectId};import{cache}from"@storybook/core-common";var operation=Promise.resolve(),setHelper=async(eventType,body)=>{let lastEvents=await cache.get("lastEvents")||{};lastEvents[eventType]={body,timestamp:Date.now()},await cache.set("lastEvents",lastEvents)},set=async(eventType,body)=>(await operation,operation=setHelper(eventType,body),operation);var upgradeFields=event=>{let{body,timestamp}=event;return{timestamp,eventType:body?.eventType,eventId:body?.eventId,sessionId:body?.sessionId}},UPGRADE_EVENTS=["init","upgrade"],RUN_EVENTS=["build","dev","error"],lastEvent=(lastEvents,eventTypes)=>{let descendingEvents=eventTypes.map(eventType=>lastEvents?.[eventType]).filter(Boolean).sort((a,b)=>b.timestamp-a.timestamp);return descendingEvents.length>0?descendingEvents[0]:void 0},getPrecedingUpgrade=async(events=void 0)=>{let lastEvents=events||await cache.get("lastEvents")||{},lastUpgradeEvent=lastEvent(lastEvents,UPGRADE_EVENTS),lastRunEvent=lastEvent(lastEvents,RUN_EVENTS);if(!!lastUpgradeEvent)return!lastRunEvent?.timestamp||lastUpgradeEvent.timestamp>lastRunEvent.timestamp?upgradeFields(lastUpgradeEvent):void 0};var URL=process.env.STORYBOOK_TELEMETRY_URL||"https://storybook.js.org/event-log",fetch=retry(originalFetch),tasks=[],sessionId=nanoid();async function sendTelemetry(data,options={retryDelay:1e3,immediate:!1}){let{eventType,payload,metadata,...rest}=data,context=options.stripMetadata?{}:{anonymousId:getAnonymousProjectId(),inCI:Boolean(process.env.CI)},eventId=nanoid(),body={...rest,eventType,eventId,sessionId,metadata,payload,context},request;try{request=fetch(URL,{method:"POST",body:JSON.stringify(body),headers:{"Content-Type":"application/json"},retries:3,retryOn:[503,504],retryDelay:attempt=>2**attempt*(typeof options?.retryDelay=="number"&&!Number.isNaN(options?.retryDelay)?options.retryDelay:1e3)}),tasks.push(request),options.immediate?await Promise.all(tasks):await request,await set(eventType,body)}catch{}finally{tasks=tasks.filter(task=>task!==request)}}import chalk from"chalk";import{cache as cache2}from"@storybook/core-common";var TELEMETRY_KEY_NOTIFY_DATE="telemetry-notification-date",logger=console,notify=async()=>{await cache2.get(TELEMETRY_KEY_NOTIFY_DATE,null)||(cache2.set(TELEMETRY_KEY_NOTIFY_DATE,Date.now()),logger.log(),logger.log(`${chalk.magenta.bold("attention")} => Storybook now collects completely anonymous telemetry regarding usage.`),logger.log("This information is used to shape Storybook's roadmap and prioritize features."),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:"),logger.log(chalk.cyan("https://storybook.js.org/telemetry")),logger.log())};var telemetry=async(eventType,payload={},options={})=>{eventType!=="boot"&&await notify();let telemetryData={eventType,payload};try{options?.stripMetadata||(telemetryData.metadata=await getStorybookMetadata(options?.configDir))}catch(error){telemetryData.payload.metadataErrorMessage=sanitizeError(error).message,options?.enableCrashReports&&(telemetryData.payload.metadataError=sanitizeError(error))}finally{let{error}=telemetryData.payload;error&&(telemetryData.payload.error=sanitizeError(error)),(!telemetryData.payload.error||options?.enableCrashReports)&&(process.env?.STORYBOOK_TELEMETRY_DEBUG&&(logger2.info(`
2
- [telemetry]`),logger2.info(JSON.stringify(telemetryData,null,2))),await sendTelemetry(telemetryData,options))}};export{computeStorybookMetadata,getPrecedingUpgrade,getStorybookCoreVersion,getStorybookMetadata,metaFrameworks,sanitizeAddonName,telemetry};
1
+ var __require=(x=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(x,{get:(a,b)=>(typeof require<"u"?require:a)[b]}):x)(function(x){if(typeof require<"u")return require.apply(this,arguments);throw new Error('Dynamic require of "'+x+'" is not supported')});import{logger as logger2}from"@storybook/client-logger";import readPkgUp from"read-pkg-up";import{detect,getNpmVersion}from"detect-package-manager";import{loadMainConfig,getStorybookInfo,getStorybookConfiguration,getProjectRoot as getProjectRoot2}from"@storybook/core-common";import*as fs from"fs-extra";import path from"path";var getActualPackageVersions=async packages=>{let packageNames=Object.keys(packages);return Promise.all(packageNames.map(getActualPackageVersion))},getActualPackageVersion=async packageName=>{try{let packageJson=await getActualPackageJson(packageName);return{name:packageName,version:packageJson.version}}catch{return{name:packageName,version:null}}},getActualPackageJson=async packageName=>{let resolvedPackageJson=__require.resolve(path.join(packageName,"package.json"),{paths:[process.cwd()]});return await fs.readJson(resolvedPackageJson)},getStorybookCoreVersion=async()=>(await Promise.all(["@storybook/core-common","@storybook/core-server"].map(getActualPackageVersion))).find(v=>v.version)?.version;import fs2 from"fs-extra";import path2 from"path";import{getProjectRoot}from"@storybook/core-common";var monorepoConfigs={Nx:"nx.json",Turborepo:"turbo.json",Lerna:"lerna.json",Rush:"rush.json",Lage:"lage.config.json"},getMonorepoType=()=>{let projectRootPath=getProjectRoot();if(!projectRootPath)return;let monorepoType=Object.keys(monorepoConfigs).find(monorepo=>{let configFile=path2.join(projectRootPath,monorepoConfigs[monorepo]);return fs2.existsSync(configFile)});if(monorepoType)return monorepoType;if(!fs2.existsSync(path2.join(projectRootPath,"package.json")))return;if(fs2.readJsonSync(path2.join(projectRootPath,"package.json"))?.workspaces)return"Workspaces"};import{sep}from"path";function regexpEscape(str){return str.replace(/[-[/{}()*+?.\\^$|]/g,"\\$&")}function cleanPaths(str,separator=sep){if(!str)return str;let stack=process.cwd().split(separator);for(;stack.length>1;){let currentPath=stack.join(separator),currentRegex=new RegExp(regexpEscape(currentPath),"g");str=str.replace(currentRegex,"$SNIP");let currentPath2=stack.join(separator+separator),currentRegex2=new RegExp(regexpEscape(currentPath2),"g");str=str.replace(currentRegex2,"$SNIP"),stack.pop()}return str}function sanitizeError(error,pathSeparator=sep){try{error=JSON.parse(JSON.stringify(error,Object.getOwnPropertyNames(error)));let errorString=cleanPaths(JSON.stringify(error),pathSeparator);return JSON.parse(errorString)}catch(err){return`Sanitization error: ${err?.message}`}}var knownRenderers=["html","react","svelte","vue3","preact","server","vue","web-components","angular","ember"],knownBuilders=["builder-webpack5","builder-vite"];function findMatchingPackage(packageJson,suffixes){let{name="",version,dependencies,devDependencies,peerDependencies}=packageJson,allDependencies={[name]:version,...dependencies,...devDependencies,...peerDependencies};return suffixes.map(suffix=>`@storybook/${suffix}`).find(pkg=>allDependencies[pkg])}async function getFrameworkInfo(mainConfig){let{framework:frameworkInput}=mainConfig;if(!frameworkInput)return{};let framework=typeof frameworkInput=="string"?{name:frameworkInput}:frameworkInput,frameworkPackageJson=await getActualPackageJson(framework.name),builder=findMatchingPackage(frameworkPackageJson,knownBuilders),renderer=findMatchingPackage(frameworkPackageJson,knownRenderers);return{framework,builder,renderer}}function getChromaticVersionSpecifier(packageJson){let dependency=packageJson.dependencies?.chromatic||packageJson.devDependencies?.chromatic||packageJson.peerDependencies?.chromatic;return dependency||(packageJson.scripts&&Object.values(packageJson.scripts).find(s=>s?.match(/chromatic/))?"latest":void 0)}var metaFrameworks={next:"Next","react-scripts":"CRA",gatsby:"Gatsby","@nuxtjs/storybook":"nuxt","@nrwl/storybook":"nx","@vue/cli-service":"vue-cli","@sveltejs/kit":"sveltekit"},sanitizeAddonName=name=>cleanPaths(name).replace(/\/dist\/.*/,"").replace(/\.[mc]?[tj]?s[x]?$/,"").replace(/\/register$/,"").replace(/\/manager$/,"").replace(/\/preset$/,""),computeStorybookMetadata=async({packageJson,mainConfig})=>{let metadata={generatedAt:new Date().getTime(),hasCustomBabel:!1,hasCustomWebpack:!1,hasStaticDirs:!1,hasStorybookEslint:!1,refCount:0},allDependencies={...packageJson?.dependencies,...packageJson?.devDependencies,...packageJson?.peerDependencies},metaFramework=Object.keys(allDependencies).find(dep=>!!metaFrameworks[dep]);if(metaFramework){let{version}=await getActualPackageVersion(metaFramework);metadata.metaFramework={name:metaFrameworks[metaFramework],packageName:metaFramework,version}}let monorepoType=getMonorepoType();monorepoType&&(metadata.monorepo=monorepoType);try{let packageManagerType=await detect({cwd:getProjectRoot2()}),packageManagerVerson=await getNpmVersion(packageManagerType);metadata.packageManager={type:packageManagerType,version:packageManagerVerson}}catch{}metadata.hasCustomBabel=!!mainConfig.babel,metadata.hasCustomWebpack=!!mainConfig.webpackFinal,metadata.hasStaticDirs=!!mainConfig.staticDirs,mainConfig.typescript&&(metadata.typescriptOptions=mainConfig.typescript);let frameworkInfo=await getFrameworkInfo(mainConfig);mainConfig.refs&&(metadata.refCount=Object.keys(mainConfig.refs).length),mainConfig.features&&(metadata.features=mainConfig.features);let addons={};mainConfig.addons&&mainConfig.addons.forEach(addon=>{let addonName,options;typeof addon=="string"?addonName=sanitizeAddonName(addon):(options=addon.options,addonName=sanitizeAddonName(addon.name)),addons[addonName]={options,version:void 0}});let chromaticVersionSpecifier=getChromaticVersionSpecifier(packageJson);chromaticVersionSpecifier&&(addons.chromatic={version:void 0,versionSpecifier:chromaticVersionSpecifier,options:void 0}),(await getActualPackageVersions(addons)).forEach(({name,version})=>{addons[name].version=version});let addonNames=Object.keys(addons),storybookPackages=Object.keys(allDependencies).filter(dep=>dep.includes("storybook")&&!addonNames.includes(dep)).reduce((acc,dep)=>({...acc,[dep]:{version:void 0}}),{});(await getActualPackageVersions(storybookPackages)).forEach(({name,version})=>{storybookPackages[name].version=version});let language=allDependencies.typescript?"typescript":"javascript",hasStorybookEslint=!!allDependencies["eslint-plugin-storybook"],storybookInfo=getStorybookInfo(packageJson),storybookVersion=storybookPackages[storybookInfo.frameworkPackage]?.version;return{...metadata,...frameworkInfo,storybookVersion,storybookVersionSpecifier:storybookInfo.version,language,storybookPackages,addons,hasStorybookEslint}},cachedMetadata,getStorybookMetadata=async _configDir=>{if(cachedMetadata)return cachedMetadata;let{packageJson={}}=readPkgUp.sync({cwd:process.cwd(),normalize:!1})||{},configDir=(_configDir||getStorybookConfiguration(packageJson?.scripts?.storybook||"","-c","--config-dir"))??".storybook",mainConfig=await loadMainConfig({configDir});return cachedMetadata=await computeStorybookMetadata({mainConfig,packageJson}),cachedMetadata};import originalFetch from"node-fetch";import retry from"fetch-retry";import{nanoid}from"nanoid";import path3 from"path";import{execSync}from"child_process";import{getProjectRoot as getProjectRoot3}from"@storybook/core-common";import{createHash}from"crypto";var oneWayHash=payload=>{let hash=createHash("sha256");return hash.update("storybook-telemetry-salt"),hash.update(payload),hash.digest("hex")};function normalizeGitUrl(rawUrl){return rawUrl.trim().replace(/#.*$/,"").replace(/^.*@/,"").replace(/^.*\/\//,"").replace(":","/")}var anonymousProjectId,getAnonymousProjectId=()=>{if(anonymousProjectId)return anonymousProjectId;let unhashedProjectId;try{let projectRoot=getProjectRoot3(),projectRootPath=path3.relative(projectRoot,process.cwd()),originBuffer=execSync("git config --local --get remote.origin.url",{timeout:1e3,stdio:"pipe"});unhashedProjectId=`${normalizeGitUrl(String(originBuffer))}${projectRootPath}`,anonymousProjectId=oneWayHash(unhashedProjectId)}catch{}return anonymousProjectId};import{cache}from"@storybook/core-common";var operation=Promise.resolve(),setHelper=async(eventType,body)=>{let lastEvents=await cache.get("lastEvents")||{};lastEvents[eventType]={body,timestamp:Date.now()},await cache.set("lastEvents",lastEvents)},set=async(eventType,body)=>(await operation,operation=setHelper(eventType,body),operation);var upgradeFields=event=>{let{body,timestamp}=event;return{timestamp,eventType:body?.eventType,eventId:body?.eventId,sessionId:body?.sessionId}},UPGRADE_EVENTS=["init","upgrade"],RUN_EVENTS=["build","dev","error"],lastEvent=(lastEvents,eventTypes)=>{let descendingEvents=eventTypes.map(eventType=>lastEvents?.[eventType]).filter(Boolean).sort((a,b)=>b.timestamp-a.timestamp);return descendingEvents.length>0?descendingEvents[0]:void 0},getPrecedingUpgrade=async(events=void 0)=>{let lastEvents=events||await cache.get("lastEvents")||{},lastUpgradeEvent=lastEvent(lastEvents,UPGRADE_EVENTS),lastRunEvent=lastEvent(lastEvents,RUN_EVENTS);if(lastUpgradeEvent)return!lastRunEvent?.timestamp||lastUpgradeEvent.timestamp>lastRunEvent.timestamp?upgradeFields(lastUpgradeEvent):void 0};var URL=process.env.STORYBOOK_TELEMETRY_URL||"https://storybook.js.org/event-log",fetch=retry(originalFetch),tasks=[],sessionId=nanoid();async function sendTelemetry(data,options={retryDelay:1e3,immediate:!1}){let{eventType,payload,metadata,...rest}=data,context=options.stripMetadata?{}:{anonymousId:getAnonymousProjectId(),inCI:Boolean(process.env.CI),isTTY:process.stdout.isTTY},eventId=nanoid(),body={...rest,eventType,eventId,sessionId,metadata,payload,context},request;try{request=fetch(URL,{method:"POST",body:JSON.stringify(body),headers:{"Content-Type":"application/json"},retries:3,retryOn:[503,504],retryDelay:attempt=>2**attempt*(typeof options?.retryDelay=="number"&&!Number.isNaN(options?.retryDelay)?options.retryDelay:1e3)}),tasks.push(request),options.immediate?await Promise.all(tasks):await request,await set(eventType,body)}catch{}finally{tasks=tasks.filter(task=>task!==request)}}import chalk from"chalk";import{cache as cache2}from"@storybook/core-common";var TELEMETRY_KEY_NOTIFY_DATE="telemetry-notification-date",logger=console,notify=async()=>{await cache2.get(TELEMETRY_KEY_NOTIFY_DATE,null)||(cache2.set(TELEMETRY_KEY_NOTIFY_DATE,Date.now()),logger.log(),logger.log(`${chalk.magenta.bold("attention")} => Storybook now collects completely anonymous telemetry regarding usage.`),logger.log("This information is used to shape Storybook's roadmap and prioritize features."),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:"),logger.log(chalk.cyan("https://storybook.js.org/telemetry")),logger.log())};var telemetry=async(eventType,payload={},options={})=>{eventType!=="boot"&&await notify();let telemetryData={eventType,payload};try{options?.stripMetadata||(telemetryData.metadata=await getStorybookMetadata(options?.configDir))}catch(error){telemetryData.payload.metadataErrorMessage=sanitizeError(error).message,options?.enableCrashReports&&(telemetryData.payload.metadataError=sanitizeError(error))}finally{let{error}=telemetryData.payload;error&&(telemetryData.payload.error=sanitizeError(error)),(!telemetryData.payload.error||options?.enableCrashReports)&&(process.env?.STORYBOOK_TELEMETRY_DEBUG&&(logger2.info(`
2
+ [telemetry]`),logger2.info(JSON.stringify(telemetryData,null,2))),await sendTelemetry(telemetryData,options))}};export{computeStorybookMetadata,getPrecedingUpgrade,getStorybookCoreVersion,getStorybookMetadata,metaFrameworks,oneWayHash,sanitizeAddonName,telemetry};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@storybook/telemetry",
3
- "version": "7.0.0-beta.8",
3
+ "version": "7.0.0-rc.0",
4
4
  "description": "Telemetry logging for crash reports and usage statistics",
5
5
  "keywords": [
6
6
  "storybook"
@@ -22,6 +22,7 @@
22
22
  "sideEffects": false,
23
23
  "exports": {
24
24
  ".": {
25
+ "node": "./dist/index.js",
25
26
  "require": "./dist/index.js",
26
27
  "import": "./dist/index.mjs",
27
28
  "types": "./dist/index.d.ts"
@@ -42,14 +43,15 @@
42
43
  "prep": "../../../scripts/prepare/bundle.ts"
43
44
  },
44
45
  "dependencies": {
45
- "@storybook/client-logger": "7.0.0-beta.8",
46
- "@storybook/core-common": "7.0.0-beta.8",
46
+ "@storybook/client-logger": "7.0.0-rc.0",
47
+ "@storybook/core-common": "7.0.0-rc.0",
48
+ "@types/node-fetch": "^2.5.7",
47
49
  "chalk": "^4.1.0",
48
50
  "detect-package-manager": "^2.0.1",
49
51
  "fetch-retry": "^5.0.2",
50
- "fs-extra": "^9.0.1",
51
- "isomorphic-unfetch": "^3.1.0",
52
+ "fs-extra": "^11.1.0",
52
53
  "nanoid": "^3.3.1",
54
+ "node-fetch": "^2.6.7",
53
55
  "read-pkg-up": "^7.0.1"
54
56
  },
55
57
  "devDependencies": {
@@ -64,5 +66,5 @@
64
66
  ],
65
67
  "platform": "node"
66
68
  },
67
- "gitHead": "5340574d89a799ec10959edc16ca140852cf355c"
69
+ "gitHead": "6d1bcb2579203a3075467a2ba83738d854545053"
68
70
  }