happo 6.0.2 → 6.0.4

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 (36) hide show
  1. package/dist/cli/{cancelJob-DLBVJJZD.js → cancelJob-GCTVJGYB.js} +3 -3
  2. package/dist/cli/{chunk-WCYGMV7Y.js → chunk-DYCU4INF.js} +2 -2
  3. package/dist/cli/{chunk-WCYGMV7Y.js.map → chunk-DYCU4INF.js.map} +1 -1
  4. package/dist/cli/{chunk-6EGFARRJ.js → chunk-TCHC2O3E.js} +2 -2
  5. package/dist/cli/{chunk-3DMZ3X42.js → chunk-TPF2272Y.js} +2 -2
  6. package/dist/cli/createAsyncComparison-5X5OBHF2.js +9 -0
  7. package/dist/cli/{createAsyncReport-NU2YZCLB.js → createAsyncReport-ZIO2Q6SS.js} +3 -3
  8. package/dist/cli/index.d.ts.map +1 -1
  9. package/dist/cli/index.js +65 -28
  10. package/dist/cli/index.js.map +2 -2
  11. package/dist/cli/package-CB7WD7JO.js +7 -0
  12. package/dist/cli/{prepareSnapRequests-YHIEO2TR.js → prepareSnapRequests-NPYZG2AI.js} +3 -3
  13. package/dist/cli/{startJob-GYFQMV2N.js → startJob-T3PWEYOP.js} +3 -3
  14. package/dist/cli/{wrapper-YF7XYZUE.js → wrapper-WKKUKM7T.js} +7 -5
  15. package/dist/cli/{wrapper-YF7XYZUE.js.map → wrapper-WKKUKM7T.js.map} +2 -2
  16. package/dist/config/loadConfig.d.ts +3 -1
  17. package/dist/config/loadConfig.d.ts.map +1 -1
  18. package/dist/cypress/task.js +55 -18
  19. package/dist/cypress/task.js.map +2 -2
  20. package/dist/e2e/wrapper.d.ts.map +1 -1
  21. package/dist/playwright/index.js +55 -18
  22. package/dist/playwright/index.js.map +2 -2
  23. package/dist/storybook/browser/register.d.ts.map +1 -1
  24. package/dist/storybook/browser/register.js +0 -13
  25. package/dist/storybook/browser/register.js.map +2 -2
  26. package/package.json +1 -1
  27. package/dist/cli/createAsyncComparison-6QN75552.js +0 -9
  28. package/dist/cli/package-XGP4W7OT.js +0 -7
  29. /package/dist/cli/{cancelJob-DLBVJJZD.js.map → cancelJob-GCTVJGYB.js.map} +0 -0
  30. /package/dist/cli/{chunk-6EGFARRJ.js.map → chunk-TCHC2O3E.js.map} +0 -0
  31. /package/dist/cli/{chunk-3DMZ3X42.js.map → chunk-TPF2272Y.js.map} +0 -0
  32. /package/dist/cli/{createAsyncComparison-6QN75552.js.map → createAsyncComparison-5X5OBHF2.js.map} +0 -0
  33. /package/dist/cli/{createAsyncReport-NU2YZCLB.js.map → createAsyncReport-ZIO2Q6SS.js.map} +0 -0
  34. /package/dist/cli/{package-XGP4W7OT.js.map → package-CB7WD7JO.js.map} +0 -0
  35. /package/dist/cli/{prepareSnapRequests-YHIEO2TR.js.map → prepareSnapRequests-NPYZG2AI.js.map} +0 -0
  36. /package/dist/cli/{startJob-GYFQMV2N.js.map → startJob-T3PWEYOP.js.map} +0 -0
@@ -7,7 +7,6 @@ var time = globalThis.happoTime || {
7
7
  originalDateNow: Date.now,
8
8
  originalSetTimeout: globalThis.setTimeout.bind(globalThis)
9
9
  };
10
- var ASYNC_TIMEOUT = 100;
11
10
  var STORY_STORE_TIMEOUT = 1e4;
12
11
  var renderTimeoutMs = 2e3;
13
12
  var examples;
@@ -26,16 +25,6 @@ var ForcedHappoScreenshot = class extends Error {
26
25
  this.step = stepLabel;
27
26
  }
28
27
  };
