{"version":3,"sources":["../../src/configureNodeEnv/index.ts"],"names":["item","split"],"mappings":"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","file":"chunk-MG4BFZM7.cjs","sourcesContent":["export type MatchMediaHydrationContext = Record<string, boolean>;\n\nexport type MediaQueryEnvironmentConfig = {\n  all?: true;\n  anyHover?: \"none\" | \"hover\";\n  anyPointer?: \"none\" | \"fine\" | \"coarse\";\n  aspectRatio?: number;\n  color?: number;\n  colorGamut?: \"srgb\" | \"p3\" | \"rec2020\";\n  colorIndex?: number;\n  displayMode?:\n    | \"fullscreen\"\n    | \"standalone\"\n    | \"minimal-ui\"\n    | \"browser\"\n    | \"window-controls-overlay\";\n  dynamicRange?: \"standard\" | \"high\";\n  forcedColors?: \"none\" | \"active\";\n  grid?: 0 | 1;\n  /** in px */\n  height?: number;\n  hover?: \"none\" | \"hover\";\n  invertedColors?: \"none\" | \"inverted\";\n  monochrome?: number;\n  orientation?: \"portrait\" | \"landscape\";\n  overflowBlock?: \"none\" | \"scroll\" | \"optional-paged\" | \"paged\";\n  overflowInline?: \"none\" | \"scroll\";\n  pointer?: \"none\" | \"fine\" | \"coarse\";\n  prefersColorScheme?: \"no-preference\" | \"light\" | \"dark\";\n  prefersContrast?: \"no-preference\" | \"more\" | \"less\";\n  prefersReducedMotion?: \"no-preference\" | \"reduce\";\n  print?: true;\n  /** in dpi */\n  resolution?: number;\n  screen?: true;\n  scripting?: \"none\" | \"initial-only\" | \"enabled\";\n  update?: \"none\" | \"slow\" | \"fast\";\n  videoDynamicRange?: \"standard\" | \"high\";\n  /** in px */\n  width?: number;\n  prefersReducedTransparency?: \"no-preference\" | \"reduce\";\n  lightLevel?: \"dim\" | \"normal\" | \"washed\";\n};\n\ntype Operator = \">\" | \"<\" | \"=\" | \">=\" | \"<=\";\n\nconst comparer = (a: number, operator: Operator, b: number) => {\n  switch (operator) {\n    case \">\":\n      return a > b;\n    case \"<\":\n      return a < b;\n    case \"=\":\n      return a === b;\n    case \">=\":\n      return a >= b;\n    case \"<=\":\n      return a <= b;\n  }\n};\n\nconst toCamelCase = (str: string) =>\n  str.replace(/-(\\w)|^(min|max)-/g, (_, letter) =>\n    letter ? letter.toUpperCase() : \"\"\n  );\n\nconst warnAboutMissedKey = (key: string, mediaQuey: string) => {\n  console.warn(\n    `\"${key}\" is not found in the provided config, but it exists in \"${mediaQuey}\". Therefore, it has been set to false as a fallback.`\n  );\n};\n\n/**\n * Configures the Node environment for server-side rendering (SSR).\n *\n * This function is used to set up the environment for the `useMatchMedia` hook\n * when running React components on the server. It allows you to provide a custom\n * configuration object to simulate different media query results.\n *\n * The configuration object should contain properties that match the media query conditions\n * you want to simulate. For example, if you configure it with `{ width: 768 }`, it will\n * simulate the viewport width as if it were 768 pixels wide, affecting the results returned\n * by `useMatchMedia` when evaluating media queries related to width.\n *\n * @param config - The configuration object for the environment.\n * @returns The context object to be used with the `MatchMediaHydrationProvider`.\n *\n * @example\n * ```jsx\n * import {\n *   useMatchMedia,\n *   configureNodeEnv,\n *   MatchMediaHydrationProvider,\n * } from \"react-hook-media\";\n *\n * const MyComponent = () => {\n *   const isDesktop = useMatchMedia(\"(min-width: 900px)\");\n *\n *   return <div>{isDesktop ? \"This is desktop\" : \"This is mobile\"}</div>;\n * };\n *\n * const IndexPage = ({ mediaHydrationCtx }) => (\n *   <MatchMediaHydrationProvider value={mediaHydrationCtx}>\n *     <MyComponent />\n *   </MatchMediaHydrationProvider>\n * );\n *\n * export const getServerSideProps = async () => {\n *   return {\n *     props: {\n *       mediaHydrationCtx: configureNodeEnv({ width: 1000 }),\n *     },\n *   };\n * };\n * ```\n */\nconst configureNodeEnv = (config: MediaQueryEnvironmentConfig) => {\n  config = { ...config };\n\n  config.all = true;\n\n  if (!config.print && !config.screen) {\n    config.print = config.screen = true;\n  }\n\n  const createUnitParser = (unit: string) => (value: string | undefined) => {\n    if (!value || !value.endsWith(unit)) {\n      throw new Error(\"unsupported format\");\n    }\n\n    return parseInt(value);\n  };\n\n  const parsers = {\n    aspectRatio(value) {\n      if (!value) {\n        throw new Error(\"unsupported format\");\n      }\n\n      const item = value.split(\"/\");\n\n      const res = +item[0] / +item[1];\n\n      if (isNaN(res)) {\n        throw new Error(\"NaN\");\n      }\n\n      return res;\n    },\n    color: Number,\n    colorIndex: Number,\n    grid: Number,\n    height: createUnitParser(\"px\"),\n    monochrome: Number,\n    resolution: createUnitParser(\"dpi\"),\n    width: createUnitParser(\"px\"),\n  } satisfies Partial<\n    Record<\n      keyof MediaQueryEnvironmentConfig,\n      (value: string | undefined) => any\n    >\n  >;\n\n  const store: MatchMediaHydrationContext = {};\n\n  global.matchMedia = (mediaQuery) => {\n    if (mediaQuery in store) {\n      return { matches: store[mediaQuery] } as MediaQueryList;\n    }\n\n    const split = mediaQuery.split(\",\");\n\n    for (let i = 0; i < split.length; i++) {\n      const arr = split[i]\n        .trim()\n        .replaceAll(\"only \", \"\")\n        .replace(/\\((.*?)\\)/g, \"$1\")\n        .replace(/(\\w+)\\s*([<>]=?|=)\\s*(?=[<>\\w-])/g, \"$1$2\")\n        .replaceAll(\": \", \":\")\n        .split(/([\\s()])/)\n        .reduce<string[]>((acc, t) => {\n          const item = t.trim();\n          if (item) {\n            acc.push(item);\n          }\n          return acc;\n        }, []);\n\n      const queue: string[] = [\"\"];\n\n      for (let i = 0; i < arr.length; i++) {\n        const item = arr[i];\n\n        const currIndex = queue.length - 1;\n\n        if (item == \"(\") {\n          queue.push(\"\");\n        } else if (item == \")\") {\n          queue[currIndex - 1] += eval(queue.pop()!);\n        } else if (item == \"or\") {\n          queue[currIndex] += \"||\";\n        } else if (item == \"and\") {\n          queue[currIndex] += \"&&\";\n        } else if (item == \"not\") {\n          queue[currIndex] += \"!\";\n        } else if (\n          /^[^\\s()]+[<>=]{1,2}[^\\s()]+(?:[<>=]{1,2}[^\\s()]+)?$/.test(item)\n        ) {\n          const split = item.match(/[^\\s()<>=]+|[<>=]{1,2}/g)!;\n\n          if (split.length == 3) {\n            const operand1 = split[0];\n\n            const operand2 = split[2];\n\n            let parsedOperand1: number | undefined;\n\n            let parsedOperand2: number | undefined;\n\n            let camelKey: keyof typeof parsers;\n\n            if (/^[-+]?\\d+(\\.\\d+)?(?:.*)?$/i.test(operand1)) {\n              camelKey = toCamelCase(operand2) as keyof typeof parsers;\n\n              parsedOperand2 = config[camelKey];\n\n              parsedOperand1 = parsers[camelKey](operand1);\n            } else {\n              camelKey = toCamelCase(operand1) as keyof typeof parsers;\n\n              parsedOperand1 = config[camelKey];\n\n              parsedOperand2 = parsers[camelKey](operand2);\n            }\n\n            if (parsedOperand1 != null && parsedOperand2 != null) {\n              queue[currIndex] += comparer(\n                parsedOperand1,\n                split[1] as Operator,\n                parsedOperand2\n              );\n            } else {\n              queue[currIndex] += false;\n\n              warnAboutMissedKey(camelKey, mediaQuery);\n            }\n          } else if (split.length == 5) {\n            const camelKey = toCamelCase(split[2]) as keyof typeof parsers;\n\n            const parser = parsers[camelKey];\n\n            const value = config[camelKey];\n\n            if (value != undefined) {\n              queue[currIndex] +=\n                comparer(parser(split[0]), split[1] as Operator, value) &&\n                comparer(value, split[3] as Operator, parser(split[4]));\n            } else {\n              queue[currIndex] += false;\n\n              warnAboutMissedKey(camelKey, mediaQuery);\n            }\n          } else {\n            throw new Error(`\"${item}\" in \"${mediaQuery}\" is incorrect`);\n          }\n        } else {\n          const [kebabKey, value] = item.split(\":\") as [\n            string,\n            string | undefined,\n          ];\n\n          const camelKey = kebabKey.replace(\n            /-(\\w)|^(min|max)-/g,\n            (_, letter) => (letter ? letter.toUpperCase() : \"\")\n          ) as keyof MediaQueryEnvironmentConfig;\n\n          if (camelKey in config) {\n            const check: (a: any, b: any) => boolean = kebabKey.startsWith(\n              \"min-\"\n            )\n              ? (a, b) => a > b\n              : kebabKey.startsWith(\"max-\")\n                ? (a, b) => a < b\n                : (a, b) => (typeof b == \"boolean\" ? !!a == b : a === b);\n\n            queue[currIndex] += check(\n              config[camelKey],\n              camelKey in parsers\n                ? parsers[camelKey as keyof typeof parsers](value)\n                : value ?? true\n            );\n          } else {\n            queue[currIndex] += false;\n\n            warnAboutMissedKey(camelKey, mediaQuery);\n          }\n        }\n      }\n\n      if (queue.length != 1) {\n        throw new Error(`\"${mediaQuery}\" is incorrect`);\n      }\n\n      if (queue[0] ? eval(queue[0]) : true) {\n        store[mediaQuery] = true;\n\n        return { matches: true } as MediaQueryList;\n      }\n    }\n\n    store[mediaQuery] = false;\n\n    return { matches: false } as MediaQueryList;\n  };\n\n  return store;\n};\n\nexport default configureNodeEnv;\n"]}