{"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/discovery.ts","../src/filtering.ts","../src/server.ts","../src/validation.ts"],"sourcesContent":["/**\n * @fileoverview Storybook adapter for Visnap visual testing framework\n *\n * Storybook-based TestCaseAdapter that can discover and test Storybook stories.\n * Manages a local Storybook server, discovers stories from the browser context,\n * and normalizes them into test case instances.\n */\n\nimport type {\n  TestCaseAdapter,\n  TestCaseInstanceMeta,\n  ViewportMap,\n  PageWithEvaluate,\n} from \"@visnap/protocol\";\n\nimport { discoverCasesFromBrowser } from \"./discovery\";\nimport { normalizeStories } from \"./filtering\";\nimport { createServerManager } from \"./server\";\nimport { validateOptions } from \"./validation\";\n\n/**\n * Options to create a Storybook adapter\n * @property source - Either a URL to a running Storybook or a path to a `storybook-static` directory\n * @property port - If serving from disk, which port to bind to (defaults to 4477)\n * @property include - Optional minimatch pattern(s) matched against story IDs\n * @property exclude - Optional minimatch pattern(s) to exclude from story IDs\n * @property discovery - Configuration for story discovery timeouts and retries\n */\nexport interface CreateStorybookAdapterOptions {\n  source: string;\n  port?: number;\n  include?: string | string[];\n  exclude?: string | string[];\n  discovery?: {\n    evalTimeoutMs?: number;\n    maxRetries?: number;\n    retryDelayMs?: number;\n  };\n}\n\n/**\n * Creates a Storybook-based TestCaseAdapter that can:\n * - Start a local static file server for `storybook-static` or use a provided URL\n * - Discover stories via the browser by calling Storybook's `extract()` API\n * - Filter, normalize, and expand stories into test case instances\n *\n * @param options - Configuration options for the Storybook adapter\n * @returns A TestCaseAdapter instance configured for Storybook testing\n */\nexport function createAdapter(\n  options: CreateStorybookAdapterOptions\n): TestCaseAdapter {\n  // Validate options using ArkType schema\n  const validatedOptions = validateOptions(options);\n\n  const serverManager = createServerManager(\n    validatedOptions.source,\n    validatedOptions.port\n  );\n\n  return {\n    name: \"storybook\",\n    /**\n     * Starts the adapter and returns base URL of the Storybook under test\n     * @returns Promise resolving to adapter start result with base URL and initial page URL\n     */\n    async start() {\n      await serverManager.ensureStarted();\n      const baseUrl = serverManager.getBaseUrl();\n      return {\n        baseUrl,\n        initialPageUrl: `${baseUrl}/iframe.html`,\n      };\n    },\n\n    /**\n     * Lists normalized and filtered stories from the current page context\n     * Requires a page context capable of `evaluate`. Automatically closes the page context afterwards.\n     *\n     * @param pageCtx - Page context required for story discovery\n     * @param o - Options including viewport configuration\n     * @returns Promise resolving to array of test case instances\n     * @throws {Error} If page context is not provided or adapter not started\n     */\n    async listCases(\n      pageCtx?: PageWithEvaluate,\n      o?: { viewport?: ViewportMap }\n    ): Promise<TestCaseInstanceMeta[]> {\n      if (!pageCtx) {\n        throw new Error(\"Page context is required for storybook adapter\");\n      }\n\n      let cases: Record<string, unknown>;\n      try {\n        cases = await discoverCasesFromBrowser(\n          pageCtx,\n          validatedOptions.discovery\n        );\n      } finally {\n        await pageCtx?.close?.();\n      }\n\n      const baseUrl = serverManager.getBaseUrl();\n      if (!baseUrl) {\n        throw new Error(\n          \"Adapter not started. Call start() before listCases().\"\n        );\n      }\n\n      let keys = o?.viewport ? Object.keys(o.viewport) : [\"default\"];\n      if (!keys || keys.length === 0) keys = [\"default\"];\n      // Sort viewport keys deterministically\n      keys.sort((a, b) => a.localeCompare(b));\n\n      return normalizeStories(cases, {\n        include: validatedOptions?.include,\n        exclude: validatedOptions?.exclude,\n        baseUrl,\n        viewportKeys: keys,\n        globalViewport: o?.viewport,\n      });\n    },\n    /**\n     * Stops the adapter server (if any) and clears base URL\n     * Safe to call multiple times\n     * @returns Promise resolving when server is stopped\n     */\n    async stop() {\n      await serverManager.stop();\n    },\n  };\n}\n","/**\n * Utility functions for the Storybook adapter\n */\n\n/**\n * Races a promise against a timeout and ensures the timer is always cleared.\n */\nexport function withTimeout<T>(\n  promise: Promise<T>,\n  ms: number,\n  message: string\n): Promise<T> {\n  return new Promise<T>((resolve, reject) => {\n    const timer = setTimeout(() => reject(new Error(message)), ms);\n    promise.then(\n      value => {\n        clearTimeout(timer);\n        resolve(value);\n      },\n      err => {\n        clearTimeout(timer);\n        reject(err);\n      }\n    );\n  });\n}\n","/**\n * @fileoverview Story discovery utilities for Storybook adapter\n *\n * Provides functions for discovering Storybook stories from the browser context\n * using Storybook's extract() API with retry mechanisms and timeout handling.\n */\n\nimport type { PageWithEvaluate } from \"@visnap/protocol\";\n\nimport { withTimeout } from \"./utils\";\n\n// Default configuration values\nconst DEFAULT_EVAL_TIMEOUT_MS = 15000;\nconst DEFAULT_DISCOVERY_MAX_RETRIES = 3;\nconst DEFAULT_DISCOVERY_RETRY_DELAY_MS = 500;\n\nexport interface DiscoveryConfig {\n  evalTimeoutMs?: number;\n  maxRetries?: number;\n  retryDelayMs?: number;\n}\n\n/**\n * Discovers Storybook cases in the current browser page by evaluating inside the page context.\n * Requires a `PageWithEvaluate` that can execute code in the browser and optionally be closed later.\n * Applies a timeout for resiliency and validates the Storybook globals.\n */\nexport async function discoverCasesFromBrowser(\n  pageCtx: PageWithEvaluate,\n  config: DiscoveryConfig = {}\n): Promise<Record<string, unknown>> {\n  if (!(\"evaluate\" in pageCtx) || typeof pageCtx.evaluate !== \"function\") {\n    throw new Error(\"Page context does not support evaluate()\");\n  }\n\n  // Use configuration values with defaults\n  const evalTimeoutMs = config.evalTimeoutMs ?? DEFAULT_EVAL_TIMEOUT_MS;\n  const maxRetries = config.maxRetries ?? DEFAULT_DISCOVERY_MAX_RETRIES;\n  const retryDelayMs = config.retryDelayMs ?? DEFAULT_DISCOVERY_RETRY_DELAY_MS;\n\n  const attemptStoryDiscovery = async (): Promise<Record<string, unknown>> => {\n    const evalPromise = (\n      pageCtx.evaluate as NonNullable<PageWithEvaluate[\"evaluate\"]>\n    )(async () => {\n      const storybook = window.__STORYBOOK_PREVIEW__;\n      if (!storybook) {\n        throw new Error(\"Storybook preview object not found on window\");\n      }\n      if (typeof storybook.ready === \"function\") {\n        await storybook.ready();\n      }\n      if (typeof storybook.extract !== \"function\") {\n        throw new Error(\"Storybook extract() is unavailable\");\n      }\n      return await storybook.extract();\n    });\n\n    return (await withTimeout(\n      evalPromise,\n      evalTimeoutMs,\n      \"Story discovery timed out\"\n    )) as Record<string, unknown>;\n  };\n\n  let lastError: unknown;\n  for (let i = 0; i < maxRetries; i++) {\n    try {\n      return await attemptStoryDiscovery();\n    } catch (e) {\n      lastError = e;\n      if (i < maxRetries - 1) {\n        await new Promise(res => setTimeout(res, retryDelayMs * (i + 1)));\n        continue;\n      }\n      throw e;\n    }\n  }\n  throw lastError instanceof Error\n    ? lastError\n    : new Error(\"Story discovery failed\");\n}\n","import type {\n  TestCaseMeta,\n  TestCaseInstanceMeta,\n  ViewportMap,\n  BrowserName,\n  Viewport,\n  FilterOptions,\n} from \"@visnap/protocol\";\nimport { minimatch } from \"minimatch\";\n\n/**\n * Story filtering and normalization for Storybook adapter\n */\n\n/**\n * Creates a predicate function that filters stories by include and exclude patterns\n * Patterns support minimatch wildcards. Invalid patterns are ignored.\n *\n * @param options - Filter options with include and exclude patterns\n * @returns Predicate function that returns true if story should be included\n *\n */\nexport function createTestCaseFilter(options: FilterOptions) {\n  const includePatterns = Array.isArray(options.include)\n    ? options.include.filter(pattern => pattern != null && pattern !== \"\")\n    : options.include && options.include !== \"\"\n      ? [options.include]\n      : [];\n  const excludePatterns = Array.isArray(options.exclude)\n    ? options.exclude.filter(pattern => pattern != null && pattern !== \"\")\n    : options.exclude && options.exclude !== \"\"\n      ? [options.exclude]\n      : [];\n\n  return (story: TestCaseMeta) => {\n    const storyId = story.id;\n\n    // Check include patterns\n    if (includePatterns.length > 0) {\n      const matchesInclude = includePatterns.some((pattern: string) =>\n        minimatch(storyId, pattern)\n      );\n      if (!matchesInclude) return false;\n    }\n\n    // Check exclude patterns\n    if (excludePatterns.length > 0) {\n      const matchesExclude = excludePatterns.some((pattern: string) =>\n        minimatch(storyId, pattern)\n      );\n      if (matchesExclude) return false;\n    }\n\n    return true;\n  };\n}\n\n/**\n * Normalizes and expands raw Storybook `extract()` output into TestCaseInstanceMeta[].\n * Applies runtime guards, include/exclude filtering, skip handling, and case-level config.\n */\nexport function normalizeStories(\n  stories: Record<string, unknown>,\n  options: FilterOptions & {\n    baseUrl: string;\n    viewportKeys: string[];\n    globalViewport?: ViewportMap;\n  }\n): TestCaseInstanceMeta[] {\n  const metas: TestCaseMeta[] = [];\n  const currentBaseUrl = options.baseUrl.replace(/\\/$/, \"\");\n\n  for (const raw of Object.values(stories)) {\n    if (!raw || typeof raw !== \"object\") continue;\n    const storyObj = raw as TestCaseMeta;\n\n    const id = typeof storyObj.id === \"string\" ? storyObj.id : undefined;\n    const title =\n      typeof storyObj.title === \"string\" ? storyObj.title : (id ?? \"\");\n    if (!id) continue;\n\n    // Get visualTesting under parameters.visualTesting, fallback to empty object\n    const parameters = storyObj as { parameters?: { visualTesting?: unknown } };\n    const vt =\n      parameters.parameters &&\n      typeof parameters.parameters.visualTesting === \"object\" &&\n      parameters.parameters.visualTesting !== null\n        ? (parameters.parameters.visualTesting as Record<string, unknown>)\n        : {};\n\n    const skip = typeof vt.skip === \"boolean\" ? vt.skip : false;\n    const screenshotTarget =\n      typeof vt.screenshotTarget === \"string\" ? vt.screenshotTarget : undefined;\n    const threshold =\n      typeof vt.threshold === \"number\" ? vt.threshold : undefined;\n    const browser =\n      Array.isArray(vt.browser) || typeof vt.browser === \"string\"\n        ? (vt.browser as BrowserName | BrowserName[])\n        : undefined;\n    const viewport =\n      typeof vt.viewport === \"object\" && vt.viewport !== null\n        ? (vt.viewport as Viewport)\n        : undefined;\n    const disableCSSInjection =\n      typeof vt.disableCSSInjection === \"boolean\"\n        ? vt.disableCSSInjection\n        : undefined;\n    const interactions = Array.isArray(vt.interactions)\n      ? vt.interactions\n      : undefined;\n    const elementsToMask = Array.isArray(vt.elementsToMask)\n      ? vt.elementsToMask\n      : undefined;\n\n    metas.push({\n      id,\n      title,\n      kind: \"story\",\n      visualTesting: {\n        skip,\n        screenshotTarget,\n        threshold,\n        browser,\n        viewport,\n        disableCSSInjection,\n        interactions,\n        elementsToMask,\n      },\n    });\n  }\n\n  // Build filter predicate from include/exclude\n  const filter = createTestCaseFilter({\n    include: options.include,\n    exclude: options.exclude,\n  });\n  const filtered = metas\n    .filter(story => !story.visualTesting?.skip)\n    .filter(filter);\n\n  const instances: TestCaseInstanceMeta[] = [];\n  for (const story of filtered) {\n    const visualConfig = story.visualTesting;\n    for (const viewportKey of options.viewportKeys) {\n      // Use global viewport configuration as fallback if individual test case doesn't have viewport config\n      const viewportConfig =\n        visualConfig?.viewport || options.globalViewport?.[viewportKey];\n\n      instances.push({\n        id: story.id,\n        title: story.title,\n        kind: \"story\",\n        caseId: story.id,\n        variantId: viewportKey,\n        url: `${currentBaseUrl}/iframe.html?id=${encodeURIComponent(story.id)}`,\n        screenshotTarget: visualConfig?.screenshotTarget ?? \"#storybook-root\",\n        viewport: viewportConfig,\n        threshold: visualConfig?.threshold,\n        disableCSSInjection: visualConfig?.disableCSSInjection,\n        interactions: visualConfig?.interactions,\n        elementsToMask: visualConfig?.elementsToMask,\n      });\n    }\n  }\n  return instances;\n}\n","/**\n * @fileoverview Server management utilities for Storybook adapter\n *\n * Provides functions for starting and managing a local static file server\n * for Storybook static builds or connecting to existing Storybook instances.\n */\n\nimport { existsSync } from \"node:fs\";\nimport http from \"node:http\";\n\nimport handler from \"serve-handler\";\n\nconst DEFAULT_PORT = 4477;\nconst SERVER_START_TIMEOUT_MS = 5000;\n\nexport interface ServerManager {\n  ensureStarted(): Promise<void>;\n  getBaseUrl(): string | undefined;\n  stop(): Promise<void>;\n}\n\n/**\n * Creates a server manager that handles starting/stopping the Storybook server\n */\nexport function createServerManager(\n  source: string,\n  port?: number\n): ServerManager {\n  let server: http.Server | null = null;\n  let baseUrl: string | undefined;\n  const isUrl = /^https?:\\/\\//i.test(source);\n\n  /**\n   * Ensures the adapter is started and `baseUrl` is available.\n   * - If `source` is a URL, uses it directly.\n   * - If `source` is a directory, starts a local static server with a startup timeout.\n   */\n  async function ensureStarted(): Promise<void> {\n    if (baseUrl) return;\n\n    if (isUrl) {\n      baseUrl = source.replace(/\\/$/, \"\");\n      return;\n    }\n\n    if (!existsSync(source)) {\n      throw new Error(`Storybook static directory not found: ${source}`);\n    }\n\n    const serverPort = port ?? DEFAULT_PORT;\n    server = http.createServer((request, response) =>\n      handler(request, response, { public: source, cleanUrls: false })\n    );\n\n    await new Promise<void>((resolve, reject) => {\n      let done = false;\n      const handleServerStartupError = (error: unknown) => {\n        if (done) return;\n        done = true;\n        reject(\n          error instanceof Error ? error : new Error(\"Server start failed\")\n        );\n      };\n\n      const timeout = setTimeout(() => {\n        handleServerStartupError(new Error(\"Server start timed out\"));\n      }, SERVER_START_TIMEOUT_MS);\n\n      server!.once(\"error\", handleServerStartupError);\n      server!.listen(serverPort, () => {\n        if (done) return;\n        done = true;\n        clearTimeout(timeout);\n        server!.off(\"error\", handleServerStartupError);\n        resolve();\n      });\n    });\n\n    baseUrl = `http://localhost:${serverPort}`;\n  }\n\n  /**\n   * Stops the adapter server (if any) and clears `baseUrl`. Safe to call multiple times.\n   */\n  async function stop(): Promise<void> {\n    if (!server) {\n      baseUrl = undefined;\n      return;\n    }\n    await new Promise<void>(resolve => server!.close(() => resolve()));\n    server = null;\n    baseUrl = undefined;\n  }\n\n  return {\n    ensureStarted,\n    getBaseUrl: () => baseUrl,\n    stop,\n  };\n}\n","/**\n * @fileoverview Validation utilities for Storybook adapter\n *\n * Provides ArkType-based validation schemas and functions for Storybook adapter options\n * and discovery configuration with comprehensive error handling.\n */\n\nimport { type } from \"arktype\";\n\n// ============= Schema Definitions =============\n\nconst discoveryConfigSchema = type({\n  evalTimeoutMs: \"number>0?\",\n  maxRetries: \"number>=0?\",\n  retryDelayMs: \"number>=0?\",\n});\n\nconst createStorybookAdapterOptionsSchema = type({\n  source: \"string>0\",\n  port: \"number>0?\",\n  include: \"string|string[]?\",\n  exclude: \"string|string[]?\",\n  \"discovery?\": discoveryConfigSchema,\n});\n\n// ============= Type Exports (inferred from schemas) =============\n\nexport type DiscoveryConfig = typeof discoveryConfigSchema.infer;\nexport type CreateStorybookAdapterOptions =\n  typeof createStorybookAdapterOptionsSchema.infer;\n\n// ============= Validation Functions =============\n\n/**\n * Validates discovery configuration\n */\nexport function validateDiscoveryConfig(discovery: unknown): DiscoveryConfig {\n  const result = discoveryConfigSchema(discovery);\n  if (result instanceof type.errors) {\n    throw new Error(`Invalid discovery config: ${result.summary}`);\n  }\n  return result;\n}\n\n/**\n * Validates create storybook adapter options\n */\nexport function validateOptions(\n  options: unknown\n): CreateStorybookAdapterOptions {\n  const result = createStorybookAdapterOptionsSchema(options);\n  if (result instanceof type.errors) {\n    throw new Error(`Invalid storybook adapter options: ${result.summary}`);\n  }\n\n  // Additional validation for whitespace-only source\n  if (result.source.trim() === \"\") {\n    throw new Error(\n      \"Invalid storybook adapter options: source must be non-empty\"\n    );\n  }\n\n  // Clean up undefined values for include/exclude to avoid issues\n  const cleanedResult = {\n    ...result,\n    include: result.include === undefined ? undefined : result.include,\n    exclude: result.exclude === undefined ? undefined : result.exclude,\n  };\n\n  return cleanedResult;\n}\n\n// ============= Schema Exports =============\n\nexport { discoveryConfigSchema, createStorybookAdapterOptionsSchema };\n"],"mappings":"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","names":["http","handler"]}