29
- async function waitForSomeContent(elem, start = time.originalDateNow()) {
30
- const html = elem.innerHTML.trim();
31
- const duration = time.originalDateNow() - start;
32
- if (html === "" && duration < ASYNC_TIMEOUT) {
33
- return new Promise(
34
- (resolve) => time.originalSetTimeout(() => resolve(waitForSomeContent(elem, start)), 10)
35
- );
36
- }
37
- return html;
38
- }
39
28
  async function waitForWaitFor(waitFor, start = time.originalDateNow()) {
40
29
  const duration = time.originalDateNow() - start;
41
30
  if (!waitFor() && duration < renderTimeoutMs) {
@@ -300,10 +289,8 @@ globalThis.happo.nextExample = async () => {
300
289
  if (theme && themeSwitcher) {
301
290
  await themeSwitcher(theme, channel);
302
291
  }
303
- await waitForSomeContent(rootElement);
304
292
  if (/sb-show-errordisplay/.test(document.body.className)) {
305
293
  channel.emit("forceReRender");
306
- await waitForSomeContent(rootElement);
307
294
  }
308
295
  if (beforeScreenshot && typeof beforeScreenshot === "function") {
309
296
  try {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/storybook/browser/register.ts"],
4
- "sourcesContent": ["import type { Channel } from 'storybook/internal/channels';\nimport type { StoryStore } from 'storybook/internal/preview-api';\n\nimport type {\n InitConfig,\n NextExampleResult,\n WindowHappo,\n} from '../../isomorphic/types.ts';\nimport type { SkipItems } from '../isomorphic/types.ts';\nimport { SB_ROOT_ELEMENT_SELECTOR } from './constants.ts';\n\ninterface HappoTime {\n originalDateNow: typeof Date.now;\n originalSetTimeout: typeof setTimeout;\n}\n\ndeclare global {\n var happoTime: HappoTime | undefined;\n var happoSkipped: SkipItems | undefined;\n var __IS_HAPPO_RUN: boolean | undefined;\n var __STORYBOOK_CLIENT_API__:\n | {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _storyStore: StoryStore<any>;\n }\n | undefined;\n var __STORYBOOK_PREVIEW__:\n | {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n storyStoreValue: StoryStore<any>;\n }\n | undefined;\n var __STORYBOOK_ADDONS_CHANNEL__: Channel | undefined;\n}\n\nconst time = globalThis.happoTime || {\n originalDateNow: Date.now,\n originalSetTimeout: globalThis.setTimeout.bind(globalThis),\n};\n\nconst ASYNC_TIMEOUT = 100;\nconst STORY_STORE_TIMEOUT = 10_000;\n\ntype HookFunction = ({\n rootElement,\n}: {\n rootElement: HTMLElement;\n}) => void | Promise<void>;\n\ninterface Example {\n component: string;\n variant: string;\n storyId: string;\n delay: number;\n waitForContent: string | undefined;\n waitFor: () => boolean;\n beforeScreenshot: HookFunction;\n afterScreenshot: HookFunction;\n targets: Array<string>;\n theme?: string;\n}\n\nlet renderTimeoutMs = 2000;\nlet examples: Array<Example>;\nlet currentIndex = 0;\nlet defaultDelay: number;\nlet themeSwitcher: (theme: string, channel: Channel) => Promise<void>;\nlet forcedHappoScreenshotSteps:\n | Array<{ stepLabel: string; done: boolean }>\n | undefined;\nlet shouldWaitForCompletedEvent = true;\n\nclass ForcedHappoScreenshot extends Error {\n type: string;\n step: string;\n\n constructor(stepLabel: string) {\n super(`Forced screenshot with label \"${stepLabel}\"`);\n this.name = 'ForcedHappoScreenshot';\n this.type = 'ForcedHappoScreenshot';\n this.step = stepLabel;\n }\n}\n\nasync function waitForSomeContent(\n elem: HTMLElement,\n start = time.originalDateNow(),\n): Promise<string> {\n const html = elem.innerHTML.trim();\n const duration = time.originalDateNow() - start;\n\n if (html === '' && duration < ASYNC_TIMEOUT) {\n return new Promise((resolve) =>\n time.originalSetTimeout(() => resolve(waitForSomeContent(elem, start)), 10),\n );\n }\n\n return html;\n}\n\nasync function waitForWaitFor(\n waitFor: () => boolean,\n start = time.originalDateNow(),\n): Promise<void> {\n const duration = time.originalDateNow() - start;\n if (!waitFor() && duration < renderTimeoutMs) {\n return new Promise((resolve) =>\n time.originalSetTimeout(() => resolve(waitForWaitFor(waitFor, start)), 50),\n );\n }\n\n return;\n}\n\n/**\n * Type safe function to check if a value is defined\n *\n * @example\n * const filtered = values.filter(isDefined);\n */\nfunction isDefined<T>(value: T): value is NonNullable<T> {\n if (value === undefined) {\n return false;\n }\n if (value === null) {\n return false;\n }\n return true;\n}\n\nasync function getStoryStore(startTime = time.originalDateNow()) {\n const duration = time.originalDateNow() - startTime;\n if (duration >= STORY_STORE_TIMEOUT) {\n throw new Error(\n `Timeout: Could not find Storybook Client API after ${STORY_STORE_TIMEOUT}ms`,\n );\n }\n\n const { __STORYBOOK_CLIENT_API__: clientApi, __STORYBOOK_PREVIEW__: preview } =\n globalThis;\n\n if (clientApi && clientApi._storyStore) {\n return clientApi._storyStore;\n }\n if (preview && preview.storyStoreValue) {\n return preview.storyStoreValue;\n }\n\n // Wait 100ms and try again\n await new Promise((resolve) => time.originalSetTimeout(resolve, 100));\n return getStoryStore(startTime);\n}\n\nasync function getExamples(): Promise<Array<Example>> {\n const storyStore = await getStoryStore();\n\n if (!storyStore) {\n throw new Error('Could not get Storybook story store');\n }\n\n if (!storyStore.extract) {\n throw new Error('Missing Storybook Client API');\n }\n\n if (storyStore.cacheAllCSFFiles) {\n await storyStore.cacheAllCSFFiles();\n }\n\n return Object.values(storyStore.extract())\n .map(({ id, kind, story, parameters }) => {\n if (parameters.happo === false) {\n return;\n }\n let delay = defaultDelay;\n let waitForContent;\n let waitFor;\n let beforeScreenshot;\n let afterScreenshot;\n let targets;\n let themes;\n if (typeof parameters.happo === 'object' && parameters.happo !== null) {\n delay = parameters.happo.delay || defaultDelay;\n waitForContent = parameters.happo.waitForContent;\n waitFor = parameters.happo.waitFor;\n beforeScreenshot = parameters.happo.beforeScreenshot;\n afterScreenshot = parameters.happo.afterScreenshot;\n targets = parameters.happo.targets;\n themes = parameters.happo.themes;\n }\n return {\n component: kind,\n variant: story,\n storyId: id,\n delay,\n waitForContent,\n waitFor,\n beforeScreenshot,\n afterScreenshot,\n targets,\n themes,\n };\n })\n .filter(isDefined)\n .reduce<Array<Example>>((result, { themes, ...rest }) => {\n if (themes) {\n for (const theme of themes) {\n result.push({\n ...rest,\n variant: `${rest.variant} [${theme}]`,\n theme,\n });\n }\n } else {\n result.push(rest);\n }\n\n return result;\n }, [])\n .toSorted((a, b) => {\n const aCompare = `${a.component}-${a.theme}-${a.storyId}`;\n const bCompare = `${b.component}-${b.theme}-${b.storyId}`;\n if (aCompare === bCompare) {\n return 0;\n }\n return aCompare < bCompare ? -1 : 1;\n });\n}\n\nlet initConfig: InitConfig = {};\n\nfunction filterExamples(all: Array<Example>): Array<Example> {\n const { chunk, targetName, only } = initConfig;\n\n if (chunk) {\n const examplesPerChunk = Math.ceil(all.length / chunk.total);\n const startIndex = chunk.index * examplesPerChunk;\n const endIndex = startIndex + examplesPerChunk;\n all = all.slice(startIndex, endIndex);\n }\n\n if (targetName) {\n all = all.filter((e) => {\n if (!e.targets || !Array.isArray(e.targets)) {\n // This story hasn't been filtered for specific targets\n return true;\n }\n\n return e.targets.includes(targetName);\n });\n }\n\n if (only) {\n all = all.filter(\n (e) => e.component === only.component && e.variant === only.variant,\n );\n }\n\n return all;\n}\n\nglobalThis.happo = globalThis.happo || ({} as WindowHappo);\n\nglobalThis.happo.init = (config: InitConfig) => {\n initConfig = config;\n};\n\ninterface Story {\n kind: string;\n story: string;\n storyId: string;\n}\n\nfunction renderStory(\n story: Story,\n { force = false } = {},\n): Promise<{ pausedAtStep?: { stepLabel: string; done: boolean } }> {\n const channel = globalThis.__STORYBOOK_ADDONS_CHANNEL__;\n\n if (!channel) {\n throw new Error('Missing Storybook Addons Channel');\n }\n\n let isPlaying = false;\n let loadingCount = 0;\n\n return new Promise((resolve) => {\n const timeout = time.originalSetTimeout(resolve, renderTimeoutMs);\n function handleRenderPhaseChanged(ev: { storyId: string; newPhase: string }) {\n if (!channel) {\n throw new Error('Missing Storybook Addons Channel');\n }\n\n if (ev.storyId !== story.storyId) {\n console.log(\n `Skipping render phase event (${ev.newPhase}) because story IDs don't match. Current storyId: ${story.storyId}, event storyId: ${ev.storyId}`,\n );\n return;\n }\n\n if (ev.newPhase === 'loading') {\n loadingCount++;\n }\n\n if (ev.newPhase === 'finished' || ev.newPhase === 'aborted') {\n loadingCount--;\n }\n\n if (ev.newPhase === 'finished') {\n if (loadingCount > 0) {\n console.log(\n `Skipping finished event because loadingCount is ${loadingCount} for story ${story.storyId}`,\n );\n return;\n }\n\n channel.off('storyRenderPhaseChanged', handleRenderPhaseChanged);\n clearTimeout(timeout);\n\n if (isPlaying && forcedHappoScreenshotSteps) {\n const pausedAtStep = forcedHappoScreenshotSteps.at(-1);\n\n if (pausedAtStep && !pausedAtStep.done) {\n return resolve({ pausedAtStep });\n }\n }\n\n return resolve({});\n }\n\n if (ev.newPhase === 'playing') {\n isPlaying = true;\n }\n }\n\n if (shouldWaitForCompletedEvent) {\n channel.on('storyRenderPhaseChanged', handleRenderPhaseChanged);\n }\n\n if (force) {\n channel.emit('forceRemount', story);\n } else {\n channel.emit('setCurrentStory', story);\n }\n\n if (!shouldWaitForCompletedEvent) {\n time.originalSetTimeout(() => {\n clearTimeout(timeout);\n resolve({});\n }, 0);\n }\n });\n}\n\nfunction assertHTMLElement(element: Element | null): asserts element is HTMLElement {\n if (element === null) {\n throw new Error('element cannot be null');\n }\n if (!(element instanceof HTMLElement)) {\n throw new TypeError('element must be an HTMLElement');\n }\n}\n\nglobalThis.happo.nextExample = async (): Promise<NextExampleResult | undefined> => {\n if (!examples) {\n examples = filterExamples(await getExamples());\n }\n\n if (currentIndex >= examples.length) {\n return;\n }\n\n const example = examples[currentIndex];\n if (!example) {\n throw new Error(`Missing example at index ${currentIndex}`);\n }\n\n const {\n component,\n variant: rawVariant,\n storyId,\n delay,\n waitForContent,\n waitFor,\n beforeScreenshot,\n theme,\n } = example;\n\n let pausedAtStep;\n let variant = rawVariant;\n\n try {\n if (\n globalThis.happoSkipped &&\n globalThis.happoSkipped.some(\n (item) => item.component === component && item.variant === variant,\n )\n ) {\n console.log(`Skipping ${component}, ${variant} since it is in the skip list`);\n return { component, variant, skipped: true };\n }\n\n const docsRootElement = document.getElementById('docs-root');\n if (docsRootElement) {\n docsRootElement.dataset.happoIgnore = 'true';\n }\n\n const rootElement = document.querySelector(SB_ROOT_ELEMENT_SELECTOR);\n assertHTMLElement(rootElement);\n rootElement.dataset.happoIgnore = 'true';\n\n const { afterScreenshot } = examples[currentIndex - 1] || {};\n if (afterScreenshot && typeof afterScreenshot === 'function') {\n try {\n await afterScreenshot({ rootElement });\n } catch (e) {\n console.error('Failed to invoke afterScreenshot hook', e);\n }\n }\n\n const renderResult = await renderStory(\n {\n kind: component,\n story: rawVariant,\n storyId,\n },\n { force: !!forcedHappoScreenshotSteps },\n );\n\n pausedAtStep = renderResult.pausedAtStep;\n\n if (pausedAtStep) {\n variant = `${variant}-${pausedAtStep.stepLabel}`;\n } else {\n forcedHappoScreenshotSteps = undefined;\n }\n\n const channel = globalThis.__STORYBOOK_ADDONS_CHANNEL__;\n if (!channel) {\n throw new Error('Missing Storybook Addons Channel');\n }\n\n if (theme && themeSwitcher) {\n await themeSwitcher(theme, channel);\n }\n\n await waitForSomeContent(rootElement);\n\n if (/sb-show-errordisplay/.test(document.body.className)) {\n // It's possible that the error is from unmounting the previous story. We\n // can try re-rendering in this case.\n channel.emit('forceReRender');\n await waitForSomeContent(rootElement);\n }\n\n if (beforeScreenshot && typeof beforeScreenshot === 'function') {\n try {\n await beforeScreenshot({ rootElement });\n } catch (e) {\n console.error('Failed to invoke beforeScreenshot hook', e);\n }\n }\n\n await new Promise((resolve) => time.originalSetTimeout(resolve, delay));\n\n if (waitFor) {\n await waitForWaitFor(waitFor);\n }\n\n const highlightsRootElement = document.querySelector(\n '#storybook-highlights-root',\n );\n if (\n highlightsRootElement &&\n (highlightsRootElement instanceof HTMLElement ||\n highlightsRootElement instanceof SVGElement ||\n highlightsRootElement instanceof MathMLElement)\n ) {\n highlightsRootElement.dataset.happoIgnore = 'true';\n }\n\n return { component, variant, waitForContent };\n } catch (e) {\n console.warn(e);\n return { component, variant };\n } finally {\n if (pausedAtStep) {\n pausedAtStep.done = true;\n } else {\n currentIndex++;\n }\n }\n};\n\nexport function forceHappoScreenshot(stepLabel: string): void {\n if (!examples) {\n console.log(\n `Ignoring forceHappoScreenshot with step label \"${stepLabel}\" since we are not currently rendering for Happo`,\n );\n return;\n }\n\n if (!stepLabel) {\n throw new Error(\n 'Missing stepLabel argument. Make sure to pass a string as the first argument to this function. E.g. `forceHappoScreenshot(\"modal open\")`',\n );\n }\n\n if (\n forcedHappoScreenshotSteps &&\n forcedHappoScreenshotSteps.some((s) => s.stepLabel === stepLabel)\n ) {\n // ignore, this step has already been handled\n return;\n }\n\n forcedHappoScreenshotSteps = forcedHappoScreenshotSteps || [];\n forcedHappoScreenshotSteps.push({ stepLabel, done: false });\n\n console.log('Forcing happo screenshot', stepLabel);\n throw new ForcedHappoScreenshot(stepLabel);\n}\n\nexport function setDefaultDelay(delay: number): void {\n defaultDelay = delay;\n}\n\nexport function setRenderTimeoutMs(timeoutMs: number): void {\n renderTimeoutMs = timeoutMs;\n}\n\nexport function setThemeSwitcher(\n func: (theme: string, channel: Channel) => Promise<void>,\n): void {\n themeSwitcher = func;\n}\n\nexport function setShouldWaitForCompletedEvent(swfce: boolean): void {\n shouldWaitForCompletedEvent = swfce;\n}\n\nexport const isHappoRun = (): boolean => globalThis.__IS_HAPPO_RUN ?? false;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { Channel } from 'storybook/internal/channels';\nimport type { StoryStore } from 'storybook/internal/preview-api';\n\nimport type {\n InitConfig,\n NextExampleResult,\n WindowHappo,\n} from '../../isomorphic/types.ts';\nimport type { SkipItems } from '../isomorphic/types.ts';\nimport { SB_ROOT_ELEMENT_SELECTOR } from './constants.ts';\n\ninterface HappoTime {\n originalDateNow: typeof Date.now;\n originalSetTimeout: typeof setTimeout;\n}\n\ndeclare global {\n var happoTime: HappoTime | undefined;\n var happoSkipped: SkipItems | undefined;\n var __IS_HAPPO_RUN: boolean | undefined;\n var __STORYBOOK_CLIENT_API__:\n | {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _storyStore: StoryStore<any>;\n }\n | undefined;\n var __STORYBOOK_PREVIEW__:\n | {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n storyStoreValue: StoryStore<any>;\n }\n | undefined;\n var __STORYBOOK_ADDONS_CHANNEL__: Channel | undefined;\n}\n\nconst time = globalThis.happoTime || {\n originalDateNow: Date.now,\n originalSetTimeout: globalThis.setTimeout.bind(globalThis),\n};\n\nconst STORY_STORE_TIMEOUT = 10_000;\n\ntype HookFunction = ({\n rootElement,\n}: {\n rootElement: HTMLElement;\n}) => void | Promise<void>;\n\ninterface Example {\n component: string;\n variant: string;\n storyId: string;\n delay: number;\n waitForContent: string | undefined;\n waitFor: () => boolean;\n beforeScreenshot: HookFunction;\n afterScreenshot: HookFunction;\n targets: Array<string>;\n theme?: string;\n}\n\nlet renderTimeoutMs = 2000;\nlet examples: Array<Example>;\nlet currentIndex = 0;\nlet defaultDelay: number;\nlet themeSwitcher: (theme: string, channel: Channel) => Promise<void>;\nlet forcedHappoScreenshotSteps:\n | Array<{ stepLabel: string; done: boolean }>\n | undefined;\nlet shouldWaitForCompletedEvent = true;\n\nclass ForcedHappoScreenshot extends Error {\n type: string;\n step: string;\n\n constructor(stepLabel: string) {\n super(`Forced screenshot with label \"${stepLabel}\"`);\n this.name = 'ForcedHappoScreenshot';\n this.type = 'ForcedHappoScreenshot';\n this.step = stepLabel;\n }\n}\n\nasync function waitForWaitFor(\n waitFor: () => boolean,\n start = time.originalDateNow(),\n): Promise<void> {\n const duration = time.originalDateNow() - start;\n if (!waitFor() && duration < renderTimeoutMs) {\n return new Promise((resolve) =>\n time.originalSetTimeout(() => resolve(waitForWaitFor(waitFor, start)), 50),\n );\n }\n\n return;\n}\n\n/**\n * Type safe function to check if a value is defined\n *\n * @example\n * const filtered = values.filter(isDefined);\n */\nfunction isDefined<T>(value: T): value is NonNullable<T> {\n if (value === undefined) {\n return false;\n }\n if (value === null) {\n return false;\n }\n return true;\n}\n\nasync function getStoryStore(startTime = time.originalDateNow()) {\n const duration = time.originalDateNow() - startTime;\n if (duration >= STORY_STORE_TIMEOUT) {\n throw new Error(\n `Timeout: Could not find Storybook Client API after ${STORY_STORE_TIMEOUT}ms`,\n );\n }\n\n const { __STORYBOOK_CLIENT_API__: clientApi, __STORYBOOK_PREVIEW__: preview } =\n globalThis;\n\n if (clientApi && clientApi._storyStore) {\n return clientApi._storyStore;\n }\n if (preview && preview.storyStoreValue) {\n return preview.storyStoreValue;\n }\n\n // Wait 100ms and try again\n await new Promise((resolve) => time.originalSetTimeout(resolve, 100));\n return getStoryStore(startTime);\n}\n\nasync function getExamples(): Promise<Array<Example>> {\n const storyStore = await getStoryStore();\n\n if (!storyStore) {\n throw new Error('Could not get Storybook story store');\n }\n\n if (!storyStore.extract) {\n throw new Error('Missing Storybook Client API');\n }\n\n if (storyStore.cacheAllCSFFiles) {\n await storyStore.cacheAllCSFFiles();\n }\n\n return Object.values(storyStore.extract())\n .map(({ id, kind, story, parameters }) => {\n if (parameters.happo === false) {\n return;\n }\n let delay = defaultDelay;\n let waitForContent;\n let waitFor;\n let beforeScreenshot;\n let afterScreenshot;\n let targets;\n let themes;\n if (typeof parameters.happo === 'object' && parameters.happo !== null) {\n delay = parameters.happo.delay || defaultDelay;\n waitForContent = parameters.happo.waitForContent;\n waitFor = parameters.happo.waitFor;\n beforeScreenshot = parameters.happo.beforeScreenshot;\n afterScreenshot = parameters.happo.afterScreenshot;\n targets = parameters.happo.targets;\n themes = parameters.happo.themes;\n }\n return {\n component: kind,\n variant: story,\n storyId: id,\n delay,\n waitForContent,\n waitFor,\n beforeScreenshot,\n afterScreenshot,\n targets,\n themes,\n };\n })\n .filter(isDefined)\n .reduce<Array<Example>>((result, { themes, ...rest }) => {\n if (themes) {\n for (const theme of themes) {\n result.push({\n ...rest,\n variant: `${rest.variant} [${theme}]`,\n theme,\n });\n }\n } else {\n result.push(rest);\n }\n\n return result;\n }, [])\n .toSorted((a, b) => {\n const aCompare = `${a.component}-${a.theme}-${a.storyId}`;\n const bCompare = `${b.component}-${b.theme}-${b.storyId}`;\n if (aCompare === bCompare) {\n return 0;\n }\n return aCompare < bCompare ? -1 : 1;\n });\n}\n\nlet initConfig: InitConfig = {};\n\nfunction filterExamples(all: Array<Example>): Array<Example> {\n const { chunk, targetName, only } = initConfig;\n\n if (chunk) {\n const examplesPerChunk = Math.ceil(all.length / chunk.total);\n const startIndex = chunk.index * examplesPerChunk;\n const endIndex = startIndex + examplesPerChunk;\n all = all.slice(startIndex, endIndex);\n }\n\n if (targetName) {\n all = all.filter((e) => {\n if (!e.targets || !Array.isArray(e.targets)) {\n // This story hasn't been filtered for specific targets\n return true;\n }\n\n return e.targets.includes(targetName);\n });\n }\n\n if (only) {\n all = all.filter(\n (e) => e.component === only.component && e.variant === only.variant,\n );\n }\n\n return all;\n}\n\nglobalThis.happo = globalThis.happo || ({} as WindowHappo);\n\nglobalThis.happo.init = (config: InitConfig) => {\n initConfig = config;\n};\n\ninterface Story {\n kind: string;\n story: string;\n storyId: string;\n}\n\nfunction renderStory(\n story: Story,\n { force = false } = {},\n): Promise<{ pausedAtStep?: { stepLabel: string; done: boolean } }> {\n const channel = globalThis.__STORYBOOK_ADDONS_CHANNEL__;\n\n if (!channel) {\n throw new Error('Missing Storybook Addons Channel');\n }\n\n let isPlaying = false;\n let loadingCount = 0;\n\n return new Promise((resolve) => {\n const timeout = time.originalSetTimeout(resolve, renderTimeoutMs);\n function handleRenderPhaseChanged(ev: { storyId: string; newPhase: string }) {\n if (!channel) {\n throw new Error('Missing Storybook Addons Channel');\n }\n\n if (ev.storyId !== story.storyId) {\n console.log(\n `Skipping render phase event (${ev.newPhase}) because story IDs don't match. Current storyId: ${story.storyId}, event storyId: ${ev.storyId}`,\n );\n return;\n }\n\n if (ev.newPhase === 'loading') {\n loadingCount++;\n }\n\n if (ev.newPhase === 'finished' || ev.newPhase === 'aborted') {\n loadingCount--;\n }\n\n if (ev.newPhase === 'finished') {\n if (loadingCount > 0) {\n console.log(\n `Skipping finished event because loadingCount is ${loadingCount} for story ${story.storyId}`,\n );\n return;\n }\n\n channel.off('storyRenderPhaseChanged', handleRenderPhaseChanged);\n clearTimeout(timeout);\n\n if (isPlaying && forcedHappoScreenshotSteps) {\n const pausedAtStep = forcedHappoScreenshotSteps.at(-1);\n\n if (pausedAtStep && !pausedAtStep.done) {\n return resolve({ pausedAtStep });\n }\n }\n\n return resolve({});\n }\n\n if (ev.newPhase === 'playing') {\n isPlaying = true;\n }\n }\n\n if (shouldWaitForCompletedEvent) {\n channel.on('storyRenderPhaseChanged', handleRenderPhaseChanged);\n }\n\n if (force) {\n channel.emit('forceRemount', story);\n } else {\n channel.emit('setCurrentStory', story);\n }\n\n if (!shouldWaitForCompletedEvent) {\n time.originalSetTimeout(() => {\n clearTimeout(timeout);\n resolve({});\n }, 0);\n }\n });\n}\n\nfunction assertHTMLElement(element: Element | null): asserts element is HTMLElement {\n if (element === null) {\n throw new Error('element cannot be null');\n }\n if (!(element instanceof HTMLElement)) {\n throw new TypeError('element must be an HTMLElement');\n }\n}\n\nglobalThis.happo.nextExample = async (): Promise<NextExampleResult | undefined> => {\n if (!examples) {\n examples = filterExamples(await getExamples());\n }\n\n if (currentIndex >= examples.length) {\n return;\n }\n\n const example = examples[currentIndex];\n if (!example) {\n throw new Error(`Missing example at index ${currentIndex}`);\n }\n\n const {\n component,\n variant: rawVariant,\n storyId,\n delay,\n waitForContent,\n waitFor,\n beforeScreenshot,\n theme,\n } = example;\n\n let pausedAtStep;\n let variant = rawVariant;\n\n try {\n if (\n globalThis.happoSkipped &&\n globalThis.happoSkipped.some(\n (item) => item.component === component && item.variant === variant,\n )\n ) {\n console.log(`Skipping ${component}, ${variant} since it is in the skip list`);\n return { component, variant, skipped: true };\n }\n\n const docsRootElement = document.getElementById('docs-root');\n if (docsRootElement) {\n docsRootElement.dataset.happoIgnore = 'true';\n }\n\n const rootElement = document.querySelector(SB_ROOT_ELEMENT_SELECTOR);\n assertHTMLElement(rootElement);\n rootElement.dataset.happoIgnore = 'true';\n\n const { afterScreenshot } = examples[currentIndex - 1] || {};\n if (afterScreenshot && typeof afterScreenshot === 'function') {\n try {\n await afterScreenshot({ rootElement });\n } catch (e) {\n console.error('Failed to invoke afterScreenshot hook', e);\n }\n }\n\n const renderResult = await renderStory(\n {\n kind: component,\n story: rawVariant,\n storyId,\n },\n { force: !!forcedHappoScreenshotSteps },\n );\n\n pausedAtStep = renderResult.pausedAtStep;\n\n if (pausedAtStep) {\n variant = `${variant}-${pausedAtStep.stepLabel}`;\n } else {\n forcedHappoScreenshotSteps = undefined;\n }\n\n const channel = globalThis.__STORYBOOK_ADDONS_CHANNEL__;\n if (!channel) {\n throw new Error('Missing Storybook Addons Channel');\n }\n\n if (theme && themeSwitcher) {\n await themeSwitcher(theme, channel);\n }\n\n if (/sb-show-errordisplay/.test(document.body.className)) {\n // It's possible that the error is from unmounting the previous story. We\n // can try re-rendering in this case.\n channel.emit('forceReRender');\n }\n\n if (beforeScreenshot && typeof beforeScreenshot === 'function') {\n try {\n await beforeScreenshot({ rootElement });\n } catch (e) {\n console.error('Failed to invoke beforeScreenshot hook', e);\n }\n }\n\n await new Promise((resolve) => time.originalSetTimeout(resolve, delay));\n\n if (waitFor) {\n await waitForWaitFor(waitFor);\n }\n\n const highlightsRootElement = document.querySelector(\n '#storybook-highlights-root',\n );\n if (\n highlightsRootElement &&\n (highlightsRootElement instanceof HTMLElement ||\n highlightsRootElement instanceof SVGElement ||\n highlightsRootElement instanceof MathMLElement)\n ) {\n highlightsRootElement.dataset.happoIgnore = 'true';\n }\n\n return { component, variant, waitForContent };\n } catch (e) {\n console.warn(e);\n return { component, variant };\n } finally {\n if (pausedAtStep) {\n pausedAtStep.done = true;\n } else {\n currentIndex++;\n }\n }\n};\n\nexport function forceHappoScreenshot(stepLabel: string): void {\n if (!examples) {\n console.log(\n `Ignoring forceHappoScreenshot with step label \"${stepLabel}\" since we are not currently rendering for Happo`,\n );\n return;\n }\n\n if (!stepLabel) {\n throw new Error(\n 'Missing stepLabel argument. Make sure to pass a string as the first argument to this function. E.g. `forceHappoScreenshot(\"modal open\")`',\n );\n }\n\n if (\n forcedHappoScreenshotSteps &&\n forcedHappoScreenshotSteps.some((s) => s.stepLabel === stepLabel)\n ) {\n // ignore, this step has already been handled\n return;\n }\n\n forcedHappoScreenshotSteps = forcedHappoScreenshotSteps || [];\n forcedHappoScreenshotSteps.push({ stepLabel, done: false });\n\n console.log('Forcing happo screenshot', stepLabel);\n throw new ForcedHappoScreenshot(stepLabel);\n}\n\nexport function setDefaultDelay(delay: number): void {\n defaultDelay = delay;\n}\n\nexport function setRenderTimeoutMs(timeoutMs: number): void {\n renderTimeoutMs = timeoutMs;\n}\n\nexport function setThemeSwitcher(\n func: (theme: string, channel: Channel) => Promise<void>,\n): void {\n themeSwitcher = func;\n}\n\nexport function setShouldWaitForCompletedEvent(swfce: boolean): void {\n shouldWaitForCompletedEvent = swfce;\n}\n\nexport const isHappoRun = (): boolean => globalThis.__IS_HAPPO_RUN ?? false;\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "happo",
3
- "version": "6.0.2",
3
+ "version": "6.0.4",
4
4
  "description": "Catch unexpected visual and accessibility changes and UI bugs",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -1,9 +0,0 @@
1
- import {
2
- createAsyncComparison
3
- } from "./chunk-3DMZ3X42.js";
4
- import "./chunk-6EGFARRJ.js";
5
- import "./chunk-WCYGMV7Y.js";
6
- export {
7
- createAsyncComparison as default
8
- };
9
- //# sourceMappingURL=createAsyncComparison-6QN75552.js.map
@@ -1,7 +0,0 @@
1
- import {
2
- package_default
3
- } from "./chunk-WCYGMV7Y.js";
4
- export {
5
- package_default as default
6
- };
7
- //# sourceMappingURL=package-XGP4W7OT.js.map